We have liftoff!
This commit is contained in:
parent
5fab4ba6c3
commit
43a0d9017c
3 changed files with 32 additions and 7 deletions
2
Makefile
2
Makefile
|
|
@ -20,4 +20,4 @@ lboot.o: lboot.S
|
|||
$(CC) $(CFLAGS) -c -o $@ $(@:.o=.S)
|
||||
|
||||
loader.o: loader.c bootboot.h fs.h
|
||||
$(CC) $(CFLAGS) -m64 -Os -c -o $@ $(@:.o=.c)
|
||||
$(CC) $(CFLAGS) -m64 -O0 -c -o $@ $(@:.o=.c)
|
||||
|
|
|
|||
13
lboot.S
13
lboot.S
|
|
@ -237,7 +237,7 @@ _pgnext: mov %ecx, %eax
|
|||
ret
|
||||
|
||||
// make_heap: find a memory range suitable for heap usage
|
||||
make_heap: mov $bb_memmap-24, %si
|
||||
make_heap: mov $bb_memmap-24, %esi
|
||||
_mhnext: add $24, %si
|
||||
mov $bootboot, %eax
|
||||
add bb_size, %eax
|
||||
|
|
@ -282,6 +282,7 @@ _mhnext: add $24, %si
|
|||
// If so, switch to it.
|
||||
mov %eax, heap_ptr
|
||||
mov %ecx, heap_end
|
||||
mov %esi, heap_mment
|
||||
jmp _mhnext
|
||||
|
||||
_mhdone: ret
|
||||
|
|
@ -502,6 +503,7 @@ server_ip: .space 4
|
|||
|
||||
heap_ptr: .long 0
|
||||
heap_end: .long 0
|
||||
heap_mment: .long tx_buf
|
||||
|
||||
// Long mode initial page tables
|
||||
pd_ptr: .long 0
|
||||
|
|
@ -524,6 +526,15 @@ trampo64:
|
|||
mov %eax, %gs
|
||||
mov %eax, %ss
|
||||
|
||||
// Remove our heap from the memory map so it doesn't get overwritten
|
||||
mov heap_mment, %esi
|
||||
mov 8(%rsi), %rcx
|
||||
add 0(%rsi), %rcx
|
||||
mov heap_ptr, %eax
|
||||
sub %rax, %rcx
|
||||
mov %rax, 0(%rsi)
|
||||
mov %rcx, 8(%rsi)
|
||||
|
||||
// Mangle e820 memmap into bootboot's format
|
||||
mov $bb_memmap, %rsi
|
||||
mov $bb_memmap, %rdi
|
||||
|
|
|
|||
24
loader.c
24
loader.c
|
|
@ -172,10 +172,9 @@ load_elf(file_t file, uintptr_t *entry)
|
|||
if (file.size < phdr->p_offset + phdr->p_filesz) {
|
||||
return -1;
|
||||
}
|
||||
panic("Loading segment");
|
||||
memcpy((void *)ADDR_LOAD, file.ptr + phdr->p_offset, phdr->p_filesz);
|
||||
memcpy((void *)phdr->p_vaddr, file.ptr + phdr->p_offset, phdr->p_filesz);
|
||||
if (phdr->p_filesz < phdr->p_memsz) {
|
||||
memset((void *)(ADDR_LOAD + phdr->p_filesz), 0, phdr->p_memsz - phdr->p_filesz);
|
||||
memset((void *)(phdr->p_vaddr + phdr->p_filesz), 0, phdr->p_memsz - phdr->p_filesz);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -207,14 +206,29 @@ alloc(BOOTBOOT *bootboot_ptr, size_t size, size_t align)
|
|||
void
|
||||
loader_main(BOOTBOOT *bootboot_ptr)
|
||||
{
|
||||
void *backing = alloc(bootboot_ptr, MEG(2), MEG(2));
|
||||
memset(backing, 0xAE, MEG(2));
|
||||
uint64_t *pd = alloc(bootboot_ptr, PAGES(1), PAGES(1));
|
||||
memset(pd, 0, PAGES(1));
|
||||
uint64_t *pdp = alloc(bootboot_ptr, PAGES(1), PAGES(1));
|
||||
memset(pdp, 0, PAGES(1));
|
||||
|
||||
uint64_t cr3;
|
||||
__asm__ ("mov\t%%cr3, %%rax" : "=a"(cr3));
|
||||
uint64_t *pml4 = (uint64_t *)(cr3 & UINT64_C(-0x1000));
|
||||
|
||||
pml4[0x1FF] = (uint64_t)pdp | 0x3;
|
||||
pdp [0x1FF] = (uint64_t)pd | 0x3;
|
||||
pd [0x1FF] = (uint64_t)backing | 0x3 | 0x180;
|
||||
|
||||
memcpy((void *)ADDR_BOOTBOOT, bootboot_ptr, PAGES(1));
|
||||
|
||||
uint64_t entry = 0;
|
||||
file_t elf = { (void *)bootboot_ptr->initrd_ptr, MEG(2) };
|
||||
if (load_elf(elf, &entry) < 0) {
|
||||
panic("panic: Malformed ELF64 executable");
|
||||
}
|
||||
|
||||
alloc(bootboot_ptr, PAGES(1), PAGES(1));
|
||||
|
||||
uint64_t stack = 0;
|
||||
|
||||
__asm__ __volatile__ (
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue