Loading...
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 72 73 74 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 101 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 | /* * include/asm-mips/processor.h * * Copyright (C) 1994 Waldorf Electronics * written by Ralf Baechle */ #ifndef __ASM_MIPS_PROCESSOR_H #define __ASM_MIPS_PROCESSOR_H #if !defined (__ASSEMBLY__) #include <asm/system.h> /* * System setup and hardware bug flags.. */ extern char wait_available; /* only available on R4[26]00 */ extern unsigned long intr_count; extern unsigned long event; #if defined (__R4000__) #define start_bh_atomic() \ __asm__ __volatile__( \ ".set\tnoreorder\n\t" \ ".set\tnoat\n\t" \ "ll\t$1,(%0)\n" \ "1:\taddiu\t$1,$1,1\n\t" \ "sc\t$1,(%0)\n\t" \ "beqzl\t$1,1b\n\t" \ "ll\t$1,(%0)\n\t" \ ".set\tat\n\t" \ ".set\treorder" \ : /* no outputs */ \ : "r" (&intr_count)); #define end_bh_atomic() \ __asm__ __volatile__( \ ".set\tnoreorder\n\t" \ ".set\tnoat\n\t" \ "ll\t$1,(%0)\n" \ "1:\tsubu\t$1,$1,1\n\t" \ "sc\t$1,(%0)\n\t" \ "beqzl\t$1,1b\n\t" \ "ll\t$1,(%0)\n\t" \ ".set\tat\n\t" \ ".set\treorder" \ : /* no outputs */ \ : "r" (&intr_count)); #else /* !defined (__R4000__) */ #define start_bh_atomic() \ {int flags; save_flags(flags); cli(); intr_count++; restore_flags(flags)} #define end_bh_atomic() \ {int flags; save_flags(flags); cli(); intr_count--; restore_flags(flags)} #endif /* * Bus types (default is ISA, but people can check others with these..) * MCA_bus hardcoded to 0 for now. * * This needs to be extended since MIPS systems are being delivered with * numerous different types of bus systems. */ extern int EISA_bus; #define MCA_bus 0 #define MCA_bus__is_a_macro /* for versions in ksyms.c */ /* * MIPS has no problems with write protection */ #define wp_works_ok 1 #define wp_works_ok__is_a_macro /* for versions in ksyms.c */ /* * User space process size: 2GB. This is hardcoded into a few places, * so don't change it unless you know what you are doing. */ #define TASK_SIZE (0x80000000UL) /* * Size of io_bitmap in longwords: 32 is ports 0-0x3ff. */ #define IO_BITMAP_SIZE 32 #define NUM_FPU_REGS 32 struct mips_fpu_hard_struct { double fp_regs[NUM_FPU_REGS]; unsigned int control; }; /* * FIXME: no fpu emulator yet (but who cares anyway?) */ struct mips_fpu_soft_struct { long dummy; }; union mips_fpu_union { struct mips_fpu_hard_struct hard; struct mips_fpu_soft_struct soft; }; #define INIT_FPU { \ 0, \ } /* * If you change thread_struct remember to change the #defines below too! */ struct thread_struct { /* * saved main processor registers */ unsigned long reg16, reg17, reg18, reg19, reg20, reg21, reg22, reg23; unsigned long reg28, reg29, reg30, reg31; /* * saved cp0 stuff */ unsigned long cp0_status; /* * saved fpu/fpu emulator stuff */ union mips_fpu_union fpu; /* * Other stuff associated with the process */ unsigned long cp0_badvaddr; unsigned long error_code; unsigned long trap_no; unsigned long ksp; /* Top of kernel stack */ unsigned long fs; /* "Segment" pointer */ unsigned long pg_dir; /* L1 page table pointer */ }; #endif /* !defined (__ASSEMBLY__) */ /* * If you change the #defines remember to change thread_struct above too! */ #define TOFF_REG16 0 #define TOFF_REG17 (TOFF_REG16+4) #define TOFF_REG18 (TOFF_REG17+4) #define TOFF_REG19 (TOFF_REG18+4) #define TOFF_REG20 (TOFF_REG19+4) #define TOFF_REG21 (TOFF_REG20+4) #define TOFF_REG22 (TOFF_REG21+4) #define TOFF_REG23 (TOFF_REG22+4) #define TOFF_REG28 (TOFF_REG23+4) #define TOFF_REG29 (TOFF_REG28+4) #define TOFF_REG30 (TOFF_REG29+4) #define TOFF_REG31 (TOFF_REG30+4) #define TOFF_CP0_STATUS (TOFF_REG31+4) /* * Pad for 8 byte boundary! */ #define TOFF_FPU (((TOFF_CP0_STATUS+4)+(8-1))&~(8-1)) #define TOFF_CP0_BADVADDR (TOFF_FPU+264) #define TOFF_ERROR_CODE (TOFF_CP0_BADVADDR+4) #define TOFF_TRAP_NO (TOFF_ERROR_CODE+4) #define TOFF_KSP (TOFF_TRAP_NO+4) #define TOFF_FS (TOFF_KSP+4) #define TOFF_PG_DIR (TOFF_FS+4) #if !defined (__ASSEMBLY__) #define INIT_TSS { \ /* \ * saved main processor registers \ */ \ 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, \ /* \ * saved cp0 stuff \ */ \ 0, \ /* \ * saved fpu/fpu emulator stuff \ */ \ INIT_FPU, \ /* \ * Other stuff associated with the process\ */ \ 0, 0, 0, (((unsigned long)init_kernel_stack)+4096-8), \ KERNEL_DS, (unsigned long) swapper_pg_dir \ } #ifdef __KERNEL__ /* * switch_to(n) should switch tasks to task nr n, first * checking that n isn't the current task, in which case it does nothing. */ asmlinkage void resume(struct task_struct *tsk, int offset); #define switch_to(n) \ resume(n, ((int)(&((struct task_struct *)0)->tss))) /* * Does the process account for user or for system time? */ #if defined (__R4000__) #define USES_USER_TIME(regs) (!((regs)->cp0_status & 0x18)) #else /* !defined (__R4000__) */ #error "#define USES_USER_TIME(regs)!" #endif /* !defined (__R4000__) */ #endif /* __KERNEL__ */ #endif /* !defined (__ASSEMBLY__) */ #endif /* __ASM_MIPS_PROCESSOR_H */ |