refactor + wip bios call from protected mode
This commit is contained in:
1 parent
121e13165b
commit
766a9c981c
8 files changed
+389
-136
No files matched your search
+13
-90
@@ -1,4 +1,5 @@
|
||||
%include "defines.s"
|
||||
%include "ps2.s"
|
||||
|
||||
[bits 16]
|
||||
|
||||
@@ -7,6 +8,12 @@ extern boot1_bin_sectors
|
||||
extern boot1_magic
|
||||
extern _start
|
||||
|
||||
extern gdt_flat_slice
|
||||
extern gdt_flat
|
||||
extern GDT_FLAT_IDX_CODE_32
|
||||
extern GDT_FLAT_IDX_CODE_16
|
||||
extern GDT_FLAT_IDX_DATA
|
||||
|
||||
section .prelude
|
||||
|
||||
%macro copy_stack_var_to_globals 2
|
||||
@@ -335,22 +342,22 @@ prelude_main:
|
||||
cli
|
||||
|
||||
; Load our flat-address-space GDT.
|
||||
lgdt [flat_gdt_slice]
|
||||
lgdt [gdt_flat_slice]
|
||||
|
||||
; Set the protected-mode bit in cr0.
|
||||
mov eax, cr0
|
||||
or al, 0x01
|
||||
mov cr0, eax
|
||||
|
||||
; Long jump to set the code segment to flat_gdt.segment_code, and to clear the instruction
|
||||
; Long jump to set the code segment to gdt_flat.segment_code, and to clear the instruction
|
||||
; pipeline.
|
||||
jmp (flat_gdt.segment_code_32 - flat_gdt):.protected_mode
|
||||
jmp GDT_FLAT_IDX_CODE_32:.protected_mode_32
|
||||
|
||||
[bits 32]
|
||||
.protected_mode:
|
||||
.protected_mode_32:
|
||||
|
||||
; Set the data segments to flat_gdt.segment_data.
|
||||
mov eax, (flat_gdt.segment_data - flat_gdt)
|
||||
; Set the data segments to gdt_flat.segment_data.
|
||||
mov eax, GDT_FLAT_IDX_DATA
|
||||
mov ds, eax
|
||||
mov es, eax
|
||||
mov fs, eax
|
||||
@@ -363,87 +370,3 @@ prelude_main:
|
||||
|
||||
jmp _start
|
||||
jmp panic_simple
|
||||
|
||||
|
||||
section .data
|
||||
flat_gdt_slice:
|
||||
dw FLAT_GDT_LEN
|
||||
dd flat_gdt
|
||||
|
||||
; Segment descriptor layout
|
||||
; | Range (bits) | Field |
|
||||
; |--------------|---------------|
|
||||
; | 0-16 | limit |
|
||||
; | 16-32 | base |
|
||||
; | 32-40 | base cont. |
|
||||
; | 40-48 | access |
|
||||
; | 48-52 | limit cont. |
|
||||
; | 52-56 | flags |
|
||||
; | 56-64 | base cont. |
|
||||
;
|
||||
; Flags
|
||||
; - 0: reserved
|
||||
; - 1: long-mode code segment
|
||||
; - 2: size
|
||||
; - unset: 16-bit
|
||||
; - set: 32-bit
|
||||
; - 3: granularity
|
||||
; - unset: limit is measured in bytes
|
||||
; - set: limit is measured in 4KiB pages
|
||||
;
|
||||
; Access
|
||||
; - 0: accessed
|
||||
; - unset: CPU will set it when the segment is accessed
|
||||
; - 1: readable / writable
|
||||
; - data segments: is segment writable (data segments are always readable)
|
||||
; - code segments: is segment readable (code segments are never writable)
|
||||
; - 2: direction / conforming
|
||||
; - data segments: whether segment grows down
|
||||
; - code segments: whether this can be executed from a lower-privilege ring
|
||||
; - 3: executable
|
||||
; - unset: this is a data segment
|
||||
; - set: this is a code segment
|
||||
; - 4: descriptor type
|
||||
; - unset: this is a task state segment
|
||||
; - set: this is a data or code segment
|
||||
; - 5-6: privilege level (ring number)
|
||||
; - 7: present (must be set)
|
||||
;
|
||||
align 8
|
||||
flat_gdt:
|
||||
; First GDT entry must be 0.
|
||||
.segment_null:
|
||||
dq 0
|
||||
|
||||
; 32-bit code segment.
|
||||
; Bytes 0x0000 - 0xffff.
|
||||
.segment_code_32:
|
||||
db 0xff, 0xff, \
|
||||
0x00, 0x00, \
|
||||
0x00, \
|
||||
10011011b, \
|
||||
01000000b, \
|
||||
0x00
|
||||
|
||||
; 16-bit code segment, to use if we want to switch back to real mode.
|
||||
; Bytes 0x0000 - 0xffff.
|
||||
.segment_code_16:
|
||||
db 0xff, 0xff, \
|
||||
0x00, 0x00, \
|
||||
0x00, \
|
||||
10011011b, \
|
||||
00000000b, \
|
||||
0x00
|
||||
|
||||
; Data segment.
|
||||
; Pages 0x000000 - 0x0fffff, which covers the entire 32-bit address space (start of 0xfffff-th page
|
||||
; is 0xfffff * 4096 = 0xfffff000, end of page exclusive is 0xfffff000 + 4096 = 0x100000000).
|
||||
.segment_data:
|
||||
db 0xff, 0xff, \
|
||||
0x00, 0x00, \
|
||||
0x00, \
|
||||
10010011b, \
|
||||
11001111b, \
|
||||
0x00
|
||||
|
||||
FLAT_GDT_LEN equ ($ - flat_gdt)
|
||||
Reference in new issue
Block a user