Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/drivers/xnu/xnu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1127,7 +1127,6 @@ void xnu_boot(void)
{
panic("Cannot boot XNU with TZ0 unlocked");
}*/
gBootArgs->topOfKernelData = gTopOfKernelData;
}

void xnu_init(void)
Expand Down
15 changes: 10 additions & 5 deletions src/kernel/entry.c
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,8 @@ __attribute__((noinline)) void pongo_entry_cached(void)
screen_fill_basecolor();
}

extern uint64_t gM1N1Base;

/*

Name: pongo_entry
Expand All @@ -309,25 +311,28 @@ _Noreturn void pongo_entry(uint64_t *kernel_args, void *entryp, void (*exit_to_e
set_exception_stack_core0();
gFramebuffer = (uint32_t*)gBootArgs->Video.v_baseAddr;
lowlevel_cleanup();
gBootArgs->topOfKernelData = gTopOfKernelData;

// Unused space above kernel static area
void *boot_tramp = (void*)((gTopOfKernelData + 0x3fffULL) & ~0x3fffULL);
if(gBootFlag == BOOT_FLAG_RAW || gBootFlag == BOOT_FLAG_M1N1)
{
uint64_t entry;
// We're in EL1 here, but we might need to go back to EL3
if((__builtin_arm_rsr64("id_aa64pfr0_el1") & 0xf000) != 0)
{
__asm__ volatile("smc 0"); // elevate to EL3
}
uint64_t entryOff = 0x800;
if(gBootFlag == BOOT_FLAG_RAW)
{
entry = (uint64_t)loader_xfer_recv_data - kCacheableView + 0x800000000;
boot_tramp = NULL;
entryOff = 0;
}
// XXX: We should really replace loader_xfer_recv_data with something dedicated here.
void *image = (void*)((uint64_t)loader_xfer_recv_data - kCacheableView + 0x800000000 + entryOff);
jump_to_image_extended(image, gBootArgs, boot_tramp, gEntryPoint);
else
{
entry = gM1N1Base + 0x800;
}
jump_to_image_extended((void*)entry, gBootArgs, boot_tramp, gEntryPoint);
}
else
{
Expand Down
7 changes: 6 additions & 1 deletion src/shell/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,22 @@ void pongo_boot_raw(const char *cmd, char *args) {
task_yield();
}

uint64_t gM1N1Base;
extern char gFWVersion[256];
void pongo_boot_m1n1(const char *cmd, char *args) {
if (!loader_xfer_recv_count) {
iprintf("please upload a raw m1n1.bin before issuing this command\n");
return;
}

loader_xfer_recv_count = 0;
char *fwversion = dt_get_prop("/chosen", "firmware-version", NULL);
strlcpy(fwversion, gFWVersion, 256);

void *m1n1 = alloc_static(loader_xfer_recv_count);
memmove(m1n1, loader_xfer_recv_data, loader_xfer_recv_count);
loader_xfer_recv_count = 0;
gM1N1Base = vatophys_static(m1n1);

gBootFlag = BOOT_FLAG_M1N1;
task_yield();
}
Expand Down
Loading