Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

sparc64: Move trap_block[] definitions into a new header file.

Later we're going to want to get at these definitions from
asm/percpu.h and that's not possible via cpudata.h because
of the set of dependencies the non-trap_block[] stuff has.

Signed-off-by: David S. Miller <davem@davemloft.net>

+208 -196
+1 -196
arch/sparc/include/asm/cpudata_64.h
··· 6 6 #ifndef _SPARC64_CPUDATA_H 7 7 #define _SPARC64_CPUDATA_H 8 8 9 - #include <asm/hypervisor.h> 10 - #include <asm/asi.h> 11 - 12 9 #ifndef __ASSEMBLY__ 13 10 14 11 #include <linux/percpu.h> ··· 35 38 #define cpu_data(__cpu) per_cpu(__cpu_data, (__cpu)) 36 39 #define local_cpu_data() __get_cpu_var(__cpu_data) 37 40 38 - /* Trap handling code needs to get at a few critical values upon 39 - * trap entry and to process TSB misses. These cannot be in the 40 - * per_cpu() area as we really need to lock them into the TLB and 41 - * thus make them part of the main kernel image. As a result we 42 - * try to make this as small as possible. 43 - * 44 - * This is padded out and aligned to 64-bytes to avoid false sharing 45 - * on SMP. 46 - */ 47 - 48 - /* If you modify the size of this structure, please update 49 - * TRAP_BLOCK_SZ_SHIFT below. 50 - */ 51 - struct thread_info; 52 - struct trap_per_cpu { 53 - /* D-cache line 1: Basic thread information, cpu and device mondo queues */ 54 - struct thread_info *thread; 55 - unsigned long pgd_paddr; 56 - unsigned long cpu_mondo_pa; 57 - unsigned long dev_mondo_pa; 58 - 59 - /* D-cache line 2: Error Mondo Queue and kernel buffer pointers */ 60 - unsigned long resum_mondo_pa; 61 - unsigned long resum_kernel_buf_pa; 62 - unsigned long nonresum_mondo_pa; 63 - unsigned long nonresum_kernel_buf_pa; 64 - 65 - /* Dcache lines 3, 4, 5, and 6: Hypervisor Fault Status */ 66 - struct hv_fault_status fault_info; 67 - 68 - /* Dcache line 7: Physical addresses of CPU send mondo block and CPU list. */ 69 - unsigned long cpu_mondo_block_pa; 70 - unsigned long cpu_list_pa; 71 - unsigned long tsb_huge; 72 - unsigned long tsb_huge_temp; 73 - 74 - /* Dcache line 8: IRQ work list, and keep trap_block a power-of-2 in size. */ 75 - unsigned long irq_worklist_pa; 76 - unsigned int cpu_mondo_qmask; 77 - unsigned int dev_mondo_qmask; 78 - unsigned int resum_qmask; 79 - unsigned int nonresum_qmask; 80 - unsigned long __unused; 81 - } __attribute__((aligned(64))); 82 - extern struct trap_per_cpu trap_block[NR_CPUS]; 83 - extern void init_cur_cpu_trap(struct thread_info *); 84 - extern void setup_tba(void); 85 - extern int ncpus_probed; 86 41 extern const struct seq_operations cpuinfo_op; 87 - 88 - extern unsigned long real_hard_smp_processor_id(void); 89 - 90 - struct cpuid_patch_entry { 91 - unsigned int addr; 92 - unsigned int cheetah_safari[4]; 93 - unsigned int cheetah_jbus[4]; 94 - unsigned int starfire[4]; 95 - unsigned int sun4v[4]; 96 - }; 97 - extern struct cpuid_patch_entry __cpuid_patch, __cpuid_patch_end; 98 - 99 - struct sun4v_1insn_patch_entry { 100 - unsigned int addr; 101 - unsigned int insn; 102 - }; 103 - extern struct sun4v_1insn_patch_entry __sun4v_1insn_patch, 104 - __sun4v_1insn_patch_end; 105 - 106 - struct sun4v_2insn_patch_entry { 107 - unsigned int addr; 108 - unsigned int insns[2]; 109 - }; 110 - extern struct sun4v_2insn_patch_entry __sun4v_2insn_patch, 111 - __sun4v_2insn_patch_end; 112 42 113 43 #endif /* !(__ASSEMBLY__) */ 114 44 115 - #define TRAP_PER_CPU_THREAD 0x00 116 - #define TRAP_PER_CPU_PGD_PADDR 0x08 117 - #define TRAP_PER_CPU_CPU_MONDO_PA 0x10 118 - #define TRAP_PER_CPU_DEV_MONDO_PA 0x18 119 - #define TRAP_PER_CPU_RESUM_MONDO_PA 0x20 120 - #define TRAP_PER_CPU_RESUM_KBUF_PA 0x28 121 - #define TRAP_PER_CPU_NONRESUM_MONDO_PA 0x30 122 - #define TRAP_PER_CPU_NONRESUM_KBUF_PA 0x38 123 - #define TRAP_PER_CPU_FAULT_INFO 0x40 124 - #define TRAP_PER_CPU_CPU_MONDO_BLOCK_PA 0xc0 125 - #define TRAP_PER_CPU_CPU_LIST_PA 0xc8 126 - #define TRAP_PER_CPU_TSB_HUGE 0xd0 127 - #define TRAP_PER_CPU_TSB_HUGE_TEMP 0xd8 128 - #define TRAP_PER_CPU_IRQ_WORKLIST_PA 0xe0 129 - #define TRAP_PER_CPU_CPU_MONDO_QMASK 0xe8 130 - #define TRAP_PER_CPU_DEV_MONDO_QMASK 0xec 131 - #define TRAP_PER_CPU_RESUM_QMASK 0xf0 132 - #define TRAP_PER_CPU_NONRESUM_QMASK 0xf4 133 - 134 - #define TRAP_BLOCK_SZ_SHIFT 8 135 - 136 - #include <asm/scratchpad.h> 137 - 138 - #define __GET_CPUID(REG) \ 139 - /* Spitfire implementation (default). */ \ 140 - 661: ldxa [%g0] ASI_UPA_CONFIG, REG; \ 141 - srlx REG, 17, REG; \ 142 - and REG, 0x1f, REG; \ 143 - nop; \ 144 - .section .cpuid_patch, "ax"; \ 145 - /* Instruction location. */ \ 146 - .word 661b; \ 147 - /* Cheetah Safari implementation. */ \ 148 - ldxa [%g0] ASI_SAFARI_CONFIG, REG; \ 149 - srlx REG, 17, REG; \ 150 - and REG, 0x3ff, REG; \ 151 - nop; \ 152 - /* Cheetah JBUS implementation. */ \ 153 - ldxa [%g0] ASI_JBUS_CONFIG, REG; \ 154 - srlx REG, 17, REG; \ 155 - and REG, 0x1f, REG; \ 156 - nop; \ 157 - /* Starfire implementation. */ \ 158 - sethi %hi(0x1fff40000d0 >> 9), REG; \ 159 - sllx REG, 9, REG; \ 160 - or REG, 0xd0, REG; \ 161 - lduwa [REG] ASI_PHYS_BYPASS_EC_E, REG;\ 162 - /* sun4v implementation. */ \ 163 - mov SCRATCHPAD_CPUID, REG; \ 164 - ldxa [REG] ASI_SCRATCHPAD, REG; \ 165 - nop; \ 166 - nop; \ 167 - .previous; 168 - 169 - #ifdef CONFIG_SMP 170 - 171 - #define TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 172 - __GET_CPUID(TMP) \ 173 - sethi %hi(trap_block), DEST; \ 174 - sllx TMP, TRAP_BLOCK_SZ_SHIFT, TMP; \ 175 - or DEST, %lo(trap_block), DEST; \ 176 - add DEST, TMP, DEST; \ 177 - 178 - /* Clobbers TMP, current address space PGD phys address into DEST. */ 179 - #define TRAP_LOAD_PGD_PHYS(DEST, TMP) \ 180 - TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 181 - ldx [DEST + TRAP_PER_CPU_PGD_PADDR], DEST; 182 - 183 - /* Clobbers TMP, loads local processor's IRQ work area into DEST. */ 184 - #define TRAP_LOAD_IRQ_WORK_PA(DEST, TMP) \ 185 - TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 186 - add DEST, TRAP_PER_CPU_IRQ_WORKLIST_PA, DEST; 187 - 188 - /* Clobbers TMP, loads DEST with current thread info pointer. */ 189 - #define TRAP_LOAD_THREAD_REG(DEST, TMP) \ 190 - TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 191 - ldx [DEST + TRAP_PER_CPU_THREAD], DEST; 192 - 193 - /* Given the current thread info pointer in THR, load the per-cpu 194 - * area base of the current processor into DEST. REG1, REG2, and REG3 are 195 - * clobbered. 196 - * 197 - * You absolutely cannot use DEST as a temporary in this code. The 198 - * reason is that traps can happen during execution, and return from 199 - * trap will load the fully resolved DEST per-cpu base. This can corrupt 200 - * the calculations done by the macro mid-stream. 201 - */ 202 - #define LOAD_PER_CPU_BASE(DEST, THR, REG1, REG2, REG3) \ 203 - lduh [THR + TI_CPU], REG1; \ 204 - sethi %hi(__per_cpu_shift), REG3; \ 205 - sethi %hi(__per_cpu_base), REG2; \ 206 - ldx [REG3 + %lo(__per_cpu_shift)], REG3; \ 207 - ldx [REG2 + %lo(__per_cpu_base)], REG2; \ 208 - sllx REG1, REG3, REG3; \ 209 - add REG3, REG2, DEST; 210 - 211 - #else 212 - 213 - #define TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 214 - sethi %hi(trap_block), DEST; \ 215 - or DEST, %lo(trap_block), DEST; \ 216 - 217 - /* Uniprocessor versions, we know the cpuid is zero. */ 218 - #define TRAP_LOAD_PGD_PHYS(DEST, TMP) \ 219 - TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 220 - ldx [DEST + TRAP_PER_CPU_PGD_PADDR], DEST; 221 - 222 - /* Clobbers TMP, loads local processor's IRQ work area into DEST. */ 223 - #define TRAP_LOAD_IRQ_WORK_PA(DEST, TMP) \ 224 - TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 225 - add DEST, TRAP_PER_CPU_IRQ_WORKLIST_PA, DEST; 226 - 227 - #define TRAP_LOAD_THREAD_REG(DEST, TMP) \ 228 - TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 229 - ldx [DEST + TRAP_PER_CPU_THREAD], DEST; 230 - 231 - /* No per-cpu areas on uniprocessor, so no need to load DEST. */ 232 - #define LOAD_PER_CPU_BASE(DEST, THR, REG1, REG2, REG3) 233 - 234 - #endif /* !(CONFIG_SMP) */ 45 + #include <asm/trap_block.h> 235 46 236 47 #endif /* _SPARC64_CPUDATA_H */
+207
arch/sparc/include/asm/trap_block.h
··· 1 + #ifndef _SPARC_TRAP_BLOCK_H 2 + #define _SPARC_TRAP_BLOCK_H 3 + 4 + #include <asm/hypervisor.h> 5 + #include <asm/asi.h> 6 + 7 + #ifndef __ASSEMBLY__ 8 + 9 + /* Trap handling code needs to get at a few critical values upon 10 + * trap entry and to process TSB misses. These cannot be in the 11 + * per_cpu() area as we really need to lock them into the TLB and 12 + * thus make them part of the main kernel image. As a result we 13 + * try to make this as small as possible. 14 + * 15 + * This is padded out and aligned to 64-bytes to avoid false sharing 16 + * on SMP. 17 + */ 18 + 19 + /* If you modify the size of this structure, please update 20 + * TRAP_BLOCK_SZ_SHIFT below. 21 + */ 22 + struct thread_info; 23 + struct trap_per_cpu { 24 + /* D-cache line 1: Basic thread information, cpu and device mondo queues */ 25 + struct thread_info *thread; 26 + unsigned long pgd_paddr; 27 + unsigned long cpu_mondo_pa; 28 + unsigned long dev_mondo_pa; 29 + 30 + /* D-cache line 2: Error Mondo Queue and kernel buffer pointers */ 31 + unsigned long resum_mondo_pa; 32 + unsigned long resum_kernel_buf_pa; 33 + unsigned long nonresum_mondo_pa; 34 + unsigned long nonresum_kernel_buf_pa; 35 + 36 + /* Dcache lines 3, 4, 5, and 6: Hypervisor Fault Status */ 37 + struct hv_fault_status fault_info; 38 + 39 + /* Dcache line 7: Physical addresses of CPU send mondo block and CPU list. */ 40 + unsigned long cpu_mondo_block_pa; 41 + unsigned long cpu_list_pa; 42 + unsigned long tsb_huge; 43 + unsigned long tsb_huge_temp; 44 + 45 + /* Dcache line 8: IRQ work list, and keep trap_block a power-of-2 in size. */ 46 + unsigned long irq_worklist_pa; 47 + unsigned int cpu_mondo_qmask; 48 + unsigned int dev_mondo_qmask; 49 + unsigned int resum_qmask; 50 + unsigned int nonresum_qmask; 51 + unsigned long __unused; 52 + } __attribute__((aligned(64))); 53 + extern struct trap_per_cpu trap_block[NR_CPUS]; 54 + extern void init_cur_cpu_trap(struct thread_info *); 55 + extern void setup_tba(void); 56 + extern int ncpus_probed; 57 + 58 + extern unsigned long real_hard_smp_processor_id(void); 59 + 60 + struct cpuid_patch_entry { 61 + unsigned int addr; 62 + unsigned int cheetah_safari[4]; 63 + unsigned int cheetah_jbus[4]; 64 + unsigned int starfire[4]; 65 + unsigned int sun4v[4]; 66 + }; 67 + extern struct cpuid_patch_entry __cpuid_patch, __cpuid_patch_end; 68 + 69 + struct sun4v_1insn_patch_entry { 70 + unsigned int addr; 71 + unsigned int insn; 72 + }; 73 + extern struct sun4v_1insn_patch_entry __sun4v_1insn_patch, 74 + __sun4v_1insn_patch_end; 75 + 76 + struct sun4v_2insn_patch_entry { 77 + unsigned int addr; 78 + unsigned int insns[2]; 79 + }; 80 + extern struct sun4v_2insn_patch_entry __sun4v_2insn_patch, 81 + __sun4v_2insn_patch_end; 82 + 83 + 84 + #endif /* !(__ASSEMBLY__) */ 85 + 86 + #define TRAP_PER_CPU_THREAD 0x00 87 + #define TRAP_PER_CPU_PGD_PADDR 0x08 88 + #define TRAP_PER_CPU_CPU_MONDO_PA 0x10 89 + #define TRAP_PER_CPU_DEV_MONDO_PA 0x18 90 + #define TRAP_PER_CPU_RESUM_MONDO_PA 0x20 91 + #define TRAP_PER_CPU_RESUM_KBUF_PA 0x28 92 + #define TRAP_PER_CPU_NONRESUM_MONDO_PA 0x30 93 + #define TRAP_PER_CPU_NONRESUM_KBUF_PA 0x38 94 + #define TRAP_PER_CPU_FAULT_INFO 0x40 95 + #define TRAP_PER_CPU_CPU_MONDO_BLOCK_PA 0xc0 96 + #define TRAP_PER_CPU_CPU_LIST_PA 0xc8 97 + #define TRAP_PER_CPU_TSB_HUGE 0xd0 98 + #define TRAP_PER_CPU_TSB_HUGE_TEMP 0xd8 99 + #define TRAP_PER_CPU_IRQ_WORKLIST_PA 0xe0 100 + #define TRAP_PER_CPU_CPU_MONDO_QMASK 0xe8 101 + #define TRAP_PER_CPU_DEV_MONDO_QMASK 0xec 102 + #define TRAP_PER_CPU_RESUM_QMASK 0xf0 103 + #define TRAP_PER_CPU_NONRESUM_QMASK 0xf4 104 + 105 + #define TRAP_BLOCK_SZ_SHIFT 8 106 + 107 + #include <asm/scratchpad.h> 108 + 109 + #define __GET_CPUID(REG) \ 110 + /* Spitfire implementation (default). */ \ 111 + 661: ldxa [%g0] ASI_UPA_CONFIG, REG; \ 112 + srlx REG, 17, REG; \ 113 + and REG, 0x1f, REG; \ 114 + nop; \ 115 + .section .cpuid_patch, "ax"; \ 116 + /* Instruction location. */ \ 117 + .word 661b; \ 118 + /* Cheetah Safari implementation. */ \ 119 + ldxa [%g0] ASI_SAFARI_CONFIG, REG; \ 120 + srlx REG, 17, REG; \ 121 + and REG, 0x3ff, REG; \ 122 + nop; \ 123 + /* Cheetah JBUS implementation. */ \ 124 + ldxa [%g0] ASI_JBUS_CONFIG, REG; \ 125 + srlx REG, 17, REG; \ 126 + and REG, 0x1f, REG; \ 127 + nop; \ 128 + /* Starfire implementation. */ \ 129 + sethi %hi(0x1fff40000d0 >> 9), REG; \ 130 + sllx REG, 9, REG; \ 131 + or REG, 0xd0, REG; \ 132 + lduwa [REG] ASI_PHYS_BYPASS_EC_E, REG;\ 133 + /* sun4v implementation. */ \ 134 + mov SCRATCHPAD_CPUID, REG; \ 135 + ldxa [REG] ASI_SCRATCHPAD, REG; \ 136 + nop; \ 137 + nop; \ 138 + .previous; 139 + 140 + #ifdef CONFIG_SMP 141 + 142 + #define TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 143 + __GET_CPUID(TMP) \ 144 + sethi %hi(trap_block), DEST; \ 145 + sllx TMP, TRAP_BLOCK_SZ_SHIFT, TMP; \ 146 + or DEST, %lo(trap_block), DEST; \ 147 + add DEST, TMP, DEST; \ 148 + 149 + /* Clobbers TMP, current address space PGD phys address into DEST. */ 150 + #define TRAP_LOAD_PGD_PHYS(DEST, TMP) \ 151 + TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 152 + ldx [DEST + TRAP_PER_CPU_PGD_PADDR], DEST; 153 + 154 + /* Clobbers TMP, loads local processor's IRQ work area into DEST. */ 155 + #define TRAP_LOAD_IRQ_WORK_PA(DEST, TMP) \ 156 + TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 157 + add DEST, TRAP_PER_CPU_IRQ_WORKLIST_PA, DEST; 158 + 159 + /* Clobbers TMP, loads DEST with current thread info pointer. */ 160 + #define TRAP_LOAD_THREAD_REG(DEST, TMP) \ 161 + TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 162 + ldx [DEST + TRAP_PER_CPU_THREAD], DEST; 163 + 164 + /* Given the current thread info pointer in THR, load the per-cpu 165 + * area base of the current processor into DEST. REG1, REG2, and REG3 are 166 + * clobbered. 167 + * 168 + * You absolutely cannot use DEST as a temporary in this code. The 169 + * reason is that traps can happen during execution, and return from 170 + * trap will load the fully resolved DEST per-cpu base. This can corrupt 171 + * the calculations done by the macro mid-stream. 172 + */ 173 + #define LOAD_PER_CPU_BASE(DEST, THR, REG1, REG2, REG3) \ 174 + lduh [THR + TI_CPU], REG1; \ 175 + sethi %hi(__per_cpu_shift), REG3; \ 176 + sethi %hi(__per_cpu_base), REG2; \ 177 + ldx [REG3 + %lo(__per_cpu_shift)], REG3; \ 178 + ldx [REG2 + %lo(__per_cpu_base)], REG2; \ 179 + sllx REG1, REG3, REG3; \ 180 + add REG3, REG2, DEST; 181 + 182 + #else 183 + 184 + #define TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 185 + sethi %hi(trap_block), DEST; \ 186 + or DEST, %lo(trap_block), DEST; \ 187 + 188 + /* Uniprocessor versions, we know the cpuid is zero. */ 189 + #define TRAP_LOAD_PGD_PHYS(DEST, TMP) \ 190 + TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 191 + ldx [DEST + TRAP_PER_CPU_PGD_PADDR], DEST; 192 + 193 + /* Clobbers TMP, loads local processor's IRQ work area into DEST. */ 194 + #define TRAP_LOAD_IRQ_WORK_PA(DEST, TMP) \ 195 + TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 196 + add DEST, TRAP_PER_CPU_IRQ_WORKLIST_PA, DEST; 197 + 198 + #define TRAP_LOAD_THREAD_REG(DEST, TMP) \ 199 + TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ 200 + ldx [DEST + TRAP_PER_CPU_THREAD], DEST; 201 + 202 + /* No per-cpu areas on uniprocessor, so no need to load DEST. */ 203 + #define LOAD_PER_CPU_BASE(DEST, THR, REG1, REG2, REG3) 204 + 205 + #endif /* !(CONFIG_SMP) */ 206 + 207 + #endif /* _SPARC_TRAP_BLOCK_H */