summaryrefslogtreecommitdiff
path: root/src/arch/arm64/include
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@google.com>2014-11-21 15:35:17 -0800
committerPatrick Georgi <pgeorgi@google.com>2015-04-10 20:47:21 +0200
commitff6d4facbb956175ef6ef9742545924b7fff4fad (patch)
tree8c91b4a2d20881657d5c761212d14400457c4a03 /src/arch/arm64/include
parentb718eab78d174be2d1a6dc6a21e64fdba341bced (diff)
downloadcoreboot-ff6d4facbb956175ef6ef9742545924b7fff4fad.tar.xz
arm64: Add conditional read/write from/to EL3 assembly macros.
Some registers are available only at EL3. Add conditional read/write functions that perform operations only if currently we are in EL3. BUG=chrome-os-partner:33962 BRANCH=None TEST=Compiles and boots to kernel prompt. Change-Id: Ic95838d10e18f58867b6b77aee937bdacae50597 Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Original-Commit-Id: 62a0e324a00248dba92cb3e2ac2f4072d0e4e2a7 Original-Signed-off-by: Furquan Shaikh <furquan@google.com> Original-Change-Id: Ia170d94adb9ecc141ff86e4a3041ddbf9045bc89 Original-Reviewed-on: https://chromium-review.googlesource.com/231549 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/9538 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.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/arch/arm64/include/armv8/arch/lib_helpers.h b/src/arch/arm64/include/armv8/arch/lib_helpers.h
index a80474799d..422b81a56b 100644
--- a/src/arch/arm64/include/armv8/arch/lib_helpers.h
+++ b/src/arch/arm64/include/armv8/arch/lib_helpers.h
@@ -214,6 +214,31 @@
104:
.endm
+/* Macro to read from a register at EL3 only if we are currently at that
+ level. This is required to ensure that we do not attempt to read registers
+ from a level lower than el3. e.g. SCR is available for read only at EL3.
+ IMPORTANT: if EL != EL3, macro silently doesn't perform the read.
+*/
+.macro read_el3 xreg sysreg
+ switch_el \xreg, 402f, 402f, 401f
+401:
+ mrs \xreg, \sysreg\()_el3
+402:
+.endm
+
+/* Macro to write to a register at EL3 only if we are currently at that
+ level. This is required to ensure that we do not attempt to write to
+ registers from a level lower than el3. e.g. SCR is available to write only at
+ EL3.
+ IMPORTANT: if EL != EL3, macro silently doesn't perform the write.
+*/
+.macro write_el3 sysreg xreg temp
+ switch_el \temp, 402f, 402f, 401f
+401:
+ msr \sysreg\()_el3, \xreg
+402:
+.endm
+
#else
#include <stdint.h>