Skip to content

Commit e1313a7

Browse files
asdfugilSiguza
authored andcommitted
Add m1n1 boot support
Entry ABI: x0 = Kernel Boot args CurrentEL = Highest EL Entry point is 0x800 into the image. Link: https://github.com/asdfugil/m1n1-idevice
1 parent 455eabb commit e1313a7

File tree

4 files changed

+36
-8
lines changed

4 files changed

+36
-8
lines changed

src/kernel/entry.c

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ __attribute__((noinline)) void pongo_entry_cached()
245245
{
246246
default: // >4
247247
case BOOT_FLAG_RAW: // 4
248+
case BOOT_FLAG_M1N1: // 3
248249
break;
249250

250251
case BOOT_FLAG_HOOK: // 2
@@ -291,7 +292,7 @@ __attribute__((noinline)) void pongo_entry_cached()
291292
*/
292293
extern void set_exception_stack_core0();
293294
extern void lowlevel_set_identity(void);
294-
extern _Noreturn void jump_to_image_extended(uint64_t image, uint64_t args, uint64_t tramp, uint64_t original_image);
295+
extern _Noreturn void jump_to_image_extended(void *image, void *args, void *tramp, void *original_image);
295296
extern uint64_t gPongoSlide;
296297

297298
_Noreturn void pongo_entry(uint64_t *kernel_args, void *entryp, void (*exit_to_el1_image)(void *boot_args, void *boot_entry_point, void *trampoline))
@@ -308,23 +309,32 @@ _Noreturn void pongo_entry(uint64_t *kernel_args, void *entryp, void (*exit_to_e
308309
set_exception_stack_core0();
309310
gFramebuffer = (uint32_t*)gBootArgs->Video.v_baseAddr;
310311
lowlevel_cleanup();
311-
if(gBootFlag == BOOT_FLAG_RAW)
312+
313+
// Unused space above kernel static area
314+
void *boot_tramp = (void*)((gTopOfKernelData + 0x3fffULL) & ~0x3fffULL);
315+
if(gBootFlag == BOOT_FLAG_RAW || gBootFlag == BOOT_FLAG_M1N1)
312316
{
313317
// We're in EL1 here, but we might need to go back to EL3
314-
uint64_t pfr0;
315-
__asm__ volatile("mrs %0, id_aa64pfr0_el1" : "=r"(pfr0));
316-
if((pfr0 & 0xf000) != 0)
318+
if((__builtin_arm_rsr64("id_aa64pfr0_el1") & 0xf000) != 0)
317319
{
318320
__asm__ volatile("smc 0"); // elevate to EL3
319321
}
322+
uint64_t entryOff = 0x800;
323+
if(gBootFlag == BOOT_FLAG_RAW)
324+
{
325+
boot_tramp = NULL;
326+
entryOff = 0;
327+
}
320328
// XXX: We should really replace loader_xfer_recv_data with something dedicated here.
321-
jump_to_image_extended(((uint64_t)loader_xfer_recv_data) - kCacheableView + 0x800000000, (uint64_t)gBootArgs, 0, (uint64_t)gEntryPoint);
329+
void *image = (void*)((uint64_t)loader_xfer_recv_data - kCacheableView + 0x800000000 + entryOff);
330+
jump_to_image_extended(image, gBootArgs, boot_tramp, gEntryPoint);
322331
}
323332
else
324333
{
325334
xnu_boot();
326-
exit_to_el1_image(gBootArgs, gEntryPoint, (void*)((gTopOfKernelData + 0x3fffULL) & ~0x3fffULL));
335+
exit_to_el1_image(gBootArgs, gEntryPoint, boot_tramp);
327336
}
337+
328338
screen_puts("didn't boot?!");
329339
while(1)
330340
{}

src/kernel/main_task.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ void shell_main();
3838
*/
3939

4040
uint64_t gBootTimeTicks;
41+
char gFWVersion[256];
4142
void pongo_main_task() {
4243
gBootTimeTicks = get_ticks();
4344

@@ -87,6 +88,7 @@ void pongo_main_task() {
8788

8889
char *fwversion = dt_get_prop("/chosen", "firmware-version", NULL);
8990
iprintf("Booted by: %s\n", fwversion);
91+
strlcpy(gFWVersion, fwversion, 256);
9092
strcpy(fwversion, "pongoOS-" PONGO_VERSION);
9193
#ifdef __clang__
9294
iprintf("Built with: Clang %s\n", __clang_version__);

src/kernel/pongo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ extern volatile char gBootFlag;
110110
#define BOOT_FLAG_DEFAULT 0
111111
#define BOOT_FLAG_HARD 1
112112
#define BOOT_FLAG_HOOK 2
113-
// 3: Reserved
113+
#define BOOT_FLAG_M1N1 3
114114
#define BOOT_FLAG_RAW 4
115115

116116
typedef uint64_t lock;

src/shell/main.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,21 @@ void pongo_boot_raw() {
4646
task_yield();
4747
}
4848

49+
extern char gFWVersion[256];
50+
void pongo_boot_m1n1() {
51+
if (!loader_xfer_recv_count) {
52+
iprintf("please upload a raw m1n1.bin before issuing this command\n");
53+
return;
54+
}
55+
56+
loader_xfer_recv_count = 0;
57+
char *fwversion = dt_get_prop("/chosen", "firmware-version", NULL);
58+
strlcpy(fwversion, gFWVersion, 256);
59+
60+
gBootFlag = BOOT_FLAG_M1N1;
61+
task_yield();
62+
}
63+
4964
void* ramdisk_buf;
5065
uint32_t ramdisk_size;
5166

@@ -251,6 +266,7 @@ void shell_main() {
251266
command_register("ps", "lists current tasks and irq handlers", task_list);
252267
command_register("ramdisk", "loads a ramdisk for xnu", ramdisk_cmd);
253268
command_register("bootr", "boot raw image", pongo_boot_raw);
269+
command_register("bootm", "boots m1n1", pongo_boot_m1n1);
254270
command_register("spin", "spins 1 second", pongo_spin);
255271
command_register("md8", "memory dump", md8_cmd);
256272
command_register("peek", "32bit mem read", peek_cmd);

0 commit comments

Comments
 (0)