Added memory access type for mmu

This commit is contained in:
2023-10-20 09:58:10 +02:00
parent 5bb973e8da
commit dcdebcd8e4
5 changed files with 61 additions and 17 deletions
+20 -4
View File
@@ -44,7 +44,24 @@ extern uint8_t* memory;
#define VADDR_VPN_0 (0x003FF000)
#define VADDR_PAGE_OFFSET (0x00000FFF)
uint32_t mmu_resolve(rv32_cpu_t* cpu, uint32_t vaddr)
uint32_t mmu_scause_from_access(memory_access_type_t access_type)
{
switch(access_type)
{
case READ:
return SCAUSE_LOAD_PAGE_FAULT;
case WRITE:
return SCAUSE_STORE_AMO_PAGE_FAULT;
case INSTRUCTION_FETCH:
return SCAUSE_INSTRUCTION_PAGE_FAULT;
default:
fprintf(stderr, "mmu_scause_from_access: invalid parameter\n");
exit(EXIT_FAILURE);
break;
}
}
uint32_t mmu_resolve(rv32_cpu_t* cpu, memory_access_type_t access_type, uint32_t vaddr)
{
// TODO: Make sure we are in S-mode or U-mode
@@ -64,8 +81,7 @@ uint32_t mmu_resolve(rv32_cpu_t* cpu, uint32_t vaddr)
if(!(pte & PTE_V))
{
// Invalid PTE
// TODO : Add a MEMORY_ACCESS_TYPE
exception_trigger(cpu, SCAUSE_INSTRUCTION_PAGE_FAULT);
exception_trigger(cpu, mmu_scause_from_access(access_type));
}
if((pte & PTE_R) || (pte & PTE_W) || (pte & PTE_X))
@@ -93,7 +109,7 @@ uint32_t mmu_resolve(rv32_cpu_t* cpu, uint32_t vaddr)
if(!(pte & PTE_V))
{
// Invalid PTE
exception_trigger(cpu, SCAUSE_INSTRUCTION_PAGE_FAULT);
exception_trigger(cpu, mmu_scause_from_access(access_type));
}
// This must be a leaf PTE, as Sv32 only supports 2-level mappings