aboutsummaryrefslogtreecommitdiff
path: root/src/kern/main.c
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2020-11-25 15:47:02 -0700
committerJosh Rahm <joshuarahm@gmail.com>2020-11-25 15:47:02 -0700
commit6d22b0dfc7761a605758552d5824f8039ac5a00f (patch)
treede0cd4848c02b787d45b41afaca244606eceab5d /src/kern/main.c
parentb07c6f6a9d926d4eac726b94963e479839382675 (diff)
downloadstm32l4-6d22b0dfc7761a605758552d5824f8039ac5a00f.tar.gz
stm32l4-6d22b0dfc7761a605758552d5824f8039ac5a00f.tar.bz2
stm32l4-6d22b0dfc7761a605758552d5824f8039ac5a00f.zip
Primitive ability to call kernel code from userspace.
Diffstat (limited to 'src/kern/main.c')
-rw-r--r--src/kern/main.c140
1 files changed, 18 insertions, 122 deletions
diff --git a/src/kern/main.c b/src/kern/main.c
index 4ed67be..3af8beb 100644
--- a/src/kern/main.c
+++ b/src/kern/main.c
@@ -8,6 +8,7 @@
#include "kern/mpu/mpu_manager.h"
#include "kern/panic.h"
#include "kern/priv.h"
+#include "user/syscall.h"
void on_hard_fault()
{
@@ -19,139 +20,34 @@ void on_systick() /* Overrides weak-symbol on_systick. */
klogf("Systick\n");
}
-#ifdef ARCH_STM32L4
+void configure_mpu()
+{
+ configure_flash_region((void*)0x08000000, REGION_SIZE_256Kb, NOT_PRIVILEGED);
+ configure_ram_region((void*)SRAM1_BASE, REGION_SIZE_64Kb, NOT_PRIVILEGED);
+ configure_ram_region((void*)SRAM2_BASE, REGION_SIZE_16Kb, NOT_PRIVILEGED);
+ configure_peripheral_region((void*)0x40000000, REGION_SIZE_512Mb, PRIVILEGED);
+ mpu_set_enabled(1);
+}
-int thing_in_sram_1;
+#ifdef ARCH_STM32L4
/* Main function. This gets executed from the interrupt vector defined above. */
int main()
{
- klogf("Hello, World! Clock Mhz: %d\n", (uint32_t)get_clock_mhz());
- klogf("Heap Start: %p\n", &HEAP_START);
- klogf("Heap End : %p\n", &HEAP_STOP);
-
- klogf("mpu: %p\n", &MPU);
- klogf("mpu.type_r: %p\n", MPU.type_r);
- klogf("mpu.ctrl_r: %p\n", MPU.ctrl_r);
- klogf("mpu.rn_r: %p\n", MPU.rn_r);
-
- thing_in_sram_1 = 0xdeadbeef;
-
- uint32_t control;
- asm volatile("mrs %0, control" : "=r"(control) :);
-
- /* Set the countdown to start from 10,000,0000. */
- SCB.strv_r = 10000000 / 20;
-
- /* Enable interrupts. */
- // regset(SCB.stcs_r, scb_tickint, 1);
-
- /* Start the systick. */
- regset(SCB.stcs_r, scb_enable, 1);
-
-
- klogf("&thing_in_sram_1: %p\n", &thing_in_sram_1);
- klogf(" thing_in_sram_1: %p\n", thing_in_sram_1);
- mpu_set_enabled(0);
-
- memory_region_opts_t memopts = { 0 };
- memopts.region = (void*) 0x08000000 /* Flash base */ ;
- memopts.bufferable = 0;
- memopts.cacheable = 1;
- memopts.sharable = 0;
- memopts.tex = 0;
- memopts.size = REGION_SIZE_256Kb;
- memopts.perms = ACCESS_PERMS_ONLY_PRIV_RO;
- memopts.subregion_disable = 0;
- memopts.executable = 1;
- memopts.enable = 1;
+ configure_mpu();
- mpu_configure_region(0, &memopts);
+ klogf("Outside of usermode, I can still log stuff using klogf()\n");
- memopts.region = (void*) SRAM1_BASE;
- memopts.bufferable = 0;
- memopts.cacheable = 1;
- memopts.sharable = 0;
- memopts.tex = 0;
- memopts.size = REGION_SIZE_64Kb;
- memopts.perms = ACCESS_PERMS_FULL;
- memopts.subregion_disable = 0;
- memopts.executable = 1;
- memopts.enable = 1;
-
- mpu_configure_region(1, &memopts);
-
- memopts.region = (void*) SRAM2_BASE;
- memopts.bufferable = 0;
- memopts.cacheable = 1;
- memopts.sharable = 0;
- memopts.tex = 0;
- memopts.size = REGION_SIZE_16Kb;
- memopts.perms = ACCESS_PERMS_FULL;
- memopts.subregion_disable = 0;
- memopts.executable = 1;
- memopts.enable = 1;
-
- mpu_configure_region(2, &memopts);
-
- memopts.region = (void*) 0x40000000 /* Peripheral base. */;
- memopts.bufferable = 1;
- memopts.cacheable = 0;
- memopts.sharable = 1;
- memopts.tex = 0;
- memopts.size = REGION_SIZE_512Mb;
- memopts.perms = ACCESS_PERMS_ONLY_PRIV;
- memopts.subregion_disable = 0;
- memopts.executable = 0;
- memopts.enable = 1;
-
- mpu_configure_region(3, &memopts);
-
- for (uint32_t i = 0; i < 8; ++ i) {
- MPU.rn_r = i;
- klogf("--- %d ---\n", i);
- klogf("mpu: %p\n", &MPU);
- klogf("mpu.type_r: %p\n", MPU.type_r);
- klogf("mpu.ctrl_r: %p\n", MPU.ctrl_r);
- klogf("mpu.rn_r: %p\n", MPU.rn_r);
- klogf("mpu.ras_r: %p\n", MPU.ras_r);
- klogf("mpu.rba_r: %p\n", MPU.rba_r);
- }
-
- // memopts.region = (void*) (SRAM1_BASE);
- // memopts.bufferable = 0;
- // memopts.cacheable = 1;
- // memopts.sharable = 1;
- // memopts.tex = 0;
- // memopts.size = REGION_SIZE_16Kb;
- // memopts.perms = ACCESS_PERMS_NO_ACCESS;
-
- klogf("CONTROL: %p\n", get_control_register());
- klogf("CONTROL: %p\n", get_control_register());
- klogf("MPU not enabled\n");
-
- volatile int x;
- klogf("x location: %p\n", &x);
-
- // mpu_set_enabled(1);
-
- x = 5;
- klogf("Still alive?\n");
-
- klogf("Entering User Mode\n");
enter_user_mode();
- asm volatile (
- "svc #21\n"
- );
-
- klogf("Should Kernel Panic\n");
+ logs("Now that I'm in user mode, I have to log stuff using a system call\n");
+ logs(
+ "because I no longer have direct accss to USART2 and cannot use\n"
+ "klogf()\n");
- for(;;);
- // klogf("MPU enabled\n");
- // klogf("&thing_in_sram_1: %p\n", &thing_in_sram_1);
- // klogf(" thing_in_sram_1: %p\n", thing_in_sram_1);
+ for (;;)
+ ;
}
#endif