Save progess, then delete GDT for rewrite

This commit saves the progress made on the GDT; the files are deleted
quickly thereafter as the code was quite buggy.
This commit is contained in:
Eric-Paul Ickhorn 2024-06-23 23:23:19 +02:00
parent 83eb29d55c
commit 993864e364
Signed by: epickh
GPG Key ID: 1358818BAA38B104
1 changed files with 33 additions and 18 deletions

View File

@ -26,8 +26,8 @@ gdt_set_segment:
.get_work_address: .get_work_address:
mov eax, [ebp - 4] mov eax, [ebp - 4]
mov edx, GDT_ENTRY_SIZE shl eax, 3
mul edx add eax, GDT_MEMORY_AREA
mov [esi], eax mov [esi], eax
.prepare_flags_and_access_byte: .prepare_flags_and_access_byte:
@ -45,22 +45,23 @@ gdt_set_segment:
xor al, al xor al, al
or al, (1 << 7) ; Present-Bit or al, (1 << 7) ; Present-Bit
cmp [ebp - 15], byte 0
cmp [ebp - 16], byte 0
je .after_task_segment_bit_setter je .after_task_segment_bit_setter
or al, (1 << 4) or al, (1 << 4)
.after_task_segment_bit_setter: .after_task_segment_bit_setter:
cmp [ebp - 14], byte 0 cmp [ebp - 15], byte 0
je .after_executable_bit_setter je .after_executable_bit_setter
or al, (1 << 3) or al, (1 << 3)
.after_executable_bit_setter: .after_executable_bit_setter:
cmp [ebp - 13], byte 0 cmp [ebp - 14], byte 0
je .after_direction_bit_setter je .after_direction_bit_setter
or al, (1 << 2) or al, (1 << 2)
.after_direction_bit_setter: .after_direction_bit_setter:
cmp [ebp - 12], byte 0 cmp [ebp - 13], byte 0
je .after_read_write_bit_setter je .after_read_write_bit_setter
or al, (1 << 1) or al, (1 << 1)
.after_read_write_bit_setter: .after_read_write_bit_setter:
@ -105,6 +106,8 @@ gdt_set_segment:
pop dword esi pop dword esi
ret ret
db "load_flat_gdt" db "load_flat_gdt"
; [Furthest from EBP] ; [Furthest from EBP]
; 0. 4B Return address ; 0. 4B Return address
@ -120,15 +123,17 @@ load_flat_gdt:
mov [esi + (64 - 16)], edx mov [esi + (64 - 16)], edx
mov [esi + (64 - 20)], edi mov [esi + (64 - 20)], edi
mov eax, [ebp - 4] mov eax, [ebp - 4]
mov [esi + 20], eax mov [esi + 20], eax
.create_gdt: .create_gdt:
push ebp push ebp
mov ebp, esp mov ebp, esp
push dword (GDT_MEMORY_AREA) push dword (GDT_MEMORY_AREA - 16)
push dword (GDT_ENTRIES_CAPACITY * GDT_ENTRY_SIZE) push dword gdt_identifier_text
push dword 0 push dword 8
call mem_set call mem_copy
mov esp, ebp mov esp, ebp
pop ebp pop ebp
@ -136,7 +141,7 @@ load_flat_gdt:
push ebp push ebp
mov ebp, esp mov ebp, esp
push dword 1 push dword 1
push dword 0x0a00 push dword 0
push dword 0xfffff push dword 0xfffff
push byte 1 push byte 1
push byte 0 push byte 0
@ -150,8 +155,8 @@ load_flat_gdt:
push ebp push ebp
mov ebp, esp mov ebp, esp
push dword 2 push dword 2
push dword 0 push dword LOWER_STACK_POINTER
push dword 0xfffff push dword 0fxffff
push byte 1 push byte 1
push byte 1 push byte 1
push byte 0 push byte 0
@ -186,23 +191,33 @@ load_flat_gdt:
mov ax, (2 << 3) mov ax, (2 << 3)
mov ss, ax mov ss, ax
jmp dword (1 << 3):.epilog ; mov eax, cr0
.epilog: ; or eax, 1
; mov cr0, eax
cli
jmp dword 1:.after_far_jump
.after_far_jump:
mov eax, cr0 mov eax, cr0
or eax, 1 or eax, 1
mov cr0, eax mov cr0, eax
mov esi, [esi + 20]
jmp esi
mov ebx, [esi + (64 - 8)] mov ebx, [esi + (64 - 8)]
mov ecx, [esi + (64 - 12)] mov ecx, [esi + (64 - 12)]
mov edx, [esi + (64 - 16)] mov edx, [esi + (64 - 16)]
mov edi, [esi + (64 - 20)] mov edi, [esi + (64 - 20)]
mov esi, [esi + 20]
jmp esi
align 16 align 16
.gdtr: .gdtr:
.gdtr.length: .gdtr.length:
dw 31 dw 31
.gdtr.address: .gdtr.address:
dd GDT_MEMORY_AREA dd GDT_MEMORY_AREA
gdt_identifier_text:
db "GDT !!!!"