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 3/5] target-ppc: Build error log
Date: Tue, 26 Aug 2014 12:10:04 +0530 [thread overview]
Message-ID: <53FC2BC4.7010002@linux.vnet.ibm.com> (raw)
In-Reply-To: <20140826054715.GQ9923@voom.redhat.com>
On Tuesday 26 August 2014 11:17 AM, David Gibson wrote:
> On Mon, Aug 25, 2014 at 07:15:35PM +0530, Aravinda Prasad wrote:
>> Whenever there is a physical memory error due to bit
>> flips, which cannot be corrected by hardware, the error
>> is passed on to the kernel. If the memory address in
>> error belongs to guest address space then guest kernel
>> is responsible to take action. Hence the error is passed
>> on to guest via KVM by invoking 0x200 NMI vector.
>>
>> However, guest OS, as per PAPR, expects an error log
>> upon such error. This patch registers a new hcall
>> which is issued from 0x200 interrupt vector and builds
>> the error log, copies the error log to rtas space and
>> passes the address of the error log to guest
>>
>> Enhancement to KVM to perform above functionality is
>> already in upstream kernel.
>>
>> Signed-off-by: Aravinda Prasad <aravinda@linux.vnet.ibm.com>
>> ---
>> hw/ppc/spapr_hcall.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++++
>> include/hw/ppc/spapr.h | 4 +
>> 2 files changed, 150 insertions(+), 1 deletion(-)
>>
>> diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
>> index 118ee77..be063f4 100644
>> --- a/hw/ppc/spapr_hcall.c
>> +++ b/hw/ppc/spapr_hcall.c
>> @@ -14,6 +14,86 @@ struct SPRSyncState {
>> target_ulong mask;
>> };
>>
>> +#define SEVERITY_SHIFT 0x5
>> +#define DISPOSITION_SHIFT 0x3
>> +#define INITIATOR_SHIFT 0x4
>> +
>> +/*
>> + * Only required RTAS event severity, disposition, initiator
>> + * target and type are copied from arch/powerpc/include/asm/rtas.h
>> + */
>> +
>> +/* RTAS event severity */
>> +#define RTAS_SEVERITY_ERROR_SYNC 0x3
>> +
>> +/* RTAS event disposition */
>> +#define RTAS_DISP_NOT_RECOVERED 0x2
>> +
>> +/* RTAS event initiator */
>> +#define RTAS_INITIATOR_MEMORY 0x4
>> +
>> +/* RTAS event target */
>> +#define RTAS_TARGET_MEMORY 0x4
>> +
>> +/* RTAS event type */
>> +#define RTAS_TYPE_ECC_UNCORR 0x09
>> +
>> +/*
>> + * Currently KVM only passes on the uncorrected machine
>> + * check memory error to guest. Other machine check errors
>> + * such as SLB multi-hit and TLB multi-hit are recovered
>> + * in KVM and are not passed on to guest.
>> + *
>> + * DSISR Bit for uncorrected machine check error. Copied
>> + * from arch/powerpc/include/asm/mce.h
>> + */
>> +#define PPC_BITLSHIFT(be) (64 - 1 - (be))
>> +#define PPC_BIT(bit) (1UL << PPC_BITLSHIFT(bit))
>
> Just opencode the BITLSHIFT macro into the BIT macro, it doesn't
> improve either brevity or clarity as it is.
>
> Or alternatively define PPC_BIT as (0x8000000000000000ULL >> bit)
> which might be clearer.
sure.
Regards,
Aravinda
>
>> +#define P7_DSISR_MC_UE (PPC_BIT(48)) /* P8 too */
>> +
>> +/* Adopted from kernel source arch/powerpc/include/asm/rtas.h */
>> +struct rtas_error_log {
>> + /* Byte 0 */
>> + uint8_t byte0; /* Architectural version */
>> +
>> + /* Byte 1 */
>> + uint8_t byte1;
>> + /* XXXXXXXX
>> + * XXX 3: Severity level of error
>> + * XX 2: Degree of recovery
>> + * X 1: Extended log present?
>> + * XX 2: Reserved
>> + */
>> +
>> + /* Byte 2 */
>> + uint8_t byte2;
>> + /* XXXXXXXX
>> + * XXXX 4: Initiator of event
>> + * XXXX 4: Target of failed operation
>> + */
>> + uint8_t byte3; /* General event or error*/
>> +};
>> +
>> +/*
>> + * Data format in RTAS-Blob
>> + *
>> + * This structure contains error information related to Machine
>> + * Check exception. This is filled up and copied to rtas-blob
>> + * upon machine check exception.
>> + */
>> +struct rtas_mc_log {
>> + target_ulong srr0;
>> + target_ulong srr1;
>> + /*
>> + * Beginning of error log address. This is properly
>> + * populated and passed on to OS registered machine
>> + * check notification routine upon machine check
>> + * exception
>> + */
>> + target_ulong r3;
>> + struct rtas_error_log err_log;
>> +};
>> +
>> static void do_spr_sync(void *arg)
>> {
>> struct SPRSyncState *s = arg;
>> @@ -586,6 +666,72 @@ static target_ulong h_rtas_update(PowerPCCPU *cpu, sPAPREnvironment *spapr,
>> return 0;
>> }
>>
>> +static target_ulong h_report_mc_err(PowerPCCPU *cpu, sPAPREnvironment *spapr,
>> + target_ulong opcode, target_ulong *args)
>> +{
>> + struct rtas_mc_log mc_log;
>> + CPUPPCState *env = &cpu->env;
>> + PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
>> +
>> + /*
>> + * We save the original r3 register in SPRG2 in 0x200 vector,
>> + * which is patched during call to ibm.nmi-register. Original
>> + * r3 is required to be included in error log
>> + */
>> + mc_log.r3 = env->spr[SPR_SPRG2];
>> +
>> + /*
>> + * SRR0 and SRR1 contains nip and msr at the time of exception
>> + * and are clobbered when we return from this hcall
>> + * and hence need to be properly restored. We save srr0
>> + * and srr1 in rtas blob and restore it in 0x200 vector
>> + * before branching to OS registered machine check handler
>> + */
>> + mc_log.srr0 = env->spr[SPR_SRR0];
>> + mc_log.srr1 = env->spr[SPR_SRR1];
>> +
>> + /* Set error log fields */
>> + mc_log.err_log.byte0 = 0x00;
>> + mc_log.err_log.byte1 = (RTAS_SEVERITY_ERROR_SYNC << SEVERITY_SHIFT);
>> + mc_log.err_log.byte1 |= (RTAS_DISP_NOT_RECOVERED << DISPOSITION_SHIFT);
>> + mc_log.err_log.byte2 = (RTAS_INITIATOR_MEMORY << INITIATOR_SHIFT);
>> + mc_log.err_log.byte2 |= RTAS_TARGET_MEMORY;
>> +
>> + if (env->spr[SPR_DSISR] & P7_DSISR_MC_UE) {
>> + mc_log.err_log.byte3 = RTAS_TYPE_ECC_UNCORR;
>> + } else {
>> + mc_log.err_log.byte3 = 0x0;
>> + }
>> +
>> + /* Handle all Host/Guest LE/BE combinations */
>> + if ((*pcc->interrupts_big_endian)(cpu)) {
>> + mc_log.srr0 = cpu_to_be64(mc_log.srr0);
>> + mc_log.srr1 = cpu_to_be64(mc_log.srr1);
>> + mc_log.r3 = cpu_to_be64(mc_log.r3);
>> + } else {
>> + mc_log.srr0 = cpu_to_le64(mc_log.srr0);
>> + mc_log.srr1 = cpu_to_le64(mc_log.srr1);
>> + mc_log.r3 = cpu_to_le64(mc_log.r3);
>> + }
>> +
>> + cpu_physical_memory_write(spapr->rtas_addr, &mc_log,
>> + sizeof(mc_log));
>> +
>> + /*
>> + * spapr->rtas_addr now contains srr0, srr1, original r3, followed
>> + * by the error log structure. The address of the error log
>> + * should be passed on to guest's machine check notification
>> + * routine. As this hcall is directly called from 0x200 interrupt
>> + * vector and returns to assembly routine, we return spapr->rtas_addr
>> + * instead of H_SUCCESS. Upon return, We restore srr0 and srr1, increment
>> + * r3 to point to the error log and branch to machine check notification
>> + * routine in 0x200. r3 containing the error address is now argument
>> + * to OS registered machine check notification routine. This way we
>> + * also avoids clobbering additional registers in 0x200 vector.
>> + */
>> + return spapr->rtas_addr;
>> +}
>> +
>> static target_ulong h_logical_load(PowerPCCPU *cpu, sPAPREnvironment *spapr,
>> target_ulong opcode, target_ulong *args)
>> {
>> @@ -1011,6 +1157,7 @@ static void hypercall_register_types(void)
>> /* qemu/KVM-PPC specific hcalls */
>> spapr_register_hypercall(KVMPPC_H_RTAS, h_rtas);
>> spapr_register_hypercall(KVMPPC_H_RTAS_UPDATE, h_rtas_update);
>> + spapr_register_hypercall(KVMPPC_H_REPORT_MC_ERR, h_report_mc_err);
>>
>> spapr_register_hypercall(H_SET_MODE, h_set_mode);
>>
>> diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
>> index fb8cc63..57199f5 100644
>> --- a/include/hw/ppc/spapr.h
>> +++ b/include/hw/ppc/spapr.h
>> @@ -310,7 +310,9 @@ typedef struct sPAPREnvironment {
>> /* Client Architecture support */
>> #define KVMPPC_H_CAS (KVMPPC_HCALL_BASE + 0x2)
>> #define KVMPPC_H_RTAS_UPDATE (KVMPPC_HCALL_BASE + 0x3)
>> -#define KVMPPC_HCALL_MAX KVMPPC_H_RTAS_UPDATE
>> +/* Report Machine Check error */
>> +#define KVMPPC_H_REPORT_MC_ERR (KVMPPC_HCALL_BASE + 0x4)
>> +#define KVMPPC_HCALL_MAX KVMPPC_H_REPORT_MC_ERR
>>
>> extern sPAPREnvironment *spapr;
>>
>>
>>
>
--
Regards,
Aravinda
next prev parent reply other threads:[~2014-08-26 6:40 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 [this message]
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
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=53FC2BC4.7010002@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 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).