| /* |
| * offset.c: Calculate task_struct offsets. |
| * |
| * Copyright (C) 1996 David S. Miller |
| * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 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. |
| * |
| * Amir Bhor : Modified for ARC defines |
| */ |
| #include <linux/types.h> |
| #include <linux/sched.h> |
| #include <linux/mm.h> |
| |
| #include <asm/ptrace.h> |
| #include <asm/processor.h> |
| #include <asm/irq.h> |
| #include <asm/hardirq.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" : : "i" (member)) |
| #define size(string, size) \ |
| __asm__("\n@@@" string "%0" : : "i" (sizeof(size))) |
| #define linefeed text("") |
| |
| text("/* DO NOT TOUCH, AUTOGENERATED BY OFFSET.C */"); |
| linefeed; |
| text("#ifndef _ASM_ARC_OFFSET_H"); |
| text("#define _ASM_ARC_OFFSET_H"); |
| linefeed; |
| |
| void output_task_defines(void) |
| { |
| text("/* ARC task_struct offsets. */"); |
| offset("#define TASK_STATE ", struct task_struct, state); |
| offset("#define TASK_FLAGS ", struct task_struct, flags); |
| offset("#define TASK_SIGPENDING ", struct task_struct, sigpending); |
| offset("#define TASK_NEED_RESCHED ", struct task_struct, need_resched); |
| offset("#define TASK_PTRACE ", struct task_struct, ptrace); |
| offset("#define TASK_THREAD ", struct task_struct, thread); |
| offset("#define TASK_COUNTER ", struct task_struct, counter); |
| offset("#define TASK_NICE ", struct task_struct, nice); |
| offset("#define TASK_MM ", struct task_struct, mm); |
| offset("#define TASK_PROCESSOR ", struct task_struct, processor); |
| offset("#define TASK_PID ", struct task_struct, pid); |
| size( "#define TASK_STRUCT_SIZE ", struct task_struct); |
| |
| text("/* ARC cpuinfo struct offset. */"); |
| offset("#define CPUINFO_PROCID ", struct cpuinfo_arc, processor_id); |
| offset("#define CPUINFO_PROCVER ", struct cpuinfo_arc, processor_version); |
| |
| linefeed; |
| } |
| |
| void output_thread_defines(void) |
| { |
| text("/* ARC specific thread_struct offsets. */"); |
| offset("#define THREAD_KSP ", struct thread_struct, ksp); |
| offset("#define THREAD_USP ", struct thread_struct, usp); |
| offset("#define THREAD_PC ", struct thread_struct, pc); |
| linefeed; |
| } |
| |
| void output_cpustat_define(void) |
| { |
| text("/* ARC irq_cpustat_t offsets. */"); |
| offset("#define CPUSTAT_LOCAL_IRQ_COUNT ", irq_cpustat_t, \ |
| __local_irq_count); |
| offset("#define CPUSTAT_SOFTIRQ_PENDING ", irq_cpustat_t, \ |
| __softirq_pending); |
| linefeed; |
| } |
| text("#endif /* !(_ASM_ARC_OFFSET_H) */"); |