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/CMak…
==============================================================================
--- 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…
==============================================================================
--- 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