From 4e5112b45b27793a1f7929f6d7dec349e9377b24 Mon Sep 17 00:00:00 2001 From: Elaina Claus Date: Fri, 5 Sep 2025 20:32:19 -0400 Subject: [PATCH] move unreal mode hackery back to stage2.nasm --- src/stage2/stage2.nasm | 59 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/src/stage2/stage2.nasm b/src/stage2/stage2.nasm index c0ec4dc..6b9025d 100755 --- a/src/stage2/stage2.nasm +++ b/src/stage2/stage2.nasm @@ -198,9 +198,66 @@ hcf: ; ############################## ; -; SYSTEM CONFIGURATION FUNCTIONS +; SYSTEM CONFIGURATION FUNCTIONS & MACROS ; ; ############################## + +; set ds and es segments back to the base of the loader +%ifnmacro __TINY_DS_ES +%macro __TINY_DS_ES 0 + mov ax, __STAGE2_SEGMENT + mov ds, ax + mov es, ax +%endmacro +%endif + +; for copying between locations in high memory +%ifnmacro __REFLAT_DS_ES +%macro __REFLAT_DS_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 ds, ax + 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 + and eax, ~1 ; toggle bit 1 of cr0 + mov cr0, eax ; back to realmode + jmp short $+2 ; i-cache flush + sti + +%endmacro +%endif + ALIGN 4, db 0x90 EnterUnrealMode: __BOCHS_MAGIC_DEBUG