mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-03-03 07:29:23 +00:00
Allocate explicit stack on aarch64
This commit is contained in:
parent
0e586c834a
commit
de3f3a9e5a
10 changed files with 144 additions and 74 deletions
|
@ -278,8 +278,10 @@ SECTIONS {
|
|||
}
|
||||
}
|
||||
|
||||
ape_stack_vaddr = DEFINED(ape_stack_vaddr) ? ape_stack_vaddr : 0x700000000000;
|
||||
ape_stack_memsz = DEFINED(ape_stack_memsz) ? ape_stack_memsz : APE_STACKSIZE;
|
||||
ape_stack_memsz2 = ape_stack_memsz * 2;
|
||||
|
||||
_tls_size = _tbss_end - _tdata_start;
|
||||
_tdata_size = _tdata_end - _tdata_start;
|
||||
_tbss_size = _tbss_end - _tbss_start;
|
||||
|
|
15
bin/aarch64-unknown-cosmo-install
Executable file
15
bin/aarch64-unknown-cosmo-install
Executable file
|
@ -0,0 +1,15 @@
|
|||
#!/bin/sh
|
||||
|
||||
FIRST=1
|
||||
for x; do
|
||||
if [ $FIRST -eq 1 ]; then
|
||||
set --
|
||||
FIRST=0
|
||||
fi
|
||||
if [ x"$x" = x"-s" ]; then
|
||||
continue
|
||||
fi
|
||||
set -- "$@" "$x"
|
||||
done
|
||||
|
||||
exec install "$@"
|
3
bin/apelink
Executable file
3
bin/apelink
Executable file
|
@ -0,0 +1,3 @@
|
|||
#!/bin/sh
|
||||
COSMO=${COSMO:-/opt/cosmo}
|
||||
exec "$COSMO/o//tool/build/apelink.com" "$@"
|
15
bin/x86_64-unknown-cosmo-install
Executable file
15
bin/x86_64-unknown-cosmo-install
Executable file
|
@ -0,0 +1,15 @@
|
|||
#!/bin/sh
|
||||
|
||||
FIRST=1
|
||||
for x; do
|
||||
if [ $FIRST -eq 1 ]; then
|
||||
set --
|
||||
FIRST=0
|
||||
fi
|
||||
if [ x"$x" = x"-s" ]; then
|
||||
continue
|
||||
fi
|
||||
set -- "$@" "$x"
|
||||
done
|
||||
|
||||
exec install "$@"
|
|
@ -126,17 +126,6 @@ _start:
|
|||
// this is the first argument to cosmo() below
|
||||
mov x0,sp
|
||||
|
||||
// align stack to GetStackSize() so GetStackAddr() is fast
|
||||
mov x1,sp
|
||||
.weak ape_stack_memsz
|
||||
ldr x2,=ape_stack_memsz
|
||||
neg x2,x2
|
||||
and x1,x2,x1
|
||||
mov sp,x1
|
||||
|
||||
// setup backtraces
|
||||
mov x29,#0
|
||||
|
||||
// second arg shall be struct Syslib passed by ape-m1.c
|
||||
// used to talk to apple's authoritarian libraries
|
||||
// should be set to zero on other platforms
|
||||
|
|
|
@ -206,12 +206,14 @@ relegated void __oncrash_arm64(int sig, struct siginfo *si, void *arg) {
|
|||
}
|
||||
Append(b,
|
||||
"%serror%s: Uncaught %G (%s) on %s pid %d tid %d\n"
|
||||
" %s\n"
|
||||
" %m\n"
|
||||
" %s %s %s %s\n",
|
||||
"%s\n",
|
||||
strong, reset, sig, kind, host, getpid(), gettid(),
|
||||
program_invocation_name, names.sysname, names.version,
|
||||
names.nodename, names.release);
|
||||
program_invocation_name);
|
||||
if (errno) {
|
||||
Append(b, " %m\n");
|
||||
}
|
||||
Append(b, " %s %s %s %s\n", names.sysname, names.version, names.nodename,
|
||||
names.release);
|
||||
if (ctx) {
|
||||
long pc;
|
||||
char line[256];
|
||||
|
|
|
@ -17,8 +17,10 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/calls/struct/rlimit.h"
|
||||
#include "libc/calls/syscall-sysv.internal.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/errno.h"
|
||||
#include "libc/intrin/kprintf.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/limits.h"
|
||||
|
@ -29,11 +31,15 @@
|
|||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/runtime/stack.h"
|
||||
#include "libc/runtime/syslib.internal.h"
|
||||
#include "libc/sysv/consts/auxv.h"
|
||||
#include "libc/sysv/consts/map.h"
|
||||
#include "libc/sysv/consts/nr.h"
|
||||
#include "libc/sysv/consts/prot.h"
|
||||
#include "libc/sysv/consts/rlim.h"
|
||||
#include "libc/sysv/consts/rlimit.h"
|
||||
#include "libc/sysv/consts/sig.h"
|
||||
#include "libc/thread/thread.h"
|
||||
#include "libc/thread/tls.h"
|
||||
#include "libc/errno.h"
|
||||
#include "third_party/lua/lunix.h"
|
||||
#ifndef __x86_64__
|
||||
|
||||
|
@ -64,6 +70,11 @@ extern char ape_stack_prot[] __attribute__((__weak__));
|
|||
extern pthread_mutex_t __mmi_lock_obj;
|
||||
extern int hostos asm("__hostos");
|
||||
|
||||
void cosmo2(int, char **, char **, unsigned long *) wontreturn;
|
||||
void __switch_stacks(int, char **, char **, unsigned long *,
|
||||
void (*)(int, char **, char **, unsigned long *),
|
||||
void *) wontreturn;
|
||||
|
||||
static const char *DecodeMagnum(const char *p, long *r) {
|
||||
int k = 0;
|
||||
unsigned long c, x = 0;
|
||||
|
@ -75,26 +86,21 @@ static const char *DecodeMagnum(const char *p, long *r) {
|
|||
return *r = x, p;
|
||||
}
|
||||
|
||||
textstartup void cosmo(long *sp, struct Syslib *m1) {
|
||||
int argc;
|
||||
long *mp;
|
||||
init_f **fp;
|
||||
uintptr_t *pp;
|
||||
unsigned long *auxv;
|
||||
char **argv, **envp, *magnums;
|
||||
wontreturn textstartup void cosmo(long *sp, struct Syslib *m1) {
|
||||
|
||||
// get startup timestamp as early as possible
|
||||
// its used by --strace and also kprintf() %T
|
||||
kStartTsc = rdtsc();
|
||||
|
||||
// extracts arguments from old sysv stack abi
|
||||
argc = *sp;
|
||||
argv = (char **)(sp + 1);
|
||||
envp = (char **)(sp + 1 + argc + 1);
|
||||
auxv = (unsigned long *)(sp + 1 + argc + 1);
|
||||
int argc = *sp;
|
||||
char **argv = (char **)(sp + 1);
|
||||
char **envp = (char **)(sp + 1 + argc + 1);
|
||||
unsigned long *auxv = (unsigned long *)(sp + 1 + argc + 1);
|
||||
while (*auxv++) donothing;
|
||||
|
||||
// detect apple m1 environment
|
||||
char *magnums;
|
||||
if (SupportsXnu() && (__syslib = m1)) {
|
||||
hostos = _HOSTXNU;
|
||||
magnums = syscon_xnu;
|
||||
|
@ -105,8 +111,17 @@ textstartup void cosmo(long *sp, struct Syslib *m1) {
|
|||
notpossible;
|
||||
}
|
||||
|
||||
// get page size
|
||||
unsigned long pagesz = 4096;
|
||||
for (int i = 0; auxv[i]; auxv += 2) {
|
||||
if (auxv[0] == AT_PAGESZ) {
|
||||
pagesz = auxv[1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// setup system magic numbers
|
||||
for (mp = syscon_start; mp < syscon_end; ++mp) {
|
||||
for (long *mp = syscon_start; mp < syscon_end; ++mp) {
|
||||
magnums = DecodeMagnum(magnums, mp);
|
||||
}
|
||||
|
||||
|
@ -122,39 +137,6 @@ textstartup void cosmo(long *sp, struct Syslib *m1) {
|
|||
sys_sigaction(SIGSYS, act, 0, 8, 0);
|
||||
}
|
||||
|
||||
// needed by kisdangerous()
|
||||
__oldstack = (intptr_t)sp;
|
||||
__pid = sys_getpid().ax;
|
||||
|
||||
// initialize memory manager
|
||||
_mmi.n = ARRAYLEN(_mmi.s);
|
||||
_mmi.p = _mmi.s;
|
||||
__mmi_lock_obj._type = PTHREAD_MUTEX_RECURSIVE;
|
||||
|
||||
// record system provided stack to memory manager
|
||||
// todo: how do we get the real size of the stack
|
||||
// if `y` is too small mmap will destroy it
|
||||
// if `x` is too high, backtraces will fail
|
||||
uintptr_t t = (uintptr_t)__builtin_frame_address(0);
|
||||
uintptr_t s = (uintptr_t)sp;
|
||||
uintptr_t z = GetStackSize() << 1;
|
||||
_mmi.i = 1;
|
||||
_mmi.p->x = MIN((s & -z) >> 16, (t & -z) >> 16);
|
||||
_mmi.p->y = MIN(((s & -z) + (z - 1)) >> 16, INT_MAX);
|
||||
_mmi.p->size = z;
|
||||
_mmi.p->prot = PROT_READ | PROT_WRITE;
|
||||
__virtualmax = -1;
|
||||
|
||||
#if 0
|
||||
#if IsAsan()
|
||||
// TODO(jart): Figure out ASAN data model on AARCH64.
|
||||
__asan_init(argc, argv, envp, auxv);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// initialize file system
|
||||
__init_fds(argc, argv, envp);
|
||||
|
||||
// set helpful globals
|
||||
__argc = argc;
|
||||
__argv = argv;
|
||||
|
@ -163,13 +145,45 @@ textstartup void cosmo(long *sp, struct Syslib *m1) {
|
|||
environ = envp;
|
||||
program_invocation_name = argv[0];
|
||||
|
||||
// initialize program
|
||||
_init();
|
||||
// needed by kisdangerous()
|
||||
__oldstack = (intptr_t)sp;
|
||||
__pid = sys_getpid().ax;
|
||||
|
||||
// initialize memory manager
|
||||
_mmi.i = 0;
|
||||
_mmi.p = _mmi.s;
|
||||
_mmi.n = ARRAYLEN(_mmi.s);
|
||||
__mmi_lock_obj._type = PTHREAD_MUTEX_RECURSIVE;
|
||||
__virtualmax = -1;
|
||||
|
||||
// initialize file system
|
||||
__init_fds(argc, argv, envp);
|
||||
|
||||
__enable_tls();
|
||||
|
||||
__switch_stacks(argc, argv, envp, auxv, cosmo2,
|
||||
(char *)mmap(ape_stack_vaddr, (uintptr_t)ape_stack_memsz,
|
||||
MAP_FIXED | PROT_READ | PROT_WRITE,
|
||||
MAP_ANONYMOUS | MAP_STACK, -1, 0) +
|
||||
(uintptr_t)ape_stack_memsz);
|
||||
}
|
||||
|
||||
wontreturn textstartup void cosmo2(int argc, char **argv, char **envp,
|
||||
unsigned long *auxv) {
|
||||
|
||||
#if 0
|
||||
#if IsAsan()
|
||||
// TODO(jart): Figure out ASAN data model on AARCH64.
|
||||
__asan_init(argc, argv, envp, auxv);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
_init();
|
||||
// initialize program
|
||||
#ifdef SYSDEBUG
|
||||
argc = __strace_init(argc, argv, envp, auxv);
|
||||
#endif
|
||||
for (fp = __init_array_end; fp-- > __init_array_start;) {
|
||||
for (init_f **fp = __init_array_end; fp-- > __init_array_start;) {
|
||||
(*fp)(argc, argv, envp, auxv);
|
||||
}
|
||||
#ifdef FTRACE
|
||||
|
|
|
@ -154,19 +154,16 @@ forceinline pureconst bool IsStackFrame(int x) {
|
|||
}
|
||||
|
||||
forceinline pureconst bool IsOldStack(const void *x) {
|
||||
/* openbsd uses 4mb stack by default */
|
||||
/* freebsd uses 512mb stack by default */
|
||||
/* most systems use 8mb stack by default */
|
||||
size_t foss_stack_size = 1ul * 1024 * 1024;
|
||||
uintptr_t top = ROUNDUP(__oldstack + 1, foss_stack_size);
|
||||
uintptr_t bot = ROUNDDOWN(__oldstack, foss_stack_size);
|
||||
size_t foss_stack_size = 8ul * 1024 * 1024;
|
||||
uintptr_t top = __oldstack + foss_stack_size;
|
||||
uintptr_t bot = __oldstack - foss_stack_size;
|
||||
return bot <= (uintptr_t)x && (uintptr_t)x < top;
|
||||
}
|
||||
|
||||
forceinline pureconst bool IsOldStackFrame(int x) {
|
||||
size_t foss_stack_size = 1ul * 1024 * 1024;
|
||||
uintptr_t top = ROUNDUP(__oldstack + 1, foss_stack_size);
|
||||
uintptr_t bot = ROUNDDOWN(__oldstack, foss_stack_size);
|
||||
size_t foss_stack_size = 8ul * 1024 * 1024;
|
||||
uintptr_t top = __oldstack + foss_stack_size;
|
||||
uintptr_t bot = __oldstack - foss_stack_size;
|
||||
return (int)(bot >> 16) <= x && x <= (int)((top >> 16) - 1);
|
||||
}
|
||||
|
||||
|
|
|
@ -158,6 +158,8 @@ o/$(MODE)/libc/runtime/dsohandle.o: libc/runtime/dsohandle.S
|
|||
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||
o/$(MODE)/libc/runtime/zipos.o: libc/runtime/zipos.S
|
||||
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||
o/$(MODE)/libc/runtime/switchstacks.o: libc/runtime/switchstacks.S
|
||||
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||
|
||||
LIBC_RUNTIME_LIBS = $(foreach x,$(LIBC_RUNTIME_ARTIFACTS),$($(x)))
|
||||
LIBC_RUNTIME_SRCS = $(foreach x,$(LIBC_RUNTIME_ARTIFACTS),$($(x)_SRCS))
|
||||
|
|
31
libc/runtime/switchstacks.S
Normal file
31
libc/runtime/switchstacks.S
Normal file
|
@ -0,0 +1,31 @@
|
|||
/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│
|
||||
│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2023 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/macros.internal.h"
|
||||
|
||||
__switch_stacks:
|
||||
#ifdef __x86_64__
|
||||
int3
|
||||
#elif defined(__aarch64__)
|
||||
mov x29,0
|
||||
mov sp,x5
|
||||
br x4
|
||||
#else
|
||||
#error "unsupported architecture"
|
||||
#endif
|
||||
.endfn __switch_stacks,globl
|
Loading…
Add table
Reference in a new issue