diff --git a/test/extram/rom/rom.c b/test/extram/rom/rom.c index c284bfb..00c06dc 100644 --- a/test/extram/rom/rom.c +++ b/test/extram/rom/rom.c @@ -77,7 +77,24 @@ void main(void) { // pass a string beyond end of extram println((uint32_t)UVM32_EXTRAM_BASE); // extram has been shrunk, this is now out of bounds, } break; - + case TEST15: { + int8_t *p = (int8_t *)UVM32_EXTRAM_BASE; + p[7] = -42; // single byte write + yield(0); + } break; + case TEST16: { + int8_t *p = (int8_t *)UVM32_EXTRAM_BASE; + printdec(p[7]); // single byte read + } break; + case TEST17: { + int16_t *p = (int16_t *)UVM32_EXTRAM_BASE; + p[7] = -1234; // short write + yield(0); + } break; + case TEST18: { + int16_t *p = (int16_t *)UVM32_EXTRAM_BASE; + printdec(p[7]); // short read + } break; } } diff --git a/test/extram/shared.h b/test/extram/shared.h index 05d77a8..0e83b66 100644 --- a/test/extram/shared.h +++ b/test/extram/shared.h @@ -16,5 +16,9 @@ enum { TEST12, TEST13, TEST14, + TEST15, + TEST16, + TEST17, + TEST18, }; diff --git a/test/extram/test/tests.c b/test/extram/test/tests.c index ebfadb5..a533d1c 100644 --- a/test/extram/test/tests.c +++ b/test/extram/test/tests.c @@ -401,3 +401,95 @@ void test_extram_buf_cstr_beyond_extram_end(void) { } +void test_extram_signed_byte_write(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_arg_setval(&vmst, &evt, RET, TEST15); + + uvm32_run(&vmst, &evt, 100); + TEST_ASSERT_EQUAL(true, uvm32_extramDirty(&vmst)); + + // check that byte 7 only of extram has changed + int8_t *p = (int8_t *)extram; + for (int i=0;i