mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Enable build of test/syscall tests on arm64.
Signed-off-by: Haibo Xu <haibo.xu@arm.com> Change-Id: I277d6c708bbf5c3edd7c3568941cfd01dc122e17
This commit is contained in:
@@ -19,6 +19,16 @@ exports_files(
|
||||
visibility = ["//:sandbox"],
|
||||
)
|
||||
|
||||
config_setting(
|
||||
name = "x86_64",
|
||||
constraint_values = ["@bazel_tools//platforms:x86_64"],
|
||||
)
|
||||
|
||||
config_setting(
|
||||
name = "aarch64",
|
||||
constraint_values = ["@bazel_tools//platforms:aarch64"],
|
||||
)
|
||||
|
||||
cc_binary(
|
||||
name = "sigaltstack_check",
|
||||
testonly = 1,
|
||||
@@ -197,7 +207,10 @@ cc_binary(
|
||||
cc_binary(
|
||||
name = "32bit_test",
|
||||
testonly = 1,
|
||||
srcs = ["32bit.cc"],
|
||||
srcs = select({
|
||||
":x86_64": ["32bit.cc"],
|
||||
":aarch64": [],
|
||||
}),
|
||||
linkstatic = 1,
|
||||
deps = [
|
||||
"//test/util:memory_util",
|
||||
@@ -584,7 +597,10 @@ cc_binary(
|
||||
cc_binary(
|
||||
name = "exceptions_test",
|
||||
testonly = 1,
|
||||
srcs = ["exceptions.cc"],
|
||||
srcs = select({
|
||||
":x86_64": ["exceptions.cc"],
|
||||
":aarch64": [],
|
||||
}),
|
||||
linkstatic = 1,
|
||||
deps = [
|
||||
"//test/util:logging",
|
||||
@@ -640,7 +656,10 @@ cc_binary(
|
||||
cc_binary(
|
||||
name = "exec_binary_test",
|
||||
testonly = 1,
|
||||
srcs = ["exec_binary.cc"],
|
||||
srcs = select({
|
||||
":x86_64": ["exec_binary.cc"],
|
||||
":aarch64": [],
|
||||
}),
|
||||
linkstatic = 1,
|
||||
deps = [
|
||||
"//test/util:cleanup",
|
||||
@@ -811,7 +830,10 @@ cc_binary(
|
||||
cc_binary(
|
||||
name = "fpsig_fork_test",
|
||||
testonly = 1,
|
||||
srcs = ["fpsig_fork.cc"],
|
||||
srcs = select({
|
||||
":x86_64": ["fpsig_fork.cc"],
|
||||
":aarch64": [],
|
||||
}),
|
||||
linkstatic = 1,
|
||||
deps = [
|
||||
"//test/util:logging",
|
||||
@@ -825,7 +847,10 @@ cc_binary(
|
||||
cc_binary(
|
||||
name = "fpsig_nested_test",
|
||||
testonly = 1,
|
||||
srcs = ["fpsig_nested.cc"],
|
||||
srcs = select({
|
||||
":x86_64": ["fpsig_nested.cc"],
|
||||
":aarch64": [],
|
||||
}),
|
||||
linkstatic = 1,
|
||||
deps = [
|
||||
"//test/util:test_main",
|
||||
@@ -1440,7 +1465,10 @@ cc_binary(
|
||||
cc_binary(
|
||||
name = "arch_prctl_test",
|
||||
testonly = 1,
|
||||
srcs = ["arch_prctl.cc"],
|
||||
srcs = select({
|
||||
":x86_64": ["arch_prctl.cc"],
|
||||
":aarch64": [],
|
||||
}),
|
||||
linkstatic = 1,
|
||||
deps = [
|
||||
"//test/util:test_main",
|
||||
@@ -2035,7 +2063,10 @@ cc_binary(
|
||||
cc_binary(
|
||||
name = "sigiret_test",
|
||||
testonly = 1,
|
||||
srcs = ["sigiret.cc"],
|
||||
srcs = select({
|
||||
":x86_64": ["sigiret.cc"],
|
||||
":aarch64": [],
|
||||
}),
|
||||
linkstatic = 1,
|
||||
deps = [
|
||||
"//test/util:logging",
|
||||
@@ -2043,7 +2074,10 @@ cc_binary(
|
||||
"//test/util:test_util",
|
||||
"//test/util:timer_util",
|
||||
"@com_google_googletest//:gtest",
|
||||
],
|
||||
] + select({
|
||||
":x86_64": [],
|
||||
":aarch64": ["//test/util:test_main"],
|
||||
}),
|
||||
)
|
||||
|
||||
cc_binary(
|
||||
@@ -3260,7 +3294,10 @@ cc_binary(
|
||||
cc_binary(
|
||||
name = "sysret_test",
|
||||
testonly = 1,
|
||||
srcs = ["sysret.cc"],
|
||||
srcs = select({
|
||||
":x86_64": ["sysret.cc"],
|
||||
":aarch64": [],
|
||||
}),
|
||||
linkstatic = 1,
|
||||
deps = [
|
||||
"//test/util:logging",
|
||||
|
||||
@@ -22,12 +22,13 @@ namespace gvisor {
|
||||
namespace testing {
|
||||
|
||||
namespace {
|
||||
|
||||
#if defined(__x86_64__)
|
||||
TEST(BadSyscallTest, NotImplemented) {
|
||||
// get_kernel_syms is not supported in Linux > 2.6, and not implemented in
|
||||
// gVisor.
|
||||
EXPECT_THAT(syscall(SYS_get_kernel_syms), SyscallFailsWithErrno(ENOSYS));
|
||||
}
|
||||
#endif // defined(__x86_64__)
|
||||
|
||||
TEST(BadSyscallTest, NegativeOne) {
|
||||
EXPECT_THAT(syscall(-1), SyscallFailsWithErrno(ENOSYS));
|
||||
|
||||
@@ -162,7 +162,7 @@ TEST(ChrootTest, DotDotFromOpenFD) {
|
||||
|
||||
// getdents on fd should not error.
|
||||
char buf[1024];
|
||||
ASSERT_THAT(syscall(SYS_getdents, fd.get(), buf, sizeof(buf)),
|
||||
ASSERT_THAT(syscall(SYS_getdents64, fd.get(), buf, sizeof(buf)),
|
||||
SyscallSucceeds());
|
||||
}
|
||||
|
||||
|
||||
@@ -215,6 +215,8 @@ TEST_F(ForkTest, PrivateMapping) {
|
||||
EXPECT_THAT(Wait(child), SyscallSucceedsWithValue(0));
|
||||
}
|
||||
|
||||
// CPUID is x86 specific.
|
||||
#ifdef __x86_64__
|
||||
// Test that cpuid works after a fork.
|
||||
TEST_F(ForkTest, Cpuid) {
|
||||
pid_t child = Fork();
|
||||
@@ -227,6 +229,7 @@ TEST_F(ForkTest, Cpuid) {
|
||||
}
|
||||
EXPECT_THAT(Wait(child), SyscallSucceedsWithValue(0));
|
||||
}
|
||||
#endif
|
||||
|
||||
TEST_F(ForkTest, Mmap) {
|
||||
pid_t child = Fork();
|
||||
|
||||
@@ -228,19 +228,27 @@ class GetdentsTest : public ::testing::Test {
|
||||
|
||||
// Multiple template parameters are not allowed, so we must use explicit
|
||||
// template specialization to set the syscall number.
|
||||
#ifdef __x86_64__
|
||||
template <>
|
||||
int GetdentsTest<struct linux_dirent>::SyscallNum() {
|
||||
return SYS_getdents;
|
||||
}
|
||||
#endif
|
||||
|
||||
template <>
|
||||
int GetdentsTest<struct linux_dirent64>::SyscallNum() {
|
||||
return SYS_getdents64;
|
||||
}
|
||||
|
||||
// Test both legacy getdents and getdents64.
|
||||
#ifdef __x86_64__
|
||||
// Test both legacy getdents and getdents64 on x86_64.
|
||||
typedef ::testing::Types<struct linux_dirent, struct linux_dirent64>
|
||||
GetdentsTypes;
|
||||
#elif __aarch64__
|
||||
// Test only getdents64 on arm64.
|
||||
typedef ::testing::Types<struct linux_dirent64>
|
||||
GetdentsTypes;
|
||||
#endif
|
||||
TYPED_TEST_SUITE(GetdentsTest, GetdentsTypes);
|
||||
|
||||
// N.B. TYPED_TESTs require explicitly using this-> to access members of
|
||||
|
||||
@@ -35,6 +35,8 @@ namespace {
|
||||
#ifndef SYS_preadv2
|
||||
#if defined(__x86_64__)
|
||||
#define SYS_preadv2 327
|
||||
#elif defined(__aarch64__)
|
||||
#define SYS_preadv2 286
|
||||
#else
|
||||
#error "Unknown architecture"
|
||||
#endif
|
||||
|
||||
@@ -1986,7 +1986,7 @@ TEST(Proc, GetdentsEnoent) {
|
||||
},
|
||||
nullptr, nullptr));
|
||||
char buf[1024];
|
||||
ASSERT_THAT(syscall(SYS_getdents, fd.get(), buf, sizeof(buf)),
|
||||
ASSERT_THAT(syscall(SYS_getdents64, fd.get(), buf, sizeof(buf)),
|
||||
SyscallFailsWithErrno(ENOENT));
|
||||
}
|
||||
|
||||
|
||||
@@ -34,6 +34,8 @@ namespace {
|
||||
#ifndef SYS_pwritev2
|
||||
#if defined(__x86_64__)
|
||||
#define SYS_pwritev2 328
|
||||
#elif defined(__aarch64__)
|
||||
#define SYS_pwritev2 287
|
||||
#else
|
||||
#error "Unknown architecture"
|
||||
#endif
|
||||
|
||||
@@ -49,7 +49,12 @@ namespace testing {
|
||||
namespace {
|
||||
|
||||
// A syscall not implemented by Linux that we don't expect to be called.
|
||||
#ifdef __x86_64__
|
||||
constexpr uint32_t kFilteredSyscall = SYS_vserver;
|
||||
#elif __aarch64__
|
||||
// Using arch_specific_syscalls which are not implemented on arm64.
|
||||
constexpr uint32_t kFilteredSyscall = SYS_arch_specific_syscall+15;
|
||||
#endif
|
||||
|
||||
// Applies a seccomp-bpf filter that returns `filtered_result` for
|
||||
// `sysno` and allows all other syscalls. Async-signal-safe.
|
||||
|
||||
@@ -557,6 +557,8 @@ TEST(SimpleStatTest, AnonDeviceAllocatesUniqueInodesAcrossSaveRestore) {
|
||||
#ifndef SYS_statx
|
||||
#if defined(__x86_64__)
|
||||
#define SYS_statx 332
|
||||
#elif defined(__aarch64__)
|
||||
#define SYS_statx 291
|
||||
#else
|
||||
#error "Unknown architecture"
|
||||
#endif
|
||||
|
||||
@@ -85,6 +85,20 @@ inline void FixupFault(ucontext_t* ctx) {
|
||||
// The encoding is 0x48 0xab 0x00.
|
||||
ctx->uc_mcontext.gregs[REG_RIP] += 3;
|
||||
}
|
||||
#elif __aarch64__
|
||||
inline void Fault() {
|
||||
// Zero and dereference x0.
|
||||
asm("mov xzr, x0\r\n"
|
||||
"str xzr, [x0]\r\n"
|
||||
:
|
||||
:
|
||||
: "x0");
|
||||
}
|
||||
|
||||
inline void FixupFault(ucontext_t* ctx) {
|
||||
// Skip the bad instruction above.
|
||||
ctx->uc_mcontext.pc += 4;
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace testing
|
||||
|
||||
@@ -76,7 +76,6 @@ bool IsRunningWithHostinet() {
|
||||
"xchg %%rdi, %%rbx\n" \
|
||||
: "=a"(a), "=D"(b), "=c"(c), "=d"(d) \
|
||||
: "a"(a_inp), "2"(c_inp))
|
||||
#endif // defined(__x86_64__)
|
||||
|
||||
CPUVendor GetCPUVendor() {
|
||||
uint32_t eax, ebx, ecx, edx;
|
||||
@@ -93,6 +92,7 @@ CPUVendor GetCPUVendor() {
|
||||
}
|
||||
return CPUVendor::kUnknownVendor;
|
||||
}
|
||||
#endif // defined(__x86_64__)
|
||||
|
||||
bool operator==(const KernelVersion& first, const KernelVersion& second) {
|
||||
return first.major == second.major && first.minor == second.minor &&
|
||||
|
||||
Reference in New Issue
Block a user