diff --git a/.gitignore b/.gitignore index 4ea88da..d194e52 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ .vscode build build-* + +# TODO: Don't forget to remove this ;) +xtldr/modules/multiboot2 \ No newline at end of file diff --git a/sdk/xtdk/xtimage.h b/sdk/xtdk/xtimage.h index 312b0e9..146930c 100644 --- a/sdk/xtdk/xtimage.h +++ b/sdk/xtdk/xtimage.h @@ -607,7 +607,7 @@ typedef struct _PECOFF_IMAGE_RESOURCE_DATA_ENTRY } PECOFF_IMAGE_RESOURCE_DATA_ENTRY, *PPECOFF_IMAGE_RESOURCE_DATA_ENTRY; /* ELF identities */ -typedef enum _ELF_IDENT +typedef enum _ELF_IMAGE_IDENTITY { EI_MAG0 = 0, EI_MAG1 = 1, @@ -618,10 +618,10 @@ typedef enum _ELF_IDENT EI_VERSION = 6, EI_OSABI = 7, EI_ABIVERSION = 8 -} ELF_IDENT; +} ELF_IMAGE_IDENTITY, *PELF_IMAGE_IDENTITY; /* ELF Program header types */ -typedef enum _ELF_PT +typedef enum _ELF_IMAGE_PROGRAM_HEADER_TYPE { PT_NULL = 0, PT_LOAD = 1, @@ -631,15 +631,15 @@ typedef enum _ELF_PT PT_SHLIB = 5, PT_PHDR = 6, PT_TLS = 7 -} ELF_PT; +} ELF_IMAGE_PROGRAM_HEADER_TYPE, *PELF_IMAGE_PROGRAM_HEADER_TYPE; /* ELF image representation structure */ typedef struct _ELF_IMAGE_CONTEXT { union { - PELF32_HEADER Header32; - PELF64_HEADER Header64; + PELF_IMAGE_HEADER32 Header32; + PELF_IMAGE_HEADER64 Header64; }; PVOID Data; PVOID EntryPoint; @@ -652,7 +652,7 @@ typedef struct _ELF_IMAGE_CONTEXT } ELF_IMAGE_CONTEXT, *PELF_IMAGE_CONTEXT; /* 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. */ UCHAR e_ident[16]; @@ -669,10 +669,10 @@ typedef struct _ELF32_HEADER UINT16 e_shentsize; UINT16 e_shnum; UINT16 e_shstrndx; -} ELF32_HEADER, *PELF32_HEADER; +} ELF_IMAGE_HEADER32, *PELF_IMAGE_HEADER32; /* 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. */ UCHAR e_ident[16]; @@ -689,10 +689,10 @@ typedef struct _ELF64_HEADER UINT16 e_shentsize; UINT16 e_shnum; UINT16 e_shstrndx; -} ELF64_HEADER, *PELF64_HEADER; +} ELF_IMAGE_HEADER64, *PELF_IMAGE_HEADER64; /* 32-bit ELF program header structure */ -typedef struct _ELF32_PROGRAM_HEADER +typedef struct _ELF_IMAGE_PROGRAM_HEADER32 { UINT32 p_type; UINT32 p_offset; @@ -702,10 +702,10 @@ typedef struct _ELF32_PROGRAM_HEADER UINT32 p_memsz; UINT32 p_flags; UINT32 p_align; -} ELF32_PROGRAM_HEADER, *PELF32_PROGRAM_HEADER; +} ELF_IMAGE_PROGRAM_HEADER32, *PELF_IMAGE_PROGRAM_HEADER32; /* 64-bit ELF program header structure */ -typedef struct _ELF64_PROGRAM_HEADER +typedef struct _ELF_IMAGE_PROGRAM_HEADER64 { UINT32 p_type; UINT32 p_flags; @@ -715,6 +715,6 @@ typedef struct _ELF64_PROGRAM_HEADER ULONG p_filesz; ULONG p_memsz; ULONG p_align; -} ELF64_PROGRAM_HEADER, *PELF64_PROGRAM_HEADER; +} ELF_IMAGE_PROGRAM_HEADER64, *PELF_IMAGE_PROGRAM_HEADER64; #endif /* __XTDK_XTIMAGE_H */ diff --git a/sdk/xtdk/xtstruct.h b/sdk/xtdk/xtstruct.h index a834378..66cfc27 100644 --- a/sdk/xtdk/xtstruct.h +++ b/sdk/xtdk/xtstruct.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_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 _ELF_IDENT ELF_IDENT, *PELF_IDENT; -typedef enum _ELF_PT ELF_PT, *PELF_PT; +typedef enum _ELF_IMAGE_IDENTITY ELF_IMAGE_IDENTITY, *PELF_IMAGE_IDENTITY; +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 _KDPC_IMPORTANCE KDPC_IMPORTANCE, *PKDPC_IMPORTANCE; 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_VLAN_DEVICE_PATH EFI_VLAN_DEVICE_PATH, *PEFI_VLAN_DEVICE_PATH; typedef struct _ELF_IMAGE_CONTEXT ELF_IMAGE_CONTEXT, *PELF_IMAGE_CONTEXT; -typedef struct _ELF32_HEADER ELF32_HEADER, *PELF32_HEADER; -typedef struct _ELF64_HEADER ELF64_HEADER, *PELF64_HEADER; -typedef struct _ELF32_PROGRAM_HEADER ELF32_PROGRAM_HEADER, *PELF32_PROGRAM_HEADER; -typedef struct _ELF64_PROGRAM_HEADER ELF64_PROGRAM_HEADER, *PELF64_PROGRAM_HEADER; +typedef struct _ELF_IMAGE_HEADER32 ELF_IMAGE_HEADER32, *PELF_IMAGE_HEADER32; +typedef struct _ELF_IMAGE_HEADER64 ELF_IMAGE_HEADER64, *PELF_IMAGE_HEADER64; +typedef struct _ELF_IMAGE_PROGRAM_HEADER32 ELF_IMAGE_PROGRAM_HEADER32, *PELF_IMAGE_PROGRAM_HEADER32; +typedef struct _ELF_IMAGE_PROGRAM_HEADER64 ELF_IMAGE_PROGRAM_HEADER64, *PELF_IMAGE_PROGRAM_HEADER64; typedef struct _EPROCESS EPROCESS, *PEPROCESS; typedef struct _ETHREAD ETHREAD, *PETHREAD; typedef struct _EX_RUNDOWN_REFERENCE EX_RUNDOWN_REFERENCE, *PEX_RUNDOWN_REFERENCE; diff --git a/xtldr/modules/CMakeLists.txt b/xtldr/modules/CMakeLists.txt index e329643..900fff2 100644 --- a/xtldr/modules/CMakeLists.txt +++ b/xtldr/modules/CMakeLists.txt @@ -1,6 +1,7 @@ add_subdirectory(beep) add_subdirectory(dummy) add_subdirectory(elf) +add_subdirectory(multiboot2) add_subdirectory(fb_o) add_subdirectory(pecoff_o) add_subdirectory(xtos_o) diff --git a/xtldr/modules/elf/elf.c b/xtldr/modules/elf/elf.c index dc63e3c..0af7365 100644 --- a/xtldr/modules/elf/elf.c +++ b/xtldr/modules/elf/elf.c @@ -8,7 +8,7 @@ #include -/* ELF_O module information */ +/* ELF module information */ XTBL_MODINFO = L"ELF executable file format support"; /* EFI XT Loader Protocol */ @@ -153,7 +153,7 @@ ElfLoadImage(IN PEFI_FILE_HANDLE FileHandle, } /* 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) { /* Memory allocation failure */ @@ -194,8 +194,19 @@ ElfLoadImage(IN PEFI_FILE_HANDLE FileHandle, } /* Extract header */ - ImageData->Header32 = (PELF32_HEADER)Data; - ImageData->Header64 = (PELF64_HEADER)Data; + ImageData->Header32 = (PELF_IMAGE_HEADER32)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 */ 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) { /* 32-bit executable */ + XtLdrProtocol->Debug.Print(L"Kernel is a 32-bit executable\n"); /* Set entry point */ ImageData->EntryPoint = (PVOID)(UINT_PTR)ImageData->Header32->e_entry; /* 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++) { /* 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) { /* 64-bit executable */ + XtLdrProtocol->Debug.Print(L"Kernel is a 64-bit executable\n"); /* Set entry point */ 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 */ - 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++) { /* PT_DYNAMIC will be used for relocations */ 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 */ 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 */ 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) { /* Failed to read data */ diff --git a/xtldr/modules/elf/includes/elf.h b/xtldr/modules/elf/includes/elf.h index 56d6ee4..fcbe3a9 100644 --- a/xtldr/modules/elf/includes/elf.h +++ b/xtldr/modules/elf/includes/elf.h @@ -6,8 +6,8 @@ * DEVELOPERS: Jozef Nagy */ -#ifndef __XTLDR_MODULES_ELF_O_H -#define __XTLDR_MODULES_ELF_O_H +#ifndef __XTLDR_MODULES_ELF_H +#define __XTLDR_MODULES_ELF_H #include @@ -44,4 +44,4 @@ EFI_STATUS BlXtLdrModuleMain(IN EFI_HANDLE ImageHandle, IN PEFI_SYSTEM_TABLE SystemTable); -#endif /* __XTLDR_MODULES_ELF_O_H */ +#endif /* __XTLDR_MODULES_ELF_H */