From c374eaacbc0d16983bbd1112fefa74dbe88e1e53 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Sat, 28 Dec 2019 15:55:29 +0100 Subject: use ldm instruction instead of libkernel for entering user mode; get rid of libkernel (no longer needed) --- demo_functionality.c | 69 +++++++++++++++++----------------------------------- 1 file changed, 22 insertions(+), 47 deletions(-) (limited to 'demo_functionality.c') diff --git a/demo_functionality.c b/demo_functionality.c index 206dd2b..4b002d6 100644 --- a/demo_functionality.c +++ b/demo_functionality.c @@ -2,7 +2,6 @@ #include "psr.h" #include "memory.h" #include "translation_table_descriptors.h" -#include "libkernel.h" #include "ramfs.h" void demo_paging_support(void) @@ -57,37 +56,6 @@ void demo_current_mode(void) #define TRANSLATION_TABLE \ ((short_section_descriptor_t volatile*) TRANSLATION_TABLE_BASE) -extern char - __libkernel_start, - __libkernel_end, - __libkernel_size; - -void demo_setup_libkernel(void) { - short_section_descriptor_t volatile *libkernel_section_entry = - &TRANSLATION_TABLE[LIBKERNEL_SECTION_NUMBER]; - - short_section_descriptor_t - libkernel_section = *libkernel_section_entry; - - // make libkernel section executable and read-only for - // unprivileged code - libkernel_section.ACCESS_PERMISSIONS_2 = - AP_2_0_MODEL_RW_PL1_RO_PL0 >> 2; - libkernel_section.ACCESS_PERMISSIONS_1_0 = - AP_2_0_MODEL_RW_PL1_RO_PL0 & 0b011; - - *libkernel_section_entry = libkernel_section; - - // invalidate main Translation Lookup Buffer (just in case) - asm("mcr p15, 0, %0, c8, c7, 0\n\r" - "isb" :: "r" (0) : "memory"); - - // copy libkernel code to libkernel section - for (size_t i = 0; i < (size_t) &__libkernel_size; i++) - ((volatile char*) LIBKERNEL_SECTION_START)[i] = - (&__libkernel_start)[i]; -} - extern char _binary_ramfs_img_start, _binary_ramfs_img_end, @@ -151,27 +119,34 @@ void demo_setup_PL0(void) ((volatile char*) VIRTUAL_PL0_MEMORY_START)[i] = PL_0_test_img.file_contents[i]; - uart_puts("copied PL0 and libkernel code to their sections\n\r"); + uart_puts("copied PL0 code to it's section\n\r"); +} + +// needed for array initialization in demo_go_unprivileged() +void *memset(void *s, int c, size_t n) +{ + char *mem = s; + + for (size_t i = 0; i < n; i++) + mem[i] = c; + + return s; } void demo_go_unprivileged(void) { - size_t call_unprivileged_offset = - (size_t) &call_unprivileged - (size_t) &__libkernel_start; + 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 + + PSR_t new_SPSR = read_CPSR(); + new_SPSR.fields.PSR_MODE_4_0 = MODE_USER; + write_SPSR(new_SPSR); - void *call_unprivileged_new_location = - (void*) (LIBKERNEL_SECTION_START + call_unprivileged_offset); + uart_puts("All ready, jumping to PL0 code\n\r"); - // call call_unprivileged from libkernel - asm volatile("mov r5, %0\n\r" - "mov r0, %1\n\r" - "mov r4, #0\n\r" - "movt r4, #"PL0_SECTION_NUMBER_STR"1111\n\r" - "mov sp, r4\n\r" // setting stack is important :D - "blx r5\n\r" :: - "r" (call_unprivileged_new_location), - "r" (VIRTUAL_PL0_MEMORY_START) - : "memory", "r4", "r5", "r0"); + asm volatile("ldm %0, {r0 - r15} ^" :: + "r" (PL0_regs)); } extern char -- cgit v1.2.3