mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-19 09:04:51 +08:00
d340d28a96
Add a few testcases to make sure that it's not possible to place a kprobe in the mid of an instruction on s390. Signed-off-by: Sven Schnelle <svens@linux.ibm.com> Acked-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
76 lines
1.7 KiB
C
76 lines
1.7 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/kprobes.h>
|
|
#include <linux/random.h>
|
|
#include <kunit/test.h>
|
|
#include "test_kprobes.h"
|
|
|
|
static struct kprobe kp;
|
|
|
|
static void setup_kprobe(struct kunit *test, struct kprobe *kp,
|
|
const char *symbol, int offset)
|
|
{
|
|
kp->offset = offset;
|
|
kp->addr = NULL;
|
|
kp->symbol_name = symbol;
|
|
}
|
|
|
|
static void test_kprobe_offset(struct kunit *test, struct kprobe *kp,
|
|
const char *target, int offset)
|
|
{
|
|
int ret;
|
|
|
|
setup_kprobe(test, kp, target, 0);
|
|
ret = register_kprobe(kp);
|
|
if (!ret)
|
|
unregister_kprobe(kp);
|
|
KUNIT_EXPECT_EQ(test, 0, ret);
|
|
setup_kprobe(test, kp, target, offset);
|
|
ret = register_kprobe(kp);
|
|
KUNIT_EXPECT_EQ(test, -EINVAL, ret);
|
|
if (!ret)
|
|
unregister_kprobe(kp);
|
|
}
|
|
|
|
static void test_kprobe_odd(struct kunit *test)
|
|
{
|
|
test_kprobe_offset(test, &kp, "kprobes_target_odd",
|
|
kprobes_target_odd_offs);
|
|
}
|
|
|
|
static void test_kprobe_in_insn4(struct kunit *test)
|
|
{
|
|
test_kprobe_offset(test, &kp, "kprobes_target_in_insn4",
|
|
kprobes_target_in_insn4_offs);
|
|
}
|
|
|
|
static void test_kprobe_in_insn6_lo(struct kunit *test)
|
|
{
|
|
test_kprobe_offset(test, &kp, "kprobes_target_in_insn6_lo",
|
|
kprobes_target_in_insn6_lo_offs);
|
|
}
|
|
|
|
static void test_kprobe_in_insn6_hi(struct kunit *test)
|
|
{
|
|
test_kprobe_offset(test, &kp, "kprobes_target_in_insn6_hi",
|
|
kprobes_target_in_insn6_hi_offs);
|
|
}
|
|
|
|
static struct kunit_case kprobes_testcases[] = {
|
|
KUNIT_CASE(test_kprobe_odd),
|
|
KUNIT_CASE(test_kprobe_in_insn4),
|
|
KUNIT_CASE(test_kprobe_in_insn6_lo),
|
|
KUNIT_CASE(test_kprobe_in_insn6_hi),
|
|
{}
|
|
};
|
|
|
|
static struct kunit_suite kprobes_test_suite = {
|
|
.name = "kprobes_test_s390",
|
|
.test_cases = kprobes_testcases,
|
|
};
|
|
|
|
kunit_test_suites(&kprobes_test_suite);
|
|
|
|
MODULE_LICENSE("GPL");
|