commit c35cffa964d51d9d7c6c59e67b9fab562a928744
parent f189be4bc59d57d645cd80b48fbcea5ee36080d5
Author: Dimitris Papastamos <dimitris.papastamos@arm.com>
Date: Wed, 7 Nov 2018 11:53:17 +0000
[rcode] Split swtch() into C/asm parts
The C level part does an additional check to see if it should return
to the debug interpreter.
Change-Id: If75ac5f21989171adad309e687536ee1668c1d3c
Signed-off-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
Diffstat:
4 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/arch/amd64/arch.c b/arch/amd64/arch.c
@@ -4,7 +4,6 @@
#include <rcode.h>
-
jmp_buf recover;
_Noreturn void abort(void);
@@ -16,7 +15,7 @@ halt(void)
}
void
-swtch(struct trapframe *fp)
+doswtch(struct trapframe *fp)
{
longjmp(recover, 1);
}
diff --git a/arch/arm64/arch.s b/arch/arm64/arch.s
@@ -6,7 +6,7 @@
.globl rd_id_aa64rmfr0_r,wr_id_aa64rmfr0_r
.globl rd_rcr_r,wr_rcr_r,rd_rdscr_r,wr_rdscr_r
.globl rd_sctlr_r,wr_sctlr_r,rd_rvbar_el3
- .globl vectbl,swtch,isb,inm8,inm16,inm32
+ .globl vectbl,doswtch,isb,inm8,inm16,inm32
.globl outm8,outm16,outm32
enaint:
@@ -132,7 +132,7 @@ outsync:
.asciz "out of sync"
.text
-swtch:
+doswtch:
ldp x9,x10,[x0,#16*17]
msr S3_6_C6_C0_6,x10 /* FAR_R */
mov sp,x9
diff --git a/include/rcode.h b/include/rcode.h
@@ -158,6 +158,7 @@ extern _Noreturn void dopanic(void);
extern _Noreturn void panic(const char *msg);
extern void printk(const char * restrict fmt, ...) PRINTKFMT;
extern void rmc(Rmucmd *cmd);
+extern _Noreturn void doswtch(struct trapframe *fp);
extern _Noreturn void swtch(struct trapframe *fp);
extern void debug(struct trapframe *fp);
diff --git a/src/rmc.c b/src/rmc.c
@@ -75,6 +75,14 @@ panic(const char *msg)
}
void
+swtch(struct trapframe *fp)
+{
+ if (bss->in_debug)
+ longjmp(bss->dbgrecover, 1);
+ doswtch(fp);
+}
+
+void
trap(struct trapframe *fp)
{
Rmucmd cmd;