From 62a0e324a00248dba92cb3e2ac2f4072d0e4e2a7 Mon Sep 17 00:00:00 2001 From: Furquan Shaikh Date: Fri, 21 Nov 2014 15:35:17 -0800 Subject: [PATCH] ARM64 Library: 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. Signed-off-by: Furquan Shaikh Change-Id: Ia170d94adb9ecc141ff86e4a3041ddbf9045bc89 Reviewed-on: https://chromium-review.googlesource.com/231549 Reviewed-by: Aaron Durbin Tested-by: Furquan Shaikh Commit-Queue: Furquan Shaikh --- .../arm64/include/armv8/arch/lib_helpers.h | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/arch/arm64/include/armv8/arch/lib_helpers.h b/src/arch/arm64/include/armv8/arch/lib_helpers.h index 02556a9deb..1fa7b058c7 100644 --- a/src/arch/arm64/include/armv8/arch/lib_helpers.h +++ b/src/arch/arm64/include/armv8/arch/lib_helpers.h @@ -222,6 +222,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