asm-offsets.c 13.7 KB
Newer Older
L
Linus Torvalds 已提交
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
/*
 * offset.c: Calculate pt_regs and task_struct offsets.
 *
 * Copyright (C) 1996 David S. Miller
 * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 Ralf Baechle
 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
 *
 * Kevin Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
 * Copyright (C) 2000 MIPS Technologies, Inc.
 */
#include <linux/config.h>
#include <linux/compat.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <linux/mm.h>
#include <linux/interrupt.h>

#include <asm/ptrace.h>
#include <asm/processor.h>

#define text(t) __asm__("\n@@@" t)
#define _offset(type, member) (&(((type *)NULL)->member))
#define offset(string, ptr, member) \
	__asm__("\n@@@" string "%0" : : "i" (_offset(ptr, member)))
#define constant(string, member) \
	__asm__("\n@@@" string "%x0" : : "ri" (member))
#define size(string, size) \
	__asm__("\n@@@" string "%0" : : "i" (sizeof(size)))
#define linefeed text("")

void output_ptreg_defines(void)
{
	text("/* MIPS pt_regs offsets. */");
	offset("#define PT_R0     ", struct pt_regs, regs[0]);
	offset("#define PT_R1     ", struct pt_regs, regs[1]);
	offset("#define PT_R2     ", struct pt_regs, regs[2]);
	offset("#define PT_R3     ", struct pt_regs, regs[3]);
	offset("#define PT_R4     ", struct pt_regs, regs[4]);
	offset("#define PT_R5     ", struct pt_regs, regs[5]);
	offset("#define PT_R6     ", struct pt_regs, regs[6]);
	offset("#define PT_R7     ", struct pt_regs, regs[7]);
	offset("#define PT_R8     ", struct pt_regs, regs[8]);
	offset("#define PT_R9     ", struct pt_regs, regs[9]);
	offset("#define PT_R10    ", struct pt_regs, regs[10]);
	offset("#define PT_R11    ", struct pt_regs, regs[11]);
	offset("#define PT_R12    ", struct pt_regs, regs[12]);
	offset("#define PT_R13    ", struct pt_regs, regs[13]);
	offset("#define PT_R14    ", struct pt_regs, regs[14]);
	offset("#define PT_R15    ", struct pt_regs, regs[15]);
	offset("#define PT_R16    ", struct pt_regs, regs[16]);
	offset("#define PT_R17    ", struct pt_regs, regs[17]);
	offset("#define PT_R18    ", struct pt_regs, regs[18]);
	offset("#define PT_R19    ", struct pt_regs, regs[19]);
	offset("#define PT_R20    ", struct pt_regs, regs[20]);
	offset("#define PT_R21    ", struct pt_regs, regs[21]);
	offset("#define PT_R22    ", struct pt_regs, regs[22]);
	offset("#define PT_R23    ", struct pt_regs, regs[23]);
	offset("#define PT_R24    ", struct pt_regs, regs[24]);
	offset("#define PT_R25    ", struct pt_regs, regs[25]);
	offset("#define PT_R26    ", struct pt_regs, regs[26]);
	offset("#define PT_R27    ", struct pt_regs, regs[27]);
	offset("#define PT_R28    ", struct pt_regs, regs[28]);
	offset("#define PT_R29    ", struct pt_regs, regs[29]);
	offset("#define PT_R30    ", struct pt_regs, regs[30]);
	offset("#define PT_R31    ", struct pt_regs, regs[31]);
	offset("#define PT_LO     ", struct pt_regs, lo);
	offset("#define PT_HI     ", struct pt_regs, hi);
	offset("#define PT_EPC    ", struct pt_regs, cp0_epc);
	offset("#define PT_BVADDR ", struct pt_regs, cp0_badvaddr);
	offset("#define PT_STATUS ", struct pt_regs, cp0_status);
	offset("#define PT_CAUSE  ", struct pt_regs, cp0_cause);
72 73 74
#ifdef CONFIG_MIPS_MT_SMTC
	offset("#define PT_TCSTATUS  ", struct pt_regs, cp0_tcstatus);
#endif /* CONFIG_MIPS_MT_SMTC */
L
Linus Torvalds 已提交
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
	size("#define PT_SIZE   ", struct pt_regs);
	linefeed;
}

void output_task_defines(void)
{
	text("/* MIPS task_struct offsets. */");
	offset("#define TASK_STATE         ", struct task_struct, state);
	offset("#define TASK_THREAD_INFO   ", struct task_struct, thread_info);
	offset("#define TASK_FLAGS         ", struct task_struct, flags);
	offset("#define TASK_MM            ", struct task_struct, mm);
	offset("#define TASK_PID           ", struct task_struct, pid);
	size(  "#define TASK_STRUCT_SIZE   ", struct task_struct);
	linefeed;
}

