riscv: Add tests for riscv module loading
Add test cases for the two main groups of relocations added: SUB and SET, along with uleb128. Signed-off-by: Charlie Jenkins <charlie@rivosinc.com> Link: https://lore.kernel.org/r/20231101-module_relocations-v9-3-8dfa3483c400@rivosinc.com Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
parent
8fd6c51423
commit
af71bc1949
16 changed files with 366 additions and 0 deletions
|
@ -0,0 +1 @@
|
||||||
|
source "arch/riscv/kernel/tests/Kconfig.debug"
|
|
@ -57,6 +57,7 @@ obj-y += stacktrace.o
|
||||||
obj-y += cacheinfo.o
|
obj-y += cacheinfo.o
|
||||||
obj-y += patch.o
|
obj-y += patch.o
|
||||||
obj-y += probes/
|
obj-y += probes/
|
||||||
|
obj-y += tests/
|
||||||
obj-$(CONFIG_MMU) += vdso.o vdso/
|
obj-$(CONFIG_MMU) += vdso.o vdso/
|
||||||
|
|
||||||
obj-$(CONFIG_RISCV_M_MODE) += traps_misaligned.o
|
obj-$(CONFIG_RISCV_M_MODE) += traps_misaligned.o
|
||||||
|
|
35
arch/riscv/kernel/tests/Kconfig.debug
Normal file
35
arch/riscv/kernel/tests/Kconfig.debug
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
menu "arch/riscv/kernel Testing and Coverage"
|
||||||
|
|
||||||
|
config AS_HAS_ULEB128
|
||||||
|
def_bool $(as-instr,.reloc label$(comma) R_RISCV_SET_ULEB128$(comma) 127\n.reloc label$(comma) R_RISCV_SUB_ULEB128$(comma) 127\nlabel:\n.word 0)
|
||||||
|
|
||||||
|
menuconfig RUNTIME_KERNEL_TESTING_MENU
|
||||||
|
bool "arch/riscv/kernel runtime Testing"
|
||||||
|
def_bool y
|
||||||
|
help
|
||||||
|
Enable riscv kernel runtime testing.
|
||||||
|
|
||||||
|
if RUNTIME_KERNEL_TESTING_MENU
|
||||||
|
|
||||||
|
config RISCV_MODULE_LINKING_KUNIT
|
||||||
|
bool "KUnit test riscv module linking at runtime" if !KUNIT_ALL_TESTS
|
||||||
|
depends on KUNIT
|
||||||
|
default KUNIT_ALL_TESTS
|
||||||
|
help
|
||||||
|
Enable this option to test riscv module linking at boot. This will
|
||||||
|
enable a module called "test_module_linking".
|
||||||
|
|
||||||
|
KUnit tests run during boot and output the results to the debug log
|
||||||
|
in TAP format (http://testanything.org/). Only useful for kernel devs
|
||||||
|
running the KUnit test harness, and not intended for inclusion into a
|
||||||
|
production build.
|
||||||
|
|
||||||
|
For more information on KUnit and unit tests in general please refer
|
||||||
|
to the KUnit documentation in Documentation/dev-tools/kunit/.
|
||||||
|
|
||||||
|
If unsure, say N.
|
||||||
|
|
||||||
|
endif # RUNTIME_TESTING_MENU
|
||||||
|
|
||||||
|
endmenu # "arch/riscv/kernel runtime Testing"
|
1
arch/riscv/kernel/tests/Makefile
Normal file
1
arch/riscv/kernel/tests/Makefile
Normal file
|
@ -0,0 +1 @@
|
||||||
|
obj-$(CONFIG_RISCV_MODULE_LINKING_KUNIT) += module_test/
|
15
arch/riscv/kernel/tests/module_test/Makefile
Normal file
15
arch/riscv/kernel/tests/module_test/Makefile
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
obj-m += test_module_linking.o
|
||||||
|
|
||||||
|
test_sub := test_sub6.o test_sub8.o test_sub16.o test_sub32.o test_sub64.o
|
||||||
|
|
||||||
|
test_set := test_set6.o test_set8.o test_set16.o test_set32.o
|
||||||
|
|
||||||
|
test_module_linking-objs += $(test_sub)
|
||||||
|
|
||||||
|
test_module_linking-objs += $(test_set)
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_AS_HAS_ULEB128),y)
|
||||||
|
test_module_linking-objs += test_uleb128.o
|
||||||
|
endif
|
||||||
|
|
||||||
|
test_module_linking-objs += test_module_linking_main.o
|
|
@ -0,0 +1,88 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Rivos Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <kunit/test.h>
|
||||||
|
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
MODULE_DESCRIPTION("Test module linking");
|
||||||
|
|
||||||
|
extern int test_set32(void);
|
||||||
|
extern int test_set16(void);
|
||||||
|
extern int test_set8(void);
|
||||||
|
extern int test_set6(void);
|
||||||
|
extern long test_sub64(void);
|
||||||
|
extern int test_sub32(void);
|
||||||
|
extern int test_sub16(void);
|
||||||
|
extern int test_sub8(void);
|
||||||
|
extern int test_sub6(void);
|
||||||
|
|
||||||
|
#ifdef CONFIG_AS_HAS_ULEB128
|
||||||
|
extern int test_uleb_basic(void);
|
||||||
|
extern int test_uleb_large(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CHECK_EQ(lhs, rhs) KUNIT_ASSERT_EQ(test, lhs, rhs)
|
||||||
|
|
||||||
|
void run_test_set(struct kunit *test);
|
||||||
|
void run_test_sub(struct kunit *test);
|
||||||
|
void run_test_uleb(struct kunit *test);
|
||||||
|
|
||||||
|
void run_test_set(struct kunit *test)
|
||||||
|
{
|
||||||
|
int val32 = test_set32();
|
||||||
|
int val16 = test_set16();
|
||||||
|
int val8 = test_set8();
|
||||||
|
int val6 = test_set6();
|
||||||
|
|
||||||
|
CHECK_EQ(val32, 0);
|
||||||
|
CHECK_EQ(val16, 0);
|
||||||
|
CHECK_EQ(val8, 0);
|
||||||
|
CHECK_EQ(val6, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void run_test_sub(struct kunit *test)
|
||||||
|
{
|
||||||
|
int val64 = test_sub64();
|
||||||
|
int val32 = test_sub32();
|
||||||
|
int val16 = test_sub16();
|
||||||
|
int val8 = test_sub8();
|
||||||
|
int val6 = test_sub6();
|
||||||
|
|
||||||
|
CHECK_EQ(val64, 0);
|
||||||
|
CHECK_EQ(val32, 0);
|
||||||
|
CHECK_EQ(val16, 0);
|
||||||
|
CHECK_EQ(val8, 0);
|
||||||
|
CHECK_EQ(val6, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_AS_HAS_ULEB128
|
||||||
|
void run_test_uleb(struct kunit *test)
|
||||||
|
{
|
||||||
|
int val_uleb = test_uleb_basic();
|
||||||
|
int val_uleb2 = test_uleb_large();
|
||||||
|
|
||||||
|
CHECK_EQ(val_uleb, 0);
|
||||||
|
CHECK_EQ(val_uleb2, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static struct kunit_case __refdata riscv_module_linking_test_cases[] = {
|
||||||
|
KUNIT_CASE(run_test_set),
|
||||||
|
KUNIT_CASE(run_test_sub),
|
||||||
|
#ifdef CONFIG_AS_HAS_ULEB128
|
||||||
|
KUNIT_CASE(run_test_uleb),
|
||||||
|
#endif
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct kunit_suite riscv_module_linking_test_suite = {
|
||||||
|
.name = "riscv_checksum",
|
||||||
|
.test_cases = riscv_module_linking_test_cases,
|
||||||
|
};
|
||||||
|
|
||||||
|
kunit_test_suites(&riscv_module_linking_test_suite);
|
23
arch/riscv/kernel/tests/module_test/test_set16.S
Normal file
23
arch/riscv/kernel/tests/module_test/test_set16.S
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Rivos Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.global test_set16
|
||||||
|
test_set16:
|
||||||
|
lw a0, set16
|
||||||
|
la t0, set16
|
||||||
|
#ifdef CONFIG_32BIT
|
||||||
|
slli t0, t0, 16
|
||||||
|
srli t0, t0, 16
|
||||||
|
#else
|
||||||
|
slli t0, t0, 48
|
||||||
|
srli t0, t0, 48
|
||||||
|
#endif
|
||||||
|
sub a0, a0, t0
|
||||||
|
ret
|
||||||
|
.data
|
||||||
|
set16:
|
||||||
|
.reloc set16, R_RISCV_SET16, set16
|
||||||
|
.word 0
|
20
arch/riscv/kernel/tests/module_test/test_set32.S
Normal file
20
arch/riscv/kernel/tests/module_test/test_set32.S
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Rivos Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.global test_set32
|
||||||
|
test_set32:
|
||||||
|
lw a0, set32
|
||||||
|
la t0, set32
|
||||||
|
#ifndef CONFIG_32BIT
|
||||||
|
slli t0, t0, 32
|
||||||
|
srli t0, t0, 32
|
||||||
|
#endif
|
||||||
|
sub a0, a0, t0
|
||||||
|
ret
|
||||||
|
.data
|
||||||
|
set32:
|
||||||
|
.reloc set32, R_RISCV_SET32, set32
|
||||||
|
.word 0
|
23
arch/riscv/kernel/tests/module_test/test_set6.S
Normal file
23
arch/riscv/kernel/tests/module_test/test_set6.S
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Rivos Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.global test_set6
|
||||||
|
test_set6:
|
||||||
|
lw a0, set6
|
||||||
|
la t0, set6
|
||||||
|
#ifdef CONFIG_32BIT
|
||||||
|
slli t0, t0, 26
|
||||||
|
srli t0, t0, 26
|
||||||
|
#else
|
||||||
|
slli t0, t0, 58
|
||||||
|
srli t0, t0, 58
|
||||||
|
#endif
|
||||||
|
sub a0, a0, t0
|
||||||
|
ret
|
||||||
|
.data
|
||||||
|
set6:
|
||||||
|
.reloc set6, R_RISCV_SET6, set6
|
||||||
|
.word 0
|
23
arch/riscv/kernel/tests/module_test/test_set8.S
Normal file
23
arch/riscv/kernel/tests/module_test/test_set8.S
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Rivos Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.global test_set8
|
||||||
|
test_set8:
|
||||||
|
lw a0, set8
|
||||||
|
la t0, set8
|
||||||
|
#ifdef CONFIG_32BIT
|
||||||
|
slli t0, t0, 24
|
||||||
|
srli t0, t0, 24
|
||||||
|
#else
|
||||||
|
slli t0, t0, 56
|
||||||
|
srli t0, t0, 56
|
||||||
|
#endif
|
||||||
|
sub a0, a0, t0
|
||||||
|
ret
|
||||||
|
.data
|
||||||
|
set8:
|
||||||
|
.reloc set8, R_RISCV_SET8, set8
|
||||||
|
.word 0
|
20
arch/riscv/kernel/tests/module_test/test_sub16.S
Normal file
20
arch/riscv/kernel/tests/module_test/test_sub16.S
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Rivos Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.global test_sub16
|
||||||
|
test_sub16:
|
||||||
|
lh a0, sub16
|
||||||
|
addi a0, a0, -32
|
||||||
|
ret
|
||||||
|
first:
|
||||||
|
.space 32
|
||||||
|
second:
|
||||||
|
|
||||||
|
.data
|
||||||
|
sub16:
|
||||||
|
.reloc sub16, R_RISCV_ADD16, second
|
||||||
|
.reloc sub16, R_RISCV_SUB16, first
|
||||||
|
.half 0
|
20
arch/riscv/kernel/tests/module_test/test_sub32.S
Normal file
20
arch/riscv/kernel/tests/module_test/test_sub32.S
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Rivos Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.global test_sub32
|
||||||
|
test_sub32:
|
||||||
|
lw a0, sub32
|
||||||
|
addi a0, a0, -32
|
||||||
|
ret
|
||||||
|
first:
|
||||||
|
.space 32
|
||||||
|
second:
|
||||||
|
|
||||||
|
.data
|
||||||
|
sub32:
|
||||||
|
.reloc sub32, R_RISCV_ADD32, second
|
||||||
|
.reloc sub32, R_RISCV_SUB32, first
|
||||||
|
.word 0
|
20
arch/riscv/kernel/tests/module_test/test_sub6.S
Normal file
20
arch/riscv/kernel/tests/module_test/test_sub6.S
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Rivos Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.global test_sub6
|
||||||
|
test_sub6:
|
||||||
|
lb a0, sub6
|
||||||
|
addi a0, a0, -32
|
||||||
|
ret
|
||||||
|
first:
|
||||||
|
.space 32
|
||||||
|
second:
|
||||||
|
|
||||||
|
.data
|
||||||
|
sub6:
|
||||||
|
.reloc sub6, R_RISCV_SET6, second
|
||||||
|
.reloc sub6, R_RISCV_SUB6, first
|
||||||
|
.byte 0
|
25
arch/riscv/kernel/tests/module_test/test_sub64.S
Normal file
25
arch/riscv/kernel/tests/module_test/test_sub64.S
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Rivos Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.global test_sub64
|
||||||
|
test_sub64:
|
||||||
|
#ifdef CONFIG_32BIT
|
||||||
|
lw a0, sub64
|
||||||
|
#else
|
||||||
|
ld a0, sub64
|
||||||
|
#endif
|
||||||
|
addi a0, a0, -32
|
||||||
|
ret
|
||||||
|
first:
|
||||||
|
.space 32
|
||||||
|
second:
|
||||||
|
|
||||||
|
.data
|
||||||
|
sub64:
|
||||||
|
.reloc sub64, R_RISCV_ADD64, second
|
||||||
|
.reloc sub64, R_RISCV_SUB64, first
|
||||||
|
.word 0
|
||||||
|
.word 0
|
20
arch/riscv/kernel/tests/module_test/test_sub8.S
Normal file
20
arch/riscv/kernel/tests/module_test/test_sub8.S
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Rivos Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.global test_sub8
|
||||||
|
test_sub8:
|
||||||
|
lb a0, sub8
|
||||||
|
addi a0, a0, -32
|
||||||
|
ret
|
||||||
|
first:
|
||||||
|
.space 32
|
||||||
|
second:
|
||||||
|
|
||||||
|
.data
|
||||||
|
sub8:
|
||||||
|
.reloc sub8, R_RISCV_ADD8, second
|
||||||
|
.reloc sub8, R_RISCV_SUB8, first
|
||||||
|
.byte 0
|
31
arch/riscv/kernel/tests/module_test/test_uleb128.S
Normal file
31
arch/riscv/kernel/tests/module_test/test_uleb128.S
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Rivos Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.global test_uleb_basic
|
||||||
|
test_uleb_basic:
|
||||||
|
ld a0, second
|
||||||
|
addi a0, a0, -127
|
||||||
|
ret
|
||||||
|
|
||||||
|
.global test_uleb_large
|
||||||
|
test_uleb_large:
|
||||||
|
ld a0, fourth
|
||||||
|
addi a0, a0, -0x07e8
|
||||||
|
ret
|
||||||
|
|
||||||
|
.data
|
||||||
|
first:
|
||||||
|
.space 127
|
||||||
|
second:
|
||||||
|
.reloc second, R_RISCV_SET_ULEB128, second
|
||||||
|
.reloc second, R_RISCV_SUB_ULEB128, first
|
||||||
|
.dword 0
|
||||||
|
third:
|
||||||
|
.space 1000
|
||||||
|
fourth:
|
||||||
|
.reloc fourth, R_RISCV_SET_ULEB128, fourth
|
||||||
|
.reloc fourth, R_RISCV_SUB_ULEB128, third
|
||||||
|
.dword 0
|
Loading…
Add table
Reference in a new issue