#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # # A patch may introduce a static call where the original function had none. # # The .static_call_sites entry is then new, with nothing in the original to # correlate it against, so klp diff has to carry it into the patch from # scratch. Where the key lives still decides whether that is allowed: a # vmlinux key is reachable, and a module-owned one is not, for the same reason # an existing module key is not -- late module patching lets the livepatch load # first, and the unresolved entry is dereferenced when the module arrives. # # Both halves are here because they fail in opposite directions. Dropping the # new entry leaves a static call the kernel never patches; accepting a new # module-owned one is the corruption the check exists to prevent. # # Covers the same ground as corpus/x86_64/static-call-vmlinux-new and # static-call-module-new in Joe Lawrence's klp-build unit test corpus. . "$(dirname "$0")/../lib.sh" setup build_pair static_call.c -DNEW_CALL # The premise: the original really has no static call, the patched one does. has_input_section orig.o .static_call_sites && fail "fixture put a .static_call_sites in the original; nothing new to add" has_input_section patched.o .static_call_sites || probe_skip "compiler produced no .static_call_sites on this arch" run_diff assert_patched target assert_section .static_call_sites assert_reloc_sym .static_call_sites target # The same new call, with the key owned by a module: not reachable, so the # build has to stop rather than emit a relocation nothing will resolve. rm -f "$workdir/out.o" build_pair static_call.c -DNEW_CALL -DMODNAME='"klp_testmod"' run_diff 255 assert_diff_log 'unsupported static call key __SCK__klp_test_call' [ -e "$workdir/out.o" ] && fail "output object produced for a rejected input" pass "static call introduced by the patch carried in, or rejected for a module key"