Message ID | 20210305150638.2675513-16-npiggin@gmail.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | KVM: PPC: Book3S: C-ify the P9 entry/exit code | expand |
Related | show |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch powerpc/merge (91966823812efbd175f904599e5cf2a854b39809) |
snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch powerpc/next (fe07bfda2fb9cdef8a4d4008a409bb02f35f1bd8) |
snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch linus/master (280d542f6ffac0e6d65dc267f92191d509b13b64) |
snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch powerpc/fixes (5c88a17e15795226b56d83f579cbb9b7a4864f79) |
snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch linux-next (7a7fd0de4a9804299793e564a555a49c1fc924cb) |
snowpatch_ozlabs/apply_patch | fail | Failed to apply to any branch |
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@gmail.com> Reviewed-by: Alexey Kardashevskiy <aik@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: >
Excerpts from Nicholas Piggin's message of March 6, 2021 1:06 am: > 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. On second look I'm happy enough with this. It does add some hcall setup code back into exception-64s.S and removes most of the "fixup" code that was previously moved into book3s_64_entry.S in patch 12. But if you take patch 12 and 13 and other earlier patches together they are moving most KVM interrupt knowledge into KVM which is a good change. Once that is done, this final one then gets hcall into better shape for the C code. If anything this patch could go together with patch 12 but I guess I ended up writing it for the C code whereas the previous ones were cleanups so the ordering didn't come out that way. It won't be trivial to move now so I don't think I'd bother. Thanks, Nick
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:
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@gmail.com> --- arch/powerpc/kernel/exceptions-64s.S | 16 +++++++++++++++- arch/powerpc/kvm/book3s_64_entry.S | 22 +++------------------- 2 files changed, 18 insertions(+), 20 deletions(-)