kernel: relocate to HMA if available
This commit is contained in:
parent
fa6e624604
commit
517c156c3d
32
kernel/hma.asm
Normal file
32
kernel/hma.asm
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
; Code related to memory segment from 0xFFFF0 - 0x10FFEF
|
||||||
|
|
||||||
|
; Check if 0000:0000 and FFFF:0010 point to the same memory
|
||||||
|
; ZF=1 when A20 disabled and HMA unusable
|
||||||
|
; ZF=0 when A20 enabled
|
||||||
|
a20_enabled:
|
||||||
|
mov ax, 0x0000
|
||||||
|
mov ds, ax
|
||||||
|
mov si, ax
|
||||||
|
mov ax, 0xFFFF
|
||||||
|
mov di, 0x0010
|
||||||
|
mov cx, 0x0200
|
||||||
|
repe cmpsw
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Relocate kernel code to HMA
|
||||||
|
hma_relocate:
|
||||||
|
call a20_enabled
|
||||||
|
; TODO: talk to hw to enable a20
|
||||||
|
jz .end
|
||||||
|
mov ax, cs
|
||||||
|
mov ds, ax
|
||||||
|
mov si, 0x0010
|
||||||
|
mov ax, 0xFFFF
|
||||||
|
mov es, ax ; new code segment
|
||||||
|
mov ss, ax ; new stack segment
|
||||||
|
mov di, 0x0010
|
||||||
|
mov cx, 0x7FF8 ; 0xFFF0 divided by 2
|
||||||
|
repe movsw
|
||||||
|
jmp 0xFFFF:.end
|
||||||
|
.end:
|
||||||
|
ret
|
@ -14,10 +14,10 @@ ivt_backup:
|
|||||||
|
|
||||||
; set item in interrupt vector table
|
; set item in interrupt vector table
|
||||||
; in: bx interrupt number
|
; in: bx interrupt number
|
||||||
; ds:dx new handler address
|
; cs:dx new handler address
|
||||||
ivt_set:
|
ivt_set:
|
||||||
push es
|
|
||||||
push ax
|
push ax
|
||||||
|
push es
|
||||||
|
|
||||||
xor ax,ax
|
xor ax,ax
|
||||||
mov es,ax
|
mov es,ax
|
||||||
@ -28,6 +28,6 @@ ivt_set:
|
|||||||
mov [es:bx], dx
|
mov [es:bx], dx
|
||||||
mov [es:bx+2], cs
|
mov [es:bx+2], cs
|
||||||
|
|
||||||
pop ax
|
|
||||||
pop es
|
pop es
|
||||||
|
pop ax
|
||||||
ret
|
ret
|
||||||
|
@ -4,55 +4,27 @@ org 0x0000
|
|||||||
|
|
||||||
_startup:
|
_startup:
|
||||||
mov ax, cs
|
mov ax, cs
|
||||||
mov ds, ax
|
|
||||||
mov es, ax
|
|
||||||
mov ss, ax
|
mov ss, ax
|
||||||
mov sp, 0x0000
|
mov sp, 0x0000
|
||||||
|
; <0x0010 is BIOS segment when relocated to HMA
|
||||||
|
; so we need a nop sled
|
||||||
|
times (0x10 - ($-$$)) nop
|
||||||
main:
|
main:
|
||||||
xor ax, ax
|
call hma_relocate
|
||||||
mov ds, ax
|
|
||||||
mov si, ax
|
|
||||||
mov cx, ax
|
|
||||||
|
|
||||||
call debug_init
|
|
||||||
int 0x2E
|
|
||||||
|
|
||||||
call ivt_backup
|
call ivt_backup
|
||||||
|
call debug_init
|
||||||
|
|
||||||
xor ax, ax
|
int 0x2E
|
||||||
mov ds, ax
|
mov ax,0x1234
|
||||||
mov es, ax
|
int 0x2E
|
||||||
xor cx, cx
|
|
||||||
mov si, ax
|
|
||||||
.loop:
|
|
||||||
mov ax, cx
|
|
||||||
call kprint8
|
|
||||||
mov al, '='
|
|
||||||
call kputc
|
|
||||||
lodsw
|
|
||||||
xchg ax, dx
|
|
||||||
lodsw
|
|
||||||
call kprint16
|
call kprint16
|
||||||
mov al, ':'
|
|
||||||
call kputc
|
|
||||||
xchg ax, dx
|
|
||||||
call kprint16
|
|
||||||
mov al, ' '
|
|
||||||
call kputc
|
|
||||||
inc cx
|
|
||||||
test cx, 0x0003
|
|
||||||
jnz .loop
|
|
||||||
mov al, 0x0A
|
|
||||||
call kputc
|
|
||||||
mov al, 0x0D
|
|
||||||
call kputc
|
|
||||||
cmp cx, 0x0060
|
|
||||||
jl .loop
|
|
||||||
|
|
||||||
.halt:
|
.halt:
|
||||||
hlt
|
hlt
|
||||||
jmp .halt
|
jmp .halt
|
||||||
|
|
||||||
|
%include "hma.asm"
|
||||||
|
|
||||||
%include "heap.asm"
|
%include "heap.asm"
|
||||||
%include "intr.asm"
|
%include "intr.asm"
|
||||||
%include "debug.asm"
|
%include "debug.asm"
|
||||||
|
Loading…
Reference in New Issue
Block a user