Read all ELF program headers
This commit is contained in:
parent
a0883e95d0
commit
3abf49f881
2 changed files with 47 additions and 34 deletions
|
@ -228,37 +228,42 @@ mov esp, 0x090000
|
||||||
|
|
||||||
; parse elf file at ELF_START to KERNEL_START
|
; parse elf file at ELF_START to KERNEL_START
|
||||||
|
|
||||||
; verify ELF header
|
; verify ELF header (scrapped for memory)
|
||||||
mov esi, ELF_START
|
mov esi, ELF_START
|
||||||
cmp dword [esi], 464C457Fh ; ELF magic
|
; cmp dword [esi], 464C457Fh ; ELF magic
|
||||||
jne .invalid_elf
|
; jne .invalid_elf
|
||||||
cmp word [esi+4], 0101h ; lsb 32 bit, little endian
|
; cmp word [esi+4], 0101h ; lsb 32 bit, little endian
|
||||||
jne .invalid_elf
|
; jne .invalid_elf
|
||||||
cmp word [esi+18], 03 ; x86 architecture
|
; cmp word [esi+18], 03 ; x86 architecture
|
||||||
jne .invalid_elf
|
; jne .invalid_elf
|
||||||
|
|
||||||
; read the entrypoint and store it
|
; read the entrypoint and store it
|
||||||
mov eax, dword [esi+0x18] ; program entry position
|
mov eax, dword [esi+0x18] ; program entry position
|
||||||
mov dword [.entrypoint], eax
|
mov dword [.entrypoint], eax
|
||||||
|
|
||||||
mov cx, word [esi+0x2C] ; read phnum (number of program headers)
|
mov ax, word [esi+0x2C] ; read phnum (number of program headers)
|
||||||
mov eax, dword [esi+0x1C] ; read phoff (offset of program header)
|
|
||||||
|
|
||||||
; ebx is now ELF_START, esi jumps to the start of the program header
|
; move esi to the start of the program header
|
||||||
mov ebx, esi
|
add esi, dword [esi+0x1C]
|
||||||
add esi, eax
|
|
||||||
|
|
||||||
; set up for loop
|
; set up for loop
|
||||||
sub esi, 0x20
|
sub esi, 0x20
|
||||||
inc cx
|
inc ax
|
||||||
|
mov dword [.edi_backup], esi
|
||||||
|
|
||||||
.elf_ph_loop:
|
.elf_ph_loop:
|
||||||
|
mov ebx, ELF_START
|
||||||
|
mov esi, dword [.edi_backup]
|
||||||
add esi, 0x20
|
add esi, 0x20
|
||||||
dec cx
|
mov dword [.edi_backup], esi
|
||||||
jz .invalid_elf ; there is no valid code block
|
dec ax
|
||||||
|
jz .start_kernel ; there is no valid code block
|
||||||
cmp word [esi], 1 ; check if p_type is loadable
|
cmp word [esi], 1 ; check if p_type is loadable
|
||||||
jne .elf_ph_loop
|
jne .elf_ph_loop
|
||||||
|
|
||||||
|
; set destination
|
||||||
|
mov edi, dword [esi+0x08]
|
||||||
|
|
||||||
; add offset to ebx (ebx = pointer to code)
|
; add offset to ebx (ebx = pointer to code)
|
||||||
add ebx, dword [esi+0x04]
|
add ebx, dword [esi+0x04]
|
||||||
|
|
||||||
|
@ -276,15 +281,20 @@ jz .invalid_elf
|
||||||
; set source
|
; set source
|
||||||
mov esi, ebx
|
mov esi, ebx
|
||||||
|
|
||||||
; set destination
|
|
||||||
mov edi, KERNEL_START
|
|
||||||
|
|
||||||
; repeat ecx/4 times (because it moves 4 bytes at a time)
|
; repeat ecx/4 times (because it moves 4 bytes at a time)
|
||||||
shr ecx, 2
|
shr ecx, 2
|
||||||
|
|
||||||
; copy
|
; copy
|
||||||
repnz movsd
|
repnz movsd
|
||||||
|
|
||||||
|
or ax, ax
|
||||||
|
jnz .elf_ph_loop
|
||||||
|
|
||||||
|
.start_kernel
|
||||||
|
|
||||||
|
cmp edi, KERNEL_START
|
||||||
|
je .invalid_elf
|
||||||
|
|
||||||
; jump to start of kernel
|
; jump to start of kernel
|
||||||
jmp [.entrypoint]
|
jmp [.entrypoint]
|
||||||
|
|
||||||
|
@ -334,6 +344,7 @@ dw .gdt_end - .gdt - 1
|
||||||
dd .gdt
|
dd .gdt
|
||||||
|
|
||||||
.entrypoint: dd 0
|
.entrypoint: dd 0
|
||||||
|
.edi_backup: dd 0
|
||||||
|
|
||||||
; magic string
|
; magic string
|
||||||
dw 0xAA55
|
dw 0xAA55
|
||||||
|
|
|
@ -92,23 +92,25 @@ int ree(char* unused) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int run_command(char* buffer) {
|
// TODO This is ugly, fix this
|
||||||
// TODO If I make these 2 global, it breaks...
|
const char* shell_commands_strings[] = {
|
||||||
// TODO This is ugly, fix this
|
"echo",
|
||||||
const char* shell_commands_strings[] = {
|
"hello",
|
||||||
"echo",
|
"cls",
|
||||||
"hello",
|
"ree",
|
||||||
"cls",
|
"getgdt",
|
||||||
"ree",
|
NULL
|
||||||
NULL
|
};
|
||||||
};
|
|
||||||
|
|
||||||
int (*shell_commands_functions[]) (char*) = {
|
int (*shell_commands_functions[]) (char*) = {
|
||||||
echo,
|
echo,
|
||||||
hello,
|
hello,
|
||||||
cls,
|
cls,
|
||||||
ree
|
ree,
|
||||||
};
|
get_gdt
|
||||||
|
};
|
||||||
|
|
||||||
|
int run_command(char* buffer) {
|
||||||
|
|
||||||
if(buffer[0] == 0) {
|
if(buffer[0] == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue