saimaa: sblmain stack-pc override prop; sbl analysis tools

This commit is contained in:
SashegDev
2026-09-07 09:28:02 +00:00
parent 61cb6b9db3
commit 5f14a0eac5
4 changed files with 150 additions and 0 deletions
+24
View File
@@ -100,6 +100,7 @@ struct SaimaaMachineState {
MachineState parent_obj;
char *sbl1;
char *emmc;
char *sblmain; /* hex: popped-PC override for PBL trampoline */
};
typedef struct SaimaaMachineState SaimaaMachineState;
@@ -181,6 +182,14 @@ static void saimaa_machine_init(MachineState *machine)
}
ARM_CPU(first_cpu)->env.regs[13] = 0x085FFF00;
ARM_CPU(first_cpu)->env.regs[0] = 0x00220000; /* fake pbl_shared */
if (sms->sblmain) {
/* PBL trampoline pops pc from stack top; override it */
uint32_t tgt = strtoul(sms->sblmain, NULL, 0);
uint32_t zero = 0;
cpu_physical_memory_write(0x085FFF00, &zero, 4);
cpu_physical_memory_write(0x085FFF00 + 12 * 4, &tgt, 4);
printf("saimaa: stack-pc override -> 0x%x\n", tgt);
}
printf("saimaa: SBL1 %s loaded (%zd bytes), entry 0x%lx\n",
sms->sbl1, sz, (unsigned long)entry);
}
@@ -204,12 +213,27 @@ static void saimaa_set_sbl1(Object *obj, const char *value, Error **errp)
sms->sbl1 = g_strdup(value);
}
static char *saimaa_get_sblmain(Object *obj, Error **errp)
{
return g_strdup(SAIMAA_MACHINE(obj)->sblmain);
}
static void saimaa_set_sblmain(Object *obj, const char *value, Error **errp)
{
SaimaaMachineState *sms = SAIMAA_MACHINE(obj);
g_free(sms->sblmain);
sms->sblmain = g_strdup(value);
}
static void saimaa_machine_instance_init(Object *obj)
{
SaimaaMachineState *sms = SAIMAA_MACHINE(obj);
sms->sbl1 = NULL;
sms->emmc = NULL;
sms->sblmain = NULL;
object_property_add_str(obj, "sbl1", saimaa_get_sbl1, saimaa_set_sbl1);
object_property_add_str(obj, "sblmain", saimaa_get_sblmain,
saimaa_set_sblmain);
}
static void saimaa_machine_class_init(ObjectClass *oc, void *data)