diff --git a/libc/crt/crt.S b/libc/crt/crt.S index cc8ae2f35..3340181f3 100644 --- a/libc/crt/crt.S +++ b/libc/crt/crt.S @@ -127,7 +127,7 @@ _start: #if SupportsFreebsd() // save first arg - mov x3,x0 + mov x4,x0 #endif // save original stack pointer diff --git a/libc/runtime/cosmo2.c b/libc/runtime/cosmo2.c index 7326b22b6..c1f5b9b34 100644 --- a/libc/runtime/cosmo2.c +++ b/libc/runtime/cosmo2.c @@ -79,7 +79,7 @@ static const char *DecodeMagnum(const char *p, long *r) { } wontreturn textstartup void cosmo(long *sp, struct Syslib *m1, char *exename, - long *is_freebsd) { + int os, long *is_freebsd) { // get startup timestamp as early as possible // its used by --strace and also kprintf() %T @@ -117,17 +117,27 @@ wontreturn textstartup void cosmo(long *sp, struct Syslib *m1, char *exename, __program_executable_name = exename; program_invocation_name = argv[0]; __oldstack = (intptr_t)sp; + if (!(hostos = os)) { + if (SupportsFreebsd() && is_freebsd) { + hostos = _HOSTFREEBSD; + } else if (SupportsXnu() && m1) { + hostos = _HOSTXNU; + } else if (SupportsLinux()) { + hostos = _HOSTLINUX; + } else { + notpossible; + } + } - // detect apple m1 environment const char *magnums; - if (SupportsFreebsd() && is_freebsd) { - hostos = _HOSTFREEBSD; + if (IsFreebsd()) { magnums = syscon_freebsd; - } else if (SupportsXnu() && (__syslib = m1)) { - hostos = _HOSTXNU; + } else if (IsXnu()) { + if (!(__syslib = m1)) { + notpossible; + } magnums = syscon_xnu; - } else if (SupportsLinux()) { - hostos = _HOSTLINUX; + } else if (IsLinux()) { magnums = syscon_linux; } else { notpossible; @@ -139,7 +149,7 @@ wontreturn textstartup void cosmo(long *sp, struct Syslib *m1, char *exename, } // check system call abi compatibility - if (SupportsXnu() && __syslib && __syslib->__version < SYSLIB_VERSION) { + if (IsXnu() && __syslib->__version < SYSLIB_VERSION) { sys_write(2, "need newer ape loader\n", 22); _Exit(127); }