Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | /* * Utility to generate asm-ia64/offsets.h. * * Copyright (C) 1999-2000 Hewlett-Packard Co * Copyright (C) 1999-2000 David Mosberger-Tang <davidm@hpl.hp.com> * * Note that this file has dual use: when building the kernel * natively, the file is translated into a binary and executed. When * building the kernel in a cross-development environment, this file * gets translated into an assembly file which, in turn, is processed * by awk to generate offsets.h. So if you make any changes to this * file, be sure to verify that the awk procedure still works (see * prin_offsets.awk). */ #include <linux/config.h> #include <linux/sched.h> #include <asm-ia64/processor.h> #include <asm-ia64/ptrace.h> #include <asm-ia64/siginfo.h> #include <asm-ia64/sigcontext.h> #ifdef offsetof # undef offsetof #endif /* * We _can't_ include the host's standard header file, as those are in * potential conflict with the what the Linux kernel declares for the * target system. */ extern int printf (const char *, ...); #define offsetof(type,field) ((char *) &((type *) 0)->field - (char *) 0) struct { const char name[256]; unsigned long value; } tab[] = { { "IA64_TASK_SIZE", sizeof (struct task_struct) }, { "IA64_PT_REGS_SIZE", sizeof (struct pt_regs) }, { "IA64_SWITCH_STACK_SIZE", sizeof (struct switch_stack) }, { "IA64_SIGINFO_SIZE", sizeof (struct siginfo) }, { "", 0 }, /* spacer */ { "IA64_TASK_FLAGS_OFFSET", offsetof (struct task_struct, flags) }, { "IA64_TASK_SIGPENDING_OFFSET", offsetof (struct task_struct, sigpending) }, { "IA64_TASK_NEED_RESCHED_OFFSET", offsetof (struct task_struct, need_resched) }, { "IA64_TASK_PROCESSOR_OFFSET", offsetof (struct task_struct, processor) }, { "IA64_TASK_THREAD_OFFSET", offsetof (struct task_struct, thread) }, { "IA64_TASK_THREAD_KSP_OFFSET", offsetof (struct task_struct, thread.ksp) }, #ifdef CONFIG_IA32_SUPPORT { "IA64_TASK_THREAD_SIGMASK_OFFSET",offsetof (struct task_struct, thread.un.sigmask) }, #endif { "IA64_TASK_PID_OFFSET", offsetof (struct task_struct, pid) }, { "IA64_TASK_MM_OFFSET", offsetof (struct task_struct, mm) }, { "IA64_PT_REGS_CR_IPSR_OFFSET", offsetof (struct pt_regs, cr_ipsr) }, { "IA64_PT_REGS_R12_OFFSET", offsetof (struct pt_regs, r12) }, { "IA64_PT_REGS_R8_OFFSET", offsetof (struct pt_regs, r8) }, { "IA64_PT_REGS_R16_OFFSET", offsetof (struct pt_regs, r16) }, { "IA64_SWITCH_STACK_B0_OFFSET", offsetof (struct switch_stack, b0) }, { "IA64_SWITCH_STACK_CALLER_UNAT_OFFSET", offsetof (struct switch_stack, caller_unat) }, { "IA64_SIGCONTEXT_AR_BSP_OFFSET", offsetof (struct sigcontext, sc_ar_bsp) }, { "IA64_SIGCONTEXT_AR_RNAT_OFFSET", offsetof (struct sigcontext, sc_ar_rnat) }, { "IA64_SIGCONTEXT_FLAGS_OFFSET", offsetof (struct sigcontext, sc_flags) }, { "IA64_SIGCONTEXT_CFM_OFFSET", offsetof (struct sigcontext, sc_cfm) }, { "IA64_SIGCONTEXT_FR6_OFFSET", offsetof (struct sigcontext, sc_fr[6]) }, { "IA64_CLONE_VFORK", CLONE_VFORK }, { "IA64_CLONE_VM", CLONE_VM }, }; static const char *tabs = "\t\t\t\t\t\t\t\t\t\t"; int main (int argc, char **argv) { const char *space; int i, num_tabs; size_t len; printf ("#ifndef _ASM_IA64_OFFSETS_H\n"); printf ("#define _ASM_IA64_OFFSETS_H\n\n"); printf ("/*\n * DO NOT MODIFY\n *\n * This file was generated by " "arch/ia64/tools/print_offsets.\n *\n */\n\n"); /* This is stretching things a bit, but entry.S needs the bit number for PF_PTRACED and it can't include <linux/sched.h> so this seems like a reasonably solution. At least the code won't break shoudl PF_PTRACED ever change. */ printf ("#define PF_PTRACED_BIT\t\t\t%u\n\n", ffs (PF_PTRACED) - 1); for (i = 0; i < sizeof (tab) / sizeof (tab[0]); ++i) { if (tab[i].name[0] == '\0') printf ("\n"); else { len = strlen (tab[i].name); num_tabs = (40 - len) / 8; if (num_tabs <= 0) space = " "; else space = strchr(tabs, '\0') - (40 - len) / 8; printf ("#define %s%s%lu\t/* 0x%lx */\n", tab[i].name, space, tab[i].value, tab[i].value); } } printf ("\n#endif /* _ASM_IA64_OFFSETS_H */\n"); return 0; } |