]> git.proxmox.com Git - mirror_edk2.git/blobdiff - DuetPkg/BootSector/start.S
DuetPkg BootSector:
[mirror_edk2.git] / DuetPkg / BootSector / start.S
index d558652a9ad9d7ff0608525acc0e9d1fb7ec8279..f96d06e14491326dc6767f37f9240a2906dce5d2 100644 (file)
@@ -1,7 +1,7 @@
 #------------------------------------------------------------------------------\r
 #*\r
-#*   Copyright 2006 - 2007, Intel Corporation                                                         \r
-#*   All rights reserved. This program and the accompanying materials                          \r
+#*   Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+#*   This program and the accompanying materials                          \r
 #*   are licensed and made available under the terms and conditions of the BSD License         \r
 #*   which accompanies this distribution.  The full text of the license may be found at        \r
 #*   http://opensource.org/licenses/bsd-license.php                                            \r
 #*\r
 #------------------------------------------------------------------------------\r
 \r
-\r
-\r
-\r
-\r
-               \r
+        .stack: \r
+        .486p: \r
+        .code16\r
+    \r
 .equ                        FAT_DIRECTORY_ENTRY_SIZE, 0x020\r
 .equ                        FAT_DIRECTORY_ENTRY_SHIFT, 5\r
 .equ                        BLOCK_SIZE, 0x0200\r
 .equ                        BLOCK_SHIFT, 9\r
 \r
        .org 0x0\r
+\r
+.global _start\r
+_start:\r
+\r
 Ia32Jump: \r
   jmp   BootSectorEntryPoint  # JMP inst    - 3 bytes\r
   nop\r
@@ -74,7 +77,7 @@ BootSectorEntryPoint:
 NoVarStore: \r
         pushw   %es\r
 # Set the 5th byte start @ 0:19000 to non-zero indicating we should init var store header in DxeIpl\r
-        movb    %al, %es:($4)\r
+        movb    %al, %es:(4)\r
         jmp     SaveVolumeId\r
 \r
 CheckVarStoreSize: \r
@@ -85,7 +88,7 @@ CheckVarStoreSize:
 \r
 LoadVarStore: \r
         movb    $0, %al\r
-        movb    %al, %es:($4)\r
+        movb    %al, %es:(4)\r
         movw    (%di), %cx\r
 #       ES:DI = 1500:0\r
         xorw    %di, %di\r
@@ -96,9 +99,9 @@ LoadVarStore:
 SaveVolumeId: \r
         popw    %es\r
         movw    VolId(%bp), %ax\r
-        movw    %ax, %es:($0)                       # Save Volume Id to 0:19000. we will find the correct volume according to this VolumeId\r
+        movw    %ax, %es:(0)                    # Save Volume Id to 0:19000. we will find the correct volume according to this VolumeId\r
         movw    VolId+2(%bp), %ax\r
-        movw    %ax, %es:($2)\r
+        movw    %ax, %es:(2)\r
 \r
 # Read Efildr\r
         popw    %cx\r
@@ -219,7 +222,7 @@ FoundLastCluster:
 \r
 ReadBlocks: \r
         pusha\r
-        addl    LBAOffsetForBootSector(%bp), %eax            # Add LBAOffsetForBootSector to Start LBA\r
+        addl    LBAOffsetForBootSector(%bp), %eax   # Add LBAOffsetForBootSector to Start LBA\r
         addl    HiddenSectors(%bp), %eax            # Add HiddenSectors to Start LBA\r
         movl    %eax, %esi                          # esi = Start LBA\r
         movw    %bx, %cx                            # cx = Number of blocks to read\r
@@ -240,7 +243,7 @@ ReadCylinderLoop:
 LimitTransfer: \r
         pushw   %ax                                 # save ax\r
         movw    %es, %ax                            # ax = es\r
-        shrw    %ax                                 # ax = Number of blocks into mem system\r
+        shrw    $(BLOCK_SHIFT-4), %ax               # ax = Number of blocks into mem system\r
         andw    $0x7f, %ax                          # ax = Number of blocks into current seg\r
         addw    %bx, %ax                            # ax = End Block number of transfer\r
         cmpw    $0x80, %ax                          # See if it crosses a 64K boundry\r
@@ -272,7 +275,7 @@ NotCrossing64KBoundry:
         addl    %ebx, %esi                          # StartLBA = StartLBA + NumberOfBlocks\r
         subw    %bx, %cx                            # Blocks = Blocks - NumberOfBlocks\r
         movw    %es, %ax\r
-        shlw    %bx\r
+        shlw    $(BLOCK_SHIFT-4), %bx\r
         addw    %bx, %ax\r
         movw    %ax, %es                            # es:di = es:di + NumberOfBlocks*BLOCK_SIZE\r
         cmpw    $0, %cx\r
@@ -299,11 +302,11 @@ Halt:
 ErrorString: \r
         .byte 'S', 0x0c, 'E', 0x0c, 'r', 0x0c, 'r', 0x0c, 'o', 0x0c, 'r', 0x0c, '!',0x0c\r
 \r
-        .org     0x0241 # For Code size overflow, Modified this just for pass build\r
+        .org     0x01fa\r
 LBAOffsetForBootSector: \r
         .long   0x0\r
 \r
-        #.org    0x0227  # For Code size overflow, Modified this just for pass build\r
+        .org    0x01fe\r
         .word   0xaa55\r
 \r
 #******************************************************************************\r
@@ -316,7 +319,7 @@ LBAOffsetForBootSector:
 .equ                 WRITE_DATA_PORT_CMD, 0x0d1  # 8042 command to write the data port\r
 .equ                 ENABLE_A20_CMD, 0x0df       # 8042 command to enable A20\r
 \r
-        #.org     0x200\r
+        .org     0x200\r
         jmp start\r
 Em64String: \r
         .byte 'E', 0x0c, 'm', 0x0c, '6', 0x0c, '4', 0x0c, 'T', 0x0c, ' ', 0x0c, 'U', 0x0c, 'n', 0x0c, 's', 0x0c, 'u', 0x0c, 'p', 0x0c, 'p', 0x0c, 'o', 0x0c, 'r', 0x0c, 't', 0x0c, 'e', 0x0c, 'd', 0x0c, '!', 0x0c\r
@@ -354,11 +357,11 @@ MemMapDone:
         xorl    %ebx, %ebx\r
         movw    %cs, %bx                    # BX=segment\r
         shll    $4, %ebx                    # BX="linear" address of segment base\r
-        leal    GDT_BASE(%ebx), %eax        #\r
-        movl    %eax, (gdtr + 2)            #\r
-        leal    IDT_BASE(%ebx), %eax        #\r
-        movl    %eax, (idtr + 2)            #\r
-        leal    MemoryMapSize(%ebx), %edx   #\r
+        leal    GDT_BASE(%ebx), %eax        # EAX=PHYSICAL address of gdt\r
+        movl    %eax, (gdtr + 2)            # Put address of gdt into the gdtr\r
+        leal    IDT_BASE(%ebx), %eax        # EAX=PHYSICAL address of idt\r
+        movl    %eax, (idtr + 2)            # Put address of idt into the idtr\r
+        leal    MemoryMapSize(%ebx), %edx   # Physical base address of the memory map\r
 \r
         addl $0x1000, %ebx                  # Source of EFI32\r
         movl %ebx, JUMP+2\r
@@ -401,6 +404,7 @@ Timeout8042:
 \r
 \r
 A20GateEnabled: \r
+        movw    $0x0008, %bx                # Flat data descriptor\r
 \r
 #\r
 # DISABLE INTERRUPTS - Entering Protected Mode\r
@@ -422,11 +426,6 @@ A20GateEnabled:
         movl    %cr0, %eax\r
         orb     $1, %al\r
         movl    %eax, %cr0\r
-\r
-        movl $0x008, %eax                   # Flat data descriptor\r
-        movl $0x00400000, %ebp              # Destination of EFILDR32\r
-        movl $0x00070000, %ebx              # Length of copy\r
-\r
 JUMP: \r
 # jmp far 0010:00020000\r
         .byte 0x66\r
@@ -447,7 +446,7 @@ Empty8042Loop:
 # data\r
 ##############################################################################\r
 \r
-        .align 0x2\r
+        .p2align 1\r
 \r
         gdtr:    .long  GDT_END - GDT_BASE - 1  # GDT limit \r
         .long 0                                 # (GDT base gets set above)\r
@@ -455,7 +454,7 @@ Empty8042Loop:
 #   global descriptor table (GDT)\r
 ##############################################################################\r
 \r
-        .align 0x2\r
+        .p2align 1\r
 \r
 GDT_BASE: \r
 # null descriptor\r
@@ -532,7 +531,7 @@ GDT_BASE:
 \r
 GDT_END: \r
 \r
-        .align 0x2\r
+        .p2align 1\r
 \r
 \r
 \r
@@ -548,7 +547,7 @@ idtr:  .long  IDT_END - IDT_BASE - 1 # IDT limit
 ##############################################################################\r
 \r
 #idt_tag db "IDT",0     \r
-        .align 0x2\r
+        .p2align 1\r
 \r
 IDT_BASE: \r
 # divide by zero (INT 0)\r
@@ -712,7 +711,7 @@ IDT_BASE:
         .word 0            # offset 31:16\r
 \r
 # 85 unspecified descriptors, First 12 of them are reserved, the rest are avail\r
-               .fill 85 * 8, 1, 0   # db (85 * 8) dup(0)\r
+    .fill 85 * 8, 1, 0   # db (85 * 8) dup(0)\r
 \r
 # IRQ 0 (System timer) - (INT 0x68)\r
 .equ                IRQ0_SEL, .-IDT_BASE\r
@@ -844,7 +843,7 @@ IDT_BASE:
 \r
 IDT_END: \r
 \r
-        .align 0x2\r
+        .p2align 1\r
 \r
 MemoryMapSize:  .long 0\r
 MemoryMap:  .long 0,0,0,0,0,0,0,0\r