added another __REFLAT variant
This commit is contained in:
@@ -69,6 +69,7 @@
|
|||||||
%endmacro
|
%endmacro
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
; set ds and es segments back to the base of the loader
|
||||||
%ifnmacro __TINY_DS_ES
|
%ifnmacro __TINY_DS_ES
|
||||||
%macro __TINY_DS_ES 0
|
%macro __TINY_DS_ES 0
|
||||||
mov ax, __STAGE2_SEGMENT
|
mov ax, __STAGE2_SEGMENT
|
||||||
@@ -77,6 +78,7 @@
|
|||||||
%endmacro
|
%endmacro
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
; for copying between locations in high memory
|
||||||
%ifnmacro __REFLAT_DS_ES
|
%ifnmacro __REFLAT_DS_ES
|
||||||
%macro __REFLAT_DS_ES 0
|
%macro __REFLAT_DS_ES 0
|
||||||
cli ; no interrupts
|
cli ; no interrupts
|
||||||
@@ -88,8 +90,31 @@
|
|||||||
jmp short $+2 ; i-cache flush
|
jmp short $+2 ; i-cache flush
|
||||||
|
|
||||||
mov ax, 0x10 ; select descriptor 2
|
mov ax, 0x10 ; select descriptor 2
|
||||||
mov ds, ax ; 10h = 0001_0000b
|
mov ds, ax
|
||||||
mov es, ax ; es to big data
|
mov es, ax
|
||||||
|
|
||||||
|
mov eax, cr0
|
||||||
|
and eax, ~1 ; toggle bit 1 of cr0
|
||||||
|
mov cr0, eax ; back to realmode
|
||||||
|
jmp short $+2 ; i-cache flush
|
||||||
|
sti
|
||||||
|
|
||||||
|
%endmacro
|
||||||
|
%endif
|
||||||
|
|
||||||
|
; for copying from low memory to high memory (ds on a real segment, es in flat mode)
|
||||||
|
%ifnmacro __REFLAT_ES
|
||||||
|
%macro __REFLAT_ES 0
|
||||||
|
cli ; no interrupts
|
||||||
|
lgdt [((__STAGE2_SEGMENT << 4) + unreal_gdt_info)] ; load unreal gdt
|
||||||
|
|
||||||
|
mov eax, cr0
|
||||||
|
or eax, 1 ; set pmode bit
|
||||||
|
mov cr0, eax ; switch to pmode
|
||||||
|
jmp short $+2 ; i-cache flush
|
||||||
|
|
||||||
|
mov ax, 0x10 ; select descriptor 2
|
||||||
|
mov es, ax
|
||||||
|
|
||||||
mov eax, cr0
|
mov eax, cr0
|
||||||
and eax, ~1 ; toggle bit 1 of cr0
|
and eax, ~1 ; toggle bit 1 of cr0
|
||||||
|
|||||||
@@ -226,7 +226,7 @@ EnterUnrealMode:
|
|||||||
sti ; re-enable interupts
|
sti ; re-enable interupts
|
||||||
|
|
||||||
; set ds, es to the STAGE2_SEGMENT, for our model (generally) ds == es == cs
|
; set ds, es to the STAGE2_SEGMENT, for our model (generally) ds == es == cs
|
||||||
; fs, gs & ss are all still huge data model, and the macro "__REFLAT_DS_ES" exists
|
; fs, gs & ss are all still huge data model, and the macro(s) "__REFLAT_xxx" exists
|
||||||
; to easily access data outside of 64KiB boundries using ds/es addressing
|
; to easily access data outside of 64KiB boundries using ds/es addressing
|
||||||
__TINY_DS_ES
|
__TINY_DS_ES
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user