2 * offset.c: Calculate pt_regs and task_struct offsets.
4 * Copyright (C) 1996 David S. Miller
5 * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 Ralf Baechle
6 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
8 * Kevin Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
9 * Copyright (C) 2000 MIPS Technologies, Inc.
11 #include <linux/compat.h>
12 #include <linux/types.h>
13 #include <linux/sched.h>
15 #include <linux/interrupt.h>
17 #include <asm/ptrace.h>
18 #include <asm/processor.h>
20 #define text(t) __asm__("\n->#" t)
21 #define _offset(type, member) (&(((type *)NULL)->member))
22 #define offset(string, ptr, member) \
23 __asm__("\n->" string " %0" : : "i" (_offset(ptr, member)))
24 #define constant(string, member) \
25 __asm__("\n->" string " %0" : : "ri" (member))
26 #define size(string, size) \
27 __asm__("\n->" string " %0" : : "i" (sizeof(size)))
28 #define linefeed text("")
30 void output_ptreg_defines(void)
32 text("MIPS pt_regs offsets.");
33 offset("PT_R0", struct pt_regs, regs[0]);
34 offset("PT_R1", struct pt_regs, regs[1]);
35 offset("PT_R2", struct pt_regs, regs[2]);
36 offset("PT_R3", struct pt_regs, regs[3]);
37 offset("PT_R4", struct pt_regs, regs[4]);
38 offset("PT_R5", struct pt_regs, regs[5]);
39 offset("PT_R6", struct pt_regs, regs[6]);
40 offset("PT_R7", struct pt_regs, regs[7]);
41 offset("PT_R8", struct pt_regs, regs[8]);
42 offset("PT_R9", struct pt_regs, regs[9]);
43 offset("PT_R10", struct pt_regs, regs[10]);
44 offset("PT_R11", struct pt_regs, regs[11]);
45 offset("PT_R12", struct pt_regs, regs[12]);
46 offset("PT_R13", struct pt_regs, regs[13]);
47 offset("PT_R14", struct pt_regs, regs[14]);
48 offset("PT_R15", struct pt_regs, regs[15]);
49 offset("PT_R16", struct pt_regs, regs[16]);
50 offset("PT_R17", struct pt_regs, regs[17]);
51 offset("PT_R18", struct pt_regs, regs[18]);
52 offset("PT_R19", struct pt_regs, regs[19]);
53 offset("PT_R20", struct pt_regs, regs[20]);
54 offset("PT_R21", struct pt_regs, regs[21]);
55 offset("PT_R22", struct pt_regs, regs[22]);
56 offset("PT_R23", struct pt_regs, regs[23]);
57 offset("PT_R24", struct pt_regs, regs[24]);
58 offset("PT_R25", struct pt_regs, regs[25]);
59 offset("PT_R26", struct pt_regs, regs[26]);
60 offset("PT_R27", struct pt_regs, regs[27]);
61 offset("PT_R28", struct pt_regs, regs[28]);
62 offset("PT_R29", struct pt_regs, regs[29]);
63 offset("PT_R30", struct pt_regs, regs[30]);
64 offset("PT_R31", struct pt_regs, regs[31]);
65 offset("PT_LO", struct pt_regs, lo);
66 offset("PT_HI", struct pt_regs, hi);
67 #ifdef CONFIG_CPU_HAS_SMARTMIPS
68 offset("PT_ACX", struct pt_regs, acx);
70 offset("PT_EPC", struct pt_regs, cp0_epc);
71 offset("PT_BVADDR", struct pt_regs, cp0_badvaddr);
72 offset("PT_STATUS", struct pt_regs, cp0_status);
73 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);
81 void output_task_defines(void)
83 text("MIPS task_struct offsets.");
84 offset("TASK_STATE", struct task_struct, state);
85 offset("TASK_THREAD_INFO", struct task_struct, stack);
86 offset("TASK_FLAGS", struct task_struct, flags);
87 offset("TASK_MM", struct task_struct, mm);
88 offset("TASK_PID", struct task_struct, pid);
89 size( "TASK_STRUCT_SIZE", struct task_struct);
93 void output_thread_info_defines(void)
95 text("MIPS thread_info offsets.");
96 offset("TI_TASK", struct thread_info, task);
97 offset("TI_EXEC_DOMAIN", struct thread_info, exec_domain);
98 offset("TI_FLAGS", struct thread_info, flags);
99 offset("TI_TP_VALUE", struct thread_info, tp_value);
100 offset("TI_CPU", struct thread_info, cpu);
101 offset("TI_PRE_COUNT", struct thread_info, preempt_count);
102 offset("TI_ADDR_LIMIT", struct thread_info, addr_limit);
103 offset("TI_RESTART_BLOCK", struct thread_info, restart_block);
104 offset("TI_REGS", struct thread_info, regs);
105 constant("_THREAD_SIZE", THREAD_SIZE);
106 constant("_THREAD_MASK", THREAD_MASK);
110 void output_thread_defines(void)
112 text("MIPS specific thread_struct offsets.");
113 offset("THREAD_REG16", struct task_struct, thread.reg16);
114 offset("THREAD_REG17", struct task_struct, thread.reg17);
115 offset("THREAD_REG18", struct task_struct, thread.reg18);
116 offset("THREAD_REG19", struct task_struct, thread.reg19);
117 offset("THREAD_REG20", struct task_struct, thread.reg20);
118 offset("THREAD_REG21", struct task_struct, thread.reg21);
119 offset("THREAD_REG22", struct task_struct, thread.reg22);
120 offset("THREAD_REG23", struct task_struct, thread.reg23);
121 offset("THREAD_REG29", struct task_struct, thread.reg29);
122 offset("THREAD_REG30", struct task_struct, thread.reg30);
123 offset("THREAD_REG31", struct task_struct, thread.reg31);
124 offset("THREAD_STATUS", struct task_struct,
126 offset("THREAD_FPU", struct task_struct, thread.fpu);
128 offset("THREAD_BVADDR", struct task_struct, \
129 thread.cp0_badvaddr);
130 offset("THREAD_BUADDR", struct task_struct, \
131 thread.cp0_baduaddr);
132 offset("THREAD_ECODE", struct task_struct, \
134 offset("THREAD_TRAPNO", struct task_struct, thread.trap_no);
135 offset("THREAD_TRAMP", struct task_struct, \
136 thread.irix_trampoline);
137 offset("THREAD_OLDCTX", struct task_struct, \
142 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]);
209 offset("THREAD_FCR31",
210 struct task_struct, thread.fpu.fcr31);
214 void output_mm_defines(void)
216 text("Size of struct page");
217 size("STRUCT_PAGE_SIZE", struct page);
219 text("Linux mm_struct offsets.");
220 offset("MM_USERS", struct mm_struct, mm_users);
221 offset("MM_PGD", struct mm_struct, pgd);
222 offset("MM_CONTEXT", struct mm_struct, context);
224 constant("_PAGE_SIZE", PAGE_SIZE);
225 constant("_PAGE_SHIFT", PAGE_SHIFT);
227 constant("_PGD_T_SIZE", sizeof(pgd_t));
228 constant("_PMD_T_SIZE", sizeof(pmd_t));
229 constant("_PTE_T_SIZE", sizeof(pte_t));
231 constant("_PGD_T_LOG2", PGD_T_LOG2);
232 constant("_PMD_T_LOG2", PMD_T_LOG2);
233 constant("_PTE_T_LOG2", PTE_T_LOG2);
235 constant("_PGD_ORDER", PGD_ORDER);
236 constant("_PMD_ORDER", PMD_ORDER);
237 constant("_PTE_ORDER", PTE_ORDER);
239 constant("_PMD_SHIFT", PMD_SHIFT);
240 constant("_PGDIR_SHIFT", PGDIR_SHIFT);
242 constant("_PTRS_PER_PGD", PTRS_PER_PGD);
243 constant("_PTRS_PER_PMD", PTRS_PER_PMD);
244 constant("_PTRS_PER_PTE", PTRS_PER_PTE);
249 void output_sc_defines(void)
251 text("Linux sigcontext offsets.");
252 offset("SC_REGS", struct sigcontext, sc_regs);
253 offset("SC_FPREGS", struct sigcontext, sc_fpregs);
254 offset("SC_ACX", struct sigcontext, sc_acx);
255 offset("SC_MDHI", struct sigcontext, sc_mdhi);
256 offset("SC_MDLO", struct sigcontext, sc_mdlo);
257 offset("SC_PC", struct sigcontext, sc_pc);
258 offset("SC_FPC_CSR", struct sigcontext, sc_fpc_csr);
259 offset("SC_FPC_EIR", struct sigcontext, sc_fpc_eir);
260 offset("SC_HI1", struct sigcontext, sc_hi1);
261 offset("SC_LO1", struct sigcontext, sc_lo1);
262 offset("SC_HI2", struct sigcontext, sc_hi2);
263 offset("SC_LO2", struct sigcontext, sc_lo2);
264 offset("SC_HI3", struct sigcontext, sc_hi3);
265 offset("SC_LO3", struct sigcontext, sc_lo3);
271 void output_sc_defines(void)
273 text("Linux sigcontext offsets.");
274 offset("SC_REGS", struct sigcontext, sc_regs);
275 offset("SC_FPREGS", struct sigcontext, sc_fpregs);
276 offset("SC_MDHI", struct sigcontext, sc_mdhi);
277 offset("SC_MDLO", struct sigcontext, sc_mdlo);
278 offset("SC_PC", struct sigcontext, sc_pc);
279 offset("SC_FPC_CSR", struct sigcontext, sc_fpc_csr);
284 #ifdef CONFIG_MIPS32_COMPAT
285 void output_sc32_defines(void)
287 text("Linux 32-bit sigcontext offsets.");
288 offset("SC32_FPREGS", struct sigcontext32, sc_fpregs);
289 offset("SC32_FPC_CSR", struct sigcontext32, sc_fpc_csr);
290 offset("SC32_FPC_EIR", struct sigcontext32, sc_fpc_eir);
295 void output_signal_defined(void)
297 text("Linux signal numbers.");
298 constant("_SIGHUP", SIGHUP);
299 constant("_SIGINT", SIGINT);
300 constant("_SIGQUIT", SIGQUIT);
301 constant("_SIGILL", SIGILL);
302 constant("_SIGTRAP", SIGTRAP);
303 constant("_SIGIOT", SIGIOT);
304 constant("_SIGABRT", SIGABRT);
305 constant("_SIGEMT", SIGEMT);
306 constant("_SIGFPE", SIGFPE);
307 constant("_SIGKILL", SIGKILL);
308 constant("_SIGBUS", SIGBUS);
309 constant("_SIGSEGV", SIGSEGV);
310 constant("_SIGSYS", SIGSYS);
311 constant("_SIGPIPE", SIGPIPE);
312 constant("_SIGALRM", SIGALRM);
313 constant("_SIGTERM", SIGTERM);
314 constant("_SIGUSR1", SIGUSR1);
315 constant("_SIGUSR2", SIGUSR2);
316 constant("_SIGCHLD", SIGCHLD);
317 constant("_SIGPWR", SIGPWR);
318 constant("_SIGWINCH", SIGWINCH);
319 constant("_SIGURG", SIGURG);
320 constant("_SIGIO", SIGIO);
321 constant("_SIGSTOP", SIGSTOP);
322 constant("_SIGTSTP", SIGTSTP);
323 constant("_SIGCONT", SIGCONT);
324 constant("_SIGTTIN", SIGTTIN);
325 constant("_SIGTTOU", SIGTTOU);
326 constant("_SIGVTALRM", SIGVTALRM);
327 constant("_SIGPROF", SIGPROF);
328 constant("_SIGXCPU", SIGXCPU);
329 constant("_SIGXFSZ", SIGXFSZ);
333 void output_irq_cpustat_t_defines(void)
335 text("Linux irq_cpustat_t offsets.");
336 offset("IC_SOFTIRQ_PENDING", irq_cpustat_t, __softirq_pending);
337 size("IC_IRQ_CPUSTAT_T", irq_cpustat_t);