Cleanup of ELF structures and typo fixes
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -2,3 +2,6 @@
|
|||||||
.vscode
|
.vscode
|
||||||
build
|
build
|
||||||
build-*
|
build-*
|
||||||
|
|
||||||
|
# TODO: Don't forget to remove this ;)
|
||||||
|
xtldr/modules/multiboot2
|
@@ -607,7 +607,7 @@ typedef struct _PECOFF_IMAGE_RESOURCE_DATA_ENTRY
|
|||||||
} PECOFF_IMAGE_RESOURCE_DATA_ENTRY, *PPECOFF_IMAGE_RESOURCE_DATA_ENTRY;
|
} PECOFF_IMAGE_RESOURCE_DATA_ENTRY, *PPECOFF_IMAGE_RESOURCE_DATA_ENTRY;
|
||||||
|
|
||||||
/* ELF identities */
|
/* ELF identities */
|
||||||
typedef enum _ELF_IDENT
|
typedef enum _ELF_IMAGE_IDENTITY
|
||||||
{
|
{
|
||||||
EI_MAG0 = 0,
|
EI_MAG0 = 0,
|
||||||
EI_MAG1 = 1,
|
EI_MAG1 = 1,
|
||||||
@@ -618,10 +618,10 @@ typedef enum _ELF_IDENT
|
|||||||
EI_VERSION = 6,
|
EI_VERSION = 6,
|
||||||
EI_OSABI = 7,
|
EI_OSABI = 7,
|
||||||
EI_ABIVERSION = 8
|
EI_ABIVERSION = 8
|
||||||
} ELF_IDENT;
|
} ELF_IMAGE_IDENTITY, *PELF_IMAGE_IDENTITY;
|
||||||
|
|
||||||
/* ELF Program header types */
|
/* ELF Program header types */
|
||||||
typedef enum _ELF_PT
|
typedef enum _ELF_IMAGE_PROGRAM_HEADER_TYPE
|
||||||
{
|
{
|
||||||
PT_NULL = 0,
|
PT_NULL = 0,
|
||||||
PT_LOAD = 1,
|
PT_LOAD = 1,
|
||||||
@@ -631,15 +631,15 @@ typedef enum _ELF_PT
|
|||||||
PT_SHLIB = 5,
|
PT_SHLIB = 5,
|
||||||
PT_PHDR = 6,
|
PT_PHDR = 6,
|
||||||
PT_TLS = 7
|
PT_TLS = 7
|
||||||
} ELF_PT;
|
} ELF_IMAGE_PROGRAM_HEADER_TYPE, *PELF_IMAGE_PROGRAM_HEADER_TYPE;
|
||||||
|
|
||||||
/* ELF image representation structure */
|
/* ELF image representation structure */
|
||||||
typedef struct _ELF_IMAGE_CONTEXT
|
typedef struct _ELF_IMAGE_CONTEXT
|
||||||
{
|
{
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
PELF32_HEADER Header32;
|
PELF_IMAGE_HEADER32 Header32;
|
||||||
PELF64_HEADER Header64;
|
PELF_IMAGE_HEADER64 Header64;
|
||||||
};
|
};
|
||||||
PVOID Data;
|
PVOID Data;
|
||||||
PVOID EntryPoint;
|
PVOID EntryPoint;
|
||||||
@@ -652,7 +652,7 @@ typedef struct _ELF_IMAGE_CONTEXT
|
|||||||
} ELF_IMAGE_CONTEXT, *PELF_IMAGE_CONTEXT;
|
} ELF_IMAGE_CONTEXT, *PELF_IMAGE_CONTEXT;
|
||||||
|
|
||||||
/* 32-bit ELF image header structure */
|
/* 32-bit ELF image header structure */
|
||||||
typedef struct _ELF32_HEADER
|
typedef struct _ELF_IMAGE_HEADER32
|
||||||
{
|
{
|
||||||
/* NOTE: EI_NIDENT seems to always be defined as 16. */
|
/* NOTE: EI_NIDENT seems to always be defined as 16. */
|
||||||
UCHAR e_ident[16];
|
UCHAR e_ident[16];
|
||||||
@@ -669,10 +669,10 @@ typedef struct _ELF32_HEADER
|
|||||||
UINT16 e_shentsize;
|
UINT16 e_shentsize;
|
||||||
UINT16 e_shnum;
|
UINT16 e_shnum;
|
||||||
UINT16 e_shstrndx;
|
UINT16 e_shstrndx;
|
||||||
} ELF32_HEADER, *PELF32_HEADER;
|
} ELF_IMAGE_HEADER32, *PELF_IMAGE_HEADER32;
|
||||||
|
|
||||||
/* 64-bit ELF image header structure */
|
/* 64-bit ELF image header structure */
|
||||||
typedef struct _ELF64_HEADER
|
typedef struct _ELF_IMAGE_HEADER64
|
||||||
{
|
{
|
||||||
/* NOTE: EI_NIDENT seems to always be defined as 16. */
|
/* NOTE: EI_NIDENT seems to always be defined as 16. */
|
||||||
UCHAR e_ident[16];
|
UCHAR e_ident[16];
|
||||||
@@ -689,10 +689,10 @@ typedef struct _ELF64_HEADER
|
|||||||
UINT16 e_shentsize;
|
UINT16 e_shentsize;
|
||||||
UINT16 e_shnum;
|
UINT16 e_shnum;
|
||||||
UINT16 e_shstrndx;
|
UINT16 e_shstrndx;
|
||||||
} ELF64_HEADER, *PELF64_HEADER;
|
} ELF_IMAGE_HEADER64, *PELF_IMAGE_HEADER64;
|
||||||
|
|
||||||
/* 32-bit ELF program header structure */
|
/* 32-bit ELF program header structure */
|
||||||
typedef struct _ELF32_PROGRAM_HEADER
|
typedef struct _ELF_IMAGE_PROGRAM_HEADER32
|
||||||
{
|
{
|
||||||
UINT32 p_type;
|
UINT32 p_type;
|
||||||
UINT32 p_offset;
|
UINT32 p_offset;
|
||||||
@@ -702,10 +702,10 @@ typedef struct _ELF32_PROGRAM_HEADER
|
|||||||
UINT32 p_memsz;
|
UINT32 p_memsz;
|
||||||
UINT32 p_flags;
|
UINT32 p_flags;
|
||||||
UINT32 p_align;
|
UINT32 p_align;
|
||||||
} ELF32_PROGRAM_HEADER, *PELF32_PROGRAM_HEADER;
|
} ELF_IMAGE_PROGRAM_HEADER32, *PELF_IMAGE_PROGRAM_HEADER32;
|
||||||
|
|
||||||
/* 64-bit ELF program header structure */
|
/* 64-bit ELF program header structure */
|
||||||
typedef struct _ELF64_PROGRAM_HEADER
|
typedef struct _ELF_IMAGE_PROGRAM_HEADER64
|
||||||
{
|
{
|
||||||
UINT32 p_type;
|
UINT32 p_type;
|
||||||
UINT32 p_flags;
|
UINT32 p_flags;
|
||||||
@@ -715,6 +715,6 @@ typedef struct _ELF64_PROGRAM_HEADER
|
|||||||
ULONG p_filesz;
|
ULONG p_filesz;
|
||||||
ULONG p_memsz;
|
ULONG p_memsz;
|
||||||
ULONG p_align;
|
ULONG p_align;
|
||||||
} ELF64_PROGRAM_HEADER, *PELF64_PROGRAM_HEADER;
|
} ELF_IMAGE_PROGRAM_HEADER64, *PELF_IMAGE_PROGRAM_HEADER64;
|
||||||
|
|
||||||
#endif /* __XTDK_XTIMAGE_H */
|
#endif /* __XTDK_XTIMAGE_H */
|
||||||
|
@@ -39,8 +39,8 @@ typedef enum _EFI_TIMER_DELAY EFI_TIMER_DELAY, *PEFI_TIMER_DELAY;
|
|||||||
typedef enum _EFI_UART_PARITY_TYPE EFI_UART_PARITY_TYPE, *PEFI_UART_PARITY_TYPE;
|
typedef enum _EFI_UART_PARITY_TYPE EFI_UART_PARITY_TYPE, *PEFI_UART_PARITY_TYPE;
|
||||||
typedef enum _EFI_UART_STOP_BITS_TYPE EFI_UART_STOP_BITS_TYPE, *PEFI_UART_STOP_BITS_TYPE;
|
typedef enum _EFI_UART_STOP_BITS_TYPE EFI_UART_STOP_BITS_TYPE, *PEFI_UART_STOP_BITS_TYPE;
|
||||||
typedef enum _EFI_UNIVERSA_GRAPHICS_BLT_OPERATION EFI_UNIVERSA_GRAPHICS_BLT_OPERATION, *PEFI_UNIVERSA_GRAPHICS_BLT_OPERATION;
|
typedef enum _EFI_UNIVERSA_GRAPHICS_BLT_OPERATION EFI_UNIVERSA_GRAPHICS_BLT_OPERATION, *PEFI_UNIVERSA_GRAPHICS_BLT_OPERATION;
|
||||||
typedef enum _ELF_IDENT ELF_IDENT, *PELF_IDENT;
|
typedef enum _ELF_IMAGE_IDENTITY ELF_IMAGE_IDENTITY, *PELF_IMAGE_IDENTITY;
|
||||||
typedef enum _ELF_PT ELF_PT, *PELF_PT;
|
typedef enum _ELF_IMAGE_PROGRAM_HEADER_TYPE ELF_IMAGE_PROGRAM_HEADER_TYPE, *PELF_IMAGE_PROGRAM_HEADER_TYPE;
|
||||||
typedef enum _KAPC_ENVIRONMENT KAPC_ENVIRONMENT, *PKAPC_ENVIRONMENT;
|
typedef enum _KAPC_ENVIRONMENT KAPC_ENVIRONMENT, *PKAPC_ENVIRONMENT;
|
||||||
typedef enum _KDPC_IMPORTANCE KDPC_IMPORTANCE, *PKDPC_IMPORTANCE;
|
typedef enum _KDPC_IMPORTANCE KDPC_IMPORTANCE, *PKDPC_IMPORTANCE;
|
||||||
typedef enum _KEVENT_TYPE KEVENT_TYPE, *PKEVENT_TYPE;
|
typedef enum _KEVENT_TYPE KEVENT_TYPE, *PKEVENT_TYPE;
|
||||||
@@ -202,10 +202,10 @@ typedef struct _EFI_USB_WWID_DEVICE_PATH EFI_USB_WWID_DEVICE_PATH, *PEFI_USB_WWI
|
|||||||
typedef struct _EFI_VENDOR_DEVICE_PATH EFI_VENDOR_DEVICE_PATH, *PEFI_VENDOR_DEVICE_PATH;
|
typedef struct _EFI_VENDOR_DEVICE_PATH EFI_VENDOR_DEVICE_PATH, *PEFI_VENDOR_DEVICE_PATH;
|
||||||
typedef struct _EFI_VLAN_DEVICE_PATH EFI_VLAN_DEVICE_PATH, *PEFI_VLAN_DEVICE_PATH;
|
typedef struct _EFI_VLAN_DEVICE_PATH EFI_VLAN_DEVICE_PATH, *PEFI_VLAN_DEVICE_PATH;
|
||||||
typedef struct _ELF_IMAGE_CONTEXT ELF_IMAGE_CONTEXT, *PELF_IMAGE_CONTEXT;
|
typedef struct _ELF_IMAGE_CONTEXT ELF_IMAGE_CONTEXT, *PELF_IMAGE_CONTEXT;
|
||||||
typedef struct _ELF32_HEADER ELF32_HEADER, *PELF32_HEADER;
|
typedef struct _ELF_IMAGE_HEADER32 ELF_IMAGE_HEADER32, *PELF_IMAGE_HEADER32;
|
||||||
typedef struct _ELF64_HEADER ELF64_HEADER, *PELF64_HEADER;
|
typedef struct _ELF_IMAGE_HEADER64 ELF_IMAGE_HEADER64, *PELF_IMAGE_HEADER64;
|
||||||
typedef struct _ELF32_PROGRAM_HEADER ELF32_PROGRAM_HEADER, *PELF32_PROGRAM_HEADER;
|
typedef struct _ELF_IMAGE_PROGRAM_HEADER32 ELF_IMAGE_PROGRAM_HEADER32, *PELF_IMAGE_PROGRAM_HEADER32;
|
||||||
typedef struct _ELF64_PROGRAM_HEADER ELF64_PROGRAM_HEADER, *PELF64_PROGRAM_HEADER;
|
typedef struct _ELF_IMAGE_PROGRAM_HEADER64 ELF_IMAGE_PROGRAM_HEADER64, *PELF_IMAGE_PROGRAM_HEADER64;
|
||||||
typedef struct _EPROCESS EPROCESS, *PEPROCESS;
|
typedef struct _EPROCESS EPROCESS, *PEPROCESS;
|
||||||
typedef struct _ETHREAD ETHREAD, *PETHREAD;
|
typedef struct _ETHREAD ETHREAD, *PETHREAD;
|
||||||
typedef struct _EX_RUNDOWN_REFERENCE EX_RUNDOWN_REFERENCE, *PEX_RUNDOWN_REFERENCE;
|
typedef struct _EX_RUNDOWN_REFERENCE EX_RUNDOWN_REFERENCE, *PEX_RUNDOWN_REFERENCE;
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
add_subdirectory(beep)
|
add_subdirectory(beep)
|
||||||
add_subdirectory(dummy)
|
add_subdirectory(dummy)
|
||||||
add_subdirectory(elf)
|
add_subdirectory(elf)
|
||||||
|
add_subdirectory(multiboot2)
|
||||||
add_subdirectory(fb_o)
|
add_subdirectory(fb_o)
|
||||||
add_subdirectory(pecoff_o)
|
add_subdirectory(pecoff_o)
|
||||||
add_subdirectory(xtos_o)
|
add_subdirectory(xtos_o)
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
#include <elf.h>
|
#include <elf.h>
|
||||||
|
|
||||||
/* ELF_O module information */
|
/* ELF module information */
|
||||||
XTBL_MODINFO = L"ELF executable file format support";
|
XTBL_MODINFO = L"ELF executable file format support";
|
||||||
|
|
||||||
/* EFI XT Loader Protocol */
|
/* EFI XT Loader Protocol */
|
||||||
@@ -153,7 +153,7 @@ ElfLoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate memory for storing image data */
|
/* Allocate memory for storing image data */
|
||||||
Status = XtLdrProtocol->Memory.AllocatePool(sizeof(PECOFF_IMAGE_CONTEXT), (PVOID *)&ImageData);
|
Status = XtLdrProtocol->Memory.AllocatePool(sizeof(ELF_IMAGE_CONTEXT), (PVOID *)&ImageData);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Memory allocation failure */
|
/* Memory allocation failure */
|
||||||
@@ -194,8 +194,19 @@ ElfLoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Extract header */
|
/* Extract header */
|
||||||
ImageData->Header32 = (PELF32_HEADER)Data;
|
ImageData->Header32 = (PELF_IMAGE_HEADER32)Data;
|
||||||
ImageData->Header64 = (PELF64_HEADER)Data;
|
ImageData->Header64 = (PELF_IMAGE_HEADER64)Data;
|
||||||
|
|
||||||
|
/* Set physical and virtual addresses */
|
||||||
|
ImageData->PhysicalAddress = (PVOID)(UINT_PTR)Address;
|
||||||
|
if(VirtualAddress)
|
||||||
|
{
|
||||||
|
ImageData->VirtualAddress = VirtualAddress;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ImageData->VirtualAddress = (PVOID)(UINT_PTR)Address;
|
||||||
|
}
|
||||||
|
|
||||||
/* Validate ELF file */
|
/* Validate ELF file */
|
||||||
if(ImageData->Header32->e_ident[EI_MAG0] != 0x7F ||
|
if(ImageData->Header32->e_ident[EI_MAG0] != 0x7F ||
|
||||||
@@ -211,12 +222,13 @@ ElfLoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
|||||||
if(ImageData->Header32->e_ident[EI_CLASS] == 1)
|
if(ImageData->Header32->e_ident[EI_CLASS] == 1)
|
||||||
{
|
{
|
||||||
/* 32-bit executable */
|
/* 32-bit executable */
|
||||||
|
XtLdrProtocol->Debug.Print(L"Kernel is a 32-bit executable\n");
|
||||||
|
|
||||||
/* Set entry point */
|
/* Set entry point */
|
||||||
ImageData->EntryPoint = (PVOID)(UINT_PTR)ImageData->Header32->e_entry;
|
ImageData->EntryPoint = (PVOID)(UINT_PTR)ImageData->Header32->e_entry;
|
||||||
|
|
||||||
/* Load individual segments according to program headers */
|
/* Load individual segments according to program headers */
|
||||||
PELF32_PROGRAM_HEADER ProgramHeaders = (PELF32_PROGRAM_HEADER)(Data + ImageData->Header32->e_phoff);
|
PELF_IMAGE_PROGRAM_HEADER32 ProgramHeaders = (PELF_IMAGE_PROGRAM_HEADER32)(Data + ImageData->Header32->e_phoff);
|
||||||
for (UINT Count = 0; Count < ImageData->Header32->e_phnum; Count++)
|
for (UINT Count = 0; Count < ImageData->Header32->e_phnum; Count++)
|
||||||
{
|
{
|
||||||
/* PT_DYNAMIC will be used for relocations */
|
/* PT_DYNAMIC will be used for relocations */
|
||||||
@@ -256,26 +268,19 @@ ElfLoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
|||||||
else if(ImageData->Header32->e_ident[EI_CLASS] == 2)
|
else if(ImageData->Header32->e_ident[EI_CLASS] == 2)
|
||||||
{
|
{
|
||||||
/* 64-bit executable */
|
/* 64-bit executable */
|
||||||
|
XtLdrProtocol->Debug.Print(L"Kernel is a 64-bit executable\n");
|
||||||
|
|
||||||
/* Set entry point */
|
/* Set entry point */
|
||||||
ImageData->EntryPoint = (PVOID)(UINT_PTR)ImageData->Header64->e_entry;
|
ImageData->EntryPoint = (PVOID)(UINT_PTR)ImageData->Header64->e_entry;
|
||||||
|
XtLdrProtocol->Debug.Print(L"Entry point: 0x%lx (0x%lx)\n", ImageData->EntryPoint, ImageData->Header64->e_entry);
|
||||||
|
|
||||||
/* Load individual segments according to program headers */
|
/* Load individual segments according to program headers */
|
||||||
PELF64_PROGRAM_HEADER ProgramHeaders = (PELF64_PROGRAM_HEADER)(Data + ImageData->Header64->e_phoff);
|
PELF_IMAGE_PROGRAM_HEADER64 ProgramHeaders = (PELF_IMAGE_PROGRAM_HEADER64)(Data + ImageData->Header64->e_phoff);
|
||||||
for (UINT Count = 0; Count < ImageData->Header64->e_phnum; Count++)
|
for (UINT Count = 0; Count < ImageData->Header64->e_phnum; Count++)
|
||||||
{
|
{
|
||||||
/* PT_DYNAMIC will be used for relocations */
|
/* PT_DYNAMIC will be used for relocations */
|
||||||
if(ProgramHeaders[Count].p_type == PT_LOAD)
|
if(ProgramHeaders[Count].p_type == PT_LOAD)
|
||||||
{
|
{
|
||||||
/* Set PhysicalAddress and VirtualAddress to the lowest address present */
|
|
||||||
ImageData->PhysicalAddress = (UINT_PTR)ImageData->PhysicalAddress < ProgramHeaders[Count].p_paddr ?
|
|
||||||
ImageData->PhysicalAddress :
|
|
||||||
(PVOID)(UINT_PTR)(UINT64)ProgramHeaders[Count].p_paddr;
|
|
||||||
|
|
||||||
ImageData->VirtualAddress = (UINT_PTR)ImageData->VirtualAddress < ProgramHeaders[Count].p_vaddr ?
|
|
||||||
ImageData->VirtualAddress :
|
|
||||||
(PVOID)(UINT_PTR)(UINT64)ProgramHeaders[Count].p_vaddr;
|
|
||||||
|
|
||||||
/* Allocate memory for the program headers */
|
/* Allocate memory for the program headers */
|
||||||
UINT32 PageCount = EFI_SIZE_TO_PAGES((UINT32)ProgramHeaders[Count].p_memsz);
|
UINT32 PageCount = EFI_SIZE_TO_PAGES((UINT32)ProgramHeaders[Count].p_memsz);
|
||||||
|
|
||||||
@@ -289,7 +294,7 @@ ElfLoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
|||||||
|
|
||||||
/* Read segment into memory */
|
/* Read segment into memory */
|
||||||
Status = FileHandle->SetPosition(FileHandle, (UINT64)&ProgramHeaders[Count].p_offset);
|
Status = FileHandle->SetPosition(FileHandle, (UINT64)&ProgramHeaders[Count].p_offset);
|
||||||
Status = FileHandle->Read(FileHandle, (PUINT_PTR)&ProgramHeaders[Count].p_filesz, &ProgramHeaders[Count].p_paddr);
|
Status = FileHandle->Read(FileHandle, (PUINT_PTR)&ProgramHeaders[Count].p_filesz, (PVOID)(UINT_PTR)ProgramHeaders[Count].p_paddr);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Failed to read data */
|
/* Failed to read data */
|
||||||
|
@@ -6,8 +6,8 @@
|
|||||||
* DEVELOPERS: Jozef Nagy <schkwve@gmail.com>
|
* DEVELOPERS: Jozef Nagy <schkwve@gmail.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __XTLDR_MODULES_ELF_O_H
|
#ifndef __XTLDR_MODULES_ELF_H
|
||||||
#define __XTLDR_MODULES_ELF_O_H
|
#define __XTLDR_MODULES_ELF_H
|
||||||
|
|
||||||
#include <xtblapi.h>
|
#include <xtblapi.h>
|
||||||
|
|
||||||
@@ -44,4 +44,4 @@ EFI_STATUS
|
|||||||
BlXtLdrModuleMain(IN EFI_HANDLE ImageHandle,
|
BlXtLdrModuleMain(IN EFI_HANDLE ImageHandle,
|
||||||
IN PEFI_SYSTEM_TABLE SystemTable);
|
IN PEFI_SYSTEM_TABLE SystemTable);
|
||||||
|
|
||||||
#endif /* __XTLDR_MODULES_ELF_O_H */
|
#endif /* __XTLDR_MODULES_ELF_H */
|
||||||
|
Reference in New Issue
Block a user