Handle mapping a buffer to extram

This commit is contained in:
Toby Jaffey 2025-12-12 14:24:34 +00:00
parent 238b4c5fcf
commit 9836500503

View file

@ -127,16 +127,34 @@ bool get_safeptr_null_terminated(uvm32_state_t *vmst, uint32_t addr, uvm32_evt_s
} }
bool get_safeptr(uvm32_state_t *vmst, uint32_t addr, uint32_t len, uvm32_evt_syscall_buf_t *buf) { bool get_safeptr(uvm32_state_t *vmst, uint32_t addr, uint32_t len, uvm32_evt_syscall_buf_t *buf) {
uint32_t ptrstart = addr - MINIRV32_RAM_IMAGE_OFFSET; uint32_t ptrstart;
if ((ptrstart > UVM32_MEMORY_SIZE) || (ptrstart + len >= UVM32_MEMORY_SIZE)) { if (MINIRV32_MMIO_RANGE(addr)) {
setStatusErr(vmst, UVM32_ERR_MEM_RD); if (vmst->extram == NULL) {
buf->ptr = (uint8_t *)NULL; return false;
buf->len = 0; } else {
return false; uint32_t ptrstart = addr - UVM32_EXTRAM_BASE;
if ((ptrstart > vmst->extramLen) || (ptrstart + len >= vmst->extramLen)) {
setStatusErr(vmst, UVM32_ERR_MEM_RD);
buf->ptr = (uint8_t *)NULL;
buf->len = 0;
return false;
}
buf->ptr = (uint8_t *)&vmst->extram[ptrstart/4]; // extram is uint32_t*
buf->len = len;
return true;
}
} else {
uint32_t ptrstart = addr - MINIRV32_RAM_IMAGE_OFFSET;
if ((ptrstart > UVM32_MEMORY_SIZE) || (ptrstart + len >= UVM32_MEMORY_SIZE)) {
setStatusErr(vmst, UVM32_ERR_MEM_RD);
buf->ptr = (uint8_t *)NULL;
buf->len = 0;
return false;
}
buf->ptr = &vmst->memory[ptrstart];
buf->len = len;
return true;
} }
buf->ptr = &vmst->memory[ptrstart];
buf->len = len;
return true;
} }
void uvm32_clearError(uvm32_state_t *vmst) { void uvm32_clearError(uvm32_state_t *vmst) {