diff options
Diffstat (limited to 'arch/mips/kvm/emulate.c')
-rw-r--r-- | arch/mips/kvm/emulate.c | 71 |
1 files changed, 36 insertions, 35 deletions
diff --git a/arch/mips/kvm/emulate.c b/arch/mips/kvm/emulate.c index 95b83a6582ef..6ff1dcfc9ef1 100644 --- a/arch/mips/kvm/emulate.c +++ b/arch/mips/kvm/emulate.c | |||
@@ -1780,7 +1780,7 @@ enum emulation_result kvm_mips_emulate_syscall(unsigned long cause, | |||
1780 | kvm_debug("Delivering SYSCALL @ pc %#lx\n", arch->pc); | 1780 | kvm_debug("Delivering SYSCALL @ pc %#lx\n", arch->pc); |
1781 | 1781 | ||
1782 | kvm_change_c0_guest_cause(cop0, (0xff), | 1782 | kvm_change_c0_guest_cause(cop0, (0xff), |
1783 | (T_SYSCALL << CAUSEB_EXCCODE)); | 1783 | (EXCCODE_SYS << CAUSEB_EXCCODE)); |
1784 | 1784 | ||
1785 | /* Set PC to the exception entry point */ | 1785 | /* Set PC to the exception entry point */ |
1786 | arch->pc = KVM_GUEST_KSEG0 + 0x180; | 1786 | arch->pc = KVM_GUEST_KSEG0 + 0x180; |
@@ -1827,7 +1827,7 @@ enum emulation_result kvm_mips_emulate_tlbmiss_ld(unsigned long cause, | |||
1827 | } | 1827 | } |
1828 | 1828 | ||
1829 | kvm_change_c0_guest_cause(cop0, (0xff), | 1829 | kvm_change_c0_guest_cause(cop0, (0xff), |
1830 | (T_TLB_LD_MISS << CAUSEB_EXCCODE)); | 1830 | (EXCCODE_TLBL << CAUSEB_EXCCODE)); |
1831 | 1831 | ||
1832 | /* setup badvaddr, context and entryhi registers for the guest */ | 1832 | /* setup badvaddr, context and entryhi registers for the guest */ |
1833 | kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); | 1833 | kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); |
@@ -1873,7 +1873,7 @@ enum emulation_result kvm_mips_emulate_tlbinv_ld(unsigned long cause, | |||
1873 | } | 1873 | } |
1874 | 1874 | ||
1875 | kvm_change_c0_guest_cause(cop0, (0xff), | 1875 | kvm_change_c0_guest_cause(cop0, (0xff), |
1876 | (T_TLB_LD_MISS << CAUSEB_EXCCODE)); | 1876 | (EXCCODE_TLBL << CAUSEB_EXCCODE)); |
1877 | 1877 | ||
1878 | /* setup badvaddr, context and entryhi registers for the guest */ | 1878 | /* setup badvaddr, context and entryhi registers for the guest */ |
1879 | kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); | 1879 | kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); |
@@ -1917,7 +1917,7 @@ enum emulation_result kvm_mips_emulate_tlbmiss_st(unsigned long cause, | |||
1917 | } | 1917 | } |
1918 | 1918 | ||
1919 | kvm_change_c0_guest_cause(cop0, (0xff), | 1919 | kvm_change_c0_guest_cause(cop0, (0xff), |
1920 | (T_TLB_ST_MISS << CAUSEB_EXCCODE)); | 1920 | (EXCCODE_TLBS << CAUSEB_EXCCODE)); |
1921 | 1921 | ||
1922 | /* setup badvaddr, context and entryhi registers for the guest */ | 1922 | /* setup badvaddr, context and entryhi registers for the guest */ |
1923 | kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); | 1923 | kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); |
@@ -1961,7 +1961,7 @@ enum emulation_result kvm_mips_emulate_tlbinv_st(unsigned long cause, | |||
1961 | } | 1961 | } |
1962 | 1962 | ||
1963 | kvm_change_c0_guest_cause(cop0, (0xff), | 1963 | kvm_change_c0_guest_cause(cop0, (0xff), |
1964 | (T_TLB_ST_MISS << CAUSEB_EXCCODE)); | 1964 | (EXCCODE_TLBS << CAUSEB_EXCCODE)); |
1965 | 1965 | ||
1966 | /* setup badvaddr, context and entryhi registers for the guest */ | 1966 | /* setup badvaddr, context and entryhi registers for the guest */ |
1967 | kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); | 1967 | kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); |
@@ -2032,7 +2032,8 @@ enum emulation_result kvm_mips_emulate_tlbmod(unsigned long cause, | |||
2032 | arch->pc = KVM_GUEST_KSEG0 + 0x180; | 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 | /* setup badvaddr, context and entryhi registers for the guest */ | 2038 | /* setup badvaddr, context and entryhi registers for the guest */ |
2038 | kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); | 2039 | kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); |
@@ -2067,7 +2068,7 @@ enum emulation_result kvm_mips_emulate_fpu_exc(unsigned long cause, | |||
2067 | arch->pc = KVM_GUEST_KSEG0 + 0x180; | 2068 | arch->pc = KVM_GUEST_KSEG0 + 0x180; |
2068 | 2069 | ||
2069 | kvm_change_c0_guest_cause(cop0, (0xff), | 2070 | kvm_change_c0_guest_cause(cop0, (0xff), |
2070 | (T_COP_UNUSABLE << CAUSEB_EXCCODE)); | 2071 | (EXCCODE_CPU << CAUSEB_EXCCODE)); |
2071 | kvm_change_c0_guest_cause(cop0, (CAUSEF_CE), (0x1 << CAUSEB_CE)); | 2072 | kvm_change_c0_guest_cause(cop0, (CAUSEF_CE), (0x1 << CAUSEB_CE)); |
2072 | 2073 | ||
2073 | return EMULATE_DONE; | 2074 | return EMULATE_DONE; |
@@ -2095,7 +2096,7 @@ enum emulation_result kvm_mips_emulate_ri_exc(unsigned long cause, | |||
2095 | kvm_debug("Delivering RI @ pc %#lx\n", arch->pc); | 2096 | kvm_debug("Delivering RI @ pc %#lx\n", arch->pc); |
2096 | 2097 | ||
2097 | kvm_change_c0_guest_cause(cop0, (0xff), | 2098 | kvm_change_c0_guest_cause(cop0, (0xff), |
2098 | (T_RES_INST << CAUSEB_EXCCODE)); | 2099 | (EXCCODE_RI << CAUSEB_EXCCODE)); |
2099 | 2100 | ||
2100 | /* Set PC to the exception entry point */ | 2101 | /* Set PC to the exception entry point */ |
2101 | arch->pc = KVM_GUEST_KSEG0 + 0x180; | 2102 | arch->pc = KVM_GUEST_KSEG0 + 0x180; |
@@ -2130,7 +2131,7 @@ enum emulation_result kvm_mips_emulate_bp_exc(unsigned long cause, | |||
2130 | kvm_debug("Delivering BP @ pc %#lx\n", arch->pc); | 2131 | kvm_debug("Delivering BP @ pc %#lx\n", arch->pc); |
2131 | 2132 | ||
2132 | kvm_change_c0_guest_cause(cop0, (0xff), | 2133 | kvm_change_c0_guest_cause(cop0, (0xff), |
2133 | (T_BREAK << CAUSEB_EXCCODE)); | 2134 | (EXCCODE_BP << CAUSEB_EXCCODE)); |
2134 | 2135 | ||
2135 | /* Set PC to the exception entry point */ | 2136 | /* Set PC to the exception entry point */ |
2136 | arch->pc = KVM_GUEST_KSEG0 + 0x180; | 2137 | arch->pc = KVM_GUEST_KSEG0 + 0x180; |
@@ -2165,7 +2166,7 @@ enum emulation_result kvm_mips_emulate_trap_exc(unsigned long cause, | |||
2165 | kvm_debug("Delivering TRAP @ pc %#lx\n", arch->pc); | 2166 | kvm_debug("Delivering TRAP @ pc %#lx\n", arch->pc); |
2166 | 2167 | ||
2167 | kvm_change_c0_guest_cause(cop0, (0xff), | 2168 | kvm_change_c0_guest_cause(cop0, (0xff), |
2168 | (T_TRAP << CAUSEB_EXCCODE)); | 2169 | (EXCCODE_TR << CAUSEB_EXCCODE)); |
2169 | 2170 | ||
2170 | /* Set PC to the exception entry point */ | 2171 | /* Set PC to the exception entry point */ |
2171 | arch->pc = KVM_GUEST_KSEG0 + 0x180; | 2172 | arch->pc = KVM_GUEST_KSEG0 + 0x180; |
@@ -2200,7 +2201,7 @@ enum emulation_result kvm_mips_emulate_msafpe_exc(unsigned long cause, | |||
2200 | kvm_debug("Delivering MSAFPE @ pc %#lx\n", arch->pc); | 2201 | kvm_debug("Delivering MSAFPE @ pc %#lx\n", arch->pc); |
2201 | 2202 | ||
2202 | kvm_change_c0_guest_cause(cop0, (0xff), | 2203 | kvm_change_c0_guest_cause(cop0, (0xff), |
2203 | (T_MSAFPE << CAUSEB_EXCCODE)); | 2204 | (EXCCODE_MSAFPE << CAUSEB_EXCCODE)); |
2204 | 2205 | ||
2205 | /* Set PC to the exception entry point */ | 2206 | /* Set PC to the exception entry point */ |
2206 | arch->pc = KVM_GUEST_KSEG0 + 0x180; | 2207 | arch->pc = KVM_GUEST_KSEG0 + 0x180; |
@@ -2235,7 +2236,7 @@ enum emulation_result kvm_mips_emulate_fpe_exc(unsigned long cause, | |||
2235 | kvm_debug("Delivering FPE @ pc %#lx\n", arch->pc); | 2236 | kvm_debug("Delivering FPE @ pc %#lx\n", arch->pc); |
2236 | 2237 | ||
2237 | kvm_change_c0_guest_cause(cop0, (0xff), | 2238 | kvm_change_c0_guest_cause(cop0, (0xff), |
2238 | (T_FPE << CAUSEB_EXCCODE)); | 2239 | (EXCCODE_FPE << CAUSEB_EXCCODE)); |
2239 | 2240 | ||
2240 | /* Set PC to the exception entry point */ | 2241 | /* Set PC to the exception entry point */ |
2241 | arch->pc = KVM_GUEST_KSEG0 + 0x180; | 2242 | arch->pc = KVM_GUEST_KSEG0 + 0x180; |
@@ -2270,7 +2271,7 @@ enum emulation_result kvm_mips_emulate_msadis_exc(unsigned long cause, | |||
2270 | kvm_debug("Delivering MSADIS @ pc %#lx\n", arch->pc); | 2271 | kvm_debug("Delivering MSADIS @ pc %#lx\n", arch->pc); |
2271 | 2272 | ||
2272 | kvm_change_c0_guest_cause(cop0, (0xff), | 2273 | kvm_change_c0_guest_cause(cop0, (0xff), |
2273 | (T_MSADIS << CAUSEB_EXCCODE)); | 2274 | (EXCCODE_MSADIS << CAUSEB_EXCCODE)); |
2274 | 2275 | ||
2275 | /* Set PC to the exception entry point */ | 2276 | /* Set PC to the exception entry point */ |
2276 | arch->pc = KVM_GUEST_KSEG0 + 0x180; | 2277 | arch->pc = KVM_GUEST_KSEG0 + 0x180; |
@@ -2479,25 +2480,25 @@ enum emulation_result kvm_mips_check_privilege(unsigned long cause, | |||
2479 | 2480 | ||
2480 | if (usermode) { | 2481 | if (usermode) { |
2481 | switch (exccode) { | 2482 | switch (exccode) { |
2482 | case T_INT: | 2483 | case EXCCODE_INT: |
2483 | case T_SYSCALL: | 2484 | case EXCCODE_SYS: |
2484 | case T_BREAK: | 2485 | case EXCCODE_BP: |
2485 | case T_RES_INST: | 2486 | case EXCCODE_RI: |
2486 | case T_TRAP: | 2487 | case EXCCODE_TR: |
2487 | case T_MSAFPE: | 2488 | case EXCCODE_MSAFPE: |
2488 | case T_FPE: | 2489 | case EXCCODE_FPE: |
2489 | case T_MSADIS: | 2490 | case EXCCODE_MSADIS: |
2490 | break; | 2491 | break; |
2491 | 2492 | ||
2492 | case T_COP_UNUSABLE: | 2493 | case EXCCODE_CPU: |
2493 | if (((cause & CAUSEF_CE) >> CAUSEB_CE) == 0) | 2494 | if (((cause & CAUSEF_CE) >> CAUSEB_CE) == 0) |
2494 | er = EMULATE_PRIV_FAIL; | 2495 | er = EMULATE_PRIV_FAIL; |
2495 | break; | 2496 | break; |
2496 | 2497 | ||
2497 | case T_TLB_MOD: | 2498 | case EXCCODE_MOD: |
2498 | break; | 2499 | break; |
2499 | 2500 | ||
2500 | case T_TLB_LD_MISS: | 2501 | case EXCCODE_TLBL: |
2501 | /* | 2502 | /* |
2502 | * We we are accessing Guest kernel space, then send an | 2503 | * We we are accessing Guest kernel space, then send an |
2503 | * address error exception to the guest | 2504 | * address error exception to the guest |
@@ -2506,12 +2507,12 @@ enum emulation_result kvm_mips_check_privilege(unsigned long cause, | |||
2506 | kvm_debug("%s: LD MISS @ %#lx\n", __func__, | 2507 | kvm_debug("%s: LD MISS @ %#lx\n", __func__, |
2507 | badvaddr); | 2508 | badvaddr); |
2508 | cause &= ~0xff; | 2509 | cause &= ~0xff; |
2509 | cause |= (T_ADDR_ERR_LD << CAUSEB_EXCCODE); | 2510 | cause |= (EXCCODE_ADEL << CAUSEB_EXCCODE); |
2510 | er = EMULATE_PRIV_FAIL; | 2511 | er = EMULATE_PRIV_FAIL; |
2511 | } | 2512 | } |
2512 | break; | 2513 | break; |
2513 | 2514 | ||
2514 | case T_TLB_ST_MISS: | 2515 | case EXCCODE_TLBS: |
2515 | /* | 2516 | /* |
2516 | * We we are accessing Guest kernel space, then send an | 2517 | * We we are accessing Guest kernel space, then send an |
2517 | * address error exception to the guest | 2518 | * address error exception to the guest |
@@ -2520,26 +2521,26 @@ enum emulation_result kvm_mips_check_privilege(unsigned long cause, | |||
2520 | kvm_debug("%s: ST MISS @ %#lx\n", __func__, | 2521 | kvm_debug("%s: ST MISS @ %#lx\n", __func__, |
2521 | badvaddr); | 2522 | badvaddr); |
2522 | cause &= ~0xff; | 2523 | cause &= ~0xff; |
2523 | cause |= (T_ADDR_ERR_ST << CAUSEB_EXCCODE); | 2524 | cause |= (EXCCODE_ADES << CAUSEB_EXCCODE); |
2524 | er = EMULATE_PRIV_FAIL; | 2525 | er = EMULATE_PRIV_FAIL; |
2525 | } | 2526 | } |
2526 | break; | 2527 | break; |
2527 | 2528 | ||
2528 | case T_ADDR_ERR_ST: | 2529 | case EXCCODE_ADES: |
2529 | kvm_debug("%s: address error ST @ %#lx\n", __func__, | 2530 | kvm_debug("%s: address error ST @ %#lx\n", __func__, |
2530 | badvaddr); | 2531 | badvaddr); |
2531 | if ((badvaddr & PAGE_MASK) == KVM_GUEST_COMMPAGE_ADDR) { | 2532 | if ((badvaddr & PAGE_MASK) == KVM_GUEST_COMMPAGE_ADDR) { |
2532 | cause &= ~0xff; | 2533 | cause &= ~0xff; |
2533 | cause |= (T_TLB_ST_MISS << CAUSEB_EXCCODE); | 2534 | cause |= (EXCCODE_TLBS << CAUSEB_EXCCODE); |
2534 | } | 2535 | } |
2535 | er = EMULATE_PRIV_FAIL; | 2536 | er = EMULATE_PRIV_FAIL; |
2536 | break; | 2537 | break; |
2537 | case T_ADDR_ERR_LD: | 2538 | case EXCCODE_ADEL: |
2538 | kvm_debug("%s: address error LD @ %#lx\n", __func__, | 2539 | kvm_debug("%s: address error LD @ %#lx\n", __func__, |
2539 | badvaddr); | 2540 | badvaddr); |
2540 | if ((badvaddr & PAGE_MASK) == KVM_GUEST_COMMPAGE_ADDR) { | 2541 | if ((badvaddr & PAGE_MASK) == KVM_GUEST_COMMPAGE_ADDR) { |
2541 | cause &= ~0xff; | 2542 | cause &= ~0xff; |
2542 | cause |= (T_TLB_LD_MISS << CAUSEB_EXCCODE); | 2543 | cause |= (EXCCODE_TLBL << CAUSEB_EXCCODE); |
2543 | } | 2544 | } |
2544 | er = EMULATE_PRIV_FAIL; | 2545 | er = EMULATE_PRIV_FAIL; |
2545 | break; | 2546 | break; |
@@ -2585,9 +2586,9 @@ enum emulation_result kvm_mips_handle_tlbmiss(unsigned long cause, | |||
2585 | (va & VPN2_MASK) | | 2586 | (va & VPN2_MASK) | |
2586 | (kvm_read_c0_guest_entryhi(vcpu->arch.cop0) & ASID_MASK)); | 2587 | (kvm_read_c0_guest_entryhi(vcpu->arch.cop0) & ASID_MASK)); |
2587 | if (index < 0) { | 2588 | if (index < 0) { |
2588 | if (exccode == T_TLB_LD_MISS) { | 2589 | if (exccode == EXCCODE_TLBL) { |
2589 | er = kvm_mips_emulate_tlbmiss_ld(cause, opc, run, vcpu); | 2590 | er = kvm_mips_emulate_tlbmiss_ld(cause, opc, run, vcpu); |
2590 | } else if (exccode == T_TLB_ST_MISS) { | 2591 | } else if (exccode == EXCCODE_TLBS) { |
2591 | er = kvm_mips_emulate_tlbmiss_st(cause, opc, run, vcpu); | 2592 | er = kvm_mips_emulate_tlbmiss_st(cause, opc, run, vcpu); |
2592 | } else { | 2593 | } else { |
2593 | kvm_err("%s: invalid exc code: %d\n", __func__, | 2594 | kvm_err("%s: invalid exc code: %d\n", __func__, |
@@ -2602,10 +2603,10 @@ enum emulation_result kvm_mips_handle_tlbmiss(unsigned long cause, | |||
2602 | * exception to the guest | 2603 | * exception to the guest |
2603 | */ | 2604 | */ |
2604 | if (!TLB_IS_VALID(*tlb, va)) { | 2605 | if (!TLB_IS_VALID(*tlb, va)) { |
2605 | if (exccode == T_TLB_LD_MISS) { | 2606 | if (exccode == EXCCODE_TLBL) { |
2606 | er = kvm_mips_emulate_tlbinv_ld(cause, opc, run, | 2607 | er = kvm_mips_emulate_tlbinv_ld(cause, opc, run, |
2607 | vcpu); | 2608 | vcpu); |
2608 | } else if (exccode == T_TLB_ST_MISS) { | 2609 | } else if (exccode == EXCCODE_TLBS) { |
2609 | er = kvm_mips_emulate_tlbinv_st(cause, opc, run, | 2610 | er = kvm_mips_emulate_tlbinv_st(cause, opc, run, |
2610 | vcpu); | 2611 | vcpu); |
2611 | } else { | 2612 | } else { |