VirtualBox

Changeset 97623 in vbox for trunk/src/VBox/ValidationKit


Ignore:
Timestamp:
Nov 21, 2022 11:12:49 AM (2 years ago)
Author:
vboxsync
Message:

ValKit/bs3-cpu-basic-2: More far return testing. bugref:9898

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-x0.c

    r97619 r97623  
    50085008
    50095009    //if (!BS3_MODE_IS_64BIT_SYS(bMode) && bMode != BS3_MODE_PP32_16) return 0xff;
     5010    //if (bMode != BS3_MODE_PE32) return 0xff;
    50105011
    50115012    /*
     
    50395040    if (BS3_MODE_IS_64BIT_SYS(bMode))
    50405041        Bs3Trap64InitEx(true);
     5042
     5043    /*
     5044     * Create some call gates and whatnot for the UD2 code using the spare selectors.
     5045     */
     5046    if (BS3_MODE_IS_64BIT_SYS(bMode))
     5047        for (iTest = 0; iTest < 16; iTest++)
     5048            Bs3SelSetupGate64(&Bs3GdteSpare00 + iTest * 2, iTest /*bType*/, 3 /*bDpl*/,
     5049                              BS3_SEL_R0_CS64, BS3_FP_OFF(bs3CpuBasic2_ud2) + BS3_ADDR_BS3TEXT16);
     5050    else
     5051    {
     5052        for (iTest = 0; iTest < 16; iTest++)
     5053        {
     5054            Bs3SelSetupGate(&Bs3GdteSpare00 + iTest,      iTest /*bType*/, 3 /*bDpl*/,
     5055                            BS3_SEL_R0_CS16, BS3_FP_OFF(bs3CpuBasic2_ud2), 0);
     5056            Bs3SelSetupGate(&Bs3GdteSpare00 + iTest + 16, iTest /*bType*/, 3 /*bDpl*/,
     5057                            BS3_SEL_R0_CS32, BS3_FP_OFF(bs3CpuBasic2_ud2) + BS3_ADDR_BS3TEXT16, 0);
     5058        }
     5059    }
    50415060
    50425061    /*
     
    52285247
    52295248            /* some additional #GP variations */ /** @todo test all possible exceptions! */
    5230             { false,  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R3_CS16 | 2,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                   BS3_SEL_R2_SS16 | 2, BS3_SEL_R3_CS16 },
     5249            { false,  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R3_CS16 | 2,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R2_SS16 | 2, BS3_SEL_R3_CS16 },
     5250            { false,  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_TSS32_DF | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS32 | 0, BS3_SEL_TSS32_DF },
     5251            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_00 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_00 },
     5252            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_01 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_01 },
     5253            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_02 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_02 },
     5254            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_03 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_03 },
     5255            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_04 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_04 },
     5256            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_05 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_05 },
     5257            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_06 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_06 },
     5258            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_07 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_07 },
     5259            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_08 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_08 },
     5260            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_09 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_09 },
     5261            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_0a | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_0a },
     5262            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_0b | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_0b },
     5263            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_0c | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_0c },
     5264            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_0d | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_0d },
     5265            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_0e | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_0e },
     5266            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_0f | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_0f },
     5267            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_10 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_10 },
     5268            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_11 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_11 },
     5269            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_12 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_12 },
     5270            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_13 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_13 },
     5271            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_14 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_14 },
     5272            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_15 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_15 },
     5273            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_16 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_16 },
     5274            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_17 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_17 },
     5275            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_18 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_18 },
     5276            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_19 | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_19 },
     5277            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_1a | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_1a },
     5278            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_1b | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_1b },
     5279            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_1c | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_1c },
     5280            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_1d | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_1d },
     5281            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_1e | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_1e },
     5282            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_SPARE_1f | 0,    { .offDst = 0 },                                                BS3_SEL_R0_SS16 | 0, BS3_SEL_SPARE_1f },
    52315283        };
    52325284
     
    52395291            for (iSubTest = 0; iSubTest < RT_ELEMENTS(s_aSubTests); iSubTest++)
    52405292            {
    5241                 g_usBs3TestStep = (iTest << 8) | (iSubTest << 2);
     5293                g_usBs3TestStep = (iTest << 12) | (iSubTest << 1);
    52425294                if (   s_aSubTests[iSubTest].fRmOrV86 == fRmOrV86
    52435295                    && (s_aSubTests[iSubTest].offDst <= UINT16_MAX || s_aTests[iTest].fOpSizePfx))
     
    53555407    else if (BS3_MODE_IS_32BIT_CODE(bMode))
    53565408    {
     5409        static struct
     5410        {
     5411            bool        fOpSizePfx;
     5412            uint16_t    cbImm;
     5413            FPFNBS3FAR  pfnTest;
     5414        } const s_aTests[] =
     5415        {
     5416            { false,  0, bs3CpuBasic2_retf_c16, },
     5417            {  true,  0, bs3CpuBasic2_retf_opsize_c16, },
     5418            { false, 32, bs3CpuBasic2_retf_i32_c16, },
     5419            {  true, 32, bs3CpuBasic2_retf_i32_opsize_c16, },
     5420        };
     5421
     5422        static struct
     5423        {
     5424            bool        fInterPriv;
     5425            int8_t      iXcpt;
     5426            RTSEL       uStartSs;
     5427            uint8_t     cDstBits;
     5428            RTSEL       uDstCs;
     5429            union   /* must use a union here as the compiler won't compile if uint16_t and will mess up fixups for uint32_t. */
     5430            {
     5431                uint32_t     offDst;
     5432                struct
     5433                {
     5434                    NPVOID   pv;
     5435                    uint16_t uHigh;
     5436                } s;
     5437            };
     5438            RTSEL       uDstSs;
     5439            uint16_t    uErrCd;
     5440        } const s_aSubTests[] =
     5441        { /* PriChg, Xcpt,  uStartSs,     => bits    uDstCs                   offDst/pv                                                 uDstSs               uErrCd */
     5442            { false, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R0_CS32 | 0,     { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R0_SS32 | 0, 0 },
     5443            { false, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R0_CS32 | 0,     { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R0_SS32 | 0, 0 },
     5444            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R1_CS32 | 1,     { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R1_SS32 | 1, 0 },
     5445            {  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R1_CS32 | 1,     { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R1_SS32 | 1, 0 },
     5446            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R1_CS32 | 1,     { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R1_SS16 | 1, 0 },
     5447            {  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R1_CS32 | 1,     { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R1_SS16 | 1, 0 },
     5448            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R2_CS32 | 2,     { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R2_SS32 | 2, 0 },
     5449            {  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R2_CS32 | 2,     { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R2_SS32 | 2, 0 },
     5450            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R2_CS32 | 2,     { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R2_SS16 | 2, 0 },
     5451            {  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R2_CS32 | 2,     { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R2_SS16 | 2, 0 },
     5452            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R3_CS32 | 3,     { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R3_SS32 | 3, 0 },
     5453            {  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R3_CS32 | 3,     { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R3_SS32 | 3, 0 },
     5454            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R3_CS32 | 3,     { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R3_SS16 | 3, 0 },
     5455            {  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R3_CS32 | 3,     { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R3_SS16 | 3, 0 },
     5456            /* same with 32-bit wide target addresses: */
     5457            { false, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R0_CS32 | 0,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },     BS3_SEL_R0_SS32 | 0, 0 },
     5458            { false, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R0_CS32 | 0,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },     BS3_SEL_R0_SS32 | 0, 0 },
     5459            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R1_CS32 | 1,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },     BS3_SEL_R1_SS32 | 1, 0 },
     5460            {  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R1_CS32 | 1,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },     BS3_SEL_R1_SS32 | 1, 0 },
     5461            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R1_CS32 | 1,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },     BS3_SEL_R1_SS16 | 1, 0 },
     5462            {  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R1_CS32 | 1,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },     BS3_SEL_R1_SS16 | 1, 0 },
     5463            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R2_CS32 | 2,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },     BS3_SEL_R2_SS32 | 2, 0 },
     5464            {  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R2_CS32 | 2,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },     BS3_SEL_R2_SS32 | 2, 0 },
     5465            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R2_CS32 | 2,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },     BS3_SEL_R2_SS16 | 2, 0 },
     5466            {  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R2_CS32 | 2,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },     BS3_SEL_R2_SS16 | 2, 0 },
     5467            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R3_CS32 | 3,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },     BS3_SEL_R3_SS32 | 3, 0 },
     5468            {  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R3_CS32 | 3,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },     BS3_SEL_R3_SS32 | 3, 0 },
     5469            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R3_CS32 | 3,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },     BS3_SEL_R3_SS16 | 3, 0 },
     5470            {  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R3_CS32 | 3,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },     BS3_SEL_R3_SS16 | 3, 0 },
     5471            /* conforming stuff */
     5472            { false, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R0_CS32_CNF | 0, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R0_SS32 | 0, 0 },
     5473            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R0_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R1_SS32 | 1, 0 },
     5474            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R0_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R0_SS32 | 1, BS3_SEL_R0_SS32 },
     5475            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R0_CS32_CNF | 2, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R2_SS32 | 2, 0 },
     5476            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R0_CS32_CNF | 3, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R3_SS32 | 3, 0 },
     5477            { false, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R1_CS32_CNF | 0, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R0_SS32 | 0, BS3_SEL_R1_CS32_CNF },
     5478            { false, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R1_CS32_CNF | 0, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R1_SS32 | 1, BS3_SEL_R1_CS32_CNF },
     5479            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R1_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R1_SS32 | 1, 0 },
     5480            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R1_CS32_CNF | 2, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R2_SS32 | 2, 0 },
     5481            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R1_CS32_CNF | 3, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R3_SS32 | 3, 0 },
     5482            { false, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R2_CS32_CNF | 0, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R0_SS32 | 0, BS3_SEL_R2_CS32_CNF },
     5483            { false, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R2_CS32_CNF | 0, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R1_SS32 | 1, BS3_SEL_R2_CS32_CNF },
     5484            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R2_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R1_SS32 | 1, BS3_SEL_R2_CS32_CNF },
     5485            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R2_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R0_SS32 | 0, BS3_SEL_R2_CS32_CNF },
     5486            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R2_CS32_CNF | 2, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R2_SS32 | 2, 0 },
     5487            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R2_CS32_CNF | 3, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R3_SS32 | 3, 0 },
     5488            { false, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R3_CS32_CNF | 0, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R0_SS32 | 0, BS3_SEL_R3_CS32_CNF },
     5489            { false, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R3_CS32_CNF | 0, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R1_SS32 | 1, BS3_SEL_R3_CS32_CNF },
     5490            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R3_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R1_SS32 | 1, BS3_SEL_R3_CS32_CNF },
     5491            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R3_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R0_SS32 | 0, BS3_SEL_R3_CS32_CNF },
     5492            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R3_CS32_CNF | 2, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R2_SS32 | 2, BS3_SEL_R3_CS32_CNF },
     5493            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R3_CS32_CNF | 2, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R3_SS32 | 2, BS3_SEL_R3_CS32_CNF },
     5494            {  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R3_CS32_CNF | 3, { .offDst = LOW_UD_ADDR },                                   BS3_SEL_R3_SS32 | 3, 0 },
     5495            /* returning to 16-bit code: */
     5496            { false, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R0_CS16 | 0,     { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R0_SS32 | 0, 0 },
     5497            {  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R1_CS16 | 1,     { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R1_SS32 | 1, 0 },
     5498            {  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R1_CS16 | 1,     { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R1_SS16 | 1, 0 },
     5499            {  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R2_CS16 | 2,     { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R2_SS32 | 2, 0 },
     5500            {  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R2_CS16 | 2,     { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R2_SS16 | 2, 0 },
     5501            {  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R3_CS16 | 3,     { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R3_SS32 | 3, 0 },
     5502            {  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R3_CS16 | 3,     { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R3_SS16 | 3, 0 },
     5503            { false, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R0_CS16 | 0,     { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R0_SS16 | 0, 0 },
     5504            {  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R1_CS16 | 1,     { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R1_SS16 | 1, 0 },
     5505            {  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R1_CS16 | 1,     { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R1_SS32 | 1, 0 },
     5506            {  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R2_CS16 | 2,     { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R2_SS16 | 2, 0 },
     5507            {  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R2_CS16 | 2,     { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R2_SS32 | 2, 0 },
     5508            {  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R3_CS16 | 3,     { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R3_SS16 | 3, 0 },
     5509            {  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R3_CS16 | 3,     { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R3_SS32 | 3, 0 },
     5510            /* returning to 16-bit conforming code: */
     5511            { false, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R0_CS16_CNF | 0, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R0_SS32 | 0, 0 },
     5512            {  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R0_CS16_CNF | 1, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R1_SS32 | 1, 0 },
     5513            {  true, 14, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R0_CS16_CNF | 1, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R0_SS32 | 1, BS3_SEL_R0_SS32 },
     5514            {  true, 14, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R0_CS16_CNF | 1, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R0_SS32 | 0, BS3_SEL_R0_SS32 },
     5515            {  true, 14, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R0_CS16_CNF | 1, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R3_SS32 | 1, BS3_SEL_R3_SS32 },
     5516            {  true, 14, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R0_CS16_CNF | 1, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R3_SS32 | 3, BS3_SEL_R3_SS32 },
     5517            {  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R0_CS16_CNF | 2, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R2_SS16 | 2, 0 },
     5518            {  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R0_CS16_CNF | 3, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R3_SS32 | 3, 0 },
     5519            { false, 14, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R1_CS16_CNF | 0, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R0_SS32 | 0, BS3_SEL_R1_CS16_CNF },
     5520            {  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R1_CS16_CNF | 1, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R1_SS16 | 1, 0 },
     5521            {  true, 14, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R1_CS16_CNF | 1, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R0_SS32 | 1, BS3_SEL_R0_SS32 },
     5522            {  true, 14, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R1_CS16_CNF | 1, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R0_SS32 | 0, BS3_SEL_R0_SS32 },
     5523            {  true, 14, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R1_CS16_CNF | 1, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R3_SS32 | 1, BS3_SEL_R3_SS32 },
     5524            {  true, 14, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R1_CS16_CNF | 1, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R3_SS32 | 3, BS3_SEL_R3_SS32 },
     5525            {  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R1_CS16_CNF | 2, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R2_SS32 | 2, 0 },
     5526            {  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R1_CS16_CNF | 3, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R3_SS32 | 3, 0 },
     5527            { false, 14, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R2_CS16_CNF | 0, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R0_SS32 | 0, BS3_SEL_R2_CS16_CNF },
     5528            {  true, 14, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R2_CS16_CNF | 1, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R1_SS32 | 1, BS3_SEL_R2_CS16_CNF },
     5529            {  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R2_CS16_CNF | 2, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R2_SS32 | 2, 0 },
     5530            {  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R2_CS16_CNF | 3, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R3_SS16 | 3, 0 },
     5531            { false, 14, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R3_CS16_CNF | 0, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R0_SS32 | 0, BS3_SEL_R3_CS16_CNF },
     5532            {  true, 14, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R3_CS16_CNF | 1, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R1_SS32 | 1, BS3_SEL_R3_CS16_CNF },
     5533            {  true, 42, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R3_CS16_CNF | 2, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R2_SS32 | 2, BS3_SEL_R3_CS16_CNF },
     5534            {  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R3_CS16_CNF | 3, { .s = {(NPVOID)bs3CpuBasic2_ud2, 0 } },                     BS3_SEL_R3_SS32 | 3, 0 },
     5535            /* returning to 64-bit code or 16-bit when not in long mode: */
     5536            { false, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R0_CS64 | 0,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R0_SS16 | 0, 0 },
     5537            {  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R1_CS64 | 1,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R1_SS16 | 1, 0 },
     5538            {  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R2_CS64 | 2,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R2_SS16 | 2, 0 },
     5539            {  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R3_CS64 | 3,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R3_SS16 | 3, 0 },
     5540            {  true, 14, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R1_CS64 | 1,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R0_DS64 | 1, BS3_SEL_R0_DS64 },
     5541            {  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R1_CS64 | 1,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R1_DS64 | 1, 0 },
     5542            { false, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R0_CS64 | 0,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R0_SS32 | 0, 0 },
     5543            {  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R1_CS64 | 1,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R1_SS16 | 1, 0 },
     5544            {  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R1_CS64 | 1,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R1_SS32 | 1, 0 },
     5545            {  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R2_CS64 | 2,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R2_SS16 | 2, 0 },
     5546            {  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R2_CS64 | 2,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R2_SS32 | 2, 0 },
     5547            {  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R3_CS64 | 3,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R3_SS16 | 3, 0 },
     5548            {  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R3_CS64 | 3,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R3_SS32 | 3, 0 },
     5549            {  true, 14, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R2_CS64 | 3,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R3_SS32 | 3, BS3_SEL_R2_CS64 },
     5550            {  true, 14, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R2_CS64 | 3,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R1_SS32 | 3, BS3_SEL_R2_CS64 },
     5551            {  true, 14, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R3_CS64 | 3,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R1_SS32 | 3, BS3_SEL_R1_SS32 },
     5552            {  true, 14, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R3_CS64 | 3,     { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R3_SS32 | 2, BS3_SEL_R3_SS32 },
     5553            /* returning to 64-bit code or 16-bit when not in long mode, conforming code variant: */
     5554            { false, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R0_CS64_CNF | 0, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R0_SS16 | 0, 0 },
     5555            {  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R0_CS64_CNF | 1, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R1_SS16 | 1, 0 },
     5556            {  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R0_CS64_CNF | 2, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R2_SS16 | 2, 0 },
     5557            {  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R0_CS64_CNF | 3, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R3_SS16 | 3, 0 },
     5558
     5559            { false, 14, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R1_CS64_CNF | 0, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R0_SS16 | 0, BS3_SEL_R1_CS64_CNF },
     5560            {  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R1_CS64_CNF | 1, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R1_SS16 | 1, 0 },
     5561            {  true, 14, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R1_CS64_CNF | 1, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R1_SS16 | 2, BS3_SEL_R1_SS16 },
     5562            {  true, 14, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R1_CS64_CNF | 1, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R2_SS16 | 1, BS3_SEL_R2_SS16 },
     5563            {  true, 14, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R1_CS64_CNF | 1, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R2_SS16 | 2, BS3_SEL_R2_SS16 },
     5564            {  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R1_CS64_CNF | 2, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R2_SS16 | 2, 0 },
     5565            {  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R1_CS64_CNF | 3, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R3_SS16 | 3, 0 },
     5566
     5567            { false, 14, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R2_CS64_CNF | 0, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R0_SS16 | 0, BS3_SEL_R2_CS64_CNF },
     5568            {  true, 14, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R2_CS64_CNF | 1, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R1_SS16 | 1, BS3_SEL_R2_CS64_CNF },
     5569            {  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R2_CS64_CNF | 2, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R2_SS16 | 2, 0 },
     5570            {  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R2_CS64_CNF | 3, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R3_SS16 | 3, 0 },
     5571
     5572            { false, 14, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R3_CS64_CNF | 0, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R0_SS16 | 0, BS3_SEL_R3_CS64_CNF },
     5573            {  true, 14, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R3_CS64_CNF | 1, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R1_SS16 | 1, BS3_SEL_R3_CS64_CNF },
     5574            {  true, 14, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R3_CS64_CNF | 2, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R2_SS16 | 2, BS3_SEL_R3_CS64_CNF },
     5575            {  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R3_CS64_CNF | 3, { .offDst = LOW_SALC_UD_ADDR },                              BS3_SEL_R3_SS16 | 3, 0 },
     5576
     5577            /* some additional #GP variations */ /** @todo test all possible exceptions! */
     5578            {  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R3_CS16 | 2,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                       BS3_SEL_R2_SS16 | 2, BS3_SEL_R3_CS16 },
     5579            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_00 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_00 },
     5580            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_01 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_01 },
     5581            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_02 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_02 },
     5582            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_03 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_03 },
     5583            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_04 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_04 },
     5584            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_05 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_05 },
     5585            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_06 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_06 },
     5586            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_07 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_07 },
     5587            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_08 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_08 },
     5588            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_09 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_09 },
     5589            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_0a | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_0a },
     5590            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_0b | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_0b },
     5591            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_0c | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_0c },
     5592            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_0d | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_0d },
     5593            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_0e | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_0e },
     5594            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_0f | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_0f },
     5595            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_10 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_10 },
     5596            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_11 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_11 },
     5597            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_12 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_12 },
     5598            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_13 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_13 },
     5599            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_14 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_14 },
     5600            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_15 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_15 },
     5601            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_16 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_16 },
     5602            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_17 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_17 },
     5603            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_18 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_18 },
     5604            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_19 | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_19 },
     5605            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_1a | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_1a },
     5606            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_1b | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_1b },
     5607            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_1c | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_1c },
     5608            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_1d | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_1d },
     5609            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_1e | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_1e },
     5610            {  true, 14, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_SPARE_1f | 0,    { .offDst = 0 },                                             BS3_SEL_R0_SS32 | 0, BS3_SEL_SPARE_1f },
     5611        };
     5612
     5613        for (iTest = 0; iTest < RT_ELEMENTS(s_aTests); iTest++)
     5614        {
     5615            Bs3RegCtxSetRipCsFromLnkPtr(&Ctx, s_aTests[iTest].pfnTest);
     5616            //Bs3TestPrintf("-------------- #%u: cs:eip=%04RX16:%08RX64 imm=%u%s\n",
     5617            //              iTest, Ctx.cs, Ctx.rip.u, s_aTests[iTest].cbImm, s_aTests[iTest].fOpSizePfx ? " o16" : "");
     5618
     5619            for (iSubTest = 0; iSubTest < RT_ELEMENTS(s_aSubTests); iSubTest++)
     5620            {
     5621                g_usBs3TestStep = (iTest << 12) | (iSubTest << 1);
     5622                if (!s_aTests[iTest].fOpSizePfx || s_aSubTests[iSubTest].offDst <= UINT16_MAX)
     5623                {
     5624                    uint16_t const cbFrmDisp = s_aSubTests[iSubTest].fInterPriv ? iSubTest % 7 : 0;
     5625                    uint16_t const cbStkItem = s_aTests[iTest].fOpSizePfx ? 2 : 4;
     5626                    uint16_t const cbFrame   = (s_aSubTests[iSubTest].fInterPriv ? 4 : 2) * cbStkItem;
     5627                    RTSEL    const uDstSs    = s_aSubTests[iSubTest].uDstSs;
     5628                    uint64_t       uDstRspExpect, uDstRspPush;
     5629                    //Bs3TestPrintf(" #%u: %s %d %#04RX16 -> %u %#04RX16:%#04RX32 %#04RX16 %#RX16\n", iSubTest, s_aSubTests[iSubTest].fInterPriv ? "priv" : "same", s_aSubTests[iSubTest].iXcpt, s_aSubTests[iSubTest].uStartSs,
     5630                    //              s_aSubTests[iSubTest].cDstBits, s_aSubTests[iSubTest].uDstCs, s_aSubTests[iSubTest].offDst, s_aSubTests[iSubTest].uDstSs, s_aSubTests[iSubTest].uErrCd);
     5631
     5632                    Ctx.ss = s_aSubTests[iSubTest].uStartSs;
     5633                    if (Ctx.ss != BS3_SEL_R0_SS32)
     5634                        Ctx.rsp.u32 |= UINT32_C(0xfffe0000);
     5635                    else
     5636                        Ctx.rsp.u32 &= UINT16_MAX;
     5637                    uDstRspExpect = uDstRspPush = Ctx.rsp.u + s_aTests[iTest].cbImm + cbFrame + cbFrmDisp;
     5638                    if (s_aSubTests[iSubTest].fInterPriv)
     5639                    {
     5640                        if (!s_aTests[iTest].fOpSizePfx)
     5641                            uDstRspPush = (uDstRspPush & UINT16_MAX) | UINT32_C(0xacdc0000);
     5642                        if (   uDstSs == (BS3_SEL_R1_SS32 | 1)
     5643                            || uDstSs == (BS3_SEL_R2_SS32 | 2)
     5644                            || uDstSs == (BS3_SEL_R3_SS32 | 3)
     5645                            || (s_aSubTests[iSubTest].cDstBits == 64 && BS3_MODE_IS_64BIT_SYS(bMode)))
     5646                        {
     5647                            if (!s_aTests[iTest].fOpSizePfx)
     5648                                uDstRspExpect = uDstRspPush;
     5649                            else
     5650                                uDstRspExpect &= UINT16_MAX;
     5651                        }
     5652                    }
     5653
     5654                    CtxExpected.bCpl  = Ctx.bCpl;
     5655                    CtxExpected.cs    = Ctx.cs;
     5656                    CtxExpected.ss    = Ctx.ss;
     5657                    CtxExpected.ds    = Ctx.ds;
     5658                    CtxExpected.es    = Ctx.es;
     5659                    CtxExpected.fs    = Ctx.fs;
     5660                    CtxExpected.gs    = Ctx.gs;
     5661                    CtxExpected.rip.u = Ctx.rip.u;
     5662                    CtxExpected.rsp.u = Ctx.rsp.u;
     5663                    CtxExpected.rax.u = Ctx.rax.u;
     5664                    if (s_aSubTests[iSubTest].iXcpt < 0)
     5665                    {
     5666                        CtxExpected.cs    = s_aSubTests[iSubTest].uDstCs;
     5667                        CtxExpected.rip.u = s_aSubTests[iSubTest].offDst;
     5668                        if (s_aSubTests[iSubTest].cDstBits == 64 && !BS3_MODE_IS_64BIT_SYS(bMode))
     5669                        {
     5670                            CtxExpected.rip.u     += 1;
     5671                            CtxExpected.rax.au8[0] = CtxExpected.rflags.u16 & X86_EFL_CF ? 0xff : 0;
     5672                        }
     5673                        CtxExpected.ss    = uDstSs;
     5674                        CtxExpected.rsp.u = uDstRspExpect;
     5675                        if (s_aSubTests[iSubTest].fInterPriv)
     5676                        {
     5677                            uint16_t BS3_FAR *puSel = &CtxExpected.ds; /* ASSUME member order! */
     5678                            unsigned          cSels = 4;
     5679                            CtxExpected.bCpl = CtxExpected.ss & X86_SEL_RPL;
     5680                            while (cSels-- > 0)
     5681                            {
     5682                                uint16_t uSel = *puSel;
     5683                                if (   (uSel & X86_SEL_MASK_OFF_RPL)
     5684                                    && Bs3Gdt[uSel >> X86_SEL_SHIFT].Gen.u2Dpl < CtxExpected.bCpl
     5685                                    &&    (Bs3Gdt[uSel >> X86_SEL_SHIFT].Gen.u4Type & (X86_SEL_TYPE_CODE | X86_SEL_TYPE_CONF))
     5686                                       != (X86_SEL_TYPE_CODE | X86_SEL_TYPE_CONF))
     5687                                    *puSel = 0;
     5688                                puSel++;
     5689                            }
     5690                            CtxExpected.rsp.u += s_aTests[iTest].cbImm; /* arguments are dropped from both stacks. */
     5691                        }
     5692                    }
     5693                    g_uBs3TrapEipHint = CtxExpected.rip.u32;
     5694                    //Bs3TestPrintf("ss:rsp=%04RX16:%04RX64 -> %04RX16:%04RX64 [pushed %#RX64]; %04RX16:%04RX64\n",Ctx.ss, Ctx.rsp.u,
     5695                    //              CtxExpected.ss, CtxExpected.rsp.u, uDstRspPush, CtxExpected.cs, CtxExpected.rip.u);
     5696                    bs3CpuBasic2_retf_PrepStack(StkPtr, cbStkItem, s_aSubTests[iSubTest].uDstCs, s_aSubTests[iSubTest].offDst,
     5697                                                s_aSubTests[iSubTest].fInterPriv, s_aTests[iTest].cbImm,
     5698                                                s_aSubTests[iSubTest].uDstSs, uDstRspPush);
     5699                    //Bs3TestPrintf("%p: %04RX16 %04RX16 %04RX16 %04RX16\n", StkPtr.pu16, StkPtr.pu16[0], StkPtr.pu16[1], StkPtr.pu16[2], StkPtr.pu16[3]);
     5700                    //Bs3TestPrintf("%.48Rhxd\n", StkPtr.pu16);
     5701                    Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
     5702                    if (s_aSubTests[iSubTest].iXcpt < 0)
     5703                        bs3CpuBasic2_CompareUdCtx(&TrapCtx, &CtxExpected);
     5704                    else
     5705                        bs3CpuBasic2_CompareGpCtx(&TrapCtx, &CtxExpected, s_aSubTests[iSubTest].uErrCd);
     5706                    g_usBs3TestStep++;
     5707
     5708                    /* Again single stepping: */
     5709                    //Bs3TestPrintf("stepping...\n");
     5710                    Bs3RegSetDr6(X86_DR6_INIT_VAL);
     5711                    Ctx.rflags.u16        |= X86_EFL_TF;
     5712                    CtxExpected.rflags.u16 = Ctx.rflags.u16;
     5713                    if (s_aSubTests[iSubTest].iXcpt < 0 && s_aSubTests[iSubTest].cDstBits == 64 && !BS3_MODE_IS_64BIT_SYS(bMode))
     5714                    {
     5715                        CtxExpected.rip.u -= 1;
     5716                        CtxExpected.rax.u  = Ctx.rax.u;
     5717                    }
     5718                    bs3CpuBasic2_retf_PrepStack(StkPtr, cbStkItem, s_aSubTests[iSubTest].uDstCs, s_aSubTests[iSubTest].offDst,
     5719                                                s_aSubTests[iSubTest].fInterPriv, s_aTests[iTest].cbImm,
     5720                                                s_aSubTests[iSubTest].uDstSs, uDstRspPush);
     5721                    Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
     5722                    if (s_aSubTests[iSubTest].iXcpt < 0)
     5723                        bs3CpuBasic2_CompareDbCtx(&TrapCtx, &CtxExpected, X86_DR6_BS);
     5724                    else
     5725                        bs3CpuBasic2_CompareGpCtx(&TrapCtx, &CtxExpected, s_aSubTests[iSubTest].uErrCd);
     5726                    Ctx.rflags.u16        &= ~X86_EFL_TF;
     5727                    CtxExpected.rflags.u16 = Ctx.rflags.u16;
     5728                    g_usBs3TestStep++;
     5729                }
     5730            }
     5731        }
    53575732    }
    53585733    /*
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