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