Skip to content

Commit

Permalink
Make improvements
Browse files Browse the repository at this point in the history
- Improve compatibility with Blink virtual machine
- Add non-POSIX APIs for joining threads and signal masks
- Never ever use anything except 32-bit integers for atomics
- Add some `#undef` statements to workaround `ctags` problems
  • Loading branch information
jart committed Nov 11, 2022
1 parent b46ac13 commit f2af977
Show file tree
Hide file tree
Showing 114 changed files with 900 additions and 361 deletions.
2 changes: 1 addition & 1 deletion ape/ape.lds
Expand Up @@ -715,7 +715,7 @@ ASSERT(IS2POW(ape_stack_memsz),
"ape_stack_memsz must be a two power");

ASSERT(ape_stack_vaddr % ape_stack_memsz == 0,
"ape_stack_vaddr must have ape_stack_memsz alignment; try using STATIC_STACK_ADDR(0x700000040000 - ape_stack_memsz);");
"ape_stack_vaddr must have ape_stack_memsz alignment; try using STATIC_STACK_ADDR(0x700000040000 & -ape_stack_memsz);");

ASSERT(ALIGNOF(.tdata) <= TLS_ALIGNMENT && ALIGNOF(.tbss) <= TLS_ALIGNMENT,
"_Thread_local _Alignof can't exceed TLS_ALIGNMENT");
Expand Down
4 changes: 3 additions & 1 deletion libc/calls/clock_nanosleep.c
Expand Up @@ -240,6 +240,8 @@ static bool ShouldUseSpinNanosleep(int clock, int flags,
errno_t clock_nanosleep(int clock, int flags, const struct timespec *req,
struct timespec *rem) {
int rc;
LOCKTRACE("clock_nanosleep(%s, %s, %s) → ...", DescribeClockName(clock),
DescribeSleepFlags(flags), DescribeTimespec(0, req));
if (IsMetal()) {
rc = ENOSYS;
} else if (!req || (IsAsan() && (!__asan_is_valid_timespec(req) ||
Expand All @@ -259,7 +261,7 @@ errno_t clock_nanosleep(int clock, int flags, const struct timespec *req,
if (__tls_enabled && !(__get_tls()->tib_flags & TIB_FLAG_TIME_CRITICAL)) {
STRACE("clock_nanosleep(%s, %s, %s, [%s]) → %s", DescribeClockName(clock),
DescribeSleepFlags(flags), DescribeTimespec(0, req),
DescribeTimespec(rc, rem), DescribeErrnoResult(rc));
DescribeTimespec(rc, rem), DescribeErrno(rc));
}
#endif
return rc;
Expand Down
2 changes: 0 additions & 2 deletions libc/calls/fexecve.c
Expand Up @@ -26,8 +26,6 @@
#include "libc/str/str.h"
#include "libc/sysv/errfuns.h"

int sys_fexecve(int, char *const[], char *const[]);

/**
* Executes binary executable at file descriptor.
*
Expand Down
7 changes: 5 additions & 2 deletions libc/calls/pledge.c
Expand Up @@ -24,6 +24,7 @@
#include "libc/errno.h"
#include "libc/intrin/promises.internal.h"
#include "libc/intrin/strace.internal.h"
#include "libc/nexgen32e/vendor.internal.h"
#include "libc/runtime/runtime.h"
#include "libc/sysv/errfuns.h"

Expand Down Expand Up @@ -238,8 +239,10 @@
int pledge(const char *promises, const char *execpromises) {
int e, rc;
unsigned long ipromises, iexecpromises;
if (!ParsePromises(promises, &ipromises) &&
!ParsePromises(execpromises, &iexecpromises)) {
if (IsGenuineCosmo()) {
rc = 0; // blink doesn't support seccomp
} else if (!ParsePromises(promises, &ipromises) &&
!ParsePromises(execpromises, &iexecpromises)) {
if (IsLinux()) {
// copy exec and execnative from promises to execpromises
iexecpromises = ~(~iexecpromises | (~ipromises & (1ul << PROMISE_EXEC)));
Expand Down
2 changes: 2 additions & 0 deletions libc/calls/syscall-sysv.internal.h
Expand Up @@ -37,6 +37,7 @@ i32 sys_dup(i32) _Hide;
i32 sys_dup2(i32, i32) _Hide;
i32 sys_dup3(i32, i32, i32) _Hide;
i32 sys_execve(const char *, char *const[], char *const[]) _Hide;
i32 sys_execveat(i32, const char *, char *const[], char *const[], i32) _Hide;
i32 sys_faccessat(i32, const char *, i32, u32) _Hide;
i32 sys_faccessat2(i32, const char *, i32, u32) _Hide;
i32 sys_fadvise(i32, i64, i64, i32) _Hide;
Expand All @@ -47,6 +48,7 @@ i32 sys_fchown(i64, u32, u32) _Hide;
i32 sys_fchownat(i32, const char *, u32, u32, u32) _Hide;
i32 sys_fcntl(i32, i32, u64, i32 (*)(i32, i32, ...)) _Hide;
i32 sys_fdatasync(i32) _Hide;
i32 sys_fexecve(i32, char *const[], char *const[]) _Hide;
i32 sys_flock(i32, i32) _Hide;
i32 sys_fork(void) _Hide;
i32 sys_fsync(i32) _Hide;
Expand Down
5 changes: 4 additions & 1 deletion libc/calls/unveil.c
Expand Up @@ -31,6 +31,7 @@
#include "libc/fmt/conv.h"
#include "libc/intrin/strace.internal.h"
#include "libc/macros.internal.h"
#include "libc/nexgen32e/vendor.internal.h"
#include "libc/runtime/internal.h"
#include "libc/runtime/runtime.h"
#include "libc/runtime/stack.h"
Expand Down Expand Up @@ -353,7 +354,9 @@ int sys_unveil_linux(const char *path, const char *permissions) {
int unveil(const char *path, const char *permissions) {
int e, rc;
e = errno;
if (IsLinux()) {
if (IsGenuineCosmo()) {
rc = 0; // blink doesn't support landlock
} else if (IsLinux()) {
rc = sys_unveil_linux(path, permissions);
} else {
rc = sys_unveil(path, permissions);
Expand Down
2 changes: 1 addition & 1 deletion libc/intrin/asan.c
Expand Up @@ -159,7 +159,7 @@ static struct AsanMorgue {

static bool __asan_once(void) {
bool want = false;
static _Atomic(bool) once;
static atomic_int once;
return atomic_compare_exchange_strong_explicit(
&once, &want, true, memory_order_relaxed, memory_order_relaxed);
}
Expand Down
6 changes: 5 additions & 1 deletion libc/intrin/describearchprctlcode.c
Expand Up @@ -20,7 +20,11 @@
#include "libc/fmt/itoa.h"
#include "libc/intrin/describeflags.internal.h"

const char *(DescribeArchPrctlCode)(char buf[12], int x) {
#ifdef DescribeArchPrctlCode
#undef DescribeArchPrctlCode
#endif

const char *DescribeArchPrctlCode(char buf[12], int x) {
if (x == ARCH_SET_FS) return "ARCH_SET_FS";
if (x == ARCH_GET_FS) return "ARCH_GET_FS";
if (x == ARCH_SET_GS) return "ARCH_SET_GS";
Expand Down
6 changes: 5 additions & 1 deletion libc/intrin/describebacktrace.c
Expand Up @@ -20,11 +20,15 @@
#include "libc/intrin/kprintf.h"
#include "libc/nexgen32e/stackframe.h"

#ifdef DescribeBacktrace
#undef DescribeBacktrace
#endif

#define N 64

#define append(...) o += ksnprintf(buf + o, N - o, __VA_ARGS__)

const char *(DescribeBacktrace)(char buf[N], struct StackFrame *fr) {
const char *DescribeBacktrace(char buf[N], struct StackFrame *fr) {
int o = 0;
bool gotsome = false;
while (fr) {
Expand Down
6 changes: 5 additions & 1 deletion libc/intrin/describecapability.c
Expand Up @@ -22,6 +22,10 @@
#include "libc/str/str.h"
#include "libc/sysv/consts/cap.h"

#ifdef DescribeCapability
#undef DescribeCapability
#endif

static const struct thatispacked {
unsigned char x;
const char *s;
Expand Down Expand Up @@ -69,7 +73,7 @@ static const struct thatispacked {
{CAP_CHECKPOINT_RESTORE, "CHECKPOINT_RESTORE"}, //
};

const char *(DescribeCapability)(char buf[32], int x) {
const char *DescribeCapability(char buf[32], int x) {
int i;
for (i = 0; i < ARRAYLEN(kCapabilityName); ++i) {
if (kCapabilityName[i].x == x) {
Expand Down
6 changes: 5 additions & 1 deletion libc/intrin/describeclockname.c
Expand Up @@ -19,9 +19,13 @@
#include "libc/fmt/magnumstrs.internal.h"
#include "libc/intrin/describeflags.internal.h"

#ifdef DescribeClockName
#undef DescribeClockName
#endif

/**
* Describes clock_gettime() clock argument.
*/
const char *(DescribeClockName)(char buf[32], int x) {
const char *DescribeClockName(char buf[32], int x) {
return DescribeMagnum(buf, kClockNames, "CLOCK_", x);
}
6 changes: 5 additions & 1 deletion libc/intrin/describedirfd.c
Expand Up @@ -20,7 +20,11 @@
#include "libc/intrin/describeflags.internal.h"
#include "libc/sysv/consts/at.h"

const char *(DescribeDirfd)(char buf[12], int dirfd) {
#ifdef DescribeDirfd
#undef DescribeDirfd
#endif

const char *DescribeDirfd(char buf[12], int dirfd) {
if (dirfd == AT_FDCWD) return "AT_FDCWD";
FormatInt32(buf, dirfd);
return buf;
Expand Down
6 changes: 5 additions & 1 deletion libc/intrin/describednotify.c
Expand Up @@ -21,6 +21,10 @@
#include "libc/nt/enum/processaccess.h"
#include "libc/sysv/consts/dn.h"

#ifdef DescribeDnotifyFlags
#undef DescribeDnotifyFlags
#endif

static const struct DescribeFlags kDnotifyFlags[] = {
{DN_ACCESS, "ACCESS"}, //
{DN_MODIFY, "MODIFY"}, //
Expand All @@ -31,7 +35,7 @@ static const struct DescribeFlags kDnotifyFlags[] = {
{DN_MULTISHOT, "MULTISHOT"}, //
};

const char *(DescribeDnotifyFlags)(char buf[80], int x) {
const char *DescribeDnotifyFlags(char buf[80], int x) {
return DescribeFlags(buf, 80, kDnotifyFlags, ARRAYLEN(kDnotifyFlags), "DN_",
x);
}
16 changes: 13 additions & 3 deletions libc/intrin/describeerrnoresult.c
Expand Up @@ -20,12 +20,22 @@
#include "libc/intrin/describeflags.internal.h"
#include "libc/str/str.h"

const char *(DescribeErrnoResult)(char buf[12], int ax) {
#ifdef DescribeErrno
#undef DescribeErrno
#endif

const char *DescribeErrno(char buf[20], int ax) {
char *p = buf;
const char *s;
if (ax > -4095u && (s = _strerrno(-ax))) {
if (ax < 0) {
*p++ = '-';
ax = -ax;
}
if ((s = _strerrno(ax))) {
stpcpy(p, s);
return s;
} else {
FormatInt32(buf, ax);
FormatInt32(p, ax);
return buf;
}
}
6 changes: 5 additions & 1 deletion libc/intrin/describefcntlcmd.c
Expand Up @@ -21,7 +21,11 @@
#include "libc/intrin/describeflags.internal.h"
#include "libc/str/str.h"

const char *(DescribeFcntlCmd)(char buf[20], int x) {
#ifdef DescribeFcntlCmd
#undef DescribeFcntlCmd
#endif

const char *DescribeFcntlCmd(char buf[20], int x) {
const char *s;
if (x >= 0 && (s = GetMagnumStr(kFcntlCmds, x))) {
buf[0] = 'F';
Expand Down
6 changes: 2 additions & 4 deletions libc/intrin/describeflags.internal.h
Expand Up @@ -17,8 +17,7 @@ const char *DescribeCapability(char[32], int);
const char *DescribeClockName(char[32], int);
const char *DescribeDirfd(char[12], int);
const char *DescribeDnotifyFlags(char[80], int);
const char *DescribeErrno(char[12], int);
const char *DescribeErrnoResult(char[12], int);
const char *DescribeErrno(char[20], int);
const char *DescribeFcntlCmd(char[20], int);
const char *DescribeFlockType(char[12], int);
const char *DescribeFrame(char[32], int);
Expand Down Expand Up @@ -71,8 +70,7 @@ const char *DescribeWhichPrio(char[12], int);
#define DescribeClockName(x) DescribeClockName(alloca(32), x)
#define DescribeDirfd(x) DescribeDirfd(alloca(12), x)
#define DescribeDnotifyFlags(x) DescribeDnotifyFlags(alloca(80), x)
#define DescribeErrno(x) DescribeErrno(alloca(12), x)
#define DescribeErrnoResult(x) DescribeErrnoResult(alloca(12), x)
#define DescribeErrno(x) DescribeErrno(alloca(20), x)
#define DescribeFcntlCmd(x) DescribeFcntlCmd(alloca(20), x)
#define DescribeFlockType(x) DescribeFlockType(alloca(12), x)
#define DescribeFrame(x) DescribeFrame(alloca(32), x)
Expand Down
6 changes: 5 additions & 1 deletion libc/intrin/describeflock.c
Expand Up @@ -24,11 +24,15 @@
#include "libc/intrin/kprintf.h"
#include "libc/sysv/consts/f.h"

#ifdef DescribeFlock
#undef DescribeFlock
#endif

#define N 300

#define append(...) o += ksnprintf(buf + o, N - o, __VA_ARGS__)

const char *(DescribeFlock)(char buf[N], int cmd, const struct flock *l) {
const char *DescribeFlock(char buf[N], int cmd, const struct flock *l) {
int o = 0;

if (!l) return "NULL";
Expand Down
6 changes: 5 additions & 1 deletion libc/intrin/describeflocktype.c
Expand Up @@ -19,7 +19,11 @@
#include "libc/fmt/itoa.h"
#include "libc/sysv/consts/f.h"

const char *(DescribeFlockType)(char buf[12], int x) {
#ifdef DescribeFlockType
#undef DescribeFlockType
#endif

const char *DescribeFlockType(char buf[12], int x) {
if (x == F_RDLCK) return "F_RDLCK";
if (x == F_WRLCK) return "F_WRLCK";
if (x == F_UNLCK) return "F_UNLCK";
Expand Down
6 changes: 5 additions & 1 deletion libc/intrin/describeframe.c
Expand Up @@ -26,6 +26,10 @@
#include "libc/runtime/runtime.h"
#include "libc/runtime/winargs.internal.h"

#ifdef DescribeFrame
#undef DescribeFrame
#endif

#define ADDR(x) ((int64_t)((uint64_t)(x) << 32) >> 16)
#define UNSHADOW(x) ((int64_t)(MAX(0, (x)-0x7fff8000)) << 3)
#define FRAME(x) ((int)((x) >> 16))
Expand Down Expand Up @@ -74,7 +78,7 @@ static const char *GetFrameName(int x) {
}
}

const char *(DescribeFrame)(char buf[32], int x) {
const char *DescribeFrame(char buf[32], int x) {
char *p;
if (IsShadowFrame(x)) {
ksnprintf(buf, 32, "%s %s %.8x", GetFrameName(x),
Expand Down
6 changes: 5 additions & 1 deletion libc/intrin/describefutexop.c
Expand Up @@ -21,7 +21,11 @@
#include "libc/str/str.h"
#include "libc/sysv/consts/futex.h"

const char *(DescribeFutexOp)(char buf[64], int x) {
#ifdef DescribeFutexOp
#undef DescribeFutexOp
#endif

const char *DescribeFutexOp(char buf[64], int x) {

bool priv = false;
if (x & FUTEX_PRIVATE_FLAG) {
Expand Down
8 changes: 6 additions & 2 deletions libc/intrin/describegidlist.c
Expand Up @@ -24,10 +24,14 @@
#include "libc/macros.internal.h"
#include "libc/str/str.h"

#ifdef DescribeGidList
#undef DescribeGidList
#endif

#define N 128

const char *(DescribeGidList)(char buf[N], int rc, int size,
const uint32_t list[]) {
const char *DescribeGidList(char buf[N], int rc, int size,
const uint32_t list[]) {
if ((rc == -1) || (size < 0)) return "n/a";
if (!size) return "{}";
if (!list) return "NULL";
Expand Down
6 changes: 5 additions & 1 deletion libc/intrin/describehow.c
Expand Up @@ -20,7 +20,11 @@
#include "libc/intrin/describeflags.internal.h"
#include "libc/sysv/consts/sig.h"

const char *(DescribeHow)(char buf[12], int how) {
#ifdef DescribeHow
#undef DescribeHow
#endif

const char *DescribeHow(char buf[12], int how) {
if (how == SIG_BLOCK) return "SIG_BLOCK";
if (how == SIG_UNBLOCK) return "SIG_UNBLOCK";
if (how == SIG_SETMASK) return "SIG_SETMASK";
Expand Down
8 changes: 6 additions & 2 deletions libc/intrin/describeiovec.c
Expand Up @@ -24,12 +24,16 @@
#include "libc/limits.h"
#include "libc/macros.internal.h"

#ifdef DescribeIovec
#undef DescribeIovec
#endif

#define N 300

#define append(...) o += ksnprintf(buf + o, N - o, __VA_ARGS__)

const char *(DescribeIovec)(char buf[N], ssize_t rc, const struct iovec *iov,
int iovlen) {
const char *DescribeIovec(char buf[N], ssize_t rc, const struct iovec *iov,
int iovlen) {
const char *d;
int i, j, o = 0;

Expand Down
6 changes: 5 additions & 1 deletion libc/intrin/describemapflags.c
Expand Up @@ -22,7 +22,11 @@
#include "libc/sysv/consts/map.h"
#include "libc/sysv/consts/prot.h"

const char *(DescribeMapFlags)(char buf[64], int x) {
#ifdef DescribeMapFlags
#undef DescribeMapFlags
#endif

const char *DescribeMapFlags(char buf[64], int x) {
const struct DescribeFlags kMapFlags[] = {
{MAP_STACK, "STACK"}, // order matters
{MAP_PRIVATE, "PRIVATE"}, //
Expand Down

0 comments on commit f2af977

Please sign in to comment.