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