mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-08 12:18:31 +00:00
Make improvements
- Get threads working on NetBSD - Get threads working on OpenBSD - Fix Emacs config for Emacs v28 - Improve --strace logging of sigset_t - Improve --strace logging of struct stat - Improve memory safety of DescribeThing functions - Refactor auto stack allocation into LIBC_RUNTIME - Introduce shell.com example which works on Windows - Refactor __strace_thing into DescribeThing functions - Document the CHECK macros and improve them in NDEBUG mode - Rewrite MAP_STACK so it uses FreeBSD behavior across platforms - Deprecate and discourage the use of MAP_GROWSDOWN (it's weird)
This commit is contained in:
parent
dd9ab01d25
commit
e7611a8476
101 changed files with 967 additions and 464 deletions
|
@ -221,20 +221,20 @@ syscon compat O_LARGEFILE 0 0 0 0 0 0 #
|
|||
syscon compat MAP_FILE 0 0 0 0 0 0 # consensus
|
||||
syscon mmap MAP_SHARED 1 1 1 1 1 1 # forced consensus & faked nt
|
||||
syscon mmap MAP_PRIVATE 2 2 2 2 2 2 # forced consensus & faked nt
|
||||
syscon mmap MAP_STACK 6 6 6 6 6 6 # our definition
|
||||
syscon mmap MAP_TYPE 15 15 15 15 15 15 # mask for type of mapping
|
||||
syscon mmap MAP_FIXED 0x0000010 0x0000010 0x0000010 0x0000010 0x0000010 0x0000010 # unix consensus; openbsd appears to forbid; faked nt
|
||||
syscon mmap MAP_FIXED_NOREPLACE 0x8000000 0x8000000 0x8000000 0x8000000 0x8000000 0x8000000 # handled and defined by cosmo runtime; 0x100000 on linux 4.7+
|
||||
syscon mmap MAP_ANONYMOUS 0x20 0x1000 0x0001000 0x1000 0x1000 0x20 # bsd consensus; faked nt
|
||||
syscon mmap MAP_GROWSDOWN 0x0100 0 0x0000400 0x4000 0x4000 0x100000 # mandatory for OpenBSD stacks; MAP_STACK on Free/OpenBSD; MEM_TOP_DOWN on NT
|
||||
syscon mmap MAP_CONCEAL 0 0 0x0020000 0x8000 0x8000 0 # omit from core dumps; MAP_NOCORE on FreeBSD
|
||||
syscon mmap MAP_NORESERVE 0x4000 0x40 0 0 64 0 # Linux calls it "reserve"; NT calls it "commit"? which is default?
|
||||
syscon mmap MAP_HUGETLB 0x040000 0 0 0 0 0x80000000 # kNtSecLargePages
|
||||
syscon mmap MAP_FIXED 0x00000010 0x00000010 0x00000010 0x00000010 0x00000010 0x00000010 # unix consensus; openbsd appears to forbid; faked nt
|
||||
syscon mmap MAP_FIXED_NOREPLACE 0x08000000 0x08000000 0x08000000 0x08000000 0x08000000 0x08000000 # handled and defined by cosmo runtime; 0x100000 on linux 4.7+
|
||||
syscon mmap MAP_ANONYMOUS 0x00000020 0x00001000 0x00001000 0x00001000 0x00001000 0x00000020 # bsd consensus; faked nt
|
||||
syscon mmap MAP_GROWSDOWN 0x00000100 0 0 0 0 0 # use MAP_STACK; abstracted by MAP_STACK; may be passed to __sys_mmap() for low-level Linux fiddling
|
||||
syscon mmap MAP_CONCEAL 0 0 0x00020000 0x00008000 0x00008000 0 # omit from core dumps; MAP_NOCORE on FreeBSD
|
||||
syscon mmap MAP_LOCKED 0x00002000 0 0 0 0 0
|
||||
syscon mmap MAP_NORESERVE 0x00004000 0x00000040 0 0 0x00000040 0 # Linux calls it "reserve"; NT calls it "commit"? which is default?
|
||||
syscon mmap MAP_POPULATE 0x00008000 0 0 0 0 0 # can avoid madvise(MADV_WILLNEED) on private file mapping
|
||||
syscon mmap MAP_NONBLOCK 0x00010000 0 0 0 0 0
|
||||
syscon mmap MAP_HUGETLB 0x00040000 0 0 0 0 0x80000000 # kNtSecLargePages
|
||||
syscon mmap MAP_HUGE_MASK 63 0 0 0 0 0
|
||||
syscon mmap MAP_HUGE_SHIFT 26 0 0 0 0 0
|
||||
syscon mmap MAP_LOCKED 0x2000 0 0 0 0 0
|
||||
syscon mmap MAP_NONBLOCK 0x10000 0 0 0 0 0
|
||||
syscon mmap MAP_POPULATE 0x8000 0 0 0 0 0 # can avoid madvise(MADV_WILLNEED) on private file mapping
|
||||
syscon mmap MAP_STACK 0x0100 0 0x0000400 0x4000 0x2000 0x100000 # use MAP_GROWSDOWN
|
||||
syscon compat MAP_NOCORE 0 0 0x0020000 0x8000 0x8000 0 # use MAP_CONCEAL
|
||||
syscon compat MAP_ANON 0x20 0x1000 0x0001000 0x1000 0x1000 0x20 # bsd consensus; faked nt
|
||||
syscon compat MAP_EXECUTABLE 0x1000 0 0 0 0 0 # ignored
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
#include "libc/sysv/consts/syscon.internal.h"
|
||||
.syscon mmap,MAP_ANONYMOUS,0x20,0x1000,0x0001000,0x1000,0x1000,0x20
|
||||
.syscon mmap,MAP_ANONYMOUS,0x00000020,0x00001000,0x00001000,0x00001000,0x00001000,0x00000020
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
#include "libc/sysv/consts/syscon.internal.h"
|
||||
.syscon mmap,MAP_CONCEAL,0,0,0x0020000,0x8000,0x8000,0
|
||||
.syscon mmap,MAP_CONCEAL,0,0,0x00020000,0x00008000,0x00008000,0
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
#include "libc/sysv/consts/syscon.internal.h"
|
||||
.syscon mmap,MAP_FIXED,0x0000010,0x0000010,0x0000010,0x0000010,0x0000010,0x0000010
|
||||
.syscon mmap,MAP_FIXED,0x00000010,0x00000010,0x00000010,0x00000010,0x00000010,0x00000010
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
#include "libc/sysv/consts/syscon.internal.h"
|
||||
.syscon mmap,MAP_FIXED_NOREPLACE,0x8000000,0x8000000,0x8000000,0x8000000,0x8000000,0x8000000
|
||||
.syscon mmap,MAP_FIXED_NOREPLACE,0x08000000,0x08000000,0x08000000,0x08000000,0x08000000,0x08000000
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
#include "libc/sysv/consts/syscon.internal.h"
|
||||
.syscon mmap,MAP_GROWSDOWN,0x0100,0,0x0000400,0x4000,0x4000,0x100000
|
||||
.syscon mmap,MAP_GROWSDOWN,0x00000100,0,0,0,0,0
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
#include "libc/sysv/consts/syscon.internal.h"
|
||||
.syscon mmap,MAP_HUGETLB,0x040000,0,0,0,0,0x80000000
|
||||
.syscon mmap,MAP_HUGETLB,0x00040000,0,0,0,0,0x80000000
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
#include "libc/sysv/consts/syscon.internal.h"
|
||||
.syscon mmap,MAP_LOCKED,0x2000,0,0,0,0,0
|
||||
.syscon mmap,MAP_LOCKED,0x00002000,0,0,0,0,0
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
#include "libc/sysv/consts/syscon.internal.h"
|
||||
.syscon mmap,MAP_NONBLOCK,0x10000,0,0,0,0,0
|
||||
.syscon mmap,MAP_NONBLOCK,0x00010000,0,0,0,0,0
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
#include "libc/sysv/consts/syscon.internal.h"
|
||||
.syscon mmap,MAP_NORESERVE,0x4000,0x40,0,0,64,0
|
||||
.syscon mmap,MAP_NORESERVE,0x00004000,0x00000040,0,0,0x00000040,0
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
#include "libc/sysv/consts/syscon.internal.h"
|
||||
.syscon mmap,MAP_POPULATE,0x8000,0,0,0,0,0
|
||||
.syscon mmap,MAP_POPULATE,0x00008000,0,0,0,0,0
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
#include "libc/sysv/consts/syscon.internal.h"
|
||||
.syscon mmap,MAP_STACK,0x0100,0,0x0000400,0x4000,0x2000,0x100000
|
||||
.syscon mmap,MAP_STACK,6,6,6,6,6,6
|
||||
|
|
|
@ -7,6 +7,7 @@ COSMOPOLITAN_C_START_
|
|||
extern const long MAP_32BIT;
|
||||
extern const long MAP_ANON;
|
||||
extern const long MAP_ANONYMOUS;
|
||||
extern const long MAP_CONCEAL;
|
||||
extern const long MAP_DENYWRITE;
|
||||
extern const long MAP_EXECUTABLE;
|
||||
extern const long MAP_FILE;
|
||||
|
@ -21,7 +22,6 @@ extern const long MAP_NORESERVE;
|
|||
extern const long MAP_POPULATE;
|
||||
extern const long MAP_PRIVATE;
|
||||
extern const long MAP_SHARED;
|
||||
extern const long MAP_CONCEAL;
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
|
@ -29,6 +29,7 @@ COSMOPOLITAN_C_END_
|
|||
#define MAP_FILE 0
|
||||
#define MAP_SHARED 1
|
||||
#define MAP_PRIVATE 2
|
||||
#define MAP_STACK 6
|
||||
#define MAP_TYPE 15
|
||||
#define MAP_FIXED 16
|
||||
#define MAP_FIXED_NOREPLACE 0x8000000
|
||||
|
@ -36,6 +37,7 @@ COSMOPOLITAN_C_END_
|
|||
#define MAP_32BIT SYMBOLIC(MAP_32BIT)
|
||||
#define MAP_ANONYMOUS SYMBOLIC(MAP_ANONYMOUS)
|
||||
#define MAP_CONCEAL SYMBOLIC(MAP_CONCEAL)
|
||||
#define MAP_CONCEAL SYMBOLIC(MAP_CONCEAL)
|
||||
#define MAP_DENYWRITE SYMBOLIC(MAP_DENYWRITE)
|
||||
#define MAP_EXECUTABLE SYMBOLIC(MAP_EXECUTABLE)
|
||||
#define MAP_GROWSDOWN SYMBOLIC(MAP_GROWSDOWN)
|
||||
|
@ -46,10 +48,8 @@ COSMOPOLITAN_C_END_
|
|||
#define MAP_NONBLOCK SYMBOLIC(MAP_NONBLOCK)
|
||||
#define MAP_NORESERVE SYMBOLIC(MAP_NORESERVE)
|
||||
#define MAP_POPULATE SYMBOLIC(MAP_POPULATE)
|
||||
#define MAP_CONCEAL SYMBOLIC(MAP_CONCEAL)
|
||||
|
||||
#define MAP_ANON MAP_ANONYMOUS
|
||||
#define MAP_NOCORE MAP_CONCEAL
|
||||
#define MAP_STACK MAP_GROWSDOWN
|
||||
|
||||
#endif /* COSMOPOLITAN_LIBC_SYSV_CONSTS_MAP_H_ */
|
||||
|
|
|
@ -20,9 +20,7 @@
|
|||
#include "libc/dce.h"
|
||||
#include "libc/macros.internal.h"
|
||||
#include "libc/nexgen32e/macros.h"
|
||||
#include "libc/sysv/consts/map.h"
|
||||
#include "libc/sysv/consts/nr.h"
|
||||
#include "libc/sysv/consts/prot.h"
|
||||
|
||||
/* ▄▄▄
|
||||
▄▄▄ ▀▓▓▒▄
|
||||
|
@ -355,107 +353,6 @@ _init_systemfive_pid:
|
|||
.endfn _init_systemfive_pid
|
||||
#endif
|
||||
#if SupportsSystemv() && !defined(TINY)
|
||||
|
||||
// Create a stack with deterministic readable addresses.
|
||||
// If ape_execve() already created us a stack that meets
|
||||
// the requirements of STATIC_STACK_SIZE() then we skip.
|
||||
_init_systemfive_stack:
|
||||
#if SupportsWindows() || SupportsMetal() || SupportsOpenbsd()
|
||||
testb $WINDOWS|METAL,__hostos(%rip)
|
||||
jnz _init_systemfive_done
|
||||
#endif
|
||||
push %rdi
|
||||
push %rsi
|
||||
mov __NR_mmap,%eax
|
||||
movabs $ape_stack_vaddr,%rdi
|
||||
mov $ape_stack_memsz,%esi
|
||||
mov $ape_stack_prot,%edx
|
||||
mov $MAP_PRIVATE|MAP_FIXED,%r10d
|
||||
or MAP_ANONYMOUS,%r10d
|
||||
or $-1,%r8d
|
||||
xor %r9d,%r9d
|
||||
push %rdi # vaddr of stack
|
||||
push %rsi # size of stack
|
||||
push %r9 # openbsd:pad
|
||||
push %r9 # openbsd:align
|
||||
#if SupportsOpenbsd()
|
||||
testb IsOpenbsd()
|
||||
jz 0f
|
||||
syscall # openbsd:dubstack
|
||||
jc 1f
|
||||
mov __NR_mmap,%eax
|
||||
#endif
|
||||
0: or MAP_GROWSDOWN,%r10d # openbsd:mapstack
|
||||
clc
|
||||
syscall
|
||||
pop %r9
|
||||
pop %r9
|
||||
pop %r9 # size of stack
|
||||
pop %r11 # vaddr of stack
|
||||
jnc 2f
|
||||
1: mov %eax,%edi
|
||||
mov __NR_exit_group,%eax
|
||||
syscall
|
||||
2: test %rax,%rax
|
||||
js 1b
|
||||
|
||||
// prevent operating system from auto-mapping stack
|
||||
// we guarantee stack overflows are always detected
|
||||
// so long as you never use -DSTACK_FRAME_UNLIMITED
|
||||
// TODO: Why does this fail sometimes with FreeBSD?
|
||||
testb IsFreebsd()
|
||||
jnz 9f
|
||||
push %rax
|
||||
push %rdx
|
||||
push %r11
|
||||
mov __NR_mprotect,%eax
|
||||
mov $PAGESIZE,%esi
|
||||
xor %edx,%edx # PROT_NONE
|
||||
syscall
|
||||
pop %r11
|
||||
pop %rdx
|
||||
pop %rax
|
||||
9:
|
||||
|
||||
// update the memory intervals
|
||||
// m.i 0 4
|
||||
// m.n 8 4
|
||||
// m.p 16 8
|
||||
// m.p[0].x 24 4
|
||||
// m.p[0].y 28 4
|
||||
// m.p[0].h 32 8
|
||||
// m.p[0].prot 40 4
|
||||
// m.p[0].flags 44 4
|
||||
// m.p[0].offset 48 8
|
||||
// m.p[0].size 56 8
|
||||
.weak _mmi
|
||||
ezlea _mmi,cx
|
||||
test %rcx,%rcx
|
||||
jz 3f
|
||||
push %r9 # save the stack size
|
||||
lea -1(%r11,%r9),%r9 # need incl. interval
|
||||
shr $16,%r11 # for the stack range
|
||||
shr $16,%r9
|
||||
movb $1,(%rcx) # _mmi.i
|
||||
mov %r11d,24(%rcx) # _mmi.s[0].x
|
||||
mov %r9d,28(%rcx) # _mmi.s[0].y
|
||||
orq $-1,32(%rcx) # _mmi.s[0].h
|
||||
mov %edx,40(%rcx) # _mmi.s[0].prot
|
||||
mov %r10d,44(%rcx) # _mmi.s[0].flags
|
||||
pop %r9 # restore stack size
|
||||
mov %r9,56(%rcx) # _mmi.s[0].size
|
||||
3: pop %rsi
|
||||
pop %rdi
|
||||
leave
|
||||
// switch stacks
|
||||
pop %rcx
|
||||
lea (%rax,%r9),%rsp
|
||||
sub $ape_stack_align,%rsp # openbsd:stackbound
|
||||
mov %rbp,(%rsp)
|
||||
push %rcx
|
||||
push %rbp
|
||||
mov %rsp,%rbp
|
||||
// 𝑠𝑙𝑖𝑑𝑒
|
||||
_init_systemfive_syscall:
|
||||
mov __NR_msyscall,%eax # syscall origin protect
|
||||
cmp $0xfff,%ax # openbsd is pretty cool
|
||||
|
@ -556,8 +453,3 @@ syscon_windows:/*
|
|||
.asciz " %'u magnums loaded on %s\n"
|
||||
.previous
|
||||
#endif /* DEBUGSYS */
|
||||
|
||||
.weak ape_stack_prot
|
||||
.weak ape_stack_vaddr
|
||||
.weak ape_stack_memsz
|
||||
.weak ape_stack_align
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue