saimaa: stubs region readonly after implant
This commit is contained in:
+21
-3
@@ -35,6 +35,10 @@
|
|||||||
/* High DDRLOW for our stubs (SBL heap reuses 0x0806xxxx) */
|
/* High DDRLOW for our stubs (SBL heap reuses 0x0806xxxx) */
|
||||||
#define SAIMAA_DDRHI_BASE 0x08610000
|
#define SAIMAA_DDRHI_BASE 0x08610000
|
||||||
#define SAIMAA_DDRHI_SIZE 0x00FF0000 /* ..0x09600000 */
|
#define SAIMAA_DDRHI_SIZE 0x00FF0000 /* ..0x09600000 */
|
||||||
|
/* Stubs carve-out inside DDRHI (SBL heap overwrites plain RAM):
|
||||||
|
* maze+S6+banner+mailbox live here, set read-only after implant. */
|
||||||
|
#define SAIMAA_STUBS_BASE 0x08800000
|
||||||
|
#define SAIMAA_STUBS_SIZE 0x00000300
|
||||||
#define SAIMAA_IMEM_BASE 0x08600000
|
#define SAIMAA_IMEM_BASE 0x08600000
|
||||||
#define SAIMAA_IMEM_SIZE 0x00010000
|
#define SAIMAA_IMEM_SIZE 0x00010000
|
||||||
#define SAIMAA_DDRH_A_BASE 0x80000000
|
#define SAIMAA_DDRH_A_BASE 0x80000000
|
||||||
@@ -94,6 +98,9 @@ static void saimaa_tmr_init(Object *obj)
|
|||||||
sysbus_init_mmio(dev, &s->iomem);
|
sysbus_init_mmio(dev, &s->iomem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Stubs region handle for set_readonly after scaffold implant. */
|
||||||
|
static MemoryRegion *saimaa_stubs_mr;
|
||||||
|
|
||||||
/* ---- minimal MSM UARTDM stub: TX prints, status always ready ---- */
|
/* ---- minimal MSM UARTDM stub: TX prints, status always ready ---- */
|
||||||
#define TYPE_SAIMAA_VEC "saimaa-vec"
|
#define TYPE_SAIMAA_VEC "saimaa-vec"
|
||||||
#define TYPE_SAIMAA_UART "saimaa-uart"
|
#define TYPE_SAIMAA_UART "saimaa-uart"
|
||||||
@@ -248,19 +255,27 @@ static void saimaa_machine_init(MachineState *machine)
|
|||||||
{ "saimaa.rpm", SAIMAA_RPM_BASE, SAIMAA_RPM_SIZE },
|
{ "saimaa.rpm", SAIMAA_RPM_BASE, SAIMAA_RPM_SIZE },
|
||||||
{ "saimaa.ocimem", SAIMAA_OCIMEM_BASE, SAIMAA_OCIMEM_SIZE },
|
{ "saimaa.ocimem", SAIMAA_OCIMEM_BASE, SAIMAA_OCIMEM_SIZE },
|
||||||
{ "saimaa.ddrlow", SAIMAA_DDRLOW_BASE, SAIMAA_DDRLOW_SIZE },
|
{ "saimaa.ddrlow", SAIMAA_DDRLOW_BASE, SAIMAA_DDRLOW_SIZE },
|
||||||
{ "saimaa.ddrhi", SAIMAA_DDRHI_BASE, SAIMAA_DDRHI_SIZE },
|
{ "saimaa.ddrhi_lo", SAIMAA_DDRHI_BASE,
|
||||||
|
SAIMAA_STUBS_BASE - SAIMAA_DDRHI_BASE },
|
||||||
|
{ "saimaa.stubs", SAIMAA_STUBS_BASE, SAIMAA_STUBS_SIZE },
|
||||||
|
{ "saimaa.ddrhi_hi", SAIMAA_STUBS_BASE + SAIMAA_STUBS_SIZE,
|
||||||
|
SAIMAA_DDRHI_BASE + SAIMAA_DDRHI_SIZE -
|
||||||
|
(SAIMAA_STUBS_BASE + SAIMAA_STUBS_SIZE) },
|
||||||
{ "saimaa.imem", SAIMAA_IMEM_BASE, SAIMAA_IMEM_SIZE },
|
{ "saimaa.imem", SAIMAA_IMEM_BASE, SAIMAA_IMEM_SIZE },
|
||||||
{ "saimaa.ddrhigh_a", SAIMAA_DDRH_A_BASE, SAIMAA_DDRH_A_SIZE },
|
{ "saimaa.ddrhigh_a", SAIMAA_DDRH_A_BASE, SAIMAA_DDRH_A_SIZE },
|
||||||
{ "saimaa.ddrhigh_b", SAIMAA_DDRH_B_BASE, SAIMAA_DDRH_B_SIZE },
|
{ "saimaa.ddrhigh_b", SAIMAA_DDRH_B_BASE, SAIMAA_DDRH_B_SIZE },
|
||||||
{ "saimaa.mystrom", SAIMAA_MYSTROM_BASE, SAIMAA_MYSTROM_SIZE },
|
{ "saimaa.mystrom", SAIMAA_MYSTROM_BASE, SAIMAA_MYSTROM_SIZE },
|
||||||
{ "saimaa.smem", SAIMAA_SMEM_BASE, SAIMAA_SMEM_SIZE },
|
{ "saimaa.smem", SAIMAA_SMEM_BASE, SAIMAA_SMEM_SIZE },
|
||||||
};
|
};
|
||||||
for (i = 0; i < 10; i++) {
|
for (i = 0; i < 11; i++) {
|
||||||
MemoryRegion *ram = g_new(MemoryRegion, 1);
|
MemoryRegion *ram = g_new(MemoryRegion, 1);
|
||||||
memory_region_init_ram(ram, NULL, rams[i].n, rams[i].s,
|
memory_region_init_ram(ram, NULL, rams[i].n, rams[i].s,
|
||||||
&error_fatal);
|
&error_fatal);
|
||||||
memory_region_add_subregion_overlap(sysmem, rams[i].b, ram,
|
memory_region_add_subregion_overlap(sysmem, rams[i].b, ram,
|
||||||
1);
|
1);
|
||||||
|
if (!strcmp(rams[i].n, "saimaa.stubs")) {
|
||||||
|
saimaa_stubs_mr = ram;
|
||||||
|
}
|
||||||
if (!strcmp(rams[i].n, "saimaa.mystrom")) {
|
if (!strcmp(rams[i].n, "saimaa.mystrom")) {
|
||||||
/* Mystery handler ROM: ARM mov r0,#0; bx lr repeating,
|
/* Mystery handler ROM: ARM mov r0,#0; bx lr repeating,
|
||||||
* so unknown blx targets return 0 instead of faulting. */
|
* so unknown blx targets return 0 instead of faulting. */
|
||||||
@@ -595,6 +610,9 @@ static void saimaa_machine_init(MachineState *machine)
|
|||||||
printf("saimaa: uefi tables live\n");
|
printf("saimaa: uefi tables live\n");
|
||||||
}
|
}
|
||||||
printf("saimaa: slots live\n");
|
printf("saimaa: slots live\n");
|
||||||
|
/* Freeze stubs: any SBL write here now faults loudly
|
||||||
|
* (data abort with DFAR) instead of silent corruption. */
|
||||||
|
memory_region_set_readonly(saimaa_stubs_mr, true);
|
||||||
}
|
}
|
||||||
printf("saimaa: SBL1 %s loaded (%zd bytes), entry 0x%lx\n",
|
printf("saimaa: SBL1 %s loaded (%zd bytes), entry 0x%lx\n",
|
||||||
sms->sbl1, sz, (unsigned long)entry);
|
sms->sbl1, sz, (unsigned long)entry);
|
||||||
|
|||||||
Reference in New Issue
Block a user