diff --git a/assembleur.s b/assembleur.s index b2cbed79fb4af4f9346b9f29112d6ef75274ebee..21fbcfb4b4814a5ead52df20c3591509746953f2 100644 --- a/assembleur.s +++ b/assembleur.s @@ -7,9 +7,9 @@ .global asm_test_fault .global switch_to_user_mode +.global set_psp .extern user_stack DATA // this adress can be read like: ldr Rx, =user_stack - switch_to_user_mode: ldr r0, =user_stack msr PSP, r0 @@ -17,6 +17,9 @@ switch_to_user_mode: msr CONTROL, r1 bx lr +set_psp: + mrs r0, psp + bx lr .equ bad_addr,0x90000 diff --git a/mpu_user_console_etu.c b/mpu_user_console_etu.c index bfcefbb96038507a5cf342118aee1ecf181bf6f3..bf3504aef3fedc0e1e5edb9ad75549e15a52a740 100644 --- a/mpu_user_console_etu.c +++ b/mpu_user_console_etu.c @@ -36,6 +36,7 @@ volatile static unsigned idx_error; void switch_to_user_mode(); void asm_test_fault(); +void set_psp(); void MemManage_Handler() { arr_addr[idx_error] = MMFAR; @@ -44,6 +45,13 @@ void MemManage_Handler() { SCB->CFSR = 0xFFFF; LPC_GPIO2->FIOPIN = idx_error; + + uint32_t* user_psp; + + set_psp(user_psp); + + user_psp[6] = (uint32_t)user_stating_address; + } void test_supervisor_mode() {