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