All of lore.kernel.org
 help / color / mirror / Atom feed
From: Aravinda Prasad <aravinda@linux.vnet.ibm.com>
To: David Gibson <david@gibson.dropbear.id.au>
Cc: qemu-ppc@nongnu.org, benh@au1.ibm.com, aik@au1.ibm.com,
	qemu-devel@nongnu.org, paulus@samba.org
Subject: Re: [Qemu-devel] [PATCH 4/5] target-ppc: Handle ibm, nmi-register RTAS call
Date: Tue, 26 Aug 2014 12:27:55 +0530	[thread overview]
Message-ID: <53FC2FF3.30503@linux.vnet.ibm.com> (raw)
In-Reply-To: <20140826060255.GR9923@voom.redhat.com>



On Tuesday 26 August 2014 11:32 AM, David Gibson wrote:
> On Mon, Aug 25, 2014 at 07:15:45PM +0530, Aravinda Prasad wrote:
>> This patch adds FWNMI support in qemu for powerKVM
>> guests by handling the ibm,nmi-register rtas call.
>> Whenever OS issues ibm,nmi-register RTAS call, the
>> machine check notification address is saved and the
>> machine check interrupt vector 0x200 is patched to
>> issue a private hcall.
>>
>> Signed-off-by: Aravinda Prasad <aravinda@linux.vnet.ibm.com>
>> ---
>>  hw/ppc/spapr_rtas.c    |   91 ++++++++++++++++++++++++++++++++++++++++++++++++
>>  include/hw/ppc/spapr.h |    8 ++++
>>  2 files changed, 98 insertions(+), 1 deletion(-)
>>
>> diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
>> index 02ddbf9..1135d2b 100644
>> --- a/hw/ppc/spapr_rtas.c
>> +++ b/hw/ppc/spapr_rtas.c
>> @@ -277,6 +277,91 @@ static void rtas_ibm_set_system_parameter(PowerPCCPU *cpu,
>>      rtas_st(rets, 0, ret);
>>  }
>>  
>> +static void rtas_ibm_nmi_register(PowerPCCPU *cpu,
>> +                                  sPAPREnvironment *spapr,
>> +                                  uint32_t token, uint32_t nargs,
>> +                                  target_ulong args,
>> +                                  uint32_t nret, target_ulong rets)
>> +{
>> +    int i;
>> +    uint32_t branch_inst = 0x48000002;
>> +    target_ulong guest_machine_check_addr;
>> +    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
>> +    /*
>> +     * Trampoline saves r3 in sprg2 and issues private hcall
>> +     * to request qemu to build error log. QEMU builds the
>> +     * error log, copies to rtas-blob and returns the address.
>> +     * The initial 16 bytes in rtas-blob consists of saved srr0
>> +     * and srr1 which we restore and pass on the actual error
>> +     * log address to OS handled mcachine check notification
>> +     * routine
>> +     */
>> +    uint32_t trampoline[] = {
>> +        0x7c7243a6,    /* mtspr   SPRN_SPRG2,r3 */
>> +        0x38600000,    /* li      r3,0   */
>> +        /* 0xf004 is the KVMPPC_H_REPORT_ERR private HCALL */
> 
> You should construct the instruction from the KVMPPC_H_REPORT_ERR
> constant, otherwise it's an undocumented magic dependency between
> parts of the code.

hmm.. yes. will do

> 
>> +        0x6063f004,    /* ori     r3,r3,f004  */
>> +        /* Issue H_CALL */
>> +        0x44000022,    /*  sc      1     */
>> +        0x7c9243a6,    /* mtspr r4 sprg2 */
>> +        0xe8830000,    /* ld r4, 0(r3) */
>> +        0x7c9a03a6,    /* mtspr r4, srr0 */
>> +        0xe8830008,    /* ld r4, 8(r3) */
>> +        0x7c9b03a6,    /* mtspr r4, srr1 */
>> +        0x38630010,    /* addi r3,r3,16 */
>> +        0x7c9242a6,    /* mfspr r4 sprg2 */
>> +        0x48000002,    /* Branch to address registered
>> +                        * by OS. The branch address is
>> +                        * patched below */
>> +        0x48000000,    /* b . */
>> +    };
>> +    int total_inst = sizeof(trampoline) / sizeof(uint32_t);
>> +
>> +    /* Store the system reset and machine check address */
>> +    guest_machine_check_addr = rtas_ld(args, 1);
>> +
>> +    /* Safety Check */
>> +    if (sizeof(trampoline) >= MC_INTERRUPT_VECTOR_SIZE) {
>> +        fprintf(stderr, "Unable to register ibm,nmi_register: "
>> +                "Trampoline size exceeded\n");
>> +        rtas_st(rets, 0, RTAS_OUT_NOT_SUPPORTED);
>> +        return;
> 
> The guest has absolutely no influence over this, so this should be an
> assert() rather than returning an rtas error.  Or better yet, detect
> the failure at compile time, since it doesn't depend on anything
> runtime either.

yes better to detect at compile time.

> 
>> +    }
>> +
>> +    /*
>> +     * Update the branch instruction in trampoline with the absolute
>> +     * machine check address requested by OS
>> +     */
>> +    branch_inst |= guest_machine_check_addr;
> 
> Surely there should be some sanity checking of the address here, or it
> can clobber any part of that branch instruction.

Will include a check to make sure instruction opcode is not clobbered.

> 
>> +    memcpy(&trampoline[11], &branch_inst, sizeof(branch_inst));
>> +
>> +    /* Handle all Host/Guest LE/BE combinations */
>> +    if ((*pcc->interrupts_big_endian)(cpu)) {
>> +        for (i = 0; i < total_inst; i++) {
>> +            trampoline[i] = cpu_to_be32(trampoline[i]);
>> +        }
>> +    } else {
>> +        for (i = 0; i < total_inst; i++) {
>> +            trampoline[i] = cpu_to_le32(trampoline[i]);
>> +        }
>> +    }
>> +
>> +    /* Patch 0x200 NMI interrupt vector memory area of guest */
>> +    cpu_physical_memory_write(MC_INTERRUPT_VECTOR, trampoline,
>> +                              sizeof(trampoline));
>> +
>> +    rtas_st(rets, 0, RTAS_OUT_SUCCESS);
>> +}
>> +
>> +static void rtas_ibm_nmi_interlock(PowerPCCPU *cpu,
>> +                                   sPAPREnvironment *spapr,
>> +                                   uint32_t token, uint32_t nargs,
>> +                                   target_ulong args,
>> +                                   uint32_t nret, target_ulong rets)
>> +{
>> +    rtas_st(rets, 0, RTAS_OUT_SUCCESS);
>> +}
>> +
> 
> This nmi_interlock call isn't described in the commit message.

