VirtualBox

Changeset 97619 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Nov 21, 2022 2:18:08 AM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
154663
Message:

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

Location:
trunk/src/VBox/ValidationKit/bootsectors
Files:
2 edited

Legend:

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

    r97489 r97619  
    6161        jmp     .again
    6262BS3_PROC_END   _bs3CpuBasic2_ud2
     63
     64
     65BS3_PROC_BEGIN _bs3CpuBasic2_stac_ud2
     66        stac
     67.again:
     68        ud2
     69        jmp     .again
     70BS3_PROC_END   _bs3CpuBasic2_stac_ud2
    6371
    6472
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-x0.c

    r97617 r97619  
    8181*   Structures and Typedefs                                                                                                      *
    8282*********************************************************************************************************************************/
     83/** Near void pointer. */
     84typedef void BS3_NEAR *NPVOID;
     85
    8386typedef struct BS3CB2INVLDESCTYPE
    8487{
     
    130133#define             g_bs3CpuBasic2_ud2_FlatAddr BS3_DATA_NM(g_bs3CpuBasic2_ud2_FlatAddr)
    131134extern uint32_t     g_bs3CpuBasic2_ud2_FlatAddr;
     135
     136extern FNBS3FAR     bs3CpuBasic2_salc_ud2;
    132137
    133138extern FNBS3FAR     bs3CpuBasic2_iret;
     
    49894994    unsigned                iSubTest;
    49904995    BS3PTRUNION             StkPtr;
     4996#define LOW_UD_ADDR             0x0609
     4997    uint8_t BS3_FAR * const pbLowUd     = BS3_FP_MAKE(BS3_FP_SEG(&StkPtr), LOW_UD_ADDR);
     4998#define LOW_SALC_UD_ADDR        0x0611
     4999    uint8_t BS3_FAR * const pbLowSalcUd = BS3_FP_MAKE(BS3_FP_SEG(&StkPtr), LOW_SALC_UD_ADDR);
     5000#define BS3TEXT16_ADDR_HI   (BS3_ADDR_BS3TEXT16 >> 16)
    49915001
    49925002    /* make sure they're allocated  */
     
    49965006
    49975007    bs3CpuBasic2_SetGlobals(bMode);
     5008
     5009    //if (!BS3_MODE_IS_64BIT_SYS(bMode) && bMode != BS3_MODE_PP32_16) return 0xff;
     5010
     5011    /*
     5012     * When dealing retf with 16-bit effective operand size to 32-bit or 64-bit
     5013     * code, we're restricted to a 16-bit address.  So, we plant a UD
     5014     * instruction below 64KB that we can target with flat 32/64 code segments.
     5015     * (Putting it on the stack would be possible too, but we'd have to create
     5016     * the sub-test tables dynamically, which isn't necessary.)
     5017     */
     5018    Bs3MemSet(&pbLowUd[-9], 0xcc, 32);
     5019    Bs3MemSet(&pbLowSalcUd[-9], 0xcc, 32);
     5020    pbLowUd[0] = 0x0f;      /* ud2 */
     5021    pbLowUd[1] = 0x0b;
     5022
     5023    /* A variation to detect whether we're in 64-bit or 16-bit mode when
     5024       executing the code. */
     5025    pbLowSalcUd[0] = 0xd6;  /* salc */
     5026    pbLowSalcUd[1] = 0x0f;  /* ud2 */
     5027    pbLowSalcUd[2] = 0x0b;
    49985028
    49995029    /*
     
    50465076            int8_t      iXcpt;
    50475077            RTSEL       uStartSs;
     5078            uint8_t     cDstBits;
    50485079            RTSEL       uDstCs;
    50495080            union   /* must use a union here as the compiler won't compile if uint16_t and will mess up fixups for uint32_t. */
    50505081            {
    5051                 void __near *pv;
    50525082                uint32_t     offDst;
     5083                struct
     5084                {
     5085                    NPVOID   pv;
     5086                    uint16_t uHigh;
     5087                } s;
    50535088            };
    50545089            RTSEL       uDstSs;
    50555090            uint16_t    uErrCd;
    50565091        } const s_aSubTests[] =
    5057         { /* rm/v86, PriChg, Xcpt,  uStartSs,          uDstCs               offDst/pv                                uDstSs              uErrCd */
    5058             {  true, false, -1,                   0, BS3_SEL_TEXT16,      { .pv = (void __near *)bs3CpuBasic2_ud2 }, 0 },
    5059             { false, false, -1, BS3_SEL_R0_SS16 | 0, BS3_SEL_TEXT16  | 0, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R0_SS16 | 0 },
    5060             { false, false, -1, BS3_SEL_R0_SS16 | 0, BS3_SEL_R0_CS16 | 0, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R0_SS16 | 0 },
    5061             { false, false, -1, BS3_SEL_R0_SS32 | 0, BS3_SEL_R0_CS16 | 0, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R0_SS16 | 0 },
    5062             { false,  true, -1, BS3_SEL_R0_SS16 | 0, BS3_SEL_R1_CS16 | 1, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R1_SS16 | 1 },
    5063             { false,  true, -1, BS3_SEL_R0_SS32 | 0, BS3_SEL_R1_CS16 | 1, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R1_SS16 | 1 },
    5064             { false,  true, -1, BS3_SEL_R0_SS16 | 0, BS3_SEL_R1_CS16 | 1, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R1_SS32 | 1 },
    5065             { false,  true, -1, BS3_SEL_R0_SS32 | 0, BS3_SEL_R1_CS16 | 1, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R1_SS32 | 1 },
    5066             { false,  true, -1, BS3_SEL_R0_SS16 | 0, BS3_SEL_R2_CS16 | 2, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R2_SS16 | 2 },
    5067             { false,  true, -1, BS3_SEL_R0_SS32 | 0, BS3_SEL_R2_CS16 | 2, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R2_SS16 | 2 },
    5068             { false,  true, -1, BS3_SEL_R0_SS16 | 0, BS3_SEL_R2_CS16 | 2, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R2_SS32 | 2 },
    5069             { false,  true, -1, BS3_SEL_R0_SS32 | 0, BS3_SEL_R2_CS16 | 2, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R2_SS32 | 2 },
    5070             { false,  true, -1, BS3_SEL_R0_SS16 | 0, BS3_SEL_R3_CS16 | 3, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R3_SS16 | 3 },
    5071             { false,  true, -1, BS3_SEL_R0_SS32 | 0, BS3_SEL_R3_CS16 | 3, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R3_SS16 | 3 },
    5072             { false,  true, -1, BS3_SEL_R0_SS16 | 0, BS3_SEL_R3_CS16 | 3, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R3_SS32 | 3 },
    5073             { false,  true, -1, BS3_SEL_R0_SS32 | 0, BS3_SEL_R3_CS16 | 3, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R3_SS32 | 3 },
    5074             /* some #GP variations */ /** @todo test all possible exceptions! */
    5075             { false,  true, 14, BS3_SEL_R0_SS32 | 0, BS3_SEL_R3_CS16 | 2, { .pv = (void __near *)bs3CpuBasic2_ud2 }, BS3_SEL_R2_SS16 | 2, BS3_SEL_R3_CS16 },
     5092        { /* rm/v86, PriChg, Xcpt,  uStartSs,    => bits    uDstCs                   offDst/pv                                                    uDstSs               uErrCd */
     5093            {  true, false, -1,                   0, 16, BS3_SEL_TEXT16,          { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          0,                   0 },
     5094            { false, false, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_TEXT16  | 0,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R0_SS16 | 0, 0 },
     5095            { false, false, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R0_CS16 | 0,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R0_SS16 | 0, 0 },
     5096            { false, false, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R0_CS16 | 0,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R0_SS16 | 0, 0 },
     5097            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R1_CS16 | 1,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R1_SS16 | 1, 0 },
     5098            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R1_CS16 | 1,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R1_SS16 | 1, 0 },
     5099            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R1_CS16 | 1,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R1_SS32 | 1, 0 },
     5100            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R1_CS16 | 1,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R1_SS32 | 1, 0 },
     5101            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R2_CS16 | 2,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R2_SS16 | 2, 0 },
     5102            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R2_CS16 | 2,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R2_SS16 | 2, 0 },
     5103            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R2_CS16 | 2,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R2_SS32 | 2, 0 },
     5104            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R2_CS16 | 2,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R2_SS32 | 2, 0 },
     5105            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R3_CS16 | 3,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R3_SS16 | 3, 0 },
     5106            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R3_CS16 | 3,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R3_SS16 | 3, 0 },
     5107            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R3_CS16 | 3,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R3_SS32 | 3, 0 },
     5108            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 16, BS3_SEL_R3_CS16 | 3,     { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R3_SS32 | 3, 0 },
     5109            /* conforming stuff */
     5110            { false, false, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R0_CS16_CNF | 0, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R0_SS16 | 0, 0 },
     5111            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R0_CS16_CNF | 1, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R1_SS16 | 1, 0 },
     5112            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R0_CS16_CNF | 1, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R0_SS16 | 1, BS3_SEL_R0_SS16 },
     5113            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R0_CS16_CNF | 2, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R2_SS16 | 2, 0 },
     5114            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R0_CS16_CNF | 3, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R3_SS16 | 3, 0 },
     5115            { false, false, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R1_CS16_CNF | 0, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R0_SS16 | 0, BS3_SEL_R1_CS16_CNF },
     5116            { false, false, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R1_CS16_CNF | 0, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R1_SS16 | 1, BS3_SEL_R1_CS16_CNF },
     5117            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R1_CS16_CNF | 1, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R1_SS16 | 1, 0 },
     5118            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R1_CS16_CNF | 2, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R2_SS16 | 2, 0 },
     5119            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R1_CS16_CNF | 3, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R3_SS16 | 3, 0 },
     5120            { false, false, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R2_CS16_CNF | 0, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R0_SS16 | 0, BS3_SEL_R2_CS16_CNF },
     5121            { false, false, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R2_CS16_CNF | 0, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R1_SS16 | 1, BS3_SEL_R2_CS16_CNF },
     5122            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R2_CS16_CNF | 1, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R1_SS16 | 1, BS3_SEL_R2_CS16_CNF },
     5123            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R2_CS16_CNF | 1, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R0_SS16 | 0, BS3_SEL_R2_CS16_CNF },
     5124            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R2_CS16_CNF | 2, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R2_SS16 | 2, 0 },
     5125            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R2_CS16_CNF | 3, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R3_SS16 | 3, 0 },
     5126            { false, false, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R3_CS16_CNF | 0, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R0_SS16 | 0, BS3_SEL_R3_CS16_CNF },
     5127            { false, false, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R3_CS16_CNF | 0, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R1_SS16 | 1, BS3_SEL_R3_CS16_CNF },
     5128            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R3_CS16_CNF | 1, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R1_SS16 | 1, BS3_SEL_R3_CS16_CNF },
     5129            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R3_CS16_CNF | 1, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R0_SS16 | 0, BS3_SEL_R3_CS16_CNF },
     5130            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R3_CS16_CNF | 2, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R2_SS16 | 2, BS3_SEL_R3_CS16_CNF },
     5131            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R3_CS16_CNF | 2, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R3_SS16 | 2, BS3_SEL_R3_CS16_CNF },
     5132            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 16, BS3_SEL_R3_CS16_CNF | 3, { .s = { (NPVOID)bs3CpuBasic2_ud2 } },                          BS3_SEL_R3_SS16 | 3, 0 },
     5133            /* returning to 32-bit code: */
     5134            { false, false, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R0_CS32 | 0,     { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R0_SS16 | 0, 0 },
     5135            { false, false, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R0_CS32 | 0,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },        BS3_SEL_R0_SS16 | 0, 0 },
     5136            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R1_CS32 | 1,     { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R1_SS16 | 1, 0 },
     5137            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R1_CS32 | 1,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },        BS3_SEL_R1_SS16 | 1, 0 },
     5138            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R1_CS32 | 1,     { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R1_SS32 | 1, 0 },
     5139            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R1_CS32 | 1,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },        BS3_SEL_R1_SS32 | 1, 0 },
     5140            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R2_CS32 | 2,     { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R2_SS16 | 2, 0 },
     5141            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R2_CS32 | 2,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },        BS3_SEL_R2_SS16 | 2, 0 },
     5142            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R2_CS32 | 2,     { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R2_SS32 | 2, 0 },
     5143            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R2_CS32 | 2,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },        BS3_SEL_R2_SS32 | 2, 0 },
     5144            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R3_CS32 | 3,     { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R3_SS16 | 3, 0 },
     5145            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R3_CS32 | 3,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },        BS3_SEL_R3_SS16 | 3, 0 },
     5146            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R3_CS32 | 3,     { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R3_SS32 | 3, 0 },
     5147            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R3_CS32 | 3,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },        BS3_SEL_R3_SS32 | 3, 0 },
     5148            { false, false, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R0_CS32 | 0,     { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R0_SS32 | 0, 0 },
     5149            { false, false, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R0_CS32 | 0,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },        BS3_SEL_R0_SS32 | 0, 0 },
     5150            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R1_CS32 | 1,     { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R1_SS32 | 1, 0 },
     5151            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R1_CS32 | 1,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },        BS3_SEL_R1_SS32 | 1, 0 },
     5152            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R1_CS32 | 1,     { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R1_SS16 | 1, 0 },
     5153            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R1_CS32 | 1,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },        BS3_SEL_R1_SS16 | 1, 0 },
     5154            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R2_CS32 | 2,     { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R2_SS32 | 2, 0 },
     5155            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R2_CS32 | 2,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },        BS3_SEL_R2_SS32 | 2, 0 },
     5156            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R2_CS32 | 2,     { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R2_SS16 | 2, 0 },
     5157            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R2_CS32 | 2,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },        BS3_SEL_R2_SS16 | 2, 0 },
     5158            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R3_CS32 | 3,     { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R3_SS32 | 3, 0 },
     5159            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R3_CS32 | 3,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },        BS3_SEL_R3_SS32 | 3, 0 },
     5160            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R3_CS32 | 3,     { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R3_SS16 | 3, 0 },
     5161            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 32, BS3_SEL_R3_CS32 | 3,     { .s = {(NPVOID)bs3CpuBasic2_ud2, BS3TEXT16_ADDR_HI } },        BS3_SEL_R3_SS16 | 3, 0 },
     5162            /* returning to 32-bit conforming code: */
     5163            { false, false, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R0_CS32_CNF | 0, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R0_SS16 | 0, 0 },
     5164            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R0_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R1_SS16 | 1, 0 },
     5165            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R0_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R0_SS16 | 1, BS3_SEL_R0_SS16 },
     5166            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R0_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R0_SS16 | 0, BS3_SEL_R0_SS16 },
     5167            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R0_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R3_SS16 | 1, BS3_SEL_R3_SS16 },
     5168            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R0_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R3_SS16 | 3, BS3_SEL_R3_SS16 },
     5169            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R0_CS32_CNF | 2, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R2_SS16 | 2, 0 },
     5170            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R0_CS32_CNF | 3, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R3_SS16 | 3, 0 },
     5171            { false, false, 14, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R1_CS32_CNF | 0, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R0_SS16 | 0, BS3_SEL_R1_CS32_CNF },
     5172            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R1_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R1_SS16 | 1, 0 },
     5173            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R1_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R0_SS16 | 1, BS3_SEL_R0_SS16 },
     5174            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R1_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R0_SS16 | 0, BS3_SEL_R0_SS16 },
     5175            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R1_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R3_SS16 | 1, BS3_SEL_R3_SS16 },
     5176            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R1_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R3_SS16 | 3, BS3_SEL_R3_SS16 },
     5177            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R1_CS32_CNF | 2, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R2_SS16 | 2, 0 },
     5178            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R1_CS32_CNF | 3, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R3_SS16 | 3, 0 },
     5179            { false, false, 14, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R2_CS32_CNF | 0, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R0_SS16 | 0, BS3_SEL_R2_CS32_CNF },
     5180            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R2_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R1_SS16 | 1, BS3_SEL_R2_CS32_CNF },
     5181            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R2_CS32_CNF | 2, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R2_SS16 | 2, 0 },
     5182            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R2_CS32_CNF | 3, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R3_SS16 | 3, 0 },
     5183            { false, false, 14, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R3_CS32_CNF | 0, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R0_SS16 | 0, BS3_SEL_R3_CS32_CNF },
     5184            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R3_CS32_CNF | 1, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R1_SS16 | 1, BS3_SEL_R3_CS32_CNF },
     5185            { false,  true, 42, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R3_CS32_CNF | 2, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R2_SS16 | 2, BS3_SEL_R3_CS32_CNF },
     5186            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 32, BS3_SEL_R3_CS32_CNF | 3, { .offDst = LOW_UD_ADDR },                                      BS3_SEL_R3_SS16 | 3, 0 },
     5187            /* returning to 64-bit code or 16-bit when not in long mode: */
     5188            { false, false, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R0_CS64 | 0,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R0_SS16 | 0, 0 },
     5189            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R1_CS64 | 1,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R1_SS16 | 1, 0 },
     5190            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R2_CS64 | 2,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R2_SS16 | 2, 0 },
     5191            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R3_CS64 | 3,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R3_SS16 | 3, 0 },
     5192            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R1_CS64 | 1,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R0_DS64 | 1, BS3_SEL_R0_DS64 },
     5193            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R1_CS64 | 1,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R1_DS64 | 1, 0 },
     5194            { false, false, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R0_CS64 | 0,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R0_SS32 | 0, 0 },
     5195            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R1_CS64 | 1,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R1_SS16 | 1, 0 },
     5196            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R1_CS64 | 1,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R1_SS32 | 1, 0 },
     5197            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R2_CS64 | 2,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R2_SS16 | 2, 0 },
     5198            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R2_CS64 | 2,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R2_SS32 | 2, 0 },
     5199            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R3_CS64 | 3,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R3_SS16 | 3, 0 },
     5200            { false,  true, -1, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R3_CS64 | 3,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R3_SS32 | 3, 0 },
     5201            { false,  true, 14, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R2_CS64 | 3,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R3_SS32 | 3, BS3_SEL_R2_CS64 },
     5202            { false,  true, 14, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R2_CS64 | 3,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R1_SS32 | 3, BS3_SEL_R2_CS64 },
     5203            { false,  true, 14, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R3_CS64 | 3,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R1_SS32 | 3, BS3_SEL_R1_SS32 },
     5204            { false,  true, 14, BS3_SEL_R0_SS32 | 0, 64, BS3_SEL_R3_CS64 | 3,     { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R3_SS32 | 2, BS3_SEL_R3_SS32 },
     5205            /* returning to 64-bit code or 16-bit when not in long mode, conforming code variant: */
     5206            { false, false, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R0_CS64_CNF | 0, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R0_SS16 | 0, 0 },
     5207            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R0_CS64_CNF | 1, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R1_SS16 | 1, 0 },
     5208            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R0_CS64_CNF | 2, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R2_SS16 | 2, 0 },
     5209            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R0_CS64_CNF | 3, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R3_SS16 | 3, 0 },
     5210
     5211            { false, false, 14, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R1_CS64_CNF | 0, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R0_SS16 | 0, BS3_SEL_R1_CS64_CNF },
     5212            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R1_CS64_CNF | 1, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R1_SS16 | 1, 0 },
     5213            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R1_CS64_CNF | 1, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R1_SS16 | 2, BS3_SEL_R1_SS16 },
     5214            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R1_CS64_CNF | 1, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R2_SS16 | 1, BS3_SEL_R2_SS16 },
     5215            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R1_CS64_CNF | 1, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R2_SS16 | 2, BS3_SEL_R2_SS16 },
     5216            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R1_CS64_CNF | 2, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R2_SS16 | 2, 0 },
     5217            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R1_CS64_CNF | 3, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R3_SS16 | 3, 0 },
     5218
     5219            { false, false, 14, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R2_CS64_CNF | 0, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R0_SS16 | 0, BS3_SEL_R2_CS64_CNF },
     5220            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R2_CS64_CNF | 1, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R1_SS16 | 1, BS3_SEL_R2_CS64_CNF },
     5221            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R2_CS64_CNF | 2, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R2_SS16 | 2, 0 },
     5222            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R2_CS64_CNF | 3, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R3_SS16 | 3, 0 },
     5223
     5224            { false, false, 14, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R3_CS64_CNF | 0, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R0_SS16 | 0, BS3_SEL_R3_CS64_CNF },
     5225            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R3_CS64_CNF | 1, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R1_SS16 | 1, BS3_SEL_R3_CS64_CNF },
     5226            { false,  true, 14, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R3_CS64_CNF | 2, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R2_SS16 | 2, BS3_SEL_R3_CS64_CNF },
     5227            { false,  true, -1, BS3_SEL_R0_SS16 | 0, 64, BS3_SEL_R3_CS64_CNF | 3, { .offDst = LOW_SALC_UD_ADDR },                                 BS3_SEL_R3_SS16 | 3, 0 },
     5228
     5229            /* 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 },
    50765231        };
    50775232
     
    50805235        for (iTest = 0; iTest < RT_ELEMENTS(s_aTests); iTest++)
    50815236        {
    5082             g_usBs3TestStep = iTest << 8;
    50835237            Bs3RegCtxSetRipCsFromLnkPtr(&Ctx, s_aTests[iTest].pfnTest);
    50845238
    50855239            for (iSubTest = 0; iSubTest < RT_ELEMENTS(s_aSubTests); iSubTest++)
    5086                 if (s_aSubTests[iSubTest].fRmOrV86 == fRmOrV86)
     5240            {
     5241                g_usBs3TestStep = (iTest << 8) | (iSubTest << 2);
     5242                if (   s_aSubTests[iSubTest].fRmOrV86 == fRmOrV86
     5243                    && (s_aSubTests[iSubTest].offDst <= UINT16_MAX || s_aTests[iTest].fOpSizePfx))
    50875244                {
    50885245                    uint16_t const cbFrmDisp = s_aSubTests[iSubTest].fInterPriv ? iSubTest % 7 : 0;
     
    51025259                        if (s_aTests[iTest].fOpSizePfx)
    51035260                            uDstRspPush = (uDstRspPush & UINT16_MAX) | UINT32_C(0xacdc0000);
    5104                         if (uDstSs == (BS3_SEL_R1_SS32 | 1) || uDstSs == (BS3_SEL_R2_SS32 | 2) || uDstSs == (BS3_SEL_R3_SS32 | 3))
     5261                        if (   uDstSs == (BS3_SEL_R1_SS32 | 1)
     5262                            || uDstSs == (BS3_SEL_R2_SS32 | 2)
     5263                            || uDstSs == (BS3_SEL_R3_SS32 | 3)
     5264                            || (s_aSubTests[iSubTest].cDstBits == 64 && BS3_MODE_IS_64BIT_SYS(bMode)))
    51055265                        {
    51065266                            if (s_aTests[iTest].fOpSizePfx)
     
    51205280                    CtxExpected.rip.u = Ctx.rip.u;
    51215281                    CtxExpected.rsp.u = Ctx.rsp.u;
     5282                    CtxExpected.rax.u = Ctx.rax.u;
    51225283                    if (s_aSubTests[iSubTest].iXcpt < 0)
    51235284                    {
    51245285                        CtxExpected.cs    = s_aSubTests[iSubTest].uDstCs;
    51255286                        CtxExpected.rip.u = s_aSubTests[iSubTest].offDst;
     5287                        if (s_aSubTests[iSubTest].cDstBits == 64 && !BS3_MODE_IS_64BIT_SYS(bMode))
     5288                        {
     5289                            CtxExpected.rip.u     += 1;
     5290                            CtxExpected.rax.au8[0] = CtxExpected.rflags.u16 & X86_EFL_CF ? 0xff : 0;
     5291                        }
    51265292                        CtxExpected.ss    = uDstSs;
    51275293                        CtxExpected.rsp.u = uDstRspExpect;
     
    51445310                        }
    51455311                    }
     5312                    g_uBs3TrapEipHint = CtxExpected.rip.u32;
    51465313                    //Bs3TestPrintf("cs:rip=%04RX16:%04RX64 -> %04RX16:%04RX64\n", Ctx.cs, Ctx.rip.u, CtxExpected.cs, CtxExpected.rip.u);
    51475314                    //Bs3TestPrintf("ss:rsp=%04RX16:%04RX64 -> %04RX16:%04RX64 [pushed %#RX64]\n", Ctx.ss, Ctx.rsp.u, CtxExpected.ss, CtxExpected.rsp.u, uDstRspPush);
     
    51495316                                                s_aSubTests[iSubTest].fInterPriv, s_aTests[iTest].cbImm,
    51505317                                                s_aSubTests[iSubTest].uDstSs, uDstRspPush);
    5151                     //Bs3TestPrintf("%p: %04RX16 %04RX16 %04RX16 %04RX16\n%.48Rhxd\n", StkPtr.pu16, StkPtr.pu16[0], StkPtr.pu16[1], StkPtr.pu16[2], StkPtr.pu16[3], StkPtr.pu16);
     5318                    //Bs3TestPrintf("%p: %04RX16 %04RX16 %04RX16 %04RX16\n", StkPtr.pu16, StkPtr.pu16[0], StkPtr.pu16[1], StkPtr.pu16[2], StkPtr.pu16[3]);
     5319                    //Bs3TestPrintf("%.48Rhxd\n", StkPtr.pu16);
    51525320                    Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
    51535321                    if (s_aSubTests[iSubTest].iXcpt < 0)
     
    51625330                    Ctx.rflags.u16        |= X86_EFL_TF;
    51635331                    CtxExpected.rflags.u16 = Ctx.rflags.u16;
     5332                    if (s_aSubTests[iSubTest].iXcpt < 0 && s_aSubTests[iSubTest].cDstBits == 64 && !BS3_MODE_IS_64BIT_SYS(bMode))
     5333                    {
     5334                        CtxExpected.rip.u -= 1;
     5335                        CtxExpected.rax.u  = Ctx.rax.u;
     5336                    }
    51645337                    bs3CpuBasic2_retf_PrepStack(StkPtr, cbStkItem, s_aSubTests[iSubTest].uDstCs, s_aSubTests[iSubTest].offDst,
    51655338                                                s_aSubTests[iSubTest].fInterPriv, s_aTests[iTest].cbImm,
     
    51745347                    g_usBs3TestStep++;
    51755348                }
     5349            }
    51765350        }
    51775351    }
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