diff --git a/ape/loader-elf.S b/ape/loader-elf.S index 7ba774525..5e2c3725c 100644 --- a/ape/loader-elf.S +++ b/ape/loader-elf.S @@ -213,7 +213,18 @@ macho: .long 0xFEEDFACE+1 // // @see APE_LOADER_ENTRY // @see ape/loader.h -_start: mov %rsp,%rsi +_start: + +// Hack for detecting M1 Rosetta environment. +// https://github.com/jart/cosmopolitan/issues/429#issuecomment-1166704377 + cmp $-1,%ebx + jne 0f + cmp $+1,%edx + jne 0f + mov $XNU,%dl + xor %ecx,%ecx + +0: mov %rsp,%rsi jmp ApeLoader .endfn _start,globl diff --git a/ape/loader-macho.S b/ape/loader-macho.S index b027760a7..5bd2bbcd5 100644 --- a/ape/loader-macho.S +++ b/ape/loader-macho.S @@ -113,7 +113,18 @@ macho: .long 0xFEEDFACE+1 .endobj macho,globl .align 64 -_start: mov %rsp,%rsi +_start: + +// Hack for detecting M1 Rosetta environment. +// https://github.com/jart/cosmopolitan/issues/429#issuecomment-1166704377 + cmp $-1,%ebx + jne 0f + cmp $+1,%edx + jne 0f + mov $XNU,%dl + xor %ecx,%ecx + +0: mov %rsp,%rsi jmp ApeLoader .endfn _start,globl diff --git a/ape/loader.c b/ape/loader.c index 5e1f3de82..e5354eb09 100644 --- a/ape/loader.c +++ b/ape/loader.c @@ -595,11 +595,11 @@ __attribute__((__noreturn__)) void ApeLoader(long di, long *sp, char dl, // detect freebsd if (handoff) { os = handoff->os; + } else if (SupportsXnu() && dl == XNU) { + os = XNU; } else if (SupportsFreebsd() && di) { os = FREEBSD; sp = (long *)di; - } else if (SupportsXnu() && dl == XNU) { - os = XNU; } else { os = 0; } diff --git a/libc/crt/crt.S b/libc/crt/crt.S index f30fde679..1cdca0e69 100644 --- a/libc/crt/crt.S +++ b/libc/crt/crt.S @@ -31,6 +31,18 @@ // @noreturn _start: +#if SupportsXnu() +// Hack for detecting M1 Rosetta environment. +// https://github.com/jart/cosmopolitan/issues/429#issuecomment-1166704377 + cmp $-1,%ebx + jne 0f + cmp $+1,%edx + jne 0f + mov $XNU,%cl + xor %edi,%edi +0: +#endif + #if SupportsFreebsd() // detect free besiyata dishmaya test %rdi,%rdi