Hi James.
   You are right. For the SEI case, the ESR_EL1 may not need to refer to 
ESR_EL2's value. 
   But for the SEA case, the ESR_EL1 may need to refer to ESR_EL2's value.
   For example, the 16bit/32bit instruction-length, it may needs to check the 
ESR_EL2's bit 25.
   Because when happen SEA, it jump to SEA vector table entry by software( 
after setting the elr_el2 and esr_el2, and use eret instruction to jump to the 
SEA vector table ), not by hardware(such as virtual SEI) 

> 
> Hi gengdongjiu,
> 
> On 24/07/17 16:24, gengdongjiu wrote:
> > From above description, in the firmware-first RAS solution, UEFI copy
> > the
> > ESR_EL3 to the ESR_EL2,
> 
> UEFI at EL3? Do you mean ATF? or some component of UEFI that got loaded into 
> secure-world to do the CPER record generation?
UEFI is firmware. Which is at EL3. Yes, it is ATF.

> 
> 
> > do you agree EL2 refer to the ESR_EL2 value to set the ESR_EL1 value
> > when inject the abort?
> 
> Refer-to: yes. It needs to honour any bits that are part of the guest state 
> that may be represented in the ESR.
> 
> This is what your KVM example is doing, but this is a pretty arcane path: If 
> on the 32bit kernel, we read/write or execute from an address
> whose stage 1 page-table-walk walks through a stage 2 mapping that is marked 
> as device memory, then we report this as an
> instruction/data abort to the guest, instead of resolving the stage2 mapping.
Yes, only report the instruction/data abort to the guest can be enough.


> 
> In this case we preserve the 16bit/32bit instruction-length value reported in 
> the ESR as its part of the guest state that would have been
> reported if the
> stage1 fault were delivered directly.

For the SEI case, the 16bit/32bit instruction-length does not need to passed.
But for the SEA, the 16bit/32bit instruction-length value may be need to pass, 
as you see below. It check(if (kvm_vcpu_trap_il_is32bit(vcpu)) ) and pass the 
ESR_ELx_IL


static void inject_abt64(struct kvm_vcpu *vcpu, bool is_iabt, unsigned long 
addr)
{
        unsigned long cpsr = *vcpu_cpsr(vcpu);
        bool is_aarch32 = vcpu_mode_is_32bit(vcpu);
        u32 esr = 0;

        *vcpu_elr_el1(vcpu) = *vcpu_pc(vcpu);
        *vcpu_pc(vcpu) = get_except_vector(vcpu, except_type_sync);

        *vcpu_cpsr(vcpu) = PSTATE_FAULT_BITS_64;
        *vcpu_spsr(vcpu) = cpsr;

        vcpu_sys_reg(vcpu, FAR_EL1) = addr;

        /*
         * Build an {i,d}abort, depending on the level and the
         * instruction set. Report an external synchronous abort.
         */
        if (kvm_vcpu_trap_il_is32bit(vcpu))
                esr |= ESR_ELx_IL;

        .......................................................................
}

> 
> 
> Is it valid to pass values from a host SError into a guest?
Do you mean pass the ESR value from host to guest?
And do you mean we should not pass ESR value when inject the SEI?

> For RAS on Linux+KVM, I don't think this is the right thing to do. If we 
> receive a RAS event, the host must completely process the error and
> notify any in-kernel users and userspace.
I agree, so deliver signal to user space such as QEMU is through memory failure 
for SEI? May be this can also suitable to no-KVM case.


> KVM shouldn't assume an SError is a firmware-first notification and that it 
> should pass the same notification into the guest.
"it should pass the same notification into the guest"-------what is the mean of 
the notification?

> 
> We need to think of SError (which may be the un-synchronizable kind from a 
> device), separately from SEI as a APEI notification. Even for
> device pass-through firmware-first errors may be reported by another 
> notification method. We shouldn't duplicate or break the
> functionality because the error wasn't reported by SEI.

> 
> I agree device pass-through is a special case where KVM is more like an 
> in-kernel user of the device. In this case I think we need the host's
> device driver, (there must be one, to at least reset the device) to check 
> that this RAS event hasn't broken the device's isolation. Is it still
> safe for the guest to access?
> e.g. With PCIe a Virtual-Function using SR-IOV may have had its BARs 
> corrupted.
> Allowing a guest to touch this device could compromise another guest, or the 
> host.
> 
> The SError ESR contains implementation-defined bits. I'm against giving these 
> bits to user-space as we don't know what they mean. KVM
> wants to provide an abstract machine, which we can migrated between hosts 
> running on different vendors platforms. With v8.2 SErrors are
> either the vanilla device kind, these only have an implementation-defined 
> ESR, we shouldn't give this to user space, or RAS errors, we
> shouldn't give these to user space either as code using this value won't work 
> if the APEI notification method isn't SEI.


SEA ESR:0x92000410
SEI ESR: 0xbf000006
As shown above, For example, when happen SEA, the ESR value is 0x92000410;  
when happen SEI, the ESR value is 0xbf000006.
So for above two cases, I want to consult with you what is the ESR value do you 
suggested to passed to the guest OS for above SEA and SEI ?


> 
> 
> The version of the RAS spec you refer to here is for partners implementing 
> CPUs, it describes what software might do, so that the CPU
> works well for different current (and future) operating systems. It isn't a 
> guide to what all software should do.
> 
> >> Variant: asynchronous External Abort with delegated exception
> >> handling The example above requires the hypervisor to know that it can 
> >> delegate the error exception to the OS using a virtual error
> interrupt.
> 
> We don't have delegated exception handling. The host may-or-may-not have an 
> SEA/SEI GHES notification, the guest may-or-may-not have a
> SEA/SEI GHES notification.
> 
> 
> 
> Thanks,
> 
> James
> IMPORTANT NOTICE: The contents of this email and any attachments are 
> confidential and may also be privileged. If you are not the
> intended recipient, please notify the sender immediately and do not disclose 
> the contents to any other person, use it for any purpose, or
> store or copy the information in any medium. Thank you.
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to