FrldrStartup:
/* Store BootDrive and BootPartition */
- mov byte ptr [FrldrBootDrive], dl
+ mov al, byte ptr [BSS_BootDrive]
+ mov byte ptr [FrldrBootDrive], al
xor eax, eax
- mov al, dh
+ mov al, byte ptr [BSS_BootPartition]
mov dword ptr [FrldrBootPartition], eax
/* Patch long jump with real mode entry point */
mov gs, ax
mov ss, ax
+ /* Save the boot drive and partition */
+ mov byte ptr ds:[BSS_BootDrive], dl
+ mov byte ptr ds:[BSS_BootPartition], dh
+
/* Setup a real mode stack */
mov sp, word ptr ds:[stack16]
CheckFor64BitSupport:
/* Check if CPU supports CPUID */
+ pushad
pushfd
pop eax
mov ebx, eax
mov si, offset .Msg_NoCpuidSupport
call writestr
+ popad
xor al, al
ret
mov si, offset .Msg_NoPAE
call writestr
+ popad
xor al, al
ret
mov si, offset .Msg_NoLongMode
call writestr
+ popad
xor al, al
ret
.ascii "Long mode is not supported.", CR, LF, NUL
.Success:
+ popad
xor al, al
inc al
ret
mov cr4, eax
/* Point cr3 at the PML4 */
- mov edx, PML4_ADDRESS
- mov cr3, edx
+ mov eax, PML4_ADDRESS
+ mov cr3, eax
/* Enable long mode */
mov ecx, MSR_EFER
/* Activate long mode by enabling paging and protection simultaneously,
skipping protected mode entirely */
- mov ebx, cr0
- or ebx, HEX(80000001)
- mov cr0, ebx
+ mov eax, cr0
+ or eax, HEX(80000001)
+ mov cr0, eax
/* Clear prefetch queue & correct CS */
ljmp16 LMODE_CS, InLongMode
if (!FileData[DeviceId].FileFuncTable)
FileData[DeviceId].FileFuncTable = Ext2Mount(DeviceId);
#endif
-#ifdef _M_IX86
+#if defined(_M_IX86) || defined(_M_AMD64)
if (!FileData[DeviceId].FileFuncTable)
FileData[DeviceId].FileFuncTable = PxeMount(DeviceId);
#endif
#define BSS_PnpNodeCount (BSS_START + 96)
#define BSS_PnpNodeNumber (BSS_START + 100)
#define BSS_PnpResult (BSS_START + 104)
+#define BSS_BootDrive (BSS_START + 108) // 1 byte
+#define BSS_BootPartition (BSS_START + 109) // 1 byte
/* Realmode function IDs */