ia64: Correct unwind info for signal trampoline.
[opensuse:kernel.git] / arch / ia64 / tools / print_offsets.c
1 /*
2  * Utility to generate asm-ia64/offsets.h.
3  *
4  * Copyright (C) 1999-2002 Hewlett-Packard Co
5  *      David Mosberger-Tang <davidm@hpl.hp.com>
6  *
7  * Note that this file has dual use: when building the kernel
8  * natively, the file is translated into a binary and executed.  When
9  * building the kernel in a cross-development environment, this file
10  * gets translated into an assembly file which, in turn, is processed
11  * by awk to generate offsets.h.  So if you make any changes to this
12  * file, be sure to verify that the awk procedure still works (see
13  * prin_offsets.awk).
14  */
15 #include <linux/config.h>
16
17 #include <linux/sched.h>
18
19 #include <asm-ia64/processor.h>
20 #include <asm-ia64/ptrace.h>
21 #include <asm-ia64/siginfo.h>
22 #include <asm-ia64/sigcontext.h>
23
24 #include "../kernel/sigframe.h"
25
26 #ifdef offsetof
27 # undef offsetof
28 #endif
29
30 /*
31  * We _can't_ include the host's standard header file, as those are in
32  *  potential conflict with the what the Linux kernel declares for the
33  *  target system.
34  */
35 extern int printf (const char *, ...);
36
37 #define offsetof(type,field)    ((char *) &((type *) 0)->field - (char *) 0)
38
39 struct
40   {
41     const char name[256];
42     unsigned long value;
43   }
44 tab[] =
45   {
46     { "IA64_TASK_SIZE",                 sizeof (struct task_struct) },
47     { "IA64_THREAD_INFO_SIZE",          sizeof (struct thread_info) },
48     { "IA64_PT_REGS_SIZE",              sizeof (struct pt_regs) },
49     { "IA64_SWITCH_STACK_SIZE",         sizeof (struct switch_stack) },
50     { "IA64_SIGINFO_SIZE",              sizeof (struct siginfo) },
51     { "IA64_CPU_SIZE",                  sizeof (struct cpuinfo_ia64) },
52     { "SIGFRAME_SIZE",                  sizeof (struct sigframe) },
53     { "UNW_FRAME_INFO_SIZE",            sizeof (struct unw_frame_info) },
54     { "", 0 },                  /* spacer */
55     { "IA64_TASK_THREAD_KSP_OFFSET",    offsetof (struct task_struct, thread.ksp) },
56     { "IA64_PT_REGS_CR_IPSR_OFFSET",    offsetof (struct pt_regs, cr_ipsr) },
57     { "IA64_PT_REGS_CR_IIP_OFFSET",     offsetof (struct pt_regs, cr_iip) },
58     { "IA64_PT_REGS_CR_IFS_OFFSET",     offsetof (struct pt_regs, cr_ifs) },
59     { "IA64_PT_REGS_AR_UNAT_OFFSET",    offsetof (struct pt_regs, ar_unat) },
60     { "IA64_PT_REGS_AR_PFS_OFFSET",     offsetof (struct pt_regs, ar_pfs) },
61     { "IA64_PT_REGS_AR_RSC_OFFSET",     offsetof (struct pt_regs, ar_rsc) },
62     { "IA64_PT_REGS_AR_RNAT_OFFSET",    offsetof (struct pt_regs, ar_rnat) },
63     { "IA64_PT_REGS_AR_BSPSTORE_OFFSET",offsetof (struct pt_regs, ar_bspstore) },
64     { "IA64_PT_REGS_PR_OFFSET",         offsetof (struct pt_regs, pr) },
65     { "IA64_PT_REGS_B6_OFFSET",         offsetof (struct pt_regs, b6) },
66     { "IA64_PT_REGS_LOADRS_OFFSET",     offsetof (struct pt_regs, loadrs) },
67     { "IA64_PT_REGS_R1_OFFSET",         offsetof (struct pt_regs, r1) },
68     { "IA64_PT_REGS_R2_OFFSET",         offsetof (struct pt_regs, r2) },
69     { "IA64_PT_REGS_R3_OFFSET",         offsetof (struct pt_regs, r3) },
70     { "IA64_PT_REGS_R12_OFFSET",        offsetof (struct pt_regs, r12) },
71     { "IA64_PT_REGS_R13_OFFSET",        offsetof (struct pt_regs, r13) },
72     { "IA64_PT_REGS_R14_OFFSET",        offsetof (struct pt_regs, r14) },
73     { "IA64_PT_REGS_R15_OFFSET",        offsetof (struct pt_regs, r15) },
74     { "IA64_PT_REGS_R8_OFFSET",         offsetof (struct pt_regs, r8) },
75     { "IA64_PT_REGS_R9_OFFSET",         offsetof (struct pt_regs, r9) },
76     { "IA64_PT_REGS_R10_OFFSET",        offsetof (struct pt_regs, r10) },
77     { "IA64_PT_REGS_R11_OFFSET",        offsetof (struct pt_regs, r11) },
78     { "IA64_PT_REGS_R16_OFFSET",        offsetof (struct pt_regs, r16) },
79     { "IA64_PT_REGS_R17_OFFSET",        offsetof (struct pt_regs, r17) },
80     { "IA64_PT_REGS_R18_OFFSET",        offsetof (struct pt_regs, r18) },
81     { "IA64_PT_REGS_R19_OFFSET",        offsetof (struct pt_regs, r19) },
82     { "IA64_PT_REGS_R20_OFFSET",        offsetof (struct pt_regs, r20) },
83     { "IA64_PT_REGS_R21_OFFSET",        offsetof (struct pt_regs, r21) },
84     { "IA64_PT_REGS_R22_OFFSET",        offsetof (struct pt_regs, r22) },
85     { "IA64_PT_REGS_R23_OFFSET",        offsetof (struct pt_regs, r23) },
86     { "IA64_PT_REGS_R24_OFFSET",        offsetof (struct pt_regs, r24) },
87     { "IA64_PT_REGS_R25_OFFSET",        offsetof (struct pt_regs, r25) },
88     { "IA64_PT_REGS_R26_OFFSET",        offsetof (struct pt_regs, r26) },
89     { "IA64_PT_REGS_R27_OFFSET",        offsetof (struct pt_regs, r27) },
90     { "IA64_PT_REGS_R28_OFFSET",        offsetof (struct pt_regs, r28) },
91     { "IA64_PT_REGS_R29_OFFSET",        offsetof (struct pt_regs, r29) },
92     { "IA64_PT_REGS_R30_OFFSET",        offsetof (struct pt_regs, r30) },
93     { "IA64_PT_REGS_R31_OFFSET",        offsetof (struct pt_regs, r31) },
94     { "IA64_PT_REGS_AR_CCV_OFFSET",     offsetof (struct pt_regs, ar_ccv) },
95     { "IA64_PT_REGS_AR_FPSR_OFFSET",    offsetof (struct pt_regs, ar_fpsr) },
96     { "IA64_PT_REGS_B0_OFFSET",         offsetof (struct pt_regs, b0) },
97     { "IA64_PT_REGS_B7_OFFSET",         offsetof (struct pt_regs, b7) },
98     { "IA64_PT_REGS_F6_OFFSET",         offsetof (struct pt_regs, f6) },
99     { "IA64_PT_REGS_F7_OFFSET",         offsetof (struct pt_regs, f7) },
100     { "IA64_PT_REGS_F8_OFFSET",         offsetof (struct pt_regs, f8) },
101     { "IA64_PT_REGS_F9_OFFSET",         offsetof (struct pt_regs, f9) },
102     { "IA64_SWITCH_STACK_CALLER_UNAT_OFFSET",   offsetof (struct switch_stack, caller_unat) },
103     { "IA64_SWITCH_STACK_AR_FPSR_OFFSET",       offsetof (struct switch_stack, ar_fpsr) },
104     { "IA64_SWITCH_STACK_F2_OFFSET",            offsetof (struct switch_stack, f2) },
105     { "IA64_SWITCH_STACK_F3_OFFSET",            offsetof (struct switch_stack, f3) },
106     { "IA64_SWITCH_STACK_F4_OFFSET",            offsetof (struct switch_stack, f4) },
107     { "IA64_SWITCH_STACK_F5_OFFSET",            offsetof (struct switch_stack, f5) },
108     { "IA64_SWITCH_STACK_F10_OFFSET",           offsetof (struct switch_stack, f10) },
109     { "IA64_SWITCH_STACK_F11_OFFSET",           offsetof (struct switch_stack, f11) },
110     { "IA64_SWITCH_STACK_F12_OFFSET",           offsetof (struct switch_stack, f12) },
111     { "IA64_SWITCH_STACK_F13_OFFSET",           offsetof (struct switch_stack, f13) },
112     { "IA64_SWITCH_STACK_F14_OFFSET",           offsetof (struct switch_stack, f14) },
113     { "IA64_SWITCH_STACK_F15_OFFSET",           offsetof (struct switch_stack, f15) },
114     { "IA64_SWITCH_STACK_F16_OFFSET",           offsetof (struct switch_stack, f16) },
115     { "IA64_SWITCH_STACK_F17_OFFSET",           offsetof (struct switch_stack, f17) },
116     { "IA64_SWITCH_STACK_F18_OFFSET",           offsetof (struct switch_stack, f18) },
117     { "IA64_SWITCH_STACK_F19_OFFSET",           offsetof (struct switch_stack, f19) },
118     { "IA64_SWITCH_STACK_F20_OFFSET",           offsetof (struct switch_stack, f20) },
119     { "IA64_SWITCH_STACK_F21_OFFSET",           offsetof (struct switch_stack, f21) },
120     { "IA64_SWITCH_STACK_F22_OFFSET",           offsetof (struct switch_stack, f22) },
121     { "IA64_SWITCH_STACK_F23_OFFSET",           offsetof (struct switch_stack, f23) },
122     { "IA64_SWITCH_STACK_F24_OFFSET",           offsetof (struct switch_stack, f24) },
123     { "IA64_SWITCH_STACK_F25_OFFSET",           offsetof (struct switch_stack, f25) },
124     { "IA64_SWITCH_STACK_F26_OFFSET",           offsetof (struct switch_stack, f26) },
125     { "IA64_SWITCH_STACK_F27_OFFSET",           offsetof (struct switch_stack, f27) },
126     { "IA64_SWITCH_STACK_F28_OFFSET",           offsetof (struct switch_stack, f28) },
127     { "IA64_SWITCH_STACK_F29_OFFSET",           offsetof (struct switch_stack, f29) },
128     { "IA64_SWITCH_STACK_F30_OFFSET",           offsetof (struct switch_stack, f30) },
129     { "IA64_SWITCH_STACK_F31_OFFSET",           offsetof (struct switch_stack, f31) },
130     { "IA64_SWITCH_STACK_R4_OFFSET",            offsetof (struct switch_stack, r4) },
131     { "IA64_SWITCH_STACK_R5_OFFSET",            offsetof (struct switch_stack, r5) },
132     { "IA64_SWITCH_STACK_R6_OFFSET",            offsetof (struct switch_stack, r6) },
133     { "IA64_SWITCH_STACK_R7_OFFSET",            offsetof (struct switch_stack, r7) },
134     { "IA64_SWITCH_STACK_B0_OFFSET",            offsetof (struct switch_stack, b0) },
135     { "IA64_SWITCH_STACK_B1_OFFSET",            offsetof (struct switch_stack, b1) },
136     { "IA64_SWITCH_STACK_B2_OFFSET",            offsetof (struct switch_stack, b2) },
137     { "IA64_SWITCH_STACK_B3_OFFSET",            offsetof (struct switch_stack, b3) },
138     { "IA64_SWITCH_STACK_B4_OFFSET",            offsetof (struct switch_stack, b4) },
139     { "IA64_SWITCH_STACK_B5_OFFSET",            offsetof (struct switch_stack, b5) },
140     { "IA64_SWITCH_STACK_AR_PFS_OFFSET",        offsetof (struct switch_stack, ar_pfs) },
141     { "IA64_SWITCH_STACK_AR_LC_OFFSET",         offsetof (struct switch_stack, ar_lc) },
142     { "IA64_SWITCH_STACK_AR_UNAT_OFFSET",       offsetof (struct switch_stack, ar_unat) },
143     { "IA64_SWITCH_STACK_AR_RNAT_OFFSET",       offsetof (struct switch_stack, ar_rnat) },
144     { "IA64_SWITCH_STACK_AR_BSPSTORE_OFFSET",   offsetof (struct switch_stack, ar_bspstore) },
145     { "IA64_SWITCH_STACK_PR_OFFSET",    offsetof (struct switch_stack, pr) },
146     { "IA64_SIGCONTEXT_IP_OFFSET",      offsetof (struct sigcontext, sc_ip) },
147     { "IA64_SIGCONTEXT_AR_BSP_OFFSET",  offsetof (struct sigcontext, sc_ar_bsp) },
148     { "IA64_SIGCONTEXT_AR_FPSR_OFFSET", offsetof (struct sigcontext, sc_ar_fpsr) },
149     { "IA64_SIGCONTEXT_AR_RNAT_OFFSET", offsetof (struct sigcontext, sc_ar_rnat) },
150     { "IA64_SIGCONTEXT_AR_UNAT_OFFSET", offsetof (struct sigcontext, sc_ar_unat) },
151     { "IA64_SIGCONTEXT_B0_OFFSET",      offsetof (struct sigcontext, sc_br[0]) },
152     { "IA64_SIGCONTEXT_CFM_OFFSET",     offsetof (struct sigcontext, sc_cfm) },
153     { "IA64_SIGCONTEXT_FLAGS_OFFSET",   offsetof (struct sigcontext, sc_flags) },
154     { "IA64_SIGCONTEXT_FR6_OFFSET",     offsetof (struct sigcontext, sc_fr[6]) },
155     { "IA64_SIGCONTEXT_PR_OFFSET",      offsetof (struct sigcontext, sc_pr) },
156     { "IA64_SIGCONTEXT_R12_OFFSET",     offsetof (struct sigcontext, sc_gr[12]) },
157     { "IA64_SIGCONTEXT_RBS_BASE_OFFSET",offsetof (struct sigcontext, sc_rbs_base) },
158     { "IA64_SIGCONTEXT_LOADRS_OFFSET",  offsetof (struct sigcontext, sc_loadrs) },
159     { "IA64_SIGFRAME_ARG0_OFFSET",              offsetof (struct sigframe, arg0) },
160     { "IA64_SIGFRAME_ARG1_OFFSET",              offsetof (struct sigframe, arg1) },
161     { "IA64_SIGFRAME_ARG2_OFFSET",              offsetof (struct sigframe, arg2) },
162     { "IA64_SIGFRAME_HANDLER_OFFSET",           offsetof (struct sigframe, handler) },
163     { "IA64_SIGFRAME_SIGCONTEXT_OFFSET",        offsetof (struct sigframe, sc) },
164     { "IA64_CLONE_VFORK",               CLONE_VFORK },
165     { "IA64_CLONE_VM",                  CLONE_VM },
166 };
167
168 static const char *tabs = "\t\t\t\t\t\t\t\t\t\t";
169
170 int
171 main (int argc, char **argv)
172 {
173   const char *space;
174   int i, num_tabs;
175   size_t len;
176
177   printf ("#ifndef _ASM_IA64_OFFSETS_H\n");
178   printf ("#define _ASM_IA64_OFFSETS_H\n\n");
179
180   printf ("/*\n * DO NOT MODIFY\n *\n * This file was generated by "
181           "arch/ia64/tools/print_offsets.\n *\n */\n\n");
182
183   for (i = 0; i < sizeof (tab) / sizeof (tab[0]); ++i)
184     {
185       if (tab[i].name[0] == '\0')
186         printf ("\n");
187       else
188         {
189           len = strlen (tab[i].name);
190
191           num_tabs = (40 - len) / 8;
192           if (num_tabs <= 0)
193             space = " ";
194           else
195             space = strchr(tabs, '\0') - (40 - len) / 8;
196
197           printf ("#define %s%s%lu\t/* 0x%lx */\n",
198                   tab[i].name, space, tab[i].value, tab[i].value);
199         }
200     }
201
202   printf ("\n#endif /* _ASM_IA64_OFFSETS_H */\n");
203   return 0;
204 }