1*e5a0516eSJiri Olsa /* SPDX-License-Identifier: GPL-2.0 */ 2*e5a0516eSJiri Olsa 3*e5a0516eSJiri Olsa #ifndef _LINUX_BTF_IDS_H 4*e5a0516eSJiri Olsa #define _LINUX_BTF_IDS_H 5*e5a0516eSJiri Olsa 6*e5a0516eSJiri Olsa #include <linux/compiler.h> /* for __PASTE */ 7*e5a0516eSJiri Olsa 8*e5a0516eSJiri Olsa /* 9*e5a0516eSJiri Olsa * Following macros help to define lists of BTF IDs placed 10*e5a0516eSJiri Olsa * in .BTF_ids section. They are initially filled with zeros 11*e5a0516eSJiri Olsa * (during compilation) and resolved later during the 12*e5a0516eSJiri Olsa * linking phase by resolve_btfids tool. 13*e5a0516eSJiri Olsa * 14*e5a0516eSJiri Olsa * Any change in list layout must be reflected in resolve_btfids 15*e5a0516eSJiri Olsa * tool logic. 16*e5a0516eSJiri Olsa */ 17*e5a0516eSJiri Olsa 18*e5a0516eSJiri Olsa #define BTF_IDS_SECTION ".BTF_ids" 19*e5a0516eSJiri Olsa 20*e5a0516eSJiri Olsa #define ____BTF_ID(symbol) \ 21*e5a0516eSJiri Olsa asm( \ 22*e5a0516eSJiri Olsa ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \ 23*e5a0516eSJiri Olsa ".local " #symbol " ; \n" \ 24*e5a0516eSJiri Olsa ".type " #symbol ", @object; \n" \ 25*e5a0516eSJiri Olsa ".size " #symbol ", 4; \n" \ 26*e5a0516eSJiri Olsa #symbol ": \n" \ 27*e5a0516eSJiri Olsa ".zero 4 \n" \ 28*e5a0516eSJiri Olsa ".popsection; \n"); 29*e5a0516eSJiri Olsa 30*e5a0516eSJiri Olsa #define __BTF_ID(symbol) \ 31*e5a0516eSJiri Olsa ____BTF_ID(symbol) 32*e5a0516eSJiri Olsa 33*e5a0516eSJiri Olsa #define __ID(prefix) \ 34*e5a0516eSJiri Olsa __PASTE(prefix, __COUNTER__) 35*e5a0516eSJiri Olsa 36*e5a0516eSJiri Olsa /* 37*e5a0516eSJiri Olsa * The BTF_ID defines unique symbol for each ID pointing 38*e5a0516eSJiri Olsa * to 4 zero bytes. 39*e5a0516eSJiri Olsa */ 40*e5a0516eSJiri Olsa #define BTF_ID(prefix, name) \ 41*e5a0516eSJiri Olsa __BTF_ID(__ID(__BTF_ID__##prefix##__##name##__)) 42*e5a0516eSJiri Olsa 43*e5a0516eSJiri Olsa /* 44*e5a0516eSJiri Olsa * The BTF_ID_LIST macro defines pure (unsorted) list 45*e5a0516eSJiri Olsa * of BTF IDs, with following layout: 46*e5a0516eSJiri Olsa * 47*e5a0516eSJiri Olsa * BTF_ID_LIST(list1) 48*e5a0516eSJiri Olsa * BTF_ID(type1, name1) 49*e5a0516eSJiri Olsa * BTF_ID(type2, name2) 50*e5a0516eSJiri Olsa * 51*e5a0516eSJiri Olsa * list1: 52*e5a0516eSJiri Olsa * __BTF_ID__type1__name1__1: 53*e5a0516eSJiri Olsa * .zero 4 54*e5a0516eSJiri Olsa * __BTF_ID__type2__name2__2: 55*e5a0516eSJiri Olsa * .zero 4 56*e5a0516eSJiri Olsa * 57*e5a0516eSJiri Olsa */ 58*e5a0516eSJiri Olsa #define __BTF_ID_LIST(name) \ 59*e5a0516eSJiri Olsa asm( \ 60*e5a0516eSJiri Olsa ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \ 61*e5a0516eSJiri Olsa ".local " #name "; \n" \ 62*e5a0516eSJiri Olsa #name ":; \n" \ 63*e5a0516eSJiri Olsa ".popsection; \n"); \ 64*e5a0516eSJiri Olsa 65*e5a0516eSJiri Olsa #define BTF_ID_LIST(name) \ 66*e5a0516eSJiri Olsa __BTF_ID_LIST(name) \ 67*e5a0516eSJiri Olsa extern u32 name[]; 68*e5a0516eSJiri Olsa 69*e5a0516eSJiri Olsa /* 70*e5a0516eSJiri Olsa * The BTF_ID_UNUSED macro defines 4 zero bytes. 71*e5a0516eSJiri Olsa * It's used when we want to define 'unused' entry 72*e5a0516eSJiri Olsa * in BTF_ID_LIST, like: 73*e5a0516eSJiri Olsa * 74*e5a0516eSJiri Olsa * BTF_ID_LIST(bpf_skb_output_btf_ids) 75*e5a0516eSJiri Olsa * BTF_ID(struct, sk_buff) 76*e5a0516eSJiri Olsa * BTF_ID_UNUSED 77*e5a0516eSJiri Olsa * BTF_ID(struct, task_struct) 78*e5a0516eSJiri Olsa */ 79*e5a0516eSJiri Olsa 80*e5a0516eSJiri Olsa #define BTF_ID_UNUSED \ 81*e5a0516eSJiri Olsa asm( \ 82*e5a0516eSJiri Olsa ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \ 83*e5a0516eSJiri Olsa ".zero 4 \n" \ 84*e5a0516eSJiri Olsa ".popsection; \n"); 85*e5a0516eSJiri Olsa 86*e5a0516eSJiri Olsa 87*e5a0516eSJiri Olsa #endif 88