diff options
author | Furquan Shaikh <furquan@google.com> | 2014-09-07 18:23:18 -0700 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2015-03-28 07:04:29 +0100 |
commit | e1b87a103290115831226713b1711dcc956ae43d (patch) | |
tree | 7f24aa1d6e1dcbea47021e64370ee40e5c0d6841 /src/arch/arm64/include | |
parent | 2157ba76f2fe238cb6bcc97957ac5481df599415 (diff) |
arm64 libhelpers: 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.
BUG=chrome-os-partner:30785
BRANCH=None
TEST=Compiles successfully
Change-Id: I98f35b8d3eb5e292ac895102ad91b675325c08c7
Signed-off-by: Patrick Georgi <pgeorgi@chromium.org>
Original-Commit-Id: 11d90df1fd92e03c25bfc463429a5f6a8d9d411d
Original-Change-Id: I17de4c4f3bc1ee804422efe5f4703b4dd65b51f2
Original-Signed-off-by: Furquan Shaikh <furquan@google.com>
Original-Reviewed-on: https://chromium-review.googlesource.com/216904
Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Original-Tested-by: Furquan Shaikh <furquan@chromium.org>
Original-Commit-Queue: Furquan Shaikh <furquan@chromium.org>
Reviewed-on: http://review.coreboot.org/9063
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'src/arch/arm64/include')
-rw-r--r-- | src/arch/arm64/include/armv8/arch/lib_helpers.h | 97 |
1 files changed, 63 insertions, 34 deletions
diff --git a/src/arch/arm64/include/armv8/arch/lib_helpers.h b/src/arch/arm64/include/armv8/arch/lib_helpers.h index 958b8e7206..014926d8fe 100644 --- a/src/arch/arm64/include/armv8/arch/lib_helpers.h +++ b/src/arch/arm64/include/armv8/arch/lib_helpers.h @@ -123,53 +123,52 @@ #else +#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; \ +#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; \ - } \ +#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; \ } \ @@ -200,6 +199,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); @@ -226,6 +227,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); @@ -242,6 +245,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); @@ -250,6 +255,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); @@ -258,6 +265,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); @@ -267,6 +276,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); @@ -288,6 +299,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); @@ -296,6 +309,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); @@ -307,6 +322,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); uint32_t raw_read_midr_el1(void); uint64_t raw_read_mpidr_el1(void); uint32_t raw_read_rmr_el1(void); @@ -317,6 +334,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); @@ -325,6 +344,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); @@ -335,6 +356,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); @@ -349,6 +372,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); @@ -359,6 +384,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); @@ -378,10 +405,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); #endif // __ASSEMBLY__ |