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

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Sun Oct 2 19:45:41 UTC 2011


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




More information about the Ros-diffs mailing list