From a910d10349593fce9f5f28f0de4f27ba85cd7df2 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Sat, 28 Dec 2019 23:25:05 +0100 Subject: enter and exit supervisor call (+ fixed jumping to PL0 for the first time - setting sp was broken there) --- demo_functionality.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'demo_functionality.c') diff --git a/demo_functionality.c b/demo_functionality.c index 420639b..12bba9b 100644 --- a/demo_functionality.c +++ b/demo_functionality.c @@ -135,9 +135,8 @@ void *memset(void *s, int c, size_t n) void demo_go_unprivileged(void) { - uint32_t PL0_regs[16] = {0}; - PL0_regs[15] = VIRTUAL_PL0_MEMORY_START; // the new pc - PL0_regs[13] = (PL0_SECTION_NUMBER + 1) << 20; // the new sp + uint32_t PL0_regs[14] = {0}; + PL0_regs[13] = VIRTUAL_PL0_MEMORY_START; // the new pc PSR_t new_SPSR = read_CPSR(); new_SPSR.fields.PSR_MODE_4_0 = MODE_USER; @@ -145,6 +144,14 @@ void demo_go_unprivileged(void) uart_puts("All ready, jumping to PL0 code\n\r"); - asm volatile("ldm %0, {r0 - r15} ^" :: - "r" (PL0_regs)); + asm volatile("cps %[sysmode]\n\r" + "mov sp, %[stackaddr]\n\r" + "cps %[supmode]\n\r" + "ldm %[contextaddr], {r0 - r12, pc} ^" :: + [sysmode]"I" (MODE_SYSTEM), + [supmode]"I" (MODE_SUPERVISOR), + [stackaddr]"r" ((PL0_SECTION_NUMBER + 1) << 20), + [contextaddr]"r" (PL0_regs) : "memory"); + + __builtin_unreachable(); } -- cgit v1.2.3