diff options
Diffstat (limited to 'DuetPkg/BootSector/Mbr.S')
-rw-r--r-- | DuetPkg/BootSector/Mbr.S | 518 |
1 files changed, 259 insertions, 259 deletions
diff --git a/DuetPkg/BootSector/Mbr.S b/DuetPkg/BootSector/Mbr.S index 74852681f8..a2431e1931 100644 --- a/DuetPkg/BootSector/Mbr.S +++ b/DuetPkg/BootSector/Mbr.S @@ -1,260 +1,260 @@ -#------------------------------------------------------------------------------ -#* -#* Copyright 2006 - 2007, Intel Corporation -#* All rights reserved. This program and the accompanying materials -#* are licensed and made available under the terms and conditions of the BSD License -#* which accompanies this distribution. The full text of the license may be found at -#* http://opensource.org/licenses/bsd-license.php -#* -#* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -#* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -#* -#* Mbr.asm -#* -#* Abstract: -#* -#------------------------------------------------------------------------------ - -.equ BLOCK_SIZE, 0x0200 -.equ BLOCK_MASK, 0x01ff -.equ BLOCK_SHIFT, 9 - -# **************************************************************************** -# Code loaded by BIOS at 0x0000:0x7C00 -# **************************************************************************** - -.org 0x0 - +#------------------------------------------------------------------------------
+#*
+#* Copyright 2006 - 2007, Intel Corporation
+#* All rights reserved. This program and the accompanying materials
+#* are licensed and made available under the terms and conditions of the BSD License
+#* which accompanies this distribution. The full text of the license may be found at
+#* http://opensource.org/licenses/bsd-license.php
+#*
+#* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#*
+#* Mbr.asm
+#*
+#* Abstract:
+#*
+#------------------------------------------------------------------------------
+
+.equ BLOCK_SIZE, 0x0200
+.equ BLOCK_MASK, 0x01ff
+.equ BLOCK_SHIFT, 9
+
+# ****************************************************************************
+# Code loaded by BIOS at 0x0000:0x7C00
+# ****************************************************************************
+
+.org 0x0
+
.global _start
-_start: - -# **************************************************************************** -# Start Print -# **************************************************************************** - - movw $0xb800, %ax - movw %ax, %es - movw $0x7c0, %ax - movw %ax, %ds - leaw %cs:StartString, %si - movw $10, %cx - movw $160, %di - rep - movsw - -# **************************************************************************** -# Print over -# **************************************************************************** - -# **************************************************************************** -# Initialize segment registers and copy code at 0x0000:0x7c00 to 0x0000:0x0600 -# **************************************************************************** - xorw %ax, %ax # AX = 0x0000 - movw $0x7c00, %bx # BX = 0x7C00 - movw $0x600, %bp # BP = 0x0600 - movw RelocatedStart, %si # SI = Offset(RelocatedStart) - movw $0x200, %cx # CX = 0x0200 - subw %si, %cx # CS = 0x0200 - Offset(RelocatedStart) - leaw (%bp,%si,), %di # DI = 0x0600 + Offset(RelocatedStart) - leaw (%bx,%si,), %si # BX = 0x7C00 + Offset(RelocatedStart) - movw %ax, %ss # SS = 0x0000 - movw %bx, %sp # SP = 0x7C00 - movw %ax, %es # ES = 0x0000 - movw %ax, %ds # DS = 0x0000 - pushw %ax # PUSH 0x0000 - pushw %di # PUSH 0x0600 + Offset(RelocatedStart) - cld # Clear the direction flag - rep - movsb # Copy 0x0200 bytes from 0x7C00 to 0x0600 - retl # JMP 0x0000:0x0600 + Offset(RelocatedStart) - -# **************************************************************************** -# Code relocated to 0x0000:0x0600 -# **************************************************************************** - -RelocatedStart: -# **************************************************************************** -# Get Driver Parameters to 0x0000:0x7BFC -# **************************************************************************** - - xorw %ax, %ax # AX = 0 - movw %ax, %ss # SS = 0 - addw $0x1000, %ax - movw %ax, %ds - - movw $0x7c00, %sp # SP = 0x7c00 - movw %sp, %bp # BP = 0x7c00 - - movb $8, %ah # AH = 8 - Get Drive Parameters Function - movb %dl, PhysicalDrive(%bp) # BBS defines that BIOS would pass the booting driver number to the loader through DL - int $0x13 # Get Drive Parameters - xorw %ax, %ax # AX = 0 - movb %dh, %al # AL = DH - incb %al # MaxHead = AL + 1 - pushw %ax # 0000:7bfe = MaxHead - movb %cl, %al # AL = CL - andb $0x3f, %al # MaxSector = AL & 0x3f - pushw %ax # 0000:7bfc = MaxSector - -# **************************************************************************** -# Read Target DBR from hard disk to 0x0000:0x7C00 -# **************************************************************************** - - xorw %ax, %ax - movb MbrPartitionIndicator(%bp), %al # AX = MbrPartitionIndex - cmpb $0xff, %al # 0xFF means do legacy MBR boot - jnz EfiDbr -LegacyMbr: - movl $0x0000600, %eax # Assume LegacyMBR is backuped in Sector 6 - jmp StartReadTo7C00 # EAX = Header/Sector/Tracker/Zero - -EfiDbr: - cmpb $4, %al # MbrPartitionIndex should < 4 - jae BadDbr - shlw $4, %ax # AX = MBREntrySize * Index - addw $0x1be, %ax # AX = MBREntryOffset - movw %ax, %di # DI = MBREntryOffset - - # Here we don't use the C/H/S information provided by Partition table - # but calculate C/H/S from LBA ourselves - # Ci: Cylinder number - # Hi: Header number - # Si: Sector number - movl %es:8(%bp,%di,), %eax # Start LBA - movl %eax, %edx - shrl $16, %edx # DX:AX = Start LBA - # = Ci * (H * S) + Hi * S + (Si - 1) - - # Calculate C/H/S according to LBA - movw $0x7bfa, %bp - divw 2(%bp) # AX = Hi + H*Ci - # DX = Si - 1 - incw %dx # DX = Si - pushw %dx # 0000:7bfa = Si <---- - xorw %dx, %dx # DX:AX = Hi + H*Ci - divw 4(%bp) # AX = Ci <---- - # DX = Hi <---- - -StartReadTo7C00: - - movb (%bp), %cl # Si - movb %al, %ch # Ci[0-7] - orb %ah, %cl # Ci[8,9] - movw $0x7c00, %bx # ES:BX = 0000:7C00h - movb $0x2, %ah # Function 02h - movb $1, %al # 1 Sector - movb %dl, %dh # Hi - movw $0x600, %bp - movb PhysicalDrive(%bp), %dl # Drive number - int $0x13 - jc BadDbr - - - -# **************************************************************************** -# Transfer control to BootSector - Jump to 0x0000:0x7C00 -# **************************************************************************** - xorw %ax, %ax - pushw %ax # PUSH 0x0000 - Segment - movw $0x7c00, %di - pushw %di # PUSH 0x7C00 - Offset - retl # JMP 0x0000:0x7C00 - -# **************************************************************************** -# ERROR Condition: -# **************************************************************************** - -BadDbr: - pushw %ax - movw $0xb800, %ax - movw %ax, %es - movw $0x60, %ax - movw %ax, %ds - leaw %cs:ErrorString, %si - movw $320, %di - popw %ax - call A2C - movb %ah, 16(%si) - movb %al, 18(%si) - movw $10, %cx - rep - movsw -Halt: - jmp Halt - -StartString: -.byte 'M', 0x0c, 'B', 0x0c, 'R', 0x0c, ' ', 0x0c, 'S', 0x0c, 't', 0x0c, 'a', 0x0c, 'r', 0x0c, 't', 0x0c, '!', 0x0c -ErrorString: -.byte 'M', 0x0c, 'B', 0x0c, 'R', 0x0c, ' ', 0x0c, 'E', 0x0c, 'r', 0x0c, 'r', 0x0c, ':', 0x0c, '?', 0x0c, '?', 0x0c - -# **************************************************************************** -# A2C - convert Ascii code stored in AH to character stored in AX -# **************************************************************************** -A2C: - movb %ah, %al - shrb $4, %ah - andb $0xF, %al - addb '0', %ah - addb '0', %al - - cmpb '9', %ah - jle A2C_L1 - addb $7, %ah -A2C_L1: - - cmpb '9', %al - jle A2C_L2 - addb $7, %al -A2C_L2: - ret - - -# **************************************************************************** -# PhysicalDrive - Used to indicate which disk to be boot -# Can be patched by tool -# **************************************************************************** -.org 0x01B6 -PhysicalDrive: .byte 0x80 - -# **************************************************************************** -# MbrPartitionIndicator - Used to indicate which MBR partition to be boot -# Can be patched by tool -# OxFF means boot to legacy MBR. (LBA OFFSET 6) -# **************************************************************************** -.org 0x01B7 -MbrPartitionIndicator: .byte 0 - -# **************************************************************************** -# Unique MBR signature -# **************************************************************************** -.org 0x01B8 - .ascii "DUET" - -# **************************************************************************** -# Unknown -# **************************************************************************** -.org 0x01BC - .word 0 - -# **************************************************************************** -# MBR Entry - To be patched -# **************************************************************************** -.org 0x01BE - .long 0,0,0,0 -.org 0x01CE - .long 0,0,0,0 -.org 0x01DE - .long 0,0,0,0 -.org 0x01EE - .long 0,0,0,0 - -# **************************************************************************** -# Sector Signature -# **************************************************************************** - -.org 0x01FE -SectorSignature: - .word 0xaa55 # Boot Sector Signature - - - +_start:
+
+# ****************************************************************************
+# Start Print
+# ****************************************************************************
+
+ movw $0xb800, %ax
+ movw %ax, %es
+ movw $0x7c0, %ax
+ movw %ax, %ds
+ leaw %cs:StartString, %si
+ movw $10, %cx
+ movw $160, %di
+ rep
+ movsw
+
+# ****************************************************************************
+# Print over
+# ****************************************************************************
+
+# ****************************************************************************
+# Initialize segment registers and copy code at 0x0000:0x7c00 to 0x0000:0x0600
+# ****************************************************************************
+ xorw %ax, %ax # AX = 0x0000
+ movw $0x7c00, %bx # BX = 0x7C00
+ movw $0x600, %bp # BP = 0x0600
+ movw RelocatedStart, %si # SI = Offset(RelocatedStart)
+ movw $0x200, %cx # CX = 0x0200
+ subw %si, %cx # CS = 0x0200 - Offset(RelocatedStart)
+ leaw (%bp,%si,), %di # DI = 0x0600 + Offset(RelocatedStart)
+ leaw (%bx,%si,), %si # BX = 0x7C00 + Offset(RelocatedStart)
+ movw %ax, %ss # SS = 0x0000
+ movw %bx, %sp # SP = 0x7C00
+ movw %ax, %es # ES = 0x0000
+ movw %ax, %ds # DS = 0x0000
+ pushw %ax # PUSH 0x0000
+ pushw %di # PUSH 0x0600 + Offset(RelocatedStart)
+ cld # Clear the direction flag
+ rep
+ movsb # Copy 0x0200 bytes from 0x7C00 to 0x0600
+ retl # JMP 0x0000:0x0600 + Offset(RelocatedStart)
+
+# ****************************************************************************
+# Code relocated to 0x0000:0x0600
+# ****************************************************************************
+
+RelocatedStart:
+# ****************************************************************************
+# Get Driver Parameters to 0x0000:0x7BFC
+# ****************************************************************************
+
+ xorw %ax, %ax # AX = 0
+ movw %ax, %ss # SS = 0
+ addw $0x1000, %ax
+ movw %ax, %ds
+
+ movw $0x7c00, %sp # SP = 0x7c00
+ movw %sp, %bp # BP = 0x7c00
+
+ movb $8, %ah # AH = 8 - Get Drive Parameters Function
+ movb %dl, PhysicalDrive(%bp) # BBS defines that BIOS would pass the booting driver number to the loader through DL
+ int $0x13 # Get Drive Parameters
+ xorw %ax, %ax # AX = 0
+ movb %dh, %al # AL = DH
+ incb %al # MaxHead = AL + 1
+ pushw %ax # 0000:7bfe = MaxHead
+ movb %cl, %al # AL = CL
+ andb $0x3f, %al # MaxSector = AL & 0x3f
+ pushw %ax # 0000:7bfc = MaxSector
+
+# ****************************************************************************
+# Read Target DBR from hard disk to 0x0000:0x7C00
+# ****************************************************************************
+
+ xorw %ax, %ax
+ movb MbrPartitionIndicator(%bp), %al # AX = MbrPartitionIndex
+ cmpb $0xff, %al # 0xFF means do legacy MBR boot
+ jnz EfiDbr
+LegacyMbr:
+ movl $0x0000600, %eax # Assume LegacyMBR is backuped in Sector 6
+ jmp StartReadTo7C00 # EAX = Header/Sector/Tracker/Zero
+
+EfiDbr:
+ cmpb $4, %al # MbrPartitionIndex should < 4
+ jae BadDbr
+ shlw $4, %ax # AX = MBREntrySize * Index
+ addw $0x1be, %ax # AX = MBREntryOffset
+ movw %ax, %di # DI = MBREntryOffset
+
+ # Here we don't use the C/H/S information provided by Partition table
+ # but calculate C/H/S from LBA ourselves
+ # Ci: Cylinder number
+ # Hi: Header number
+ # Si: Sector number
+ movl %es:8(%bp,%di,), %eax # Start LBA
+ movl %eax, %edx
+ shrl $16, %edx # DX:AX = Start LBA
+ # = Ci * (H * S) + Hi * S + (Si - 1)
+
+ # Calculate C/H/S according to LBA
+ movw $0x7bfa, %bp
+ divw 2(%bp) # AX = Hi + H*Ci
+ # DX = Si - 1
+ incw %dx # DX = Si
+ pushw %dx # 0000:7bfa = Si <----
+ xorw %dx, %dx # DX:AX = Hi + H*Ci
+ divw 4(%bp) # AX = Ci <----
+ # DX = Hi <----
+
+StartReadTo7C00:
+
+ movb (%bp), %cl # Si
+ movb %al, %ch # Ci[0-7]
+ orb %ah, %cl # Ci[8,9]
+ movw $0x7c00, %bx # ES:BX = 0000:7C00h
+ movb $0x2, %ah # Function 02h
+ movb $1, %al # 1 Sector
+ movb %dl, %dh # Hi
+ movw $0x600, %bp
+ movb PhysicalDrive(%bp), %dl # Drive number
+ int $0x13
+ jc BadDbr
+
+
+
+# ****************************************************************************
+# Transfer control to BootSector - Jump to 0x0000:0x7C00
+# ****************************************************************************
+ xorw %ax, %ax
+ pushw %ax # PUSH 0x0000 - Segment
+ movw $0x7c00, %di
+ pushw %di # PUSH 0x7C00 - Offset
+ retl # JMP 0x0000:0x7C00
+
+# ****************************************************************************
+# ERROR Condition:
+# ****************************************************************************
+
+BadDbr:
+ pushw %ax
+ movw $0xb800, %ax
+ movw %ax, %es
+ movw $0x60, %ax
+ movw %ax, %ds
+ leaw %cs:ErrorString, %si
+ movw $320, %di
+ popw %ax
+ call A2C
+ movb %ah, 16(%si)
+ movb %al, 18(%si)
+ movw $10, %cx
+ rep
+ movsw
+Halt:
+ jmp Halt
+
+StartString:
+.byte 'M', 0x0c, 'B', 0x0c, 'R', 0x0c, ' ', 0x0c, 'S', 0x0c, 't', 0x0c, 'a', 0x0c, 'r', 0x0c, 't', 0x0c, '!', 0x0c
+ErrorString:
+.byte 'M', 0x0c, 'B', 0x0c, 'R', 0x0c, ' ', 0x0c, 'E', 0x0c, 'r', 0x0c, 'r', 0x0c, ':', 0x0c, '?', 0x0c, '?', 0x0c
+
+# ****************************************************************************
+# A2C - convert Ascii code stored in AH to character stored in AX
+# ****************************************************************************
+A2C:
+ movb %ah, %al
+ shrb $4, %ah
+ andb $0xF, %al
+ addb '0', %ah
+ addb '0', %al
+
+ cmpb '9', %ah
+ jle A2C_L1
+ addb $7, %ah
+A2C_L1:
+
+ cmpb '9', %al
+ jle A2C_L2
+ addb $7, %al
+A2C_L2:
+ ret
+
+
+# ****************************************************************************
+# PhysicalDrive - Used to indicate which disk to be boot
+# Can be patched by tool
+# ****************************************************************************
+.org 0x01B6
+PhysicalDrive: .byte 0x80
+
+# ****************************************************************************
+# MbrPartitionIndicator - Used to indicate which MBR partition to be boot
+# Can be patched by tool
+# OxFF means boot to legacy MBR. (LBA OFFSET 6)
+# ****************************************************************************
+.org 0x01B7
+MbrPartitionIndicator: .byte 0
+
+# ****************************************************************************
+# Unique MBR signature
+# ****************************************************************************
+.org 0x01B8
+ .ascii "DUET"
+
+# ****************************************************************************
+# Unknown
+# ****************************************************************************
+.org 0x01BC
+ .word 0
+
+# ****************************************************************************
+# MBR Entry - To be patched
+# ****************************************************************************
+.org 0x01BE
+ .long 0,0,0,0
+.org 0x01CE
+ .long 0,0,0,0
+.org 0x01DE
+ .long 0,0,0,0
+.org 0x01EE
+ .long 0,0,0,0
+
+# ****************************************************************************
+# Sector Signature
+# ****************************************************************************
+
+.org 0x01FE
+SectorSignature:
+ .word 0xaa55 # Boot Sector Signature
+
+
+
|