asm-offsets.c 11.2 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 * offset.c: Calculate pt_regs and task_struct offsets.
 *
 * Copyright (C) 1996 David S. Miller
 * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 Ralf Baechle
 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
 *
 * Kevin Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
 * Copyright (C) 2000 MIPS Technologies, Inc.
 */
#include <linux/compat.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <linux/mm.h>
#include <linux/interrupt.h>

#include <asm/ptrace.h>
#include <asm/processor.h>

20
#define text(t) __asm__("\n->#" t)
L
Linus Torvalds 已提交
21 22
#define _offset(type, member) (&(((type *)NULL)->member))
#define offset(string, ptr, member) \
23
	__asm__("\n->" string " %0" : : "i" (_offset(ptr, member)))
L
Linus Torvalds 已提交
24
#define constant(string, member) \
25
	__asm__("\n->" string " %0" : : "ri" (member))
L
Linus Torvalds 已提交
26
#define size(string, size) \
27
	__asm__("\n->" string " %0" : : "i" (sizeof(size)))
L
Linus Torvalds 已提交
28 29 30 31
#define linefeed text("")

void output_ptreg_defines(void)
{
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
	text("MIPS pt_regs offsets.");
	offset("PT_R0", struct pt_regs, regs[0]);
	offset("PT_R1", struct pt_regs, regs[1]);
	offset("PT_R2", struct pt_regs, regs[2]);
	offset("PT_R3", struct pt_regs, regs[3]);
	offset("PT_R4", struct pt_regs, regs[4]);
	offset("PT_R5", struct pt_regs, regs[5]);
	offset("PT_R6", struct pt_regs, regs[6]);
	offset("PT_R7", struct pt_regs, regs[7]);
	offset("PT_R8", struct pt_regs, regs[8]);
	offset("PT_R9", struct pt_regs, regs[9]);
	offset("PT_R10", struct pt_regs, regs[10]);
	offset("PT_R11", struct pt_regs, regs[11]);
	offset("PT_R12", struct pt_regs, regs[12]);
	offset("PT_R13", struct pt_regs, regs[13]);
	offset("PT_R14", struct pt_regs, regs[14]);
	offset("PT_R15", struct pt_regs, regs[15]);
	offset("PT_R16", struct pt_regs, regs[16]);
	offset("PT_R17", struct pt_regs, regs[17]);
	offset("PT_R18", struct pt_regs, regs[18]);
	offset("PT_R19", struct pt_regs, regs[19]);
	offset("PT_R20", struct pt_regs, regs[20]);
	offset("PT_R21", struct pt_regs, regs[21]);
	offset("PT_R22", struct pt_regs, regs[22]);
	offset("PT_R23", struct pt_regs, regs[23]);
	offset("PT_R24", struct pt_regs, regs[24]);
	offset("PT_R25", struct pt_regs, regs[25]);
	offset("PT_R26", struct pt_regs, regs[26]);
	offset("PT_R27", struct pt_regs, regs[27]);
	offset("PT_R28", struct pt_regs, regs[28]);
	offset("PT_R29", struct pt_regs, regs[29]);
	offset("PT_R30", struct pt_regs, regs[30]);
	offset("PT_R31", struct pt_regs, regs[31]);
	offset("PT_LO", struct pt_regs, lo);
	offset("PT_HI", struct pt_regs, hi);
67
#ifdef CONFIG_CPU_HAS_SMARTMIPS
68
	offset("PT_ACX", struct pt_regs, acx);
69
#endif
70 71 72 73
	offset("PT_EPC", struct pt_regs, cp0_epc);
	offset("PT_BVADDR", struct pt_regs, cp0_badvaddr);
	offset("PT_STATUS", struct pt_regs, cp0_status);
	offset("PT_CAUSE", struct pt_regs, cp0_cause);
74
#ifdef CONFIG_MIPS_MT_SMTC
75
	offset("PT_TCSTATUS", struct pt_regs, cp0_tcstatus);
76
#endif /* CONFIG_MIPS_MT_SMTC */
77
	size("PT_SIZE", struct pt_regs);
L
Linus Torvalds 已提交
78 79 80 81 82
	linefeed;
}

void output_task_defines(void)
{
83 84 85 86 87 88 89
	text("MIPS task_struct offsets.");
	offset("TASK_STATE", struct task_struct, state);
	offset("TASK_THREAD_INFO", struct task_struct, stack);
	offset("TASK_FLAGS", struct task_struct, flags);
	offset("TASK_MM", struct task_struct, mm);
	offset("TASK_PID", struct task_struct, pid);
	size(  "TASK_STRUCT_SIZE", struct task_struct);
L
Linus Torvalds 已提交
90 91 92 93 94
	linefeed;
}

