From: Nicholas Piggin <npiggin@gmail.com>
To: Daniel Axtens <dja@axtens.net>, kvm-ppc@vger.kernel.org
Cc: linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH v3 12/41] KVM: PPC: Book3S 64: Move hcall early register setup to KVM
Date: Tue, 16 Mar 2021 13:43:40 +1000 [thread overview]
Message-ID: <1615862463.zij1m644om.astroid@bobo.none> (raw)
In-Reply-To: <87czw57wn8.fsf@linkitivity.dja.id.au>
Excerpts from Daniel Axtens's message of March 12, 2021 3:45 pm:
> Nicholas Piggin <npiggin@gmail.com> writes:
>
>> System calls / hcalls have a different calling convention than
>> other interrupts, so there is code in the KVMTEST to massage these
>> into the same form as other interrupt handlers.
>>
>> Move this work into the KVM hcall handler. This means teaching KVM
>> a little more about the low level interrupt handler setup, PACA save
>> areas, etc., although that's not obviously worse than the current
>> approach of coming up with an entirely different interrupt register
>> / save convention.
>>
>> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>> ---
>> arch/powerpc/include/asm/exception-64s.h | 13 ++++++++
>> arch/powerpc/kernel/exceptions-64s.S | 42 +-----------------------
>> arch/powerpc/kvm/book3s_64_entry.S | 17 ++++++++++
>> 3 files changed, 31 insertions(+), 41 deletions(-)
>>
>> diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
>> index c1a8aac01cf9..bb6f78fcf981 100644
>> --- a/arch/powerpc/include/asm/exception-64s.h
>> +++ b/arch/powerpc/include/asm/exception-64s.h
>> @@ -35,6 +35,19 @@
>> /* PACA save area size in u64 units (exgen, exmc, etc) */
>> #define EX_SIZE 10
>>
>> +/* PACA save area offsets */
>> +#define EX_R9 0
>> +#define EX_R10 8
>> +#define EX_R11 16
>> +#define EX_R12 24
>> +#define EX_R13 32
>> +#define EX_DAR 40
>> +#define EX_DSISR 48
>> +#define EX_CCR 52
>> +#define EX_CFAR 56
>> +#define EX_PPR 64
>> +#define EX_CTR 72
>> +
>> /*
>> * maximum recursive depth of MCE exceptions
>> */
>> diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
>> index 292435bd80f0..b7092ba87da8 100644
>> --- a/arch/powerpc/kernel/exceptions-64s.S
>> +++ b/arch/powerpc/kernel/exceptions-64s.S
>> @@ -21,22 +21,6 @@
>> #include <asm/feature-fixups.h>
>> #include <asm/kup.h>
>>
>> -/* PACA save area offsets (exgen, exmc, etc) */
>> -#define EX_R9 0
>> -#define EX_R10 8
>> -#define EX_R11 16
>> -#define EX_R12 24
>> -#define EX_R13 32
>> -#define EX_DAR 40
>> -#define EX_DSISR 48
>> -#define EX_CCR 52
>> -#define EX_CFAR 56
>> -#define EX_PPR 64
>> -#define EX_CTR 72
>> -.if EX_SIZE != 10
>> - .error "EX_SIZE is wrong"
>> -.endif
>> -
>> /*
>> * Following are fixed section helper macros.
>> *
>> @@ -1964,29 +1948,8 @@ EXC_VIRT_END(system_call, 0x4c00, 0x100)
>>
>> #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
>> TRAMP_REAL_BEGIN(system_call_kvm)
>> - /*
>> - * This is a hcall, so register convention is as above, with these
>> - * differences:
>> - * r13 = PACA
>> - * ctr = orig r13
>> - * orig r10 saved in PACA
>> - */
>> - /*
>> - * Save the PPR (on systems that support it) before changing to
>> - * HMT_MEDIUM. That allows the KVM code to save that value into the
>> - * guest state (it is the guest's PPR value).
>> - */
>> -BEGIN_FTR_SECTION
>> - mfspr r10,SPRN_PPR
>> - std r10,HSTATE_PPR(r13)
>> -END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
>> - HMT_MEDIUM
>> mfctr r10
>> - SET_SCRATCH0(r10)
>> - mfcr r10
>> - std r12,HSTATE_SCRATCH0(r13)
>> - sldi r12,r10,32
>> - ori r12,r12,0xc00
>> + SET_SCRATCH0(r10) /* Save r13 in SCRATCH0 */
>
> If I've understood correctly, you've saved the _original_/guest r13 in
> SCRATCH0. That makes sense - it just took me a while to follow the
> logic, especially because the parameter to SET_SCRATCH0 is r10, not r13.
>
> I would probably expand the comment to say the original or guest r13 (as
> you do in the comment at the start of kvmppc_hcall), but if there's a
> convention here that I've missed that might not be necessary.
There is a convention which is that all kvm interrupts including system
call come in with r13 saved in SCRATCH0, although that's all in a state
of flux throughput this series of course.
I added the comment because I moved the bigger comment here, I think
that's okay because you're always referring to interrupted context
(i.e., guest in this case) when talking about saved registers.
>
>> #ifdef CONFIG_RELOCATABLE
>> /*
>> * Requires __LOAD_FAR_HANDLER beause kvmppc_hcall lives
>> @@ -1994,15 +1957,12 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
>> */
>> __LOAD_FAR_HANDLER(r10, kvmppc_hcall)
>> mtctr r10
>> - ld r10,PACA_EXGEN+EX_R10(r13)
>> bctr
>> #else
>> - ld r10,PACA_EXGEN+EX_R10(r13)
>> b kvmppc_hcall
>> #endif
>> #endif
>>
>> -
>> /**
>> * Interrupt 0xd00 - Trace Interrupt.
>> * This is a synchronous interrupt in response to instruction step or
>> diff --git a/arch/powerpc/kvm/book3s_64_entry.S b/arch/powerpc/kvm/book3s_64_entry.S
>> index 8cf5e24a81eb..a7b6edd18bc8 100644
>> --- a/arch/powerpc/kvm/book3s_64_entry.S
>> +++ b/arch/powerpc/kvm/book3s_64_entry.S
>> @@ -14,6 +14,23 @@
>> .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)
>
> Do we want to preserve the comment about why we save the PPR?
Wouldn't hurt. I think the reason the comment is there is because it's a
difference with system calls. Hcalls preserve the PPR, system calls do not.
Should probably leave the "orig r10 saved in the PACA" comment too.
>
>> + HMT_MEDIUM
>> + mfcr r10
>> + std r12,HSTATE_SCRATCH0(r13)
>> + sldi r12,r10,32
>> + ori r12,r12,0xc00
>
> I see that this is a direct copy from the earlier code, but it confuses
> me a bit. Looking at exceptions-64s.S, there's the following comment:
>
> * In HPT, sc 1 always goes to 0xc00 real mode. In RADIX, sc 1 can go to
> * 0x4c00 virtual mode.
>
> However, this code uncondionally sets the low bits to be c00, even if
> the exception came in via 4c00. Is this right? Do we need to pass
> that through somehow?
We don't need to. The "trap" numbers are always the real-mode vectors
(except scv which is a bit weird) by convention.
>
>> + ld r10,PACA_EXGEN+EX_R10(r13)
>>
>
> Otherwise, this looks good to me so far.
Thanks,
Nick
next prev parent reply other threads:[~2021-03-16 3:44 UTC|newest]
Thread overview: 79+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-05 15:05 [PATCH v3 00/41] KVM: PPC: Book3S: C-ify the P9 entry/exit code Nicholas Piggin
2021-03-05 15:05 ` [PATCH v3 01/41] KVM: PPC: Book3S HV: Disallow LPCR[AIL] to be set to 1 or 2 Nicholas Piggin
2021-03-08 15:26 ` Fabiano Rosas
2021-03-09 1:11 ` Nicholas Piggin
2021-03-05 15:05 ` [PATCH v3 02/41] KVM: PPC: Book3S HV: Prevent radix guests from setting LPCR[TC] Nicholas Piggin
2021-03-08 15:47 ` Fabiano Rosas
2021-03-09 1:14 ` Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 03/41] KVM: PPC: Book3S HV: Remove redundant mtspr PSPB Nicholas Piggin
2021-03-12 5:07 ` Daniel Axtens
2021-03-05 15:06 ` [PATCH v3 04/41] KVM: PPC: Book3S HV: remove unused kvmppc_h_protect argument Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 05/41] KVM: PPC: Book3S HV: Fix CONFIG_SPAPR_TCE_IOMMU=n default hcalls Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 06/41] powerpc/64s: Remove KVM handler support from CBE_RAS interrupts Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 07/41] powerpc/64s: remove KVM SKIP test from instruction breakpoint handler Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 08/41] KVM: PPC: Book3S HV: Ensure MSR[ME] is always set in guest MSR Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 09/41] KVM: PPC: Book3S 64: move KVM interrupt entry to a common entry point Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 10/41] KVM: PPC: Book3S 64: Move GUEST_MODE_SKIP test into KVM Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 11/41] KVM: PPC: Book3S 64: add hcall interrupt handler Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 12/41] KVM: PPC: Book3S 64: Move hcall early register setup to KVM Nicholas Piggin
2021-03-12 5:45 ` Daniel Axtens
2021-03-16 3:43 ` Nicholas Piggin [this message]
2021-03-05 15:06 ` [PATCH v3 13/41] KVM: PPC: Book3S 64: Move interrupt " Nicholas Piggin
2021-03-20 7:19 ` Alexey Kardashevskiy
2021-03-05 15:06 ` [PATCH v3 14/41] KVM: PPC: Book3S 64: move bad_host_intr check to HV handler Nicholas Piggin
2021-03-20 9:07 ` Alexey Kardashevskiy
2021-03-22 3:18 ` Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 15/41] KVM: PPC: Book3S 64: Minimise hcall handler calling convention differences Nicholas Piggin
2021-03-22 2:09 ` Alexey Kardashevskiy
2021-03-22 4:06 ` Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 16/41] KVM: PPC: Book3S HV P9: Move radix MMU switching instructions together Nicholas Piggin
2021-03-22 4:24 ` Alexey Kardashevskiy
2021-03-22 5:25 ` Nicholas Piggin
2021-03-22 6:21 ` Alexey Kardashevskiy
2021-03-05 15:06 ` [PATCH v3 17/41] KVM: PPC: Book3S HV P9: implement kvmppc_xive_pull_vcpu in C Nicholas Piggin
2021-03-22 5:05 ` Alexey Kardashevskiy
2021-03-22 16:19 ` Cédric Le Goater
2021-03-22 18:13 ` Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 18/41] KVM: PPC: Book3S HV P9: Move xive vcpu context management into kvmhv_p9_guest_entry Nicholas Piggin
2021-03-22 5:30 ` Alexey Kardashevskiy
2021-03-05 15:06 ` [PATCH v3 19/41] KVM: PPC: Book3S HV P9: Stop handling hcalls in real-mode in the P9 path Nicholas Piggin
2021-03-17 16:22 ` Fabiano Rosas
2021-03-17 22:41 ` Nicholas Piggin
2021-03-22 16:12 ` Cédric Le Goater
2021-03-22 7:30 ` Alexey Kardashevskiy
2021-03-22 13:15 ` Nicholas Piggin
2021-03-22 16:01 ` Cédric Le Goater
2021-03-22 18:22 ` Nicholas Piggin
2021-03-23 7:26 ` Cédric Le Goater
2021-03-05 15:06 ` [PATCH v3 20/41] KVM: PPC: Book3S HV P9: Move setting HDEC after switching to guest LPCR Nicholas Piggin
2021-03-08 17:52 ` Fabiano Rosas
2021-03-22 8:39 ` Alexey Kardashevskiy
2021-03-22 13:24 ` Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 21/41] KVM: PPC: Book3S HV P9: Use large decrementer for HDEC Nicholas Piggin
2021-03-22 7:58 ` Alexey Kardashevskiy
2021-03-05 15:06 ` [PATCH v3 22/41] KVM: PPC: Book3S HV P9: Use host timer accounting to avoid decrementer read Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 23/41] KVM: PPC: Book3S HV P9: Reduce mftb per guest entry/exit Nicholas Piggin
2021-03-12 12:55 ` Fabiano Rosas
2021-03-05 15:06 ` [PATCH v3 24/41] powerpc: add set_dec_or_work API for safely updating decrementer Nicholas Piggin
2021-03-22 9:38 ` Alexey Kardashevskiy
2021-03-05 15:06 ` [PATCH v3 25/41] KVM: PPC: Book3S HV P9: Reduce irq_work vs guest decrementer races Nicholas Piggin
2021-03-23 1:43 ` Alexey Kardashevskiy
2021-03-05 15:06 ` [PATCH v3 26/41] KVM: PPC: Book3S HV P9: Implement the rest of the P9 path in C Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 27/41] KVM: PPC: Book3S HV P9: inline kvmhv_load_hv_regs_and_go into __kvmhv_vcpu_entry_p9 Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 28/41] KVM: PPC: Book3S HV P9: Read machine check registers while MSR[RI] is 0 Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 29/41] KVM: PPC: Book3S HV P9: Improve exit timing accounting coverage Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 30/41] KVM: PPC: Book3S HV P9: Move SPR loading after expiry time check Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 31/41] KVM: PPC: Book3S HV P9: Add helpers for OS SPR handling Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 32/41] KVM: PPC: Book3S HV P9: Switch to guest MMU context as late as possible Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 33/41] KVM: PPC: Book3S HV: Implement radix prefetch workaround by disabling MMU Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 34/41] KVM: PPC: Book3S HV: Remove support for dependent threads mode on P9 Nicholas Piggin
2021-03-17 15:11 ` Aneesh Kumar K.V
2021-03-22 3:27 ` Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 35/41] KVM: PPC: Book3S HV: Remove radix guest support from P7/8 path Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 36/41] KVM: PPC: Book3S HV P9: Allow all P9 processors to enable nested HV Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 37/41] KVM: PPC: Book3S HV: small pseries_do_hcall cleanup Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 38/41] KVM: PPC: Book3S HV: add virtual mode handlers for HPT hcalls and page faults Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 39/41] KVM: PPC: Book3S HV P9: implement hash guest support Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 40/41] KVM: PPC: Book3S HV P9: implement hash host / " Nicholas Piggin
2021-03-05 15:06 ` [PATCH v3 41/41] KVM: PPC: Book3S HV: remove ISA v3.0 and v3.1 support from P7/8 path Nicholas Piggin
2021-03-16 6:06 ` [PATCH v3 00/41] KVM: PPC: Book3S: C-ify the P9 entry/exit code Nicholas Piggin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1615862463.zij1m644om.astroid@bobo.none \
--to=npiggin@gmail.com \
--cc=dja@axtens.net \
--cc=kvm-ppc@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).