| 1 | |
| 2 | |
| 3 | * Static call site in a patched function, laid out by hand as for
|
| 4 | * jump_label.c. MODNAME selects whether the key belongs to vmlinux or a
|
| 5 | * module.
|
| 6 | *
|
| 7 | * objtool's check pass would emit the site, and klp-write-tests.txt says to
|
| 8 | * let it. Not here: it does not emit the ANNOTATE_DATA_SPECIAL describing
|
| 9 | * the entry boundaries -- in the kernel that comes from the static_call
|
| 10 | * macros -- and NO_ANNOTATE below has to be able to take it away. A fixture
|
| 11 | * which varies the annotation has to write the entry that goes with it.
|
| 12 | *
|
| 13 | * NO_ANNOTATE drops the ANNOTATE_DATA_SPECIAL block from the patched build,
|
| 14 | * leaving .static_call_sites with no annotation to describe its entry
|
| 15 | * boundaries. The section carries no entsize either, so klp diff has to fall
|
| 16 | * back on the annotations it can still see -- and when the patched object is
|
| 17 | * the only one that lost them, the two sides disagree about how the section is
|
| 18 | * divided up.
|
| 19 | *
|
| 20 | * NEW_CALL puts the call site behind PATCHED, so the patch introduces one
|
| 21 | * where the original had none. The .static_call_sites entry is then new, with
|
| 22 | * nothing in the original to correlate it against.
|
| 23 |
|
| 24 |
|
| 25 | #ifndef MODNAME
|
| 26 | #define MODNAME "vmlinux"
|
| 27 | #endif
|
| 28 |
|
| 29 | static const char __modinfo[]
|
| 30 | __attribute__((section(".modinfo"), used, aligned(1))) = "\0name=" MODNAME;
|
| 31 |
|
| 32 | long __SCK__klp_test_call;
|
| 33 |
|
| 34 | int target(int x)
|
| 35 | {
|
| 36 | #if defined(NEW_CALL) && !defined(PATCHED)
|
| 37 |
|
| 38 | return x + 1;
|
| 39 | #else
|
| 40 | __asm__ volatile(
|
| 41 | "1: nop\n\t"
|
| 42 | ".pushsection .static_call_sites, \"aw\"\n\t"
|
| 43 | ".balign 8\n\t"
|
| 44 | "912:\n\t"
|
| 45 | #if !(defined(PATCHED) && defined(NO_ANNOTATE))
|
| 46 | ".pushsection .discard.annotate_data, \"M\", @progbits, 8\n\t"
|
| 47 | ".long 912b - ., 1\n\t"
|
| 48 | ".popsection\n\t"
|
| 49 | #endif
|
| 50 | ".long 1b - ., %c0 - .\n\t"
|
| 51 | ".popsection\n\t"
|
| 52 | :: "i" (&__SCK__klp_test_call));
|
| 53 | #endif
|
| 54 | #ifdef PATCHED
|
| 55 | return x + 2;
|
| 56 | #else
|
| 57 | return x + 1;
|
| 58 | #endif
|
| 59 | }
|