void output_thread_info_defines(void)
{
	text("/* MIPS thread_info offsets. */");
	offset("#define TI_TASK            ", struct thread_info, task);
	offset("#define TI_EXEC_DOMAIN     ", struct thread_info, exec_domain);
	offset("#define TI_FLAGS           ", struct thread_info, flags);
	offset("#define TI_CPU             ", struct thread_info, cpu);
	offset("#define TI_PRE_COUNT       ", struct thread_info, preempt_count);
	offset("#define TI_ADDR_LIMIT      ", struct thread_info, addr_limit);
	offset("#define TI_RESTART_BLOCK   ", struct thread_info, restart_block);
101
	offset("#define TI_TP_VALUE	   ", struct thread_info, tp_value);
L
Linus Torvalds 已提交
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
	constant("#define _THREAD_SIZE_ORDER ", THREAD_SIZE_ORDER);
	constant("#define _THREAD_SIZE       ", THREAD_SIZE);
	constant("#define _THREAD_MASK       ", THREAD_MASK);
	linefeed;
}

void output_thread_defines(void)
{
	text("/* MIPS specific thread_struct offsets. */");
	offset("#define THREAD_REG16   ", struct task_struct, thread.reg16);
	offset("#define THREAD_REG17   ", struct task_struct, thread.reg17);
	offset("#define THREAD_REG18   ", struct task_struct, thread.reg18);
	offset("#define THREAD_REG19   ", struct task_struct, thread.reg19);
	offset("#define THREAD_REG20   ", struct task_struct, thread.reg20);
	offset("#define THREAD_REG21   ", struct task_struct, thread.reg21);
	offset("#define THREAD_REG22   ", struct task_struct, thread.reg22);
	offset("#define THREAD_REG23   ", struct task_struct, thread.reg23);
	offset("#define THREAD_REG29   ", struct task_struct, thread.reg29);
	offset("#define THREAD_REG30   ", struct task_struct, thread.reg30);
	offset("#define THREAD_REG31   ", struct task_struct, thread.reg31);
	offset("#define THREAD_STATUS  ", struct task_struct,
	       thread.cp0_status);
	offset("#define THREAD_FPU     ", struct task_struct, thread.fpu);

	offset("#define THREAD_BVADDR  ", struct task_struct, \
	       thread.cp0_badvaddr);
	offset("#define THREAD_BUADDR  ", struct task_struct, \
	       thread.cp0_baduaddr);
	offset("#define THREAD_ECODE   ", struct task_struct, \
	       thread.error_code);
	offset("#define THREAD_TRAPNO  ", struct task_struct, thread.trap_no);
	offset("#define THREAD_MFLAGS  ", struct task_struct, thread.mflags);
	offset("#define THREAD_TRAMP   ", struct task_struct, \
	       thread.irix_trampoline);
	offset("#define THREAD_OLDCTX  ", struct task_struct, \
	       thread.irix_oldctx);
	linefeed;
}

