1*819833afSPeter Tyser /* 2*819833afSPeter Tyser * This file is subject to the terms and conditions of the GNU General Public 3*819833afSPeter Tyser * License. See the file "COPYING" in the main directory of this archive 4*819833afSPeter Tyser * for more details. 5*819833afSPeter Tyser * 6*819833afSPeter Tyser * Copyright (C) 1994 Waldorf GMBH 7*819833afSPeter Tyser * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003 Ralf Baechle 8*819833afSPeter Tyser * Copyright (C) 1996 Paul M. Antoine 9*819833afSPeter Tyser * Copyright (C) 1999, 2000 Silicon Graphics, Inc. 10*819833afSPeter Tyser */ 11*819833afSPeter Tyser #ifndef _ASM_PROCESSOR_H 12*819833afSPeter Tyser #define _ASM_PROCESSOR_H 13*819833afSPeter Tyser 14*819833afSPeter Tyser #include <linux/config.h> 15*819833afSPeter Tyser 16*819833afSPeter Tyser #include <asm/isadep.h> 17*819833afSPeter Tyser 18*819833afSPeter Tyser #include <asm/cachectl.h> 19*819833afSPeter Tyser #include <asm/mipsregs.h> 20*819833afSPeter Tyser #include <asm/reg.h> 21*819833afSPeter Tyser #include <asm/system.h> 22*819833afSPeter Tyser 23*819833afSPeter Tyser /* 24*819833afSPeter Tyser * Return current * instruction pointer ("program counter"). 25*819833afSPeter Tyser */ 26*819833afSPeter Tyser #define current_text_addr() ({ __label__ _l; _l: &&_l;}) 27*819833afSPeter Tyser 28*819833afSPeter Tyser /* 29*819833afSPeter Tyser * System setup and hardware flags.. 30*819833afSPeter Tyser */ 31*819833afSPeter Tyser extern void (*cpu_wait)(void); 32*819833afSPeter Tyser 33*819833afSPeter Tyser extern unsigned int vced_count, vcei_count; 34*819833afSPeter Tyser 35*819833afSPeter Tyser #define NUM_FPU_REGS 32 36*819833afSPeter Tyser 37*819833afSPeter Tyser typedef __u64 fpureg_t; 38*819833afSPeter Tyser 39*819833afSPeter Tyser /* 40*819833afSPeter Tyser * It would be nice to add some more fields for emulator statistics, but there 41*819833afSPeter Tyser * are a number of fixed offsets in offset.h and elsewhere that would have to 42*819833afSPeter Tyser * be recalculated by hand. So the additional information will be private to 43*819833afSPeter Tyser * the FPU emulator for now. See asm-mips/fpu_emulator.h. 44*819833afSPeter Tyser */ 45*819833afSPeter Tyser 46*819833afSPeter Tyser struct mips_fpu_struct { 47*819833afSPeter Tyser fpureg_t fpr[NUM_FPU_REGS]; 48*819833afSPeter Tyser unsigned int fcr31; 49*819833afSPeter Tyser }; 50*819833afSPeter Tyser 51*819833afSPeter Tyser #define NUM_DSP_REGS 6 52*819833afSPeter Tyser 53*819833afSPeter Tyser typedef __u32 dspreg_t; 54*819833afSPeter Tyser 55*819833afSPeter Tyser struct mips_dsp_state { 56*819833afSPeter Tyser dspreg_t dspr[NUM_DSP_REGS]; 57*819833afSPeter Tyser unsigned int dspcontrol; 58*819833afSPeter Tyser }; 59*819833afSPeter Tyser 60*819833afSPeter Tyser typedef struct { 61*819833afSPeter Tyser unsigned long seg; 62*819833afSPeter Tyser } mm_segment_t; 63*819833afSPeter Tyser 64*819833afSPeter Tyser #define ARCH_MIN_TASKALIGN 8 65*819833afSPeter Tyser 66*819833afSPeter Tyser struct mips_abi; 67*819833afSPeter Tyser 68*819833afSPeter Tyser /* 69*819833afSPeter Tyser * If you change thread_struct remember to change the #defines below too! 70*819833afSPeter Tyser */ 71*819833afSPeter Tyser struct thread_struct { 72*819833afSPeter Tyser /* Saved main processor registers. */ 73*819833afSPeter Tyser unsigned long reg16; 74*819833afSPeter Tyser unsigned long reg17, reg18, reg19, reg20, reg21, reg22, reg23; 75*819833afSPeter Tyser unsigned long reg29, reg30, reg31; 76*819833afSPeter Tyser 77*819833afSPeter Tyser /* Saved cp0 stuff. */ 78*819833afSPeter Tyser unsigned long cp0_status; 79*819833afSPeter Tyser 80*819833afSPeter Tyser /* Saved fpu/fpu emulator stuff. */ 81*819833afSPeter Tyser struct mips_fpu_struct fpu; 82*819833afSPeter Tyser #ifdef CONFIG_MIPS_MT_FPAFF 83*819833afSPeter Tyser /* Emulated instruction count */ 84*819833afSPeter Tyser unsigned long emulated_fp; 85*819833afSPeter Tyser /* Saved per-thread scheduler affinity mask */ 86*819833afSPeter Tyser cpumask_t user_cpus_allowed; 87*819833afSPeter Tyser #endif /* CONFIG_MIPS_MT_FPAFF */ 88*819833afSPeter Tyser 89*819833afSPeter Tyser /* Saved state of the DSP ASE, if available. */ 90*819833afSPeter Tyser struct mips_dsp_state dsp; 91*819833afSPeter Tyser 92*819833afSPeter Tyser /* Other stuff associated with the thread. */ 93*819833afSPeter Tyser unsigned long cp0_badvaddr; /* Last user fault */ 94*819833afSPeter Tyser unsigned long cp0_baduaddr; /* Last kernel fault accessing USEG */ 95*819833afSPeter Tyser unsigned long error_code; 96*819833afSPeter Tyser unsigned long trap_no; 97*819833afSPeter Tyser unsigned long irix_trampoline; /* Wheee... */ 98*819833afSPeter Tyser unsigned long irix_oldctx; 99*819833afSPeter Tyser struct mips_abi *abi; 100*819833afSPeter Tyser }; 101*819833afSPeter Tyser 102*819833afSPeter Tyser struct task_struct; 103*819833afSPeter Tyser 104*819833afSPeter Tyser /* Free all resources held by a thread. */ 105*819833afSPeter Tyser #define release_thread(thread) do { } while(0) 106*819833afSPeter Tyser 107*819833afSPeter Tyser /* Prepare to copy thread state - unlazy all lazy status */ 108*819833afSPeter Tyser #define prepare_to_copy(tsk) do { } while (0) 109*819833afSPeter Tyser 110*819833afSPeter Tyser #define cpu_relax() barrier() 111*819833afSPeter Tyser 112*819833afSPeter Tyser /* 113*819833afSPeter Tyser * Return_address is a replacement for __builtin_return_address(count) 114*819833afSPeter Tyser * which on certain architectures cannot reasonably be implemented in GCC 115*819833afSPeter Tyser * (MIPS, Alpha) or is unuseable with -fomit-frame-pointer (i386). 116*819833afSPeter Tyser * Note that __builtin_return_address(x>=1) is forbidden because GCC 117*819833afSPeter Tyser * aborts compilation on some CPUs. It's simply not possible to unwind 118*819833afSPeter Tyser * some CPU's stackframes. 119*819833afSPeter Tyser * 120*819833afSPeter Tyser * __builtin_return_address works only for non-leaf functions. We avoid the 121*819833afSPeter Tyser * overhead of a function call by forcing the compiler to save the return 122*819833afSPeter Tyser * address register on the stack. 123*819833afSPeter Tyser */ 124*819833afSPeter Tyser #define return_address() ({__asm__ __volatile__("":::"$31");__builtin_return_address(0);}) 125*819833afSPeter Tyser 126*819833afSPeter Tyser #ifdef CONFIG_CPU_HAS_PREFETCH 127*819833afSPeter Tyser 128*819833afSPeter Tyser #define ARCH_HAS_PREFETCH 129*819833afSPeter Tyser 130*819833afSPeter Tyser static inline void prefetch(const void *addr) 131*819833afSPeter Tyser { 132*819833afSPeter Tyser __asm__ __volatile__( 133*819833afSPeter Tyser " .set mips4 \n" 134*819833afSPeter Tyser " pref %0, (%1) \n" 135*819833afSPeter Tyser " .set mips0 \n" 136*819833afSPeter Tyser : 137*819833afSPeter Tyser : "i" (Pref_Load), "r" (addr)); 138*819833afSPeter Tyser } 139*819833afSPeter Tyser 140*819833afSPeter Tyser #endif 141*819833afSPeter Tyser 142*819833afSPeter Tyser #endif /* _ASM_PROCESSOR_H */ 143