From c7b47accc6de3521f10c323983a1b325a60fb421 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Wed, 15 Jan 2020 15:22:16 +0100 Subject: also enable data and instruction cache when enabling the MMU --- src/arm/PL1/kernel/paging.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/arm/PL1/kernel/paging.c b/src/arm/PL1/kernel/paging.c index 771c681..4c3dccf 100644 --- a/src/arm/PL1/kernel/paging.c +++ b/src/arm/PL1/kernel/paging.c @@ -101,10 +101,11 @@ void setup_flat_map(void) // enable MMU puts("enabling the MMU"); - // redundant - we already have SCTLR contents in the variable - // asm("mrc p15, 0, %0, c1, c0, 0" : "=r" (SCTLR.raw)); + // we already have SCTLR contents in the variable - SCTLR.fields.M = 1; + SCTLR.fields.M = 1; // enable MMU + SCTLR.fields.C = 1; // enable data cache + SCTLR.fields.I = 1; // enable instruction cache asm("mcr p15, 0, %0, c1, c0, 0\n\r" "isb" :: "r" (SCTLR.raw) : "memory"); -- cgit v1.2.3 From c77286c6951223be1c216c19278cecca3b43ceb5 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Wed, 15 Jan 2020 16:30:05 +0100 Subject: for safety - invalidate caches when creating a new mapping --- src/arm/PL1/kernel/paging.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src') diff --git a/src/arm/PL1/kernel/paging.c b/src/arm/PL1/kernel/paging.c index 4c3dccf..6da9905 100644 --- a/src/arm/PL1/kernel/paging.c +++ b/src/arm/PL1/kernel/paging.c @@ -242,6 +242,14 @@ uint16_t claim_and_map_section // write modified descriptor to the table *section_entry = descriptor; + // invalidate instruction cache + asm("mcr p15, 0, r0, c7, c5, 0\n\r" // r0 gets ignored + "isb" ::: "memory"); + + // invalidate branch-prediction + asm("mcr p15, 0, r0, c7, c5, 6\n\r" // r0 - same as above + "isb" ::: "memory"); + // invalidate main Translation Lookup Buffer asm("mcr p15, 0, r1, c8, c7, 0\n\r" "isb" ::: "memory"); -- cgit v1.2.3 From ca3bf744f826225bb041afc4779ee19493d5440e Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Wed, 15 Jan 2020 16:47:14 +0100 Subject: remove garbage-comments --- src/arm/PL1/kernel/interrupts.c | 33 +-------------------------------- 1 file changed, 1 insertion(+), 32 deletions(-) (limited to 'src') diff --git a/src/arm/PL1/kernel/interrupts.c b/src/arm/PL1/kernel/interrupts.c index 121d79c..5695e6f 100644 --- a/src/arm/PL1/kernel/interrupts.c +++ b/src/arm/PL1/kernel/interrupts.c @@ -3,11 +3,8 @@ #include "svc_interface.h" #include "armclock.h" #include "scheduler.h" -/** - @brief The undefined instruction interrupt handler -**/ - +// defined in setup.c void __attribute__((noreturn)) setup(void); // from what I've heard, reset is never used on the Pi; @@ -105,31 +102,3 @@ void fiq_handler(void) { error("fiq happened"); } - - -/* Here is your interrupt function */ -//void -//__attribute__((interrupt("IRQ"))) -//__attribute__((section(".interrupt_vectors.text"))) -//irq_handler2(void) { -// /* You code goes here */ -//// uart_puts("GOT INTERRUPT!\r\n"); -// -// local_timer_clr_reload_reg_t temp = { .IntClear = 1, .Reload = 1 }; -// QA7->TimerClearReload = temp; // Clear interrupt & reload -//} - -///* here is your main */ -//int enable_timer(void) { -// -// QA7->TimerRouting.Routing = LOCALTIMER_TO_CORE0_IRQ; // Route local timer IRQ to Core0 -// QA7->TimerControlStatus.ReloadValue = 100; // Timer period set -// QA7->TimerControlStatus.TimerEnable = 1; // Timer enabled -// QA7->TimerControlStatus.IntEnable = 1; // Timer IRQ enabled -// QA7->TimerClearReload.IntClear = 1; // Clear interrupt -// QA7->TimerClearReload.Reload = 1; // Reload now -// QA7->Core0TimerIntControl.nCNTPNSIRQ_IRQ = 1; // We are in NS EL1 so enable IRQ to core0 that level -// QA7->Core0TimerIntControl.nCNTPNSIRQ_FIQ = 0; // Make sure FIQ is zero -//// uart_puts("Enabled Timer\r\n"); -// return(0); -//} \ No newline at end of file -- cgit v1.2.3