saimaa: vec serves maze to Thumb (null-fetch parity)
This commit is contained in:
+23
-1
@@ -167,7 +167,29 @@ struct SaimaaUartState {
|
|||||||
static int saimaa_vec_n;
|
static int saimaa_vec_n;
|
||||||
static uint64_t saimaa_vec_read(void *opaque, hwaddr off, unsigned size)
|
static uint64_t saimaa_vec_read(void *opaque, hwaddr off, unsigned size)
|
||||||
{
|
{
|
||||||
if (saimaa_vec_n < 400) {
|
/* Maze blob mirrored at [0,18) for THUMB fetches: null-jump fetches
|
||||||
|
* (bx r0=0, pop 0, ldr pc,=0) execute the maze and return via lr —
|
||||||
|
* uni parity (hook_null -> STUB). ARM-mode fetches (real exception
|
||||||
|
* entry) keep BKPT vectors below. Data probes elsewhere read 0. */
|
||||||
|
static const uint8_t maze[18] = {
|
||||||
|
0x00, 0x20, 0x4f, 0xea, 0x1e, 0x6c, 0xbc, 0xf1,
|
||||||
|
0x08, 0x0f, 0x00, 0xd1, 0x70, 0x47, 0x72, 0xb6,
|
||||||
|
0xfd, 0xe7,
|
||||||
|
};
|
||||||
|
{
|
||||||
|
ARMCPU *cpu = ARM_CPU(current_cpu);
|
||||||
|
if (cpu && cpu->env.thumb && off < sizeof(maze)) {
|
||||||
|
uint64_t v = 0;
|
||||||
|
unsigned i, n = size;
|
||||||
|
if (off + n > sizeof(maze)) {
|
||||||
|
n = sizeof(maze) - off;
|
||||||
|
}
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
v |= (uint64_t)maze[off + i] << (8 * i);
|
||||||
|
}
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
} if (saimaa_vec_n < 400) {
|
||||||
ARMCPU *cpu = ARM_CPU(current_cpu);
|
ARMCPU *cpu = ARM_CPU(current_cpu);
|
||||||
uint64_t pc = cpu ? cpu->env.regs[15] : 0;
|
uint64_t pc = cpu ? cpu->env.regs[15] : 0;
|
||||||
int th = cpu ? cpu->env.thumb : 0;
|
int th = cpu ? cpu->env.thumb : 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user