Introduce CPUID detection for Blink

This commit is contained in:
Justine Tunney 2022-12-17 00:38:07 -08:00
parent 4922bc4890
commit 3da887c58f
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
12 changed files with 19 additions and 14 deletions

View file

@ -239,7 +239,7 @@
int pledge(const char *promises, const char *execpromises) { int pledge(const char *promises, const char *execpromises) {
int e, rc; int e, rc;
unsigned long ipromises, iexecpromises; unsigned long ipromises, iexecpromises;
if (IsGenuineCosmo()) { if (IsGenuineCosmo() || IsGenuineBlink()) {
rc = 0; // blink doesn't support seccomp rc = 0; // blink doesn't support seccomp
} else if (!ParsePromises(promises, &ipromises) && } else if (!ParsePromises(promises, &ipromises) &&
!ParsePromises(execpromises, &iexecpromises)) { !ParsePromises(execpromises, &iexecpromises)) {

View file

@ -354,7 +354,7 @@ int sys_unveil_linux(const char *path, const char *permissions) {
int unveil(const char *path, const char *permissions) { int unveil(const char *path, const char *permissions) {
int e, rc; int e, rc;
e = errno; e = errno;
if (IsGenuineCosmo()) { if (IsGenuineCosmo() || IsGenuineBlink()) {
rc = 0; // blink doesn't support landlock rc = 0; // blink doesn't support landlock
} else if (IsLinux()) { } else if (IsLinux()) {
rc = sys_unveil_linux(path, permissions); rc = sys_unveil_linux(path, permissions);

View file

@ -43,6 +43,7 @@ int IsDebuggerPresent(bool force) {
int e, fd, res; int e, fd, res;
char *p, buf[1024]; char *p, buf[1024];
if (!force && IsGenuineCosmo()) return 0; if (!force && IsGenuineCosmo()) return 0;
if (!force && IsGenuineBlink()) return 0;
if (!force && __getenv(environ, "HEISENDEBUG")) return 0; if (!force && __getenv(environ, "HEISENDEBUG")) return 0;
if (IsWindows()) return IsBeingDebugged(); if (IsWindows()) return IsBeingDebugged();
if (__isworker) return false; if (__isworker) return false;

View file

@ -57,7 +57,8 @@ relegated int(AttachDebugger)(intptr_t continuetoaddr) {
char pidstr[11], breakcmd[40]; char pidstr[11], breakcmd[40];
const char *se, *elf, *gdb, *rewind, *layout; const char *se, *elf, *gdb, *rewind, *layout;
__restore_tty(); __restore_tty();
if (IsGenuineCosmo() || !(gdb = GetGdbPath()) || !isatty(0) || !isatty(1) || if (IsGenuineCosmo() || IsGenuineBlink() || !(gdb = GetGdbPath()) ||
!isatty(0) || !isatty(1) ||
(ttyfd = open(_PATH_TTY, O_RDWR | O_CLOEXEC)) == -1) { (ttyfd = open(_PATH_TTY, O_RDWR | O_CLOEXEC)) == -1) {
return -1; return -1;
} }

View file

@ -18,5 +18,10 @@
kCpuids[KCPUIDS_0H][KCPUIDS_EDX] == 0x43656e69 /* ineC */ && \ kCpuids[KCPUIDS_0H][KCPUIDS_EDX] == 0x43656e69 /* ineC */ && \
kCpuids[KCPUIDS_0H][KCPUIDS_ECX] == 0x6f6d736f /* osmo */) kCpuids[KCPUIDS_0H][KCPUIDS_ECX] == 0x6f6d736f /* osmo */)
#define IsGenuineBlink() \
(kCpuids[KCPUIDS_0H][KCPUIDS_EBX] == 0x756e6547 /* Genu */ && \
kCpuids[KCPUIDS_0H][KCPUIDS_EDX] == 0x42656e69 /* ineB */ && \
kCpuids[KCPUIDS_0H][KCPUIDS_ECX] == 0x6b6e696c /* link */)
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_LIBC_NEXGEN32E_VENDOR_H_ */ #endif /* COSMOPOLITAN_LIBC_NEXGEN32E_VENDOR_H_ */

View file

@ -22,7 +22,7 @@
#include "libc/thread/semaphore.h" #include "libc/thread/semaphore.h"
/** /**
* Destroys unnamed semaphore. * Returns semaphore value.
* *
* @param sem was created by sem_init() * @param sem was created by sem_init()
* @param sval receives output value * @param sval receives output value

View file

@ -137,7 +137,9 @@ static const struct {
}; };
TEST(printf, longdouble) { TEST(printf, longdouble) {
if (IsGenuineCosmo()) return; // TODO(jart): long double precision in blink if (IsGenuineCosmo() || IsGenuineBlink()) {
return; // TODO(jart): long double precision in blink
}
int i; int i;
for (i = 0; i < ARRAYLEN(Vx); ++i) { for (i = 0; i < ARRAYLEN(Vx); ++i) {
++g_testlib_ran; ++g_testlib_ran;

View file

@ -99,7 +99,6 @@ static void *CheckSchedule(void *arg) {
TEST(pthread_create, scheduling) { TEST(pthread_create, scheduling) {
pthread_t id; pthread_t id;
pthread_attr_t attr; pthread_attr_t attr;
if (IsGenuineCosmo()) return; // TODO(jart): blink
struct sched_param pri = {sched_get_priority_min(SCHED_OTHER)}; struct sched_param pri = {sched_get_priority_min(SCHED_OTHER)};
ASSERT_EQ(0, pthread_attr_init(&attr)); ASSERT_EQ(0, pthread_attr_init(&attr));
ASSERT_EQ(0, pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED)); ASSERT_EQ(0, pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED));

View file

@ -66,10 +66,6 @@ __attribute__((__constructor__)) static void nsync_futex_init_ (void) {
FUTEX_WAIT_ = FUTEX_WAIT; FUTEX_WAIT_ = FUTEX_WAIT;
if (IsGenuineCosmo ()) {
return;
}
if (IsWindows ()) { if (IsWindows ()) {
futex_is_supported = true; futex_is_supported = true;
return; return;

View file

@ -150,7 +150,7 @@ static int GetAfd(struct Machine *m, int fd) {
} }
static const char *GetSimulated(void) { static const char *GetSimulated(void) {
if (IsGenuineCosmo()) { if (IsGenuineCosmo() || IsGenuineBlink()) {
return " SIMULATED"; return " SIMULATED";
} else { } else {
return ""; return "";

View file

@ -18,8 +18,8 @@
*/ */
#include "libc/log/check.h" #include "libc/log/check.h"
#include "libc/log/log.h" #include "libc/log/log.h"
#include "libc/nexgen32e/vendor.internal.h"
#include "libc/mem/gc.internal.h" #include "libc/mem/gc.internal.h"
#include "libc/nexgen32e/vendor.internal.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
#include "libc/str/str.h" #include "libc/str/str.h"
#include "tool/build/lib/address.h" #include "tool/build/lib/address.h"
@ -47,7 +47,8 @@ void ThrowSegmentationFault(struct Machine *m, int64_t va) {
WARNF("%s%s ADDR %012lx IP %012lx AX %lx CX %lx DX %lx BX %lx SP %lx " WARNF("%s%s ADDR %012lx IP %012lx AX %lx CX %lx DX %lx BX %lx SP %lx "
"BP %lx SI %lx DI %lx R8 %lx R9 %lx R10 %lx R11 %lx R12 %lx R13 %lx " "BP %lx SI %lx DI %lx R8 %lx R9 %lx R10 %lx R11 %lx R12 %lx R13 %lx "
"R14 %lx R15 %lx", "R14 %lx R15 %lx",
"SEGMENTATION FAULT", IsGenuineCosmo() ? " SIMULATED" : "", va, m->ip, "SEGMENTATION FAULT",
IsGenuineCosmo() || IsGenuineBlink() ? " SIMULATED" : "", va, m->ip,
Read64(m->ax), Read64(m->cx), Read64(m->dx), Read64(m->bx), Read64(m->ax), Read64(m->cx), Read64(m->dx), Read64(m->bx),
Read64(m->sp), Read64(m->bp), Read64(m->si), Read64(m->di), Read64(m->sp), Read64(m->bp), Read64(m->si), Read64(m->di),
Read64(m->r8), Read64(m->r9), Read64(m->r10), Read64(m->r11), Read64(m->r8), Read64(m->r9), Read64(m->r10), Read64(m->r11),

View file

@ -7258,7 +7258,7 @@ static void GetOpts(int argc, char *argv[]) {
int opt; int opt;
bool storeasset = false; bool storeasset = false;
// only generate ecp cert under blinkenlights (rsa is slow) // only generate ecp cert under blinkenlights (rsa is slow)
norsagen = IsGenuineCosmo(); norsagen = IsGenuineCosmo() || IsGenuineBlink();
while ((opt = getopt(argc, argv, GETOPTS)) != -1) { while ((opt = getopt(argc, argv, GETOPTS)) != -1) {
switch (opt) { switch (opt) {
CASE('S', ++sandboxed); CASE('S', ++sandboxed);