]> git.proxmox.com Git - mirror_edk2.git/blobdiff - DuetPkg/CpuDxe/X64/CpuInterrupt.S
Update the copyright notice format
[mirror_edk2.git] / DuetPkg / CpuDxe / X64 / CpuInterrupt.S
old mode 100755 (executable)
new mode 100644 (file)
index f85792b..7b83d08
@@ -1,7 +1,7 @@
 #------------------------------------------------------------------------------\r
 #*\r
-#*   Copyright 2006, Intel Corporation                                                         \r
-#*   All rights reserved. This program and the accompanying materials                          \r
+#*   Copyright (c) 2006 - 2010, 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
 #EXTERN ExceptionHandler: NEAR\r
 #EXTERN mTimerVector: DWORD\r
 \r
-       .data\r
-       .globl ASM_PFX(mExceptionCodeSize)\r
+  .data\r
+  ASM_GLOBAL ASM_PFX(mExceptionCodeSize)\r
 ASM_PFX(mExceptionCodeSize): .long  9\r
 \r
-       .text\r
-       .globl ASM_PFX(InitDescriptor)\r
+  .text\r
+  ASM_GLOBAL ASM_PFX(InitDescriptor)\r
 \r
 ASM_PFX(InitDescriptor):\r
         movq    $GDT_BASE,%rax              # EAX=PHYSICAL address of gdt\r
@@ -47,7 +47,7 @@ ASM_PFX(InitDescriptor):
 #     UINTN Vector,\r
 #     VOID  (*Handler)(VOID)\r
 #     )\r
-       .globl ASM_PFX(InstallInterruptHandler)\r
+  ASM_GLOBAL ASM_PFX(InstallInterruptHandler)\r
 ASM_PFX(InstallInterruptHandler):\r
 #  Vector:DWORD @ 4(%esp)\r
 #  Handler:DWORD @ 8(%esp)\r
@@ -73,7 +73,7 @@ ASM_PFX(InstallInterruptHandler):
         pop     %rbx\r
         ret\r
 \r
-       .macro JmpCommonIdtEntry\r
+  .macro JmpCommonIdtEntry\r
     # jmp     commonIdtEntry - this must be hand coded to keep the assembler from\r
     #                          using a 8 bit reletive jump when the entries are\r
     #                          within 255 bytes of the common entry.  This must\r
@@ -81,10 +81,10 @@ ASM_PFX(InstallInterruptHandler):
     #                          of entry points...\r
     .byte     0xe9                        # jmp 16 bit reletive \r
     .long     commonIdtEntry - . - 4      #  offset to jump to\r
-       .endm\r
+  .endm\r
 \r
-    .align 2\r
-       .globl ASM_PFX(SystemExceptionHandler)\r
+    .p2align 1\r
+  ASM_GLOBAL ASM_PFX(SystemExceptionHandler)\r
 ASM_PFX(SystemExceptionHandler):\r
 INT0:\r
     push     $0x0      # push error code place holder on the stack\r
@@ -203,15 +203,83 @@ INT19:
     JmpCommonIdtEntry\r
 \r
 INTUnknown:\r
-       .rept (32 - 20)\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
     .byte    0x6a\r
     .byte    ( . - INTUnknown - 3 ) / 9 + 20 # vector number\r
     JmpCommonIdtEntry\r
-       .endr\r
+  # No. 2\r
+    push     $0x0      # push error code place holder on the stack\r
+#    push    xxh     # push vector number\r
+    .byte    0x6a\r
+    .byte    ( . - INTUnknown - 3 ) / 9 + 20 # vector number\r
+    JmpCommonIdtEntry\r
+  # No. 3\r
+    push     $0x0      # push error code place holder on the stack\r
+#    push    xxh     # push vector number\r
+    .byte    0x6a\r
+    .byte    ( . - INTUnknown - 3 ) / 9 + 20 # vector number\r
+    JmpCommonIdtEntry\r
+  # No. 4\r
+    push     $0x0      # push error code place holder on the stack\r
+#    push    xxh     # push vector number\r
+    .byte    0x6a\r
+    .byte    ( . - INTUnknown - 3 ) / 9 + 20 # vector number\r
+    JmpCommonIdtEntry\r
+  # No. 5\r
+    push     $0x0      # push error code place holder on the stack\r
+#    push    xxh     # push vector number\r
+    .byte    0x6a\r
+    .byte    ( . - INTUnknown - 3 ) / 9 + 20 # vector number\r
+    JmpCommonIdtEntry\r
+  # No. 6\r
+    push     $0x0      # push error code place holder on the stack\r
+#    push    xxh     # push vector number\r
+    .byte    0x6a\r
+    .byte    ( . - INTUnknown - 3 ) / 9 + 20 # vector number\r
+    JmpCommonIdtEntry\r
+  # No. 7\r
+    push     $0x0      # push error code place holder on the stack\r
+#    push    xxh     # push vector number\r
+    .byte    0x6a\r
+    .byte    ( . - INTUnknown - 3 ) / 9 + 20 # vector number\r
+    JmpCommonIdtEntry\r
+  # No. 8\r
+    push     $0x0      # push error code place holder on the stack\r
+#    push    xxh     # push vector number\r
+    .byte    0x6a\r
+    .byte    ( . - INTUnknown - 3 ) / 9 + 20 # vector number\r
+    JmpCommonIdtEntry\r
+  # No. 9\r
+    push     $0x0      # push error code place holder on the stack\r
+#    push    xxh     # push vector number\r
+    .byte    0x6a\r
+    .byte    ( . - INTUnknown - 3 ) / 9 + 20 # vector number\r
+    JmpCommonIdtEntry\r
+  # No. 10\r
+    push     $0x0      # push error code place holder on the stack\r
+#    push    xxh     # push vector number\r
+    .byte    0x6a\r
+    .byte    ( . - INTUnknown - 3 ) / 9 + 20 # vector number\r
+    JmpCommonIdtEntry\r
+  # No. 11\r
+    push     $0x0      # push error code place holder on the stack\r
+#    push    xxh     # push vector number\r
+    .byte    0x6a\r
+    .byte    ( . - INTUnknown - 3 ) / 9 + 20 # vector number\r
+    JmpCommonIdtEntry\r
+  # No. 12\r
+    push     $0x0      # push error code place holder on the stack\r
+#    push    xxh     # push vector number\r
+    .byte    0x6a\r
+    .byte    ( . - INTUnknown - 3 ) / 9 + 20 # vector number\r
+    JmpCommonIdtEntry\r
+\r
 \r
-       .globl ASM_PFX(SystemTimerHandler)\r
+  ASM_GLOBAL ASM_PFX(SystemTimerHandler)\r
 ASM_PFX(SystemTimerHandler):\r
     push     $0\r
     push     $ASM_PFX(mTimerVector)\r
@@ -362,7 +430,6 @@ ExceptionDone:
   addq    $(4*8+8), %rsp\r
 \r
   cli\r
-  \r
 ## UINT64  ExceptionData#\r
   addq    $8, %rsp\r
 \r
@@ -452,29 +519,28 @@ ExceptionDone:
 # data\r
 ##############################################################################\r
 \r
-       .data\r
-    .align 0x10\r
+  .data\r
 \r
-gdtr:  .short GDT_END - GDT_BASE - 1   # GDT limit\r
-        .quad 0                         # (GDT base gets set above)\r
+gdtr: .short GDT_END - GDT_BASE - 1   # GDT limit\r
+      .quad 0                         # (GDT base gets set above)\r
 ##############################################################################\r
 #   global descriptor table (GDT)\r
 ##############################################################################\r
 \r
-        .align 0x10\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
@@ -483,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
@@ -501,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
-        .align 0x4\r
-\r
-\r
-\r
-idtr:  .short IDT_END - IDT_BASE - 1   # IDT limit\r
-        .quad 0                         # (IDT base gets set above)\r
+idtr: .short IDT_END - IDT_BASE - 1   # IDT limit\r
+      .quad 0                         # (IDT base gets set above)\r
 ##############################################################################\r
 #   interrupt descriptor table (IDT)\r
 #\r
@@ -553,314 +624,473 @@ idtr:   .short IDT_END - IDT_BASE - 1   # IDT limit
 #       for convenience.\r
 ##############################################################################\r
 \r
-#idt_tag .byte "IDT",0     \r
-        .align 0x4\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
-       .rept  (32 - 20)\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
-       .endr\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
-       .rept 72 * 8\r
-        .byte 0\r
-       .endr\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
-       .rept 1 * 16\r
-        .byte 0\r
-       .endr\r
+  .fill 16, 1, 0\r
 \r
 IDT_END:\r
 \r