arm64: kernel: Prepare for a DISR user
KVM would like to consume any pending SError (or RAS error) after guest exit. Today it has to unmask SError and use dsb+isb to synchronise the CPU. With the RAS extensions we can use ESB to synchronise any pending SError. Add the necessary macros to allow DISR to be read and converted to an ESR. We clear the DISR register when we enable the RAS cpufeature, and the kernel has not executed any ESB instructions. Any value we find in DISR must have belonged to firmware. Executing an ESB instruction is the only way to update DISR, so we can expect firmware to have handled any deferred SError. By the same logic we clear DISR in the idle path. Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com> Signed-off-by: James Morse <james.morse@arm.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:

committed by
Catalin Marinas

parent
f751daa4f9
commit
68ddbf09ec
@@ -18,6 +18,8 @@
|
||||
#ifndef __ASM_EXCEPTION_H
|
||||
#define __ASM_EXCEPTION_H
|
||||
|
||||
#include <asm/esr.h>
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#define __exception __attribute__((section(".exception.text")))
|
||||
@@ -27,4 +29,16 @@
|
||||
#define __exception_irq_entry __exception
|
||||
#endif
|
||||
|
||||
static inline u32 disr_to_esr(u64 disr)
|
||||
{
|
||||
unsigned int esr = ESR_ELx_EC_SERROR << ESR_ELx_EC_SHIFT;
|
||||
|
||||
if ((disr & DISR_EL1_IDS) == 0)
|
||||
esr |= (disr & DISR_EL1_ESR_MASK);
|
||||
else
|
||||
esr |= (disr & ESR_ELx_ISS_MASK);
|
||||
|
||||
return esr;
|
||||
}
|
||||
|
||||
#endif /* __ASM_EXCEPTION_H */
|
||||
|
Reference in New Issue
Block a user