Added an ELF64 version of preloaded_image.

* There is now 2 structures, preloaded_elf32_image and preloaded_elf64_image,
  which both inherit from preloaded_image.
* For now I've just hardcoded in use of preloaded_elf32_image, but the
  bootloader ELF code will shortly be converted to use templates which use
  the appropriate structure. The kernel will be changed later when I add
  ELF64 support to it.
* All kernel_args data is now compatible between 32-bit and 64-bit kernels.
This commit is contained in:
Alex Smith
2012-06-22 19:24:51 +01:00
parent 62d36f9833
commit f124497815
24 changed files with 171 additions and 84 deletions
+2 -2
View File
@@ -15,9 +15,9 @@ extern "C" {
/* ELF support */
extern status_t boot_arch_elf_relocate_rel(struct preloaded_image *image,
extern status_t boot_arch_elf_relocate_rel(preloaded_elf32_image *image,
struct Elf32_Rel *rel, int rel_len);
extern status_t boot_arch_elf_relocate_rela(struct preloaded_image *image,
extern status_t boot_arch_elf_relocate_rela(preloaded_elf32_image *image,
struct Elf32_Rela *rel, int rel_len);
+53 -17
View File
@@ -11,27 +11,29 @@
#include <elf_priv.h>
#include <util/FixedWidthPointer.h>
typedef struct elf32_region {
area_id id;
uint32 start;
uint32 size;
int32 delta;
} _PACKED elf32_region;
typedef struct elf64_region {
area_id id;
uint64 start;
uint64 size;
int64 delta;
} _PACKED elf64_region;
struct preloaded_image {
FixedWidthPointer<struct preloaded_image> next;
char *name;
elf_region text_region;
elf_region data_region;
FixedWidthPointer<char> name;
uint8 elf_class;
addr_range dynamic_section;
struct Elf32_Ehdr elf_header;
struct Elf32_Sym *syms;
struct Elf32_Rel *rel;
int rel_len;
struct Elf32_Rela *rela;
int rela_len;
struct Elf32_Rel *pltrel;
int pltrel_len;
int pltrel_type;
struct Elf32_Sym *debug_symbols;
const char *debug_string_table;
uint32 num_debug_symbols, debug_string_table_size;
FixedWidthPointer<const char> debug_string_table;
uint32 num_debug_symbols;
uint32 debug_string_table_size;
ino_t inode;
image_id id;
@@ -40,11 +42,45 @@ struct preloaded_image {
// set by the module initialization code
} _PACKED;
struct preloaded_elf32_image : public preloaded_image {
Elf32_Ehdr elf_header;
elf32_region text_region;
elf32_region data_region;
FixedWidthPointer<Elf32_Sym> syms;
FixedWidthPointer<Elf32_Rel> rel;
int32 rel_len;
FixedWidthPointer<Elf32_Rela> rela;
int32 rela_len;
FixedWidthPointer<Elf32_Rel> pltrel;
int32 pltrel_len;
int32 pltrel_type;
FixedWidthPointer<Elf32_Sym> debug_symbols;
} _PACKED;
struct preloaded_elf64_image : public preloaded_image {
Elf64_Ehdr elf_header;
elf64_region text_region;
elf64_region data_region;
FixedWidthPointer<Elf64_Sym> syms;
FixedWidthPointer<Elf64_Rel> rel;
int64 rel_len;
FixedWidthPointer<Elf64_Rela> rela;
int64 rela_len;
FixedWidthPointer<Elf64_Rel> pltrel;
int64 pltrel_len;
int64 pltrel_type;
FixedWidthPointer<Elf64_Sym> debug_symbols;
} _PACKED;
#ifdef __cplusplus
extern "C" {
#endif
extern status_t boot_elf_resolve_symbol(struct preloaded_image *image,
extern status_t boot_elf_resolve_symbol(struct preloaded_elf32_image *image,
struct Elf32_Sym *symbol, addr_t *symbolAddress);
#ifdef __cplusplus
+1 -1
View File
@@ -44,7 +44,7 @@ typedef struct kernel_args {
uint32 kernel_args_size;
uint32 version;
struct preloaded_image kernel_image;
FixedWidthPointer<struct preloaded_image> kernel_image;
FixedWidthPointer<struct preloaded_image> preloaded_images;
uint32 num_physical_memory_ranges;