void output_thread_info_defines(void)
{
95 96 97 98 99 100 101 102 103 104 105 106
	text("MIPS thread_info offsets.");
	offset("TI_TASK", struct thread_info, task);
	offset("TI_EXEC_DOMAIN", struct thread_info, exec_domain);
	offset("TI_FLAGS", struct thread_info, flags);
	offset("TI_TP_VALUE", struct thread_info, tp_value);
	offset("TI_CPU", struct thread_info, cpu);
	offset("TI_PRE_COUNT", struct thread_info, preempt_count);
	offset("TI_ADDR_LIMIT", struct thread_info, addr_limit);
	offset("TI_RESTART_BLOCK", struct thread_info, restart_block);
	offset("TI_REGS", struct thread_info, regs);
	constant("_THREAD_SIZE", THREAD_SIZE);
	constant("_THREAD_MASK", THREAD_MASK);
L
Linus Torvalds 已提交
107 108 109 110 111
	linefeed;
}

void output_thread_defines(void)
{
112 113 114 115 116 117 118 119 120 121 122 123 124
	text("MIPS specific thread_struct offsets.");
	offset("THREAD_REG16", struct task_struct, thread.reg16);
	offset("THREAD_REG17", struct task_struct, thread.reg17);
	offset("THREAD_REG18", struct task_struct, thread.reg18);
	offset("THREAD_REG19", struct task_struct, thread.reg19);
	offset("THREAD_REG20", struct task_struct, thread.reg20);
	offset("THREAD_REG21", struct task_struct, thread.reg21);
	offset("THREAD_REG22", struct task_struct, thread.reg22);
	offset("THREAD_REG23", struct task_struct, thread.reg23);
	offset("THREAD_REG29", struct task_struct, thread.reg29);
	offset("THREAD_REG30", struct task_struct, thread.reg30);
	offset("THREAD_REG31", struct task_struct, thread.reg31);
	offset("THREAD_STATUS", struct task_struct,
L
Linus Torvalds 已提交
125
	       thread.cp0_status);
126
	offset("THREAD_FPU", struct task_struct, thread.fpu);
L
Linus Torvalds 已提交
127

128
	offset("THREAD_BVADDR", struct task_struct, \
L
Linus Torvalds 已提交
129
	       thread.cp0_badvaddr);
130
	offset("THREAD_BUADDR", struct task_struct, \
L
Linus Torvalds 已提交
131
	       thread.cp0_baduaddr);
132
	offset("THREAD_ECODE", struct task_struct, \
L
Linus Torvalds 已提交
133
	       thread.error_code);
134 135
	offset("THREAD_TRAPNO", struct task_struct, thread.trap_no);
	offset("THREAD_TRAMP", struct task_struct, \
L
Linus Torvalds 已提交
136
	       thread.irix_trampoline);
137
	offset("THREAD_OLDCTX", struct task_struct, \
L
Linus Torvalds 已提交
138 139 140 141 142 143
	       thread.irix_oldctx);
	linefeed;
}

