Author: tkreuzer
Date: Sun Oct  2 19:45:41 2011
New Revision: 53938

URL: http://svn.reactos.org/svn/reactos?rev=53938&view=rev
Log:
[EXT2]
Fix remaining issues, bootsector compiles with GAS and ML. Sadly GAs sucks a 
bit and does neither allow to specify byte offsets, nor does it chose this 
itself to save space. As a result the code gets several bytes larger and I had 
to trim the messages even more.

Modified:
    trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt
    trunk/reactos/boot/freeldr/bootsect/ext2.S

Modified: trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt?rev=53938&r1=53937&r2=53938&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt [iso-8859-1] Sun Oct  2 
19:45:41 2011
@@ -2,7 +2,7 @@
 if(ARCH MATCHES i386 OR ARCH MATCHES amd64)
 
 CreateBootSectorTarget2(dosmbr ${CMAKE_CURRENT_SOURCE_DIR}/dosmbr.S 
${CMAKE_CURRENT_BINARY_DIR}/dosmbr.bin 7c00)
-#CreateBootSectorTarget2(ext2 ${CMAKE_CURRENT_SOURCE_DIR}/ext2.S 
${CMAKE_CURRENT_BINARY_DIR}/ext2.bin 0)
+CreateBootSectorTarget2(ext2 ${CMAKE_CURRENT_SOURCE_DIR}/ext2.S 
${CMAKE_CURRENT_BINARY_DIR}/ext2.bin 0)
 CreateBootSectorTarget2(fat32 ${CMAKE_CURRENT_SOURCE_DIR}/fat32.S 
${CMAKE_CURRENT_BINARY_DIR}/fat32.bin 7c00)
 CreateBootSectorTarget2(fat ${CMAKE_CURRENT_SOURCE_DIR}/fat.S 
${CMAKE_CURRENT_BINARY_DIR}/fat.bin 7c00)
 CreateBootSectorTarget2(isoboot ${CMAKE_CURRENT_SOURCE_DIR}/isoboot.S 
${CMAKE_CURRENT_BINARY_DIR}/isoboot.bin 7000)
@@ -13,11 +13,7 @@
 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)
-
-if(NOT MSVC)
-    CreateBootSectorTarget(ext2 ${CMAKE_CURRENT_SOURCE_DIR}/ext2.asm 
${CMAKE_CURRENT_BINARY_DIR}/ext2.bin 0)
-    add_cd_file(TARGET ext2 DESTINATION loader NO_CAB FILE 
${CMAKE_CURRENT_BINARY_DIR}/ext2.bin FOR all)
-endif()
+add_cd_file(TARGET ext2 DESTINATION loader NO_CAB FILE 
${CMAKE_CURRENT_BINARY_DIR}/ext2.bin FOR all)
 
 endif()
 

Modified: trunk/reactos/boot/freeldr/bootsect/ext2.S
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/bootsect/ext2.S?rev=53938&r1=53937&r2=53938&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/bootsect/ext2.S [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/bootsect/ext2.S [iso-8859-1] Sun Oct  2 19:45:41 
2011
@@ -7,6 +7,9 @@
 // [bp-0x0c] Here we will store the size of the disk as the BIOS reports in 
CHS form
 // [bp-0x10] Here we will store the number of LBA sectors read
 
+#include <asm.inc>
+.code16
+
 SECTORS_PER_TRACK              = HEX(04)
 NUMBER_OF_HEADS                        = HEX(08)
 BIOS_CHS_DRIVE_SIZE            = HEX(0C)
@@ -18,40 +21,46 @@
 EXT2_S_IFREG                   = HEX(080)
 
 
-org 7c00h
-
-segment .text
-
-bits 16
+//org 7c00h
+
 
 start:
         jmp short main
         nop
 
-BootDrive                              db HEX(80)
+BootDrive:
+       .byte HEX(80)
 //BootPartition                        db 0                                    
// Moved to end of boot sector to have a standard format across all boot sectors
 //SectorsPerTrack              db 63                                   // 
Moved to [bp-SECTORS_PER_TRACK]
 //NumberOfHeads                        dw 16                                   
// Moved to [bp-NUMBER_OF_HEADS]
 //BiosCHSDriveSize             dd (1024 * 1024 * 63)   // Moved to 
[bp-BIOS_CHS_DRIVE_SIZE]
 //LBASectorsRead                       dd 0                                    
// Moved to [bp-LBA_SECTORS_READ]
 
-Ext2VolumeStartSector  dd 263088                               // Start sector 
of the ext2 volume
-Ext2BlockSize                  dd 2                                    // 
Block size in sectors
-Ext2BlockSizeInBytes   dd 1024                                 // Block size 
in bytes
-Ext2PointersPerBlock   dd 256                                  // Number of 
block pointers that can be contained in one block
-Ext2GroupDescPerBlock  dd 32                                   // Number of 
group descriptors per block
-Ext2FirstDataBlock             dd 1                                    // 
First data block (1 for 1024-byte blocks, 0 for bigger sizes)
-Ext2InodesPerGroup             dd 2048                                 // 
Number of inodes per group
-Ext2InodesPerBlock             dd 8                                    // 
Number of inodes per block
+Ext2VolumeStartSector:
+       .long 263088                            // Start sector of the ext2 
volume
+Ext2BlockSize:
+       .long 2                                 // Block size in sectors
+Ext2BlockSizeInBytes:
+       .long 1024                                      // Block size in bytes
+Ext2PointersPerBlock:
+       .long 256                                       // Number of block 
pointers that can be contained in one block
+Ext2GroupDescPerBlock:
+       .long 32                                        // Number of group 
descriptors per block
+Ext2FirstDataBlock:
+       .long 1                                 // First data block (1 for 
1024-byte blocks, 0 for bigger sizes)
+Ext2InodesPerGroup:
+       .long 2048                                      // Number of inodes per 
group
+Ext2InodesPerBlock:
+       .long 8                                 // Number of inodes per block
 
 Ext2ReadEntireFileLoadSegment:
