mirror of
https://github.com/gbowne1/ClassicOS.git
synced 2026-02-11 21:35:20 -08:00
BL: Query and store e820 memory map
- bl stage 1: move gdt+pm setup to stage 2 (avoids mode switching) - bl stage 2: at entry query e820 table from bios, then setup gdt+pm - kernel/memmap: pad map entry to 24 bytes, as exported by bl - kernel/memmap: map copy (gbowne1) - Makefile: facilitate placing the memory map at a known location - Update bl docs
This commit is contained in:
@@ -1,10 +1,80 @@
|
||||
[BITS 32]
|
||||
global _start
|
||||
global ata_lba_read
|
||||
|
||||
extern load_kernel
|
||||
|
||||
%define e820_magic 0x534d4150 ; "SMAP"
|
||||
%define e820_entry_size 24
|
||||
%define e820_max_entries 128
|
||||
|
||||
; ----------------------------------------------------------------
|
||||
; Real mode
|
||||
; ----------------------------------------------------------------
|
||||
[BITS 16]
|
||||
_start:
|
||||
call read_e820
|
||||
call setup_gdt
|
||||
call switch_to_pm
|
||||
|
||||
read_e820:
|
||||
xor ebx, ebx
|
||||
mov es, bx
|
||||
mov di, MEMMAP_BASE+4 ; ES=0 DI=MEMMAP_BASE+4
|
||||
xor bp, bp ; Keeping count in bp
|
||||
|
||||
.e820_loop:
|
||||
mov eax, 0xe820
|
||||
mov ecx, e820_entry_size
|
||||
mov edx, e820_magic
|
||||
int 0x15
|
||||
jc .done ; Error?
|
||||
|
||||
cmp eax, e820_magic ; Verify "SMAP"
|
||||
jne .done
|
||||
|
||||
test ecx, ecx ; Skip 0-sized entries
|
||||
jz .skip
|
||||
|
||||
add di, e820_entry_size ; Advance write addr
|
||||
inc bp ; Increment count
|
||||
|
||||
cmp bp, e820_max_entries ; Stop if we're at capacity
|
||||
jae .done
|
||||
.skip:
|
||||
test ebx, ebx
|
||||
jne .e820_loop
|
||||
.done:
|
||||
mov [MEMMAP_BASE], bp ; Store count
|
||||
ret
|
||||
|
||||
setup_gdt:
|
||||
lgdt [gdt_descriptor]
|
||||
ret
|
||||
|
||||
switch_to_pm:
|
||||
cli
|
||||
mov eax, cr0
|
||||
or eax, 1
|
||||
mov cr0, eax
|
||||
jmp 0x08:pm_entry
|
||||
|
||||
e820_count:
|
||||
dw 0
|
||||
|
||||
gdt_start:
|
||||
dq 0x0000000000000000 ; Null descriptor
|
||||
dq 0x00CF9A000000FFFF ; 32-bit code segment (selector 0x08)
|
||||
dq 0x00CF92000000FFFF ; 32-bit data segment (selector 0x10)
|
||||
dq 0x00009A000000FFFF ; 16-bit code segment for real mode (selector 0x18)
|
||||
gdt_descriptor:
|
||||
dw gdt_end - gdt_start - 1
|
||||
dd gdt_start
|
||||
gdt_end:
|
||||
|
||||
; ----------------------------------------------------------------
|
||||
; Protected mode
|
||||
; ----------------------------------------------------------------
|
||||
[BITS 32]
|
||||
|
||||
pm_entry:
|
||||
; Set up segments
|
||||
; Data segments
|
||||
mov ax, 0x10
|
||||
@@ -18,9 +88,8 @@ _start:
|
||||
mov ax, 0x08
|
||||
mov cs, ax
|
||||
|
||||
; Stack (must be identity-mapped)
|
||||
; Stack
|
||||
mov esp, 0x90000
|
||||
|
||||
call load_kernel
|
||||
|
||||
jmp eax
|
||||
|
||||
Reference in New Issue
Block a user