diff --git a/payloads/libpayload/arch/arm64/head.S b/payloads/libpayload/arch/arm64/head.S index 0ebadeae34..5fc7ef2967 100644 --- a/payloads/libpayload/arch/arm64/head.S +++ b/payloads/libpayload/arch/arm64/head.S @@ -37,6 +37,13 @@ ENTRY(_entry) ldr w1, =(SCTLR_RES1 | SCTLR_I | SCTLR_SA) msr sctlr_el2, x1 + /* Initialize HCR to intended state (route all exceptions to EL2) */ + mov x1, #HCR_TGE + msr hcr_el2, x1 + + /* Initialize PSTATE.DAIF to intended state (unmask all exceptions) */ + msr DAIFClr, #0xf + /* Save off the location of the coreboot tables */ ldr x1, 1f str x0, [x1] diff --git a/payloads/libpayload/include/arm64/arch/lib_helpers.h b/payloads/libpayload/include/arm64/arch/lib_helpers.h index c086098da0..fd4ff9e3fc 100644 --- a/payloads/libpayload/include/arm64/arch/lib_helpers.h +++ b/payloads/libpayload/include/arm64/arch/lib_helpers.h @@ -45,6 +45,8 @@ #define SCTLR_RES1 ((0x3 << 4) | (0x1 << 11) | (0x1 << 16) | \ (0x1 << 18) | (0x3 << 22) | (0x3 << 28)) +#define HCR_TGE (1 << 27) /* Trap General Exception */ + #define DAIF_DBG_BIT (1 << 3) #define DAIF_ABT_BIT (1 << 2) #define DAIF_IRQ_BIT (1 << 1)