Handle 8, 16 and 32 bit accesses to extram.

This commit is contained in:
Toby Jaffey 2025-12-11 10:33:45 +00:00
parent 63386f9a92
commit 7a1656ab10
5 changed files with 163 additions and 12 deletions

View file

@ -13,19 +13,36 @@ void main(void) {
} break;
case TEST2: {
uint32_t *p = (uint32_t *)UVM32_EXTRAM_BASE;
printdec(p[32]); // past the end
printdec(p[32]); // word read
} break;
case TEST3: {
uint32_t *p = (uint32_t *)UVM32_EXTRAM_BASE;
p[32] = 1234; // past the end
p[32] = 1234; // past the end, out of bounds
} break;
case TEST4: {
uint32_t *p = (uint32_t *)UVM32_EXTRAM_BASE;
p[0] = 1234; // good write
p[0] = 1234; // word write
yield(0);
} break;
case TEST5: {
uint8_t *p = (uint8_t *)UVM32_EXTRAM_BASE;
p[7] = 0xAB; // single byte write
yield(0);
} break;
case TEST6: {
uint8_t *p = (uint8_t *)UVM32_EXTRAM_BASE;
printdec(p[7]); // single byte read
} break;
case TEST7: {
uint16_t *p = (uint16_t *)UVM32_EXTRAM_BASE;
p[7] = 0xABCD; // short write
yield(0);
} break;
case TEST8: {
uint16_t *p = (uint16_t *)UVM32_EXTRAM_BASE;
printdec(p[7]); // short read
} break;
}
}

View file

@ -6,5 +6,11 @@ enum {
TEST2,
TEST3,
TEST4,
TEST5,
TEST6,
TEST7,
TEST8,
TEST9,
TEST10,
};

View file

@ -97,3 +97,96 @@ void test_extram_out_of_bounds_dirty_flag(void) {
TEST_ASSERT_EQUAL(false, uvm32_extramDirty(&vmst));
}
void test_extram_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_setval(&vmst, &evt, RET, TEST5);
uvm32_run(&vmst, &evt, 100);
TEST_ASSERT_EQUAL(true, uvm32_extramDirty(&vmst));
// check that byte 7 only of extram has changed
uint8_t *p = (uint8_t *)extram;
for (int i=0;i<sizeof(extram);i++) {
if (i == 7) {
TEST_ASSERT_EQUAL(0xAB, p[i]);
} else {
TEST_ASSERT_EQUAL(0x00, p[i]);
}
}
}
void test_extram_byte_read(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, TEST6);
// set only byte 7 in extram
uint8_t *p = (uint8_t *)extram;
p[7] = 0xCD;
uvm32_run(&vmst, &evt, 100);
TEST_ASSERT_EQUAL(false, uvm32_extramDirty(&vmst));
// check for printdec of val
TEST_ASSERT_EQUAL(UVM32_EVT_SYSCALL, evt.typ);
TEST_ASSERT_EQUAL(evt.data.syscall.code, UVM32_SYSCALL_PRINTDEC);
TEST_ASSERT_EQUAL(0xCD, uvm32_getval(&vmst, &evt, ARG0));
}
void test_extram_short_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_setval(&vmst, &evt, RET, TEST7);
uvm32_run(&vmst, &evt, 100);
TEST_ASSERT_EQUAL(true, uvm32_extramDirty(&vmst));
// check that short 7 only of extram has changed
uint16_t *p = (uint16_t *)extram;
for (int i=0;i<sizeof(extram);i++) {
if (i == 7) {
TEST_ASSERT_EQUAL(0xABCD, p[i]);
} else {
TEST_ASSERT_EQUAL(0x00, p[i]);
}
}
}
void test_extram_short_read(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, TEST8);
// set only short 7 in extram
uint16_t *p = (uint16_t *)extram;
p[7] = 0xCDEF;
uvm32_run(&vmst, &evt, 100);
TEST_ASSERT_EQUAL(false, uvm32_extramDirty(&vmst));
// check for printdec of val
TEST_ASSERT_EQUAL(UVM32_EVT_SYSCALL, evt.typ);
TEST_ASSERT_EQUAL(evt.data.syscall.code, UVM32_SYSCALL_PRINTDEC);
TEST_ASSERT_EQUAL(0xCDEF, uvm32_getval(&vmst, &evt, ARG0));
}