1/*
2 * Copyright 2003-2004, Axel D��rfler, axeld@pinc-software.de. All rights reserved.
3 * Copyright 2012, Alex Smith, alex@alex-smith.me.uk.
4 * Distributed under the terms of the MIT License.
5 */
6#ifndef KERNEL_BOOT_ELF_H
7#define KERNEL_BOOT_ELF_H
8
9
10#include <boot/addr_range.h>
11#include <sys/stat.h>
12#include <elf_priv.h>
13#include <util/FixedWidthPointer.h>
14
15typedef struct elf32_region {
16	area_id		id;
17	uint32		start;
18	uint32		size;
19	int32		delta;
20} _PACKED elf32_region;
21
22typedef struct elf64_region {
23	area_id		id;
24	uint64		start;
25	uint64		size;
26	int64		delta;
27} _PACKED elf64_region;
28
29struct preloaded_image {
30	FixedWidthPointer<struct preloaded_image> next;
31	FixedWidthPointer<char> name;
32	uint8		elf_class;
33	addr_range	dynamic_section;
34
35	FixedWidthPointer<char> debug_string_table;
36	uint32		num_debug_symbols;
37	uint32		debug_string_table_size;
38
39	ino_t		inode;
40	image_id	id;
41		// the ID field will be filled out in the kernel
42	bool		is_module;
43		// set by the module initialization code
44} _PACKED;
45
46struct preloaded_elf32_image : public preloaded_image {
47	Elf32_Ehdr	elf_header;
48	elf32_region text_region;
49	elf32_region data_region;
50
51	FixedWidthPointer<Elf32_Sym> syms;
52	FixedWidthPointer<Elf32_Rel> rel;
53	int32		rel_len;
54	FixedWidthPointer<Elf32_Rela> rela;
55	int32		rela_len;
56	FixedWidthPointer<Elf32_Rel> pltrel;
57	int32		pltrel_len;
58	int32		pltrel_type;
59
60	FixedWidthPointer<Elf32_Sym> debug_symbols;
61} _PACKED;
62
63struct preloaded_elf64_image : public preloaded_image {
64	Elf64_Ehdr	elf_header;
65	elf64_region text_region;
66	elf64_region data_region;
67
68	FixedWidthPointer<Elf64_Sym> syms;
69	FixedWidthPointer<Elf64_Rel> rel;
70	int64		rel_len;
71	FixedWidthPointer<Elf64_Rela> rela;
72	int64		rela_len;
73	FixedWidthPointer<Elf64_Rel> pltrel;
74	int64		pltrel_len;
75	int64		pltrel_type;
76
77	FixedWidthPointer<Elf64_Sym> debug_symbols;
78} _PACKED;
79
80
81#if B_HAIKU_64_BIT
82typedef preloaded_elf64_image preloaded_elf_image;
83#else
84typedef preloaded_elf32_image preloaded_elf_image;
85#endif
86
87
88#ifdef _BOOT_MODE
89extern status_t boot_elf_resolve_symbol(preloaded_elf32_image* image,
90	Elf32_Sym* symbol, Elf32_Addr* symbolAddress);
91extern status_t boot_elf_resolve_symbol(preloaded_elf64_image* image,
92	Elf64_Sym* symbol, Elf64_Addr* symbolAddress);
93extern Elf32_Addr boot_elf32_get_relocation(Elf32_Addr resolveAddress);
94extern void boot_elf32_set_relocation(Elf32_Addr resolveAddress,
95	Elf32_Addr finalAddress);
96extern void boot_elf64_set_relocation(Elf64_Addr resolveAddress,
97	Elf64_Addr finalAddress);
98#endif
99
100#endif	/* KERNEL_BOOT_ELF_H */
101