Patrick Georgi (pgeorgi@google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8798
-gerrit
commit fac8d6d1debb385f9bb7811cf51f7ec717ed5ac8 Author: HC Yen hc.yen@mediatek.com Date: Tue Jan 13 11:36:14 2015 +0800
libpayload arm64: Add helper functions with el argument
Allow read/write to registers at a given el. Also, make read/write registers at current el call this newly added function.
BRANCH=none BUG=none TEST=build and boot on mt8173-evb
Change-Id: Id69f0fdc07193c5c7e997712f0cd99de6f41510b Signed-off-by: Patrick Georgi pgeorgi@chromium.org Original-Commit-Id: c091917babc39d9ab997f51f81b486c9aa900c24 Original-Change-Id: I0944946642066b88331e497a92388e74e86902d0 Original-Signed-off-by: HC Yen hc.yen@mediatek.com Original-Reviewed-on: https://chromium-review.googlesource.com/240322 Original-Reviewed-by: Aaron Durbin adurbin@chromium.org --- payloads/libpayload/arch/arm64/lib/pstate.c | 32 +++- payloads/libpayload/arch/arm64/lib/sysctrl.c | 208 ++++++++++++++++++--- payloads/libpayload/arch/arm64/lib/tlb.c | 16 +- .../libpayload/include/arm64/arch/lib_helpers.h | 107 +++++++---- 4 files changed, 292 insertions(+), 71 deletions(-)
diff --git a/payloads/libpayload/arch/arm64/lib/pstate.c b/payloads/libpayload/arch/arm64/lib/pstate.c index 27554f7..3215607 100644 --- a/payloads/libpayload/arch/arm64/lib/pstate.c +++ b/payloads/libpayload/arch/arm64/lib/pstate.c @@ -179,12 +179,24 @@ void raw_write_elr_el3(uint64_t elr_el3)
uint64_t raw_read_elr_current(void) { - SWITCH_CASE_READ(raw_read_elr,elr,uint64_t); + uint32_t el = get_current_el(); + return raw_read_elr(el); }
void raw_write_elr_current(uint64_t elr) { - SWITCH_CASE_WRITE(raw_write_elr,elr); + uint32_t el = get_current_el(); + raw_write_elr(elr, el); +} + +uint64_t raw_read_elr(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_elr, elr, uint64_t, el); +} + +void raw_write_elr(uint64_t elr, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_elr, elr, el); }
/* FPCR */ @@ -380,12 +392,24 @@ void raw_write_spsr_el3(uint32_t spsr_el3)
uint32_t raw_read_spsr_current(void) { - SWITCH_CASE_READ(raw_read_spsr,spsr,uint32_t); + uint32_t el = get_current_el(); + return raw_read_spsr(el); }
void raw_write_spsr_current(uint32_t spsr) { - SWITCH_CASE_WRITE(raw_write_spsr,spsr); + uint32_t el = get_current_el(); + raw_write_spsr(spsr, el); +} + +uint32_t raw_read_spsr(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_spsr, spsr, uint32_t, el); +} + +void raw_write_spsr(uint32_t spsr, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_spsr, spsr, el); }
uint32_t raw_read_spsr_fiq(void) diff --git a/payloads/libpayload/arch/arm64/lib/sysctrl.c b/payloads/libpayload/arch/arm64/lib/sysctrl.c index 13c9309..c9d80ff 100644 --- a/payloads/libpayload/arch/arm64/lib/sysctrl.c +++ b/payloads/libpayload/arch/arm64/lib/sysctrl.c @@ -80,12 +80,24 @@ void raw_write_actlr_el3(uint32_t actlr_el3)
uint32_t raw_read_actlr_current(void) { - SWITCH_CASE_READ(raw_read_actlr,actlr,uint32_t); + uint32_t el = get_current_el(); + return raw_read_actlr(el); }
void raw_write_actlr_current(uint32_t actlr) { - SWITCH_CASE_WRITE(raw_write_actlr,actlr); + uint32_t el = get_current_el(); + raw_write_actlr(actlr, el); +} + +uint32_t raw_read_actlr(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_actlr, actlr, uint32_t, el); +} + +void raw_write_actlr(uint32_t actlr, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_actlr, actlr, el); }
/* AFSR0 */ @@ -133,12 +145,24 @@ void raw_write_afsr0_el3(uint32_t afsr0_el3)
uint32_t raw_read_afsr0_current(void) { - SWITCH_CASE_READ(raw_read_afsr0,afsr0,uint32_t); + uint32_t el = get_current_el(); + return raw_read_afsr0(el); }
void raw_write_afsr0_current(uint32_t afsr0) { - SWITCH_CASE_WRITE(raw_write_afsr0,afsr0); + uint32_t el = get_current_el(); + raw_write_afsr0(afsr0, el); +} + +uint32_t raw_read_afsr0(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_afsr0, afsr0, uint32_t, el); +} + +void raw_write_afsr0(uint32_t afsr0, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_afsr0, afsr0, el); }
/* AFSR1 */ @@ -186,12 +210,24 @@ void raw_write_afsr1_el3(uint32_t afsr1_el3)
uint32_t raw_read_afsr1_current(void) { - SWITCH_CASE_READ(raw_read_afsr1,afsr1,uint32_t); + uint32_t el = get_current_el(); + return raw_read_afsr1(el); }
void raw_write_afsr1_current(uint32_t afsr1) { - SWITCH_CASE_WRITE(raw_write_afsr1,afsr1); + uint32_t el = get_current_el(); + raw_write_afsr1(afsr1, el); +} + +uint32_t raw_read_afsr1(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_afsr1, afsr1, uint32_t, el); +} + +void raw_write_afsr1(uint32_t afsr1, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_afsr1, afsr1, el); }
/* AIDR */ @@ -249,12 +285,24 @@ void raw_write_amair_el3(uint64_t amair_el3)
uint64_t raw_read_amair_current(void) { - SWITCH_CASE_READ(raw_read_amair,amair,uint64_t); + uint32_t el = get_current_el(); + return raw_read_amair(el); }
void raw_write_amair_current(uint64_t amair) { - SWITCH_CASE_WRITE(raw_write_amair,amair); + uint32_t el = get_current_el(); + raw_write_amair(amair, el); +} + +uint64_t raw_read_amair(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_amair, amair, uint64_t, el); +} + +void raw_write_amair(uint64_t amair, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_amair, amair, el); }
/* CCSIDR */ @@ -391,12 +439,24 @@ void raw_write_esr_el3(uint32_t esr_el3)
uint32_t raw_read_esr_current(void) { - SWITCH_CASE_READ(raw_read_esr,esr,uint32_t); + uint32_t el = get_current_el(); + return raw_read_esr(el); }
void raw_write_esr_current(uint32_t esr) { - SWITCH_CASE_WRITE(raw_write_esr,esr); + uint32_t el = get_current_el(); + raw_write_esr(esr, el); +} + +uint32_t raw_read_esr(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_esr, esr, uint32_t, el); +} + +void raw_write_esr(uint32_t esr, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_esr, esr, el); }
/* FAR */ @@ -444,12 +504,24 @@ void raw_write_far_el3(uint64_t far_el3)
uint64_t raw_read_far_current(void) { - SWITCH_CASE_READ(raw_read_far,far,uint64_t); + uint32_t el = get_current_el(); + return raw_read_far(el); }
void raw_write_far_current(uint64_t far) { - SWITCH_CASE_WRITE(raw_write_far,far); + uint32_t el = get_current_el(); + raw_write_far(far, el); +} + +uint64_t raw_read_far(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_far, far, uint64_t, el); +} + +void raw_write_far(uint64_t far, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_far, far, el); }
/* HCR */ @@ -522,12 +594,24 @@ void raw_write_mair_el3(uint64_t mair_el3)
uint64_t raw_read_mair_current(void) { - SWITCH_CASE_READ(raw_read_mair,mair,uint64_t); + uint32_t el = get_current_el(); + return raw_read_mair(el); }
void raw_write_mair_current(uint64_t mair) { - SWITCH_CASE_WRITE(raw_write_mair,mair); + uint32_t el = get_current_el(); + raw_write_mair(mair, el); +} + +uint64_t raw_read_mair(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_mair, mair, uint64_t, el); +} + +void raw_write_mair(uint64_t mair, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_mair, mair, el); }
/* MPIDR */ @@ -585,12 +669,24 @@ void raw_write_rmr_el3(uint32_t rmr_el3)
uint32_t raw_read_rmr_current(void) { - SWITCH_CASE_READ(raw_read_rmr,rmr,uint32_t); + uint32_t el = get_current_el(); + return raw_read_rmr(el); }
void raw_write_rmr_current(uint32_t rmr) { - SWITCH_CASE_WRITE(raw_write_rmr,rmr); + uint32_t el = get_current_el(); + raw_write_rmr(rmr, el); +} + +uint32_t raw_read_rmr(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_rmr, rmr, uint32_t, el); +} + +void raw_write_rmr(uint32_t rmr, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_rmr, rmr, el); }
/* RVBAR */ @@ -638,12 +734,24 @@ void raw_write_rvbar_el3(uint64_t rvbar_el3)
uint64_t raw_read_rvbar_current(void) { - SWITCH_CASE_READ(raw_read_rvbar,rvbar,uint64_t); + uint32_t el = get_current_el(); + return raw_read_rvbar(el); }
void raw_write_rvbar_current(uint64_t rvbar) { - SWITCH_CASE_WRITE(raw_write_rvbar,rvbar); + uint32_t el = get_current_el(); + raw_write_rvbar(rvbar, el); +} + +uint64_t raw_read_rvbar(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_rvbar, rvbar, uint64_t, el); +} + +void raw_write_rvbar(uint64_t rvbar, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_rvbar, rvbar, el); }
/* SCR */ @@ -706,12 +814,24 @@ void raw_write_sctlr_el3(uint32_t sctlr_el3)
uint32_t raw_read_sctlr_current(void) { - SWITCH_CASE_READ(raw_read_sctlr,sctlr,uint32_t); + uint32_t el = get_current_el(); + return raw_read_sctlr(el); }
void raw_write_sctlr_current(uint32_t sctlr) { - SWITCH_CASE_WRITE(raw_write_sctlr,sctlr); + uint32_t el = get_current_el(); + raw_write_sctlr(sctlr, el); +} + +uint32_t raw_read_sctlr(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_sctlr, sctlr, uint32_t, el); +} + +void raw_write_sctlr(uint32_t sctlr, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_sctlr, sctlr, el); }
/* TCR */ @@ -759,12 +879,24 @@ void raw_write_tcr_el3(uint32_t tcr_el3)
uint64_t raw_read_tcr_current(void) { - SWITCH_CASE_READ(raw_read_tcr, tcr, uint64_t); + uint32_t el = get_current_el(); + return raw_read_tcr(el); }
void raw_write_tcr_current(uint64_t tcr) { - SWITCH_CASE_WRITE(raw_write_tcr, tcr); + uint32_t el = get_current_el(); + raw_write_tcr(tcr, el); +} + +uint64_t raw_read_tcr(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_tcr, tcr, uint64_t, el); +} + +void raw_write_tcr(uint64_t tcr, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_tcr, tcr, el); }
/* TTBR0 */ @@ -812,12 +944,24 @@ void raw_write_ttbr0_el3(uint64_t ttbr0_el3)
uint64_t raw_read_ttbr0_current(void) { - SWITCH_CASE_READ(raw_read_ttbr0,ttbr0,uint64_t); + uint32_t el = get_current_el(); + return raw_read_ttbr0(el); }
void raw_write_ttbr0_current(uint64_t ttbr0) { - SWITCH_CASE_WRITE(raw_write_ttbr0,ttbr0); + uint32_t el = get_current_el(); + raw_write_ttbr0(ttbr0, el); +} + +uint64_t raw_read_ttbr0(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_ttbr0, ttbr0, uint64_t, el); +} + +void raw_write_ttbr0(uint64_t ttbr0, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_ttbr0, ttbr0, el); }
/* TTBR1 */ @@ -880,10 +1024,22 @@ void raw_write_vbar_el3(uint64_t vbar_el3)
uint64_t raw_read_vbar_current(void) { - SWITCH_CASE_READ(raw_read_vbar,vbar,uint64_t); + uint32_t el = get_current_el(); + return raw_read_vbar(el); }
void raw_write_vbar_current(uint64_t vbar) { - SWITCH_CASE_WRITE(raw_write_vbar,vbar); + uint32_t el = get_current_el(); + raw_write_vbar(vbar, el); +} + +uint64_t raw_read_vbar(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_vbar, vbar, uint64_t, el); +} + +void raw_write_vbar(uint64_t vbar, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_vbar, vbar, el); } diff --git a/payloads/libpayload/arch/arm64/lib/tlb.c b/payloads/libpayload/arch/arm64/lib/tlb.c index d5afc17..d80783d 100644 --- a/payloads/libpayload/arch/arm64/lib/tlb.c +++ b/payloads/libpayload/arch/arm64/lib/tlb.c @@ -52,7 +52,13 @@ void tlbiall_el3(void)
void tlbiall_current(void) { - SWITCH_CASE_TLBI(tlbiall); + uint32_t el = get_current_el(); + tlbiall(el); +} + +void tlbiall(uint32_t el) +{ + SWITCH_CASE_TLBI(tlbiall, el); }
/* TLBIALLIS */ @@ -73,7 +79,13 @@ void tlbiallis_el3(void)
void tlbiallis_current(void) { - SWITCH_CASE_TLBI(tlbiallis); + uint32_t el = get_current_el(); + tlbiallis(el); +} + +void tlbiallis(uint32_t el) +{ + SWITCH_CASE_TLBI(tlbiallis, el); }
/* TLBIVAA */ diff --git a/payloads/libpayload/include/arm64/arch/lib_helpers.h b/payloads/libpayload/include/arm64/arch/lib_helpers.h index 3adba81..a8eb396 100644 --- a/payloads/libpayload/include/arm64/arch/lib_helpers.h +++ b/payloads/libpayload/include/arm64/arch/lib_helpers.h @@ -41,57 +41,56 @@ #define CURRENT_EL_MASK 0x3 #define CURRENT_EL_SHIFT 2
+#include <stdint.h> + #define DAIF_DBG_BIT (1<<3) #define DAIF_ABT_BIT (1<<2) #define DAIF_IRQ_BIT (1<<1) #define DAIF_FIQ_BIT (1<<0)
-#define SWITCH_CASE_READ(func,var,type) do { \ - type var = -1; \ - uint8_t current_el = get_current_el(); \ - switch(current_el) { \ - case EL1: \ - var = func##_el1(); \ - break; \ - case EL2: \ - var = func##_el2(); \ - break; \ - case EL3: \ - var = func##_el3(); \ - break; \ - } \ - return var; \ - } while(0) +#define SWITCH_CASE_READ(func, var, type, el) do { \ + type var = -1; \ + switch (el) { \ + case EL1: \ + var = func##_el1(); \ + break; \ + case EL2: \ + var = func##_el2(); \ + break; \ + case EL3: \ + var = func##_el3(); \ + break; \ + } \ + return var; \ + } while (0)
-#define SWITCH_CASE_WRITE(func,var) do { \ - uint8_t current_el = get_current_el(); \ - switch(current_el) { \ - case EL1: \ - func##_el1(var); \ - break; \ - case EL2: \ - func##_el2(var); \ - break; \ - case EL3: \ - func##_el3(var); \ - break; \ - } \ - } while(0) +#define SWITCH_CASE_WRITE(func, var, el) do { \ + switch (el) { \ + case EL1: \ + func##_el1(var); \ + break; \ + case EL2: \ + func##_el2(var); \ + break; \ + case EL3: \ + func##_el3(var); \ + break; \ + } \ + } while (0)
-#define SWITCH_CASE_TLBI(func) do { \ - uint8_t current_el = get_current_el(); \ - switch(current_el) { \ - case EL1: \ +#define SWITCH_CASE_TLBI(func, el) do { \ + switch (el) { \ + case EL1: \ func##_el1(); \ break; \ - case EL2: \ + case EL2: \ func##_el2(); \ break; \ - case EL3: \ + case EL3: \ func##_el3(); \ break; \ } \ - } while(0) + } while (0)
/* PSTATE and special purpose register access functions */ uint32_t raw_read_current_el(void); @@ -118,6 +117,8 @@ uint64_t raw_read_elr_el3(void); void raw_write_elr_el3(uint64_t elr_el3); uint64_t raw_read_elr_current(void); void raw_write_elr_current(uint64_t elr); +uint64_t raw_read_elr(uint32_t el); +void raw_write_elr(uint64_t elr, uint32_t el); uint32_t raw_read_fpcr(void); void raw_write_fpcr(uint32_t fpcr); uint32_t raw_read_fpsr(void); @@ -144,6 +145,8 @@ uint32_t raw_read_spsr_el3(void); void raw_write_spsr_el3(uint32_t spsr_el3); uint32_t raw_read_spsr_current(void); void raw_write_spsr_current(uint32_t spsr); +uint32_t raw_read_spsr(uint32_t el); +void raw_write_spsr(uint32_t spsr, uint32_t el); uint32_t raw_read_spsr_fiq(void); void raw_write_spsr_fiq(uint32_t spsr_fiq); uint32_t raw_read_spsr_irq(void); @@ -160,6 +163,8 @@ uint32_t raw_read_actlr_el3(void); void raw_write_actlr_el3(uint32_t actlr_el3); uint32_t raw_read_actlr_current(void); void raw_write_actlr_current(uint32_t actlr); +uint32_t raw_read_actlr(uint32_t el); +void raw_write_actlr(uint32_t actlr, uint32_t el); uint32_t raw_read_afsr0_el1(void); void raw_write_afsr0_el1(uint32_t afsr0_el1); uint32_t raw_read_afsr0_el2(void); @@ -168,6 +173,8 @@ uint32_t raw_read_afsr0_el3(void); void raw_write_afsr0_el3(uint32_t afsr0_el3); uint32_t raw_read_afsr0_current(void); void raw_write_afsr0_current(uint32_t afsr0); +uint32_t raw_read_afsr0(uint32_t el); +void raw_write_afsr0(uint32_t afsr0, uint32_t el); uint32_t raw_read_afsr1_el1(void); void raw_write_afsr1_el1(uint32_t afsr1_el1); uint32_t raw_read_afsr1_el2(void); @@ -176,6 +183,8 @@ uint32_t raw_read_afsr1_el3(void); void raw_write_afsr1_el3(uint32_t afsr1_el3); uint32_t raw_read_afsr1_current(void); void raw_write_afsr1_current(uint32_t afsr1); +uint32_t raw_read_afsr1(uint32_t el); +void raw_write_afsr1(uint32_t afsr1, uint32_t el); uint32_t raw_read_aidr_el1(void); uint64_t raw_read_amair_el1(void); void raw_write_amair_el1(uint64_t amair_el1); @@ -185,6 +194,8 @@ uint64_t raw_read_amair_el3(void); void raw_write_amair_el3(uint64_t amair_el3); uint64_t raw_read_amair_current(void); void raw_write_amair_current(uint64_t amair); +uint64_t raw_read_amair(uint32_t el); +void raw_write_amair(uint64_t amair, uint32_t el); uint32_t raw_read_ccsidr_el1(void); uint32_t raw_read_clidr_el1(void); uint32_t raw_read_cpacr_el1(void); @@ -193,8 +204,6 @@ uint32_t raw_read_cptr_el2(void); void raw_write_cptr_el2(uint32_t cptr_el2); uint32_t raw_read_cptr_el3(void); void raw_write_cptr_el3(uint32_t cptr_el3); -uint32_t raw_read_cptr_current(void); -void raw_write_cptr_current(uint32_t cptr); uint32_t raw_read_csselr_el1(void); void raw_write_csselr_el1(uint32_t csselr_el1); uint32_t raw_read_ctr_el0(void); @@ -206,6 +215,8 @@ uint32_t raw_read_esr_el3(void); void raw_write_esr_el3(uint32_t esr_el3); uint32_t raw_read_esr_current(void); void raw_write_esr_current(uint32_t esr); +uint32_t raw_read_esr(uint32_t el); +void raw_write_esr(uint32_t esr, uint32_t el); uint64_t raw_read_far_el1(void); void raw_write_far_el1(uint64_t far_el1); uint64_t raw_read_far_el2(void); @@ -214,6 +225,8 @@ uint64_t raw_read_far_el3(void); void raw_write_far_el3(uint64_t far_el3); uint64_t raw_read_far_current(void); void raw_write_far_current(uint64_t far); +uint64_t raw_read_far(uint32_t el); +void raw_write_far(uint64_t far, uint32_t el); uint64_t raw_read_hcr_el2(void); void raw_write_hcr_el2(uint64_t hcr_el2); uint64_t raw_read_aa64pfr0_el1(void); @@ -225,6 +238,8 @@ uint64_t raw_read_mair_el3(void); void raw_write_mair_el3(uint64_t mair_el3); uint64_t raw_read_mair_current(void); void raw_write_mair_current(uint64_t mair); +uint64_t raw_read_mair(uint32_t el); +void raw_write_mair(uint64_t mair, uint32_t el); uint64_t raw_read_mpidr_el1(void); uint32_t raw_read_rmr_el1(void); void raw_write_rmr_el1(uint32_t rmr_el1); @@ -234,6 +249,8 @@ uint32_t raw_read_rmr_el3(void); void raw_write_rmr_el3(uint32_t rmr_el3); uint32_t raw_read_rmr_current(void); void raw_write_rmr_current(uint32_t rmr); +uint32_t raw_read_rmr(uint32_t el); +void raw_write_rmr(uint32_t rmr, uint32_t el); uint64_t raw_read_rvbar_el1(void); void raw_write_rvbar_el1(uint64_t rvbar_el1); uint64_t raw_read_rvbar_el2(void); @@ -242,6 +259,8 @@ uint64_t raw_read_rvbar_el3(void); void raw_write_rvbar_el3(uint64_t rvbar_el3); uint64_t raw_read_rvbar_current(void); void raw_write_rvbar_current(uint64_t rvbar); +uint64_t raw_read_rvbar(uint32_t el); +void raw_write_rvbar(uint64_t rvbar, uint32_t el); uint32_t raw_read_scr_el3(void); void raw_write_scr_el3(uint32_t scr_el3); uint32_t raw_read_sctlr_el1(void); @@ -252,6 +271,8 @@ uint32_t raw_read_sctlr_el3(void); void raw_write_sctlr_el3(uint32_t sctlr_el3); uint32_t raw_read_sctlr_current(void); void raw_write_sctlr_current(uint32_t sctlr); +uint32_t raw_read_sctlr(uint32_t el); +void raw_write_sctlr(uint32_t sctlr, uint32_t el); uint64_t raw_read_tcr_el1(void); void raw_write_tcr_el1(uint64_t tcr_el1); uint32_t raw_read_tcr_el2(void); @@ -260,6 +281,8 @@ uint32_t raw_read_tcr_el3(void); void raw_write_tcr_el3(uint32_t tcr_el3); uint64_t raw_read_tcr_current(void); void raw_write_tcr_current(uint64_t tcr); +uint64_t raw_read_tcr(uint32_t el); +void raw_write_tcr(uint64_t tcr, uint32_t el); uint64_t raw_read_ttbr0_el1(void); void raw_write_ttbr0_el1(uint64_t ttbr0_el1); uint64_t raw_read_ttbr0_el2(void); @@ -268,6 +291,8 @@ uint64_t raw_read_ttbr0_el3(void); void raw_write_ttbr0_el3(uint64_t ttbr0_el3); uint64_t raw_read_ttbr0_current(void); void raw_write_ttbr0_current(uint64_t ttbr0); +uint64_t raw_read_ttbr0(uint32_t el); +void raw_write_ttbr0(uint64_t ttbr0, uint32_t el); uint64_t raw_read_ttbr1_el1(void); void raw_write_ttbr1_el1(uint64_t ttbr1_el1); uint64_t raw_read_vbar_el1(void); @@ -278,6 +303,8 @@ uint64_t raw_read_vbar_el3(void); void raw_write_vbar_el3(uint64_t vbar_el3); uint64_t raw_read_vbar_current(void); void raw_write_vbar_current(uint64_t vbar); +uint64_t raw_read_vbar(uint32_t el); +void raw_write_vbar(uint64_t vbar, uint32_t el);
/* Cache maintenance system instructions */ void dccisw(uint64_t cisw); @@ -297,10 +324,12 @@ void tlbiall_el1(void); void tlbiall_el2(void); void tlbiall_el3(void); void tlbiall_current(void); +void tlbiall(uint32_t el); void tlbiallis_el1(void); void tlbiallis_el2(void); void tlbiallis_el3(void); void tlbiallis_current(void); +void tlbiallis(uint32_t el); void tlbivaa_el1(uint64_t va);
/* Memory barrier */