mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-03-03 15:38:22 +00:00
Get TEST_LIBC_CALLS passing on AARCH64
This commit is contained in:
parent
802e7eb4ef
commit
ba49e86e20
22 changed files with 65 additions and 7 deletions
|
@ -64,9 +64,12 @@ int raise(int sig) {
|
||||||
if (sig == SIGTRAP) {
|
if (sig == SIGTRAP) {
|
||||||
DebugBreak();
|
DebugBreak();
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
#ifndef __aarch64__
|
||||||
} else if (sig == SIGFPE) {
|
} else if (sig == SIGFPE) {
|
||||||
|
// TODO(jart): Why doesn't AARCH64 raise SIGFPE?
|
||||||
RaiseSigFpe();
|
RaiseSigFpe();
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
#endif
|
||||||
} else if (!IsWindows() && !IsMetal()) {
|
} else if (!IsWindows() && !IsMetal()) {
|
||||||
rc = sys_tkill(gettid(), sig, 0);
|
rc = sys_tkill(gettid(), sig, 0);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -96,10 +96,12 @@ static const struct sock_filter kUnveilBlacklistLatestAbi[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static int landlock_abi_version;
|
static int landlock_abi_version;
|
||||||
|
static int landlock_abi_errno;
|
||||||
|
|
||||||
__attribute__((__constructor__)) void init_landlock_version() {
|
__attribute__((__constructor__)) void init_landlock_version() {
|
||||||
landlock_abi_version =
|
landlock_abi_version =
|
||||||
landlock_create_ruleset(0, 0, LANDLOCK_CREATE_RULESET_VERSION);
|
landlock_create_ruleset(0, 0, LANDLOCK_CREATE_RULESET_VERSION);
|
||||||
|
landlock_abi_errno = errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -153,6 +155,7 @@ static int unveil_init(void) {
|
||||||
int rc, fd;
|
int rc, fd;
|
||||||
State.fs_mask = UNVEIL_READ | UNVEIL_WRITE | UNVEIL_EXEC | UNVEIL_CREATE;
|
State.fs_mask = UNVEIL_READ | UNVEIL_WRITE | UNVEIL_EXEC | UNVEIL_CREATE;
|
||||||
if (landlock_abi_version == -1) {
|
if (landlock_abi_version == -1) {
|
||||||
|
errno = landlock_abi_errno;
|
||||||
if (errno == EOPNOTSUPP) {
|
if (errno == EOPNOTSUPP) {
|
||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,6 +76,7 @@ typedef char __intrin_xmm_t _Vector_size(16) forcealign(16) mayalias;
|
||||||
#define INTRIN_SSEVEX_X_X_X_(PURE, ISA, OP, FLAGS, A, B, C) PURE(A, B, C)
|
#define INTRIN_SSEVEX_X_X_X_(PURE, ISA, OP, FLAGS, A, B, C) PURE(A, B, C)
|
||||||
#define INTRIN_SSEVEX_X_X_I_(PURE, ISA, OP, A, B, I) PURE(A, B, I)
|
#define INTRIN_SSEVEX_X_X_I_(PURE, ISA, OP, A, B, I) PURE(A, B, I)
|
||||||
#define INTRIN_SSEVEX_X_I_(PURE, ISA, OP, A, B, I) PURE(A, B, I)
|
#define INTRIN_SSEVEX_X_I_(PURE, ISA, OP, A, B, I) PURE(A, B, I)
|
||||||
|
#define INTRIN_SSEVEX_X_X_(PURE, ISA, OP, A, B) PURE(A, B)
|
||||||
#endif /* X86 && !ANSI */
|
#endif /* X86 && !ANSI */
|
||||||
|
|
||||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "ape/sections.internal.h"
|
#include "ape/sections.internal.h"
|
||||||
|
#include "libc/assert.h"
|
||||||
#include "libc/calls/calls.h"
|
#include "libc/calls/calls.h"
|
||||||
#include "libc/calls/struct/rusage.internal.h"
|
#include "libc/calls/struct/rusage.internal.h"
|
||||||
#include "libc/calls/struct/siginfo.h"
|
#include "libc/calls/struct/siginfo.h"
|
||||||
|
@ -110,7 +111,7 @@ static const char *ColorRegister(int r) {
|
||||||
static bool AppendFileLine(struct Buffer *b, const char *addr2line,
|
static bool AppendFileLine(struct Buffer *b, const char *addr2line,
|
||||||
const char *debugbin, long addr) {
|
const char *debugbin, long addr) {
|
||||||
ssize_t rc;
|
ssize_t rc;
|
||||||
char buf[128];
|
char *p, *q, buf[128];
|
||||||
int j, k, ws, pid, pfd[2];
|
int j, k, ws, pid, pfd[2];
|
||||||
if (!debugbin || !*debugbin) return false;
|
if (!debugbin || !*debugbin) return false;
|
||||||
if (!addr2line || !*addr2line) return false;
|
if (!addr2line || !*addr2line) return false;
|
||||||
|
@ -139,6 +140,14 @@ static bool AppendFileLine(struct Buffer *b, const char *addr2line,
|
||||||
while ((rc = sys_read(pfd[0], buf, sizeof(buf))) > 0) {
|
while ((rc = sys_read(pfd[0], buf, sizeof(buf))) > 0) {
|
||||||
Append(b, "%.*s", (int)rc, buf);
|
Append(b, "%.*s", (int)rc, buf);
|
||||||
}
|
}
|
||||||
|
// remove the annoying `foo.c:123 (discriminator 3)` suffixes, because
|
||||||
|
// they break emacs, and who on earth knows what those things mean lol
|
||||||
|
while ((p = memmem(b->p + k, b->i - k, " (discriminator ", 16)) &&
|
||||||
|
(q = memchr(p + 16, '\n', (b->p + b->i) - (p + 16)))) {
|
||||||
|
memmove(p, q, (b->p + b->i) - q);
|
||||||
|
b->i -= q - p;
|
||||||
|
}
|
||||||
|
// mop up after the process and sanity check captured text
|
||||||
sys_close(pfd[0]);
|
sys_close(pfd[0]);
|
||||||
if (sys_wait4(pid, &ws, 0, 0) != -1 && !ws && b->p[k] != ':' &&
|
if (sys_wait4(pid, &ws, 0, 0) != -1 && !ws && b->p[k] != ':' &&
|
||||||
b->p[k] != '?' && b->p[b->i - 1] == '\n') {
|
b->p[k] != '?' && b->p[b->i - 1] == '\n') {
|
||||||
|
|
|
@ -64,6 +64,7 @@ sys_clone_linux:
|
||||||
cbz x0,2f
|
cbz x0,2f
|
||||||
ret
|
ret
|
||||||
2: mov x0,x6 // child thread
|
2: mov x0,x6 // child thread
|
||||||
|
ldr w1,[x4] // arg2 = *ctid
|
||||||
blr x5
|
blr x5
|
||||||
mov x8,#93 // __NR_exit
|
mov x8,#93 // __NR_exit
|
||||||
svc #0
|
svc #0
|
||||||
|
|
|
@ -42,11 +42,14 @@ TEST(clock_gettime, test) {
|
||||||
ASSERT_EQ(0, clock_gettime(0, &ts));
|
ASSERT_EQ(0, clock_gettime(0, &ts));
|
||||||
ASSERT_NE(0, ts.tv_sec);
|
ASSERT_NE(0, ts.tv_sec);
|
||||||
ASSERT_NE(0, ts.tv_nsec);
|
ASSERT_NE(0, ts.tv_nsec);
|
||||||
|
#ifndef __aarch64__
|
||||||
|
// we support vdso on aarch64 but qemu-aarch64 won't let us test it
|
||||||
if (__is_linux_2_6_23()) {
|
if (__is_linux_2_6_23()) {
|
||||||
ASSERT_GT((intptr_t)__clock_gettime_get(&isfast),
|
ASSERT_GT((intptr_t)__clock_gettime_get(&isfast),
|
||||||
getauxval(AT_SYSINFO_EHDR));
|
getauxval(AT_SYSINFO_EHDR));
|
||||||
ASSERT_TRUE(isfast);
|
ASSERT_TRUE(isfast);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
BENCH(clock_gettime, bench) {
|
BENCH(clock_gettime, bench) {
|
||||||
|
|
|
@ -77,14 +77,18 @@ TEST(commandv, testSlashes_wontSearchPath_butChecksAccess) {
|
||||||
i = __syscount;
|
i = __syscount;
|
||||||
EXPECT_STREQ("home/sh.com",
|
EXPECT_STREQ("home/sh.com",
|
||||||
commandv("home/sh.com", pathbuf, sizeof(pathbuf)));
|
commandv("home/sh.com", pathbuf, sizeof(pathbuf)));
|
||||||
|
#ifdef __x86_64__
|
||||||
if (!IsWindows()) EXPECT_EQ(i + 2, __syscount);
|
if (!IsWindows()) EXPECT_EQ(i + 2, __syscount);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(commandv, testSlashes_wontSearchPath_butStillAppendsComExtension) {
|
TEST(commandv, testSlashes_wontSearchPath_butStillAppendsComExtension) {
|
||||||
EXPECT_NE(-1, touch("home/sh.com", 0755));
|
EXPECT_NE(-1, touch("home/sh.com", 0755));
|
||||||
i = __syscount;
|
i = __syscount;
|
||||||
EXPECT_STREQ("home/sh.com", commandv("home/sh", pathbuf, sizeof(pathbuf)));
|
EXPECT_STREQ("home/sh.com", commandv("home/sh", pathbuf, sizeof(pathbuf)));
|
||||||
|
#ifdef __x86_64__
|
||||||
if (!IsWindows()) EXPECT_EQ(i + 3, __syscount);
|
if (!IsWindows()) EXPECT_EQ(i + 3, __syscount);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(commandv, testSameDir_doesntHappenByDefaultUnlessItsWindows) {
|
TEST(commandv, testSameDir_doesntHappenByDefaultUnlessItsWindows) {
|
||||||
|
|
|
@ -67,6 +67,7 @@ TEST(dup, bigNumber) {
|
||||||
ASSERT_SYS(0, 0, close(100));
|
ASSERT_SYS(0, 0, close(100));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __x86_64__
|
||||||
TEST(dup, clearsCloexecFlag) {
|
TEST(dup, clearsCloexecFlag) {
|
||||||
int ws;
|
int ws;
|
||||||
ASSERT_SYS(0, 0, close(creat("file", 0644)));
|
ASSERT_SYS(0, 0, close(creat("file", 0644)));
|
||||||
|
@ -81,3 +82,4 @@ TEST(dup, clearsCloexecFlag) {
|
||||||
ASSERT_EQ(72, WEXITSTATUS(ws));
|
ASSERT_EQ(72, WEXITSTATUS(ws));
|
||||||
ASSERT_SYS(0, 0, close(3));
|
ASSERT_SYS(0, 0, close(3));
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -26,6 +26,8 @@
|
||||||
#include "libc/testlib/subprocess.h"
|
#include "libc/testlib/subprocess.h"
|
||||||
#include "libc/testlib/testlib.h"
|
#include "libc/testlib/testlib.h"
|
||||||
|
|
||||||
|
#ifdef __x86_64__
|
||||||
|
|
||||||
#define N 16
|
#define N 16
|
||||||
|
|
||||||
char *GenBuf(char buf[8], int x) {
|
char *GenBuf(char buf[8], int x) {
|
||||||
|
@ -84,3 +86,5 @@ TEST(execve, ziposAPE) {
|
||||||
notpossible;
|
notpossible;
|
||||||
EXITS(42);
|
EXITS(42);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -27,6 +27,8 @@
|
||||||
#include "libc/testlib/testlib.h"
|
#include "libc/testlib/testlib.h"
|
||||||
// clang-format off
|
// clang-format off
|
||||||
|
|
||||||
|
#ifdef __x86_64__
|
||||||
|
|
||||||
STATIC_YOINK("zip_uri_support");
|
STATIC_YOINK("zip_uri_support");
|
||||||
|
|
||||||
int fds[2];
|
int fds[2];
|
||||||
|
@ -139,3 +141,5 @@ TEST(fexecve, ziposAPEHasZipos) {
|
||||||
EXITS(42);
|
EXITS(42);
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* __x86_64__ */
|
||||||
|
|
|
@ -23,10 +23,6 @@
|
||||||
#include "libc/testlib/testlib.h"
|
#include "libc/testlib/testlib.h"
|
||||||
#include "libc/time/time.h"
|
#include "libc/time/time.h"
|
||||||
|
|
||||||
TEST(getitimer, testNullTimer_returnsEfault) {
|
|
||||||
EXPECT_SYS(EFAULT, -1, getitimer(ITIMER_REAL, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(getitimer, testBadParam_returnsEinval) {
|
TEST(getitimer, testBadParam_returnsEinval) {
|
||||||
struct itimerval it;
|
struct itimerval it;
|
||||||
EXPECT_SYS(EINVAL, -1, getitimer(31337, &it));
|
EXPECT_SYS(EINVAL, -1, getitimer(31337, &it));
|
||||||
|
|
|
@ -32,6 +32,8 @@
|
||||||
#include "libc/testlib/subprocess.h"
|
#include "libc/testlib/subprocess.h"
|
||||||
#include "libc/testlib/testlib.h"
|
#include "libc/testlib/testlib.h"
|
||||||
|
|
||||||
|
#ifdef __x86_64__
|
||||||
|
|
||||||
void SetUp(void) {
|
void SetUp(void) {
|
||||||
if (!__is_linux_2_6_23() && !IsOpenbsd()) exit(0);
|
if (!__is_linux_2_6_23() && !IsOpenbsd()) exit(0);
|
||||||
}
|
}
|
||||||
|
@ -114,3 +116,5 @@ TEST(pledge, testEmptyPledge_doesntUseTrapping) {
|
||||||
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||||
TERMS(IsOpenbsd() ? SIGABRT : SIGSYS);
|
TERMS(IsOpenbsd() ? SIGABRT : SIGSYS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* __x86_64__ */
|
||||||
|
|
|
@ -62,6 +62,9 @@
|
||||||
#include "libc/time/time.h"
|
#include "libc/time/time.h"
|
||||||
#include "libc/x/x.h"
|
#include "libc/x/x.h"
|
||||||
|
|
||||||
|
// TODO(jart): Get pledge truly working on AARCH64
|
||||||
|
#ifdef __x86_64__
|
||||||
|
|
||||||
char testlib_enable_tmp_setup_teardown;
|
char testlib_enable_tmp_setup_teardown;
|
||||||
|
|
||||||
void OnSig(int sig) {
|
void OnSig(int sig) {
|
||||||
|
@ -656,3 +659,5 @@ BENCH(pledge, bench) {
|
||||||
}
|
}
|
||||||
wait(0);
|
wait(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* __x86_64__ */
|
||||||
|
|
|
@ -38,7 +38,6 @@
|
||||||
#include "libc/testlib/testlib.h"
|
#include "libc/testlib/testlib.h"
|
||||||
#include "libc/x/x.h"
|
#include "libc/x/x.h"
|
||||||
#include "libc/x/xasprintf.h"
|
#include "libc/x/xasprintf.h"
|
||||||
#include "third_party/chibicc/test/test.h"
|
|
||||||
#include "tool/decode/lib/flagger.h"
|
#include "tool/decode/lib/flagger.h"
|
||||||
|
|
||||||
bool gotsig;
|
bool gotsig;
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "libc/calls/struct/sigaction.h"
|
#include "libc/calls/struct/sigaction.h"
|
||||||
#include "libc/calls/struct/siginfo.h"
|
#include "libc/calls/struct/siginfo.h"
|
||||||
#include "libc/dce.h"
|
#include "libc/dce.h"
|
||||||
|
#include "libc/runtime/runtime.h"
|
||||||
#include "libc/sysv/consts/sa.h"
|
#include "libc/sysv/consts/sa.h"
|
||||||
#include "libc/sysv/consts/sicode.h"
|
#include "libc/sysv/consts/sicode.h"
|
||||||
#include "libc/sysv/consts/sig.h"
|
#include "libc/sysv/consts/sig.h"
|
||||||
|
|
|
@ -85,6 +85,7 @@ __attribute__((__constructor__)) static void init(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __x86_64__
|
||||||
TEST(sched_setaffinity, isInheritedAcrossExecve) {
|
TEST(sched_setaffinity, isInheritedAcrossExecve) {
|
||||||
cpu_set_t x, y;
|
cpu_set_t x, y;
|
||||||
CPU_ZERO(&x);
|
CPU_ZERO(&x);
|
||||||
|
@ -99,6 +100,7 @@ TEST(sched_setaffinity, isInheritedAcrossExecve) {
|
||||||
EXPECT_TRUE(WIFEXITED(ws));
|
EXPECT_TRUE(WIFEXITED(ws));
|
||||||
EXPECT_EQ(42, WEXITSTATUS(ws));
|
EXPECT_EQ(42, WEXITSTATUS(ws));
|
||||||
}
|
}
|
||||||
|
#endif /* __x86_64__ */
|
||||||
|
|
||||||
TEST(sched_getaffinity, getpid) {
|
TEST(sched_getaffinity, getpid) {
|
||||||
cpu_set_t x, y;
|
cpu_set_t x, y;
|
||||||
|
|
|
@ -36,6 +36,8 @@
|
||||||
#include "libc/x/xsigaction.h"
|
#include "libc/x/xsigaction.h"
|
||||||
#include "libc/x/xspawn.h"
|
#include "libc/x/xspawn.h"
|
||||||
|
|
||||||
|
#ifdef __x86_64__
|
||||||
|
|
||||||
#define MEM (64 * 1024 * 1024)
|
#define MEM (64 * 1024 * 1024)
|
||||||
|
|
||||||
static char tmpname[PATH_MAX];
|
static char tmpname[PATH_MAX];
|
||||||
|
@ -237,3 +239,5 @@ TEST(setrlimit, isVforkSafe) {
|
||||||
EXPECT_EQ(rlim[0].rlim_cur, rlim[1].rlim_cur);
|
EXPECT_EQ(rlim[0].rlim_cur, rlim[1].rlim_cur);
|
||||||
EXPECT_EQ(rlim[0].rlim_max, rlim[1].rlim_max);
|
EXPECT_EQ(rlim[0].rlim_max, rlim[1].rlim_max);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* __x86_64__ */
|
||||||
|
|
|
@ -127,6 +127,9 @@ TEST(writev, empty_stillPerformsIoOperation) {
|
||||||
ASSERT_NE(-1, (fd = open("file", O_RDONLY)));
|
ASSERT_NE(-1, (fd = open("file", O_RDONLY)));
|
||||||
errno = 0;
|
errno = 0;
|
||||||
EXPECT_SYS(EBADF, -1, writev(fd, iov, ARRAYLEN(iov)));
|
EXPECT_SYS(EBADF, -1, writev(fd, iov, ARRAYLEN(iov)));
|
||||||
|
#ifndef __aarch64__
|
||||||
|
// Can't test this due to qemu-aarch64 bug
|
||||||
EXPECT_EQ(-1, writev(fd, NULL, 0));
|
EXPECT_EQ(-1, writev(fd, NULL, 0));
|
||||||
|
#endif
|
||||||
EXPECT_NE(-1, close(fd));
|
EXPECT_NE(-1, close(fd));
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,7 +132,9 @@ dontinline void RngSet(void *mem, size_t size) {
|
||||||
}
|
}
|
||||||
|
|
||||||
FIXTURE(intrin, disableHardwareExtensions) {
|
FIXTURE(intrin, disableHardwareExtensions) {
|
||||||
|
#ifdef __x86_64__
|
||||||
memset((/*unconst*/ void *)kCpuids, 0, sizeof(kCpuids));
|
memset((/*unconst*/ void *)kCpuids, 0, sizeof(kCpuids));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(punpcklwd, test) {
|
TEST(punpcklwd, test) {
|
||||||
|
|
|
@ -221,6 +221,7 @@ TEST(ksnprintf, testSymbols) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __x86_64__
|
||||||
TEST(ksnprintf, fuzzTheUnbreakable) {
|
TEST(ksnprintf, fuzzTheUnbreakable) {
|
||||||
int e;
|
int e;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
@ -242,6 +243,7 @@ TEST(ksnprintf, fuzzTheUnbreakable) {
|
||||||
}
|
}
|
||||||
EXPECT_SYS(0, 0, mprotect(f, FRAMESIZE, PROT_READ));
|
EXPECT_SYS(0, 0, mprotect(f, FRAMESIZE, PROT_READ));
|
||||||
}
|
}
|
||||||
|
#endif /* __x86_64__ */
|
||||||
|
|
||||||
TEST(kprintf, testFailure_wontClobberErrnoAndBypassesSystemCallSupport) {
|
TEST(kprintf, testFailure_wontClobberErrnoAndBypassesSystemCallSupport) {
|
||||||
int n;
|
int n;
|
||||||
|
|
|
@ -16,8 +16,8 @@
|
||||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "dsp/core/q.h"
|
|
||||||
#include "libc/intrin/pmulhrsw.h"
|
#include "libc/intrin/pmulhrsw.h"
|
||||||
|
#include "dsp/core/q.h"
|
||||||
#include "libc/log/check.h"
|
#include "libc/log/check.h"
|
||||||
#include "libc/macros.internal.h"
|
#include "libc/macros.internal.h"
|
||||||
#include "libc/str/str.h"
|
#include "libc/str/str.h"
|
||||||
|
@ -39,7 +39,9 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
FIXTURE(pmulhrsw, disableHardwareExtensions) {
|
FIXTURE(pmulhrsw, disableHardwareExtensions) {
|
||||||
|
#ifdef __x86_64__
|
||||||
memset((/*unconst*/ void *)kCpuids, 0, sizeof(kCpuids));
|
memset((/*unconst*/ void *)kCpuids, 0, sizeof(kCpuids));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(pmulhrsw, testLimits) {
|
TEST(pmulhrsw, testLimits) {
|
||||||
|
|
|
@ -35,6 +35,8 @@
|
||||||
#include "libc/x/x.h"
|
#include "libc/x/x.h"
|
||||||
#include "third_party/xed/x86.h"
|
#include "third_party/xed/x86.h"
|
||||||
|
|
||||||
|
#ifdef __x86_64__
|
||||||
|
|
||||||
volatile bool gotsegv;
|
volatile bool gotsegv;
|
||||||
volatile bool gotbusted;
|
volatile bool gotbusted;
|
||||||
struct sigaction old[2];
|
struct sigaction old[2];
|
||||||
|
@ -214,3 +216,5 @@ TEST(mprotect, testZeroSize_doesNothing) {
|
||||||
EXPECT_FALSE(gotsegv);
|
EXPECT_FALSE(gotsegv);
|
||||||
EXPECT_FALSE(gotbusted);
|
EXPECT_FALSE(gotbusted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* __x86_64__ */
|
||||||
|
|
Loading…
Add table
Reference in a new issue