1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun #ifndef _LINUX_BTF_IDS_H 4*4882a593Smuzhiyun #define _LINUX_BTF_IDS_H 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun struct btf_id_set { 7*4882a593Smuzhiyun u32 cnt; 8*4882a593Smuzhiyun u32 ids[]; 9*4882a593Smuzhiyun }; 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifdef CONFIG_DEBUG_INFO_BTF 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <linux/compiler.h> /* for __PASTE */ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* 16*4882a593Smuzhiyun * Following macros help to define lists of BTF IDs placed 17*4882a593Smuzhiyun * in .BTF_ids section. They are initially filled with zeros 18*4882a593Smuzhiyun * (during compilation) and resolved later during the 19*4882a593Smuzhiyun * linking phase by resolve_btfids tool. 20*4882a593Smuzhiyun * 21*4882a593Smuzhiyun * Any change in list layout must be reflected in resolve_btfids 22*4882a593Smuzhiyun * tool logic. 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #define BTF_IDS_SECTION ".BTF_ids" 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #define ____BTF_ID(symbol) \ 28*4882a593Smuzhiyun asm( \ 29*4882a593Smuzhiyun ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \ 30*4882a593Smuzhiyun ".local " #symbol " ; \n" \ 31*4882a593Smuzhiyun ".type " #symbol ", STT_OBJECT; \n" \ 32*4882a593Smuzhiyun ".size " #symbol ", 4; \n" \ 33*4882a593Smuzhiyun #symbol ": \n" \ 34*4882a593Smuzhiyun ".zero 4 \n" \ 35*4882a593Smuzhiyun ".popsection; \n"); 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define __BTF_ID(symbol) \ 38*4882a593Smuzhiyun ____BTF_ID(symbol) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define __ID(prefix) \ 41*4882a593Smuzhiyun __PASTE(prefix, __COUNTER__) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* 44*4882a593Smuzhiyun * The BTF_ID defines unique symbol for each ID pointing 45*4882a593Smuzhiyun * to 4 zero bytes. 46*4882a593Smuzhiyun */ 47*4882a593Smuzhiyun #define BTF_ID(prefix, name) \ 48*4882a593Smuzhiyun __BTF_ID(__ID(__BTF_ID__##prefix##__##name##__)) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* 51*4882a593Smuzhiyun * The BTF_ID_LIST macro defines pure (unsorted) list 52*4882a593Smuzhiyun * of BTF IDs, with following layout: 53*4882a593Smuzhiyun * 54*4882a593Smuzhiyun * BTF_ID_LIST(list1) 55*4882a593Smuzhiyun * BTF_ID(type1, name1) 56*4882a593Smuzhiyun * BTF_ID(type2, name2) 57*4882a593Smuzhiyun * 58*4882a593Smuzhiyun * list1: 59*4882a593Smuzhiyun * __BTF_ID__type1__name1__1: 60*4882a593Smuzhiyun * .zero 4 61*4882a593Smuzhiyun * __BTF_ID__type2__name2__2: 62*4882a593Smuzhiyun * .zero 4 63*4882a593Smuzhiyun * 64*4882a593Smuzhiyun */ 65*4882a593Smuzhiyun #define __BTF_ID_LIST(name, scope) \ 66*4882a593Smuzhiyun asm( \ 67*4882a593Smuzhiyun ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \ 68*4882a593Smuzhiyun "." #scope " " #name "; \n" \ 69*4882a593Smuzhiyun #name ":; \n" \ 70*4882a593Smuzhiyun ".popsection; \n"); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun #define BTF_ID_LIST(name) \ 73*4882a593Smuzhiyun __BTF_ID_LIST(name, local) \ 74*4882a593Smuzhiyun extern u32 name[]; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #define BTF_ID_LIST_GLOBAL(name) \ 77*4882a593Smuzhiyun __BTF_ID_LIST(name, globl) 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* The BTF_ID_LIST_SINGLE macro defines a BTF_ID_LIST with 80*4882a593Smuzhiyun * a single entry. 81*4882a593Smuzhiyun */ 82*4882a593Smuzhiyun #define BTF_ID_LIST_SINGLE(name, prefix, typename) \ 83*4882a593Smuzhiyun BTF_ID_LIST(name) \ 84*4882a593Smuzhiyun BTF_ID(prefix, typename) 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* 87*4882a593Smuzhiyun * The BTF_ID_UNUSED macro defines 4 zero bytes. 88*4882a593Smuzhiyun * It's used when we want to define 'unused' entry 89*4882a593Smuzhiyun * in BTF_ID_LIST, like: 90*4882a593Smuzhiyun * 91*4882a593Smuzhiyun * BTF_ID_LIST(bpf_skb_output_btf_ids) 92*4882a593Smuzhiyun * BTF_ID(struct, sk_buff) 93*4882a593Smuzhiyun * BTF_ID_UNUSED 94*4882a593Smuzhiyun * BTF_ID(struct, task_struct) 95*4882a593Smuzhiyun */ 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun #define BTF_ID_UNUSED \ 98*4882a593Smuzhiyun asm( \ 99*4882a593Smuzhiyun ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \ 100*4882a593Smuzhiyun ".zero 4 \n" \ 101*4882a593Smuzhiyun ".popsection; \n"); 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun /* 104*4882a593Smuzhiyun * The BTF_SET_START/END macros pair defines sorted list of 105*4882a593Smuzhiyun * BTF IDs plus its members count, with following layout: 106*4882a593Smuzhiyun * 107*4882a593Smuzhiyun * BTF_SET_START(list) 108*4882a593Smuzhiyun * BTF_ID(type1, name1) 109*4882a593Smuzhiyun * BTF_ID(type2, name2) 110*4882a593Smuzhiyun * BTF_SET_END(list) 111*4882a593Smuzhiyun * 112*4882a593Smuzhiyun * __BTF_ID__set__list: 113*4882a593Smuzhiyun * .zero 4 114*4882a593Smuzhiyun * list: 115*4882a593Smuzhiyun * __BTF_ID__type1__name1__3: 116*4882a593Smuzhiyun * .zero 4 117*4882a593Smuzhiyun * __BTF_ID__type2__name2__4: 118*4882a593Smuzhiyun * .zero 4 119*4882a593Smuzhiyun * 120*4882a593Smuzhiyun */ 121*4882a593Smuzhiyun #define __BTF_SET_START(name, scope) \ 122*4882a593Smuzhiyun asm( \ 123*4882a593Smuzhiyun ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \ 124*4882a593Smuzhiyun "." #scope " __BTF_ID__set__" #name "; \n" \ 125*4882a593Smuzhiyun "__BTF_ID__set__" #name ":; \n" \ 126*4882a593Smuzhiyun ".zero 4 \n" \ 127*4882a593Smuzhiyun ".popsection; \n"); 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun #define BTF_SET_START(name) \ 130*4882a593Smuzhiyun __BTF_ID_LIST(name, local) \ 131*4882a593Smuzhiyun __BTF_SET_START(name, local) 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun #define BTF_SET_START_GLOBAL(name) \ 134*4882a593Smuzhiyun __BTF_ID_LIST(name, globl) \ 135*4882a593Smuzhiyun __BTF_SET_START(name, globl) 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun #define BTF_SET_END(name) \ 138*4882a593Smuzhiyun asm( \ 139*4882a593Smuzhiyun ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \ 140*4882a593Smuzhiyun ".size __BTF_ID__set__" #name ", .-" #name " \n" \ 141*4882a593Smuzhiyun ".popsection; \n"); \ 142*4882a593Smuzhiyun extern struct btf_id_set name; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun #else 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun #define BTF_ID_LIST(name) static u32 name[5]; 147*4882a593Smuzhiyun #define BTF_ID(prefix, name) 148*4882a593Smuzhiyun #define BTF_ID_UNUSED 149*4882a593Smuzhiyun #define BTF_ID_LIST_GLOBAL(name) u32 name[1]; 150*4882a593Smuzhiyun #define BTF_ID_LIST_SINGLE(name, prefix, typename) static u32 name[1]; 151*4882a593Smuzhiyun #define BTF_SET_START(name) static struct btf_id_set name = { 0 }; 152*4882a593Smuzhiyun #define BTF_SET_START_GLOBAL(name) static struct btf_id_set name = { 0 }; 153*4882a593Smuzhiyun #define BTF_SET_END(name) 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun #endif /* CONFIG_DEBUG_INFO_BTF */ 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun #ifdef CONFIG_NET 158*4882a593Smuzhiyun /* Define a list of socket types which can be the argument for 159*4882a593Smuzhiyun * skc_to_*_sock() helpers. All these sockets should have 160*4882a593Smuzhiyun * sock_common as the first argument in its memory layout. 161*4882a593Smuzhiyun */ 162*4882a593Smuzhiyun #define BTF_SOCK_TYPE_xxx \ 163*4882a593Smuzhiyun BTF_SOCK_TYPE(BTF_SOCK_TYPE_INET, inet_sock) \ 164*4882a593Smuzhiyun BTF_SOCK_TYPE(BTF_SOCK_TYPE_INET_CONN, inet_connection_sock) \ 165*4882a593Smuzhiyun BTF_SOCK_TYPE(BTF_SOCK_TYPE_INET_REQ, inet_request_sock) \ 166*4882a593Smuzhiyun BTF_SOCK_TYPE(BTF_SOCK_TYPE_INET_TW, inet_timewait_sock) \ 167*4882a593Smuzhiyun BTF_SOCK_TYPE(BTF_SOCK_TYPE_REQ, request_sock) \ 168*4882a593Smuzhiyun BTF_SOCK_TYPE(BTF_SOCK_TYPE_SOCK, sock) \ 169*4882a593Smuzhiyun BTF_SOCK_TYPE(BTF_SOCK_TYPE_SOCK_COMMON, sock_common) \ 170*4882a593Smuzhiyun BTF_SOCK_TYPE(BTF_SOCK_TYPE_TCP, tcp_sock) \ 171*4882a593Smuzhiyun BTF_SOCK_TYPE(BTF_SOCK_TYPE_TCP_REQ, tcp_request_sock) \ 172*4882a593Smuzhiyun BTF_SOCK_TYPE(BTF_SOCK_TYPE_TCP_TW, tcp_timewait_sock) \ 173*4882a593Smuzhiyun BTF_SOCK_TYPE(BTF_SOCK_TYPE_TCP6, tcp6_sock) \ 174*4882a593Smuzhiyun BTF_SOCK_TYPE(BTF_SOCK_TYPE_UDP, udp_sock) \ 175*4882a593Smuzhiyun BTF_SOCK_TYPE(BTF_SOCK_TYPE_UDP6, udp6_sock) 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun enum { 178*4882a593Smuzhiyun #define BTF_SOCK_TYPE(name, str) name, 179*4882a593Smuzhiyun BTF_SOCK_TYPE_xxx 180*4882a593Smuzhiyun #undef BTF_SOCK_TYPE 181*4882a593Smuzhiyun MAX_BTF_SOCK_TYPE, 182*4882a593Smuzhiyun }; 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun extern u32 btf_sock_ids[]; 185*4882a593Smuzhiyun #endif 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun #endif 188