Merge pull request #1471 from xiaobo55x:syscall_test

PiperOrigin-RevId: 292445329
This commit is contained in:
gVisor bot
2020-01-30 16:12:25 -08:00
12 changed files with 76 additions and 15 deletions
+26 -8
View File
@@ -1,4 +1,4 @@
load("//tools:defs.bzl", "cc_binary", "cc_library", "default_net_util", "select_system")
load("//tools:defs.bzl", "cc_binary", "cc_library", "default_net_util", "select_arch", "select_system")
package(
default_visibility = ["//:sandbox"],
@@ -193,7 +193,10 @@ cc_binary(
cc_binary(
name = "32bit_test",
testonly = 1,
srcs = ["32bit.cc"],
srcs = select_arch(
amd64 = ["32bit.cc"],
arm64 = [],
),
linkstatic = 1,
deps = [
"//test/util:memory_util",
@@ -640,7 +643,10 @@ cc_binary(
cc_binary(
name = "exec_binary_test",
testonly = 1,
srcs = ["exec_binary.cc"],
srcs = select_arch(
amd64 = ["exec_binary.cc"],
arm64 = [],
),
linkstatic = 1,
deps = [
"//test/util:cleanup",
@@ -812,7 +818,10 @@ cc_binary(
cc_binary(
name = "fpsig_fork_test",
testonly = 1,
srcs = ["fpsig_fork.cc"],
srcs = select_arch(
amd64 = ["fpsig_fork.cc"],
arm64 = [],
),
linkstatic = 1,
deps = [
"//test/util:logging",
@@ -826,7 +835,10 @@ cc_binary(
cc_binary(
name = "fpsig_nested_test",
testonly = 1,
srcs = ["fpsig_nested.cc"],
srcs = select_arch(
amd64 = ["fpsig_nested.cc"],
arm64 = [],
),
linkstatic = 1,
deps = [
"//test/util:test_main",
@@ -2039,15 +2051,21 @@ cc_binary(
cc_binary(
name = "sigiret_test",
testonly = 1,
srcs = ["sigiret.cc"],
srcs = select_arch(
amd64 = ["sigiret.cc"],
arm64 = [],
),
linkstatic = 1,
deps = [
"@com_google_googletest//:gtest",
"//test/util:logging",
"//test/util:signal_util",
"//test/util:test_util",
"//test/util:timer_util",
"@com_google_googletest//:gtest",
],
] + select_arch(
amd64 = [],
arm64 = ["//test/util:test_main"],
),
)
cc_binary(
+9 -3
View File
@@ -22,11 +22,17 @@ namespace gvisor {
namespace testing {
namespace {
#ifdef __x86_64__
// get_kernel_syms is not supported in Linux > 2.6, and not implemented in
// gVisor.
constexpr uint32_t kNotImplementedSyscall = SYS_get_kernel_syms;
#elif __aarch64__
// Use the last of arch_specific_syscalls which are not implemented on arm64.
constexpr uint32_t kNotImplementedSyscall = SYS_arch_specific_syscall + 15;
#endif
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));
EXPECT_THAT(syscall(kNotImplementedSyscall), SyscallFailsWithErrno(ENOSYS));
}
TEST(BadSyscallTest, NegativeOne) {
+1 -1
View File
@@ -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());
}
+3
View File
@@ -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();
+10 -1
View File
@@ -228,19 +228,28 @@ class GetdentsTest : public ::testing::Test {
// Multiple template parameters are not allowed, so we must use explicit
// template specialization to set the syscall number.
// SYS_getdents isn't defined on arm64.
#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
+2
View File
@@ -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
+1 -1
View File
@@ -1994,7 +1994,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));
}
+2
View File
@@ -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
+5
View File
@@ -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__
// Use the last of 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.
+2
View File
@@ -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
+14
View File
@@ -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
+1 -1
View File
@@ -69,7 +69,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;
@@ -86,6 +85,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 &&