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)
|
$(CC) $(CFLAGS) -c -o $@ $(@:.o=.S)
|
||||||
|
|
||||||
loader.o: loader.c bootboot.h fs.h
|
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
|
ret
|
||||||
|
|
||||||
// make_heap: find a memory range suitable for heap usage
|
// 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
|
_mhnext: add $24, %si
|
||||||
mov $bootboot, %eax
|
mov $bootboot, %eax
|
||||||
add bb_size, %eax
|
add bb_size, %eax
|
||||||
|
|
@ -282,6 +282,7 @@ _mhnext: add $24, %si
|
||||||
// If so, switch to it.
|
// If so, switch to it.
|
||||||
mov %eax, heap_ptr
|
mov %eax, heap_ptr
|
||||||
mov %ecx, heap_end
|
mov %ecx, heap_end
|
||||||
|
mov %esi, heap_mment
|
||||||
jmp _mhnext
|
jmp _mhnext
|
||||||
|
|
||||||
_mhdone: ret
|
_mhdone: ret
|
||||||
|
|
@ -502,6 +503,7 @@ server_ip: .space 4
|
||||||
|
|
||||||
heap_ptr: .long 0
|
heap_ptr: .long 0
|
||||||
heap_end: .long 0
|
heap_end: .long 0
|
||||||
|
heap_mment: .long tx_buf
|
||||||
|
|
||||||
// Long mode initial page tables
|
// Long mode initial page tables
|
||||||
pd_ptr: .long 0
|
pd_ptr: .long 0
|
||||||
|
|
@ -524,6 +526,15 @@ trampo64:
|
||||||
mov %eax, %gs
|
mov %eax, %gs
|
||||||
mov %eax, %ss
|
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
|
// Mangle e820 memmap into bootboot's format
|
||||||
mov $bb_memmap, %rsi
|
mov $bb_memmap, %rsi
|
||||||
mov $bb_memmap, %rdi
|
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) {
|
if (file.size < phdr->p_offset + phdr->p_filesz) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
panic("Loading segment");
|
memcpy((void *)phdr->p_vaddr, file.ptr + phdr->p_offset, phdr->p_filesz);
|
||||||
memcpy((void *)ADDR_LOAD, file.ptr + phdr->p_offset, phdr->p_filesz);
|
|
||||||
if (phdr->p_filesz < phdr->p_memsz) {
|
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
|
void
|
||||||
loader_main(BOOTBOOT *bootboot_ptr)
|
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;
|
uint64_t entry = 0;
|
||||||
file_t elf = { (void *)bootboot_ptr->initrd_ptr, MEG(2) };
|
file_t elf = { (void *)bootboot_ptr->initrd_ptr, MEG(2) };
|
||||||
if (load_elf(elf, &entry) < 0) {
|
if (load_elf(elf, &entry) < 0) {
|
||||||
panic("panic: Malformed ELF64 executable");
|
panic("panic: Malformed ELF64 executable");
|
||||||
}
|
}
|
||||||
|
|
||||||
alloc(bootboot_ptr, PAGES(1), PAGES(1));
|
|
||||||
|
|
||||||
uint64_t stack = 0;
|
uint64_t stack = 0;
|
||||||
|
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue