summaryrefslogtreecommitdiff
path: root/kernel/start.c
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2024-06-04 23:32:33 +0200
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2024-06-04 23:32:33 +0200
commitd78b60f868f40cefe3ac958800ac828f2eafc81c (patch)
tree29309397c2e77f2598a1f282bfc9d4436d697263 /kernel/start.c
parentf95c522b0ae30dd3c4d9c4449de98d3b5c6e9a65 (diff)
Supervisor trap & claim MSIHEADmain
Diffstat (limited to 'kernel/start.c')
-rw-r--r--kernel/start.c77
1 files changed, 53 insertions, 24 deletions
diff --git a/kernel/start.c b/kernel/start.c
index 859ae5d..ddd31c2 100644
--- a/kernel/start.c
+++ b/kernel/start.c
@@ -11,29 +11,56 @@ extern uint32_t _bss_start;
extern uint32_t _bss_end;
extern uint32_t _ram_end;
-void kstrap()
+#define UART_MSI 1
+
+extern uint32_t strap;
+
+void ktrap(uint32_t cause)
{
- uint32_t scause;
- __asm__ volatile("csrr %0, scause" : "=r"(scause));
- switch (scause)
+ if ((cause & 0x8000'0000) == 0)
+ {
+ switch (cause)
+ {
+ case 0: panic("kstrap: Instruction address misaligned");
+ case 1: panic("kstrap: Instruction access fault");
+ case 2: panic("kstrap: Illegal instruction");
+ case 3: panic("kstrap: Breakpoint");
+ case 4: panic("kstrap: Load address misaligned");
+ case 5: panic("kstrap: Load access fault");
+ case 6: panic("kstrap: Store/AMO address misaligned");
+ case 7: panic("kstrap: Store/AMO access fault");
+ case 8: panic("kstrap: Environment call from U-mode");
+ case 9: panic("kstrap: Environment call from S-mode");
+ case 12: panic("kstrap: Instruction page fault");
+ case 13: panic("kstrap: Load page fault");
+ case 14: panic("kstrap: Reserved");
+ case 15: panic("kstrap: Store/AMO page fault");
+ case 18: panic("kstrap: Software check");
+ case 19: panic("kstrap: Hardware error");
+ default: panic("kstrap: Unknown");
+ }
+ }
+ else
{
- case 0: panic("kstrap: Instruction address misaligned");
- case 1: panic("kstrap: Instruction access fault");
- case 2: panic("kstrap: Illegal instruction");
- case 3: panic("kstrap: Breakpoint");
- case 4: panic("kstrap: Load address misaligned");
- case 5: panic("kstrap: Load access fault");
- case 6: panic("kstrap: Store/AMO address misaligned");
- case 7: panic("kstrap: Store/AMO access fault");
- case 8: panic("kstrap: Environment call from U-mode");
- case 9: panic("kstrap: Environment call from S-mode");
- case 12: panic("kstrap: Instruction page fault");
- case 13: panic("kstrap: Load page fault");
- case 14: panic("kstrap: Reserved");
- case 15: panic("kstrap: Store/AMO page fault");
- case 18: panic("kstrap: Software check");
- case 19: panic("kstrap: Hardware error");
- default: panic("kstrap: Unknown");
+ cause = cause & 0x7fff'ffff;
+ if (cause == 9)
+ {
+ uint32_t msi = aplic_claim_msi_s();
+ switch (msi)
+ {
+ case UART_MSI:
+ {
+ volatile char* UART_BASE = (volatile char*)0x1000'0000;
+ *UART_BASE = *UART_BASE;
+ break;
+ }
+ default: panic("Unknown MSI");
+ }
+ }
+ else
+ {
+ panic("Interrupt");
+ }
}
}
@@ -57,9 +84,8 @@ void kstart()
kalloc_init();
kvm_init();
- aplic_init();
- panic("kstart: end");
+ panic("kstart: end\n");
}
void kinit()
@@ -80,7 +106,10 @@ void kinit()
w_sstatus(SSTATUS_SPIE | SSTATUS_SPP_S);
w_sie(SIE_SEIE);
w_sepc(&kstart);
- w_stvec(&kstrap);
+ w_stvec(&strap);
+
+ aplic_init();
+ aplic_enable_intr_s(10, UART_MSI);
w_pmpcfg0(PMPCFG_RW | PMPCFG_X | PMPCFG_TOR);
w_pmpaddr0(((uint32_t)&_ram_end) >> PMPADDR_SHIFT);