Yes. will include

Regards,
Aravinda

> 

-- 
Regards,
Aravinda

  reply	other threads:[~2014-08-26  6:58 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-25 13:45 [Qemu-devel] [PATCH 0/5] target-ppc: Add FWNMI support in QEMU for powerKVM guests Aravinda Prasad
2014-08-25 13:45 ` [Qemu-devel] [PATCH 1/5] target-ppc: Extend rtas-blob Aravinda Prasad
2014-08-26  5:38   ` David Gibson
2014-08-26  6:34     ` Aravinda Prasad
2014-08-26  7:24       ` David Gibson
2014-08-28 10:40   ` [Qemu-devel] [Qemu-ppc] " Alexander Graf
2014-08-28 18:20     ` Aravinda Prasad
2014-08-28 22:18       ` Alexander Graf
2014-08-28 22:25         ` Benjamin Herrenschmidt
2014-08-29  0:40           ` Alexander Graf
2014-08-29  1:06             ` Benjamin Herrenschmidt
2014-08-29  1:33               ` Alexander Graf
2014-08-29  2:42                 ` Benjamin Herrenschmidt
2014-08-29  3:46                 ` David Gibson
2014-08-29  3:47         ` David Gibson
2014-09-01  7:46   ` [Qemu-devel] " Alexey Kardashevskiy
2014-09-01 11:23     ` Aravinda Prasad
2014-09-02  4:09       ` Alexey Kardashevskiy
2014-09-02  5:25         ` Aravinda Prasad
2014-09-02  5:49           ` Alexey Kardashevskiy
2014-09-02  5:56             ` Aravinda Prasad
2014-09-02  6:34               ` Alexey Kardashevskiy
2014-09-02  7:07                 ` Aravinda Prasad
2014-09-02  8:40                   ` Alexey Kardashevskiy
2014-09-02  9:30                     ` Aravinda Prasad
2014-09-02 13:17                       ` Alexey Kardashevskiy
2014-08-25 13:45 ` [Qemu-devel] [PATCH 2/5] target-ppc: Register and handle HCALL to receive updated RTAS region Aravinda Prasad
2014-08-26  5:39   ` David Gibson
2014-08-26  6:15     ` Benjamin Herrenschmidt
2014-08-26  7:24       ` David Gibson
2014-08-26 20:05         ` Benjamin Herrenschmidt
2014-08-25 13:45 ` [Qemu-devel] [PATCH 3/5] target-ppc: Build error log Aravinda Prasad
2014-08-26  5:47   ` David Gibson
2014-08-26  6:40     ` Aravinda Prasad
2014-08-27  9:50   ` [Qemu-devel] [Qemu-ppc] " Alexander Graf
2014-08-28  6:12     ` Aravinda Prasad
2014-08-28  8:36       ` Alexander Graf
2014-08-28 10:21         ` Benjamin Herrenschmidt
2014-08-28 10:29           ` Alexander Graf
2014-08-28 10:33             ` Benjamin Herrenschmidt
2014-08-28 10:34               ` Benjamin Herrenschmidt
2014-08-28 17:17               ` Aravinda Prasad
2014-08-28 20:07                 ` Benjamin Herrenschmidt
2014-08-30  8:06                   ` Aravinda Prasad
2014-08-25 13:45 ` [Qemu-devel] [PATCH 4/5] target-ppc: Handle ibm, nmi-register RTAS call Aravinda Prasad
2014-08-26  6:02   ` David Gibson
2014-08-26  6:57     ` Aravinda Prasad [this message]
2014-08-27 10:37   ` [Qemu-devel] [Qemu-ppc] " Alexander Graf
2014-08-28  6:38     ` Aravinda Prasad
2014-08-28  8:37       ` Alexander Graf
2014-08-28 13:06         ` Tom Musta
2014-08-28 13:11           ` Alexander Graf
2014-08-28 17:42         ` Aravinda Prasad
2014-08-28 22:16           ` Alexander Graf
2014-08-30  8:08             ` Aravinda Prasad
2014-09-04  8:25             ` Aravinda Prasad
2014-09-04 13:09               ` Alexander Graf
2014-09-04 13:49                 ` Aravinda Prasad
2014-09-05  8:46                   ` Alexander Graf
2014-09-05  8:52                     ` Aravinda Prasad
2014-09-07 20:47   ` Alexander Graf
2014-09-26  3:58     ` Alexey Kardashevskiy
2014-10-06  6:32     ` Aravinda Prasad
2014-10-06  9:40       ` Alexander Graf
2014-10-06 11:01         ` Aravinda Prasad
2014-08-25 13:45 ` [Qemu-devel] [PATCH 5/5] target-ppc: Handle cases when multi-processors get machine-check Aravinda Prasad
2014-08-26  6:04   ` David Gibson
2014-08-26  7:04     ` Aravinda Prasad
2014-08-27 10:40   ` [Qemu-devel] [Qemu-ppc] " Alexander Graf
2014-08-28  6:56     ` Aravinda Prasad
2014-08-28  8:39       ` Alexander Graf
2014-08-28  8:42       ` Alexander Graf
2014-08-28 17:45         ` Aravinda Prasad

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=53FC2FF3.30503@linux.vnet.ibm.com \
    --to=aravinda@linux.vnet.ibm.com \
    --cc=aik@au1.ibm.com \
    --cc=benh@au1.ibm.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=paulus@samba.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.