-       dw      0
+       .word   0
 Ext2InodeIndirectPointer:
-       dd      0
+       .long   0
 Ext2InodeDoubleIndirectPointer:
-       dd      0
+       .long   0
 Ext2BlocksLeftToRead:
-       dd      0
+       .long   0
 
 main:
         xor ax,ax               // Setup segment registers
@@ -61,16 +70,16 @@
                mov bp, HEX(7c00)
         mov sp, HEX(7b00)            // Setup a stack
 
-
-               cmp byte ptr [bp+BootDrive], HEX(0ff)   // If they have 
specified a boot drive then use it
+        mov si, offset BootDrive
+               cmp byte ptr [si], HEX(0ff)     // If they have specified a 
boot drive then use it
                jne GetDriveParameters
 
-        mov [bp+BootDrive],dl                          // Save the boot drive
+        mov [si],dl                            // Save the boot drive
 
 
 GetDriveParameters:
-               mov  ah,08h
-               mov  dl,[bp+BootDrive]                                  // Get 
boot drive in dl
+               mov  ah, 8
+               mov  dl,[si]                                    // 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
 
@@ -125,7 +134,7 @@
                shl   eax,5                                                     
                        // Group = (Group * sizeof(GROUP_DESCRIPTOR) /* 32 */)
                xor   edx,edx
                div   dword ptr [bp+Ext2GroupDescPerBlock]              // 
Group = (Group / Ext2GroupDescPerBlock)
-               add   eax, [bp+Ext2FirstDataBlock]      // Group = Group + 
Ext2FirstDataBlock + 1
+               add   eax, dword ptr [bp+Ext2FirstDataBlock]    // Group = 
Group + Ext2FirstDataBlock + 1
                inc   eax                                                       
                        // EAX now has the group descriptor block number
                                                                                
                                // EDX now has the group descriptor offset in 
the block
 
@@ -142,10 +151,10 @@
                // Instead of using the call instruction we will
                // just put Ext2ReadBlock right after this routine
 
-// Reads ext2 block into [ES:BX]
+// Reads ext2 block into ES:[BX]
 // EAX has logical block number to read
 Ext2ReadBlock:
-               mov   ecx, [bp+Ext2BlockSize]
+               mov   ecx, dword ptr [bp+Ext2BlockSize]
                mul   ecx
                jmp   ReadSectors
 
@@ -193,11 +202,11 @@
                ret
 
 
-// Reads logical sectors into [ES:BX]
+// Reads logical sectors into ES:[BX]
 // EAX has logical sector number to read
 // CX has number of sectors to read
 ReadSectors:
-        add  eax, [bp+Ext2VolumeStartSector]   // Add the start of the volume
+        add  eax, dword ptr [bp+Ext2VolumeStartSector] // Add the start of the 
volume
                cmp  eax, [bp-BIOS_CHS_DRIVE_SIZE]              // 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
@@ -208,7 +217,7 @@
 CheckInt13hExtensions:                                                 // Now 
check if this computer supports extended reads
                mov  ah, HEX(41)                                                
// AH = 41h
                mov  bx, HEX(55aa)                                              
// BX = 55AAh
-               mov  dl,[bp+BootDrive]                                  // DL = 
drive (80h-FFh)
+               mov  dl, byte ptr [bp+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
@@ -228,7 +237,7 @@
 ReadSectorsSetupDiskAddressPacket:
                mov  [bp-LBA_SECTORS_READ],cx
                mov  word ptr [bp-LBA_SECTORS_READ+2],0
-               o32 push 0
+               data32 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
@@ -237,9 +246,9 @@
                mov  si,sp                                                      
        // Setup disk address packet on stack
 
 
-        mov  dl, [bp+BootDrive]                                        // 
Drive number
-               mov  ah,42h                                                     
        // Int 13h, AH = 42h - Extended Read
-               int  13h                                                        
        // Call BIOS
+        mov  dl, byte ptr [bp+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
@@ -247,7 +256,7 @@
                popad                                                           
        // Restore sector count & logical sector number
 
                push bx
-               mov  ebx,DWORD [bp-LBA_SECTORS_READ]
+               mov  ebx, [bp-LBA_SECTORS_READ]
         add  eax,ebx                                                   // 
Increment sector to read
                shl  ebx,5
         mov  dx,es
@@ -261,7 +270,7 @@
         ret
 
 
-// Reads logical sectors into [ES:BX]
+// Reads logical sectors into ES:[BX]
 // EAX has logical sector number to read
 // CX has number of sectors to read
 ReadSectorsCHS:
@@ -270,15 +279,15 @@
 ReadSectorsCHSLoop:
         pushad
         xor   edx,edx
-               mov   ecx,DWORD [bp-SECTORS_PER_TRACK]
+               mov   ecx, [bp-SECTORS_PER_TRACK]
                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 [bp-NUMBER_OF_HEADS]                // Divide logical by 
number of heads
+        div   word ptr [bp-NUMBER_OF_HEADS]            // Divide logical by 
number of heads
         mov   dh,dl                                                            
        // Head in DH
-        mov   dl,[bp+BootDrive]                                // Drive number 
in DL
+        mov   dl, byte ptr [bp+BootDrive]                              // 
Drive number in DL
         mov   ch,al                                                            
        // Cylinder in CX
         ror   ah,2                                                             
        // Low 8 bits of cylinder in CH, high 2 bits
                                                                                
        //  in CL shifted to bits 6 & 7
@@ -316,8 +325,8 @@
         mov  si,msgAnyKey                              // Press any key message
         call PutChars                                  // Display it
         xor ax,ax
-        int 16h                                                        // Wait 
for a keypress
-        int 19h                                                        // 
Reboot
+        int HEX(16)                                                    // Wait 
for a keypress
+        int HEX(19)                                                    // 
Reboot
 
 PutChars:
         lodsb
@@ -326,16 +335,16 @@
                call PutCharsCallBios
         jmp short PutChars
 PutCharsCallBios:
-        mov ah,0eh
-        mov bx,07h
-        int 10h
-               retn
+        mov ah, HEX(0e)
+        mov bx, HEX(07)
+        int HEX(10)
+               ret
 Done:
-               mov al,0dh
+               mov al, HEX(0d)
                call PutCharsCallBios
-               mov al,0ah
+               mov al, HEX(0a)
                call PutCharsCallBios
-        retn
+        ret
 
 
 
@@ -344,14 +353,15 @@
 // Sorry, need the space...
 //msgAnyKey                    db 'Press any key to restart',0
 msgAnyKey:
-    .ascii "Press any key", NUL
-
-        times 509-($-$$) db 0   // Pad to 509 bytes
+    .ascii "Press key", NUL
+
+//    times 509-($-$$) db 0   // Pad to 509 bytes
+    .org 509
 
 BootPartition:
-    db 0
-
-        dw HEX(0aa55)       // BootSector signature
+    .byte 0
+
+    .word HEX(0aa55)       // BootSector signature
 
 
 // End of bootsector
@@ -367,14 +377,14 @@
                call Ext2ReadInode                              // Read in the 
inode
 
                // Point ES:DI to the inode structure at 6000:8000
-               push WORD HEX(6000)
+               push HEX(6000)
                pop  es
                mov  di, HEX(8000)
                push di
                push es                                                 // Save 
these for later
 
                // Get root directory size from inode structure
-               mov  eax, [es:di+4]
+               mov  eax, es:[di+4]
                push eax
 
                // Now that the inode has been read in load
@@ -410,7 +420,7 @@
                jz   FoundFile
 
                // Nope, didn't find it in this entry, keep looking
-               movzx ecx,word ptr [es:di+4]
+               movzx ecx,word ptr es:[di+4]
                add   edx,ecx
 
                // Check to see if we have reached the
@@ -420,14 +430,14 @@
                jmp  PrintFileNotFound
 
 FoundFile:
-               mov  eax,[es:di]                                // Get inode 
number from directory entry
+               mov  eax,es:[di]                                // Get inode 
number from directory entry
                call Ext2ReadInode                              // Read in the 
inode
 
                // Point ES:DI to the inode structure at 6000:8000
                pop  es
                pop  di                                                 // 
These were saved earlier
 
-               mov  cx,[es:di]                                 // Get the file 
mode so we can make sure it's a regular file
+               mov  cx, es:[di]                                        // Get 
the file mode so we can make sure it's a regular file
                and  ch,EXT2_S_IFMT                             // Mask off 
everything but the file type
                cmp  ch,EXT2_S_IFREG                    // Make sure it's a 
regular file
                je   LoadFreeLoader
@@ -439,8 +449,8 @@
 
                call Ext2ReadEntireFile                 // Read freeldr.sys to 
0000:8000
 
-        mov  dl,[bp+BootDrive]
-               mov  dh,[bp+BootPartition]
+        mov  dl, byte ptr [bp+BootDrive]
+               mov  dh, byte ptr [bp+BootPartition]
                push 0                                          // push segment 
(0x0000)
                mov eax, [HEX(8000) + HEX(0A8)] // load the RVA of the 
EntryPoint into eax
                add eax, HEX(8000)                              // RVA -> VA
@@ -470,7 +480,7 @@
                // We will do this by rounding the
                // file size up to the next block
                // size and then dividing by the block size
-               mov  eax,DWORD [bp+Ext2BlockSizeInBytes]                // Get 
the block size in bytes
+               mov  eax, dword ptr [bp+Ext2BlockSizeInBytes]           // Get 
the block size in bytes
                push eax
                dec  eax                                                        
                                // Ext2BlockSizeInBytes -= 1
                add  eax, es:[di+4]                                             
        // Add the file size
@@ -480,22 +490,22 @@
                push eax
 
                // Make sure the file size isn't zero
-               cmp  eax,byte 0
+               cmp  eax, 0
                jnz  Ext2ReadEntireFile2
                jmp  PrintFileSizeError
 
 Ext2ReadEntireFile2:
                // Save the indirect & double indirect pointers
-               mov  edx,DWORD [es:di+ HEX(58)]                                 
                // Get indirect pointer
-               mov  [bp+Ext2InodeIndirectPointer],edx                  // Save 
indirect pointer
-               mov  edx,DWORD [es:di+ HEX(5c)]                                 
                // Get double indirect pointer
-               mov  [bp+Ext2InodeDoubleIndirectPointer],edx    // Save double 
indirect pointer
+               mov  edx, es:[di+ HEX(58)]                                      
                // Get indirect pointer
+               mov dword ptr [bp+Ext2InodeIndirectPointer], edx                
        // Save indirect pointer
+               mov  edx, es:[di+ HEX(5c)]                                      
                // Get double indirect pointer
+               mov dword ptr [bp+Ext2InodeDoubleIndirectPointer],edx   // Save 
double indirect pointer
 
                // Now copy the direct pointers to 7000:0000
                // so that we can call Ext2ReadDirectBlocks
                push ds                                                         
                                // Save DS
                push es
-               push WORD HEX(7000)
+               push HEX(7000)
                pop  es
                pop  ds
                mov  si, HEX(8028)
@@ -513,15 +523,15 @@
 
                // Check to see if we actually have
                // blocks left to read
-               cmp  eax,byte 0
+               cmp  eax, 0
                jz   Ext2ReadEntireFileDone
 
                // Now we have read all the direct blocks in
                // the inode. So now we have to read the indirect
                // block and read all it's direct blocks
                push eax                                                        
                                // Save the total block count
-               mov  eax,DWORD [BYTE bp+Ext2InodeIndirectPointer]       // Get 
the indirect block pointer
-               push WORD HEX(7000)
+               mov  eax, dword ptr [bp+Ext2InodeIndirectPointer]       // Get 
the indirect block pointer
+               push HEX(7000)
                pop  es
                xor  bx,bx                                                      
                                // Set the load address to 7000:0000
                call Ext2ReadBlock                                              
                        // Read the block
@@ -529,7 +539,7 @@
                // Now we have all the block pointers from the
                // indirect block in the right location so read them in
                pop  eax                                                        
                                // Restore the total block count
-               mov  ecx,DWORD [BYTE bp+Ext2PointersPerBlock]           // Get 
the number of block pointers that one block contains
+               mov  ecx, dword ptr [bp+Ext2PointersPerBlock]           // Get 
the number of block pointers that one block contains
                call Ext2ReadDirectBlockList
 
                // Check to see if we actually have
@@ -542,9 +552,9 @@
                // we have to read the double indirect block
                // and read all it's indirect blocks
                // (whew, it's a good thing I don't support triple indirect 
blocks)
-               mov  [bp+Ext2BlocksLeftToRead],eax                              
// Save the total block count
-               mov  eax,DWORD [bp+Ext2InodeDoubleIndirectPointer]      // Get 
the double indirect block pointer
-               push WORD HEX(7800)
+               mov dword ptr [bp+Ext2BlocksLeftToRead],eax                     
        // Save the total block count
+               mov eax, dword ptr [bp+Ext2InodeDoubleIndirectPointer]  // Get 
the double indirect block pointer
+               push HEX(7800)
                pop  es
                push es                                                         
                                // Save an extra copy of this value on the stack
                xor  bx,bx                                                      
                                // Set the load address to 7000:8000
@@ -554,28 +564,28 @@
                xor  di,di
 
 Ext2ReadIndirectBlock:
-               mov  eax,DWORD [es:di]                                          
                // Get indirect block pointer
-               add  di,BYTE 4                                                  
                        // Update DI for next array index
+               mov  eax, es:[di]                                               
                // Get indirect block pointer
+               add  di, 4                                                      
                        // Update DI for next array index
                push es
                push di
 
-               push WORD HEX(7000)
+               push HEX(7000)
                pop  es
                xor  bx,bx                                                      
                                // Set the load address to 7000:0000
                call Ext2ReadBlock                                              
                        // Read the indirect block
 
                // Now we have all the block pointers from the
                // indirect block in the right location so read them in
-               mov  eax,DWORD [bp+Ext2BlocksLeftToRead]                // 
Restore the total block count
-               mov  ecx,DWORD [bp+Ext2PointersPerBlock]                // Get 
the number of block pointers that one block contains
+               mov  eax, dword ptr [bp+Ext2BlocksLeftToRead]           // 
Restore the total block count
+               mov  ecx, dword ptr [bp+Ext2PointersPerBlock]           // Get 
the number of block pointers that one block contains
                call Ext2ReadDirectBlockList
-               mov  [bp+Ext2BlocksLeftToRead],eax                              
// Save the total block count
+               mov  dword ptr [bp+Ext2BlocksLeftToRead],eax                    
        // Save the total block count
                pop  di
                pop  es
 
                // Check to see if we actually have
                // blocks left to read
-               cmp  eax,byte 0
+               cmp  eax, 0
                jnz  Ext2ReadIndirectBlock
 
 Ext2ReadEntireFileDone:
@@ -606,12 +616,12 @@
 // CX contains the number of blocks to read
 Ext2ReadDirectBlocks:
 
-               push WORD HEX(7000)
+               push HEX(7000)
                pop  es
                xor  di,di                                                      
                                // Set ES:DI = 7000:0000
 
 Ext2ReadDirectBlocksLoop:
-               mov  eax,[es:di]                                                
                        // Get direct block pointer from array
+               mov  eax,es:[di]                                                
                        // Get direct block pointer from array
                add  di, 4                                                      
                        // Update DI for next array index
 
                push cx                                                         
                                // Save number of direct blocks left
@@ -660,14 +670,17 @@
 msgFreeLdr:
     .ascii "freeldr.sys not found", NUL
 msgFileSize:
-    .ascii "File size is 0", NUL
+    .ascii "File size 0", NUL
 msgRegFile:
     .ascii "freeldr.sys isnt a regular file", NUL
 filename:
     .ascii "freeldr.sys"
 msgLoading:
-    .ascii "Loading FreeLoader...", NUL
-
-        times 1022-($-$$) db 0   // Pad to 1022 bytes
-
-        dw HEX(0aa55)       // BootSector signature
+    .ascii "Loading...", NUL
+
+//        times 1022-($-$$) db 0   // Pad to 1022 bytes
+.org 1022
+
+    .word HEX(0aa55)       // BootSector signature
+
+END


Reply via email to