void output_thread_fpu_defines(void)
{
144
	offset("THREAD_FPR0",
145
	       struct task_struct, thread.fpu.fpr[0]);
146
	offset("THREAD_FPR1",
147
	       struct task_struct, thread.fpu.fpr[1]);
148
	offset("THREAD_FPR2",
149
	       struct task_struct, thread.fpu.fpr[2]);
150
	offset("THREAD_FPR3",
151
	       struct task_struct, thread.fpu.fpr[3]);
152
	offset("THREAD_FPR4",
153
	       struct task_struct, thread.fpu.fpr[4]);
154
	offset("THREAD_FPR5",
155
	       struct task_struct, thread.fpu.fpr[5]);
156
	offset("THREAD_FPR6",
157
	       struct task_struct, thread.fpu.fpr[6]);
158
	offset("THREAD_FPR7",
159
	       struct task_struct, thread.fpu.fpr[7]);
160
	offset("THREAD_FPR8",
161
	       struct task_struct, thread.fpu.fpr[8]);
162
	offset("THREAD_FPR9",
163
	       struct task_struct, thread.fpu.fpr[9]);
164
	offset("THREAD_FPR10",
165
	       struct task_struct, thread.fpu.fpr[10]);
166
	offset("THREAD_FPR11",
167
	       struct task_struct, thread.fpu.fpr[11]);
168
	offset("THREAD_FPR12",
169
	       struct task_struct, thread.fpu.fpr[12]);
170
	offset("THREAD_FPR13",
171
	       struct task_struct, thread.fpu.fpr[13]);
172
	offset("THREAD_FPR14",
173
	       struct task_struct, thread.fpu.fpr[14]);
174
	offset("THREAD_FPR15",
175
	       struct task_struct, thread.fpu.fpr[15]);
176
	offset("THREAD_FPR16",
177
	       struct task_struct, thread.fpu.fpr[16]);
178
	offset("THREAD_FPR17",
179
	       struct task_struct, thread.fpu.fpr[17]);
180
	offset("THREAD_FPR18",
181
	       struct task_struct, thread.fpu.fpr[18]);
182
	offset("THREAD_FPR19",
183
	       struct task_struct, thread.fpu.fpr[19]);
184
	offset("THREAD_FPR20",
185
	       struct task_struct, thread.fpu.fpr[20]);
186
	offset("THREAD_FPR21",
187
	       struct task_struct, thread.fpu.fpr[21]);
188
	offset("THREAD_FPR22",
189
	       struct task_struct, thread.fpu.fpr[22]);
190
	offset("THREAD_FPR23",
191
	       struct task_struct, thread.fpu.fpr[23]);
192
	offset("THREAD_FPR24",
193
	       struct task_struct, thread.fpu.fpr[24]);
194
	offset("THREAD_FPR25",
195
	       struct task_struct, thread.fpu.fpr[25]);
196
	offset("THREAD_FPR26",
197
	       struct task_struct, thread.fpu.fpr[26]);
198
	offset("THREAD_FPR27",
199
	       struct task_struct, thread.fpu.fpr[27]);
200
	offset("THREAD_FPR28",
201
	       struct task_struct, thread.fpu.fpr[28]);
202
	offset("THREAD_FPR29",
203
	       struct task_struct, thread.fpu.fpr[29]);
204
	offset("THREAD_FPR30",
205
	       struct task_struct, thread.fpu.fpr[30]);
206
	offset("THREAD_FPR31",
207
	       struct task_struct, thread.fpu.fpr[31]);
L
Linus Torvalds 已提交
208

209
	offset("THREAD_FCR31",
210
	       struct task_struct, thread.fpu.fcr31);
L
Linus Torvalds 已提交
211 212 213 214 215
	linefeed;
}

void output_mm_defines(void)
{
216 217
	text("Size of struct page");
	size("STRUCT_PAGE_SIZE", struct page);
L
Linus Torvalds 已提交
218
	linefeed;
219 220 221 222
	text("Linux mm_struct offsets.");
	offset("MM_USERS", struct mm_struct, mm_users);
	offset("MM_PGD", struct mm_struct, pgd);
	offset("MM_CONTEXT", struct mm_struct, context);
L
Linus Torvalds 已提交
223
	linefeed;
224 225
	constant("_PAGE_SIZE", PAGE_SIZE);
	constant("_PAGE_SHIFT", PAGE_SHIFT);
L
Linus Torvalds 已提交
226
	linefeed;
227 228 229
	constant("_PGD_T_SIZE", sizeof(pgd_t));
	constant("_PMD_T_SIZE", sizeof(pmd_t));
	constant("_PTE_T_SIZE", sizeof(pte_t));
L
Linus Torvalds 已提交
230
	linefeed;
231 232 233
	constant("_PGD_T_LOG2", PGD_T_LOG2);
	constant("_PMD_T_LOG2", PMD_T_LOG2);
	constant("_PTE_T_LOG2", PTE_T_LOG2);
L
Linus Torvalds 已提交
234
	linefeed;
235 236 237
	constant("_PGD_ORDER", PGD_ORDER);
	constant("_PMD_ORDER", PMD_ORDER);
	constant("_PTE_ORDER", PTE_ORDER);
238
	linefeed;
239 240
	constant("_PMD_SHIFT", PMD_SHIFT);
	constant("_PGDIR_SHIFT", PGDIR_SHIFT);
L
Linus Torvalds 已提交
241
	linefeed;
242 243 244
	constant("_PTRS_PER_PGD", PTRS_PER_PGD);
	constant("_PTRS_PER_PMD", PTRS_PER_PMD);
	constant("_PTRS_PER_PTE", PTRS_PER_PTE);
L
Linus Torvalds 已提交
245 246 247
	linefeed;
}

