1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 3 #ifndef TOOL_RMODULE_H 4 #define TOOL_RMODULE_H 5 6 #include "elfparsing.h" 7 #include "common.h" 8 9 struct arch_ops { 10 int arch; 11 /* Determine if relocation is a valid type for the architecture. */ 12 int (*valid_type)(Elf64_Rela *rel); 13 /* Determine if relocation should be emitted. */ 14 int (*should_emit)(Elf64_Rela *rel); 15 }; 16 17 /* 18 * The fields in rmod_context are read-only to the user. These are 19 * exposed for easy shareability. 20 */ 21 struct rmod_context { 22 /* Ops to process relocations. */ 23 const struct arch_ops *ops; 24 25 /* endian conversion ops */ 26 struct xdr *xdr; 27 28 /* Parsed ELF structure. */ 29 struct parsed_elf pelf; 30 /* Program segment. */ 31 Elf64_Phdr *phdr; 32 /* Number of loadable segments. */ 33 size_t nsegments; 34 /* Symbol string table. */ 35 char *strtab; 36 37 /* Collection of relocation addresses fixup in the module. */ 38 Elf64_Xword nrelocs; 39 Elf64_Addr *emitted_relocs; 40 41 /* The following fields are addresses within the linked program. */ 42 Elf64_Addr parameters_begin; 43 Elf64_Addr parameters_end; 44 Elf64_Addr bss_begin; 45 Elf64_Addr bss_end; 46 }; 47 48 struct reloc_filter { 49 /* Return < 0 on error. 0 to ignore relocation and 1 to include 50 * relocation. */ 51 int (*filter)(struct reloc_filter *f, const Elf64_Rela *r); 52 /* Pointer for filter provides */ 53 void *context; 54 }; 55 56 /* 57 * Parse an ELF file within the elfin buffer and fill in the elfout buffer 58 * with a created rmodule in ELF format. Return 0 on success, < 0 on error. 59 */ 60 int rmodule_create(const struct buffer *elfin, struct buffer *elfout); 61 62 /* 63 * Initialize an rmodule context from an ELF buffer. Returns 0 on scucess, < 0 64 * on error. 65 */ 66 int rmodule_init(struct rmod_context *ctx, const struct buffer *elfin); 67 68 /* 69 * Collect all the relocations that apply to the program in 70 * nrelocs/emitted_relocs. One can optionally provide a reloc_filter object 71 * to help in relocation filtering. The filter function will be called twice: 72 * once for counting and once for emitting. The same response should be 73 * provided for each call. Returns 0 on success, < 0 on error. 74 */ 75 int rmodule_collect_relocations(struct rmod_context *c, struct reloc_filter *f); 76 77 /* Clean up the memory consumed by the rmodule context. */ 78 void rmodule_cleanup(struct rmod_context *ctx); 79 80 /* 81 * Create an ELF file from the passed in rmodule in the buffer. The buffer 82 * contents will be replaced with an ELF file. Returns 1 if buff doesn't 83 * contain an rmodule and < 0 on failure, 0 on success. 84 */ 85 int rmodule_stage_to_elf(Elf64_Ehdr *ehdr, struct buffer *buff); 86 87 #endif /* TOOL_RMODULE_H */ 88