void output_thread_fpu_defines(void)
{
	offset("#define THREAD_FPR0    ",
	       struct task_struct, thread.fpu.hard.fpr[0]);
	offset("#define THREAD_FPR1    ",
	       struct task_struct, thread.fpu.hard.fpr[1]);
	offset("#define THREAD_FPR2    ",
	       struct task_struct, thread.fpu.hard.fpr[2]);
	offset("#define THREAD_FPR3    ",
	       struct task_struct, thread.fpu.hard.fpr[3]);
	offset("#define THREAD_FPR4    ",
	       struct task_struct, thread.fpu.hard.fpr[4]);
	offset("#define THREAD_FPR5    ",
	       struct task_struct, thread.fpu.hard.fpr[5]);
	offset("#define THREAD_FPR6    ",
	       struct task_struct, thread.fpu.hard.fpr[6]);
	offset("#define THREAD_FPR7    ",
	       struct task_struct, thread.fpu.hard.fpr[7]);
	offset("#define THREAD_FPR8    ",
	       struct task_struct, thread.fpu.hard.fpr[8]);
	offset("#define THREAD_FPR9    ",
	       struct task_struct, thread.fpu.hard.fpr[9]);
	offset("#define THREAD_FPR10   ",
	       struct task_struct, thread.fpu.hard.fpr[10]);
	offset("#define THREAD_FPR11   ",
	       struct task_struct, thread.fpu.hard.fpr[11]);
	offset("#define THREAD_FPR12   ",
	       struct task_struct, thread.fpu.hard.fpr[12]);
	offset("#define THREAD_FPR13   ",
	       struct task_struct, thread.fpu.hard.fpr[13]);
	offset("#define THREAD_FPR14   ",
	       struct task_struct, thread.fpu.hard.fpr[14]);
	offset("#define THREAD_FPR15   ",
	       struct task_struct, thread.fpu.hard.fpr[15]);
	offset("#define THREAD_FPR16   ",
	       struct task_struct, thread.fpu.hard.fpr[16]);
	offset("#define THREAD_FPR17   ",
	       struct task_struct, thread.fpu.hard.fpr[17]);
	offset("#define THREAD_FPR18   ",
	       struct task_struct, thread.fpu.hard.fpr[18]);
	offset("#define THREAD_FPR19   ",
	       struct task_struct, thread.fpu.hard.fpr[19]);
	offset("#define THREAD_FPR20   ",
	       struct task_struct, thread.fpu.hard.fpr[20]);
	offset("#define THREAD_FPR21   ",
	       struct task_struct, thread.fpu.hard.fpr[21]);
	offset("#define THREAD_FPR22   ",
	       struct task_struct, thread.fpu.hard.fpr[22]);
	offset("#define THREAD_FPR23   ",
	       struct task_struct, thread.fpu.hard.fpr[23]);
	offset("#define THREAD_FPR24   ",
	       struct task_struct, thread.fpu.hard.fpr[24]);
	offset("#define THREAD_FPR25   ",
	       struct task_struct, thread.fpu.hard.fpr[25]);
	offset("#define THREAD_FPR26   ",
	       struct task_struct, thread.fpu.hard.fpr[26]);
	offset("#define THREAD_FPR27   ",
	       struct task_struct, thread.fpu.hard.fpr[27]);
	offset("#define THREAD_FPR28   ",
	       struct task_struct, thread.fpu.hard.fpr[28]);
	offset("#define THREAD_FPR29   ",
	       struct task_struct, thread.fpu.hard.fpr[29]);
	offset("#define THREAD_FPR30   ",
	       struct task_struct, thread.fpu.hard.fpr[30]);
	offset("#define THREAD_FPR31   ",
	       struct task_struct, thread.fpu.hard.fpr[31]);

	offset("#define THREAD_FCR31   ",
	       struct task_struct, thread.fpu.hard.fcr31);
	linefeed;
}

void output_mm_defines(void)
{
	text("/* Size of struct page  */");
	size("#define STRUCT_PAGE_SIZE   ", struct page);
	linefeed;
	text("/* Linux mm_struct offsets. */");
	offset("#define MM_USERS      ", struct mm_struct, mm_users);
	offset("#define MM_PGD        ", struct mm_struct, pgd);
	offset("#define MM_CONTEXT    ", struct mm_struct, context);
	linefeed;
	constant("#define _PAGE_SIZE     ", PAGE_SIZE);
	constant("#define _PAGE_SHIFT    ", PAGE_SHIFT);
	linefeed;
	constant("#define _PGD_T_SIZE    ", sizeof(pgd_t));
	constant("#define _PMD_T_SIZE    ", sizeof(pmd_t));
	constant("#define _PTE_T_SIZE    ", sizeof(pte_t));
	linefeed;
	constant("#define _PGD_T_LOG2    ", PGD_T_LOG2);
	constant("#define _PMD_T_LOG2    ", PMD_T_LOG2);
	constant("#define _PTE_T_LOG2    ", PTE_T_LOG2);
	linefeed;
	constant("#define _PMD_SHIFT     ", PMD_SHIFT);
	constant("#define _PGDIR_SHIFT   ", PGDIR_SHIFT);
	linefeed;
	constant("#define _PGD_ORDER     ", PGD_ORDER);
	constant("#define _PMD_ORDER     ", PMD_ORDER);
	constant("#define _PTE_ORDER     ", PTE_ORDER);
	linefeed;
	constant("#define _PTRS_PER_PGD  ", PTRS_PER_PGD);
	constant("#define _PTRS_PER_PMD  ", PTRS_PER_PMD);
	constant("#define _PTRS_PER_PTE  ", PTRS_PER_PTE);
	linefeed;
}

