[PATCH v3 15/41] KVM: PPC: Book3S 64: Minimise hcall handler calling convention differences
Alexey Kardashevskiy
aik at ozlabs.ru
Mon Mar 22 13:09:07 AEDT 2021
On 06/03/2021 02:06, Nicholas Piggin wrote:
> This sets up the same calling convention from interrupt entry to
> KVM interrupt handler for system calls as exists for other interrupt
> types.
>
> This is a better API, it uses a save area rather than SPR, and it has
> more registers free to use. Using a single common API helps maintain
> it, and it becomes easier to use in C in a later patch.
>
> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
Reviewed-by: Alexey Kardashevskiy <aik at ozlabs.ru>
> ---
> arch/powerpc/kernel/exceptions-64s.S | 16 +++++++++++++++-
> arch/powerpc/kvm/book3s_64_entry.S | 22 +++-------------------
> 2 files changed, 18 insertions(+), 20 deletions(-)
>
> diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
> index b4eab5084964..ce6f5f863d3d 100644
> --- a/arch/powerpc/kernel/exceptions-64s.S
> +++ b/arch/powerpc/kernel/exceptions-64s.S
> @@ -1892,8 +1892,22 @@ EXC_VIRT_END(system_call, 0x4c00, 0x100)
>
> #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
> TRAMP_REAL_BEGIN(kvm_hcall)
> + std r9,PACA_EXGEN+EX_R9(r13)
> + std r11,PACA_EXGEN+EX_R11(r13)
> + std r12,PACA_EXGEN+EX_R12(r13)
> + mfcr r9
> mfctr r10
> - SET_SCRATCH0(r10) /* Save r13 in SCRATCH0 */
> + std r10,PACA_EXGEN+EX_R13(r13)
> + li r10,0
> + std r10,PACA_EXGEN+EX_CFAR(r13)
> + std r10,PACA_EXGEN+EX_CTR(r13)
> +BEGIN_FTR_SECTION
> + mfspr r10,SPRN_PPR
> + std r10,PACA_EXGEN+EX_PPR(r13)
> +END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
> +
> + HMT_MEDIUM
> +
> #ifdef CONFIG_RELOCATABLE
> /*
> * Requires __LOAD_FAR_HANDLER beause kvmppc_hcall lives
> diff --git a/arch/powerpc/kvm/book3s_64_entry.S b/arch/powerpc/kvm/book3s_64_entry.S
> index 7a6b060ceed8..129d3f81800e 100644
> --- a/arch/powerpc/kvm/book3s_64_entry.S
> +++ b/arch/powerpc/kvm/book3s_64_entry.S
> @@ -14,24 +14,9 @@
> .global kvmppc_hcall
> .balign IFETCH_ALIGN_BYTES
> kvmppc_hcall:
> - /*
> - * This is a hcall, so register convention is as
> - * Documentation/powerpc/papr_hcalls.rst, with these additions:
> - * R13 = PACA
> - * guest R13 saved in SPRN_SCRATCH0
> - * R10 = free
> - */
> -BEGIN_FTR_SECTION
> - mfspr r10,SPRN_PPR
> - std r10,HSTATE_PPR(r13)
> -END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
> - HMT_MEDIUM
> - mfcr r10
> - std r12,HSTATE_SCRATCH0(r13)
> - sldi r12,r10,32
> - ori r12,r12,0xc00
> - ld r10,PACA_EXGEN+EX_R10(r13)
> - b do_kvm_interrupt
> + ld r10,PACA_EXGEN+EX_R13(r13)
> + SET_SCRATCH0(r10)
> + li r10,0xc00
>
> .global kvmppc_interrupt
> .balign IFETCH_ALIGN_BYTES
> @@ -62,7 +47,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
> ld r10,EX_R10(r11)
> ld r11,EX_R11(r11)
>
> -do_kvm_interrupt:
> /*
> * Hcalls and other interrupts come here after normalising register
> * contents and save locations:
>
--
Alexey
More information about the Linuxppc-dev
mailing list