From 4aac0746e433027420520e8bcddd84c0837c7b06 Mon Sep 17 00:00:00 2001 From: bzt Date: Mon, 15 Jun 2020 17:11:59 +0200 Subject: [PATCH] Parse symbols to get virtual addresses --- OLVASSEL.md | 16 ++++---- README.md | 2 +- bootboot.efi | Bin 94272 -> 78477 bytes bootboot.rom | Bin 94720 -> 78848 bytes x86_64-efi/bootboot.c | 90 +++++++++++++++++++++++++++++++++++++----- 5 files changed, 90 insertions(+), 18 deletions(-) diff --git a/OLVASSEL.md b/OLVASSEL.md index 6736c18..ffd9939 100644 --- a/OLVASSEL.md +++ b/OLVASSEL.md @@ -16,7 +16,7 @@ Előre lefordított binárisok mellékelve, egyből használhatók. 4. *mykernel* egy példa BOOTBOOT [kompatíbilis kernel](https://gitlab.com/bztsrc/bootboot/tree/master/mykernel) C-ben írva, ami vonalakat húz meg színes dobozokat rajzol -Vedd figyelembe, hogy a referencia implementációk nem támogatják a teljes 2-es protokollt, +Vedd figyelembe, hogy a referencia implementációk nem támogatják a teljes 2-es protokollt (kivéve az UEFI változatot), csak statikus memórialeképezéseket kezelnek, ami az 1-es protokoll szintnek felel meg. Gyors kipróbáláshoz találsz bootolható képfájlokat az [images](https://gitlab.com/bztsrc/bootboot/tree/master/images) mappában. @@ -24,11 +24,11 @@ Gyors kipróbáláshoz találsz bootolható képfájlokat az [images](https://gi BOOTBOOT Protokoll ================== -Célközönség ------------ +Lényege +------- -A protokoll definiálja, hogyan kell betölteni ELF64 vagy PE32+ futtathatókat egy induló ramlemezről tisztán -64 bites módban, mindenféle konfiguráció vagy akár a ramlemezkép formátumának ismerete nélkül. +A protokoll definiálja, hogyan kell betölteni ELF64 vagy PE32+ futtathatókat egy induló memórialemezről tisztán +64 bites módban, mindenféle konfiguráció vagy akár a memórialemezkép formátumának ismerete nélkül. A [BIOS](https://gitlab.com/bztsrc/bootboot/tree/master/x86_64-bios)-t támogató gépeken ugyanaz a betöltő működik Multiboottal, láncbetöltéssel MBR, VBR (GPT hibrid indítás) és CDROM indító szektorból, vagy BIOS bővítő ROM-ból @@ -40,13 +40,13 @@ A [Raspberry Pi 3+](https://gitlab.com/bztsrc/bootboot/tree/master/aarch64-rpi) tölti be kernel8.img néven az SD kártya első partíciójáról. A különbség más betöltő protokollokhoz képest a rugalmasság és a hordozhatóság; a tisztán 64 bit támogatás; és hogy -a BOOTBOOT a kernel-t a ramlemezképből tölti be. Ez ideális hobbi OS-ek és mikrokernelek számára. Ez biztosítja, hogy -a kerneled felbontható több fájlra, mégis megadja azt az előnyt, hogy egyszerre tölti be mind, mintha egy monolitikus +a BOOTBOOT a kernel-t a memórialemezképből tölti be. Ez ideális hobbi OS-ek és mikrokernelek számára. Ez biztosítja, hogy +a kerneled felbontható több fájlra, mégis megadja azt az előnyt, hogy egyszerre tölti be mindet, mintha egy monolitikus kernel lenne. Ráadásul mindehhez a saját fájl rendszeredet is használhatod. Megjegyzés: a BOOTBOOT nem egy boot menedzser, hanem egy boot protokoll. Ha interaktív indítómenüt szeretnél, akkor azt a BOOTBOOT kompatíbilis betöltő *elé* kell integrálnod. Például a GRUB lánctöltheti a boot.bin-t (vagy Multiboot -"kernel"-ként a bootboot.bin-t és modulként a ramlemezt) vagy a bootboot.efi hozzáadható az UEFI Boot menedzser menüjéhez. +"kernel"-ként a bootboot.bin-t és modulként a memórialemezt) vagy a bootboot.efi hozzáadható az UEFI Boot menedzser menüjéhez. Licensz ------- diff --git a/README.md b/README.md index 8c40d08..ff5e249 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ I provide pre-compiled images ready for use. 4. *mykernel* an example BOOTBOOT [compatible kernel](https://gitlab.com/bztsrc/bootboot/tree/master/mykernel) in C which draws lines and boxes -Please note that the reference implementations do not support the full protocol at level 2, +Please note that the reference implementations do not support the full protocol at level 2 (except the UEFI version), they only handle static mappings which makes them level 1 loaders. For quick test, you can find example bootable disk [images](https://gitlab.com/bztsrc/bootboot/tree/master/images) too. diff --git a/bootboot.efi b/bootboot.efi index c53ada8e4073fb671e0aeea1e34bc7a69c7239c1..3dfe376fc97e3305b79346524e17e5786426534f 100755 GIT binary patch delta 23596 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 diff --git a/bootboot.rom b/bootboot.rom index db5ca6d5caa8eb6eefaa66e1155f9324ffae8333..1878c2fc7c02a20fc824477fb9b0049147dee79d 100644 GIT binary patch delta 23277 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 W6`8ILJKBAv>D%z59ZOA5Y5xNpj7iY| delta 38715 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 for(i=0;ie_phnum;i++){ - if(phdr->p_type==PT_LOAD && phdr->p_vaddr>>48==0xffff) { + if(phdr->p_type==PT_LOAD && (phdr->p_vaddr >> 30) == 0x3FFFFFFFF) { // hack to keep symtab and strtab for shared libraries core.size = phdr->p_filesz + (ehdr->e_type==3?0x4000:0); ptr = (UINT8*)ehdr + phdr->p_offset; @@ -1162,18 +1201,48 @@ LoadCore() } phdr=(Elf64_Phdr *)((UINT8 *)phdr+ehdr->e_phentsize); } + if(ehdr->e_shoff > 0) { + Elf64_Shdr *shdr=(Elf64_Shdr *)((UINT8 *)ehdr + ehdr->e_shoff); + Elf64_Sym *sym = NULL, *s; + char *strtable = NULL; + UINT32 strsz = 0, syment = 0; + for(i = 0; i < ehdr->e_shnum; i++){ + if(shdr->sh_type == SHT_SYMTAB) { sym=(Elf64_Sym *)((UINT8*)ehdr+shdr->sh_offset); syment=shdr->sh_entsize; } + if(shdr->sh_type == SHT_STRTAB) { strtable = (char *)ehdr + shdr->sh_offset; strsz = shdr->sh_size; } + shdr = (Elf64_Shdr *)((UINT8 *)shdr + ehdr->e_shentsize); + } + if(strtable && strsz > 0 && sym && syment > 0) + for(s = sym, i = 0; i<(strtable-(char*)sym)/syment && s->st_name < strsz; i++, s++) { + if(!CompareMem(strtable + s->st_name, "bootboot", 9)) bb_addr = s->st_value; + if(!CompareMem(strtable + s->st_name, "environment", 12)) env_addr = s->st_value; + if(!CompareMem(strtable + s->st_name, "fb", 3)) fb_addr = s->st_value; + } + } } else if(((mz_hdr*)(core.ptr))->magic==MZ_MAGIC && ((mz_hdr*)(core.ptr))->peaddr<65536 && pehdr->magic == PE_MAGIC && pehdr->machine == IMAGE_FILE_MACHINE_AMD64 && pehdr->file_type == PE_OPT_MAGIC_PE32PLUS && - (INT64)pehdr->code_base>>48==0xffff) { - //Parse PE32+ + (pehdr->code_base & 0xC0000000)) { + // Parse PE32+ DBG(L" * Parsing PE32+ @%lx\n",core.ptr); core.size = (pehdr->entry_point-pehdr->code_base) + pehdr->text_size + pehdr->data_size; ptr = core.ptr; bss = pehdr->bss_size; entrypoint = (INT64)pehdr->entry_point; + if(pehdr->sym_table > 0 && pehdr->numsym > 0) { + pe_sym *s; + char *strtable = (char *)pehdr + pehdr->sym_table + pehdr->numsym * 18 + 4, *name; + for(i = 0; i < pehdr->numsym; i++) { + s = (pe_sym*)((UINT8 *)pehdr + pehdr->sym_table + i * 18); + name = !s->iszero ? (char*)&s->iszero : strtable + s->nameoffs; + if(!CompareMem(name, "bootboot", 9)) bb_addr = (INT64)s->value; + if(!CompareMem(name, "environment", 12)) env_addr = (INT64)s->value; + if(!CompareMem(name, "fb", 3)) fb_addr = (INT64)s->value; + i += s->auxsyms; + } + } } - if(ptr==NULL || core.size<2 || entrypoint==0) - return report(EFI_LOAD_ERROR,L"Kernel is not a valid executable"); + if(ptr==NULL || core.size<2 || entrypoint==0 || (bb_addr>>30)!=0x3FFFFFFFF || (env_addr>>30)!=0x3FFFFFFFF || + (fb_addr>>30)!=0x3FFFFFFFF || (fb_addr & ~(1024*1024*2-1))) + return report(EFI_LOAD_ERROR,L"Kernel is not a valid executable"); // create core segment uefi_call_wrapper(BS->AllocatePages, 4, 0, 2, (core.size + bss + PAGESIZE-1)/PAGESIZE, (EFI_PHYSICAL_ADDRESS*)&core.ptr); @@ -1183,6 +1252,9 @@ LoadCore() if(bss>0) ZeroMem((void*)core.ptr + core.size, bss); core.size += bss; + DBG(L" * fb @%lx\n", fb_addr); + DBG(L" * bootboot @%lx\n", bb_addr); + DBG(L" * environment @%lx\n", env_addr); DBG(L" * Entry point @%lx, text @%lx %d bytes\n",entrypoint, core.ptr, core.size); core.size = ((core.size+PAGESIZE-1)/PAGESIZE)*PAGESIZE; return EFI_SUCCESS; @@ -1541,7 +1613,7 @@ gzerr: return report(EFI_COMPROMISED_DATA,L"Unable to uncompress"); return report(status, L"GOP failed, no framebuffer"); // collect information on system - bootboot->protocol=PROTOCOL_STATIC | LOADER_UEFI; + bootboot->protocol=PROTOCOL_DYNAMIC | LOADER_UEFI; bootboot->size=128; bootboot->numcores=1; CopyMem((void *)&(bootboot->initrd_ptr),&initrd.ptr,8);