[ros-diffs] [tkreuzer] 52143: [CMAKE] - Export obj2bin on MSVC builds - Move CreateBootSectorTarget into compiler specific files - Add _base_address parameter to CreateBootSectorTarget (neccessary for obj2bin)...

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Tue Jun 7 23:22:44 UTC 2011


Author: tkreuzer
Date: Tue Jun  7 23:22:38 2011
New Revision: 52143

URL: http://svn.reactos.org/svn/reactos?rev=52143&view=rev
Log:
[CMAKE]
- Export obj2bin on MSVC builds
- Move CreateBootSectorTarget into compiler specific files
- Add _base_address parameter to CreateBootSectorTarget (neccessary for obj2bin)
- Implement CreateBootSectorTarget for msvc
- Add ML compatible fat32 bootsector (untested)

Added:
    trunk/reactos/boot/freeldr/bootsect/fat32.S   (with props)
Modified:
    trunk/reactos/CMakeLists.txt
    trunk/reactos/CMakeMacros.cmake
    trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt
    trunk/reactos/gcc.cmake
    trunk/reactos/msc.cmake

Modified: trunk/reactos/CMakeLists.txt
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/CMakeLists.txt?rev=52143&r1=52142&r2=52143&view=diff
==============================================================================
--- trunk/reactos/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/CMakeLists.txt [iso-8859-1] Tue Jun  7 23:22:38 2011
@@ -61,7 +61,7 @@
     if(NOT MSVC)
         export(TARGETS widl wrc gendib cabman cdmake mkhive spec2def geninc FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- )
     else()
-        export(TARGETS gendib cabman cdmake mkhive spec2def geninc FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- )
+        export(TARGETS gendib cabman cdmake mkhive obj2bin spec2def geninc FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- )
     endif()
 
 else()
@@ -72,7 +72,7 @@
     set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
     set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
     set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
-    
+
     #useful stuff!
     include(CMakeParseArguments)
 

Modified: trunk/reactos/CMakeMacros.cmake
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/CMakeMacros.cmake?rev=52143&r1=52142&r2=52143&view=diff
==============================================================================
--- trunk/reactos/CMakeMacros.cmake [iso-8859-1] (original)
+++ trunk/reactos/CMakeMacros.cmake [iso-8859-1] Tue Jun  7 23:22:38 2011
@@ -1,35 +1,3 @@
-
-if (NOT MSVC)
-
-macro(CreateBootSectorTarget _target_name _asm_file _object_file)
-    get_filename_component(OBJECT_PATH ${_object_file} PATH)
-    get_filename_component(OBJECT_NAME ${_object_file} NAME)
-    file(MAKE_DIRECTORY ${OBJECT_PATH})
-    get_directory_property(defines COMPILE_DEFINITIONS)
-    get_directory_property(includes INCLUDE_DIRECTORIES)
-
-    foreach(arg ${defines})
-        set(result_defs ${result_defs} -D${arg})
-    endforeach()
-
-    foreach(arg ${includes})
-        set(result_incs -I${arg} ${result_incs})
-    endforeach()
-
-    add_custom_command(
-        OUTPUT ${_object_file}
-        COMMAND nasm -o ${_object_file} ${result_incs} ${result_defs} -f bin ${_asm_file}
-        DEPENDS ${_asm_file})
-    set_source_files_properties(${_object_file} PROPERTIES GENERATED TRUE)
-    add_custom_target(${_target_name} ALL DEPENDS ${_object_file})
-endmacro()
-
-else()
-
-macro(CreateBootSectorTarget _target_name _asm_file _object_file)
-endmacro()
-
-endif()
 
 macro(set_cpp)
     include_directories(BEFORE ${REACTOS_SOURCE_DIR}/include/c++/stlport)
@@ -108,27 +76,27 @@
     if(NOT (_CD_TARGET OR _CD_FILE))
         message(FATAL_ERROR "You must provide a target or a file to install!")
     endif()
-    
+
     if(NOT _CD_DESTINATION)
         message(FATAL_ERROR "You must provide a destination")
     elseif(${_CD_DESTINATION} STREQUAL root)
         set(_CD_DESTINATION "")
     endif()
-    
+
     if(NOT _CD_FOR)
         message(FATAL_ERROR "You must provide a cd name (or "all" for all of them) to install the file on!")
     endif()
-    
+
     #get file if we need to
     if(NOT _CD_FILE)
         get_target_property(_CD_FILE ${_CD_TARGET} LOCATION)
     endif()
-    
+
     #do we add it to all CDs?
     if(_CD_FOR STREQUAL all)
         set(_CD_FOR "bootcd;livecd;regtest")
     endif()
-    
+
     #do we add it to bootcd?
     list(FIND _CD_FOR bootcd __cd)
     if(NOT __cd EQUAL -1)
@@ -161,7 +129,7 @@
             endif()
         endif()
     endif() #end bootcd
-    
+
     #do we add it to livecd?
     list(FIND _CD_FOR livecd __cd)
     if(NOT __cd EQUAL -1)
@@ -178,7 +146,7 @@
             file(APPEND ${REACTOS_BINARY_DIR}/boot/livecd.cmake "file(RENAME \${CD_DIR}/${_CD_DESTINATION}/${__file} \${CD_DIR}/${_CD_DESTINATION}/${_CD_NAME_ON_CD})\n")
         endif()
     endif() #end livecd
-    
+
     #do we add it to regtest?
     list(FIND _CD_FOR regtest __cd)
     if(NOT __cd EQUAL -1)

Modified: trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt?rev=52143&r1=52142&r2=52143&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt [iso-8859-1] Tue Jun  7 23:22:38 2011
@@ -1,14 +1,19 @@
 
-CreateBootSectorTarget(dosmbr ${CMAKE_CURRENT_SOURCE_DIR}/dosmbr.asm ${CMAKE_CURRENT_BINARY_DIR}/dosmbr.bin)
-CreateBootSectorTarget(ext2 ${CMAKE_CURRENT_SOURCE_DIR}/ext2.asm ${CMAKE_CURRENT_BINARY_DIR}/ext2.bin)
-CreateBootSectorTarget(fat32 ${CMAKE_CURRENT_SOURCE_DIR}/fat32.asm ${CMAKE_CURRENT_BINARY_DIR}/fat32.bin)
-CreateBootSectorTarget(fat ${CMAKE_CURRENT_SOURCE_DIR}/fat.asm ${CMAKE_CURRENT_BINARY_DIR}/fat.bin)
-CreateBootSectorTarget(isoboot ${CMAKE_CURRENT_SOURCE_DIR}/isoboot.asm ${CMAKE_CURRENT_BINARY_DIR}/isoboot.bin)
-CreateBootSectorTarget(isobtrt ${CMAKE_CURRENT_SOURCE_DIR}/isobtrt.asm ${CMAKE_CURRENT_BINARY_DIR}/isobtrt.bin)
+if(MSVC)
+CreateBootSectorTarget(fat32 ${CMAKE_CURRENT_SOURCE_DIR}/fat32.S ${CMAKE_CURRENT_BINARY_DIR}/fat32.bin 7c00)
+else()
+CreateBootSectorTarget(dosmbr ${CMAKE_CURRENT_SOURCE_DIR}/dosmbr.asm ${CMAKE_CURRENT_BINARY_DIR}/dosmbr.bin 0)
+CreateBootSectorTarget(ext2 ${CMAKE_CURRENT_SOURCE_DIR}/ext2.asm ${CMAKE_CURRENT_BINARY_DIR}/ext2.bin 0)
+CreateBootSectorTarget(fat32 ${CMAKE_CURRENT_SOURCE_DIR}/fat32.asm ${CMAKE_CURRENT_BINARY_DIR}/fat32.bin 0)
+CreateBootSectorTarget(fat ${CMAKE_CURRENT_SOURCE_DIR}/fat.asm ${CMAKE_CURRENT_BINARY_DIR}/fat.bin 0)
+CreateBootSectorTarget(isoboot ${CMAKE_CURRENT_SOURCE_DIR}/isoboot.asm ${CMAKE_CURRENT_BINARY_DIR}/isoboot.bin 0)
+CreateBootSectorTarget(isobtrt ${CMAKE_CURRENT_SOURCE_DIR}/isobtrt.asm ${CMAKE_CURRENT_BINARY_DIR}/isobtrt.bin 0)
+endif()
 
 add_cd_file(TARGET dosmbr DESTINATION loader NO_CAB FILE ${CMAKE_CURRENT_BINARY_DIR}/dosmbr.bin FOR all)
 add_cd_file(TARGET ext2 DESTINATION loader NO_CAB FILE ${CMAKE_CURRENT_BINARY_DIR}/ext2.bin FOR all)
 add_cd_file(TARGET fat32 DESTINATION loader NO_CAB FILE ${CMAKE_CURRENT_BINARY_DIR}/fat32.bin FOR all)
 add_cd_file(TARGET fat DESTINATION loader NO_CAB FILE ${CMAKE_CURRENT_BINARY_DIR}/fat.bin FOR all)
 add_cd_file(TARGET isoboot DESTINATION loader NO_CAB FILE ${CMAKE_CURRENT_BINARY_DIR}/isoboot.bin FOR all)
