verify MMR* registers

This commit is contained in:
folkert van heusden 2024-04-12 18:04:03 +02:00
parent 132dba3cba
commit ce8af01f63
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1
3 changed files with 25 additions and 3 deletions

1
bus.h
View file

@ -169,6 +169,7 @@ public:
uint16_t getMMR1() { return MMR1; }
uint16_t getMMR2() { return MMR2; }
uint16_t getMMR3() { return MMR3; }
uint16_t getMMR(int nr) { uint16_t *mmrs[] { &MMR0, &MMR1, &MMR2, &MMR3 }; return *mmrs[nr]; }
void clearMMR1();
void addToMMR1(const int8_t delta, const uint8_t reg);
void setMMR0(const uint16_t value);

View file

@ -148,7 +148,8 @@ class test_generator:
#if p.simple_run_1(addr) == False:
# return None
if (p.straps or p.issues) and ignore_traps:
#if (p.straps or p.issues) and ignore_traps:
if p.straps and ignore_traps:
return None
p._syncregs()
@ -162,9 +163,18 @@ class test_generator:
out['memory-after'] = dict()
mem_transactions = p.get_mem_transactions_dict()
# verify original values
for a, v in mem_kv:
if not a in mem_transactions:
mem_transactions[a] = v
for a in mem_transactions:
out['memory-after'][a] = mem_transactions[a]
# TODO originele geheugeninhouden checken
out['mmr0-after'] = p.mmu.MMR0
p.mmu._MMR1commit()
out['mmr1-after'] = p.mmu.MMR1
out['mmr2-after'] = p.mmu.MMR2
out['mmr3-after'] = p.mmu.MMR3
return out
@ -179,7 +189,7 @@ class test_generator:
stop = False
while True:
psw = random.randint(0, 65535) & 0o174377
name = f'/mnt/temp/0006-{psw:06o}.json'
name = f'/data/data/temp2/0008-{psw:06o}.json'
if os.path.isfile(name):
print(f'skipping {name}')
continue

View file

@ -200,6 +200,17 @@ int run_cpu_validation(const std::string & filename)
}
}
for(int r=0; r<4; r++) {
json_t *a_mmr = json_object_get(test, format("mmr%d-after", r).c_str());
assert(a_mmr);
uint16_t should_be_mmr = json_integer_value(a_mmr);
uint16_t is_mmr = b->getMMR(r);
if (should_be_mmr != is_mmr) {
DOLOG(warning, true, "MMR%d register mismatch (is: %06o (%d), should be: %06o (%d))", r, is_mmr, is_mmr, should_be_mmr, should_be_mmr);
err = true;
}
}
if (err) {
if (c->is_it_a_trap())
DOLOG(warning, true, "Error by TRAP %s", disas_data["instruction-text"].at(0).c_str());