1/* 2 * Generate definitions needed by assembly language modules. 3 * This code generates raw asm output which is post-processed 4 * to extract and format the required data. 5 */ 6 7#include <linux/sched.h> 8#include <linux/signal.h> 9#include <linux/personality.h> 10#include <linux/kbuild.h> 11#include <asm/registers.h> 12#include <asm/ucontext.h> 13#include <asm/processor.h> 14#include <asm/thread_info.h> 15#include <asm/gdb-stub.h> 16 17#define DEF_PTREG(sym, reg) \ 18 asm volatile("\n->" #sym " %0 offsetof(struct pt_regs, " #reg ")" \ 19 : : "i" (offsetof(struct pt_regs, reg))) 20 21#define DEF_IREG(sym, reg) \ 22 asm volatile("\n->" #sym " %0 offsetof(struct user_context, " #reg ")" \ 23 : : "i" (offsetof(struct user_context, reg))) 24 25#define DEF_FREG(sym, reg) \ 26 asm volatile("\n->" #sym " %0 offsetof(struct user_context, " #reg ")" \ 27 : : "i" (offsetof(struct user_context, reg))) 28 29#define DEF_0REG(sym, reg) \ 30 asm volatile("\n->" #sym " %0 offsetof(struct frv_frame0, " #reg ")" \ 31 : : "i" (offsetof(struct frv_frame0, reg))) 32 33void foo(void) 34{ 35 /* offsets into the thread_info structure */ 36 OFFSET(TI_TASK, thread_info, task); 37 OFFSET(TI_FLAGS, thread_info, flags); 38 OFFSET(TI_STATUS, thread_info, status); 39 OFFSET(TI_CPU, thread_info, cpu); 40 OFFSET(TI_PREEMPT_COUNT, thread_info, preempt_count); 41 OFFSET(TI_ADDR_LIMIT, thread_info, addr_limit); 42 BLANK(); 43 44 /* offsets into register file storage */ 45 DEF_PTREG(REG_PSR, psr); 46 DEF_PTREG(REG_ISR, isr); 47 DEF_PTREG(REG_CCR, ccr); 48 DEF_PTREG(REG_CCCR, cccr); 49 DEF_PTREG(REG_LR, lr); 50 DEF_PTREG(REG_LCR, lcr); 51 DEF_PTREG(REG_PC, pc); 52 DEF_PTREG(REG__STATUS, __status); 53 DEF_PTREG(REG_SYSCALLNO, syscallno); 54 DEF_PTREG(REG_ORIG_GR8, orig_gr8); 55 DEF_PTREG(REG_GNER0, gner0); 56 DEF_PTREG(REG_GNER1, gner1); 57 DEF_PTREG(REG_IACC0, iacc0); 58 DEF_PTREG(REG_TBR, tbr); 59 DEF_PTREG(REG_GR0, tbr); 60 DEFINE(REG__END, sizeof(struct pt_regs)); 61 BLANK(); 62 63 DEF_0REG(REG_DCR, debug.dcr); 64 DEF_0REG(REG_IBAR0, debug.ibar[0]); 65 DEF_0REG(REG_DBAR0, debug.dbar[0]); 66 DEF_0REG(REG_DBDR00, debug.dbdr[0][0]); 67 DEF_0REG(REG_DBMR00, debug.dbmr[0][0]); 68 BLANK(); 69 70 DEF_IREG(__INT_GR0, i.gr[0]); 71 DEF_FREG(__USER_FPMEDIA, f); 72 DEF_FREG(__FPMEDIA_FR0, f.fr[0]); 73 DEF_FREG(__FPMEDIA_FNER0, f.fner[0]); 74 DEF_FREG(__FPMEDIA_MSR0, f.msr[0]); 75 DEF_FREG(__FPMEDIA_ACC0, f.acc[0]); 76 DEF_FREG(__FPMEDIA_ACCG0, f.accg[0]); 77 DEF_FREG(__FPMEDIA_FSR0, f.fsr[0]); 78 BLANK(); 79 80 DEFINE(NR_PT_REGS, sizeof(struct pt_regs) / 4); 81 DEFINE(NR_USER_INT_REGS, sizeof(struct user_int_regs) / 4); 82 DEFINE(NR_USER_FPMEDIA_REGS, sizeof(struct user_fpmedia_regs) / 4); 83 DEFINE(NR_USER_CONTEXT, sizeof(struct user_context) / 4); 84 DEFINE(FRV_FRAME0_SIZE, sizeof(struct frv_frame0)); 85 BLANK(); 86 87 /* offsets into thread_struct */ 88 OFFSET(__THREAD_FRAME, thread_struct, frame); 89 OFFSET(__THREAD_CURR, thread_struct, curr); 90 OFFSET(__THREAD_SP, thread_struct, sp); 91 OFFSET(__THREAD_FP, thread_struct, fp); 92 OFFSET(__THREAD_LR, thread_struct, lr); 93 OFFSET(__THREAD_PC, thread_struct, pc); 94 OFFSET(__THREAD_GR16, thread_struct, gr[0]); 95 OFFSET(__THREAD_SCHED_LR, thread_struct, sched_lr); 96 OFFSET(__THREAD_FRAME0, thread_struct, frame0); 97 OFFSET(__THREAD_USER, thread_struct, user); 98 BLANK(); 99 100 /* offsets into frv_debug_status */ 101 OFFSET(DEBUG_BPSR, frv_debug_status, bpsr); 102 OFFSET(DEBUG_DCR, frv_debug_status, dcr); 103 OFFSET(DEBUG_BRR, frv_debug_status, brr); 104 OFFSET(DEBUG_NMAR, frv_debug_status, nmar); 105 BLANK(); 106} 107