Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[linux-2.6] / arch / mips / kernel / asm-offsets.c
1 /*
2  * offset.c: Calculate pt_regs and task_struct offsets.
3  *
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.
7  *
8  * Kevin Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
9  * Copyright (C) 2000 MIPS Technologies, Inc.
10  */
11 #include <linux/compat.h>
12 #include <linux/types.h>
13 #include <linux/sched.h>
14 #include <linux/mm.h>
15 #include <linux/interrupt.h>
16
17 #include <asm/ptrace.h>
18 #include <asm/processor.h>
19
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("")
29
30 void output_ptreg_defines(void)
31 {
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);
69 #endif
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);
78         linefeed;
79 }
80
81 void output_task_defines(void)
82 {
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);
90         linefeed;
91 }
92
93 void output_thread_info_defines(void)
94 {
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);
107         linefeed;
108 }
109
110 void output_thread_defines(void)
111 {
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,
125                thread.cp0_status);
126         offset("THREAD_FPU", struct task_struct, thread.fpu);
127
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, \
133                thread.error_code);
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, \
138                thread.irix_oldctx);
139         linefeed;
140 }
141
142 void output_thread_fpu_defines(void)
143 {
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]);
208
209         offset("THREAD_FCR31",
210                struct task_struct, thread.fpu.fcr31);
211         linefeed;
212 }
213
214 void output_mm_defines(void)
215 {
216         text("Size of struct page");
217         size("STRUCT_PAGE_SIZE", struct page);
218         linefeed;
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);
223         linefeed;
224         constant("_PAGE_SIZE", PAGE_SIZE);
225         constant("_PAGE_SHIFT", PAGE_SHIFT);
226         linefeed;
227         constant("_PGD_T_SIZE", sizeof(pgd_t));
228         constant("_PMD_T_SIZE", sizeof(pmd_t));
229         constant("_PTE_T_SIZE", sizeof(pte_t));
230         linefeed;
231         constant("_PGD_T_LOG2", PGD_T_LOG2);
232         constant("_PMD_T_LOG2", PMD_T_LOG2);
233         constant("_PTE_T_LOG2", PTE_T_LOG2);
234         linefeed;
235         constant("_PGD_ORDER", PGD_ORDER);
236         constant("_PMD_ORDER", PMD_ORDER);
237         constant("_PTE_ORDER", PTE_ORDER);
238         linefeed;
239         constant("_PMD_SHIFT", PMD_SHIFT);
240         constant("_PGDIR_SHIFT", PGDIR_SHIFT);
241         linefeed;
242         constant("_PTRS_PER_PGD", PTRS_PER_PGD);
243         constant("_PTRS_PER_PMD", PTRS_PER_PMD);
244         constant("_PTRS_PER_PTE", PTRS_PER_PTE);
245         linefeed;
246 }
247
248 #ifdef CONFIG_32BIT
249 void output_sc_defines(void)
250 {
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);
266         linefeed;
267 }
268 #endif
269
270 #ifdef CONFIG_64BIT
271 void output_sc_defines(void)
272 {
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);
280         linefeed;
281 }
282 #endif
283
284 #ifdef CONFIG_MIPS32_COMPAT
285 void output_sc32_defines(void)
286 {
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);
291         linefeed;
292 }
293 #endif
294
295 void output_signal_defined(void)
296 {
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);
330         linefeed;
331 }
332
333 void output_irq_cpustat_t_defines(void)
334 {
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);
338         linefeed;
339 }