247
#ifdef CONFIG_32BIT
L
Linus Torvalds 已提交
248 249 250 251 252 253 254 255 256 257 258
void output_sc_defines(void)
{
	text("/* Linux sigcontext offsets. */");
	offset("#define SC_REGS       ", struct sigcontext, sc_regs);
	offset("#define SC_FPREGS     ", struct sigcontext, sc_fpregs);
	offset("#define SC_MDHI       ", struct sigcontext, sc_mdhi);
	offset("#define SC_MDLO       ", struct sigcontext, sc_mdlo);
	offset("#define SC_PC         ", struct sigcontext, sc_pc);
	offset("#define SC_STATUS     ", struct sigcontext, sc_status);
	offset("#define SC_FPC_CSR    ", struct sigcontext, sc_fpc_csr);
	offset("#define SC_FPC_EIR    ", struct sigcontext, sc_fpc_eir);
259 260 261 262 263 264
	offset("#define SC_HI1        ", struct sigcontext, sc_hi1);
	offset("#define SC_LO1        ", struct sigcontext, sc_lo1);
	offset("#define SC_HI2        ", struct sigcontext, sc_hi2);
	offset("#define SC_LO2        ", struct sigcontext, sc_lo2);
	offset("#define SC_HI3        ", struct sigcontext, sc_hi3);
	offset("#define SC_LO3        ", struct sigcontext, sc_lo3);
L
Linus Torvalds 已提交
265 266
	linefeed;
}
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
#endif

#ifdef CONFIG_64BIT
void output_sc_defines(void)
{
	text("/* Linux sigcontext offsets. */");
	offset("#define SC_REGS       ", struct sigcontext, sc_regs);
	offset("#define SC_FPREGS     ", struct sigcontext, sc_fpregs);
	offset("#define SC_MDHI       ", struct sigcontext, sc_hi);
	offset("#define SC_MDLO       ", struct sigcontext, sc_lo);
	offset("#define SC_PC         ", struct sigcontext, sc_pc);
	offset("#define SC_FPC_CSR    ", struct sigcontext, sc_fpc_csr);
	linefeed;
}
#endif
L
Linus Torvalds 已提交
282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338

#ifdef CONFIG_MIPS32_COMPAT
void output_sc32_defines(void)
{
	text("/* Linux 32-bit sigcontext offsets. */");
	offset("#define SC32_FPREGS     ", struct sigcontext32, sc_fpregs);
	offset("#define SC32_FPC_CSR    ", struct sigcontext32, sc_fpc_csr);
	offset("#define SC32_FPC_EIR    ", struct sigcontext32, sc_fpc_eir);
	linefeed;
}
#endif

void output_signal_defined(void)
{
	text("/* Linux signal numbers. */");
	constant("#define _SIGHUP     ", SIGHUP);
	constant("#define _SIGINT     ", SIGINT);
	constant("#define _SIGQUIT    ", SIGQUIT);
	constant("#define _SIGILL     ", SIGILL);
	constant("#define _SIGTRAP    ", SIGTRAP);
	constant("#define _SIGIOT     ", SIGIOT);
	constant("#define _SIGABRT    ", SIGABRT);
	constant("#define _SIGEMT     ", SIGEMT);
	constant("#define _SIGFPE     ", SIGFPE);
	constant("#define _SIGKILL    ", SIGKILL);
	constant("#define _SIGBUS     ", SIGBUS);
	constant("#define _SIGSEGV    ", SIGSEGV);
	constant("#define _SIGSYS     ", SIGSYS);
	constant("#define _SIGPIPE    ", SIGPIPE);
	constant("#define _SIGALRM    ", SIGALRM);
	constant("#define _SIGTERM    ", SIGTERM);
	constant("#define _SIGUSR1    ", SIGUSR1);
	constant("#define _SIGUSR2    ", SIGUSR2);
	constant("#define _SIGCHLD    ", SIGCHLD);
	constant("#define _SIGPWR     ", SIGPWR);
	constant("#define _SIGWINCH   ", SIGWINCH);
	constant("#define _SIGURG     ", SIGURG);
	constant("#define _SIGIO      ", SIGIO);
	constant("#define _SIGSTOP    ", SIGSTOP);
	constant("#define _SIGTSTP    ", SIGTSTP);
	constant("#define _SIGCONT    ", SIGCONT);
	constant("#define _SIGTTIN    ", SIGTTIN);
	constant("#define _SIGTTOU    ", SIGTTOU);
	constant("#define _SIGVTALRM  ", SIGVTALRM);
	constant("#define _SIGPROF    ", SIGPROF);
	constant("#define _SIGXCPU    ", SIGXCPU);
	constant("#define _SIGXFSZ    ", SIGXFSZ);
	linefeed;
}

void output_irq_cpustat_t_defines(void)
{
	text("/* Linux irq_cpustat_t offsets. */");
	offset("#define IC_SOFTIRQ_PENDING ", irq_cpustat_t, __softirq_pending);
	size("#define IC_IRQ_CPUSTAT_T   ", irq_cpustat_t);
	linefeed;
}