mirror of
https://github.com/reactos/reactos.git
synced 2026-06-01 00:40:26 +08:00
[FREELDR] Adapt bootsectors and multiboot code for future base address change (#7785)
See also PRs #8439 and #7530. CORE-19882
This commit is contained in:
@@ -386,7 +386,7 @@ FreeLdrFound:
|
|||||||
//mov dh, 0 // Load boot partition into DH (not needed, FreeLbr detects it itself)
|
//mov dh, 0 // Load boot partition into DH (not needed, FreeLbr detects it itself)
|
||||||
|
|
||||||
/* Transfer execution to the bootloader */
|
/* Transfer execution to the bootloader */
|
||||||
ljmp16 0, FREELDR_BASE
|
ljmp16 FREELDR_BASE / 16, 0
|
||||||
|
|
||||||
|
|
||||||
// Insert chunk into chunk map (located at DS:[CHUNK_MAP_OFFSET])
|
// Insert chunk into chunk map (located at DS:[CHUNK_MAP_OFFSET])
|
||||||
|
|||||||
@@ -48,10 +48,10 @@ DataAreaStartLow = 4
|
|||||||
BiosCHSDriveSizeHigh = 6
|
BiosCHSDriveSizeHigh = 6
|
||||||
BiosCHSDriveSizeLow = 8
|
BiosCHSDriveSizeLow = 8
|
||||||
BiosCHSDriveSize = 8
|
BiosCHSDriveSize = 8
|
||||||
ReadSectorsOffset = 10
|
ReadSectorsOffset = 12
|
||||||
ReadClusterOffset = 12
|
ReadClusterOffset = 16
|
||||||
PutCharsOffset = 14
|
PutCharsOffset = 20
|
||||||
BootSectorStackTop = HEX(7c00) - 16
|
BootSectorStackTop = HEX(7c00) - 22
|
||||||
|
|
||||||
|
|
||||||
// org 7c00h
|
// org 7c00h
|
||||||
@@ -218,9 +218,14 @@ FoundFreeLoader:
|
|||||||
|
|
||||||
// Save the addresses of needed functions so
|
// Save the addresses of needed functions so
|
||||||
// the helper code will know where to call them.
|
// the helper code will know where to call them.
|
||||||
mov word ptr [bp-ReadSectorsOffset], offset ReadSectors // Save the address of ReadSectors
|
xor bx, bx
|
||||||
mov word ptr [bp-ReadClusterOffset], offset ReadCluster // Save the address of ReadCluster
|
mov word ptr [bp-(ReadSectorsOffset-2)], bx // Save the segment of ReadSectors
|
||||||
mov word ptr [bp-PutCharsOffset], offset PutChars // Save the address of PutChars
|
mov word ptr [bp-(ReadClusterOffset-2)], bx // Save the segment of ReadCluster
|
||||||
|
mov word ptr [bp-(PutCharsOffset-2)], bx // Save the segment of PutChars
|
||||||
|
mov word ptr [bp-ReadSectorsOffset], offset ReadSectors // Save the address of ReadSectors
|
||||||
|
mov word ptr [bp-ReadClusterOffset], offset ReadCluster // Save the address of ReadCluster
|
||||||
|
mov word ptr [bp-PutCharsOffset], offset PutChars // Save the address of PutChars
|
||||||
|
mov byte ptr [PatchedRet], HEX(CB) // Patch 'ret' with 'retf'
|
||||||
|
|
||||||
// Now AX has start cluster of FreeLoader and we
|
// Now AX has start cluster of FreeLoader and we
|
||||||
// have loaded the helper code in the first 512 bytes
|
// have loaded the helper code in the first 512 bytes
|
||||||
@@ -228,7 +233,7 @@ FoundFreeLoader:
|
|||||||
// to the helper code. Skip the first three bytes
|
// to the helper code. Skip the first three bytes
|
||||||
// because they contain a jump instruction to skip
|
// because they contain a jump instruction to skip
|
||||||
// over the helper code in the FreeLoader image.
|
// over the helper code in the FreeLoader image.
|
||||||
ljmp16 0, FREELDR_BASE + 3
|
ljmp16 FREELDR_BASE / 16, 3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -249,13 +254,11 @@ Reboot:
|
|||||||
PutChars:
|
PutChars:
|
||||||
lodsb
|
lodsb
|
||||||
or al,al
|
or al,al
|
||||||
jz short Done
|
jz PatchedRet
|
||||||
mov ah, HEX(0e)
|
mov ah, HEX(0e)
|
||||||
mov bx, 7
|
mov bx, 7
|
||||||
int HEX(10)
|
int HEX(10)
|
||||||
jmp short PutChars
|
jmp short PutChars
|
||||||
Done:
|
|
||||||
ret
|
|
||||||
|
|
||||||
// Displays a bad boot message
|
// Displays a bad boot message
|
||||||
// And reboots
|
// And reboots
|
||||||
@@ -265,7 +268,6 @@ BadBoot:
|
|||||||
|
|
||||||
jmp short Reboot
|
jmp short Reboot
|
||||||
|
|
||||||
|
|
||||||
// Reads cluster number in AX into [ES:0000]
|
// Reads cluster number in AX into [ES:0000]
|
||||||
ReadCluster:
|
ReadCluster:
|
||||||
// StartSector = ((Cluster - 2) * SectorsPerCluster) + ReservedSectors + HiddenSectors;
|
// StartSector = ((Cluster - 2) * SectorsPerCluster) + ReservedSectors + HiddenSectors;
|
||||||
@@ -354,7 +356,7 @@ ReadSectorsLBALoop:
|
|||||||
|
|
||||||
loop ReadSectorsLBALoop // Read next sector
|
loop ReadSectorsLBALoop // Read next sector
|
||||||
|
|
||||||
ret
|
jmp PatchedRet
|
||||||
|
|
||||||
|
|
||||||
// Reads logical sectors into [ES:BX]
|
// Reads logical sectors into [ES:BX]
|
||||||
@@ -403,11 +405,12 @@ NoCarryCHS:
|
|||||||
// Increment read buffer for next sector
|
// Increment read buffer for next sector
|
||||||
loop ReadSectorsCHSLoop // Read next sector
|
loop ReadSectorsCHSLoop // Read next sector
|
||||||
|
|
||||||
|
PatchedRet:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
msgDiskError:
|
msgDiskError:
|
||||||
.ascii "Disk error", CR, LF, NUL
|
// .ascii "Disk error", CR, LF, NUL
|
||||||
|
.ascii "ERR", CR, LF, NUL
|
||||||
msgFreeLdr:
|
msgFreeLdr:
|
||||||
.ascii "Ldr not found", CR, LF, NUL
|
.ascii "Ldr not found", CR, LF, NUL
|
||||||
// Sorry, need the space...
|
// Sorry, need the space...
|
||||||
|
|||||||
@@ -425,7 +425,7 @@ LoadFileDone:
|
|||||||
mov dh, byte ptr ds:[BootPartition] // Load boot partition into DH
|
mov dh, byte ptr ds:[BootPartition] // Load boot partition into DH
|
||||||
|
|
||||||
/* Transfer execution to the bootloader */
|
/* Transfer execution to the bootloader */
|
||||||
ljmp16 0, FREELDR_BASE
|
ljmp16 FREELDR_BASE / 16, 0
|
||||||
|
|
||||||
// Returns the FAT entry for a given cluster number
|
// Returns the FAT entry for a given cluster number
|
||||||
// On entry EAX has cluster number
|
// On entry EAX has cluster number
|
||||||
|
|||||||
@@ -400,7 +400,7 @@ main:
|
|||||||
|
|
||||||
/* Now the complete freeldr imag is loaded.
|
/* Now the complete freeldr imag is loaded.
|
||||||
Jump to the realmode entry point. */
|
Jump to the realmode entry point. */
|
||||||
ljmp16 0, FREELDR_BASE
|
ljmp16 FREELDR_BASE / 16, 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -303,7 +303,7 @@ found_drive:
|
|||||||
|
|
||||||
.jump_to_freeldr:
|
.jump_to_freeldr:
|
||||||
// Transfer execution to the bootloader.
|
// Transfer execution to the bootloader.
|
||||||
ljmp16 0, FREELDR_BASE
|
ljmp16 FREELDR_BASE / 16, 0
|
||||||
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|||||||
@@ -417,7 +417,7 @@ StartSearch:
|
|||||||
|
|
||||||
mov dl, byte ptr [BootDrive]
|
mov dl, byte ptr [BootDrive]
|
||||||
mov dh, byte ptr [BootPartition]
|
mov dh, byte ptr [BootPartition]
|
||||||
ljmp16 0, FREELDR_BASE
|
ljmp16 FREELDR_BASE / 16, 0
|
||||||
|
|
||||||
// Error message if Freeldr is compressed, encrypted or sparse
|
// Error message if Freeldr is compressed, encrypted or sparse
|
||||||
CompressedFreeldr:
|
CompressedFreeldr:
|
||||||
|
|||||||
@@ -25,10 +25,10 @@ DataAreaStartLow = 4
|
|||||||
BiosCHSDriveSizeHigh = 6
|
BiosCHSDriveSizeHigh = 6
|
||||||
BiosCHSDriveSizeLow = 8
|
BiosCHSDriveSizeLow = 8
|
||||||
BiosCHSDriveSize = 8
|
BiosCHSDriveSize = 8
|
||||||
ReadSectorsOffset = 10
|
ReadSectorsOffset = 12
|
||||||
ReadClusterOffset = 12
|
ReadClusterOffset = 16
|
||||||
PutCharsOffset = 14
|
PutCharsOffset = 20
|
||||||
BootSectorStackTop = HEX(7C00) - 16
|
BootSectorStackTop = HEX(7C00) - 22
|
||||||
|
|
||||||
if 0
|
if 0
|
||||||
.macro DEBUG_STOP
|
.macro DEBUG_STOP
|
||||||
@@ -242,9 +242,14 @@ FoundFreeLoader:
|
|||||||
* Save the addresses of needed functions so
|
* Save the addresses of needed functions so
|
||||||
* the helper code will know where to call them
|
* the helper code will know where to call them
|
||||||
*/
|
*/
|
||||||
mov word ptr [bp - ReadSectorsOffset], offset ReadSectors // Save the address of ReadSectors
|
xor bx, bx
|
||||||
mov word ptr [bp - ReadClusterOffset], offset ReadCluster // Save the address of ReadCluster
|
mov word ptr [bp-(ReadSectorsOffset-2)], bx // Save the segment of ReadSectors
|
||||||
mov word ptr [bp - PutCharsOffset], offset PrintString // Save the address of PrintString
|
mov word ptr [bp-(ReadClusterOffset-2)], bx // Save the segment of ReadCluster
|
||||||
|
mov word ptr [bp-(PutCharsOffset-2)], bx // Save the segment of PrintString
|
||||||
|
mov word ptr [bp-ReadSectorsOffset], offset ReadSectors // Save the address of ReadSectors
|
||||||
|
mov word ptr [bp-ReadClusterOffset], offset ReadCluster // Save the address of ReadCluster
|
||||||
|
mov word ptr [bp-PutCharsOffset], offset PrintString // Save the address of PrintString
|
||||||
|
mov byte ptr [PatchedRet], HEX(CB) // Patch 'ret' with 'retf'
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now AX has start cluster of FreeLoader and we
|
* Now AX has start cluster of FreeLoader and we
|
||||||
@@ -254,7 +259,7 @@ FoundFreeLoader:
|
|||||||
* because they contain a jump instruction to skip
|
* because they contain a jump instruction to skip
|
||||||
* over the helper code in the FreeLoader image
|
* over the helper code in the FreeLoader image
|
||||||
*/
|
*/
|
||||||
ljmp16 0, FREELDR_BASE + 3
|
ljmp16 FREELDR_BASE / 16, 3
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reads cluster number in AX into [ES:BX]
|
* Reads cluster number in AX into [ES:BX]
|
||||||
@@ -345,7 +350,7 @@ ReadSectors:
|
|||||||
pop bx
|
pop bx
|
||||||
loop .ReadSectorsLoop // Increment read buffer for next sector, read next sector
|
loop .ReadSectorsLoop // Increment read buffer for next sector, read next sector
|
||||||
|
|
||||||
ret
|
jmp PatchedRet
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prints a character
|
* Prints a character
|
||||||
@@ -380,7 +385,7 @@ PrintString:
|
|||||||
lodsb // Get a single char from a ptr
|
lodsb // Get a single char from a ptr
|
||||||
|
|
||||||
or al, al
|
or al, al
|
||||||
jz short .PrintEnd // Found NULL
|
jz short PatchedRet // Found NULL
|
||||||
|
|
||||||
cmp al, HEX(0D)
|
cmp al, HEX(0D)
|
||||||
jz short .PrintStringHandleCR // Found CR
|
jz short .PrintStringHandleCR // Found CR
|
||||||
@@ -398,7 +403,7 @@ PrintString:
|
|||||||
inc si // Skip the next LF character
|
inc si // Skip the next LF character
|
||||||
jmp short PrintString
|
jmp short PrintString
|
||||||
|
|
||||||
.PrintEnd:
|
PatchedRet:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
if 0
|
if 0
|
||||||
@@ -476,7 +481,8 @@ msgDiskError:
|
|||||||
msgNotFoundError:
|
msgNotFoundError:
|
||||||
.ascii "NFE", CR, LF, NUL
|
.ascii "NFE", CR, LF, NUL
|
||||||
msgAnyKey:
|
msgAnyKey:
|
||||||
.ascii "Press any key", NUL
|
// .ascii "Press any key", NUL
|
||||||
|
.ascii "Press key", NULL
|
||||||
filename:
|
filename:
|
||||||
.ascii "FREELDR SYS"
|
.ascii "FREELDR SYS"
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||||
* PURPOSE: Support for the Multiboot v1 specification.
|
* PURPOSE: Support for the Multiboot v1 specification.
|
||||||
* COPYRIGHT: Copyright 1998-2002 Brian Palmer <brianp@sginet.com>
|
* COPYRIGHT: Copyright 1998-2002 Brian Palmer <brianp@sginet.com>
|
||||||
* Copyright 2024 Daniel Victor <ilauncherdeveloper@gmail.com>
|
* Copyright 2024-2025 Daniel Victor <ilauncherdeveloper@gmail.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <asm.inc>
|
#include <asm.inc>
|
||||||
@@ -190,7 +190,7 @@ mb4:
|
|||||||
mov cr0, rax
|
mov cr0, rax
|
||||||
|
|
||||||
/* Jump to real entry point */
|
/* Jump to real entry point */
|
||||||
ljmp16 0, FREELDR_BASE
|
ljmp16 FREELDR_BASE / 16, 0
|
||||||
|
|
||||||
|
|
||||||
/* Force 8-byte alignment */
|
/* Force 8-byte alignment */
|
||||||
|
|||||||
@@ -14,9 +14,13 @@
|
|||||||
#define BiosCHSDriveSizeHigh 6
|
#define BiosCHSDriveSizeHigh 6
|
||||||
#define BiosCHSDriveSizeLow 8
|
#define BiosCHSDriveSizeLow 8
|
||||||
#define BiosCHSDriveSize 8
|
#define BiosCHSDriveSize 8
|
||||||
#define ReadSectorsOffset 10
|
#define ReadSectorsOffset 12
|
||||||
#define ReadClusterOffset 12
|
#define ReadClusterOffset 16
|
||||||
#define PutCharsOffset 14
|
#define PutCharsOffset 20
|
||||||
|
|
||||||
|
#define ReadSectors dword ptr ss:[bp-ReadSectorsOffset]
|
||||||
|
#define ReadCluster dword ptr ss:[bp-ReadClusterOffset]
|
||||||
|
#define PutChars dword ptr ss:[bp-PutCharsOffset]
|
||||||
|
|
||||||
#define OEMName 3
|
#define OEMName 3
|
||||||
#define BytesPerSector 11
|
#define BytesPerSector 11
|
||||||
@@ -65,8 +69,8 @@ FatHelperEntryPoint:
|
|||||||
push ax
|
push ax
|
||||||
|
|
||||||
/* Display "Loading FreeLoader..." message */
|
/* Display "Loading FreeLoader..." message */
|
||||||
mov si, offset msgLoading
|
mov si, offset msgLoading - FREELDR_BASE
|
||||||
call word ptr [bp-PutCharsOffset]
|
call CS_PutChars
|
||||||
|
|
||||||
call ReadFatIntoMemory
|
call ReadFatIntoMemory
|
||||||
|
|
||||||
@@ -92,7 +96,7 @@ LoadFile3:
|
|||||||
push ax
|
push ax
|
||||||
xor bx,bx // Load ROSLDR starting at 0000:8000h
|
xor bx,bx // Load ROSLDR starting at 0000:8000h
|
||||||
push es
|
push es
|
||||||
call word ptr [bp-ReadClusterOffset]
|
call ReadCluster
|
||||||
pop es
|
pop es
|
||||||
|
|
||||||
xor bx,bx
|
xor bx,bx
|
||||||
@@ -133,7 +137,7 @@ ReadFatIntoMemory:
|
|||||||
mov bx, HEX(7000)
|
mov bx, HEX(7000)
|
||||||
mov es,bx
|
mov es,bx
|
||||||
xor bx,bx
|
xor bx,bx
|
||||||
call word ptr [bp-ReadSectorsOffset]
|
call ReadSectors
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
@@ -216,6 +220,22 @@ IsFat12_2:
|
|||||||
IsFat12_Done:
|
IsFat12_Done:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
CS_PutChars:
|
||||||
|
/* Save necessary registers */
|
||||||
|
push ax
|
||||||
|
push ds
|
||||||
|
|
||||||
|
/* Prepare ds before PutChars call */
|
||||||
|
mov ax, cs
|
||||||
|
mov ds, ax
|
||||||
|
|
||||||
|
/* Display the message */
|
||||||
|
call PutChars
|
||||||
|
|
||||||
|
/* Restore necessary registers and return */
|
||||||
|
pop ds
|
||||||
|
pop ax
|
||||||
|
ret
|
||||||
|
|
||||||
msgLoading:
|
msgLoading:
|
||||||
.ascii "Loading FreeLoader...", CR, LF, NUL
|
.ascii "Loading FreeLoader...", CR, LF, NUL
|
||||||
|
|||||||
Reference in New Issue
Block a user