VirtualBox

Ignore:
Timestamp:
Apr 4, 2016 10:02:21 PM (9 years ago)
Author:
vboxsync
Message:

bs3kit: 386 and 486 fixes.

Location:
trunk/src/VBox/ValidationKit/bootsectors/bs3kit
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-bootsector.asm

    r59975 r60319  
    104104
    105105        ; save the registers.
    106         mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.rax], eax
    107         mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.rsp], esp
    108         mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.rbp], ebp
    109         mov     ax, ss
    110         mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.ss], ax
    111         mov     ax, ds
    112         mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.ds], ax
    113         mov     ax, es
    114         mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.es], ax
    115         mov     ax, fs
    116         mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.fs], ax
    117         mov     ax, gs
     106        mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.rax], ax
     107        mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.rsp], sp
     108        mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.rbp], bp
     109        mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.ss], ss
     110        mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.ds], ds
     111        mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.es], es
    118112
    119113        ; set up the segment reisters and stack.
    120         xor     eax, eax
     114        mov     ax, 0
    121115        mov     ds, ax
    122116        mov     es, ax
    123         mov     fs, ax
    124         mov     gs, ax
    125117        mov     ss, ax
    126         mov     esp, BS3_ADDR_STACK
    127         mov     ebp, esp
    128         mov     [ebp], eax               ; clear the first 16 bytes (terminates the ebp chain)
    129         mov     [ebp + 04h], eax
    130         mov     [ebp + 08h], eax
    131         mov     [ebp + 0ch], eax
    132 
    133         ; Save more registers now that ds is known and the stack is usable.
    134         pushfd
    135         pop     eax
    136         mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rflags], eax
     118        mov     sp, BS3_ADDR_STACK
     119        mov     bp, sp
     120        mov     [bp], ax                ; clear the first 8 bytes (terminates the ebp chain)
     121        mov     [bp + 02h], ax
     122        mov     [bp + 04h], ax
     123        mov     [bp + 06h], ax
     124
     125        ; Save flags now that we know that there's a valid stack.
     126        pushf
     127
     128        ;
     129        ; Clear the register area.
     130        ;
     131        push    cx
     132        push    di
     133        mov     di, BS3_ADDR_REG_SAVE
     134        mov     cx, BS3REGCTX_size/2
     135        cld
     136        rep stosw
     137        pop     di
     138        pop     cx
     139
     140        ;
     141        ; Do basic CPU detection.
     142        ;
     143
     144        ; 1. bit 15-bit was fixed to 1 in pre-286 CPUs, and fixed to 0 in 286+.
     145        mov     ax, [bp - 2]
     146        test    ah, 080h                ; always set on pre 286, clear on 286 and later
     147        jnz     .pre_80286
     148
     149        ; 2. On a 286 you cannot popf IOPL and NT from real mode.
     150        or      ah, (X86_EFL_IOPL | X86_EFL_NT) >> 8
     151        push    ax
     152        popf
     153        pushf
     154        pop     ax
     155        test    ah, (X86_EFL_IOPL | X86_EFL_NT) >> 8
     156        jz      .is_80286
     157        ; 386 or later.
     158
     159
     160        ; Save 386 registers. We can now skip the CS prefix as DS is flat.
     161        shr     eax, 16
     162        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rax+2], ax
     163        mov     eax, esp
     164        shr     eax, 16
     165        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rsp+2], ax
     166        mov     eax, ebp
     167        shr     eax, 16
     168        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rbp+2], ax
     169        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.fs], fs
     170        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.gs], gs
    137171        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rbx], ebx
    138172        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rcx], ecx
     
    144178        mov     eax, cr3
    145179        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.cr3], eax
     180        mov     byte [BS3_ADDR_REG_SAVE + BS3REGCTX.bMode], BS3_MODE_RM
     181        mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.cs], cs
     182        xor     eax, eax
     183        mov     ax, start
     184        mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.rip], eax
     185
     186        ; Pentium/486+: CR4 requires VME/CPUID, so we need to detect that before accessing it.
     187        mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.cr4], eax
     188        popf
     189        pushfd
     190        pop     eax
     191        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rflags], eax
     192        xor     eax, X86_EFL_ID
     193        push    eax
     194        popfd
     195        pushfd
     196        pop     ebx
     197        cmp     ebx, eax
     198        jne     .no_cr4
    146199        mov     eax, cr4
    147200        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.cr4], eax
    148         mov     byte [BS3_ADDR_REG_SAVE + BS3REGCTX.bMode], BS3_MODE_RM
    149         xor     eax, eax
    150         mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.cs], ax
    151         mov     ax, start
    152         mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.rip], eax
    153 
     201.no_cr4:
    154202        ; Make sure caching is enabled and alignment is off.
    155203        mov     eax, cr0
     
    157205        and     eax, ~(X86_CR0_NW | X86_CR0_CD | X86_CR0_AM)
    158206        mov     cr0, eax
     207        jmp     .do_load
     208
     209.is_80286:
     210        smsw    [BS3_ADDR_REG_SAVE + BS3REGCTX.cr0]
     211.pre_80286:
     212        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rbx], bx
     213        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rcx], cx
     214        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rdx], dx
     215        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rsi], si
     216        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rdi], di
    159217
    160218        ; Load all the code.
     219.do_load
    161220        mov     [g_bBootDrv], dl
    162221        call    bs3InitLoadImage
     
    165224        ; Call the user 'main' procedure (shouldn't return).
    166225        ;
     226        cld
    167227        call    BS3_SEL_TEXT16:0000h
    168228
     
    170230Bs3Panic:
    171231        cli
    172         hlt
     232        ;hlt
    173233        jmp     Bs3Panic
    174 
    175234
    176235
     
    212271        ; Reload all the sectors one at a time (avoids problems).
    213272        ;
    214         mov     esi, [g_cLargeTotalSectors]
    215         dec     esi
     273        mov     si, [g_cLargeTotalSectors] ; 16-bit sector count ==> max 512 * 65 535 = 33 553 920 bytes.
     274        dec     si
    216275        mov     di, BS3_ADDR_LOAD / 16  ; The current load segment.
    217276        mov     cx, 0002h               ; ch/cylinder=0 (0-based); cl/sector=2 (1-based)
     
    256315        ; print message
    257316        mov     si, .s_szErrMsg
    258         mov     ah, 0eh
    259         xor     bx, bx
    260317.failure_next_char:
    261318        lodsb
     319        mov     ah, 0eh
     320        mov     bx, 0ff00h
    262321        int     10h
    263322        cmp     si, .s_szErrMsgEnd
    264323        jb      .failure_next_char
    265 
    266         ; format the error number.
    267         movzx   bx, byte [bp - 2 - 1]    ; read the ah of the pusha frame
    268         shr     bl, 4
    269         mov     al, [bx + .s_achHex]
    270         int     10h
    271 
    272         movzx   bx, byte [bp - 2 - 1]    ; read the ah of the pusha frame
    273         and     bl, 0fh
    274         mov     al, [bx + .s_achHex]
    275         int     10h
    276324
    277325        ; panic
     
    279327        call    Bs3Panic
    280328.s_szErrMsg:
    281         db 13, 10, 'read error: '
     329        db 13, 10, 'read error!'
    282330.s_szErrMsgEnd:
    283 .s_achHex:
    284         db '0123456789abcdef'
    285 ENDPROC bs3InitLoadImage
     331;ENDPROC bs3InitLoadImage - don't want the padding.
    286332
    287333
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-c16-Trap16Generic.asm

    r60218 r60319  
    4040BS3_EXTERN_DATA16 g_bBs3CurrentMode
    4141BS3_EXTERN_DATA16 g_uBs3TrapEipHint
     42BS3_EXTERN_DATA16 g_uBs3CpuDetected
    4243BS3_EXTERN_SYSTEM16 Bs3Gdt
    4344TMPL_BEGIN_TEXT
     
    433434        mov     eax, cr3
    434435        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.cr3], eax
     436
     437        test    byte [1 + BS3_DATA16_WRT(g_uBs3CpuDetected)], (BS3CPU_F_CPUID >> 8) ; CR4 first appeared in later 486es.
     438        jz      .skip_cr4_because_not_there
    435439        mov     eax, cr4
    436440        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.cr4], eax
    437441        jmp     .set_flags
     442
     443.skip_cr4_because_not_there:
     444        mov     byte [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_CR4
     445        jmp     .set_flags
     446
    438447.skip_crX_because_cpl_not_0:
    439448        or      byte [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_CR
    440449        jmp     .set_flags
     450
    441451CPU 286
    442452.save_286_control_registers:
     
    584594        mov     ecx, cr3
    585595        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.cr3], ecx
     596
     597        test    byte [1 + BS3_DATA16_WRT(g_uBs3CpuDetected)], (BS3CPU_F_CPUID >> 8) ; CR4 first appeared in later 486es.
     598        jz      .skip_cr4_because_not_there
    586599        mov     ecx, cr4
    587600        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.cr4], ecx
     601        jmp     .common
     602
     603.skip_cr4_because_not_there:
     604        mov     byte [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_CR4
    588605
    589606        ;
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-c32-Trap32Generic.asm

    r60216 r60319  
    3939;*********************************************************************************************************************************
    4040BS3_EXTERN_DATA16 g_bBs3CurrentMode
     41BS3_EXTERN_DATA16 g_uBs3CpuDetected
    4142BS3_EXTERN_SYSTEM16 Bs3Gdt
    4243TMPL_BEGIN_TEXT
     
    350351        jnz     .skip_crX_because_cpl_not_0
    351352
     353        mov     eax, cr3
     354        mov     [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.cr3], eax
     355.save_cr0_cr2_cr4:                      ; The double fault code joins us here.
    352356        mov     eax, cr0
    353357        mov     [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.cr0], eax
    354358        mov     eax, cr2
    355359        mov     [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.cr2], eax
    356         mov     eax, cr3
    357         mov     [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.cr3], eax
     360
     361        test    byte [1 + BS3_DATA16_WRT(g_uBs3CpuDetected)], (BS3CPU_F_CPUID >> 8) ; CR4 first appeared in later 486es.
     362        jz      .skip_cr4_because_not_there
    358363        mov     eax, cr4
    359364        mov     [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.cr4], eax
    360365        jmp     .set_flags
     366
     367.skip_cr4_because_not_there:
     368        mov     byte [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_CR4
     369        jmp     .set_flags
     370
    361371.skip_crX_because_cpl_not_0:
    362372        or      byte [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_CR
    363373
    364 .set_flags:                             ; The double fault code joins us here.
     374.set_flags:
    365375        or      byte [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_AMD64
    366376
     
    522532
    523533        ;
    524         ; Control registers.
    525         ;
    526         mov     ecx, cr0
    527         mov     [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.cr0], ecx
    528         mov     ecx, cr2
    529         mov     [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.cr2], ecx
    530         mov     ecx, cr4
    531         mov     [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.cr4], ecx
    532 
    533         ;
    534534        ; Join code paths with the generic handler code.
    535535        ;
    536         jmp     bs3Trap32GenericCommon.set_flags
     536        jmp     bs3Trap32GenericCommon.save_cr0_cr2_cr4
    537537BS3_PROC_END   Bs3Trap32DoubleFaultHandler
    538538
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-PagingInitRootForPP.c

    r60311 r60319  
    3030#include "bs3kit-template-header.h"
    3131#include "bs3-cmn-paging.h"
     32#include "bs3-cmn-memory.h" /* bad bird */
     33#include <iprt/param.h>
     34
     35
     36/**
     37 * Creates page tables for a section of the page directory.
     38 *
     39 * @returns VINF_SUCCESS or VERR_NO_MEMORY.
     40 * @param   pPgDir              The page directory.
     41 * @param   iFirst              The first PD entry.
     42 * @param   cEntries            How many PD entries to create pages tables for.
     43 */
     44static int Bs3PagingInitPageTablesForPgDir(X86PD BS3_FAR *pPgDir, unsigned iFirst, unsigned cEntries)
     45{
     46    uint32_t uCurPhys = (uint32_t)iFirst << X86_PD_SHIFT;
     47    while (cEntries--)
     48    {
     49        X86PT BS3_FAR *pPt = (X86PT BS3_FAR *)Bs3MemAlloc(BS3MEMKIND_TILED, _4K);
     50        if (pPt)
     51        {
     52            unsigned j = 0;
     53            for (j = 0; j < RT_ELEMENTS(pPt->a); j++, uCurPhys += PAGE_SIZE)
     54            {
     55                pPt->a[j].u  = uCurPhys;
     56                pPt->a[j].u |= X86_PTE_P | X86_PTE_RW | X86_PTE_US | X86_PTE_A | X86_PTE_D;
     57            }
     58            pPgDir->a[iFirst].u = Bs3SelPtrToFlat(pPt);
     59            pPgDir->a[iFirst].u |= X86_PDE_P | X86_PDE_RW | X86_PDE_US | X86_PDE_A;
     60            iFirst++;
     61        }
     62        else
     63            return VERR_NO_MEMORY;
     64    }
     65    return VINF_SUCCESS;
     66}
    3267
    3368
     
    4681     * ASSUMES page size extension available, i.e. pentium+.
    4782     */
    48     pPgDir = (X86PD BS3_FAR *)Bs3MemAlloc(BS3MEMKIND_TILED, _4K);
     83    pPgDir = (X86PD BS3_FAR *)Bs3MemAllocZ(BS3MEMKIND_TILED, _4K);
    4984    if (pPgDir)
    5085    {
    5186        BS3_XPTR_AUTO(X86PD, XptrPgDir);
    5287        unsigned i;
     88        int rc = VINF_SUCCESS;
    5389
    54         if (g_uBs3CpuDetected)
     90        if (g_uBs3CpuDetected & BS3CPU_F_PSE)
    5591        {
     92            for (i = 0; i < RT_ELEMENTS(pPgDir->a); i++)
     93            {
     94                pPgDir->a[i].u = (uint32_t)i << X86_PD_SHIFT;
     95                pPgDir->a[i].u |= X86_PDE4M_P | X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_PS | X86_PDE4M_A | X86_PDE4M_D;
     96            }
    5697        }
    57         for (i = 0; i < RT_ELEMENTS(pPgDir->a); i++)
     98        else
    5899        {
    59             pPgDir->a[i].u = (uint32_t)i << X86_PD_SHIFT;
    60             pPgDir->a[i].u |= X86_PDE4M_P | X86_PDE4M_RW | X86_PDE4M_US | X86_PDE4M_PS | X86_PDE4M_A | X86_PDE4M_D;
     100            /*
     101             * This requires 4MB of page tables if we map everything.
     102             * So, we check how much memory we have available and make sure we
     103             * don't use all of it for page tables.
     104             */
     105            unsigned cMax = RT_ELEMENTS(pPgDir->a);
     106            uint32_t cFreePages = g_Bs3Mem4KUpperTiled.Core.cFreeChunks + g_Bs3Mem4KLow.Core.cFreeChunks;
     107            if (cFreePages >= cMax + 128)
     108                Bs3PagingInitPageTablesForPgDir(pPgDir, 0, cMax);
     109            else
     110            {
     111                unsigned cTop;
     112                if (cMax >= 256 /*1MB*/)
     113                {
     114                    cMax = cFreePages - 128;
     115                    cTop = 32;
     116                }
     117                else if (cMax >= 128)
     118                {
     119                    cMax = cFreePages - 48;
     120                    cTop = 16;
     121                }
     122                else
     123                {
     124                    cMax = cFreePages - 16;
     125                    cTop = RT_MIN(16, cMax / 4);
     126                }
     127                Bs3Printf("Bs3PagingInitRootForPP: Warning! insufficient memory for mapping all 4GB!\n"
     128                          "    Will only map 0x00000000-%#010RX32 and %#010RX32-0xffffffff.\n",
     129                          (uint32_t)(cMax - cTop) << PAGE_SHIFT, UINT32_MAX - ((uint32_t)cTop << PAGE_SHIFT) + 1);
     130                rc = Bs3PagingInitPageTablesForPgDir(pPgDir, 0, cMax - cTop);
     131                if (RT_SUCCESS(rc))
     132                    rc = Bs3PagingInitPageTablesForPgDir(pPgDir, RT_ELEMENTS(pPgDir->a) - cTop, cTop);
     133            }
    61134        }
    62135
    63136        BS3_XPTR_SET(X86PD, XptrPgDir, pPgDir);
    64137        g_PhysPagingRootPP = BS3_XPTR_GET_FLAT(X86PD, XptrPgDir);
    65         return VINF_SUCCESS;
     138        return rc;
    66139    }
    67140
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-RegCtxRestore.asm

    r60291 r60319  
    3030BS3_EXTERN_SYSTEM16 Bs3Gdt
    3131BS3_EXTERN_DATA16 g_bBs3CurrentMode
    32 %if TMPL_BITS == 16
     32%if TMPL_BITS != 64
    3333BS3_EXTERN_DATA16 g_uBs3CpuDetected
    3434%endif
     
    213213        jnz     .skip_control_regs
    214214
     215        test    byte [xBX + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_CR4 ; (old 486s and 386s didn't have CR4)
     216        jnz     .skip_cr4
     217%if TMPL_BITS != 64
     218        test    word [BS3_ONLY_16BIT(es:) BS3_DATA16_WRT(g_uBs3CpuDetected)], BS3CPU_F_CPUID
     219        jz      .skip_cr4
     220%endif
    215221        mov     sAX, [xBX + BS3REGCTX.cr4]
    216222        mov     sDX, cr4
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-RegCtxSave.asm

    r60218 r60319  
    3030BS3_EXTERN_SYSTEM16 Bs3Gdt
    3131BS3_EXTERN_DATA16 g_bBs3CurrentMode
    32 %if TMPL_BITS == 16
     32%if TMPL_BITS != 64
    3333BS3_EXTERN_DATA16 g_uBs3CpuDetected
    3434%endif
     
    121121        ; 80386 or later.
    122122        ;
     123%if TMPL_BITS != 64
     124        ; Check for CR4 here while we've got a working DS in all contexts.
     125        test    byte [1 + BS3_DATA16_WRT(g_uBs3CpuDetected)], (BS3CPU_F_CPUID >> 8)
     126        jnz     .save_full_have_cr4
     127        or      byte [BS3_ONLY_16BIT(es:) xDI + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_CR4
     128.save_full_have_cr4:
     129%endif
    123130%if TMPL_BITS == 16
    124131        ; Load es into ds so we can save ourselves some segment prefix bytes.
     
    176183        mov     sAX, cr3
    177184        mov     [xDI + BS3REGCTX.cr3], sAX
     185%if TMPL_BITS != 64
     186        test    byte [xDI + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_CR4
     187        jnz     .common_80286
     188%endif
    178189        mov     sAX, cr4
    179190        mov     [xDI + BS3REGCTX.cr4], sAX
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-CpuDetect.asm

    r60311 r60319  
    4646        push    xBP
    4747        mov     xBP, xSP
    48         pushf
    4948        push    xCX
    5049        push    xDX
    5150        push    xBX
     51        pushf
    5252
    5353%ifndef TMPL_CMN_PAGING
     
    139139        ;
    140140        cli                             ; Disable interrupts to be on the safe side.
    141         mov     xAX, [xBP - xCB]
    142         or      xAX, X86_EFL_IOPL | X86_EFL_NT
    143         push    xAX                     ; Load modified flags.
     141        mov     ax, [xBP - xCB]
     142        or      ax, X86_EFL_IOPL | X86_EFL_NT
     143        push    ax                      ; Load modified flags.
    144144        popf
    145145        pushf                           ; Get actual flags.
    146         pop     xAX
     146        pop     ax
    147147        test    ax, X86_EFL_IOPL | X86_EFL_NT
    148148        jnz     .386plus                ; If any of the flags are set, we're on 386+.
     
    151151        ; by a flaky POPF implementation, we assume this isn't the case in our
    152152        ; execution environment.
    153         mov     xAX, BS3CPU_80286
     153        mov     ax, BS3CPU_80286
    154154        jmp     .return
    155155%endif
     
    216216        mov     ah, al
    217217        AssertCompile(X86_CPUID_FEATURE_EDX_PAE_BIT > BS3CPU_F_PAE_BIT - 8)  ; 6 vs 10-8=2
     218        and     al, X86_CPUID_FEATURE_EDX_PAE
    218219        shr     al, X86_CPUID_FEATURE_EDX_PAE_BIT - (BS3CPU_F_PAE_BIT - 8)
    219220        AssertCompile(X86_CPUID_FEATURE_EDX_PSE_BIT == BS3CPU_F_PSE_BIT - 8) ; 3 vs 11-8=3
     221        and     ah, X86_CPUID_FEATURE_EDX_PSE
    220222        or      ah, al
     223        or      ah, (BS3CPU_F_CPUID >> 8)
    221224
    222225        ; Add the CPU type based on the family and model values.
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-SwitchToPP16.asm

    r60291 r60319  
    123123
    124124        ;
    125         ; Make sure PAE is really off and that PSE is enabled.
    126         ; ASSUMES PSE supported (pentium+).
     125        ; Make sure PAE is really off and that PSE is enabled when supported.
    127126        ;
     127BS3_EXTERN_DATA16 g_uBs3CpuDetected
     128BS3_BEGIN_TEXT16
     129        test    byte [1 + BS3_DATA16_WRT(g_uBs3CpuDetected)], (BS3CPU_F_CPUID >> 8)
     130        jz      .cr4_is_fine
    128131        mov     eax, cr4
    129132        mov     ecx, eax
    130         and     eax, ~X86_CR4_PAE
     133        and     eax, ~(X86_CR4_PAE | X86_CR4_PSE)
     134        test    byte [1 + BS3_DATA16_WRT(g_uBs3CpuDetected)], (BS3CPU_F_PSE >> 8)
     135        jz      .no_pse
    131136        or      eax, X86_CR4_PSE
     137.no_pse:
    132138        cmp     eax, ecx
    133139        je      .cr4_is_fine
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-SwitchToPP32.asm

    r59950 r60319  
    8585
    8686        ;
    87         ; Make sure PAE is really off and that PSE is on.
     87        ; Make sure PAE is really off and that PSE is on when supported.
    8888        ;
     89BS3_EXTERN_DATA16 g_uBs3CpuDetected
     90BS3_BEGIN_TEXT16
     91        test    byte [1 + BS3_DATA16_WRT(g_uBs3CpuDetected)], (BS3CPU_F_CPUID >> 8)
     92        jz      .cr4_is_fine
    8993        mov     eax, cr4
    9094        mov     ecx, eax
    91         and     eax, ~X86_CR4_PAE
     95        and     eax, ~(X86_CR4_PAE | X86_CR4_PSE)
     96        test    byte [1 + BS3_DATA16_WRT(g_uBs3CpuDetected)], (BS3CPU_F_PSE >> 8)
     97        jz      .no_pse
    9298        or      eax, X86_CR4_PSE
     99.no_pse:
    93100        cmp     eax, ecx
    94101        je      .cr4_is_fine
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-TrapSystemCallHandler.asm

    r60291 r60319  
    3535;*********************************************************************************************************************************
    3636BS3_EXTERN_DATA16 g_bBs3CurrentMode
     37%if TMPL_BITS != 64
    3738BS3_EXTERN_DATA16 g_uBs3CpuDetected
     39%endif
    3840%if TMPL_BITS == 16
    3941BS3_EXTERN_DATA16 g_uBs3TrapEipHint
     
    587589        sldt    [ss:bx + BS3REGCTX.ldtr]
    588590.save_context_16_return:
     591        or      byte [ss:bx + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_AMD64 | BS3REG_CTX_F_NO_CR4
    589592        ret
    590593%endif ; TMPL_BITS == 16
     
    711714        mov     sAX, cr3
    712715        mov     [BS3_NOT_64BIT(ss:) xBX + BS3REGCTX.cr3], sAX
     716%if TMPL_BITS != 64
     717        test    byte [BS3_DATA16_WRT(g_uBs3CpuDetected)], (BS3CPU_F_CPUID >> 8)
     718        jnz     .have_cr4
     719        or      byte [BS3_NOT_64BIT(ss:) xBX + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_CR4
     720        jmp     .done_cr4
     721.have_cr4:
     722%endif
    713723        mov     sAX, cr4
    714724        mov     [BS3_NOT_64BIT(ss:) xBX + BS3REGCTX.cr4], sAX
    715 
    716 %if TMPL_BITS != 64
     725%if TMPL_BITS != 64
     726.done_cr4:
     727        or      byte [ss:xBX + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_AMD64
     728
    717729        ; Deal with extended v8086 frame.
    718730 %if TMPL_BITS == 32
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.h

    r60312 r60319  
    22072207 * This is usually because it wasn't created with CPL=0. */
    22082208#define BS3REG_CTX_F_NO_CR              UINT8_C(0x01)
     2209/** The CPU is too old for CR4, so no CR4 in this context. */
     2210#define BS3REG_CTX_F_NO_CR4             UINT8_C(0x02)
    22092211/** The context doesn't have valid values for AMD64 GPR extensions. */
    2210 #define BS3REG_CTX_F_NO_AMD64           UINT8_C(0x02)
     2212#define BS3REG_CTX_F_NO_AMD64           UINT8_C(0x04)
    22112213/** @} */
    22122214
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.mac

    r60311 r60319  
    11721172;  This is usually because it wasn't created with CPL=0.
    11731173%define BS3REG_CTX_F_NO_CR              0x01
     1174;; The CPU is too old for CR4, so no CR4 in this context.
     1175%define BS3REG_CTX_F_NO_CR4             0x02
    11741176;; The context doesn't have valid values for AMD64 GPR extensions.
    1175 %define BS3REG_CTX_F_NO_AMD64           0x02
     1177%define BS3REG_CTX_F_NO_AMD64           0x04
    11761178;; @}
    11771179
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