File: /usr/src/linux/arch/ia64/tools/print_offsets.c

1     /*
2      * Utility to generate asm-ia64/offsets.h.
3      *
4      * Copyright (C) 1999-2001 Hewlett-Packard Co
5      * Copyright (C) 1999-2001 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_PT_REGS_SIZE",		sizeof (struct pt_regs) },
48         { "IA64_SWITCH_STACK_SIZE",		sizeof (struct switch_stack) },
49         { "IA64_SIGINFO_SIZE",		sizeof (struct siginfo) },
50         { "IA64_CPU_SIZE",			sizeof (struct cpuinfo_ia64) },
51         { "SIGFRAME_SIZE",			sizeof (struct sigframe) },
52         { "UNW_FRAME_INFO_SIZE",		sizeof (struct unw_frame_info) },
53         { "", 0 },			/* spacer */
54         { "IA64_TASK_PTRACE_OFFSET",	offsetof (struct task_struct, ptrace) },
55         { "IA64_TASK_SIGPENDING_OFFSET",	offsetof (struct task_struct, sigpending) },
56         { "IA64_TASK_NEED_RESCHED_OFFSET",	offsetof (struct task_struct, need_resched) },
57         { "IA64_TASK_PROCESSOR_OFFSET",	offsetof (struct task_struct, processor) },
58         { "IA64_TASK_THREAD_OFFSET",	offsetof (struct task_struct, thread) },
59         { "IA64_TASK_THREAD_KSP_OFFSET",	offsetof (struct task_struct, thread.ksp) },
60     #ifdef CONFIG_IA32_SUPPORT
61         { "IA64_TASK_THREAD_SIGMASK_OFFSET",offsetof (struct task_struct, thread.un.sigmask) },
62     #endif
63     #ifdef CONFIG_PERFMON
64         { "IA64_TASK_PFM_NOTIFY_OFFSET",	offsetof(struct task_struct, thread.pfm_pend_notify) },
65     #endif
66         { "IA64_TASK_PID_OFFSET",		offsetof (struct task_struct, pid) },
67         { "IA64_TASK_MM_OFFSET",		offsetof (struct task_struct, mm) },
68         { "IA64_PT_REGS_CR_IPSR_OFFSET",	offsetof (struct pt_regs, cr_ipsr) },
69         { "IA64_PT_REGS_CR_IIP_OFFSET",	offsetof (struct pt_regs, cr_iip) },
70         { "IA64_PT_REGS_CR_IFS_OFFSET",	offsetof (struct pt_regs, cr_ifs) },
71         { "IA64_PT_REGS_AR_UNAT_OFFSET",	offsetof (struct pt_regs, ar_unat) },
72         { "IA64_PT_REGS_AR_PFS_OFFSET",	offsetof (struct pt_regs, ar_pfs) },
73         { "IA64_PT_REGS_AR_RSC_OFFSET",	offsetof (struct pt_regs, ar_rsc) },
74         { "IA64_PT_REGS_AR_RNAT_OFFSET",	offsetof (struct pt_regs, ar_rnat) },
75         { "IA64_PT_REGS_AR_BSPSTORE_OFFSET",offsetof (struct pt_regs, ar_bspstore) },
76         { "IA64_PT_REGS_PR_OFFSET",		offsetof (struct pt_regs, pr) },
77         { "IA64_PT_REGS_B6_OFFSET",		offsetof (struct pt_regs, b6) },
78         { "IA64_PT_REGS_LOADRS_OFFSET",	offsetof (struct pt_regs, loadrs) },
79         { "IA64_PT_REGS_R1_OFFSET",		offsetof (struct pt_regs, r1) },
80         { "IA64_PT_REGS_R2_OFFSET",		offsetof (struct pt_regs, r2) },
81         { "IA64_PT_REGS_R3_OFFSET",		offsetof (struct pt_regs, r3) },
82         { "IA64_PT_REGS_R12_OFFSET",	offsetof (struct pt_regs, r12) },
83         { "IA64_PT_REGS_R13_OFFSET",	offsetof (struct pt_regs, r13) },
84         { "IA64_PT_REGS_R14_OFFSET",	offsetof (struct pt_regs, r14) },
85         { "IA64_PT_REGS_R15_OFFSET",	offsetof (struct pt_regs, r15) },
86         { "IA64_PT_REGS_R8_OFFSET",		offsetof (struct pt_regs, r8) },
87         { "IA64_PT_REGS_R9_OFFSET",		offsetof (struct pt_regs, r9) },
88         { "IA64_PT_REGS_R10_OFFSET",	offsetof (struct pt_regs, r10) },
89         { "IA64_PT_REGS_R11_OFFSET",	offsetof (struct pt_regs, r11) },
90         { "IA64_PT_REGS_R16_OFFSET",	offsetof (struct pt_regs, r16) },
91         { "IA64_PT_REGS_R17_OFFSET",	offsetof (struct pt_regs, r17) },
92         { "IA64_PT_REGS_R18_OFFSET",	offsetof (struct pt_regs, r18) },
93         { "IA64_PT_REGS_R19_OFFSET",	offsetof (struct pt_regs, r19) },
94         { "IA64_PT_REGS_R20_OFFSET",	offsetof (struct pt_regs, r20) },
95         { "IA64_PT_REGS_R21_OFFSET",	offsetof (struct pt_regs, r21) },
96         { "IA64_PT_REGS_R22_OFFSET",	offsetof (struct pt_regs, r22) },
97         { "IA64_PT_REGS_R23_OFFSET",	offsetof (struct pt_regs, r23) },
98         { "IA64_PT_REGS_R24_OFFSET",	offsetof (struct pt_regs, r24) },
99         { "IA64_PT_REGS_R25_OFFSET",	offsetof (struct pt_regs, r25) },
100         { "IA64_PT_REGS_R26_OFFSET",	offsetof (struct pt_regs, r26) },
101         { "IA64_PT_REGS_R27_OFFSET",	offsetof (struct pt_regs, r27) },
102         { "IA64_PT_REGS_R28_OFFSET",	offsetof (struct pt_regs, r28) },
103         { "IA64_PT_REGS_R29_OFFSET",	offsetof (struct pt_regs, r29) },
104         { "IA64_PT_REGS_R30_OFFSET",	offsetof (struct pt_regs, r30) },
105         { "IA64_PT_REGS_R31_OFFSET",	offsetof (struct pt_regs, r31) },
106         { "IA64_PT_REGS_AR_CCV_OFFSET",	offsetof (struct pt_regs, ar_ccv) },
107         { "IA64_PT_REGS_AR_FPSR_OFFSET",	offsetof (struct pt_regs, ar_fpsr) },
108         { "IA64_PT_REGS_B0_OFFSET",		offsetof (struct pt_regs, b0) },
109         { "IA64_PT_REGS_B7_OFFSET",		offsetof (struct pt_regs, b7) },
110         { "IA64_PT_REGS_F6_OFFSET",		offsetof (struct pt_regs, f6) },
111         { "IA64_PT_REGS_F7_OFFSET",		offsetof (struct pt_regs, f7) },
112         { "IA64_PT_REGS_F8_OFFSET",		offsetof (struct pt_regs, f8) },
113         { "IA64_PT_REGS_F9_OFFSET",		offsetof (struct pt_regs, f9) },
114         { "IA64_SWITCH_STACK_CALLER_UNAT_OFFSET",	offsetof (struct switch_stack, caller_unat) },
115         { "IA64_SWITCH_STACK_AR_FPSR_OFFSET",	offsetof (struct switch_stack, ar_fpsr) },
116         { "IA64_SWITCH_STACK_F2_OFFSET",		offsetof (struct switch_stack, f2) },
117         { "IA64_SWITCH_STACK_F3_OFFSET",		offsetof (struct switch_stack, f3) },
118         { "IA64_SWITCH_STACK_F4_OFFSET",		offsetof (struct switch_stack, f4) },
119         { "IA64_SWITCH_STACK_F5_OFFSET",		offsetof (struct switch_stack, f5) },
120         { "IA64_SWITCH_STACK_F10_OFFSET",		offsetof (struct switch_stack, f10) },
121         { "IA64_SWITCH_STACK_F11_OFFSET",		offsetof (struct switch_stack, f11) },
122         { "IA64_SWITCH_STACK_F12_OFFSET",		offsetof (struct switch_stack, f12) },
123         { "IA64_SWITCH_STACK_F13_OFFSET",		offsetof (struct switch_stack, f13) },
124         { "IA64_SWITCH_STACK_F14_OFFSET",		offsetof (struct switch_stack, f14) },
125         { "IA64_SWITCH_STACK_F15_OFFSET",		offsetof (struct switch_stack, f15) },
126         { "IA64_SWITCH_STACK_F16_OFFSET",		offsetof (struct switch_stack, f16) },
127         { "IA64_SWITCH_STACK_F17_OFFSET",		offsetof (struct switch_stack, f17) },
128         { "IA64_SWITCH_STACK_F18_OFFSET",		offsetof (struct switch_stack, f18) },
129         { "IA64_SWITCH_STACK_F19_OFFSET",		offsetof (struct switch_stack, f19) },
130         { "IA64_SWITCH_STACK_F20_OFFSET",		offsetof (struct switch_stack, f20) },
131         { "IA64_SWITCH_STACK_F21_OFFSET",		offsetof (struct switch_stack, f21) },
132         { "IA64_SWITCH_STACK_F22_OFFSET",		offsetof (struct switch_stack, f22) },
133         { "IA64_SWITCH_STACK_F23_OFFSET",		offsetof (struct switch_stack, f23) },
134         { "IA64_SWITCH_STACK_F24_OFFSET",		offsetof (struct switch_stack, f24) },
135         { "IA64_SWITCH_STACK_F25_OFFSET",		offsetof (struct switch_stack, f25) },
136         { "IA64_SWITCH_STACK_F26_OFFSET",		offsetof (struct switch_stack, f26) },
137         { "IA64_SWITCH_STACK_F27_OFFSET",		offsetof (struct switch_stack, f27) },
138         { "IA64_SWITCH_STACK_F28_OFFSET",		offsetof (struct switch_stack, f28) },
139         { "IA64_SWITCH_STACK_F29_OFFSET",		offsetof (struct switch_stack, f29) },
140         { "IA64_SWITCH_STACK_F30_OFFSET",		offsetof (struct switch_stack, f30) },
141         { "IA64_SWITCH_STACK_F31_OFFSET",		offsetof (struct switch_stack, f31) },
142         { "IA64_SWITCH_STACK_R4_OFFSET",		offsetof (struct switch_stack, r4) },
143         { "IA64_SWITCH_STACK_R5_OFFSET",		offsetof (struct switch_stack, r5) },
144         { "IA64_SWITCH_STACK_R6_OFFSET",		offsetof (struct switch_stack, r6) },
145         { "IA64_SWITCH_STACK_R7_OFFSET",		offsetof (struct switch_stack, r7) },
146         { "IA64_SWITCH_STACK_B0_OFFSET",		offsetof (struct switch_stack, b0) },
147         { "IA64_SWITCH_STACK_B1_OFFSET",		offsetof (struct switch_stack, b1) },
148         { "IA64_SWITCH_STACK_B2_OFFSET",		offsetof (struct switch_stack, b2) },
149         { "IA64_SWITCH_STACK_B3_OFFSET",		offsetof (struct switch_stack, b3) },
150         { "IA64_SWITCH_STACK_B4_OFFSET",		offsetof (struct switch_stack, b4) },
151         { "IA64_SWITCH_STACK_B5_OFFSET",		offsetof (struct switch_stack, b5) },
152         { "IA64_SWITCH_STACK_AR_PFS_OFFSET",	offsetof (struct switch_stack, ar_pfs) },
153         { "IA64_SWITCH_STACK_AR_LC_OFFSET",		offsetof (struct switch_stack, ar_lc) },
154         { "IA64_SWITCH_STACK_AR_UNAT_OFFSET",	offsetof (struct switch_stack, ar_unat) },
155         { "IA64_SWITCH_STACK_AR_RNAT_OFFSET",	offsetof (struct switch_stack, ar_rnat) },
156         { "IA64_SWITCH_STACK_AR_BSPSTORE_OFFSET",	offsetof (struct switch_stack, ar_bspstore) },
157         { "IA64_SWITCH_STACK_PR_OFFSET",	offsetof (struct switch_stack, pr) },
158         { "IA64_SIGCONTEXT_AR_BSP_OFFSET",	offsetof (struct sigcontext, sc_ar_bsp) },
159         { "IA64_SIGCONTEXT_AR_FPSR_OFFSET", offsetof (struct sigcontext, sc_ar_fpsr) },
160         { "IA64_SIGCONTEXT_AR_RNAT_OFFSET",	offsetof (struct sigcontext, sc_ar_rnat) },
161         { "IA64_SIGCONTEXT_AR_UNAT_OFFSET", offsetof (struct sigcontext, sc_ar_unat) },
162         { "IA64_SIGCONTEXT_B0_OFFSET",	offsetof (struct sigcontext, sc_br[0]) },
163         { "IA64_SIGCONTEXT_CFM_OFFSET",	offsetof (struct sigcontext, sc_cfm) },
164         { "IA64_SIGCONTEXT_FLAGS_OFFSET",	offsetof (struct sigcontext, sc_flags) },
165         { "IA64_SIGCONTEXT_FR6_OFFSET",	offsetof (struct sigcontext, sc_fr[6]) },
166         { "IA64_SIGCONTEXT_PR_OFFSET",	offsetof (struct sigcontext, sc_pr) },
167         { "IA64_SIGCONTEXT_R12_OFFSET",	offsetof (struct sigcontext, sc_gr[12]) },
168         { "IA64_SIGFRAME_ARG0_OFFSET",		offsetof (struct sigframe, arg0) },
169         { "IA64_SIGFRAME_ARG1_OFFSET",		offsetof (struct sigframe, arg1) },
170         { "IA64_SIGFRAME_ARG2_OFFSET",		offsetof (struct sigframe, arg2) },
171         { "IA64_SIGFRAME_RBS_BASE_OFFSET",		offsetof (struct sigframe, rbs_base) },
172         { "IA64_SIGFRAME_HANDLER_OFFSET",		offsetof (struct sigframe, handler) },
173         { "IA64_SIGFRAME_SIGCONTEXT_OFFSET",	offsetof (struct sigframe, sc) },
174         { "IA64_CLONE_VFORK",		CLONE_VFORK },
175         { "IA64_CLONE_VM",			CLONE_VM },
176         { "IA64_CPU_IRQ_COUNT_OFFSET",	offsetof (struct cpuinfo_ia64, irq_stat.f.irq_count) },
177         { "IA64_CPU_BH_COUNT_OFFSET",	offsetof (struct cpuinfo_ia64, irq_stat.f.bh_count) },
178         { "IA64_CPU_PHYS_STACKED_SIZE_P8_OFFSET",	offsetof (struct cpuinfo_ia64, phys_stacked_size_p8) },
179     };
180     
181     static const char *tabs = "\t\t\t\t\t\t\t\t\t\t";
182     
183     int
184     main (int argc, char **argv)
185     {
186       const char *space;
187       int i, num_tabs;
188       size_t len;
189     
190       printf ("#ifndef _ASM_IA64_OFFSETS_H\n");
191       printf ("#define _ASM_IA64_OFFSETS_H\n\n");
192     
193       printf ("/*\n * DO NOT MODIFY\n *\n * This file was generated by "
194     	  "arch/ia64/tools/print_offsets.\n *\n */\n\n");
195     
196       /* This is stretching things a bit, but entry.S needs the bit number
197          for PT_PTRACED and it can't include <linux/sched.h> so this seems
198          like a reasonably solution.  At least the code won't break in
199          subtle ways should PT_PTRACED ever change.  Ditto for
200          PT_TRACESYS_BIT. */
201       printf ("#define PT_PTRACED_BIT\t\t\t%u\n", ffs (PT_PTRACED) - 1);
202       printf ("#define PT_TRACESYS_BIT\t\t\t%u\n\n", ffs (PT_TRACESYS) - 1);
203     
204       for (i = 0; i < sizeof (tab) / sizeof (tab[0]); ++i)
205         {
206           if (tab[i].name[0] == '\0')
207     	printf ("\n");
208           else
209     	{
210     	  len = strlen (tab[i].name);
211     
212     	  num_tabs = (40 - len) / 8;
213     	  if (num_tabs <= 0)
214     	    space = " ";
215     	  else
216     	    space = strchr(tabs, '\0') - (40 - len) / 8;
217     
218     	  printf ("#define %s%s%lu\t/* 0x%lx */\n",
219     		  tab[i].name, space, tab[i].value, tab[i].value);
220     	}
221         }
222     
223       printf ("\n#endif /* _ASM_IA64_OFFSETS_H */\n");
224       return 0;
225     }
226