xref: /linux/tools/testing/selftests/livepatch/test-ftrace.sh (revision 09005a63988521f74111fae344aecb3f63306168)
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3# Copyright (C) 2019 Joe Lawrence <joe.lawrence@redhat.com>
4
5. $(dirname $0)/functions.sh
6
7MOD_LIVEPATCH=test_klp_livepatch
8
9setup_config
10
11
12# - turn ftrace_enabled OFF and verify livepatches can't load
13# - turn ftrace_enabled ON and verify livepatch can load
14# - verify that ftrace_enabled can't be turned OFF while a livepatch is loaded
15# (skipped on kernels where the sysctl is deprecated and always refuses 0)
16
17start_test "livepatch interaction with ftrace_enabled sysctl"
18
19if ftrace_disable_supported; then
20
21	set_ftrace_enabled 0
22	load_failing_mod $MOD_LIVEPATCH
23
24	set_ftrace_enabled 1
25	load_lp $MOD_LIVEPATCH
26	if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH: this has been live patched" ]] ; then
27		echo -e "FAIL\n\n"
28		die "livepatch kselftest(s) failed"
29	fi
30
31	# Check that ftrace could not get disabled when a livepatch is enabled
32	set_ftrace_enabled --fail 0
33	if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH: this has been live patched" ]] ; then
34		echo -e "FAIL\n\n"
35		die "livepatch kselftest(s) failed"
36	fi
37	disable_lp $MOD_LIVEPATCH
38	unload_lp $MOD_LIVEPATCH
39
40	check_result "livepatch: kernel.ftrace_enabled = 0
41% insmod test_modules/$MOD_LIVEPATCH.ko
42livepatch: enabling patch '$MOD_LIVEPATCH'
43livepatch: '$MOD_LIVEPATCH': initializing patching transition
44livepatch: failed to register ftrace handler for function 'cmdline_proc_show' (-16)
45livepatch: failed to patch object 'vmlinux'
46livepatch: failed to enable patch '$MOD_LIVEPATCH'
47livepatch: '$MOD_LIVEPATCH': canceling patching transition, going to unpatch
48livepatch: '$MOD_LIVEPATCH': completing unpatching transition
49livepatch: '$MOD_LIVEPATCH': unpatching complete
50insmod: ERROR: could not insert module test_modules/$MOD_LIVEPATCH.ko: Device or resource busy
51livepatch: kernel.ftrace_enabled = 1
52% insmod test_modules/$MOD_LIVEPATCH.ko
53livepatch: enabling patch '$MOD_LIVEPATCH'
54livepatch: '$MOD_LIVEPATCH': initializing patching transition
55livepatch: '$MOD_LIVEPATCH': starting patching transition
56livepatch: '$MOD_LIVEPATCH': completing patching transition
57livepatch: '$MOD_LIVEPATCH': patching complete
58livepatch: sysctl: setting key \"kernel.ftrace_enabled\": Device or resource busy
59% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabled
60livepatch: '$MOD_LIVEPATCH': initializing unpatching transition
61livepatch: '$MOD_LIVEPATCH': starting unpatching transition
62livepatch: '$MOD_LIVEPATCH': completing unpatching transition
63livepatch: '$MOD_LIVEPATCH': unpatching complete
64% rmmod $MOD_LIVEPATCH"
65
66else
67
68	set_ftrace_enabled --fail 0
69	check_result "livepatch: sysctl: setting key \"kernel.ftrace_enabled\": \
70Operation not supported"
71
72fi
73
74
75# - verify livepatch can load
76# - check if traces have a patched function
77# - reset trace and unload livepatch
78
79start_test "trace livepatched function and check that the live patch remains in effect"
80
81FUNCTION_NAME="livepatch_cmdline_proc_show"
82
83load_lp $MOD_LIVEPATCH
84trace_function "$FUNCTION_NAME"
85
86if [[ "$(cat /proc/cmdline)" == "$MOD_LIVEPATCH: this has been live patched" ]] ; then
87	log "livepatch: ok"
88fi
89
90check_traced_functions "$FUNCTION_NAME"
91
92disable_lp $MOD_LIVEPATCH
93unload_lp $MOD_LIVEPATCH
94
95check_result "% insmod test_modules/$MOD_LIVEPATCH.ko
96livepatch: enabling patch '$MOD_LIVEPATCH'
97livepatch: '$MOD_LIVEPATCH': initializing patching transition
98livepatch: '$MOD_LIVEPATCH': starting patching transition
99livepatch: '$MOD_LIVEPATCH': completing patching transition
100livepatch: '$MOD_LIVEPATCH': patching complete
101livepatch: ok
102% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabled
103livepatch: '$MOD_LIVEPATCH': initializing unpatching transition
104livepatch: '$MOD_LIVEPATCH': starting unpatching transition
105livepatch: '$MOD_LIVEPATCH': completing unpatching transition
106livepatch: '$MOD_LIVEPATCH': unpatching complete
107% rmmod $MOD_LIVEPATCH"
108
109
110# - trace a function
111# - verify livepatch can load targgeting on the same traced function
112# - check if the livepatch is in effect
113# - reset trace and unload livepatch
114
115start_test "livepatch a traced function and check that the live patch remains in effect"
116
117FUNCTION_NAME="cmdline_proc_show"
118
119trace_function "$FUNCTION_NAME"
120load_lp $MOD_LIVEPATCH
121
122if [[ "$(cat /proc/cmdline)" == "$MOD_LIVEPATCH: this has been live patched" ]] ; then
123	log "livepatch: ok"
124fi
125
126check_traced_functions "$FUNCTION_NAME"
127
128disable_lp $MOD_LIVEPATCH
129unload_lp $MOD_LIVEPATCH
130
131check_result "% insmod test_modules/$MOD_LIVEPATCH.ko
132livepatch: enabling patch '$MOD_LIVEPATCH'
133livepatch: '$MOD_LIVEPATCH': initializing patching transition
134livepatch: '$MOD_LIVEPATCH': starting patching transition
135livepatch: '$MOD_LIVEPATCH': completing patching transition
136livepatch: '$MOD_LIVEPATCH': patching complete
137livepatch: ok
138% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabled
139livepatch: '$MOD_LIVEPATCH': initializing unpatching transition
140livepatch: '$MOD_LIVEPATCH': starting unpatching transition
141livepatch: '$MOD_LIVEPATCH': completing unpatching transition
142livepatch: '$MOD_LIVEPATCH': unpatching complete
143% rmmod $MOD_LIVEPATCH"
144
145exit 0
146