summaryrefslogtreecommitdiff
path: root/util/cbfstool/rmodule.h
diff options
context:
space:
mode:
Diffstat (limited to 'util/cbfstool/rmodule.h')
-rw-r--r--util/cbfstool/rmodule.h63
1 files changed, 62 insertions, 1 deletions
diff --git a/util/cbfstool/rmodule.h b/util/cbfstool/rmodule.h
index 4531f8d0b9..9a65677418 100644
--- a/util/cbfstool/rmodule.h
+++ b/util/cbfstool/rmodule.h
@@ -18,13 +18,74 @@
#ifndef TOOL_RMODULE_H
#define TOOL_RMODULE_H
-#include "elf.h"
+#include "elfparsing.h"
#include "common.h"
+struct arch_ops {
+ int arch;
+ /* Determine if relocation is a valid type for the architecture. */
+ int (*valid_type)(Elf64_Rela *rel);
+ /* Determine if relocation should be emitted. */
+ int (*should_emit)(Elf64_Rela *rel);
+};
+
+/*
+ * The fields in rmod_context are read-only to the user. These are
+ * exposed for easy shareability.
+ */
+struct rmod_context {
+ /* Ops to process relocations. */
+ const struct arch_ops *ops;
+
+ /* endian conversion ops */
+ struct xdr *xdr;
+
+ /* Parsed ELF sturcture. */
+ struct parsed_elf pelf;
+ /* Program segment. */
+ Elf64_Phdr *phdr;
+
+ /* Collection of relocation addresses fixup in the module. */
+ Elf64_Xword nrelocs;
+ Elf64_Addr *emitted_relocs;
+
+ /* The following fields are addresses within the linked program. */
+ Elf64_Addr parameters_begin;
+ Elf64_Addr parameters_end;
+ Elf64_Addr bss_begin;
+ Elf64_Addr bss_end;
+};
+
+struct reloc_filter {
+ /* Return < 0 on error. 0 to ignore relocation and 1 to include
+ * relocation. */
+ int (*filter)(struct reloc_filter *f, const Elf64_Rela *r);
+ /* Pointer for filter provides */
+ void *context;
+};
+
/*
* Parse an ELF file within the elfin buffer and fill in the elfout buffer
* with a created rmodule in ELF format. Return 0 on success, < 0 on error.
*/
int rmodule_create(const struct buffer *elfin, struct buffer *elfout);
+/*
+ * Initialize an rmodule context from an ELF buffer. Returns 0 on scucess, < 0
+ * on error.
+ */
+int rmodule_init(struct rmod_context *ctx, const struct buffer *elfin);
+
+/*
+ * Collect all the relocations that apply to the program in
+ * nrelocs/emitted_relocs. One can optionally provide a reloc_filter object
+ * to help in relocation filtering. The filter function will be called twice:
+ * once for counting and once for emitting. The same response should be
+ * provided for each call. Returns 0 on success, < 0 on error.
+ */
+int rmodule_collect_relocations(struct rmod_context *c, struct reloc_filter *f);
+
+/* Clean up the memory consumed by the rmdoule context. */
+void rmodule_cleanup(struct rmod_context *ctx);
+
#endif /* TOOL_RMODULE_H */