2005-04-16 15:20:36 -07:00
/*
* This program is used to generate definitions needed by
* assembly language modules .
*
* We use the technique used in the OSF Mach kernel code :
* generate asm statements containing # defines ,
* compile this file to assembler , and then extract the
* # defines from the assembly - language output .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
# include <linux/config.h>
# include <linux/signal.h>
# include <linux/sched.h>
# include <linux/kernel.h>
# include <linux/errno.h>
# include <linux/string.h>
# include <linux/types.h>
# include <linux/mman.h>
# include <linux/mm.h>
# include <linux/time.h>
# include <linux/hardirq.h>
# include <asm/io.h>
# include <asm/page.h>
# include <asm/pgtable.h>
# include <asm/processor.h>
# include <asm/paca.h>
# include <asm/lppaca.h>
2005-11-02 12:08:31 +11:00
# include <asm/iseries/hv_lp_event.h>
2005-04-16 15:20:36 -07:00
# include <asm/rtas.h>
# include <asm/cputable.h>
# include <asm/cache.h>
# include <asm/systemcfg.h>
# include <asm/compat.h>
# define DEFINE(sym, val) \
asm volatile ( " \n -> " # sym " %0 " # val : : " i " ( val ) )
# define BLANK() asm volatile("\n->" : : )
int main ( void )
{
/* thread struct on stack */
DEFINE ( TI_FLAGS , offsetof ( struct thread_info , flags ) ) ;
DEFINE ( TI_PREEMPT , offsetof ( struct thread_info , preempt_count ) ) ;
DEFINE ( TI_SC_NOERR , offsetof ( struct thread_info , syscall_noerror ) ) ;
/* task_struct->thread */
DEFINE ( THREAD , offsetof ( struct task_struct , thread ) ) ;
DEFINE ( PT_REGS , offsetof ( struct thread_struct , regs ) ) ;
DEFINE ( THREAD_FPEXC_MODE , offsetof ( struct thread_struct , fpexc_mode ) ) ;
DEFINE ( THREAD_FPR0 , offsetof ( struct thread_struct , fpr [ 0 ] ) ) ;
DEFINE ( THREAD_FPSCR , offsetof ( struct thread_struct , fpscr ) ) ;
DEFINE ( KSP , offsetof ( struct thread_struct , ksp ) ) ;
DEFINE ( KSP_VSID , offsetof ( struct thread_struct , ksp_vsid ) ) ;
# ifdef CONFIG_ALTIVEC
DEFINE ( THREAD_VR0 , offsetof ( struct thread_struct , vr [ 0 ] ) ) ;
DEFINE ( THREAD_VRSAVE , offsetof ( struct thread_struct , vrsave ) ) ;
DEFINE ( THREAD_VSCR , offsetof ( struct thread_struct , vscr ) ) ;
DEFINE ( THREAD_USED_VR , offsetof ( struct thread_struct , used_vr ) ) ;
# endif /* CONFIG_ALTIVEC */
DEFINE ( MM , offsetof ( struct task_struct , mm ) ) ;
2005-08-27 10:23:46 +01:00
DEFINE ( AUDITCONTEXT , offsetof ( struct task_struct , audit_context ) ) ;
2005-04-16 15:20:36 -07:00
DEFINE ( DCACHEL1LINESIZE , offsetof ( struct ppc64_caches , dline_size ) ) ;
DEFINE ( DCACHEL1LOGLINESIZE , offsetof ( struct ppc64_caches , log_dline_size ) ) ;
DEFINE ( DCACHEL1LINESPERPAGE , offsetof ( struct ppc64_caches , dlines_per_page ) ) ;
DEFINE ( ICACHEL1LINESIZE , offsetof ( struct ppc64_caches , iline_size ) ) ;
DEFINE ( ICACHEL1LOGLINESIZE , offsetof ( struct ppc64_caches , log_iline_size ) ) ;
DEFINE ( ICACHEL1LINESPERPAGE , offsetof ( struct ppc64_caches , ilines_per_page ) ) ;
DEFINE ( PLATFORM , offsetof ( struct systemcfg , platform ) ) ;
2005-10-10 22:50:37 +10:00
DEFINE ( PLATFORM_LPAR , PLATFORM_LPAR ) ;
2005-04-16 15:20:36 -07:00
/* paca */
DEFINE ( PACA_SIZE , sizeof ( struct paca_struct ) ) ;
DEFINE ( PACAPACAINDEX , offsetof ( struct paca_struct , paca_index ) ) ;
DEFINE ( PACAPROCSTART , offsetof ( struct paca_struct , cpu_start ) ) ;
DEFINE ( PACAKSAVE , offsetof ( struct paca_struct , kstack ) ) ;
DEFINE ( PACACURRENT , offsetof ( struct paca_struct , __current ) ) ;
DEFINE ( PACASAVEDMSR , offsetof ( struct paca_struct , saved_msr ) ) ;
DEFINE ( PACASTABREAL , offsetof ( struct paca_struct , stab_real ) ) ;
DEFINE ( PACASTABVIRT , offsetof ( struct paca_struct , stab_addr ) ) ;
DEFINE ( PACASTABRR , offsetof ( struct paca_struct , stab_rr ) ) ;
DEFINE ( PACAR1 , offsetof ( struct paca_struct , saved_r1 ) ) ;
DEFINE ( PACATOC , offsetof ( struct paca_struct , kernel_toc ) ) ;
DEFINE ( PACAPROCENABLED , offsetof ( struct paca_struct , proc_enabled ) ) ;
DEFINE ( PACASLBCACHE , offsetof ( struct paca_struct , slb_cache ) ) ;
DEFINE ( PACASLBCACHEPTR , offsetof ( struct paca_struct , slb_cache_ptr ) ) ;
DEFINE ( PACACONTEXTID , offsetof ( struct paca_struct , context . id ) ) ;
# ifdef CONFIG_HUGETLB_PAGE
2005-08-11 16:55:21 +10:00
DEFINE ( PACALOWHTLBAREAS , offsetof ( struct paca_struct , context . low_htlb_areas ) ) ;
DEFINE ( PACAHIGHHTLBAREAS , offsetof ( struct paca_struct , context . high_htlb_areas ) ) ;
2005-04-16 15:20:36 -07:00
# endif /* CONFIG_HUGETLB_PAGE */
DEFINE ( PACADEFAULTDECR , offsetof ( struct paca_struct , default_decr ) ) ;
DEFINE ( PACA_EXGEN , offsetof ( struct paca_struct , exgen ) ) ;
DEFINE ( PACA_EXMC , offsetof ( struct paca_struct , exmc ) ) ;
DEFINE ( PACA_EXSLB , offsetof ( struct paca_struct , exslb ) ) ;
DEFINE ( PACA_EXDSI , offsetof ( struct paca_struct , exdsi ) ) ;
DEFINE ( PACAEMERGSP , offsetof ( struct paca_struct , emergency_sp ) ) ;
DEFINE ( PACALPPACA , offsetof ( struct paca_struct , lppaca ) ) ;
DEFINE ( PACAHWCPUID , offsetof ( struct paca_struct , hw_cpu_id ) ) ;
DEFINE ( LPPACASRR0 , offsetof ( struct lppaca , saved_srr0 ) ) ;
DEFINE ( LPPACASRR1 , offsetof ( struct lppaca , saved_srr1 ) ) ;
DEFINE ( LPPACAANYINT , offsetof ( struct lppaca , int_dword . any_int ) ) ;
DEFINE ( LPPACADECRINT , offsetof ( struct lppaca , int_dword . fields . decr_int ) ) ;
/* RTAS */
DEFINE ( RTASBASE , offsetof ( struct rtas_t , base ) ) ;
DEFINE ( RTASENTRY , offsetof ( struct rtas_t , entry ) ) ;
/* Interrupt register frame */
DEFINE ( STACK_FRAME_OVERHEAD , STACK_FRAME_OVERHEAD ) ;
DEFINE ( SWITCH_FRAME_SIZE , STACK_FRAME_OVERHEAD + sizeof ( struct pt_regs ) ) ;
/* 288 = # of volatile regs, int & fp, for leaf routines */
/* which do not stack a frame. See the PPC64 ABI. */
DEFINE ( INT_FRAME_SIZE , STACK_FRAME_OVERHEAD + sizeof ( struct pt_regs ) + 288 ) ;
/* Create extra stack space for SRR0 and SRR1 when calling prom/rtas. */
DEFINE ( PROM_FRAME_SIZE , STACK_FRAME_OVERHEAD + sizeof ( struct pt_regs ) + 16 ) ;
DEFINE ( RTAS_FRAME_SIZE , STACK_FRAME_OVERHEAD + sizeof ( struct pt_regs ) + 16 ) ;
DEFINE ( GPR0 , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , gpr [ 0 ] ) ) ;
DEFINE ( GPR1 , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , gpr [ 1 ] ) ) ;
DEFINE ( GPR2 , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , gpr [ 2 ] ) ) ;
DEFINE ( GPR3 , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , gpr [ 3 ] ) ) ;
DEFINE ( GPR4 , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , gpr [ 4 ] ) ) ;
DEFINE ( GPR5 , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , gpr [ 5 ] ) ) ;
DEFINE ( GPR6 , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , gpr [ 6 ] ) ) ;
DEFINE ( GPR7 , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , gpr [ 7 ] ) ) ;
DEFINE ( GPR8 , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , gpr [ 8 ] ) ) ;
DEFINE ( GPR9 , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , gpr [ 9 ] ) ) ;
DEFINE ( GPR10 , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , gpr [ 10 ] ) ) ;
DEFINE ( GPR11 , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , gpr [ 11 ] ) ) ;
DEFINE ( GPR12 , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , gpr [ 12 ] ) ) ;
DEFINE ( GPR13 , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , gpr [ 13 ] ) ) ;
/*
* Note : these symbols include _ because they overlap with special
* register names
*/
DEFINE ( _NIP , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , nip ) ) ;
DEFINE ( _MSR , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , msr ) ) ;
DEFINE ( _CTR , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , ctr ) ) ;
DEFINE ( _LINK , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , link ) ) ;
DEFINE ( _CCR , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , ccr ) ) ;
DEFINE ( _XER , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , xer ) ) ;
DEFINE ( _DAR , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , dar ) ) ;
DEFINE ( _DSISR , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , dsisr ) ) ;
DEFINE ( ORIG_GPR3 , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , orig_gpr3 ) ) ;
DEFINE ( RESULT , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , result ) ) ;
DEFINE ( _TRAP , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , trap ) ) ;
DEFINE ( SOFTE , STACK_FRAME_OVERHEAD + offsetof ( struct pt_regs , softe ) ) ;
/* These _only_ to be used with {PROM,RTAS}_FRAME_SIZE!!! */
DEFINE ( _SRR0 , STACK_FRAME_OVERHEAD + sizeof ( struct pt_regs ) ) ;
DEFINE ( _SRR1 , STACK_FRAME_OVERHEAD + sizeof ( struct pt_regs ) + 8 ) ;
DEFINE ( CLONE_VM , CLONE_VM ) ;
DEFINE ( CLONE_UNTRACED , CLONE_UNTRACED ) ;
/* About the CPU features table */
DEFINE ( CPU_SPEC_ENTRY_SIZE , sizeof ( struct cpu_spec ) ) ;
DEFINE ( CPU_SPEC_PVR_MASK , offsetof ( struct cpu_spec , pvr_mask ) ) ;
DEFINE ( CPU_SPEC_PVR_VALUE , offsetof ( struct cpu_spec , pvr_value ) ) ;
DEFINE ( CPU_SPEC_FEATURES , offsetof ( struct cpu_spec , cpu_features ) ) ;
DEFINE ( CPU_SPEC_SETUP , offsetof ( struct cpu_spec , cpu_setup ) ) ;
/* systemcfg offsets for use by vdso */
DEFINE ( CFG_TB_ORIG_STAMP , offsetof ( struct systemcfg , tb_orig_stamp ) ) ;
DEFINE ( CFG_TB_TICKS_PER_SEC , offsetof ( struct systemcfg , tb_ticks_per_sec ) ) ;
DEFINE ( CFG_TB_TO_XS , offsetof ( struct systemcfg , tb_to_xs ) ) ;
DEFINE ( CFG_STAMP_XSEC , offsetof ( struct systemcfg , stamp_xsec ) ) ;
DEFINE ( CFG_TB_UPDATE_COUNT , offsetof ( struct systemcfg , tb_update_count ) ) ;
DEFINE ( CFG_TZ_MINUTEWEST , offsetof ( struct systemcfg , tz_minuteswest ) ) ;
DEFINE ( CFG_TZ_DSTTIME , offsetof ( struct systemcfg , tz_dsttime ) ) ;
DEFINE ( CFG_SYSCALL_MAP32 , offsetof ( struct systemcfg , syscall_map_32 ) ) ;
DEFINE ( CFG_SYSCALL_MAP64 , offsetof ( struct systemcfg , syscall_map_64 ) ) ;
/* timeval/timezone offsets for use by vdso */
DEFINE ( TVAL64_TV_SEC , offsetof ( struct timeval , tv_sec ) ) ;
DEFINE ( TVAL64_TV_USEC , offsetof ( struct timeval , tv_usec ) ) ;
DEFINE ( TVAL32_TV_SEC , offsetof ( struct compat_timeval , tv_sec ) ) ;
DEFINE ( TVAL32_TV_USEC , offsetof ( struct compat_timeval , tv_usec ) ) ;
DEFINE ( TZONE_TZ_MINWEST , offsetof ( struct timezone , tz_minuteswest ) ) ;
DEFINE ( TZONE_TZ_DSTTIME , offsetof ( struct timezone , tz_dsttime ) ) ;
return 0 ;
}