diff options
Diffstat (limited to 'arch/powerpc/kvm/book3s_hv_rmhandlers.S')
-rw-r--r-- | arch/powerpc/kvm/book3s_hv_rmhandlers.S | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index bc8de75b1925..d5ddc2d10748 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
@@ -686,6 +686,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206) | |||
686 | 5: mtspr SPRN_SRR0, r6 | 686 | 5: mtspr SPRN_SRR0, r6 |
687 | mtspr SPRN_SRR1, r7 | 687 | mtspr SPRN_SRR1, r7 |
688 | 688 | ||
689 | /* | ||
690 | * Required state: | ||
691 | * R4 = vcpu | ||
692 | * R10: value for HSRR0 | ||
693 | * R11: value for HSRR1 | ||
694 | * R13 = PACA | ||
695 | */ | ||
689 | fast_guest_return: | 696 | fast_guest_return: |
690 | li r0,0 | 697 | li r0,0 |
691 | stb r0,VCPU_CEDED(r4) /* cancel cede */ | 698 | stb r0,VCPU_CEDED(r4) /* cancel cede */ |
@@ -1471,7 +1478,8 @@ kvmppc_hisi: | |||
1471 | hcall_try_real_mode: | 1478 | hcall_try_real_mode: |
1472 | ld r3,VCPU_GPR(R3)(r9) | 1479 | ld r3,VCPU_GPR(R3)(r9) |
1473 | andi. r0,r11,MSR_PR | 1480 | andi. r0,r11,MSR_PR |
1474 | bne guest_exit_cont | 1481 | /* sc 1 from userspace - reflect to guest syscall */ |
1482 | bne sc_1_fast_return | ||
1475 | clrrdi r3,r3,2 | 1483 | clrrdi r3,r3,2 |
1476 | cmpldi r3,hcall_real_table_end - hcall_real_table | 1484 | cmpldi r3,hcall_real_table_end - hcall_real_table |
1477 | bge guest_exit_cont | 1485 | bge guest_exit_cont |
@@ -1492,6 +1500,15 @@ hcall_try_real_mode: | |||
1492 | ld r11,VCPU_MSR(r4) | 1500 | ld r11,VCPU_MSR(r4) |
1493 | b fast_guest_return | 1501 | b fast_guest_return |
1494 | 1502 | ||
1503 | sc_1_fast_return: | ||
1504 | mtspr SPRN_SRR0,r10 | ||
1505 | mtspr SPRN_SRR1,r11 | ||
1506 | li r10, BOOK3S_INTERRUPT_SYSCALL | ||
1507 | li r11, (MSR_ME << 1) | 1 /* synthesize MSR_SF | MSR_ME */ | ||
1508 | rotldi r11, r11, 63 | ||
1509 | mr r4,r9 | ||
1510 | b fast_guest_return | ||
1511 | |||
1495 | /* We've attempted a real mode hcall, but it's punted it back | 1512 | /* We've attempted a real mode hcall, but it's punted it back |
1496 | * to userspace. We need to restore some clobbered volatiles | 1513 | * to userspace. We need to restore some clobbered volatiles |
1497 | * before resuming the pass-it-to-qemu path */ | 1514 | * before resuming the pass-it-to-qemu path */ |