mirror of
https://github.com/ringtailsoftware/uvm32.git
synced 2026-06-06 06:53:39 +00:00
Handle syscall cstring argument when pointing to extram
This commit is contained in:
parent
ce63353156
commit
74267d94df
3 changed files with 100 additions and 13 deletions
|
|
@ -42,6 +42,25 @@ void main(void) {
|
||||||
uint16_t *p = (uint16_t *)UVM32_EXTRAM_BASE;
|
uint16_t *p = (uint16_t *)UVM32_EXTRAM_BASE;
|
||||||
printdec(p[7]); // short read
|
printdec(p[7]); // short read
|
||||||
} break;
|
} break;
|
||||||
|
case TEST9: {
|
||||||
|
uint8_t *p = (uint8_t *)UVM32_EXTRAM_BASE;
|
||||||
|
p[0] = 'h';
|
||||||
|
p[1] = 'e';
|
||||||
|
p[2] = 'l';
|
||||||
|
p[3] = 'l';
|
||||||
|
p[4] = 'o';
|
||||||
|
printbuf(p, 5); // try to print from extram (unterminated)
|
||||||
|
} break;
|
||||||
|
case TEST10: {
|
||||||
|
uint8_t *p = (uint8_t *)UVM32_EXTRAM_BASE;
|
||||||
|
p[0] = 'h';
|
||||||
|
p[1] = 'e';
|
||||||
|
p[2] = 'l';
|
||||||
|
p[3] = 'l';
|
||||||
|
p[4] = 'o';
|
||||||
|
p[5] = '\0';
|
||||||
|
println(p); // try to print from extram (terminated)
|
||||||
|
} break;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -189,4 +189,44 @@ void test_extram_short_read(void) {
|
||||||
TEST_ASSERT_EQUAL(0xCDEF, uvm32_getval(&vmst, &evt, ARG0));
|
TEST_ASSERT_EQUAL(0xCDEF, uvm32_getval(&vmst, &evt, ARG0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_extram_buf_unterminated(void) {
|
||||||
|
// run the vm
|
||||||
|
uvm32_run(&vmst, &evt, 100);
|
||||||
|
TEST_ASSERT_EQUAL(false, uvm32_extramDirty(&vmst));
|
||||||
|
|
||||||
|
// check for picktest syscall
|
||||||
|
TEST_ASSERT_EQUAL(evt.typ, UVM32_EVT_SYSCALL);
|
||||||
|
TEST_ASSERT_EQUAL(evt.data.syscall.code, SYSCALL_PICKTEST);
|
||||||
|
uvm32_setval(&vmst, &evt, RET, TEST9);
|
||||||
|
|
||||||
|
uvm32_run(&vmst, &evt, 100);
|
||||||
|
TEST_ASSERT_EQUAL(true, uvm32_extramDirty(&vmst));
|
||||||
|
// check for printbuf of val
|
||||||
|
TEST_ASSERT_EQUAL(UVM32_EVT_SYSCALL, evt.typ);
|
||||||
|
TEST_ASSERT_EQUAL(evt.data.syscall.code, UVM32_SYSCALL_PRINTBUF);
|
||||||
|
uvm32_evt_syscall_buf_t buf = uvm32_getbuf(&vmst, &evt, ARG0, ARG1);
|
||||||
|
TEST_ASSERT_EQUAL(5, buf.len);
|
||||||
|
TEST_ASSERT_EQUAL(0, memcmp(buf.ptr, "hello", 5));
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_extram_buf_terminated(void) {
|
||||||
|
// run the vm
|
||||||
|
uvm32_run(&vmst, &evt, 100);
|
||||||
|
TEST_ASSERT_EQUAL(false, uvm32_extramDirty(&vmst));
|
||||||
|
|
||||||
|
// check for picktest syscall
|
||||||
|
TEST_ASSERT_EQUAL(evt.typ, UVM32_EVT_SYSCALL);
|
||||||
|
TEST_ASSERT_EQUAL(evt.data.syscall.code, SYSCALL_PICKTEST);
|
||||||
|
uvm32_setval(&vmst, &evt, RET, TEST9);
|
||||||
|
|
||||||
|
uvm32_run(&vmst, &evt, 100);
|
||||||
|
TEST_ASSERT_EQUAL(true, uvm32_extramDirty(&vmst));
|
||||||
|
// check for printbuf of val
|
||||||
|
TEST_ASSERT_EQUAL(UVM32_EVT_SYSCALL, evt.typ);
|
||||||
|
TEST_ASSERT_EQUAL(evt.data.syscall.code, UVM32_SYSCALL_PRINTBUF);
|
||||||
|
const char *str = uvm32_getcstr(&vmst, &evt, ARG0);
|
||||||
|
TEST_ASSERT_NOT_EQUAL(NULL, str);
|
||||||
|
TEST_ASSERT_EQUAL(0, strcmp(str, "hello"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,33 @@ bool uvm32_load(uvm32_state_t *vmst, const uint8_t *rom, int len) {
|
||||||
|
|
||||||
// Read C-string up to terminator and return len,ptr
|
// Read C-string up to terminator and return len,ptr
|
||||||
bool get_safeptr_null_terminated(uvm32_state_t *vmst, uint32_t addr, uvm32_evt_syscall_buf_t *buf) {
|
bool get_safeptr_null_terminated(uvm32_state_t *vmst, uint32_t addr, uvm32_evt_syscall_buf_t *buf) {
|
||||||
|
if (MINIRV32_MMIO_RANGE(addr)) {
|
||||||
|
if (vmst->extram == NULL) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
uint32_t ptrstart = addr - UVM32_EXTRAM_BASE;;
|
||||||
|
uint32_t p = ptrstart;
|
||||||
|
if (p >= vmst->extramLen) {
|
||||||
|
setStatusErr(vmst, UVM32_ERR_MEM_RD);
|
||||||
|
buf->ptr = (uint8_t *)NULL;
|
||||||
|
buf->len = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
while(vmst->memory[p] != '\0') {
|
||||||
|
p++;
|
||||||
|
if (p >= 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 = p - ptrstart;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
uint32_t ptrstart = addr - MINIRV32_RAM_IMAGE_OFFSET;
|
uint32_t ptrstart = addr - MINIRV32_RAM_IMAGE_OFFSET;
|
||||||
uint32_t p = ptrstart;
|
uint32_t p = ptrstart;
|
||||||
if (p >= UVM32_MEMORY_SIZE) {
|
if (p >= UVM32_MEMORY_SIZE) {
|
||||||
|
|
@ -125,6 +152,7 @@ bool get_safeptr_null_terminated(uvm32_state_t *vmst, uint32_t addr, uvm32_evt_s
|
||||||
buf->len = p - ptrstart;
|
buf->len = p - ptrstart;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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) {
|
||||||
if (MINIRV32_MMIO_RANGE(addr)) {
|
if (MINIRV32_MMIO_RANGE(addr)) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue