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

MIPS: Move Cause.ExcCode trap codes to mipsregs.h

Move the Cause.ExcCode trap code definitions from kvm_host.h to
mipsregs.h, since they describe architectural bits rather than KVM
specific constants, and change the prefix from T_ to EXCCODE_.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Gleb Natapov <gleb@kernel.org>
Cc: linux-mips@linux-mips.org
Cc: kvm@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/11891/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

authored by

James Hogan and committed by
Ralf Baechle
16d100db 2db9d233

+80 -83
-28
arch/mips/include/asm/kvm_host.h
··· 281 281 MMU_TYPE_R8000 282 282 }; 283 283 284 - /* 285 - * Trap codes 286 - */ 287 - #define T_INT 0 /* Interrupt pending */ 288 - #define T_TLB_MOD 1 /* TLB modified fault */ 289 - #define T_TLB_LD_MISS 2 /* TLB miss on load or ifetch */ 290 - #define T_TLB_ST_MISS 3 /* TLB miss on a store */ 291 - #define T_ADDR_ERR_LD 4 /* Address error on a load or ifetch */ 292 - #define T_ADDR_ERR_ST 5 /* Address error on a store */ 293 - #define T_BUS_ERR_IFETCH 6 /* Bus error on an ifetch */ 294 - #define T_BUS_ERR_LD_ST 7 /* Bus error on a load or store */ 295 - #define T_SYSCALL 8 /* System call */ 296 - #define T_BREAK 9 /* Breakpoint */ 297 - #define T_RES_INST 10 /* Reserved instruction exception */ 298 - #define T_COP_UNUSABLE 11 /* Coprocessor unusable */ 299 - #define T_OVFLOW 12 /* Arithmetic overflow */ 300 - 301 - /* 302 - * Trap definitions added for r4000 port. 303 - */ 304 - #define T_TRAP 13 /* Trap instruction */ 305 - #define T_VCEI 14 /* Virtual coherency exception */ 306 - #define T_MSAFPE 14 /* MSA floating point exception */ 307 - #define T_FPE 15 /* Floating point exception */ 308 - #define T_MSADIS 21 /* MSA disabled exception */ 309 - #define T_WATCH 23 /* Watch address reference */ 310 - #define T_VCED 31 /* Virtual coherency data */ 311 - 312 284 /* Resume Flags */ 313 285 #define RESUME_FLAG_DR (1<<0) /* Reload guest nonvolatile state? */ 314 286 #define RESUME_FLAG_HOST (1<<1) /* Resume host? */
+24
arch/mips/include/asm/mipsregs.h
··· 404 404 #define CAUSEF_BD (_ULCAST_(1) << 31) 405 405 406 406 /* 407 + * Cause.ExcCode trap codes. 408 + */ 409 + #define EXCCODE_INT 0 /* Interrupt pending */ 410 + #define EXCCODE_MOD 1 /* TLB modified fault */ 411 + #define EXCCODE_TLBL 2 /* TLB miss on load or ifetch */ 412 + #define EXCCODE_TLBS 3 /* TLB miss on a store */ 413 + #define EXCCODE_ADEL 4 /* Address error on a load or ifetch */ 414 + #define EXCCODE_ADES 5 /* Address error on a store */ 415 + #define EXCCODE_IBE 6 /* Bus error on an ifetch */ 416 + #define EXCCODE_DBE 7 /* Bus error on a load or store */ 417 + #define EXCCODE_SYS 8 /* System call */ 418 + #define EXCCODE_BP 9 /* Breakpoint */ 419 + #define EXCCODE_RI 10 /* Reserved instruction exception */ 420 + #define EXCCODE_CPU 11 /* Coprocessor unusable */ 421 + #define EXCCODE_OV 12 /* Arithmetic overflow */ 422 + #define EXCCODE_TR 13 /* Trap instruction */ 423 + #define EXCCODE_VCEI 14 /* Virtual coherency exception */ 424 + #define EXCCODE_MSAFPE 14 /* MSA floating point exception */ 425 + #define EXCCODE_FPE 15 /* Floating point exception */ 426 + #define EXCCODE_MSADIS 21 /* MSA disabled exception */ 427 + #define EXCCODE_WATCH 23 /* Watch address reference */ 428 + #define EXCCODE_VCED 31 /* Virtual coherency data */ 429 + 430 + /* 407 431 * Bits in the coprocessor 0 config register. 408 432 */ 409 433 /* Generic bits. */
+36 -35
arch/mips/kvm/emulate.c
··· 1780 1780 kvm_debug("Delivering SYSCALL @ pc %#lx\n", arch->pc); 1781 1781 1782 1782 kvm_change_c0_guest_cause(cop0, (0xff), 1783 - (T_SYSCALL << CAUSEB_EXCCODE)); 1783 + (EXCCODE_SYS << CAUSEB_EXCCODE)); 1784 1784 1785 1785 /* Set PC to the exception entry point */ 1786 1786 arch->pc = KVM_GUEST_KSEG0 + 0x180; ··· 1827 1827 } 1828 1828 1829 1829 kvm_change_c0_guest_cause(cop0, (0xff), 1830 - (T_TLB_LD_MISS << CAUSEB_EXCCODE)); 1830 + (EXCCODE_TLBL << CAUSEB_EXCCODE)); 1831 1831 1832 1832 /* setup badvaddr, context and entryhi registers for the guest */ 1833 1833 kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); ··· 1873 1873 } 1874 1874 1875 1875 kvm_change_c0_guest_cause(cop0, (0xff), 1876 - (T_TLB_LD_MISS << CAUSEB_EXCCODE)); 1876 + (EXCCODE_TLBL << CAUSEB_EXCCODE)); 1877 1877 1878 1878 /* setup badvaddr, context and entryhi registers for the guest */ 1879 1879 kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); ··· 1917 1917 } 1918 1918 1919 1919 kvm_change_c0_guest_cause(cop0, (0xff), 1920 - (T_TLB_ST_MISS << CAUSEB_EXCCODE)); 1920 + (EXCCODE_TLBS << CAUSEB_EXCCODE)); 1921 1921 1922 1922 /* setup badvaddr, context and entryhi registers for the guest */ 1923 1923 kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); ··· 1961 1961 } 1962 1962 1963 1963 kvm_change_c0_guest_cause(cop0, (0xff), 1964 - (T_TLB_ST_MISS << CAUSEB_EXCCODE)); 1964 + (EXCCODE_TLBS << CAUSEB_EXCCODE)); 1965 1965 1966 1966 /* setup badvaddr, context and entryhi registers for the guest */ 1967 1967 kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); ··· 2032 2032 arch->pc = KVM_GUEST_KSEG0 + 0x180; 2033 2033 } 2034 2034 2035 - kvm_change_c0_guest_cause(cop0, (0xff), (T_TLB_MOD << CAUSEB_EXCCODE)); 2035 + kvm_change_c0_guest_cause(cop0, (0xff), 2036 + (EXCCODE_MOD << CAUSEB_EXCCODE)); 2036 2037 2037 2038 /* setup badvaddr, context and entryhi registers for the guest */ 2038 2039 kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); ··· 2068 2067 arch->pc = KVM_GUEST_KSEG0 + 0x180; 2069 2068 2070 2069 kvm_change_c0_guest_cause(cop0, (0xff), 2071 - (T_COP_UNUSABLE << CAUSEB_EXCCODE)); 2070 + (EXCCODE_CPU << CAUSEB_EXCCODE)); 2072 2071 kvm_change_c0_guest_cause(cop0, (CAUSEF_CE), (0x1 << CAUSEB_CE)); 2073 2072 2074 2073 return EMULATE_DONE; ··· 2096 2095 kvm_debug("Delivering RI @ pc %#lx\n", arch->pc); 2097 2096 2098 2097 kvm_change_c0_guest_cause(cop0, (0xff), 2099 - (T_RES_INST << CAUSEB_EXCCODE)); 2098 + (EXCCODE_RI << CAUSEB_EXCCODE)); 2100 2099 2101 2100 /* Set PC to the exception entry point */ 2102 2101 arch->pc = KVM_GUEST_KSEG0 + 0x180; ··· 2131 2130 kvm_debug("Delivering BP @ pc %#lx\n", arch->pc); 2132 2131 2133 2132 kvm_change_c0_guest_cause(cop0, (0xff), 2134 - (T_BREAK << CAUSEB_EXCCODE)); 2133 + (EXCCODE_BP << CAUSEB_EXCCODE)); 2135 2134 2136 2135 /* Set PC to the exception entry point */ 2137 2136 arch->pc = KVM_GUEST_KSEG0 + 0x180; ··· 2166 2165 kvm_debug("Delivering TRAP @ pc %#lx\n", arch->pc); 2167 2166 2168 2167 kvm_change_c0_guest_cause(cop0, (0xff), 2169 - (T_TRAP << CAUSEB_EXCCODE)); 2168 + (EXCCODE_TR << CAUSEB_EXCCODE)); 2170 2169 2171 2170 /* Set PC to the exception entry point */ 2172 2171 arch->pc = KVM_GUEST_KSEG0 + 0x180; ··· 2201 2200 kvm_debug("Delivering MSAFPE @ pc %#lx\n", arch->pc); 2202 2201 2203 2202 kvm_change_c0_guest_cause(cop0, (0xff), 2204 - (T_MSAFPE << CAUSEB_EXCCODE)); 2203 + (EXCCODE_MSAFPE << CAUSEB_EXCCODE)); 2205 2204 2206 2205 /* Set PC to the exception entry point */ 2207 2206 arch->pc = KVM_GUEST_KSEG0 + 0x180; ··· 2236 2235 kvm_debug("Delivering FPE @ pc %#lx\n", arch->pc); 2237 2236 2238 2237 kvm_change_c0_guest_cause(cop0, (0xff), 2239 - (T_FPE << CAUSEB_EXCCODE)); 2238 + (EXCCODE_FPE << CAUSEB_EXCCODE)); 2240 2239 2241 2240 /* Set PC to the exception entry point */ 2242 2241 arch->pc = KVM_GUEST_KSEG0 + 0x180; ··· 2271 2270 kvm_debug("Delivering MSADIS @ pc %#lx\n", arch->pc); 2272 2271 2273 2272 kvm_change_c0_guest_cause(cop0, (0xff), 2274 - (T_MSADIS << CAUSEB_EXCCODE)); 2273 + (EXCCODE_MSADIS << CAUSEB_EXCCODE)); 2275 2274 2276 2275 /* Set PC to the exception entry point */ 2277 2276 arch->pc = KVM_GUEST_KSEG0 + 0x180; ··· 2480 2479 2481 2480 if (usermode) { 2482 2481 switch (exccode) { 2483 - case T_INT: 2484 - case T_SYSCALL: 2485 - case T_BREAK: 2486 - case T_RES_INST: 2487 - case T_TRAP: 2488 - case T_MSAFPE: 2489 - case T_FPE: 2490 - case T_MSADIS: 2482 + case EXCCODE_INT: 2483 + case EXCCODE_SYS: 2484 + case EXCCODE_BP: 2485 + case EXCCODE_RI: 2486 + case EXCCODE_TR: 2487 + case EXCCODE_MSAFPE: 2488 + case EXCCODE_FPE: 2489 + case EXCCODE_MSADIS: 2491 2490 break; 2492 2491 2493 - case T_COP_UNUSABLE: 2492 + case EXCCODE_CPU: 2494 2493 if (((cause & CAUSEF_CE) >> CAUSEB_CE) == 0) 2495 2494 er = EMULATE_PRIV_FAIL; 2496 2495 break; 2497 2496 2498 - case T_TLB_MOD: 2497 + case EXCCODE_MOD: 2499 2498 break; 2500 2499 2501 - case T_TLB_LD_MISS: 2500 + case EXCCODE_TLBL: 2502 2501 /* 2503 2502 * We we are accessing Guest kernel space, then send an 2504 2503 * address error exception to the guest ··· 2507 2506 kvm_debug("%s: LD MISS @ %#lx\n", __func__, 2508 2507 badvaddr); 2509 2508 cause &= ~0xff; 2510 - cause |= (T_ADDR_ERR_LD << CAUSEB_EXCCODE); 2509 + cause |= (EXCCODE_ADEL << CAUSEB_EXCCODE); 2511 2510 er = EMULATE_PRIV_FAIL; 2512 2511 } 2513 2512 break; 2514 2513 2515 - case T_TLB_ST_MISS: 2514 + case EXCCODE_TLBS: 2516 2515 /* 2517 2516 * We we are accessing Guest kernel space, then send an 2518 2517 * address error exception to the guest ··· 2521 2520 kvm_debug("%s: ST MISS @ %#lx\n", __func__, 2522 2521 badvaddr); 2523 2522 cause &= ~0xff; 2524 - cause |= (T_ADDR_ERR_ST << CAUSEB_EXCCODE); 2523 + cause |= (EXCCODE_ADES << CAUSEB_EXCCODE); 2525 2524 er = EMULATE_PRIV_FAIL; 2526 2525 } 2527 2526 break; 2528 2527 2529 - case T_ADDR_ERR_ST: 2528 + case EXCCODE_ADES: 2530 2529 kvm_debug("%s: address error ST @ %#lx\n", __func__, 2531 2530 badvaddr); 2532 2531 if ((badvaddr & PAGE_MASK) == KVM_GUEST_COMMPAGE_ADDR) { 2533 2532 cause &= ~0xff; 2534 - cause |= (T_TLB_ST_MISS << CAUSEB_EXCCODE); 2533 + cause |= (EXCCODE_TLBS << CAUSEB_EXCCODE); 2535 2534 } 2536 2535 er = EMULATE_PRIV_FAIL; 2537 2536 break; 2538 - case T_ADDR_ERR_LD: 2537 + case EXCCODE_ADEL: 2539 2538 kvm_debug("%s: address error LD @ %#lx\n", __func__, 2540 2539 badvaddr); 2541 2540 if ((badvaddr & PAGE_MASK) == KVM_GUEST_COMMPAGE_ADDR) { 2542 2541 cause &= ~0xff; 2543 - cause |= (T_TLB_LD_MISS << CAUSEB_EXCCODE); 2542 + cause |= (EXCCODE_TLBL << CAUSEB_EXCCODE); 2544 2543 } 2545 2544 er = EMULATE_PRIV_FAIL; 2546 2545 break; ··· 2586 2585 (va & VPN2_MASK) | 2587 2586 (kvm_read_c0_guest_entryhi(vcpu->arch.cop0) & ASID_MASK)); 2588 2587 if (index < 0) { 2589 - if (exccode == T_TLB_LD_MISS) { 2588 + if (exccode == EXCCODE_TLBL) { 2590 2589 er = kvm_mips_emulate_tlbmiss_ld(cause, opc, run, vcpu); 2591 - } else if (exccode == T_TLB_ST_MISS) { 2590 + } else if (exccode == EXCCODE_TLBS) { 2592 2591 er = kvm_mips_emulate_tlbmiss_st(cause, opc, run, vcpu); 2593 2592 } else { 2594 2593 kvm_err("%s: invalid exc code: %d\n", __func__, ··· 2603 2602 * exception to the guest 2604 2603 */ 2605 2604 if (!TLB_IS_VALID(*tlb, va)) { 2606 - if (exccode == T_TLB_LD_MISS) { 2605 + if (exccode == EXCCODE_TLBL) { 2607 2606 er = kvm_mips_emulate_tlbinv_ld(cause, opc, run, 2608 2607 vcpu); 2609 - } else if (exccode == T_TLB_ST_MISS) { 2608 + } else if (exccode == EXCCODE_TLBS) { 2610 2609 er = kvm_mips_emulate_tlbinv_st(cause, opc, run, 2611 2610 vcpu); 2612 2611 } else {
+4 -4
arch/mips/kvm/interrupt.c
··· 128 128 && (!(kvm_read_c0_guest_status(cop0) & (ST0_EXL | ST0_ERL))) 129 129 && (kvm_read_c0_guest_status(cop0) & IE_IRQ5)) { 130 130 allowed = 1; 131 - exccode = T_INT; 131 + exccode = EXCCODE_INT; 132 132 } 133 133 break; 134 134 ··· 137 137 && (!(kvm_read_c0_guest_status(cop0) & (ST0_EXL | ST0_ERL))) 138 138 && (kvm_read_c0_guest_status(cop0) & IE_IRQ0)) { 139 139 allowed = 1; 140 - exccode = T_INT; 140 + exccode = EXCCODE_INT; 141 141 } 142 142 break; 143 143 ··· 146 146 && (!(kvm_read_c0_guest_status(cop0) & (ST0_EXL | ST0_ERL))) 147 147 && (kvm_read_c0_guest_status(cop0) & IE_IRQ1)) { 148 148 allowed = 1; 149 - exccode = T_INT; 149 + exccode = EXCCODE_INT; 150 150 } 151 151 break; 152 152 ··· 155 155 && (!(kvm_read_c0_guest_status(cop0) & (ST0_EXL | ST0_ERL))) 156 156 && (kvm_read_c0_guest_status(cop0) & IE_IRQ2)) { 157 157 allowed = 1; 158 - exccode = T_INT; 158 + exccode = EXCCODE_INT; 159 159 } 160 160 break; 161 161
+16 -16
arch/mips/kvm/mips.c
··· 1264 1264 } 1265 1265 1266 1266 switch (exccode) { 1267 - case T_INT: 1268 - kvm_debug("[%d]T_INT @ %p\n", vcpu->vcpu_id, opc); 1267 + case EXCCODE_INT: 1268 + kvm_debug("[%d]EXCCODE_INT @ %p\n", vcpu->vcpu_id, opc); 1269 1269 1270 1270 ++vcpu->stat.int_exits; 1271 1271 trace_kvm_exit(vcpu, INT_EXITS); ··· 1276 1276 ret = RESUME_GUEST; 1277 1277 break; 1278 1278 1279 - case T_COP_UNUSABLE: 1280 - kvm_debug("T_COP_UNUSABLE: @ PC: %p\n", opc); 1279 + case EXCCODE_CPU: 1280 + kvm_debug("EXCCODE_CPU: @ PC: %p\n", opc); 1281 1281 1282 1282 ++vcpu->stat.cop_unusable_exits; 1283 1283 trace_kvm_exit(vcpu, COP_UNUSABLE_EXITS); ··· 1287 1287 ret = RESUME_HOST; 1288 1288 break; 1289 1289 1290 - case T_TLB_MOD: 1290 + case EXCCODE_MOD: 1291 1291 ++vcpu->stat.tlbmod_exits; 1292 1292 trace_kvm_exit(vcpu, TLBMOD_EXITS); 1293 1293 ret = kvm_mips_callbacks->handle_tlb_mod(vcpu); 1294 1294 break; 1295 1295 1296 - case T_TLB_ST_MISS: 1296 + case EXCCODE_TLBS: 1297 1297 kvm_debug("TLB ST fault: cause %#x, status %#lx, PC: %p, BadVaddr: %#lx\n", 1298 1298 cause, kvm_read_c0_guest_status(vcpu->arch.cop0), opc, 1299 1299 badvaddr); ··· 1303 1303 ret = kvm_mips_callbacks->handle_tlb_st_miss(vcpu); 1304 1304 break; 1305 1305 1306 - case T_TLB_LD_MISS: 1306 + case EXCCODE_TLBL: 1307 1307 kvm_debug("TLB LD fault: cause %#x, PC: %p, BadVaddr: %#lx\n", 1308 1308 cause, opc, badvaddr); 1309 1309 ··· 1312 1312 ret = kvm_mips_callbacks->handle_tlb_ld_miss(vcpu); 1313 1313 break; 1314 1314 1315 - case T_ADDR_ERR_ST: 1315 + case EXCCODE_ADES: 1316 1316 ++vcpu->stat.addrerr_st_exits; 1317 1317 trace_kvm_exit(vcpu, ADDRERR_ST_EXITS); 1318 1318 ret = kvm_mips_callbacks->handle_addr_err_st(vcpu); 1319 1319 break; 1320 1320 1321 - case T_ADDR_ERR_LD: 1321 + case EXCCODE_ADEL: 1322 1322 ++vcpu->stat.addrerr_ld_exits; 1323 1323 trace_kvm_exit(vcpu, ADDRERR_LD_EXITS); 1324 1324 ret = kvm_mips_callbacks->handle_addr_err_ld(vcpu); 1325 1325 break; 1326 1326 1327 - case T_SYSCALL: 1327 + case EXCCODE_SYS: 1328 1328 ++vcpu->stat.syscall_exits; 1329 1329 trace_kvm_exit(vcpu, SYSCALL_EXITS); 1330 1330 ret = kvm_mips_callbacks->handle_syscall(vcpu); 1331 1331 break; 1332 1332 1333 - case T_RES_INST: 1333 + case EXCCODE_RI: 1334 1334 ++vcpu->stat.resvd_inst_exits; 1335 1335 trace_kvm_exit(vcpu, RESVD_INST_EXITS); 1336 1336 ret = kvm_mips_callbacks->handle_res_inst(vcpu); 1337 1337 break; 1338 1338 1339 - case T_BREAK: 1339 + case EXCCODE_BP: 1340 1340 ++vcpu->stat.break_inst_exits; 1341 1341 trace_kvm_exit(vcpu, BREAK_INST_EXITS); 1342 1342 ret = kvm_mips_callbacks->handle_break(vcpu); 1343 1343 break; 1344 1344 1345 - case T_TRAP: 1345 + case EXCCODE_TR: 1346 1346 ++vcpu->stat.trap_inst_exits; 1347 1347 trace_kvm_exit(vcpu, TRAP_INST_EXITS); 1348 1348 ret = kvm_mips_callbacks->handle_trap(vcpu); 1349 1349 break; 1350 1350 1351 - case T_MSAFPE: 1351 + case EXCCODE_MSAFPE: 1352 1352 ++vcpu->stat.msa_fpe_exits; 1353 1353 trace_kvm_exit(vcpu, MSA_FPE_EXITS); 1354 1354 ret = kvm_mips_callbacks->handle_msa_fpe(vcpu); 1355 1355 break; 1356 1356 1357 - case T_FPE: 1357 + case EXCCODE_FPE: 1358 1358 ++vcpu->stat.fpe_exits; 1359 1359 trace_kvm_exit(vcpu, FPE_EXITS); 1360 1360 ret = kvm_mips_callbacks->handle_fpe(vcpu); 1361 1361 break; 1362 1362 1363 - case T_MSADIS: 1363 + case EXCCODE_MSADIS: 1364 1364 ++vcpu->stat.msa_disabled_exits; 1365 1365 trace_kvm_exit(vcpu, MSA_DISABLED_EXITS); 1366 1366 ret = kvm_mips_callbacks->handle_msa_disabled(vcpu);