248
#ifdef CONFIG_32BIT
L
Linus Torvalds 已提交
249 250
void output_sc_defines(void)
{
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
	text("Linux sigcontext offsets.");
	offset("SC_REGS", struct sigcontext, sc_regs);
	offset("SC_FPREGS", struct sigcontext, sc_fpregs);
	offset("SC_ACX", struct sigcontext, sc_acx);
	offset("SC_MDHI", struct sigcontext, sc_mdhi);
	offset("SC_MDLO", struct sigcontext, sc_mdlo);
	offset("SC_PC", struct sigcontext, sc_pc);
	offset("SC_FPC_CSR", struct sigcontext, sc_fpc_csr);
	offset("SC_FPC_EIR", struct sigcontext, sc_fpc_eir);
	offset("SC_HI1", struct sigcontext, sc_hi1);
	offset("SC_LO1", struct sigcontext, sc_lo1);
	offset("SC_HI2", struct sigcontext, sc_hi2);
	offset("SC_LO2", struct sigcontext, sc_lo2);
	offset("SC_HI3", struct sigcontext, sc_hi3);
	offset("SC_LO3", struct sigcontext, sc_lo3);
L
Linus Torvalds 已提交
266 267
	linefeed;
}
268 269 270 271 272
#endif

#ifdef CONFIG_64BIT
void output_sc_defines(void)
{
273 274 275 276 277 278 279
	text("Linux sigcontext offsets.");
	offset("SC_REGS", struct sigcontext, sc_regs);
	offset("SC_FPREGS", struct sigcontext, sc_fpregs);
	offset("SC_MDHI", struct sigcontext, sc_mdhi);
	offset("SC_MDLO", struct sigcontext, sc_mdlo);
	offset("SC_PC", struct sigcontext, sc_pc);
	offset("SC_FPC_CSR", struct sigcontext, sc_fpc_csr);
280 281 282
	linefeed;
}
#endif
L
Linus Torvalds 已提交
283 284 285 286

#ifdef CONFIG_MIPS32_COMPAT
void output_sc32_defines(void)
{
287 288 289 290
	text("Linux 32-bit sigcontext offsets.");
	offset("SC32_FPREGS", struct sigcontext32, sc_fpregs);
	offset("SC32_FPC_CSR", struct sigcontext32, sc_fpc_csr);
	offset("SC32_FPC_EIR", struct sigcontext32, sc_fpc_eir);
L
Linus Torvalds 已提交
291 292 293 294 295 296
	linefeed;
}
#endif

void output_signal_defined(void)
{
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329
	text("Linux signal numbers.");
	constant("_SIGHUP", SIGHUP);
	constant("_SIGINT", SIGINT);
	constant("_SIGQUIT", SIGQUIT);
	constant("_SIGILL", SIGILL);
	constant("_SIGTRAP", SIGTRAP);
	constant("_SIGIOT", SIGIOT);
	constant("_SIGABRT", SIGABRT);
	constant("_SIGEMT", SIGEMT);
	constant("_SIGFPE", SIGFPE);
	constant("_SIGKILL", SIGKILL);
	constant("_SIGBUS", SIGBUS);
	constant("_SIGSEGV", SIGSEGV);
	constant("_SIGSYS", SIGSYS);
	constant("_SIGPIPE", SIGPIPE);
	constant("_SIGALRM", SIGALRM);
	constant("_SIGTERM", SIGTERM);
	constant("_SIGUSR1", SIGUSR1);
	constant("_SIGUSR2", SIGUSR2);
	constant("_SIGCHLD", SIGCHLD);
	constant("_SIGPWR", SIGPWR);
	constant("_SIGWINCH", SIGWINCH);
	constant("_SIGURG", SIGURG);
	constant("_SIGIO", SIGIO);
	constant("_SIGSTOP", SIGSTOP);
	constant("_SIGTSTP", SIGTSTP);
	constant("_SIGCONT", SIGCONT);
	constant("_SIGTTIN", SIGTTIN);
	constant("_SIGTTOU", SIGTTOU);
	constant("_SIGVTALRM", SIGVTALRM);
	constant("_SIGPROF", SIGPROF);
	constant("_SIGXCPU", SIGXCPU);
	constant("_SIGXFSZ", SIGXFSZ);
L
Linus Torvalds 已提交
330 331 332 333 334
	linefeed;
}

void output_irq_cpustat_t_defines(void)
{
335 336 337
	text("Linux irq_cpustat_t offsets.");
	offset("IC_SOFTIRQ_PENDING", irq_cpustat_t, __softirq_pending);
	size("IC_IRQ_CPUSTAT_T", irq_cpustat_t);
L
Linus Torvalds 已提交
338 339
	linefeed;
}