Fix the issue GCC DUET x64 cannot boot to front page but reset when timer interrupt...
authorniruiyu <niruiyu@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 28 Jan 2010 03:07:36 +0000 (03:07 +0000)
committerniruiyu <niruiyu@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 28 Jan 2010 03:07:36 +0000 (03:07 +0000)
I created the correct IDT and GDT which was wrongly created before.
Comments were updated to reflect the actual meaning of the code and IDT alignment was set to 8 byte.
Some unnecessary alginments were removed.
DUET x64 MSFT and GCC both can boot to front page now.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9845 6f19259b-4bc3-4df7-8a09-765794883524

DuetPkg/CpuDxe/X64/CpuInterrupt.S
DuetPkg/CpuDxe/X64/CpuInterrupt.asm
DuetPkg/EfiLdr/EfiLdr.inf

index 61de8e8e19c439abaf448a6d634b4a158566f2c6..eb92bc8b4261e242551e8c36ed363824d8d674fd 100755 (executable)
@@ -1,6 +1,6 @@
 #------------------------------------------------------------------------------\r
 #*\r
-#*   Copyright 2006, Intel Corporation                                                         \r
+#*   Copyright 2006 - 2010, Intel Corporation                                                         \r
 #*   All rights reserved. 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
@@ -204,6 +204,7 @@ INT19:
 \r
 INTUnknown:\r
   # The following segment repeats (32 - 20) times:\r
+  # macro .rept isn't used here because Apple GAS compiler doesn't support it.\r
   # No. 1\r
     push     $0x0      # push error code place holder on the stack\r
 #    push    xxh     # push vector number\r
@@ -429,7 +430,6 @@ ExceptionDone:
   addq    $(4*8+8), %rsp\r
 \r
   cli\r
-  \r
 ## UINT64  ExceptionData#\r
   addq    $8, %rsp\r
 \r
@@ -520,28 +520,27 @@ ExceptionDone:
 ##############################################################################\r
 \r
   .data\r
-    .p2align 4\r
 \r
 gdtr: .short GDT_END - GDT_BASE - 1   # GDT limit\r
-        .quad 0                         # (GDT base gets set above)\r
+      .quad 0                         # (GDT base gets set above)\r
 ##############################################################################\r
 #   global descriptor table (GDT)\r
 ##############################################################################\r
 \r
-        .p2align 4\r
+        .p2align 4                      # make GDT 16-byte align\r
 \r
 GDT_BASE:\r
 # null descriptor\r
-NULL_SEL            = .-GDT_BASE\r
-        .short 0            # limit 15:0\r
-        .short 0            # base 15:0\r
-        .byte 0             # base 23:16\r
-        .byte 0             # type\r
-        .byte 0             # limit 19:16, flags\r
-        .byte 0             # base 31:24\r
+NULL_SEL          = .-GDT_BASE          # Selector [0x0]\r
+        .short 0             # limit 15:0\r
+        .short 0             # base 15:0\r
+        .byte 0              # base 23:16\r
+        .byte 0              # type\r
+        .byte 0              # limit 19:16, flags\r
+        .byte 0              # base 31:24\r
 \r
 # linear data segment descriptor\r
-LINEAR_SEL      = .-GDT_BASE\r
+LINEAR_SEL        = .-GDT_BASE          # Selector [0x8]\r
         .short 0x0FFFF       # limit 0xFFFFF\r
         .short 0             # base 0\r
         .byte 0\r
@@ -550,16 +549,16 @@ LINEAR_SEL      = .-GDT_BASE
         .byte 0\r
 \r
 # linear code segment descriptor\r
-LINEAR_CODE_SEL = .-GDT_BASE\r
+LINEAR_CODE_SEL   = .-GDT_BASE          # Selector [0x10]\r
         .short 0x0FFFF       # limit 0xFFFFF\r
         .short 0             # base 0\r
         .byte 0\r
-        .byte 0x09A          # present, ring 0, data, expand-up, writable\r
+        .byte 0x09A          # present, ring 0, code, expand-up, writable\r
         .byte 0x0CF          # page-granular, 32-bit\r
         .byte 0\r
 \r
 # system data segment descriptor\r
