59 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Copyright (C) 2024. Huawei Technologies Co., Ltd */3#include "test_progs.h"4#include "read_vsyscall.skel.h"5 6#if defined(__x86_64__)7/* For VSYSCALL_ADDR */8#include <asm/vsyscall.h>9#else10/* To prevent build failure on non-x86 arch */11#define VSYSCALL_ADDR 0UL12#endif13 14struct read_ret_desc {15 const char *name;16 int ret;17} all_read[] = {18 { .name = "probe_read_kernel", .ret = -ERANGE },19 { .name = "probe_read_kernel_str", .ret = -ERANGE },20 { .name = "probe_read", .ret = -ERANGE },21 { .name = "probe_read_str", .ret = -ERANGE },22 { .name = "probe_read_user", .ret = -EFAULT },23 { .name = "probe_read_user_str", .ret = -EFAULT },24 { .name = "copy_from_user", .ret = -EFAULT },25 { .name = "copy_from_user_task", .ret = -EFAULT },26 { .name = "copy_from_user_str", .ret = -EFAULT },27};28 29void test_read_vsyscall(void)30{31 struct read_vsyscall *skel;32 unsigned int i;33 int err;34 35#if !defined(__x86_64__)36 test__skip();37 return;38#endif39 skel = read_vsyscall__open_and_load();40 if (!ASSERT_OK_PTR(skel, "read_vsyscall open_load"))41 return;42 43 skel->bss->target_pid = getpid();44 err = read_vsyscall__attach(skel);45 if (!ASSERT_EQ(err, 0, "read_vsyscall attach"))46 goto out;47 48 /* userspace may don't have vsyscall page due to LEGACY_VSYSCALL_NONE,49 * but it doesn't affect the returned error codes.50 */51 skel->bss->user_ptr = (void *)VSYSCALL_ADDR;52 usleep(1);53 54 for (i = 0; i < ARRAY_SIZE(all_read); i++)55 ASSERT_EQ(skel->bss->read_ret[i], all_read[i].ret, all_read[i].name);56out:57 read_vsyscall__destroy(skel);58}59