[ros-diffs] [tkreuzer] 52204: [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 fat...

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Sun Jun 12 21:21:47 UTC 2011


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.S?rev=52204&r1=52203&r2=52204&view=diff
==============================================================================
--- 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/fat32.S?rev=52204&r1=52203&r2=52204&view=diff
==============================================================================
--- 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/isoboot.S?rev=52204&r1=52203&r2=52204&view=diff
==============================================================================
--- 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/CMakeLists.txt?rev=52204&r1=52203&r2=52204&view=diff
==============================================================================
--- 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/i386/fathelp.S?rev=52204&r1=52203&r2=52204&view=diff
==============================================================================
--- 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/realmode/amd64.S?rev=52204&view=auto
==============================================================================
--- 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/realmode/fathelp.inc?rev=52204&view=auto
==============================================================================
--- 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/realmode/helpers.inc?rev=52204&view=auto
==============================================================================
--- 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/realmode/i386.S?rev=52204&view=auto
==============================================================================
--- 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




More information about the Ros-diffs mailing list