]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Core/DxeIplPeim/x64/LongMode.asm
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@150 6f19259b...
[mirror_edk2.git] / EdkModulePkg / Core / DxeIplPeim / x64 / LongMode.asm
index a9c4e774cf9993c8ee6eb384d8f1f3fbe700f58d..ae87bd83e4b78ce4d9429cd12deedd544cf4668a 100644 (file)
-      TITLE   LongMode.asm: Assembly code for the entering long mode\r
-\r
-;------------------------------------------------------------------------------\r
-;*\r
-;*   Copyright (c) 2006, 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
-;*   http://opensource.org/licenses/bsd-license.php                                            \r
-;*                                                                                             \r
-;*   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-;*   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
-;*   \r
-;*    LongMode.asm\r
-;*  \r
-;*   Abstract:\r
-;*\r
-;*    Transition from 32-bit protected mode EFI environment into x64 \r
-;*    64-bit bit long mode.\r
-;*  \r
-;------------------------------------------------------------------------------\r
-\r
-.686p\r
-.model  flat        \r
-\r
-;\r
-; Create the exception handler code in IA32 C code\r
-;\r
-\r
-.code\r
-.stack\r
-.MMX\r
-.XMM\r
-\r
-_LoadGo64Gdt   PROC Near Public\r
-    push    ebp               ; C prolog\r
-    push    edi\r
-    mov     ebp, esp\r
-    ;\r
-    ; Disable interrupts\r
-    ;\r
-    cli\r
-    ;\r
-    ; Reload the selectors\r
-    ; Note:\r
-    ;      Make the Selectors 64-bit ready\r
-    ;\r
-    mov     edi, OFFSET gdtr    ; Load GDT register\r
-    mov     ax,cs               ; Get the selector data from our code image          \r
-    mov     es,ax\r
-    lgdt    FWORD PTR es:[edi]  ; and update the GDTR   \r
-\r
-    db      067h\r
-    db      0eah              ; Far Jump Offset:Selector to reload CS\r
-    dd      OFFSET DataSelectorRld;   Offset is ensuing instruction boundary\r
-    dw      LINEAR_CODE_SEL   ;   Selector is our code selector, 10h\r
-DataSelectorRld::\r
-    mov     ax, SYS_DATA_SEL ; Update the Base for the new selectors, too\r
-    mov     ds, ax\r
-    mov     es, ax\r
-    mov     fs, ax\r
-    mov     gs, ax\r
-    mov     ss, ax  \r
-    \r
-    pop     edi\r
-    pop     ebp\r
-    ret\r
-_LoadGo64Gdt endp   \r
-    \r
-\r
-; VOID\r
-; ActivateLongMode (\r
-;   IN  EFI_PHYSICAL_ADDRESS  PageTables,  \r
-;   IN  EFI_PHYSICAL_ADDRESS  HobStart,\r
-;   IN  EFI_PHYSICAL_ADDRESS  Stack,\r
-;   IN  EFI_PHYSICAL_ADDRESS  PpisNeededByDxeIplEntryPoint,\r
-;   IN  EFI_PHYSICAL_ADDRESS  DxeCoreEntryPoint\r
-;   )\r
-;\r
-; Input:  [ebp][0h]  = Original ebp\r
-;         [ebp][4h]  = Return address\r
-;         [ebp][8h]  = PageTables\r
-;         [ebp][10h] = HobStart\r
-;         [ebp][18h] = Stack\r
-;         [ebp][20h] = CodeEntryPoint1 <--- Call this first (for each call, pass HOB pointer)\r
-;         [ebp][28h] = CodeEntryPoint2 <--- Call this second\r
-;\r
-;\r
-_ActivateLongMode  PROC Near Public\r
-    push    ebp               ; C prolog\r
-    mov     ebp, esp\r
-\r
-    ;\r
-    ; Use CPUID to determine if the processor supports long mode.\r
-    ;\r
-    mov     eax, 80000000h  ; Extended-function code 8000000h.\r
-    cpuid                   ; Is largest extended function\r
-    cmp     eax, 80000000h  ; any function > 80000000h?\r
-    jbe     no_long_mode    ; If not, no long mode.\r
-    mov     eax, 80000001h  ; Extended-function code 8000001h.\r
-    cpuid                   ; Now EDX = extended-features flags.\r
-    bt      edx, 29         ; Test if long mode is supported.\r
-    jnc     no_long_mode    ; Exit if not supported.\r
-\r
-    ;\r
-    ; Enable the 64-bit page-translation-table entries by\r
-    ; setting CR4.PAE=1 (this is _required_ before activating\r
-    ; long mode). Paging is not enabled until after long mode\r
-    ; is enabled.\r
-    ;\r
-    mov eax, cr4\r
-    bts eax, 5\r
-    mov cr4, eax\r
-\r
-    ;\r
-    ; Get the long-mode page tables, and initialize the\r
-    ; 64-bit CR3 (page-table base address) to point to the base\r
-    ; of the PML4 page table. The PML4 page table must be located\r
-    ; below 4 Gbytes because only 32 bits of CR3 are loaded when\r
-    ; the processor is not in 64-bit mode.\r
-    ;\r
-    mov eax, [ebp+8h]       ; Get Page Tables\r
-    mov cr3, eax            ; Initialize CR3 with PML4 base.\r
-\r
-    ;\r
-    ; Enable long mode (set EFER.LME=1).\r
-    ;\r
-    mov ecx, 0c0000080h ; EFER MSR number.\r
-    rdmsr               ; Read EFER.\r
-    bts eax, 8          ; Set LME=1.\r
-    wrmsr               ; Write EFER.\r
-\r
-    ;\r
-    ; Enable paging to activate long mode (set CR0.PG=1)\r
-    ;\r
-   \r
-   \r
-    mov eax, cr0 ; Read CR0.\r
-    bts eax, 31  ; Set PG=1.\r
-    mov cr0, eax ; Write CR0.\r
-    jmp   go_to_long_mode\r
-go_to_long_mode:\r
-\r
-    ;\r
-    ; This is the next instruction after enabling paging.  Jump to long mode\r
-    ;\r
-    db      067h\r
-    db      0eah              ; Far Jump Offset:Selector to reload CS\r
-    dd      OFFSET in_long_mode;   Offset is ensuing instruction boundary\r
-    dw      SYS_CODE64_SEL    ;   Selector is our code selector, 10h\r
-in_long_mode::\r
-    mov     ax, SYS_DATA64_SEL\r
-    mov     es, ax\r
-    mov     ss, ax\r
-    mov     ds, ax\r
-;;    jmp     $\r
-    \r
-           \r
-    ;\r
-    ; We're in long mode, so marshall the arguments to call the\r
-    ; passed in function pointers\r
-    ; Recall\r
-    ;         [ebp][10h] = HobStart\r
-    ;         [ebp][18h] = Stack\r
-    ;         [ebp][20h] = PpisNeededByDxeIplEntryPoint <--- Call this first (for each call, pass HOB pointer)\r
-    ;         [ebp][28h] = DxeCoreEntryPoint            <--- Call this second\r
-    ;\r
-    db  48h\r
-    mov ebx, [ebp+18h]        ; Setup the stack\r
-    db  48h\r
-    mov esp, ebx              ; On a new stack now\r
-\r
-    db  48h\r
-    mov ecx, [ebp+10h]        ; Pass Hob Start in RCX\r
-    db  48h\r
-    mov eax, [ebp+20h]        ; Get the function pointer for \r
-                              ; PpisNeededByDxeIplEntryPoint into EAX\r
-\r
-;; 00000905  FF D0                 call rax\r
-    db 0ffh\r
-    db 0d0h\r
-\r
-    db  48h\r
-    mov ecx, [ebp+10h]        ; Pass Hob Start in RCX\r
-    db  48h\r
-    mov eax, [ebp+28h]        ; Get the function pointer for \r
-                              ; DxeCoreEntryPoint into EAX\r
-\r
-;; 00000905  FF D0                 call rax\r
-    db 0ffh\r
-    db 0d0h\r
-\r
-    ;\r
-    ; WE SHOULD NEVER GET HERE!!!!!!!!!!!!!\r
-    ;\r
-no_long_mode:\r
-    jmp   no_long_mode\r
-_ActivateLongMode endp\r
-\r
-        align 16\r
-\r
-gdtr    dw GDT_END - GDT_BASE - 1   ; GDT limit\r
-        dd OFFSET GDT_BASE          ; (GDT base gets set above)\r
-\r
-;-----------------------------------------------------------------------------;\r
-;   global descriptor table (GDT)\r
-;-----------------------------------------------------------------------------;\r
-\r
-        align 16\r
-\r
-public GDT_BASE\r
-GDT_BASE:\r
-; null descriptor\r
-NULL_SEL            equ $-GDT_BASE    ; Selector [0]\r
-        dw 0            ; limit 15:0\r
-        dw 0            ; base 15:0\r
-        db 0            ; base 23:16\r
-        db 0            ; type\r
-        db 0            ; limit 19:16, flags\r
-        db 0            ; base 31:24\r
-\r
-; linear data segment descriptor\r
-LINEAR_SEL      equ $-GDT_BASE        ; Selector [0x8]\r
-        dw 0FFFFh       ; limit 0xFFFFF\r
-        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 0\r
-\r
-; linear code segment descriptor\r
-LINEAR_CODE_SEL equ $-GDT_BASE        ; Selector [0x10]\r
-        dw 0FFFFh       ; limit 0xFFFFF\r
-        dw 0            ; base 0\r
-        db 0\r
-        db 09Fh         ; present, ring 0, data, expand-up, writable\r
-        db 0CFh                 ; page-granular, 32-bit\r
-        db 0\r
-\r
-; system data segment descriptor\r
-SYS_DATA_SEL    equ $-GDT_BASE        ; Selector [0x18]\r
-        dw 0FFFFh       ; limit 0xFFFFF\r
-        dw 0            ; base 0\r
-        db 0\r
-        db 093h         ; present, ring 0, data, expand-up, writable\r
-        db 0CFh                 ; page-granular, 32-bit\r
-        db 0\r
-\r
-; system code segment descriptor\r
-SYS_CODE_SEL    equ $-GDT_BASE        ; Selector [0x20]\r
-        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 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
-        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 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 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
-        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
-;\r
-;\r
-;------------------------------------------------------------------------------\r
-;  Generic IDT Vector Handlers for the Host. They are all the same so they\r
-;  will compress really well.\r
-;\r
-;  By knowing the return address for Vector 00 you can can calculate the\r
-;  vector number by looking at the call CommonInterruptEntry return address.\r
-;  (return address - AsmIdtVector00Base)/8 == IDT index\r
-;\r
-;------------------------------------------------------------------------------\r
-\r
-_AsmIdtVector00 PROC NEAR PUBLIC\r
-    call  CommonInterruptEntry\r
-_AsmIdtVector00 ENDP\r
-AsmIdtVector00Base PROC NEAR PUBLIC\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-    call  CommonInterruptEntry\r
-       nop\r
-       nop\r
-       nop\r
-AsmIdtVector00Base ENDP\r
-\r
-\r
-;---------------------------------------;\r
-; CommonInterruptEntry                  ;\r
-;---------------------------------------;\r
-; The follow algorithm is used for the common interrupt routine.\r
-; TBD: Save EFI_SYSTEM_CONTEXT_x64 on the stack per AP definition\r
-;\r
-;\r
-CommonInterruptEntry PROC NEAR PUBLIC\r
-  cli\r
-  jmp   $  \r
-  iret\r
-\r
-CommonInterruptEntry ENDP\r
-\r
-END\r
-\r
+      TITLE   LongMode.asm: Assembly code for the entering long mode
+
+;------------------------------------------------------------------------------
+;*
+;*   Copyright (c) 2006, 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.             
+;*   
+;*    LongMode.asm
+;*  
+;*   Abstract:
+;*
+;*    Transition from 32-bit protected mode EFI environment into x64 
+;*    64-bit bit long mode.
+;*  
+;------------------------------------------------------------------------------
+
+.686p
+.model  flat        
+
+;
+; Create the exception handler code in IA32 C code
+;
+
+.code
+.stack
+.MMX
+.XMM
+
+_LoadGo64Gdt   PROC Near Public
+    push    ebp               ; C prolog
+    push    edi
+    mov     ebp, esp
+    ;
+    ; Disable interrupts
+    ;
+    cli
+    ;
+    ; Reload the selectors
+    ; Note:
+    ;      Make the Selectors 64-bit ready
+    ;
+    mov     edi, OFFSET gdtr    ; Load GDT register
+    mov     ax,cs               ; Get the selector data from our code image          
+    mov     es,ax
+    lgdt    FWORD PTR es:[edi]  ; and update the GDTR   
+
+    db      067h
+    db      0eah              ; Far Jump Offset:Selector to reload CS
+    dd      OFFSET DataSelectorRld;   Offset is ensuing instruction boundary
+    dw      LINEAR_CODE_SEL   ;   Selector is our code selector, 10h
+DataSelectorRld::
+    mov     ax, SYS_DATA_SEL ; Update the Base for the new selectors, too
+    mov     ds, ax
+    mov     es, ax
+    mov     fs, ax
+    mov     gs, ax
+    mov     ss, ax  
+    
+    pop     edi
+    pop     ebp
+    ret
+_LoadGo64Gdt endp   
+    
+
+; VOID
+; ActivateLongMode (
+;   IN  EFI_PHYSICAL_ADDRESS  PageTables,  
+;   IN  EFI_PHYSICAL_ADDRESS  HobStart,
+;   IN  EFI_PHYSICAL_ADDRESS  Stack,
+;   IN  EFI_PHYSICAL_ADDRESS  PpisNeededByDxeIplEntryPoint,
+;   IN  EFI_PHYSICAL_ADDRESS  DxeCoreEntryPoint
+;   )
+;
+; Input:  [ebp][0h]  = Original ebp
+;         [ebp][4h]  = Return address
+;         [ebp][8h]  = PageTables
+;         [ebp][10h] = HobStart
+;         [ebp][18h] = Stack
+;         [ebp][20h] = CodeEntryPoint1 <--- Call this first (for each call, pass HOB pointer)
+;         [ebp][28h] = CodeEntryPoint2 <--- Call this second
+;
+;
+_ActivateLongMode  PROC Near Public
+    push    ebp               ; C prolog
+    mov     ebp, esp
+
+    ;
+    ; Use CPUID to determine if the processor supports long mode.
+    ;
+    mov     eax, 80000000h  ; Extended-function code 8000000h.
+    cpuid                   ; Is largest extended function
+    cmp     eax, 80000000h  ; any function > 80000000h?
+    jbe     no_long_mode    ; If not, no long mode.
+    mov     eax, 80000001h  ; Extended-function code 8000001h.
+    cpuid                   ; Now EDX = extended-features flags.
+    bt      edx, 29         ; Test if long mode is supported.
+    jnc     no_long_mode    ; Exit if not supported.
+
+    ;
+    ; Enable the 64-bit page-translation-table entries by
+    ; setting CR4.PAE=1 (this is _required_ before activating
+    ; long mode). Paging is not enabled until after long mode
+    ; is enabled.
+    ;
+    mov eax, cr4
+    bts eax, 5
+    mov cr4, eax
+
+    ;
+    ; Get the long-mode page tables, and initialize the
+    ; 64-bit CR3 (page-table base address) to point to the base
+    ; of the PML4 page table. The PML4 page table must be located
+    ; below 4 Gbytes because only 32 bits of CR3 are loaded when
+    ; the processor is not in 64-bit mode.
+    ;
+    mov eax, [ebp+8h]       ; Get Page Tables
+    mov cr3, eax            ; Initialize CR3 with PML4 base.
+
+    ;
+    ; Enable long mode (set EFER.LME=1).
+    ;
+    mov ecx, 0c0000080h ; EFER MSR number.
+    rdmsr               ; Read EFER.
+    bts eax, 8          ; Set LME=1.
+    wrmsr               ; Write EFER.
+
+    ;
+    ; Enable paging to activate long mode (set CR0.PG=1)
+    ;
+   
+   
+    mov eax, cr0 ; Read CR0.
+    bts eax, 31  ; Set PG=1.
+    mov cr0, eax ; Write CR0.
+    jmp   go_to_long_mode
+go_to_long_mode:
+
+    ;
+    ; This is the next instruction after enabling paging.  Jump to long mode
+    ;
+    db      067h
+    db      0eah              ; Far Jump Offset:Selector to reload CS
+    dd      OFFSET in_long_mode;   Offset is ensuing instruction boundary
+    dw      SYS_CODE64_SEL    ;   Selector is our code selector, 10h
+in_long_mode::
+    mov     ax, SYS_DATA64_SEL
+    mov     es, ax
+    mov     ss, ax
+    mov     ds, ax
+;;    jmp     $
+    
+           
+    ;
+    ; We're in long mode, so marshall the arguments to call the
+    ; passed in function pointers
+    ; Recall
+    ;         [ebp][10h] = HobStart
+    ;         [ebp][18h] = Stack
+    ;         [ebp][20h] = PpisNeededByDxeIplEntryPoint <--- Call this first (for each call, pass HOB pointer)
+    ;         [ebp][28h] = DxeCoreEntryPoint            <--- Call this second
+    ;
+    db  48h
+    mov ebx, [ebp+18h]        ; Setup the stack
+    db  48h
+    mov esp, ebx              ; On a new stack now
+
+
+;; 00000905  FF D0                 call rax
+
+    db  48h
+    mov ecx, [ebp+10h]        ; Pass Hob Start in RCX
+    db  48h
+    mov eax, [ebp+28h]        ; Get the function pointer for 
+                              ; DxeCoreEntryPoint into EAX
+
+;; 00000905  FF D0                 call rax
+    db 0ffh
+    db 0d0h
+
+    ;
+    ; WE SHOULD NEVER GET HERE!!!!!!!!!!!!!
+    ;
+no_long_mode:
+    jmp   no_long_mode
+_ActivateLongMode endp
+
+        align 16
+
+gdtr    dw GDT_END - GDT_BASE - 1   ; GDT limit
+        dd OFFSET GDT_BASE          ; (GDT base gets set above)
+
+;-----------------------------------------------------------------------------;
+;   global descriptor table (GDT)
+;-----------------------------------------------------------------------------;
+
+        align 16
+
+public GDT_BASE
+GDT_BASE:
+; null descriptor
+NULL_SEL            equ $-GDT_BASE    ; Selector [0]
+        dw 0            ; limit 15:0
+        dw 0            ; base 15:0
+        db 0            ; base 23:16
+        db 0            ; type
+        db 0            ; limit 19:16, flags
+        db 0            ; base 31:24
+
+; linear data segment descriptor
+LINEAR_SEL      equ $-GDT_BASE        ; Selector [0x8]
+        dw 0FFFFh       ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 092h         ; present, ring 0, data, expand-up, writable
+        db 0CFh                 ; page-granular, 32-bit
+        db 0
+
+; linear code segment descriptor
+LINEAR_CODE_SEL equ $-GDT_BASE        ; Selector [0x10]
+        dw 0FFFFh       ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 09Fh         ; present, ring 0, data, expand-up, writable
+        db 0CFh                 ; page-granular, 32-bit
+        db 0
+
+; system data segment descriptor
+SYS_DATA_SEL    equ $-GDT_BASE        ; Selector [0x18]
+        dw 0FFFFh       ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 093h         ; present, ring 0, data, expand-up, writable
+        db 0CFh                 ; page-granular, 32-bit
+        db 0
+
+; system code segment descriptor
+SYS_CODE_SEL    equ $-GDT_BASE        ; Selector [0x20]
+        dw 0FFFFh       ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 09Ah         ; present, ring 0, data, expand-up, writable
+        db 0CFh                 ; page-granular, 32-bit
+        db 0
+
+; spare segment descriptor
+SPARE3_SEL  equ $-GDT_BASE            ; Selector [0x28]
+        dw 0            ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 0            ; present, ring 0, data, expand-up, writable
+        db 0            ; page-granular, 32-bit
+        db 0
+
+;
+; system data segment descriptor
+;
+SYS_DATA64_SEL    equ $-GDT_BASE          ; Selector [0x30]
+        dw 0FFFFh       ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 092h         ; P | DPL [1..2] | 1   | 1   | C | R | A
+        db 0CFh         ; G | D   | L    | AVL | Segment [19..16]
+        db 0
+
+;
+; system code segment descriptor
+;
+SYS_CODE64_SEL    equ $-GDT_BASE          ; Selector [0x38]
+        dw 0FFFFh       ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 09Ah         ; P | DPL [1..2] | 1   | 1   | C | R | A
+        db 0AFh         ; G | D   | L    | AVL | Segment [19..16]
+        db 0
+
+; spare segment descriptor
+SPARE4_SEL  equ $-GDT_BASE            ; Selector [0x40]
+        dw 0            ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 0            ; present, ring 0, data, expand-up, writable
+        db 0            ; page-granular, 32-bit
+        db 0
+
+GDT_END:
+
+;
+;
+;------------------------------------------------------------------------------
+;  Generic IDT Vector Handlers for the Host. They are all the same so they
+;  will compress really well.
+;
+;  By knowing the return address for Vector 00 you can can calculate the
+;  vector number by looking at the call CommonInterruptEntry return address.
+;  (return address - AsmIdtVector00Base)/8 == IDT index
+;
+;------------------------------------------------------------------------------
+
+_AsmIdtVector00 PROC NEAR PUBLIC
+    call  CommonInterruptEntry
+_AsmIdtVector00 ENDP
+AsmIdtVector00Base PROC NEAR PUBLIC
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+    call  CommonInterruptEntry
+       nop
+       nop
+       nop
+AsmIdtVector00Base ENDP
+
+
+;---------------------------------------;
+; CommonInterruptEntry                  ;
+;---------------------------------------;
+; The follow algorithm is used for the common interrupt routine.
+; TBD: Save EFI_SYSTEM_CONTEXT_x64 on the stack per AP definition
+;
+;
+CommonInterruptEntry PROC NEAR PUBLIC
+  cli
+  jmp   $  
+  iret
+
+CommonInterruptEntry ENDP
+
+END
+