-SYS_DATA_SEL    = .-GDT_BASE\r
+SYS_DATA_SEL      = .-GDT_BASE          # Selector [0x18]\r
         .short 0x0FFFF       # limit 0xFFFFF\r
         .short 0             # base 0\r
         .byte 0\r
@@ -568,49 +567,54 @@ SYS_DATA_SEL    = .-GDT_BASE
         .byte 0\r
 \r
 # system code segment descriptor\r
-SYS_CODE_SEL    = .-GDT_BASE\r
+SYS_CODE_SEL      = .-GDT_BASE          # Selector [0x20]\r
         .short 0x0FFFF       # limit 0xFFFFF\r
         .short 0             # base 0\r
         .byte 0\r
-        .byte 0x09A          # present, ring 0, data, expand-up, writable\r
+        .byte 0x09A          # present, ring 0, code, expand-up, writable\r
         .byte 0x0CF          # page-granular, 32-bit\r
         .byte 0\r
 \r
 # spare segment descriptor\r
-SPARE3_SEL  = .-GDT_BASE\r
-        .short 0            # limit 0xFFFFF\r
+SPARE3_SEL        = .-GDT_BASE          # Selector [0x28]\r
+        .short 0\r
+        .short 0\r
+        .byte 0\r
+        .byte 0\r
+        .byte 0\r
+        .byte 0\r
+\r
+# system data segment descriptor\r
+SYS_DATA64_SEL      = .-GDT_BASE          # Selector [0x30]\r
+        .short 0x0FFFF      # limit 0xFFFFF\r
         .short 0            # base 0\r
         .byte 0\r
-        .byte 0             # present, ring 0, data, expand-up, writable\r
-        .byte 0             # page-granular, 32-bit\r
+        .byte 0x092         # present, ring 0, data, expand-up, writable\r
+        .byte 0x0CF         # page-granular, 32-bit\r
         .byte 0\r
 \r
-# spare segment descriptor\r
-SPARE4_SEL  = .-GDT_BASE\r
-        .short 0            # limit 0xFFFFF\r
+# system code segment descriptor\r
+SYS_CODE64_SEL      = .-GDT_BASE          # Selector [0x38]\r
+        .short 0x0FFFF      # limit 0xFFFFF\r
         .short 0            # base 0\r
         .byte 0\r
-        .byte 0             # present, ring 0, data, expand-up, writable\r
-        .byte 0             # page-granular, 32-bit\r
+        .byte 0x09A         # present, ring 0, code, expand-up, writable\r
+        .byte 0x0AF         # page-granular, 64-bit\r
         .byte 0\r
 \r
 # spare segment descriptor\r
-SPARE5_SEL  = .-GDT_BASE\r
-        .short 0            # limit 0xFFFFF\r
-        .short 0            # base 0\r
+SPARE4_SEL    = .-GDT_BASE            # Selector [0x40]\r
+        .short 0\r
+        .short 0\r
+        .byte 0\r
+        .byte 0\r
         .byte 0\r
-        .byte 0             # present, ring 0, data, expand-up, writable\r
-        .byte 0             # page-granular, 32-bit\r
         .byte 0\r
 \r
 GDT_END:\r
 \r
-        .p2align 2\r
-\r
-\r
-\r
 idtr: .short IDT_END - IDT_BASE - 1   # IDT limit\r
-        .quad 0                         # (IDT base gets set above)\r
+      .quad 0                         # (IDT base gets set above)\r
 ##############################################################################\r
 #   interrupt descriptor table (IDT)\r
 #\r
@@ -620,375 +624,471 @@ idtr: .short IDT_END - IDT_BASE - 1   # IDT limit
 #       for convenience.\r
 ##############################################################################\r
 \r
-#idt_tag .byte "IDT",0     \r
-        .p2align 2\r
+        .p2align 3          # make IDT 8-byte align\r
 \r
 IDT_BASE:\r
 # divide by zero (INT 0)\r
 DIV_ZERO_SEL        = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # debug exception (INT 1)\r
 DEBUG_EXCEPT_SEL    = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # NMI (INT 2)\r
 NMI_SEL             = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # soft breakpoint (INT 3)\r
 BREAKPOINT_SEL      = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # overflow (INT 4)\r
 OVERFLOW_SEL        = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # bounds check (INT 5)\r
 BOUNDS_CHECK_SEL    = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # invalid opcode (INT 6)\r
 INVALID_OPCODE_SEL  = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # device not available (INT 7)\r
 DEV_NOT_AVAIL_SEL   = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # double fault (INT 8)\r
 DOUBLE_FAULT_SEL    = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # Coprocessor segment overrun - reserved (INT 9)\r
 RSVD_INTR_SEL1      = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # invalid TSS (INT 0ah)\r
 INVALID_TSS_SEL     = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # segment not present (INT 0bh)\r
 SEG_NOT_PRESENT_SEL = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # stack fault (INT 0ch)\r
 STACK_FAULT_SEL     = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # general protection (INT 0dh)\r
 GP_FAULT_SEL        = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # page fault (INT 0eh)\r
 PAGE_FAULT_SEL      = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # Intel reserved - do not use (INT 0fh)\r
 RSVD_INTR_SEL2      = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # floating point error (INT 0x10)\r
 FLT_POINT_ERR_SEL   = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # alignment check (INT 0x11)\r
 ALIGNMENT_CHECK_SEL = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # machine check (INT 0x12)\r
 MACHINE_CHECK_SEL   = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # SIMD floating-point exception (INT 0x13)\r
 SIMD_EXCEPTION_SEL  = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
   # The following segment repeats (32 - 20) times:\r
+  # macro .rept isn't used here because Apple GAS compiler doesn't support it.\r
   # No. 1\r
         .short 0            # offset 15:0\r
         .short SYS_CODE_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
   # No. 2\r
         .short 0            # offset 15:0\r
         .short SYS_CODE_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
   # No. 3\r
         .short 0            # offset 15:0\r
         .short SYS_CODE_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
   # No. 4\r
         .short 0            # offset 15:0\r
         .short SYS_CODE_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
   # No. 5\r
         .short 0            # offset 15:0\r
         .short SYS_CODE_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
   # No. 6\r
         .short 0            # offset 15:0\r
         .short SYS_CODE_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
   # No. 7\r
         .short 0            # offset 15:0\r
         .short SYS_CODE_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
   # No. 8\r
         .short 0            # offset 15:0\r
         .short SYS_CODE_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
   # No. 9\r
         .short 0            # offset 15:0\r
         .short SYS_CODE_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
   # No. 10\r
         .short 0            # offset 15:0\r
         .short SYS_CODE_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
   # No. 11\r
         .short 0            # offset 15:0\r
         .short SYS_CODE_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
   # No. 12\r
         .short 0            # offset 15:0\r
         .short SYS_CODE_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 \r
 # 72 unspecified descriptors\r
-  .fill 72 * 8, 1, 0\r
+  .fill 72 * 16, 1, 0\r
         \r
 # IRQ 0 (System timer) - (INT 0x68)\r
 IRQ0_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # 0 for reserved\r
 \r
 # IRQ 1 (8042 Keyboard controller) - (INT 0x69)\r
 IRQ1_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # Reserved - IRQ 2 redirect (IRQ 2) - DO NOT USE!!! - (INT 6ah)\r
 IRQ2_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # IRQ 3 (COM 2) - (INT 6bh)\r
 IRQ3_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # IRQ 4 (COM 1) - (INT 6ch)\r
 IRQ4_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # IRQ 5 (LPT 2) - (INT 6dh)\r
 IRQ5_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # IRQ 6 (Floppy controller) - (INT 6eh)\r
 IRQ6_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # IRQ 7 (LPT 1) - (INT 6fh)\r
 IRQ7_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # IRQ 8 (RTC Alarm) - (INT 0x70)\r
 IRQ8_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # IRQ 9 - (INT 0x71)\r
 IRQ9_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # IRQ 10 - (INT 0x72)\r
 IRQ10_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # IRQ 11 - (INT 0x73)\r
 IRQ11_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # IRQ 12 (PS/2 mouse) - (INT 0x74)\r
 IRQ12_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # IRQ 13 (Floating point error) - (INT 0x75)\r
 IRQ13_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # IRQ 14 (Secondary IDE) - (INT 0x76)\r
 IRQ14_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
 # IRQ 15 (Primary IDE) - (INT 0x77)\r
 IRQ15_SEL            = .-IDT_BASE\r
         .short 0            # offset 15:0\r
-        .short SYS_CODE_SEL # selector 15:0\r
+        .short SYS_CODE64_SEL # selector 15:0\r
         .byte 0             # 0 for interrupt gate\r
         .byte 0x0e | 0x80   # (10001110)type = 386 interrupt gate, present\r
         .short 0            # offset 31:16\r
+        .long 0             # offset 63:32\r
+        .long 0             # for reserved\r
 \r
   .fill 16, 1, 0\r
 \r
index acf86059c463bf09c034ea5dc3653682c0e84d71..434a0e8d79cfcdebe1a2a49ef5209fa182511bea 100644 (file)
@@ -1,7 +1,7 @@
       TITLE   CpuInterrupt.asm: \r
 ;------------------------------------------------------------------------------\r
 ;*\r
-;*   Copyright 2006, Intel Corporation                                                         \r
+;*   Copyright 2006 - 2010, Intel Corporation                                                         \r
 ;*   All rights reserved. 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
@@ -447,7 +447,6 @@ ExceptionDone:
 ; data\r
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\r
 \r
-        align 010h\r
 \r
 gdtr    dw GDT_END - GDT_BASE - 1   ; GDT limit\r
         dq 0                        ; (GDT base gets set above)\r
@@ -455,12 +454,12 @@ gdtr    dw GDT_END - GDT_BASE - 1   ; GDT limit
 ;   global descriptor table (GDT)\r
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\r
 \r
-        align 010h\r
+        align 010h                      ; make GDT 16-byte align\r
 \r
 public GDT_BASE\r
 GDT_BASE:\r
 ; null descriptor\r
-NULL_SEL            equ $-GDT_BASE          ; Selector [0x0]\r
+NULL_SEL        equ $-GDT_BASE          ; Selector [0x0]\r
         dw 0            ; limit 15:0\r
         dw 0            ; base 15:0\r
         db 0            ; base 23:16\r
@@ -474,7 +473,7 @@ LINEAR_SEL      equ $-GDT_BASE          ; Selector [0x8]
         dw 0            ; base 0\r
         db 0\r
         db 092h         ; present, ring 0, data, expand-up, writable\r
-        db 0CFh                 ; page-granular, 32-bit\r
+        db 0CFh         ; page-granular, 32-bit\r
         db 0\r
 \r
 ; linear code segment descriptor\r
@@ -482,8 +481,8 @@ LINEAR_CODE_SEL equ $-GDT_BASE          ; Selector [0x10]
         dw 0FFFFh       ; limit 0xFFFFF\r
         dw 0            ; base 0\r
         db 0\r
-        db 09Ah         ; present, ring 0, data, expand-up, writable\r
-        db 0CFh                 ; page-granular, 32-bit\r
+        db 09Ah         ; present, ring 0, code, expand-up, writable\r
+        db 0CFh         ; page-granular, 32-bit\r
         db 0\r
 \r
 ; system data segment descriptor\r
@@ -492,7 +491,7 @@ SYS_DATA_SEL    equ $-GDT_BASE          ; Selector [0x18]
         dw 0            ; base 0\r
         db 0\r
         db 092h         ; present, ring 0, data, expand-up, writable\r
-        db 0CFh                 ; page-granular, 32-bit\r
+        db 0CFh         ; page-granular, 32-bit\r
         db 0\r
 \r
 ; system code segment descriptor\r
@@ -500,56 +499,48 @@ SYS_CODE_SEL    equ $-GDT_BASE          ; Selector [0x20]
         dw 0FFFFh       ; limit 0xFFFFF\r
         dw 0            ; base 0\r
         db 0\r
-        db 09Ah         ; present, ring 0, data, expand-up, writable\r
-        db 0CFh                 ; page-granular, 32-bit\r
+        db 09Ah         ; present, ring 0, code, expand-up, writable\r
+        db 0CFh         ; page-granular, 32-bit\r
         db 0\r
 \r
 ; spare segment descriptor\r
-SPARE3_SEL  equ $-GDT_BASE          ; Selector [0x28]\r
-        dw 0            ; limit 0xFFFFF\r
-        dw 0            ; base 0\r
+SPARE3_SEL      equ $-GDT_BASE          ; Selector [0x28]\r
+        dw 0\r
+        dw 0\r
+        db 0\r
+        db 0\r
         db 0\r
-        db 0            ; present, ring 0, data, expand-up, writable\r
-        db 0            ; page-granular, 32-bit\r
         db 0\r
 \r
-;\r
 ; system data segment descriptor\r
-;\r
 SYS_DATA64_SEL    equ $-GDT_BASE          ; Selector [0x30]\r
         dw 0FFFFh       ; limit 0xFFFFF\r
         dw 0            ; base 0\r
         db 0\r
-        db 092h         ; P | DPL [1..2] | 1   | 1   | C | R | A\r
-        db 0CFh         ; G | D   | L    | AVL | Segment [19..16]\r
+        db 092h         ; present, ring 0, data, expand-up, writable\r
+        db 0CFh         ; page-granular, 32-bit\r
         db 0\r
 \r
-;\r
 ; system code segment descriptor\r
-;\r
 SYS_CODE64_SEL    equ $-GDT_BASE          ; Selector [0x38]\r
         dw 0FFFFh       ; limit 0xFFFFF\r
         dw 0            ; base 0\r
         db 0\r
-        db 09Ah         ; P | DPL [1..2] | 1   | 1   | C | R | A\r
-        db 0AFh         ; G | D   | L    | AVL | Segment [19..16]\r
+        db 09Ah         ; present, ring 0, code, expand-up, writable\r
+        db 0AFh         ; page-granular, 64-bit\r
         db 0\r
 \r
 ; spare segment descriptor\r
 SPARE4_SEL  equ $-GDT_BASE            ; Selector [0x40]\r
-        dw 0            ; limit 0xFFFFF\r
-        dw 0            ; base 0\r
+        dw 0\r
+        dw 0\r
+        db 0\r
+        db 0\r
         db 0\r
-        db 0            ; present, ring 0, data, expand-up, writable\r
-        db 0            ; page-granular, 32-bit\r
         db 0\r
 \r
 GDT_END:\r
 \r
-        align 02h\r
-\r
-\r
-\r
 idtr    dw IDT_END - IDT_BASE - 1   ; IDT limit\r
         dq 0                        ; (IDT base gets set above)\r
 \r
@@ -562,8 +553,7 @@ idtr    dw IDT_END - IDT_BASE - 1   ; IDT limit
 ;       for convenience.\r
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\r
 \r
-;idt_tag db "IDT",0     \r
-        align 02h\r
+        align 08h       ; make IDT 8-byte align\r
 \r
 public IDT_BASE\r
 IDT_BASE:\r
@@ -767,7 +757,7 @@ SIMD_EXCEPTION_SEL  equ $-IDT_BASE
         dd 0            ; offset 63:32\r
         dd 0            ; 0 for reserved\r
 \r
-REPEAT  (32 - 20)\r
+REPEAT  (32 - 20)  \r
         dw 0            ; offset 15:0\r
         dw SYS_CODE64_SEL ; selector 15:0\r
         db 0            ; 0 for interrupt gate\r
@@ -944,6 +934,5 @@ IRQ15_SEL            equ $-IDT_BASE
 \r
 IDT_END:\r
 \r
-        align 02h\r
 \r
 END\r
index 4ce6df22cbca7d85415edd364c0ff3c428a4f334..6d584a201e4982ea3fcda31ef2d0efe4461dc069 100644 (file)
@@ -1,6 +1,6 @@
 #/*++\r
 # \r
-# Copyright (c) 2006, Intel Corporation                                                         \r
+# Copyright (c) 2006 - 2010, Intel Corporation                                                         \r
 # All rights reserved. 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