mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	bpf: Add BTF_ID_LIST/BTF_ID/BTF_ID_UNUSED macros
Adding support to generate .BTF_ids section that will hold BTF ID lists for verifier. Adding macros that will help to define lists of BTF ID values placed in .BTF_ids section. They are initially filled with zeros (during compilation) and resolved later during the linking phase by resolve_btfids tool. Following defines list of one BTF ID value: BTF_ID_LIST(bpf_skb_output_btf_ids) BTF_ID(struct, sk_buff) It also defines following variable to access the list: extern u32 bpf_skb_output_btf_ids[]; 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) Suggested-by: Andrii Nakryiko <andriin@fb.com> Signed-off-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Tested-by: Andrii Nakryiko <andriin@fb.com> Acked-by: Andrii Nakryiko <andriin@fb.com> Link: https://lore.kernel.org/bpf/20200711215329.41165-4-jolsa@kernel.org
This commit is contained in:
		
							parent
							
								
									33a57ce0a5
								
							
						
					
					
						commit
						5a2798ab32
					
				
					 2 changed files with 91 additions and 0 deletions
				
			
		|  | @ -641,6 +641,10 @@ | |||
| 		__start_BTF = .;					\ | ||||
| 		*(.BTF)							\ | ||||
| 		__stop_BTF = .;						\ | ||||
| 	}								\ | ||||
| 	. = ALIGN(4);							\ | ||||
| 	.BTF_ids : AT(ADDR(.BTF_ids) - LOAD_OFFSET) {			\ | ||||
| 		*(.BTF_ids)						\ | ||||
| 	} | ||||
| #else | ||||
| #define BTF | ||||
|  |  | |||
							
								
								
									
										87
									
								
								include/linux/btf_ids.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								include/linux/btf_ids.h
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,87 @@ | |||
| /* SPDX-License-Identifier: GPL-2.0 */ | ||||
| 
 | ||||
| #ifndef _LINUX_BTF_IDS_H | ||||
| #define _LINUX_BTF_IDS_H | ||||
| 
 | ||||
| #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 ", @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)				\ | ||||
| asm(							\ | ||||
| ".pushsection " BTF_IDS_SECTION ",\"a\";       \n"	\ | ||||
| ".local " #name ";                             \n"	\ | ||||
| #name ":;                                      \n"	\ | ||||
| ".popsection;                                  \n");	\ | ||||
| 
 | ||||
| #define BTF_ID_LIST(name)				\ | ||||
| __BTF_ID_LIST(name)					\ | ||||
| extern u32 name[]; | ||||
| 
 | ||||
| /*
 | ||||
|  * 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"); | ||||
| 
 | ||||
| 
 | ||||
| #endif | ||||
		Loading…
	
		Reference in a new issue
	
	 Jiri Olsa
						Jiri Olsa