1*729bf531SPuranjay Mohan // SPDX-License-Identifier: GPL-2.0
2*729bf531SPuranjay Mohan /*
3*729bf531SPuranjay Mohan * Static branch in a patched function. The jump table entry is written out by
4*729bf531SPuranjay Mohan * hand, mirroring JUMP_TABLE_ENTRY(), so the fixture builds without kernel
5*729bf531SPuranjay Mohan * headers. The key is an STT_OBJECT; anything else is ignored by
6*729bf531SPuranjay Mohan * validate_special_section_klp_reloc().
7*729bf531SPuranjay Mohan *
8*729bf531SPuranjay Mohan * MODNAME selects whether the key is taken to belong to vmlinux or a module.
9*729bf531SPuranjay Mohan *
10*729bf531SPuranjay Mohan * NEW_KEY puts the whole static branch behind PATCHED, so the patch introduces
11*729bf531SPuranjay Mohan * one where the original had none -- a different question from patching code
12*729bf531SPuranjay Mohan * that already has a key, because the __jump_table entry itself is new.
13*729bf531SPuranjay Mohan *
14*729bf531SPuranjay Mohan * KEY_NAME renames the key. Two names are special to
15*729bf531SPuranjay Mohan * validate_special_section_klp_reloc(): a __tracepoint_* key and the
16*729bf531SPuranjay Mohan * __UNIQUE_ID_ddebug_* one pr_debug() generates are both unsupported in a
17*729bf531SPuranjay Mohan * module, but are disabled with a warning rather than rejected, because the
18*729bf531SPuranjay Mohan * kernel is full of them and refusing outright would make ordinary functions
19*729bf531SPuranjay Mohan * unpatchable.
20*729bf531SPuranjay Mohan *
21*729bf531SPuranjay Mohan * STATIC_KEY makes the key file-local. That changes the shape of the
22*729bf531SPuranjay Mohan * relocation rather than the meaning of the code: a reference to a static lands
23*729bf531SPuranjay Mohan * on the section symbol plus an addend, so the key has to be resolved from the
24*729bf531SPuranjay Mohan * section before it can be recognised as a key at all.
25*729bf531SPuranjay Mohan */
26*729bf531SPuranjay Mohan
27*729bf531SPuranjay Mohan #ifndef MODNAME
28*729bf531SPuranjay Mohan #define MODNAME "vmlinux"
29*729bf531SPuranjay Mohan #endif
30*729bf531SPuranjay Mohan
31*729bf531SPuranjay Mohan #ifndef KEY_NAME
32*729bf531SPuranjay Mohan #define KEY_NAME klp_test_key
33*729bf531SPuranjay Mohan #endif
34*729bf531SPuranjay Mohan
35*729bf531SPuranjay Mohan static const char __modinfo[]
36*729bf531SPuranjay Mohan __attribute__((section(".modinfo"), used, aligned(1))) = "\0name=" MODNAME;
37*729bf531SPuranjay Mohan
38*729bf531SPuranjay Mohan #ifdef STATIC_KEY
39*729bf531SPuranjay Mohan static long KEY_NAME;
40*729bf531SPuranjay Mohan #else
41*729bf531SPuranjay Mohan long KEY_NAME;
42*729bf531SPuranjay Mohan #endif
43*729bf531SPuranjay Mohan
target(int x)44*729bf531SPuranjay Mohan int target(int x)
45*729bf531SPuranjay Mohan {
46*729bf531SPuranjay Mohan int r = x;
47*729bf531SPuranjay Mohan
48*729bf531SPuranjay Mohan #if defined(NEW_KEY) && !defined(PATCHED)
49*729bf531SPuranjay Mohan /* The original has no static branch at all. */
50*729bf531SPuranjay Mohan return r + 1;
51*729bf531SPuranjay Mohan #else
52*729bf531SPuranjay Mohan asm goto(
53*729bf531SPuranjay Mohan "1: nop\n\t"
54*729bf531SPuranjay Mohan ".pushsection __jump_table, \"aw\"\n\t"
55*729bf531SPuranjay Mohan ".balign 8\n\t"
56*729bf531SPuranjay Mohan "912:\n\t"
57*729bf531SPuranjay Mohan ".pushsection .discard.annotate_data, \"M\", @progbits, 8\n\t"
58*729bf531SPuranjay Mohan ".long 912b - ., 1\n\t"
59*729bf531SPuranjay Mohan ".popsection\n\t"
60*729bf531SPuranjay Mohan ".long 1b - ., %l[l_yes] - .\n\t"
61*729bf531SPuranjay Mohan ".quad %c0 - .\n\t"
62*729bf531SPuranjay Mohan ".popsection\n\t"
63*729bf531SPuranjay Mohan : : "i" (&KEY_NAME) : : l_yes);
64*729bf531SPuranjay Mohan
65*729bf531SPuranjay Mohan r += 1;
66*729bf531SPuranjay Mohan goto out;
67*729bf531SPuranjay Mohan l_yes:
68*729bf531SPuranjay Mohan r += 2;
69*729bf531SPuranjay Mohan out:
70*729bf531SPuranjay Mohan #endif
71*729bf531SPuranjay Mohan #ifdef PATCHED
72*729bf531SPuranjay Mohan return r + 100;
73*729bf531SPuranjay Mohan #else
74*729bf531SPuranjay Mohan return r;
75*729bf531SPuranjay Mohan #endif
76*729bf531SPuranjay Mohan }
77