From f3ea4cd0c22f351d8dfffb0e937194c4b526b665 Mon Sep 17 00:00:00 2001 From: Christian Cunningham Date: Mon, 3 Jan 2022 21:35:01 -0800 Subject: Added Stack ASM Functions --- src/drivers/uart.c | 12 ++++++------ src/sys/core.h | 22 ++++++++++++++++++++++ src/util/status.c | 3 +-- 3 files changed, 29 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/drivers/uart.c b/src/drivers/uart.c index cc1933e..142a5c3 100644 --- a/src/drivers/uart.c +++ b/src/drivers/uart.c @@ -1,11 +1,5 @@ #include "../drivers/uart.h" -void uart_hexn(unsigned long c_val) -{ - uart_hex(c_val); - uart_char('\n'); -} - void uart_10(unsigned long val) { unsigned long t = val; @@ -22,3 +16,9 @@ void uart_10(unsigned long val) } uart_string(dptr); } + +void uart_hexn(unsigned long c_val) +{ + uart_hex(c_val); + uart_char('\n'); +} diff --git a/src/sys/core.h b/src/sys/core.h index 2ba2f16..fa9e1b5 100644 --- a/src/sys/core.h +++ b/src/sys/core.h @@ -19,6 +19,28 @@ static inline void delay(unsigned long cycles) : "=r"(cycles): [cycles]"0"(cycles) : "cc"); } +static inline void preserveregs(void) +{ + asm volatile("push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11}"); +} + +static inline void restoreregs(void) +{ + asm volatile("pop {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11}"); +} + +static inline void* getsp(void) +{ + void* out; + asm volatile ("mov %0, sp" : "=r"(out)); + return out; +} + +static inline void setsp(void* in) +{ + asm volatile ("mov sp, %0" :: "r"(in)); +} + enum { // The offset for the MMIO area diff --git a/src/util/status.c b/src/util/status.c index 1ac08e8..bd529da 100644 --- a/src/util/status.c +++ b/src/util/status.c @@ -141,8 +141,7 @@ void status(void) write_char(&g_Drawer, '\n'); */ - unsigned long sp; - asm volatile ("mov %0, sp": "=r"(sp)); + unsigned long sp = (unsigned long)getsp(); write_hex32(&g_Drawer, sp); g_Drawer.x = x; -- cgit v1.2.1