diff --git a/test/syscall_args/rom/rom.c b/test/syscall_args/rom/rom.c index 7ef7f85..232fabd 100644 --- a/test/syscall_args/rom/rom.c +++ b/test/syscall_args/rom/rom.c @@ -47,6 +47,11 @@ void syscall_i_test(void) { syscall((uint32_t)SYSCALL_I, (uint32_t)p, 0); } +void syscall_j_test(void) { + uint32_t *p = (uint32_t *)0xF0000000; + syscall((uint32_t)SYSCALL_I, (uint32_t)p[0], 0); // try to read from beyond memory and not in MMIO region +} + void main(void) { switch(syscall(SYSCALL_PICKTEST, 0, 0)) { case SYSCALL_A: @@ -70,6 +75,9 @@ void main(void) { case SYSCALL_I: syscall_i_test(); break; + case SYSCALL_J: + syscall_j_test(); + break; } } diff --git a/test/syscall_args/shared.h b/test/syscall_args/shared.h index 07fb572..94f5348 100644 --- a/test/syscall_args/shared.h +++ b/test/syscall_args/shared.h @@ -14,4 +14,5 @@ #define SYSCALL_G SYSCALL_BASE+7 #define SYSCALL_H SYSCALL_BASE+8 #define SYSCALL_I SYSCALL_BASE+9 +#define SYSCALL_J SYSCALL_BASE+10 diff --git a/test/syscall_args/test/tests.c b/test/syscall_args/test/tests.c index a17cd76..03836a9 100644 --- a/test/syscall_args/test/tests.c +++ b/test/syscall_args/test/tests.c @@ -211,3 +211,18 @@ void test_syscall_args_bufrd_toolarge(void) { TEST_ASSERT_EQUAL(evt.data.err.errcode, UVM32_ERR_MEM_RD); } +void test_syscall_args_read_badram(void) { + // run the vm + uvm32_run(&vmst, &evt, 1000); + // check for picktest syscall + TEST_ASSERT_EQUAL(evt.typ, UVM32_EVT_SYSCALL); + TEST_ASSERT_EQUAL(evt.data.syscall.code, SYSCALL_PICKTEST); + uvm32_arg_setval(&vmst, &evt, RET, SYSCALL_J); + + uvm32_run(&vmst, &evt, 1000); + // check for error state + uvm32_run(&vmst, &evt, 100); + TEST_ASSERT_EQUAL(evt.typ, UVM32_EVT_ERR); + TEST_ASSERT_EQUAL(evt.data.err.errcode, UVM32_ERR_MEM_RD); +} +