VirtualBox

Changeset 24790 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Nov 19, 2009 2:21:54 PM (15 years ago)
Author:
vboxsync
Message:

EFI: EFI 64-bit host support.

Location:
trunk/src/VBox/Devices/EFI
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/EFI/DevEFI.cpp

    r24706 r24790  
    785785    pEfiInfo->cbBelow4GB    = pThis->cbBelow4GB;
    786786    pEfiInfo->cbAbove4GB    = pThis->cbAbove4GB;
    787     pEfiInfo->fFlags        = 0;
     787    pEfiInfo->fFlags        = 0; /* todo 0 bit makes 64-bit fw to boot need some knitting with GUI */
    788788    pEfiInfo->cCpus         = pThis->cCpus;
    789789    pEfiInfo->pfnPeiEP      = (uint32_t)pThis->GCEntryPoint1;
  • trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/Include/DevEFI.h

    r23400 r24790  
    118118    /** 0x18 - Amount of memory above 4GB (in bytes). */
    119119    uint64_t    cbAbove4GB;
    120     /** 0x20 - Flags reserved for future use, must be zero. */
     120    /** 0x20 - see flags values below */
    121121    uint32_t    fFlags;
    122122    /** 0x24 - The nubmer of Virtual CPUs. */
     
    135135/** The physical address where DEVEFIINFO can be found. */
    136136#define DEVEFI_INFO_PHYS_ADDR   (0xfffff000)
     137#define DEVEFI_INFO_FLAGS_X64   RT_BIT(0)
    137138
    138139/** @} */
  • trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/Include/DevEFI.mac

    r23400 r24790  
    5555
    5656%define DEVEFI_INFO_PHYS_ADDR   (0xfffff000)
     57%define DEVEFI_INFO_FLAGS_X64   RT_BIT(0)
    5758
    5859%endif
  • trunk/src/VBox/Devices/EFI/Thunk/EfiThunk.asm

    r23400 r24790  
    3030%define IDT_VECTORS     128
    3131;; keep in sync with actual GDT size
    32 %define GDT_SELECTORS   7
     32%define GDT_SELECTORS   10
    3333
    3434
     
    7979        dw      0xffff, 0, 0x9300, 0x0000       ; 16 bit data segment base=0x0 limit=0xffff     - FIXME: ditto.
    8080        dw      0xffff, 0, 0x9300, 0x00cf       ; 32 bit flat stack segment (0x30)
     81        dw      0xffff, 0, 0x9a00, 0x00af       ; 64 bit flat code segment (0x38)
     82        dw      0,      0, 0,      0            ; ditto
     83        dw      0,      0, 0,      0            ; ditto
    8184
    8285;; For lidt
     
    9396        db      0x0f                            ; base  23:16
    9497        db      0x00                            ; unused
    95 
    96 
     98       
    9799BITS 32
    98100
     
    137139BITS 16
    138140;;
    139 ; This is the place where we jump immediately after boot and
     141; This i the place where we jump immediately after boot and
    140142; switch the CPU into protected mode.
    141143;
     
    207209        ; around all it wants for all we care.
    208210        ;
     211        mov     eax,[0xfffff000 + DEVEFIINFO.fFlags]
     212        and      eax, DEVEFI_INFO_FLAGS_X64
     213        jnz trampoline_64
    209214        mov     ebp, [0xfffff000 + DEVEFIINFO.PhysFwVol]
    210215        mov     esi, [0xfffff000 + DEVEFIINFO.pfnFirmwareEP]
     
    212217        jmp     [0xfffff000 + DEVEFIINFO.pfnFirmwareEP]
    213218        jmp     HaltForEver
     219trampoline_64:
     220%macro fill_pkt 1
     221%%loop:
     222        mov [ebx],eax
     223        xor edx,edx
     224        mov [ebx + 4], edx
     225        add ebx, 8
     226        add eax, %1
     227        loop %%loop
     228%endmacro
     229
     230%define base 0x800000;0xfffff000
     231        mov ecx, 0x800 ; pde size
     232        mov ebx, base - (6 << X86_PAGE_4K_SHIFT)
     233        xor eax, eax
     234        ;; or flags to eax
     235        or eax, (X86_PDE_P|X86_PDE_A|X86_PDE_PS|X86_PDE_PCD|X86_PDE_RW|RT_BIT(6))
     236        fill_pkt (1 << X86_PAGE_2M_SHIFT)
     237
     238        ;; pdpt (1st 4 entries describe 4Gb)
     239        mov ebx, base - (2 << X86_PAGE_4K_SHIFT)
     240        mov eax, base - (6 << X86_PAGE_4K_SHIFT) ;;
     241        or eax, (X86_PDPE_P|X86_PDPE_RW|X86_PDPE_A|X86_PDPE_PCD)
     242        mov [ebx],eax
     243        xor edx,edx
     244        mov [ebx + 4], edx
     245        add ebx, 8
     246
     247        mov eax, base - 5 * (1 << X86_PAGE_4K_SHIFT) ;;
     248        or eax, (X86_PDPE_P|X86_PDPE_RW|X86_PDPE_A|X86_PDPE_PCD)
     249        mov [ebx],eax
     250        xor edx,edx
     251        mov [ebx + 4], edx
     252        add ebx, 8
     253
     254        mov eax, base - 4 * (1 << X86_PAGE_4K_SHIFT) ;;
     255        or eax, (X86_PDPE_P|X86_PDPE_RW|X86_PDPE_A|X86_PDPE_PCD)
     256        mov [ebx],eax
     257        xor edx,edx
     258        mov [ebx + 4], edx
     259        add ebx, 8
     260
     261        mov eax, base - 3 * (1 << X86_PAGE_4K_SHIFT) ;;
     262        or eax, (X86_PDPE_P|X86_PDPE_RW|X86_PDPE_A|X86_PDPE_PCD)
     263        mov [ebx],eax
     264        xor edx,edx
     265        mov [ebx + 4], edx
     266        add ebx, 8
     267
     268        mov ecx, 0x1f7 ; pdte size
     269        mov ebx, base - 2 * (1 << X86_PAGE_4K_SHIFT) + 4 * 8
     270        mov eax, base - 6 * (1 << X86_PAGE_4K_SHIFT);;
     271        or eax, (X86_PDPE_P|X86_PDPE_RW|X86_PDPE_A|X86_PDPE_PCD)
     272        ;; or flags to eax
     273        fill_pkt 3 * (1 << X86_PAGE_4K_SHIFT)
     274       
     275        mov ecx, 0x200 ; pml4 size
     276        mov ebx, base - (1 << X86_PAGE_4K_SHIFT)
     277        mov eax, base - 2 * (1 << X86_PAGE_4K_SHIFT) ;;
     278        or eax, (X86_PML4E_P|X86_PML4E_PCD|X86_PML4E_A|X86_PML4E_RW)
     279        ;; or flags to eax
     280        fill_pkt 0
     281
     282        mov eax, base - (1 << X86_PAGE_4K_SHIFT)
     283        mov cr3, eax
     284
     285
     286        mov eax,cr4
     287        or eax, X86_CR4_PAE|X86_CR4_OSFSXR|X86_CR4_OSXMMEEXCPT
     288        mov cr4,eax
     289       
     290        mov ecx, MSR_K6_EFER
     291        rdmsr
     292        or  eax, MSR_K6_EFER_LME
     293        wrmsr
     294
     295        mov     eax, cr0
     296        or      eax, X86_CR0_PG
     297        mov     cr0, eax
     298        jmp compat
     299compat:
     300        jmp 0x38:0xffff0000 + efi_64
     301BITS 64
     302efi_64:
     303        mov     ebp, [0xff009] ;  DEVEFIINFO.PhysFwVol
     304        mov     esi, [0xff000]; + DEVEFIINFO.pfnFirmwareEP]
     305        mov     edi, [0xff000 + 0x28]; + DEVEFIINFO.pfnPeiEP]
     306        jmp     [0xff000]; + DEVEFIINFO.pfnFirmwareEP]
     307        jmp     HaltForEver
    214308
    215309        ;
     
    221315        BITS 16
    222316        jmp     genesis
    223         times (16 - 3) db 0cch
    224 
     317        dw 0xdead
     318        dw 0xbeaf
     319        times (16 - 7) db 0cch
    225320end:
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette