diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/drivers/uart.c | 12 | ||||
| -rw-r--r-- | src/sys/core.h | 22 | ||||
| -rw-r--r-- | src/util/status.c | 3 | 
3 files changed, 29 insertions, 8 deletions
| 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; | 