-add_cd_file(TARGET isobtrt DESTINATION loader NO_CAB FILE ${CMAKE_CURRENT_BINARY_DIR}/isobtrt.bin FOR all)
+add_cd_file(TARGET isobtrt DESTINATION loader NO_CAB FILE ${CMAKE_CURRENT_BINARY_DIR}/isobtrt.bin FOR all)
+

Added: trunk/reactos/boot/freeldr/bootsect/fat32.S
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/bootsect/fat32.S?rev=52143&view=auto
==============================================================================
--- trunk/reactos/boot/freeldr/bootsect/fat32.S (added)
+++ trunk/reactos/boot/freeldr/bootsect/fat32.S [iso-8859-1] Tue Jun  7 23:22:38 2011
@@ -1,0 +1,538 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Bootsector
+ * FILE:
+ * PURPOSE:
+ * PROGRAMMERS:     ?
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <asm.inc>
+
+.code16
+
+//ORG HEX(7c00)
+
+start:
+    jmp short main
+    nop
+
+OEMName:
+    .ASCII "FrLdr1.0"
+BytesPerSector:
+    dw 512
+SectsPerCluster:
+    db 0
+ReservedSectors:
+    dw 32
+NumberOfFats:
+    db 2
+MaxRootEntries:
+    dw 0            // Always zero for FAT32 volumes
+TotalSectors:
+    dw 0            // Always zero for FAT32 volumes
+MediaDescriptor:
+    db HEX(0f8)
+SectorsPerFat:
+    dw 0            // Always zero for FAT32 volumes
+SectorsPerTrack:
+    dw 0
+NumberOfHeads:
+    dw 0
+HiddenSectors:
+    dd 0
+TotalSectorsBig:
+    dd 0
+
+// FAT32 Inserted Info
+SectorsPerFatBig:
+    dd    0
+ExtendedFlags:
+    dw    0
+FSVersion:
+    dw    0
+RootDirStartCluster:
+    dd    0
+FSInfoSector:
+    dw    0
+BackupBootSector:
+    dw    6
+Reserved1:
+    db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+
+// End FAT32 Inserted Info
+BootDrive:
+    db 0
+Reserved:
+    db 0
+ExtendSig:
+    db HEX(29)
+SerialNumber:
+    dd 0
+VolumeLabel:
+    db "NO NAME    "
+FileSystem:
+    db "FAT32   "
+
+main:
+    xor ax,ax               // Setup segment registers
+    mov ds,ax               // Make DS correct
+    mov es,ax               // Make ES correct
+    mov ss,ax                // Make SS correct
+    mov bp, HEX(7c00)
+    mov sp, HEX(7c00)       // Setup a stack
+
+    cmp byte ptr ds:[BootDrive], HEX(0ff) // If they have specified a boot drive then use it
+    jne CheckSectorsPerFat
+
+    mov byte ptr ds:[BootDrive], dl    // Save the boot drive
+
+CheckSectorsPerFat:
+
+    cmp    word ptr [SectorsPerFat], 0    // Check the old 16-bit value of SectorsPerFat
+    jnz CheckFailed                                // If it is non-zero then exit with an error
+CheckTotalSectors:                                    // Check the old 16-bit value of TotalSectors & MaxRootEntries
+    cmp    word ptr [MaxRootEntries], 0// by comparing the DWORD at offset MaxRootEntries to zero
+    jnz CheckFailed                                // If it is non-zero then exit with an error
+CheckFileSystemVersion:
+    cmp word ptr [FSVersion], 0        // Check the file system version word
+    jna GetDriveParameters            // It is zero, so continue
+CheckFailed:
+    jmp PrintFileSystemError        // If it is not zero then exit with an error
+
+GetDriveParameters:
+    mov  ax, HEX(0800)
+    mov  dl, byte ptr [BootDrive]                    // Get boot drive in dl
+    int  HEX(13)                                    // Request drive parameters from the bios
+    jnc  CalcDriveSize                            // If the call succeeded then calculate the drive size
+
+    // If we get here then the call to the BIOS failed
+    // so just set CHS equal to the maximum addressable
+    // size
+    mov  cx, HEX(0ffff)
+    mov  dh, cl
+
+CalcDriveSize:
+    // Now that we have the drive geometry
+    // lets calculate the drive size
+    mov  bl, ch            // Put the low 8-bits of the cylinder count into BL
+    mov  bh, cl            // Put the high 2-bits in BH
+    shr  bh, 6            // Shift them into position, now BX contains the cylinder count
+    and  cl, HEX(3f)            // Mask off cylinder bits from sector count
+    // CL now contains sectors per track and DH contains head count
+    movzx eax, dh        // Move the heads into EAX
+    movzx ebx, bx        // Move the cylinders into EBX
+    movzx ecx, cl        // Move the sectors per track into ECX
+    inc   eax            // Make it one based because the bios returns it zero based
+    inc   ebx            // Make the cylinder count one based also
+    mul   ecx            // Multiply heads with the sectors per track, result in edx:eax
+    mul   ebx            // Multiply the cylinders with (heads * sectors) [stored in edx:eax already]
+
+    // We now have the total number of sectors as reported
+    // by the bios in eax, so store it in our variable
+    mov dword ptr ds:[BiosCHSDriveSize], eax
+
+LoadExtraBootCode:
+    // First we have to load our extra boot code at
+    // sector 14 into memory at [0000:7e00h]
+    mov  eax, HEX(0e)
+    add  eax, dword ptr ds:[HiddenSectors]    // Add the number of hidden sectors
+    mov  cx, 1
+    xor  bx, bx
+    mov  es, bx                                // Read sector to [0000:7e00h]
+    mov  bx, HEX(7e00)
+    call ReadSectors
+    jmp  StartSearch
+
+
+// Reads logical sectors into [ES:BX]
+// EAX has logical sector number to read
+// CX has number of sectors to read
+ReadSectors:
+    cmp  eax, dword ptr ds:[BiosCHSDriveSize]        // Check if they are reading a sector outside CHS range
+    jae  ReadSectorsLBA                        // Yes - go to the LBA routine
+                                                // If at all possible we want to use LBA routines because
+                                                // They are optimized to read more than 1 sector per read
+
+    pushad                                    // Save logical sector number & sector count
+
+CheckInt13hExtensions:                            // Now check if this computer supports extended reads
+    mov  ah, HEX(41)                            // AH = 41h
+    mov  bx, HEX(55aa)                            // BX = 55AAh
+    mov  dl, byte ptr ds:[BootDrive]                // DL = drive (80h-FFh)
+    int  HEX(13)                                // IBM/MS INT 13 Extensions - INSTALLATION CHECK
+    jc   ReadSectorsCHS                        // CF set on error (extensions not supported)
+    cmp  bx, HEX(0aa55)                            // BX = AA55h if installed
+    jne  ReadSectorsCHS
+    test cl,1                                // CX = API subset support bitmap
+    jz   ReadSectorsCHS                        // Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported
+
+    popad                                    // Restore sector count & logical sector number
+
+ReadSectorsLBA:
+    pushad                                    // Save logical sector number & sector count
+
+    cmp  cx, 64                                // Since the LBA calls only support 0x7F sectors at a time we will limit ourselves to 64
+    jbe  ReadSectorsSetupDiskAddressPacket    // If we are reading less than 65 sectors then just do the read
+    mov  cx, 64                                // Otherwise read only 64 sectors on this loop iteration
+
+ReadSectorsSetupDiskAddressPacket:
+    mov word ptr ds:[LBASectorsRead],cx
+    push 0
+    push eax                                // Put 64-bit logical block address on stack
+    push es                                    // Put transfer segment on stack
+    push bx                                    // Put transfer offset on stack
+    push cx                                    // Set transfer count
+    push 16                            // Set size of packet to 10h
+    mov  si, sp                                // Setup disk address packet on stack
+
+    mov  dl, byte ptr ds:[BootDrive]                // Drive number
+    mov  ah, HEX(42)                                // Int 13h, AH = 42h - Extended Read
+    int  HEX(13)                                // Call BIOS
+    jc   PrintDiskError                        // If the read failed then abort
+
+    add  sp, 16                            // Remove disk address packet from stack
+
+    popad                                    // Restore sector count & logical sector number
+
+    push bx
+    mov  ebx, dword ptr ds:[LBASectorsRead]
+    add  eax, ebx                            // Increment sector to read
+    shl  ebx, 5
+    mov  dx, es
+    add  dx, bx                                // Setup read buffer for next sector
+    mov  es, dx
+    pop  bx
+
+    sub  cx, word ptr ds:[LBASectorsRead]
+    jnz  ReadSectorsLBA                        // Read next sector
+
+    ret
+
+LBASectorsRead:
+    dd    0
+
+
+// Reads logical sectors into [ES:BX]
+// EAX has logical sector number to read
+// CX has number of sectors to read
+ReadSectorsCHS:
+    popad                                        // Get logical sector number & sector count off stack
+
+ReadSectorsCHSLoop:
+    pushad
+    xor  edx, edx
+    movzx ecx, word ptr ds:[SectorsPerTrack]
+    div  ecx                                    // Divide logical by SectorsPerTrack
+    inc  dl                                    // Sectors numbering starts at 1 not 0
+    mov  cl, dl                                    // Sector in CL
+    mov  edx, eax
+    shr  edx, 16
+    div  word ptr ds:[NumberOfHeads]            // Divide logical by number of heads
+    mov  dh, dl                                    // Head in DH
+    mov  dl, byte ptr ds:[BootDrive]                // Drive number in DL
+    mov  ch, al                                    // Cylinder in CX
+    ror  ah, 1                                    // Low 8 bits of cylinder in CH, high 2 bits
+    ror  ah, 1                                    //  in CL shifted to bits 6 & 7
+    or   cl, ah                                    // Or with sector number
+    mov  ax, HEX(0201)
+    int  HEX(13)    // DISK - READ SECTORS INTO MEMORY
+                     // AL = number of sectors to read, CH = track, CL = sector
+                     // DH = head, DL    = drive, ES:BX -> buffer to fill
+                     // Return: CF set on error, AH =    status (see AH=01h), AL    = number of sectors read
+
+    jc   PrintDiskError                        // If the read failed then abort
+
+    popad
+
+    inc  eax                                    // Increment Sector to Read
+
+    mov  dx, es
+    add  dx, 32                            // Increment read buffer for next sector
+    mov  es, dx
+
+    loop ReadSectorsCHSLoop                    // Read next sector
+
+    ret
+
+// Displays a disk error message
+// And reboots
+PrintDiskError:
+    mov  si, offset msgDiskError            // Bad boot disk message
+    call PutChars                    // Display it
+
+    jmp  Reboot
+
+// Displays a file system error message
+// And reboots
+PrintFileSystemError:
+    mov  si,msgFileSystemError        // FreeLdr not found message
+    call PutChars                    // Display it
+
+Reboot:
+    mov  si, offset msgAnyKey                // Press any key message
+    call PutChars                    // Display it
+    xor  ax, ax
+    int  HEX(16)                            // Wait for a keypress
+    int  HEX(19)                            // Reboot
+
+PutChars:
+    lodsb
+    or   al, al
+    jz   short Done
+    mov  ah, HEX(0e)
+    mov  bx, 7
+    int  HEX(10)
+    jmp  short PutChars
+Done:
+    retn
+
+
+BiosCHSDriveSize:
+    dd 0
+
+msgDiskError:
+    db "Disk error", 13, 10, 0
+msgFileSystemError:
+    db "File system error", 13, 10, 0
+msgAnyKey:
+    db "Press any key to restart", 13, 10, 0
+
+//    times 509-($-$$) db 0   // Pad to 509 bytes
+.org 509 // Pad to 509 bytes
+
+BootPartition:
+        db 0
+
+BootSignature:
+        dw 0aa55h       // BootSector signature
+
+// End of bootsector
+//
+// Now starts the extra boot code that we will store
+// at sector 14 on a FAT32 volume
+//
+// To remain multi-boot compatible with other operating
+// systems we must not overwrite anything other than
+// the bootsector which means we will have to use
+// a different sector like 14 to store our extra boot code
+
+
+
+StartSearch:
+
+    // Now we must get the first cluster of the root directory
+    mov  eax, dword ptr ds:[RootDirStartCluster]
+    cmp  eax, HEX(0ffffff8)     // Check to see if this is the last cluster in the chain
+    jb   ContinueSearch       // If not continue, if so then we didn't find freeldr.sys
+    jmp  PrintFileNotFound
+
+ContinueSearch:
+    mov  bx, HEX(2000)
+    mov  es, bx             // Read cluster to [2000:0000h]
+    call ReadCluster        // Read the cluster
+
+    // Now we have to find our way through the root directory to
+    // The OSLOADER.SYS file
+    xor  bx,bx
+    mov  bl, byte ptr ds:[SectsPerCluster]
+    shl  bx, 4               // BX = BX * 512 / 32
+    mov  ax, HEX(2000)      // We loaded at 2000:0000
+    mov  es, ax
+    xor  di, di
+    mov  si, offset filename
+    mov  cx, 11
+    repe cmpsb             // Compare filenames
+    jz   FoundFile          // If same we found it
+    dec  bx
+    jnz  FindFile
+    jmp  PrintFileNotFound
+
+FindFile:
+    mov  ax, es              // We didn't find it in the previous dir entry
+    add  ax, 2               // So lets move to the next one
+    mov  es, ax              // And search again
+    xor  di, di
+    mov  si, offset filename
+    mov  cx, 11
+    repe cmpsb             // Compare filenames
+    jz   FoundFile          // If same we found it
+    dec  bx                 // Keep searching till we run out of dir entries
+    jnz  FindFile           // Last entry?
+
+    // Get the next root dir cluster and try again until we run out of clusters
+    mov  eax, dword ptr ds:[RootDirStartCluster]
+    call GetFatEntry
+    mov dword ptr ds:[RootDirStartCluster], eax
+    jmp  StartSearch
+
+FoundFile:
+                                    // Display "Loading FreeLoader..." message
+    mov  si, offset msgLoading      // Loading message
+    call PutChars                   // Display it
+
+    xor  di, di                      // ES:DI has dir entry
+    xor  dx, dx
+    mov  ax, word ptr es:[di+14h]   // Get start cluster high word
+    shl  eax, 16
+    mov  ax, word ptr es:[di+1ah]   // Get start cluster low word
+
+CheckStartCluster:
+    cmp  eax, 2                  // Check and see if the start cluster starts at cluster 2 or above
+    jnb  CheckEndCluster        // If so then continue
+    jmp  PrintFileSystemError   // If not exit with error
+CheckEndCluster:
+    cmp  eax, HEX(0ffffff8)          // Check and see if the start cluster is and end of cluster chain indicator
+    jb   InitializeLoadSegment  // If not then continue
+    jmp  PrintFileSystemError   // If so exit with error
+
+InitializeLoadSegment:
+    mov  bx, HEX(800)
+    mov  es, bx
+
+LoadFile:
+    cmp  eax, HEX(0ffffff8)          // Check to see if this is the last cluster in the chain
+    jae  LoadFileDone        // If so continue, if not then read the next one
+    push eax
+    xor  bx, bx                  // Load ROSLDR starting at 0000:8000h
+    push es
+    call ReadCluster
+    pop  es
+
+    xor  bx, bx
+    mov  bl, byte ptr ds:[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
+
+    pop  eax
+    push es
+    call GetFatEntry                            // Get the next entry
+    pop  es
+
+    jmp  LoadFile                               // Load the next cluster (if any)
+
+LoadFileDone:
+    mov  dl, byte ptr ds:[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
+
+// Returns the FAT entry for a given cluster number
+// On entry EAX has cluster number
+// On return EAX has FAT entry for that cluster
+GetFatEntry:
+
+    shl   eax, 2                             // EAX = EAX * 4 (since FAT32 entries are 4 bytes)
+    mov   ecx, eax                           // Save this for later in ECX
+    xor   edx, edx
+    movzx ebx, word ptr ds:[BytesPerSector]
+    push  ebx
+    div   ebx                               // FAT Sector Number = EAX / BytesPerSector
+    movzx ebx, word ptr ds:[ReservedSectors]
+    add   eax, ebx                           // FAT Sector Number += ReservedSectors
+    mov   ebx, dword ptr ds:[HiddenSectors]
+    add   eax, ebx                           // FAT Sector Number += HiddenSectors
+    pop   ebx
+    dec   ebx
+    and   ecx,ebx                           // FAT Offset Within Sector = ECX % BytesPerSector
+                                            // EAX holds logical FAT sector number
+                                            // ECX holds FAT entry offset
+
+                                            // Now we have to check the extended flags
+                                            // to see which FAT is the active one
+                                            // and use it, or if they are mirrored then
+                                            // no worries
+    movzx ebx, word ptr ds:[ExtendedFlags]     // Get extended flags and put into ebx
+    and   bx, HEX(0f)                       // Mask off upper 8 bits, now we have active fat in bl
+    jz    LoadFatSector                        // If fat is mirrored then skip fat calcs
+    cmp   bl, byte ptr ds:[NumberOfFats]            // Compare bl to number of fats
+    jb    GetActiveFatOffset
+    jmp   PrintFileSystemError                // If bl is bigger than numfats exit with error
+GetActiveFatOffset:
+    push  eax                                // Save logical FAT sector number
+    mov   eax, dword ptr ds:[SectorsPerFatBig]    // Get the number of sectors occupied by one fat in eax
+    mul   ebx                                // Multiplied by the active FAT index we have in ebx
+    pop   edx                                // Get logical FAT sector number
+    add   eax, edx                            // Add the current FAT sector offset
+
+LoadFatSector:
+    push  ecx
+    // EAX holds logical FAT sector number
+    // Check if we have already loaded it
+    cmp   eax, dword ptr ds:[FatSectorInCache]
+    je    LoadFatSectorAlreadyLoaded
+
+    mov   dword ptr ds:[FatSectorInCache], eax
+    mov   bx, HEX(7000)
+    mov   es, bx
+    xor   bx, bx                                // We will load it to [7000:0000h]
+    mov   cx, 1
+    call  ReadSectors
+
+LoadFatSectorAlreadyLoaded:
+    mov   bx, HEX(7000)
+    mov   es, bx
+    pop   ecx
+    mov   eax, dword ptr es:[ecx]                    // Get FAT entry
+    and   eax, HEX(0fffffff)                        // Mask off reserved bits
+
+    ret
+
+FatSectorInCache:                                // This variable tells us which sector we currently have in memory
+    dd    0ffffffffh                                // There is no need to re-read the same sector if we don't have to
+
+
+// Reads cluster number in EAX into [ES:0000]
+ReadCluster:
+    // StartSector = ((Cluster - 2) * SectorsPerCluster) + ReservedSectors + HiddenSectors//
+
+    dec   eax
+    dec   eax
+    xor   edx, edx
+    movzx ebx, byte ptr ds:[SectsPerCluster]
+    mul   ebx
+    push  eax
+    xor   edx, edx
+    movzx eax, byte ptr ds:[NumberOfFats]
+    mul   dword ptr ds:[SectorsPerFatBig]
+    movzx ebx, word ptr ds:[ReservedSectors]
+    add   eax, ebx
+    add   eax, dword ptr ds:[HiddenSectors]
+    pop   ebx
+    add   eax, ebx            // EAX now contains the logical sector number of the cluster
+    xor   bx, bx                // We will load it to [ES:0000], ES loaded before function call
+    movzx cx, byte ptr ds:[SectsPerCluster]
+    call  ReadSectors
+    ret
+
+// Displays a file not found error message
+// And reboots
+PrintFileNotFound:
+    mov  si, offset msgFreeLdr      // FreeLdr not found message
+    call PutChars           // Display it
+    mov  si, offset msgAnyKey       // Press any key message
+    call PutChars           // Display it
+
+    jmp  Reboot
+
+msgFreeLdr:
+    db "freeldr.sys not found", 13, 10, 0
+filename:
+    db "FREELDR SYS"
+msgLoading:
+    db "Loading FreeLoader...", 13, 10, 0
+
+    //times 1022-($-$$) db 0   // Pad to 1022 bytes
+
+    dw 0aa55h       // BootSector signature
+
+.endcode16
+
+END

Propchange: trunk/reactos/boot/freeldr/bootsect/fat32.S
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/reactos/gcc.cmake
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/gcc.cmake?rev=52143&r1=52142&r2=52143&view=diff
==============================================================================
--- trunk/reactos/gcc.cmake [iso-8859-1] (original)
+++ trunk/reactos/gcc.cmake [iso-8859-1] Tue Jun  7 23:22:38 2011
@@ -314,7 +314,7 @@
             list(APPEND ${_out_compile_flags} -D${item})
         endforeach()
     endif()
-	
+
 	separate_arguments(${_out_compile_flags})
 endmacro()
 
@@ -323,9 +323,32 @@
 	#get_filename_component(_basename ${_FILE} NAME)
     #set(_gch_filename ${_basename}.gch)
     #_PCH_GET_COMPILE_FLAGS(${_target_name} _args ${_header_filename})
-	
+
     #add_custom_command(OUTPUT ${_gch_filename} COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1} ${_args} DEPENDS ${_header_filename})
 	#get_target_property(_src_files ${_target_name} SOURCES)
 	#set_source_files_properties(${_src_files} PROPERTIES COMPILE_FLAGS "-Winvalid-pch -fpch-preprocess" #OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_gch_filename})
 	#add_linkerflag(${_target_name} "${_gch_filename}")
 endmacro()
+
+macro(CreateBootSectorTarget _target_name _asm_file _object_file _base_address)
+    get_filename_component(OBJECT_PATH ${_object_file} PATH)
+    get_filename_component(OBJECT_NAME ${_object_file} NAME)
+    file(MAKE_DIRECTORY ${OBJECT_PATH})
+    get_directory_property(defines COMPILE_DEFINITIONS)
+    get_directory_property(includes INCLUDE_DIRECTORIES)
+
+    foreach(arg ${defines})
+        set(result_defs ${result_defs} -D${arg})
+    endforeach()
+
+    foreach(arg ${includes})
+        set(result_incs -I${arg} ${result_incs})
+    endforeach()
+
+    add_custom_command(
+        OUTPUT ${_object_file}
+        COMMAND nasm -o ${_object_file} ${result_incs} ${result_defs} -f bin ${_asm_file}
+        DEPENDS ${_asm_file})
+    set_source_files_properties(${_object_file} PROPERTIES GENERATED TRUE)
+    add_custom_target(${_target_name} ALL DEPENDS ${_object_file})
+endmacro()

Modified: trunk/reactos/msc.cmake
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/msc.cmake?rev=52143&r1=52142&r2=52143&view=diff
==============================================================================
--- trunk/reactos/msc.cmake [iso-8859-1] (original)
+++ trunk/reactos/msc.cmake [iso-8859-1] Tue Jun  7 23:22:38 2011
@@ -191,3 +191,28 @@
 
 #pseh workaround
 set(PSEH_LIB "pseh")
+
+macro(CreateBootSectorTarget _target_name _asm_file _binary_file _base_address)
+
+    set(_object_file ${_binary_file}.obj)
+    set(_temp_file ${_binary_file}.tmp)
+
+    add_custom_command(
+        OUTPUT ${_temp_file}
+        COMMAND ${CMAKE_C_COMPILER} /nologo /X /I${REACTOS_SOURCE_DIR}/include/asm /I${REACTOS_BINARY_DIR}/include/asm /D__ASM__ /D_USE_ML /EP /c ${_asm_file} > ${_temp_file}
+        DEPENDS ${_asm_file})
+
+    add_custom_command(
+        OUTPUT ${_object_file}
+        COMMAND ml /nologo /Cp /Fo${_object_file} /c /Ta ${_temp_file}
+        DEPENDS ${_temp_file})
+
+    add_custom_command(
+        OUTPUT ${_binary_file}
+        COMMAND native-obj2bin ${_object_file} ${_binary_file} ${_base_address}
+        DEPENDS ${_object_file})
+
+    set_source_files_properties(${_object_file} ${_temp_file} ${_binary_file} PROPERTIES GENERATED TRUE)
+
+    add_custom_target(${_target_name} ALL DEPENDS ${_binary_file})
+endmacro()




More information about the Ros-diffs mailing list