Author: tkreuzer
Date: Sun Jun 12 21:21:47 2011
New Revision: 52204
URL:
http://svn.reactos.org/svn/reactos?rev=52204&view=rev
Log:
[FREELDR]
Make freeldr/setupldr composed of a PE file and prepended raw 16bit code. The 16 bit code
starts with the usual fathelp code. This brings back support for fragmented fat12/16
disks.
Later all 16 bit code is supposed to go into the raw binary chunk to be able to build
freeldr with MSVC.
Added:
trunk/reactos/boot/freeldr/freeldr/arch/realmode/ (with props)
trunk/reactos/boot/freeldr/freeldr/arch/realmode/amd64.S (with props)
trunk/reactos/boot/freeldr/freeldr/arch/realmode/fathelp.inc
trunk/reactos/boot/freeldr/freeldr/arch/realmode/helpers.inc
trunk/reactos/boot/freeldr/freeldr/arch/realmode/i386.S (with props)
Modified:
trunk/reactos/boot/freeldr/bootsect/fat.S
trunk/reactos/boot/freeldr/bootsect/fat32.S
trunk/reactos/boot/freeldr/bootsect/isoboot.S
trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt
trunk/reactos/boot/freeldr/freeldr/arch/i386/fathelp.S
Modified: trunk/reactos/boot/freeldr/bootsect/fat.S
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/bootsect/fat.…
==============================================================================
--- trunk/reactos/boot/freeldr/bootsect/fat.S [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/bootsect/fat.S [iso-8859-1] Sun Jun 12 21:21:47 2011
@@ -227,12 +227,7 @@
// to the helper code. Skip the first three bytes
// because they contain a jump instruction to skip
// over the helper code in the FreeLoader image.
- //jmp 0000:9003h
- push 0 // push segment (0x0000)
- mov bx, [HEX(8000) + HEX(0A8)] // load the RVA of the EntryPoint into eax
- add bx, HEX(8003) // RVA -> VA and skip 3 bytes (jump to fathelper code)
- push bx // push offset
- retf // Transfer control to FreeLoader
+ ljmp16 0, HEX(8003)
Modified: trunk/reactos/boot/freeldr/bootsect/fat32.S
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/bootsect/fat3…
==============================================================================
--- trunk/reactos/boot/freeldr/bootsect/fat32.S [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/bootsect/fat32.S [iso-8859-1] Sun Jun 12 21:21:47 2011
@@ -420,11 +420,8 @@
mov dl, byte ptr BP_REL(BootDrive) // Load boot drive into DL
mov dh, byte ptr ds:[BootPartition] // Load boot partition into DH
- push 0 // push segment (0x0000)
- mov eax, dword ptr ds:[HEX(8000) + HEX(0A8)] // load the RVA of the EntryPoint
into eax
- add eax, HEX(8000) // RVA -> VA
- push ax // push offset
- retf // Transfer control to FreeLoader
+ /* Transfer execution to the bootloader */
+ ljmp16 0, HEX(8000)
// Returns the FAT entry for a given cluster number
// On entry EAX has cluster number
Modified: trunk/reactos/boot/freeldr/bootsect/isoboot.S
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/bootsect/isob…
==============================================================================
--- trunk/reactos/boot/freeldr/bootsect/isoboot.S [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/bootsect/isoboot.S [iso-8859-1] Sun Jun 12 21:21:47 2011
@@ -372,12 +372,9 @@
mov dl, byte ptr ds:[DriveNo] // dl = boot drive
mov dh, 0 // dh = boot partition
- push 0 // push segment (0x0000)
- mov eax, dword ptr ds:[HEX(8000) + HEX(0A8)] // load the RVA of the EntryPoint
into eax
- add eax, HEX(8000) // RVA -> VA
- push ax // push offset
- retf // Transfer control to ROSLDR
-
+
+ /* Transfer execution to the bootloader */
+ ljmp16 0, HEX(8000)
//
// searchdir:
Modified: trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/CMake…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt [iso-8859-1] Sun Jun 12 21:21:47
2011
@@ -14,7 +14,6 @@
arch/i386/realmode.S)
else()
list(APPEND FREELDR_STARTUP_SOURCE
- arch/i386/fathelp.S
arch/i386/arch.S)
endif()
elseif(ARCH MATCHES amd64)
@@ -23,7 +22,6 @@
arch/amd64/stubs.S)
else()
list(APPEND FREELDR_STARTUP_SOURCE
- arch/i386/fathelp.S
arch/amd64/arch.S)
endif()
endif()
@@ -182,6 +180,11 @@
add_library(freeldr_arch ${FREELDR_ARCH_SOURCE})
add_dependencies(freeldr_arch bugcodes)
+CreateBootSectorTarget2(frldr16
+ ${CMAKE_CURRENT_SOURCE_DIR}/arch/realmode/i386.S
+ ${CMAKE_CURRENT_BINARY_DIR}/frldr16.bin
+ 8000)
+
list(APPEND FREELDR_SOURCE
bootmgr.c
${FREELDR_STARTUP_SOURCE}
@@ -189,24 +192,23 @@
${FREELDR_BASE_SOURCE}
)
-add_library(freeldr SHARED ${FREELDR_SOURCE})
+add_executable(freeldr_pe ${FREELDR_SOURCE})
if(NOT MSVC)
- set_target_properties(freeldr PROPERTIES LINK_FLAGS "-Wl,--strip-all
-Wl,--exclude-all-symbols -Wl,--file-alignment,0x1000
-Wl,-T,${CMAKE_CURRENT_SOURCE_DIR}/freeldr_i386.lnk" SUFFIX ".sys")
-set_image_base(freeldr 0x8000)
+ set_target_properties(freeldr_pe PROPERTIES LINK_FLAGS "-Wl,--strip-all
-Wl,--exclude-all-symbols -Wl,--file-alignment,0x1000
-Wl,-T,${CMAKE_CURRENT_SOURCE_DIR}/freeldr_i386.lnk")
else()
- set_target_properties(freeldr PROPERTIES LINK_FLAGS "/ignore:4078 /ignore:4254
/DRIVER /FIXED /ALIGN:0x400 /SECTION:.text,ERW /SECTION:.data,RW /MERGE:.text16=.text
/MERGE:.data=.text /MERGE:.rdata=.text /MERGE:.bss=.text /SUBSYSTEM:BOOT_APPLICATION"
SUFFIX ".sys")
-set_image_base(freeldr 0x10000)
-endif()
-
-set_subsystem(freeldr native)
-set_entrypoint(freeldr mainCRTStartup)
-
-if(ARCH MATCHES i386)
- target_link_libraries(freeldr mini_hal)
-endif()
-
-target_link_libraries(freeldr
+ set_target_properties(freeldr_pe PROPERTIES LINK_FLAGS "/ignore:4078
/ignore:4254 /DRIVER /FIXED /ALIGN:0x400 /SECTION:.text,ERW /SECTION:.data,RW
/MERGE:.text16=.text /MERGE:.data=.text /MERGE:.rdata=.text /MERGE:.bss=.text
/SUBSYSTEM:BOOT_APPLICATION")
+endif()
+
+set_subsystem(freeldr_pe native)
+set_image_base(freeldr_pe 0x9000)
+set_entrypoint(freeldr_pe mainCRTStartup)
+
+if(ARCH MATCHES i386)
+ target_link_libraries(freeldr_pe mini_hal)
+endif()
+
+target_link_libraries(freeldr_pe
freeldr_arch
cportlib
rossym
@@ -214,10 +216,17 @@
rtl
libcntpr)
-add_pch(freeldr include/freeldr.h)
-add_dependencies(freeldr asm)
-
-add_cd_file(TARGET freeldr DESTINATION loader NO_CAB FOR all)
+add_pch(freeldr_pe include/freeldr.h)
+add_dependencies(freeldr_pe asm)
+
+concatenate_files(
+ ${CMAKE_CURRENT_BINARY_DIR}/frldr16.bin
+ ${CMAKE_CURRENT_BINARY_DIR}/freeldr_pe.exe
+ ${CMAKE_CURRENT_BINARY_DIR}/freeldr.sys)
+
+add_custom_target(freeldr ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/freeldr.sys)
+
+add_cd_file(FILE ${CMAKE_CURRENT_BINARY_DIR}/freeldr.sys DESTINATION loader NO_CAB FOR
all)
list(APPEND SETUPLDR_MAIN_SOURCE
bootmgr.c
@@ -238,23 +247,23 @@
${FREELDR_BASE_SOURCE}
${SETUPLDR_MAIN_SOURCE})
-add_library(setupldr SHARED ${SETUPLDR_SOURCE})
+add_executable(setupldr_pe ${SETUPLDR_SOURCE})
if(NOT MSVC)
- set_target_properties(setupldr PROPERTIES LINK_FLAGS "-Wl,--strip-all
-Wl,--exclude-all-symbols -Wl,--file-alignment,0x1000
-Wl,-T,${CMAKE_CURRENT_SOURCE_DIR}/freeldr_i386.lnk" SUFFIX ".sys"
COMPILE_DEFINITIONS "FREELDR_REACTOS_SETUP")
-set_image_base(setupldr 0x8000)
+ set_target_properties(setupldr_pe PROPERTIES LINK_FLAGS "-Wl,--strip-all
-Wl,--exclude-all-symbols -Wl,--file-alignment,0x1000
-Wl,-T,${CMAKE_CURRENT_SOURCE_DIR}/freeldr_i386.lnk" COMPILE_DEFINITIONS
"FREELDR_REACTOS_SETUP")
else()
- set_target_properties(setupldr PROPERTIES LINK_FLAGS "/DRIVER
/SECTION:.text,ERWP,ALIGN=0x1000" SUFFIX ".sys" COMPILE_DEFINITIONS
"FREELDR_REACTOS_SETUP")
-endif()
-
-set_subsystem(setupldr native)
-set_entrypoint(setupldr mainCRTStartup)
-
-if(ARCH MATCHES i386)
- target_link_libraries(setupldr mini_hal)
-endif()
-
-target_link_libraries(setupldr
+ set_target_properties(setupldr_pe PROPERTIES LINK_FLAGS "/DRIVER
/SECTION:.text,ERWP,ALIGN=0x1000" COMPILE_DEFINITIONS
"FREELDR_REACTOS_SETUP")
+endif()
+
+set_subsystem(setupldr_pe native)
+set_image_base(setupldr_pe 0x9000)
+set_entrypoint(setupldr_pe mainCRTStartup)
+
+if(ARCH MATCHES i386)
+ target_link_libraries(setupldr_pe mini_hal)
+endif()
+
+target_link_libraries(setupldr_pe
freeldr_arch
cportlib
rossym
@@ -262,7 +271,14 @@
rtl
libcntpr)
-add_dependencies(setupldr asm)
-
-add_cd_file(TARGET setupldr DESTINATION loader NO_CAB FOR all)
-
+add_dependencies(setupldr_pe asm)
+
+concatenate_files(
+ ${CMAKE_CURRENT_BINARY_DIR}/frldr16.bin
+ ${CMAKE_CURRENT_BINARY_DIR}/setupldr_pe.exe
+ ${CMAKE_CURRENT_BINARY_DIR}/setupldr.sys)
+
+add_custom_target(setupldr ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/setupldr.sys)
+
+add_cd_file(FILE ${CMAKE_CURRENT_BINARY_DIR}/setupldr.sys DESTINATION loader NO_CAB FOR
all)
+
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/fathelp.S
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/fathelp.S [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/fathelp.S [iso-8859-1] Sun Jun 12
21:21:47 2011
@@ -56,6 +56,7 @@
_mainCRTStartup:
PUBLIC start
start:
+#if 0
.byte HEX(e9)
.byte HEX(fd)
.byte HEX(01)
@@ -134,7 +135,7 @@
// Reads the entire FAT into memory at 7000:0000
ReadFatIntoMemory:
- mov ax, [bp+HiddenSectors]
+ mov ax, [bp+HiddenSectors]
mov dx, [bp+HiddenSectors+2]
add ax, [bp+ReservedSectors]
adc dx, 0
@@ -233,6 +234,7 @@
.org HEX(1fe) // Pad to 510 bytes
.word HEX(0aa55) // BootSector signature
+#endif
.endcode16
Propchange: trunk/reactos/boot/freeldr/freeldr/arch/realmode/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Sun Jun 12 21:21:47 2011
@@ -1,0 +1,2 @@
+([Ii]ssue|[Bb]ug)s? #?(\d+)(,? ?#?(\d+))*(,? ?(and |or )?#?(\d+))?
+(\d+)
Propchange: trunk/reactos/boot/freeldr/freeldr/arch/realmode/
------------------------------------------------------------------------------
bugtraq:message = See issue #%BUGID% for more details.
Propchange: trunk/reactos/boot/freeldr/freeldr/arch/realmode/
------------------------------------------------------------------------------
bugtraq:url =
http://www.reactos.org/bugzilla/show_bug.cgi?id=%BUGID%
Propchange: trunk/reactos/boot/freeldr/freeldr/arch/realmode/
------------------------------------------------------------------------------
tsvn:logminsize = 10
Added: trunk/reactos/boot/freeldr/freeldr/arch/realmode/amd64.S
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/realmode/amd64.S (added)
+++ trunk/reactos/boot/freeldr/freeldr/arch/realmode/amd64.S [iso-8859-1] Sun Jun 12
21:21:47 2011
@@ -1,0 +1,225 @@
+
+#include <asm.inc>
+#include <arch/pc/x86common.h>
+
+#define IMAGE_DOS_HEADER_e_lfanew 36
+#define IMAGE_FILE_HEADER_SIZE 20
+#define IMAGE_OPTIONAL_HEADER_AddressOfEntryPoint 16
+
+
+.code16
+
+/* fat helper code */
+#include "fathelp.inc"
+
+.org 512
+RealEntryPoint:
+
+ cli
+
+ /* Setup real mode segment registers */
+ xor ax, ax
+ mov ds, ax
+ mov es, ax
+ mov fs, ax
+ mov gs, ax
+ mov ss, ax
+
+ /* checkPoint Charlie - where it all began... */
+ mov si, offset CheckPoint0
+ call writestr
+
+ /* Setup a real mode stack */
+ mov sp, stack16
+
+ /* Zero BootDrive and BootPartition */
+ xor eax, eax
+ mov BootDrive, eax
+ mov BootPartition, eax
+
+ /* Store the boot drive */
+ mov BootDrive, dl
+
+ /* Store the boot partition */
+ mov BootPartition, dh
+
+ /* Load the GDT */
+ lgdt gdtptr
+ /* Load the IDT */
+// lidt idtptr
+
+ call x86_16_EnableA20
+
+ /* checkPoint Charlie - where it all began... */
+ mov si, offset CheckPoint1
+ call writestr
+
+ call x86_16_BuildPageTables
+
+ /* checkPoint Charlie - where it all began... */
+ mov si, offset CheckPoint2
+ call writestr
+
+ /* Check if CPU supports CPUID */
+ pushfd
+ pop eax
+ mov ebx, eax
+ xor eax, HEX(00200000)
+ push eax
+ popfd
+ pushfd
+ pop eax
+ cmp eax,ebx
+ jz no_cpuid_support_detected
+
+ /* CPUID support detected - getting the PAE/PGE */
+
+ mov eax,1 // Fn0000_0001 - PAE in EDX[6]
+ cpuid
+ xor eax,eax
+ and edx, HEX(00a0)
+ test edx,edx // are PAE and PGE bits set?
+ jz no_x64_support_detected
+
+ /* PAE and PGE are here */
+
+ xor edx, edx
+ mov eax, HEX(80000001)
+ cpuid
+ and edx, HEX(20000000)
+ test edx,edx
+ jz no_x64_support_detected
+
+ /* X64 Processor */
+
+ /* checkPoint Charlie - where it all began... */
+ mov si, offset CheckPoint3
+ call writestr
+
+ /* Get address of optional header */
+ mov eax, dword ptr ds:[FREELDR_PE_BASE + IMAGE_DOS_HEADER_e_lfanew]
+ add eax, FREELDR_PE_BASE + 4 + IMAGE_FILE_HEADER_SIZE
+
+ /* Get address of entry point */
+ mov eax, dword ptr ds:[eax + IMAGE_OPTIONAL_HEADER_AddressOfEntryPoint]
+
+ /* Store the address in the callback return variable */
+ mov dword ptr ds:[CallbackReturnAddress], eax
+
+switch64:
+ mov
+ jmp x86_16_ReturnToLong
+
+
+no_x64_support_detected:
+ mov si, offset NotAnX64Processor // Loading message
+ call writestr
+ jmp fail
+
+no_cpuid_support_detected:
+ mov si, offset NoCPUIDSupport // Loading message
+ call writestr
+
+fail:
+ jmp fail
+ nop
+ nop
+
+/*
+ * We define 512 2MB pages at the start of memory, so we can access the first
+ * 1 GB as if paging was disabled
+ */
+x86_16_BuildPageTables:
+ pusha
+ push es
+
+ /* Get segment of pml4 */
+ mov eax, offset pml4_startup
+ shr eax, 4
+ mov es, ax
+ cld
+ xor di, di
+
+ /* One entry in the PML4 pointing to PDP */
+ mov eax, offset pdp_startup
+ or eax, HEX(00f)
+ stosd
+ /* clear rest */
+ xor eax, eax
+ mov cx, HEX(03ff)
+ rep stosd
+
+ /* One entry in the PDP pointing to PD */
+ mov eax, offset pd_startup
+ or eax, HEX(00f)
+ stosd
+ /* clear rest */
+ xor eax, eax
+ mov ecx, HEX(03ff)
+ rep stosd
+
+ /* 512 entries in the PD defining a 2MB page each */
+ mov ecx, 512
+ mov eax, HEX(008f)
+
+Bpt2:
+ mov es: [di], eax
+ mov dword ptr es: [di + 4], 0
+ add eax, 512 << 12 // add 512 4k pages
+ add di, 8
+
+ /* Loop it */
+ dec cx
+ jnz Bpt2
+
+ /* Return */
+ pop es
+ popa
+ ret
+
+
+
+
+
+x86_16_ReturnToLong:
+
+ cli
+
+ xor ax,ax
+ mov ds,ax
+ mov es,ax
+ mov fs,ax
+ mov gs,ax
+ mov ss,ax
+
+ /* Get the return address off the stack */
+ pop word ptr code64ret
+
+ /* Save 16-bit stack pointer */
+ mov stack16, sp
+
+ mov eax, 0x00a0 // Set PAE and PGE: 10100000b
+ mov cr4, eax
+
+ mov edx, offset pml4_startup // Point cr3 at PML4
+ mov cr3, edx
+
+ mov ecx, HEX(0C0000080) // Specify EFER MSR
+
+ rdmsr // Enable long mode
+ or eax, HEX(00000100)
+ wrmsr
+
+ mov ebx, cr0 // Activate long mode
+ or ebx, HEX(080000001) // by enabling paging and protection simultaneously
+ mov cr0, ebx // skipping protected mode entirely
+
+ //jmp LMODE_CS:offset LongCat //Load CS with 64 bit segment and flush the instruction
cache
+ // Do a long jmp to the CallbackReturn address
+
+
+#include "helpers.inc"
+
+.endcode16
+
+END
Propchange: trunk/reactos/boot/freeldr/freeldr/arch/realmode/amd64.S
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/boot/freeldr/freeldr/arch/realmode/fathelp.inc
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/realmode/fathelp.inc (added)
+++ trunk/reactos/boot/freeldr/freeldr/arch/realmode/fathelp.inc [iso-8859-1] Sun Jun 12
21:21:47 2011
@@ -1,0 +1,225 @@
+// fathelp.S
+// FAT12/16 Boot Sector Helper Code
+// Copyright (c) 1998, 2001, 2002, 2003 Brian Palmer
+
+//#include <asm.inc>
+
+//org 8000h
+
+//.text
+
+#define BootSectorStackTop HEX(7bf2)
+#define DataAreaStartHigh 2
+#define DataAreaStartLow 4
+#define BiosCHSDriveSizeHigh 6
+#define BiosCHSDriveSizeLow 8
+#define BiosCHSDriveSize 8
+#define ReadSectorsOffset 10
+#define ReadClusterOffset 12
+#define PutCharsOffset 14
+
+#define OEMName 3
+#define BytesPerSector 11
+#define SectsPerCluster 13
+#define ReservedSectors 14
+#define NumberOfFats 16
+#define MaxRootEntries 17
+#define TotalSectors 19
+#define MediaDescriptor 21
+#define SectorsPerFat 22
+#define SectorsPerTrack 24
+#define NumberOfHeads 26
+#define HiddenSectors 28
+#define TotalSectorsBig 32
+#define BootDrive 36
+#define Reserved 37
+#define ExtendSig 38
+#define SerialNumber 39
+#define VolumeLabel 43
+#define FileSystem 54
+
+#define BootPartition HEX(7dfd)
+
+
+// This code will be stored in the first 512 bytes
+// of freeldr.sys. The first 3 bytes will be a jmp
+// instruction to skip past the FAT helper code
+// that is stored in the rest of the 512 bytes.
+//
+
+PUBLIC start
+start:
+ // This code is loaded at 0000:8000 so we have to
+ // encode a jmp instruction to jump to 0000:8200
+ .byte HEX(e9), HEX(fd), HEX(01)
+
+// Now starts the extra boot code that we will store
+// in the first 512 bytes of freeldr.sys. This code
+// allows the FAT12/16 bootsector to navigate the
+// FAT table so that we can still load freeldr.sys
+// even if it is fragmented.
+
+
+FatHelperEntryPoint:
+ /* First save AX - the start cluster of freeldr.sys */
+ push ax
+
+ /* Display "Loading FreeLoader..." message */
+ mov si, offset msgLoading
+ call word ptr [bp-PutCharsOffset]
+
+ call ReadFatIntoMemory
+
+ /* Restore AX (start cluster) */
+ pop ax
+
+ // AX has start cluster of freeldr.sys
+ mov bx, HEX(800)
+ mov es,bx
+
+LoadFile:
+ push ax
+ call IsFat12
+ pop ax
+ jnc LoadFile2
+ cmp ax, HEX(0ff8) // Check to see if this is the last cluster in the chain
+ jmp LoadFile3
+
+LoadFile2:
+ cmp ax, HEX(0fff8)
+LoadFile3:
+ jae LoadFile_Done // If so continue, if not then read then next one
+ push ax
+ xor bx,bx // Load ROSLDR starting at 0000:8000h
+ push es
+ call word ptr [bp-ReadClusterOffset]
+ pop es
+
+ xor bx,bx
+ mov bl, [bp+SectsPerCluster]
+ shl bx,5 // BX = BX * 512 / 16
+ mov ax,es // Increment the load address by
+ add ax,bx // The size of a cluster
+ mov es,ax
+
+ call IsFat12
+ pop ax
+ push es
+ jnc LoadFile4
+ call GetFatEntry12 // Get the next entry
+ jmp LoadFile5
+LoadFile4:
+ call GetFatEntry16
+LoadFile5:
+ pop es
+
+ jmp LoadFile // Load the next cluster (if any)
+
+LoadFile_Done:
+ mov dl, byte ptr [bp+BootDrive] // Load the boot drive into DL
+ mov dh, byte ptr ds:[BootPartition] // Load the boot partition into DH
+
+ /* continue where other bootsectors start */
+ jmp start
+
+
+// Reads the entire FAT into memory at 7000:0000
+ReadFatIntoMemory:
+ mov ax, [bp+HiddenSectors]
+ mov dx, [bp+HiddenSectors+2]
+ add ax, [bp+ReservedSectors]
+ adc dx, 0
+ mov cx, [bp+SectorsPerFat]
+ mov bx, HEX(7000)
+ mov es,bx
+ xor bx,bx
+ call word ptr [bp-ReadSectorsOffset]
+ ret
+
+
+// Returns the FAT entry for a given cluster number for 16-bit FAT
+// On entry AX has cluster number
+// On return AX has FAT entry for that cluster
+GetFatEntry16:
+ mov cx,2 // AX = AX * 2 (since FAT16 entries are 2 bytes)
+ mul cx
+ shl dx,12
+
+ mov bx, HEX(7000)
+ add bx,dx
+ mov es,bx
+ mov bx,ax // Restore FAT entry offset
+ mov ax, es:[bx] // Get FAT entry
+
+ ret
+
+
+// Returns the FAT entry for a given cluster number for 12-bit FAT
+// On entry AX has cluster number
+// On return AX has FAT entry for that cluster
+GetFatEntry12:
+ push ax
+ mov cx,ax
+ shr ax,1
+ add ax,cx // AX = AX * 1.5 (AX = AX + (AX / 2)) (since FAT12 entries are 12
bits)
+
+ mov bx, HEX(7000)
+ mov es,bx
+ mov bx,ax // Put FAT entry offset into BX
+ mov ax, es:[bx] // Get FAT entry
+ pop cx // Get cluster number from stack
+ and cx,1
+ jz UseLow12Bits
+ and ax, HEX(0fff0)
+ shr ax,4
+ jmp GetFatEntry12_Done
+
+UseLow12Bits:
+ and ax, HEX(0fff)
+
+GetFatEntry12_Done:
+
+ ret
+
+
+// Returns CF = 1 if this is a FAT12 file system
+// Otherwise CF = 0 for FAT16
+IsFat12:
+
+ mov ebx, dword ptr [bp-DataAreaStartLow]
+ // EBX now has the number of the starting sector of the data area
+ // starting from the beginning of the disk, so subtrace hidden sectors
+ sub ebx, dword ptr [bp+HiddenSectors]
+
+
+ xor eax,eax
+ mov ax, word ptr [bp+TotalSectors]
+ cmp ax, 0
+ jnz IsFat12_2
+ mov eax, dword ptr [bp+TotalSectorsBig]
+
+ // EAX now contains the number of sectors on the volume
+
+IsFat12_2:
+ sub eax,ebx // Subtract data area start sector
+ xor edx,edx // from total sectors of volume
+
+ // EDX:EAX now contains the number of data sectors on the volume
+ movzx ebx, byte ptr [bp+SectsPerCluster]
+ div ebx
+ // EAX now has the number of clusters on the volume
+ stc
+ cmp eax,4085
+ jb IsFat12_Done
+ clc
+
+IsFat12_Done:
+ ret
+
+
+msgLoading: .asciz "Loading FreeLoader...\r\n"
+
+ .org 510 // Pad to 510 bytes
+ .word HEX(0aa55) // BootSector signature
+
+END
Added: trunk/reactos/boot/freeldr/freeldr/arch/realmode/helpers.inc
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/realmode/helpers.inc (added)
+++ trunk/reactos/boot/freeldr/freeldr/arch/realmode/helpers.inc [iso-8859-1] Sun Jun 12
21:21:47 2011
@@ -1,0 +1,104 @@
+
+Empty8042:
+ .word 0x00eb,0x00eb // jmp $+2, jmp $+2
+ in al, 0x64
+ cmp al, 0xff // legacy-free machine without keyboard
+ jz empty_8042_ret // controllers on Intel Macs read back 0xFF
+ test al, 0x02
+ jnz x86_16_Empty8042
+empty_8042_ret:
+ ret
+
+EnableA20:
+ pusha
+ call x86_16_Empty8042
+ mov al, 0xD1 // command write
+ out 0x64, al
+ call x86_16_Empty8042
+ mov al, 0xDF // A20 on
+ out 0x60, al
+ call x86_16_Empty8042
+ popa
+ ret
+
+/*
+ * writestr
+ * si = pointer to zero terminated string
+ */
+writestr:
+ pushfd
+ pushad
+writestr_top:
+ lodsb
+ and al, al
+ jz writestr_end
+ call writechr
+ jmp short writestr_top
+writestr_end:
+ popad
+ popfd
+ ret
+
+/*
+ * writechr
+ * al = character to output
+ */
+writechr:
+ pushf
+ pusha
+ mov ah, 0x0E
+ xor bx, bx
+ int 0x10
+ popa
+ popf
+ ret
+
+//
+// writehex[248]: Write a hex number in (AL, AX, EAX) to the console
+//
+writehex2:
+ pushfd
+ pushad
+ shl eax, 24
+ mov cx, 2
+ jmp short writehex_common
+writehex4:
+ pushfd
+ pushad
+ shl eax, 16
+ mov cx, 4
+ jmp short writehex_common
+writehex8:
+ pushfd
+ pushad
+ mov cx, 8
+writehex_common:
+.loop:
+ rol eax, 4
+ push eax
+ and al, HEX(0F)
+ cmp al, 10
+ jae .high
+.low:
+ add al, '0'
+ jmp short .ischar
+.high:
+ add al, 'A'-10
+.ischar:
+ call writechr
+ pop eax
+ loop .loop
+ popad
+ popfd
+ ret
+
+SoftReboot:
+ mov ax, HEX(40)
+ mov ds, ax
+ mov si, HEX(72)
+
+ /* Set the word at location 40:72 to 1234h */
+ mov word ptr [si], HEX(1234)
+
+ /* and jump to location FFFF:0 in ROM */
+ ljmp16 HEX(0FFFF), HEX(0000)
Added: trunk/reactos/boot/freeldr/freeldr/arch/realmode/i386.S
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/realmode/i386.S (added)
+++ trunk/reactos/boot/freeldr/freeldr/arch/realmode/i386.S [iso-8859-1] Sun Jun 12
21:21:47 2011
@@ -1,0 +1,32 @@
+
+#include <asm.inc>
+#include "../../include/arch/pc/x86common.h"
+
+#define IMAGE_DOS_HEADER_e_lfanew 60
+#define IMAGE_FILE_HEADER_SIZE 20
+#define IMAGE_OPTIONAL_HEADER_AddressOfEntryPoint 16
+
+.code16
+
+/* fat helper code */
+#include "fathelp.inc"
+
+.org 512
+RealEntryPoint:
+
+ /* Get address of optional header */
+ mov eax, dword ptr ds:[FREELDR_PE_BASE + IMAGE_DOS_HEADER_e_lfanew]
+ add eax, FREELDR_PE_BASE + 4 + IMAGE_FILE_HEADER_SIZE
+
+ /* Jump to address of entry point */
+ mov eax, dword ptr ds:[eax + IMAGE_OPTIONAL_HEADER_AddressOfEntryPoint]
+ add eax, FREELDR_PE_BASE
+ jmp ax
+
+
+#include "helpers.inc"
+
+.org (FREELDR_PE_BASE - FREELDR_BASE)
+.endcode16
+
+END
Propchange: trunk/reactos/boot/freeldr/freeldr/arch/realmode/i386.S
------------------------------------------------------------------------------
svn:eol-style = native