Better exception/interrupt handle
This commit is contained in:
@@ -15,6 +15,8 @@ __attribute__((noreturn)) void exception_trigger(rv32_cpu_t* cpu, uint32_t scaus
|
||||
|
||||
// Exceptions cannot be disabled
|
||||
|
||||
// TODO : Check medeleg to see if we should handle exception in S mode or M mode
|
||||
|
||||
// Unset SIE (interrupt enable) bit
|
||||
csr_write(cpu, CSR_SSTATUS, csr_read(cpu, CSR_SSTATUS) & (~STATUS_SIE));
|
||||
|
||||
@@ -37,8 +39,10 @@ __attribute__((noreturn)) void exception_trigger(rv32_cpu_t* cpu, uint32_t scaus
|
||||
csr_write(cpu, CSR_SSTATUS, csr_read(cpu, CSR_SSTATUS) & (~STATUS_SPIE));
|
||||
|
||||
// Set previous privilege mode in xSTATUS.xPP
|
||||
// TODO : Allow user mode exceptions (by not setting this)
|
||||
csr_write(cpu, CSR_SSTATUS, csr_read(cpu, CSR_SSTATUS) | STATUS_SPP);
|
||||
if(cpu->privilege_mode == SUPERVISOR)
|
||||
csr_write(cpu, CSR_SSTATUS, csr_read(cpu, CSR_SSTATUS) | STATUS_SPP);
|
||||
else if(cpu->privilege_mode == USER)
|
||||
csr_write(cpu, CSR_SSTATUS, csr_read(cpu, CSR_SSTATUS) & (~STATUS_SPP));
|
||||
|
||||
// Set privilege mode for exception handling, checking for delegation
|
||||
// TODO
|
||||
|
Reference in New Issue
Block a user