|
| 1 | +// SPDX-License-Identifier: GPL-2.0 |
| 2 | +/* Copyright (C) 2023 SUSE LLC */ |
| 3 | +#include <linux/bpf.h> |
| 4 | +#include <bpf/bpf_helpers.h> |
| 5 | +#include "bpf_misc.h" |
| 6 | + |
| 7 | +SEC("?raw_tp") |
| 8 | +__success __log_level(2) |
| 9 | +__msg("mark_precise: frame0: regs=r2 stack= before 3: (bf) r1 = r10") |
| 10 | +__msg("mark_precise: frame0: regs=r2 stack= before 2: (55) if r2 != 0xfffffff8 goto pc+2") |
| 11 | +__msg("mark_precise: frame0: regs=r2 stack= before 1: (87) r2 = -r2") |
| 12 | +__msg("mark_precise: frame0: regs=r2 stack= before 0: (b7) r2 = 8") |
| 13 | +__naked int bpf_neg(void) |
| 14 | +{ |
| 15 | + asm volatile ( |
| 16 | + "r2 = 8;" |
| 17 | + "r2 = -r2;" |
| 18 | + "if r2 != -8 goto 1f;" |
| 19 | + "r1 = r10;" |
| 20 | + "r1 += r2;" |
| 21 | + "1:" |
| 22 | + "r0 = 0;" |
| 23 | + "exit;" |
| 24 | + ::: __clobber_all); |
| 25 | +} |
| 26 | + |
| 27 | +SEC("?raw_tp") |
| 28 | +__success __log_level(2) |
| 29 | +__msg("mark_precise: frame0: regs=r2 stack= before 3: (bf) r1 = r10") |
| 30 | +__msg("mark_precise: frame0: regs=r2 stack= before 2: (55) if r2 != 0x0 goto pc+2") |
| 31 | +__msg("mark_precise: frame0: regs=r2 stack= before 1: (d4) r2 = le16 r2") |
| 32 | +__msg("mark_precise: frame0: regs=r2 stack= before 0: (b7) r2 = 0") |
| 33 | +__naked int bpf_end_to_le(void) |
| 34 | +{ |
| 35 | + asm volatile ( |
| 36 | + "r2 = 0;" |
| 37 | + "r2 = le16 r2;" |
| 38 | + "if r2 != 0 goto 1f;" |
| 39 | + "r1 = r10;" |
| 40 | + "r1 += r2;" |
| 41 | + "1:" |
| 42 | + "r0 = 0;" |
| 43 | + "exit;" |
| 44 | + ::: __clobber_all); |
| 45 | +} |
| 46 | + |
| 47 | + |
| 48 | +SEC("?raw_tp") |
| 49 | +__success __log_level(2) |
| 50 | +__msg("mark_precise: frame0: regs=r2 stack= before 3: (bf) r1 = r10") |
| 51 | +__msg("mark_precise: frame0: regs=r2 stack= before 2: (55) if r2 != 0x0 goto pc+2") |
| 52 | +__msg("mark_precise: frame0: regs=r2 stack= before 1: (dc) r2 = be16 r2") |
| 53 | +__msg("mark_precise: frame0: regs=r2 stack= before 0: (b7) r2 = 0") |
| 54 | +__naked int bpf_end_to_be(void) |
| 55 | +{ |
| 56 | + asm volatile ( |
| 57 | + "r2 = 0;" |
| 58 | + "r2 = be16 r2;" |
| 59 | + "if r2 != 0 goto 1f;" |
| 60 | + "r1 = r10;" |
| 61 | + "r1 += r2;" |
| 62 | + "1:" |
| 63 | + "r0 = 0;" |
| 64 | + "exit;" |
| 65 | + ::: __clobber_all); |
| 66 | +} |
| 67 | + |
| 68 | +#if (defined(__TARGET_ARCH_arm64) || defined(__TARGET_ARCH_x86) || \ |
| 69 | + (defined(__TARGET_ARCH_riscv) && __riscv_xlen == 64) || \ |
| 70 | + defined(__TARGET_ARCH_arm) || defined(__TARGET_ARCH_s390)) && \ |
| 71 | + __clang_major__ >= 18 |
| 72 | + |
| 73 | +SEC("?raw_tp") |
| 74 | +__success __log_level(2) |
| 75 | +__msg("mark_precise: frame0: regs=r2 stack= before 3: (bf) r1 = r10") |
| 76 | +__msg("mark_precise: frame0: regs=r2 stack= before 2: (55) if r2 != 0x0 goto pc+2") |
| 77 | +__msg("mark_precise: frame0: regs=r2 stack= before 1: (d7) r2 = bswap16 r2") |
| 78 | +__msg("mark_precise: frame0: regs=r2 stack= before 0: (b7) r2 = 0") |
| 79 | +__naked int bpf_end_bswap(void) |
| 80 | +{ |
| 81 | + asm volatile ( |
| 82 | + "r2 = 0;" |
| 83 | + "r2 = bswap16 r2;" |
| 84 | + "if r2 != 0 goto 1f;" |
| 85 | + "r1 = r10;" |
| 86 | + "r1 += r2;" |
| 87 | + "1:" |
| 88 | + "r0 = 0;" |
| 89 | + "exit;" |
| 90 | + ::: __clobber_all); |
| 91 | +} |
| 92 | + |
| 93 | +#endif /* v4 instruction */ |
0 commit comments