VirtualBox

Changeset 60216 in vbox


Ignore:
Timestamp:
Mar 28, 2016 12:07:23 AM (9 years ago)
Author:
vboxsync
Message:

bs3kit: Added BS3REG_CTX_F_NO_AMD64 to ignore r8-r15 in contexts created by 16-bit or 32-bit code.

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

Legend:

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

    r60202 r60216  
    436436        mov     eax, cr4
    437437        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.cr4], eax
    438         jmp     .dispatch_to_handler
     438        jmp     .set_flags
    439439.skip_crX_because_cpl_not_0:
    440440        or      byte [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_CR
    441         jmp     .dispatch_to_handler
     441        jmp     .set_flags
    442442CPU 286
    443443.save_286_control_registers:
    444444        smsw    [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.cr0]
    445445
     446.set_flags:                             ; The double fault code joins us here.
     447        or      byte [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_AMD64
     448
    446449        ;
    447450        ; Dispatch it to C code.
    448451        ;
    449 .dispatch_to_handler:                   ; The double fault code joins us here.
     452.dispatch_to_handler:
    450453        mov     di, bx
    451454        mov     bl, byte [ss:bx + BS3TRAPFRAME.bXcpt]
     
    652655        ; Join code paths with the generic handler code.
    653656        ;
    654         jmp     bs3Trap16GenericCommon.dispatch_to_handler
     657        jmp     bs3Trap16GenericCommon.set_flags
    655658BS3_PROC_END   Bs3Trap16DoubleFaultHandler
    656659
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-c32-Trap32Generic.asm

    r60204 r60216  
    358358        mov     eax, cr4
    359359        mov     [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.cr4], eax
    360         jmp     .dispatch_to_handler
     360        jmp     .set_flags
    361361.skip_crX_because_cpl_not_0:
    362362        or      byte [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_CR
    363363
     364.set_flags:                             ; The double fault code joins us here.
     365        or      byte [edi + BS3TRAPFRAME.Ctx + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_AMD64
     366
    364367        ;
    365368        ; Dispatch it to C code.
    366369        ;
    367 .dispatch_to_handler:                   ; The double fault code joins us here.
     370.dispatch_to_handler:
    368371        movzx   ebx, byte [edi + BS3TRAPFRAME.bXcpt]
    369372        mov     eax, [ebx * 4 + BS3_DATA16_WRT(_g_apfnBs3TrapHandlers_c32)]
     
    531534        ; Join code paths with the generic handler code.
    532535        ;
    533         jmp     bs3Trap32GenericCommon.dispatch_to_handler
     536        jmp     bs3Trap32GenericCommon.set_flags
    534537BS3_PROC_END   Bs3Trap32DoubleFaultHandler
    535538
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-RegCtxPrint.c

    r60097 r60216  
    4343                      pRegCtx->cs, pRegCtx->ds, pRegCtx->es, pRegCtx->fs, pRegCtx->gs, pRegCtx->ss,
    4444                      pRegCtx->cr3.u32, pRegCtx->cr4.u32);
    45         Bs3TestPrintf("tr=%04RX16 ldtr=%04RX16 cpl=%d   mode=%#x\n",
    46                       pRegCtx->tr, pRegCtx->ldtr, pRegCtx->bCpl, pRegCtx->bMode);
     45        Bs3TestPrintf("tr=%04RX16 ldtr=%04RX16 cpl=%d   mode=%#x fbFlags=%#x\n",
     46                      pRegCtx->tr, pRegCtx->ldtr, pRegCtx->bCpl, pRegCtx->bMode, pRegCtx->fbFlags);
    4747    //}
    4848    //else
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-RegCtxSave.asm

    r60088 r60216  
    6464%endif
    6565
    66 %if TMPL_BITS != 64
    67         ;
    68         ; Clear the whole structure first, unless 64-bit
     66        ;
     67        ; Clear the whole structure first.
    6968        ;
    7069        xor     xAX, xAX
    7170        cld
    72  %if TMPL_BITS == 16
     71        AssertCompileSizeAlignment(BS3REGCTX, 4)
     72%if TMPL_BITS == 16
    7373        les     xDI, [xBP + xCB*2]
    7474        mov     xCX, BS3REGCTX_size / 2
    7575        rep stosw
    76  %else
     76%else
    7777        mov     xDI, [xBP + xCB*2]
    7878        mov     xCX, BS3REGCTX_size / 4
    7979        rep stosd
    80  %endif
     80%endif
    8181        mov     xDI, [xBP + xCB*2]
    82 %endif
    8382
    8483        ;
     
    141140        mov     [xDI + BS3REGCTX.r14], r14
    142141        mov     [xDI + BS3REGCTX.r15], r15
     142%else
     143        or      byte [xDI + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_AMD64
    143144%endif
    144145%if TMPL_BITS == 16 ; Save high bits.
     
    156157        mov     [xDI + BS3REGCTX.gs], gs
    157158
    158         ; Control registers.
     159%if TMPL_BITS == 16 ; v8086 and real mode woes.
     160        mov     cl, [xDI + BS3REGCTX.bMode]
     161        cmp     cl, BS3_MODE_RM
     162        je      .common_full_control_regs
     163        and     cl, BS3_MODE_CODE_MASK
     164        cmp     cl, BS3_MODE_CODE_V86
     165        je      .common_full_no_control_regs
     166%endif
     167        mov     ax, ss
     168        test    al, 3
     169        jnz     .common_full_no_control_regs
     170
     171        ; Control registers (ring-0 and real-mode only).
     172.common_full_control_regs:
    159173        mov     sAX, cr0
    160174        mov     [xDI + BS3REGCTX.cr0], sAX
     
    165179        mov     sAX, cr4
    166180        mov     [xDI + BS3REGCTX.cr4], sAX
     181        jmp     .common_80286
     182
     183.common_full_no_control_regs:
     184        or      byte [xDI + BS3REGCTX.fbFlags], BS3REG_CTX_F_NO_CR
    167185
    168186        ; 80286 control registers.
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-TestCheckRegCtxEx.c

    r60199 r60216  
    5151    CHECK_MEMBER("rsi",     "%08RX64",  pActualCtx->rsi.u,    pExpectedCtx->rsi.u);
    5252    CHECK_MEMBER("rdi",     "%08RX64",  pActualCtx->rdi.u,    pExpectedCtx->rdi.u);
    53     CHECK_MEMBER("r8",      "%08RX64",  pActualCtx->r8.u,     pExpectedCtx->r8.u);
    54     CHECK_MEMBER("r9",      "%08RX64",  pActualCtx->r9.u,     pExpectedCtx->r9.u);
    55     CHECK_MEMBER("r10",     "%08RX64",  pActualCtx->r10.u,    pExpectedCtx->r10.u);
    56     CHECK_MEMBER("r11",     "%08RX64",  pActualCtx->r11.u,    pExpectedCtx->r11.u);
    57     CHECK_MEMBER("r12",     "%08RX64",  pActualCtx->r12.u,    pExpectedCtx->r12.u);
    58     CHECK_MEMBER("r13",     "%08RX64",  pActualCtx->r13.u,    pExpectedCtx->r13.u);
    59     CHECK_MEMBER("r14",     "%08RX64",  pActualCtx->r14.u,    pExpectedCtx->r14.u);
    60     CHECK_MEMBER("r15",     "%08RX64",  pActualCtx->r15.u,    pExpectedCtx->r15.u);
     53    if (   !(pActualCtx->fbFlags & BS3REG_CTX_F_NO_AMD64)
     54        && !(pExpectedCtx->fbFlags & BS3REG_CTX_F_NO_AMD64) )
     55    {
     56        CHECK_MEMBER("r8",      "%08RX64",  pActualCtx->r8.u,     pExpectedCtx->r8.u);
     57        CHECK_MEMBER("r9",      "%08RX64",  pActualCtx->r9.u,     pExpectedCtx->r9.u);
     58        CHECK_MEMBER("r10",     "%08RX64",  pActualCtx->r10.u,    pExpectedCtx->r10.u);
     59        CHECK_MEMBER("r11",     "%08RX64",  pActualCtx->r11.u,    pExpectedCtx->r11.u);
     60        CHECK_MEMBER("r12",     "%08RX64",  pActualCtx->r12.u,    pExpectedCtx->r12.u);
     61        CHECK_MEMBER("r13",     "%08RX64",  pActualCtx->r13.u,    pExpectedCtx->r13.u);
     62        CHECK_MEMBER("r14",     "%08RX64",  pActualCtx->r14.u,    pExpectedCtx->r14.u);
     63        CHECK_MEMBER("r15",     "%08RX64",  pActualCtx->r15.u,    pExpectedCtx->r15.u);
     64    }
    6165    CHECK_MEMBER("rflags",  "%08RX64",  pActualCtx->rflags.u, pExpectedCtx->rflags.u | fExtraEfl);
    6266    CHECK_MEMBER("rip",     "%08RX64",  pActualCtx->rip.u,    pExpectedCtx->rip.u + cbPcAdjust);
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.h

    r60211 r60216  
    18451845 * This is usually because it wasn't created with CPL=0. */
    18461846#define BS3REG_CTX_F_NO_CR              UINT8_C(0x01)
     1847/** The context doesn't have valid values for AMD64 GPR extensions. */
     1848#define BS3REG_CTX_F_NO_AMD64           UINT8_C(0x02)
    18471849/** @} */
    18481850
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.mac

    r60211 r60216  
    11721172;  This is usually because it wasn't created with CPL=0.
    11731173%define BS3REG_CTX_F_NO_CR              0x01
     1174;; The context doesn't have valid values for AMD64 GPR extensions.
     1175%define BS3REG_CTX_F_NO_AMD64           0x02
    11741176;; @}
    11751177
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