commit 960322473ad6aeccbf7b2ae820d182f32131f279
parent 22ac77156f42502eb6386cae945e4a6af561d446
Author: Dimitris Papastamos <dimitris.papastamos@arm.com>
Date: Sun, 14 Oct 2018 16:51:38 +0100
[arm64] Add primitive to set SP_R from C
Change-Id: I7c7a4783b1028e9d695aeedda415e59c4e0bbbbe
Signed-off-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
Diffstat:
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/arch.s b/arch/arm64/arch.s
@@ -8,8 +8,8 @@ DAIF_DBG = 4
.globl read_actlr_r,write_actlr_r
.globl read_id_aa64rmfr0_r,write_id_aa64rmfr0_r
.globl read_rcr_r,write_rcr_r,read_rdscr_r,write_rdscr_r
- .globl read_sctlr_rwrite_sctlr_r,
- .globl read_rvbar_el3,vectbl,swtch
+ .globl read_sctlr_rwrite_sctlr_r,read_rvbar_el3,write_sp_r
+ .globl vectbl,swtch
enaabt:
msr daifclr,DAIF_ABT
@@ -77,6 +77,13 @@ read_rvbar_el3:
mrs x0,rvbar_el3
ret
+write_sp_r:
+ mrs x1,spsel
+ msr spsel,#1
+ mov sp,x0
+ msr spsel,x1
+ ret
+
panic:
stp x1,x0,[sp,#-16]!
stp x3,x2,[sp,#-16]!
diff --git a/include/rcode.h b/include/rcode.h
@@ -76,6 +76,7 @@ extern void write_rdscr_r(unsigned long long v);
extern unsigned long long read_sctlr_r(void);
extern void write_sctlr_r(unsigned long long v);
extern unsigned long long read_rvbar_el3(void);
+extern void write_sp_r(unsigned long long v);
/* global constant variables */
extern const struct rowidx rowidx[];