VirtualBox

Ignore:
Timestamp:
Apr 24, 2016 3:55:00 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
106847
Message:

bs3kit: updates.

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

Legend:

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

    r60678 r60679  
    7373#endif
    7474
     75
    7576/*********************************************************************************************************************************
    7677*   Structures and Typedefs                                                                                                      *
     
    121122extern FNBS3FAR     bs3CpuBasic2_sgdt_bx_ud2_c32;
    122123extern FNBS3FAR     bs3CpuBasic2_sgdt_bx_ud2_c64;
     124extern FNBS3FAR     bs3CpuBasic2_sgdt_ss_bx_ud2_c16;
     125extern FNBS3FAR     bs3CpuBasic2_sgdt_ss_bx_ud2_c32;
     126extern FNBS3FAR     bs3CpuBasic2_sgdt_rexw_bx_ud2_c64;
    123127extern FNBS3FAR     bs3CpuBasic2_sgdt_opsize_bx_ud2_c16;
    124128extern FNBS3FAR     bs3CpuBasic2_sgdt_opsize_bx_ud2_c32;
    125129extern FNBS3FAR     bs3CpuBasic2_sgdt_opsize_bx_ud2_c64;
    126 extern FNBS3FAR     bs3CpuBasic2_lidt_bx_ud2_c16;
    127 extern FNBS3FAR     bs3CpuBasic2_lidt_bx_ud2_c32;
    128 extern FNBS3FAR     bs3CpuBasic2_lidt_bx_ud2_c64;
     130extern FNBS3FAR     bs3CpuBasic2_sgdt_opsize_ss_bx_ud2_c16;
     131extern FNBS3FAR     bs3CpuBasic2_sgdt_opsize_ss_bx_ud2_c32;
     132extern FNBS3FAR     bs3CpuBasic2_sgdt_opsize_rexw_bx_ud2_c64;
    129133#endif
    130134
     
    145149{
    146150    { bs3CpuBasic2_sidt_bx_ud2_c16,             3, false,   BS3_MODE_CODE_16 | BS3_MODE_CODE_V86 },
    147 //    { bs3CpuBasic2_sidt_ss_bx_ud2_c16,          4, true,    BS3_MODE_CODE_16 | BS3_MODE_CODE_V86 },
     151    { bs3CpuBasic2_sidt_ss_bx_ud2_c16,          4, true,    BS3_MODE_CODE_16 | BS3_MODE_CODE_V86 },
    148152    { bs3CpuBasic2_sidt_opsize_bx_ud2_c16,      4, false,   BS3_MODE_CODE_16 | BS3_MODE_CODE_V86 },
    149 //    { bs3CpuBasic2_sidt_opsize_ss_bx_ud2_c16,   5, true,    BS3_MODE_CODE_16 | BS3_MODE_CODE_V86 },
     153    { bs3CpuBasic2_sidt_opsize_ss_bx_ud2_c16,   5, true,    BS3_MODE_CODE_16 | BS3_MODE_CODE_V86 },
    150154    { bs3CpuBasic2_sidt_bx_ud2_c32,             3, false,   BS3_MODE_CODE_32 },
    151 //    { bs3CpuBasic2_sidt_ss_bx_ud2_c32,          4, true,    BS3_MODE_CODE_32 },
     155    { bs3CpuBasic2_sidt_ss_bx_ud2_c32,          4, true,    BS3_MODE_CODE_32 },
    152156    { bs3CpuBasic2_sidt_opsize_bx_ud2_c32,      4, false,   BS3_MODE_CODE_32 },
    153 //    { bs3CpuBasic2_sidt_opsize_ss_bx_ud2_c32,   5, true,    BS3_MODE_CODE_32 },
     157    { bs3CpuBasic2_sidt_opsize_ss_bx_ud2_c32,   5, true,    BS3_MODE_CODE_32 },
    154158    { bs3CpuBasic2_sidt_bx_ud2_c64,             3, false,   BS3_MODE_CODE_64 },
    155159    { bs3CpuBasic2_sidt_rexw_bx_ud2_c64,        4, false,   BS3_MODE_CODE_64 },
     
    158162};
    159163
    160 #if 0
    161 static BS3CB2SIDTSGDT const g_aSgdtNormal[3] =
    162 {
    163     { bs3CpuBasic2_sgdt_bx_ud2_c16, bs3CpuBasic2_sgdt_ss_bx_ud2_c16, BS3_MODE_CODE_16 | BS3_MODE_CODE_V86 },
    164     { bs3CpuBasic2_sgdt_bx_ud2_c32, bs3CpuBasic2_sgdt_ss_bx_ud2_c32, BS3_MODE_CODE_32 },
    165     { bs3CpuBasic2_sgdt_bx_ud2_c64, bs3CpuBasic2_sgdt_rexw_bx_ud2_c64, BS3_MODE_CODE_64 },
     164
     165static BS3CB2SIDTSGDT const g_aSgdtWorkers[] =
     166{
     167    { bs3CpuBasic2_sgdt_bx_ud2_c16,             3, false,   BS3_MODE_CODE_16 | BS3_MODE_CODE_V86 },
     168    { bs3CpuBasic2_sgdt_ss_bx_ud2_c16,          4, true,    BS3_MODE_CODE_16 | BS3_MODE_CODE_V86 },
     169    { bs3CpuBasic2_sgdt_opsize_bx_ud2_c16,      4, false,   BS3_MODE_CODE_16 | BS3_MODE_CODE_V86 },
     170    { bs3CpuBasic2_sgdt_opsize_ss_bx_ud2_c16,   5, true,    BS3_MODE_CODE_16 | BS3_MODE_CODE_V86 },
     171    { bs3CpuBasic2_sgdt_bx_ud2_c32,             3, false,   BS3_MODE_CODE_32 },
     172    { bs3CpuBasic2_sgdt_ss_bx_ud2_c32,          4, true,    BS3_MODE_CODE_32 },
     173    { bs3CpuBasic2_sgdt_opsize_bx_ud2_c32,      4, false,   BS3_MODE_CODE_32 },
     174    { bs3CpuBasic2_sgdt_opsize_ss_bx_ud2_c32,   5, true,    BS3_MODE_CODE_32 },
     175    { bs3CpuBasic2_sgdt_bx_ud2_c64,             3, false,   BS3_MODE_CODE_64 },
     176    { bs3CpuBasic2_sgdt_rexw_bx_ud2_c64,        4, false,   BS3_MODE_CODE_64 },
     177    { bs3CpuBasic2_sgdt_opsize_bx_ud2_c64,      4, false,   BS3_MODE_CODE_64 },
     178    { bs3CpuBasic2_sgdt_opsize_rexw_bx_ud2_c64, 5, false,   BS3_MODE_CODE_64 },
    166179};
    167 
    168 static BS3CB2SIDTSGDT const g_aSgdtOpSize[3] =
    169 {
    170     { bs3CpuBasic2_sgdt_opsize_bx_ud2_c16, bs3CpuBasic2_sgdt_ss_bx_ud2_c16, BS3_MODE_CODE_16 | BS3_MODE_CODE_V86 },
    171     { bs3CpuBasic2_sgdt_opsize_bx_ud2_c32, bs3CpuBasic2_sgdt_ss_bx_ud2_c32, BS3_MODE_CODE_32 },
    172     { bs3CpuBasic2_sgdt_opsize_bx_ud2_c64, bs3CpuBasic2_sgdt_rexw_bx_ud2_c64, BS3_MODE_CODE_64 },
    173 };
    174 #endif
    175180
    176181
     
    13881393    int                 off;
    13891394    unsigned            cb;
    1390     uint8_t             bDpl;
    13911395    uint8_t BS3_FAR    *pbTest;
    13921396Bs3TestPrintf("bs3CpuBasic2_sidt_sgdt_One: %p bTestMode=%#x bRing=%d\n",  pWorker, bTestMode, bRing);
     
    14021406       at our SIDT [xBX] + UD2 combo, and point DS:xBX at abBuf. */
    14031407    Bs3RegCtxSaveEx(&Ctx, bTestMode, 256 /*cbExtraStack*/);
    1404     Bs3RegCtxSetGrpDsFromCurPtr(&Ctx, &Ctx.rbx, abBuf);
     1408    Bs3RegCtxSetGrpSegFromCurPtr(&Ctx, &Ctx.rbx, pWorker->fSs ? &Ctx.ss : &Ctx.ds, abBuf);
    14051409    Bs3RegCtxSetRipCsFromLnkPtr(&Ctx, pWorker->fpfnWorker);
    14061410    if (BS3_MODE_IS_16BIT_SYS(bTestMode))
     
    14581462    {
    14591463        pbBuf = &abBuf[off];
    1460         Bs3RegCtxSetGrpDsFromCurPtr(&Ctx, &Ctx.rbx, &abBuf[off]);
     1464        Bs3RegCtxSetGrpSegFromCurPtr(&Ctx, &Ctx.rbx, pWorker->fSs ? &Ctx.ss : &Ctx.ds, &abBuf[off]);
    14611465        CtxUdExpected.rbx.u = Ctx.rbx.u;
    14621466
     
    14971501    }
    14981502    pbBuf = abBuf;
    1499     Bs3RegCtxSetGrpDsFromCurPtr(&Ctx, &Ctx.rbx, abBuf);
     1503    Bs3RegCtxSetGrpSegFromCurPtr(&Ctx, &Ctx.rbx, pWorker->fSs ? &Ctx.ss : &Ctx.ds, abBuf);
    15001504    CtxUdExpected.rbx.u = Ctx.rbx.u;
    15011505
     
    15151519        Bs3GdteTestPage00.Gen.u8BaseHigh2 = (uint8_t)(uFlatBuf >> 24);
    15161520
    1517         CtxUdExpected.ds = Ctx.ds = BS3_SEL_TEST_PAGE_00 | bRing;
     1521        if (pWorker->fSs)
     1522            CtxUdExpected.ss = Ctx.ss = BS3_SEL_TEST_PAGE_00 | bRing;
     1523        else
     1524            CtxUdExpected.ds = Ctx.ds = BS3_SEL_TEST_PAGE_00 | bRing;
    15181525
    15191526        /* Expand up (normal). */
     
    15391546                else
    15401547                {
    1541                     bs3CpuBasic2_CompareGpCtx(&TrapCtx, &Ctx, 0);
     1548                    if (pWorker->fSs)
     1549                        bs3CpuBasic2_CompareSsCtx(&TrapCtx, &Ctx, 0, false /*f486ResumeFlagHint*/);
     1550                    else
     1551                        bs3CpuBasic2_CompareGpCtx(&TrapCtx, &Ctx, 0);
    15421552                    if (off + 2 <= cbLimit + 1)
    15431553                    {
     
    15961606                else
    15971607                {
    1598                     bs3CpuBasic2_CompareGpCtx(&TrapCtx, &Ctx, 0);
     1608                    if (pWorker->fSs)
     1609                        bs3CpuBasic2_CompareSsCtx(&TrapCtx, &Ctx, 0, false /*f486ResumeFlagHint*/);
     1610                    else
     1611                        bs3CpuBasic2_CompareGpCtx(&TrapCtx, &Ctx, 0);
    15991612                    if (!ASMMemIsAllU8(abBuf, sizeof(abBuf), bFiller))
    16001613                        Bs3TestFailedF("Bytes touched on #GP: cbIdtr=%u off=%u cbLimit=%u bFiller=%#x abBuf=%.*Rhxs\n",
     
    16131626        }
    16141627
    1615         Bs3RegCtxSetGrpDsFromCurPtr(&Ctx, &Ctx.rbx, pbBuf);
     1628        Bs3RegCtxSetGrpSegFromCurPtr(&Ctx, &Ctx.rbx, pWorker->fSs ? &Ctx.ss : &Ctx.ds, abBuf);
     1629        CtxUdExpected.rbx.u = Ctx.rbx.u;
     1630        CtxUdExpected.ss = Ctx.ss;
     1631        CtxUdExpected.ds = Ctx.ds;
    16161632    }
    16171633
     
    16201636     */
    16211637    if (   BS3_MODE_IS_PAGED(bTestMode)
     1638        && (!pWorker->fSs || bRing == 3) /* SS.DPL == CPL, we'll get some tiled ring-3 selector here.  */
    16221639        && (pbTest = (uint8_t BS3_FAR *)Bs3MemGuardedTestPageAlloc(BS3MEMKIND_TILED)) != NULL)
    16231640    {
    16241641        RTCCUINTXREG uFlatTest = Bs3SelPtrToFlat(pbTest);
     1642Bs3TestPrintf("g_usBs3TestStep=%u line=%d\n", g_usBs3TestStep, __LINE__);
    16251643
    16261644        /*
     
    16311649        {
    16321650            Bs3MemSet(&pbTest[X86_PAGE_SIZE - cbIdtr * 2], bFiller, cbIdtr * 2);
    1633             Bs3RegCtxSetGrpDsFromCurPtr(&Ctx, &Ctx.rbx, &pbTest[off]);
     1651            Bs3RegCtxSetGrpSegFromCurPtr(&Ctx, &Ctx.rbx, pWorker->fSs ? &Ctx.ss : &Ctx.ds, &pbTest[off]);
     1652if (pWorker->fSs)
     1653    Bs3RegCtxPrint(&Ctx);
    16341654            Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
    16351655            if (off + cbIdtr <= X86_PAGE_SIZE)
    16361656            {
    16371657                CtxUdExpected.rbx = Ctx.rbx;
     1658                CtxUdExpected.ss  = Ctx.ss;
    16381659                CtxUdExpected.ds  = Ctx.ds;
    16391660                bs3CpuBasic2_CompareUdCtx(&TrapCtx, &CtxUdExpected);
     
    16561677                    Bs3TestPrintf("Wrote partial limit on #PF (#10): Expected %02x, got %02x\n", bFiller, pbTest[off]);
    16571678            }
    1658         }
     1679            g_usBs3TestStep++;
     1680        }
     1681Bs3TestPrintf("g_usBs3TestStep=%u line=%d\n", g_usBs3TestStep, __LINE__);
    16591682
    16601683        /*
     
    16651688        {
    16661689            Bs3MemSet(pbTest, bFiller, 32);
    1667             Bs3RegCtxSetGrpDsFromCurPtr(&Ctx, &Ctx.rbx, &pbTest[off]);
     1690            Bs3RegCtxSetGrpSegFromCurPtr(&Ctx, &Ctx.rbx, pWorker->fSs ? &Ctx.ss : &Ctx.ds, &pbTest[off]);
    16681691            Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
    16691692            if (off >= 0)
    16701693            {
    16711694                CtxUdExpected.rbx = Ctx.rbx;
     1695                CtxUdExpected.ss  = Ctx.ss;
    16721696                CtxUdExpected.ds  = Ctx.ds;
    16731697                bs3CpuBasic2_CompareUdCtx(&TrapCtx, &CtxUdExpected);
     
    16861710                Bs3TestPrintf("Wrote beyond expected area (#13): bFiller=%#x, found %.16Rhxs; off=%d\n",
    16871711                              bFiller, &pbTest[RT_MAX(cbIdtr + off, 0)], off);
     1712            g_usBs3TestStep++;
    16881713        }
    16891714
     
    17041729            Bs3GdteTestPage00.Gen.u8BaseHigh2 = (uint8_t)(uFlatTest >> 24);
    17051730
    1706             CtxUdExpected.ds = Ctx.ds = BS3_SEL_TEST_PAGE_00 | bRing;
     1731            if (pWorker->fSs)
     1732                CtxUdExpected.ss = Ctx.ss = BS3_SEL_TEST_PAGE_00 | bRing;
     1733            else
     1734                CtxUdExpected.ds = Ctx.ds = BS3_SEL_TEST_PAGE_00 | bRing;
    17071735
    17081736            /* Expand up (normal), approaching tail guard page. */
     
    17471775                        if (off <= X86_PAGE_SIZE - 2)
    17481776                        {
    1749                             bs3CpuBasic2_CompareGpCtx(&TrapCtx, &Ctx, 0);
     1777                            if (pWorker->fSs)
     1778                                bs3CpuBasic2_CompareSsCtx(&TrapCtx, &Ctx, 0, false /*f486ResumeFlagHint*/);
     1779                            else
     1780                                bs3CpuBasic2_CompareGpCtx(&TrapCtx, &Ctx, 0);
    17501781                            if (Bs3MemCmp(&pbTest[off], pabExpected, 2) != 0)
    17511782                                Bs3TestPrintf("Mismatch (#16): Expected limit %.2Rhxs, got %.2Rhxs; off=%#x\n",
     
    17691800                    else
    17701801                    {
    1771                         /* #GP on limit. */
    1772                         bs3CpuBasic2_CompareGpCtx(&TrapCtx, &Ctx, 0);
     1802                        /* #GP/#SS on limit. */
     1803                        if (pWorker->fSs)
     1804                            bs3CpuBasic2_CompareSsCtx(&TrapCtx, &Ctx, 0, false /*f486ResumeFlagHint*/);
     1805                        else
     1806                            bs3CpuBasic2_CompareGpCtx(&TrapCtx, &Ctx, 0);
    17731807                        if (   off < X86_PAGE_SIZE
    17741808                            && !ASMMemIsAllU8(&pbTest[off], X86_PAGE_SIZE - off, bFiller))
     
    17851819
    17861820                    /* Set DS to 0 and check that we get #GP(0). */
    1787                     Ctx.ds = 0;
    1788                     Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
    1789                     bs3CpuBasic2_CompareGpCtx(&TrapCtx, &Ctx, 0);
    1790                     g_usBs3TestStep++;
    1791                     Ctx.ds = BS3_SEL_TEST_PAGE_00 | bRing;
     1821                    if (!pWorker->fSs)
     1822                    {
     1823                        Ctx.ds = 0;
     1824                        Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
     1825                        bs3CpuBasic2_CompareGpCtx(&TrapCtx, &Ctx, 0);
     1826                        Ctx.ds = BS3_SEL_TEST_PAGE_00 | bRing;
     1827                        g_usBs3TestStep++;
     1828                    }
    17921829                }
    17931830            }
     
    18261863                            bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, X86_TRAP_PF_RW | (Ctx.bCpl == 3 ? X86_TRAP_PF_US : 0),
    18271864                                                      uFlatTest + off);
     1865                        else if (pWorker->fSs)
     1866                            bs3CpuBasic2_CompareSsCtx(&TrapCtx, &Ctx, 0, false /*f486ResumeFlagHint*/);
    18281867                        else
    18291868                            bs3CpuBasic2_CompareGpCtx(&TrapCtx, &Ctx, 0);
     
    18581897{
    18591898    unsigned idx;
     1899    unsigned bRing;
    18601900    unsigned iStep = 0;
    1861     unsigned bRing = 0;
    1862 
     1901
     1902    /* Note! We skip the SS checks for ring-0 since we badly mess up SS in the
     1903             test and don't want to bother with double faults. */
    18631904    for (bRing = 0; bRing <= 3; bRing++)
    18641905    {
    18651906        for (idx = 0; idx < cWorkers; idx++)
    1866             if (paWorkers[idx].bMode & (bTestMode & BS3_MODE_CODE_MASK))
     1907            if (    (paWorkers[idx].bMode & (bTestMode & BS3_MODE_CODE_MASK))
     1908                && (!paWorkers[idx].fSs || bRing != 0))
    18671909            {
    18681910                g_usBs3TestStep = iStep;
     
    21552197}
    21562198
     2199
     2200BS3_DECL_FAR(uint8_t) TMPL_NM(bs3CpuBasic2_gidt)(uint8_t bMode)
     2201{
     2202    union
     2203    {
     2204        RTGDTR  Gdtr;
     2205        uint8_t ab[16];
     2206    } Expected;
     2207
     2208    g_pszTestMode = TMPL_NM(g_szBs3ModeName);
     2209    g_bTestMode   = bMode;
     2210    g_f16BitSys   = BS3_MODE_IS_16BIT_SYS(TMPL_MODE);
     2211
     2212    BS3_ASSERT(bMode == TMPL_MODE);
     2213
     2214    /*
     2215     * Pass to common worker which is only compiled once per mode.
     2216     */
     2217    Bs3MemZero(&Expected, sizeof(Expected));
     2218    ASMGetGDTR(&Expected.Gdtr);
     2219    bs3CpuBasic2_sidt_sgdt_Common(bMode, g_aSgdtWorkers, RT_ELEMENTS(g_aSgdtWorkers), Expected.ab);
     2220
     2221    /*
     2222     * Re-initialize the IDT.
     2223     */
     2224    Bs3TrapInit();
     2225    return 0;
     2226}
     2227
    21572228#endif /* BS3_INSTANTIATING_MODE */
    21582229
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-template.mac

    r60676 r60679  
    172172AssertCompile(.again - BS3_CMN_NM(bs3CpuBasic2_sgdt_rexw_bx_ud2) == 4)
    173173BS3_PROC_END_CMN   bs3CpuBasic2_sgdt_rexw_bx_ud2
     174
     175BS3_PROC_BEGIN_CMN bs3CpuBasic2_sgdt_opsize_rexw_bx_ud2, BS3_PBC_NEAR
     176        db      X86_OP_PRF_SIZE_OP
     177        db      X86_OP_REX_W
     178        sgdt    [xBX]
     179.again: ud2
     180        jmp     .again
     181AssertCompile(.again - BS3_CMN_NM(bs3CpuBasic2_sgdt_opsize_rexw_bx_ud2) == 5)
     182BS3_PROC_END_CMN   bs3CpuBasic2_sgdt_opsize_rexw_bx_ud2
    174183%endif
    175184
     
    181190AssertCompile(.again - BS3_CMN_NM(bs3CpuBasic2_sgdt_ss_bx_ud2) == 4)
    182191BS3_PROC_END_CMN   bs3CpuBasic2_sgdt_ss_bx_ud2
     192
     193BS3_PROC_BEGIN_CMN bs3CpuBasic2_sgdt_opsize_ss_bx_ud2, BS3_PBC_NEAR
     194        db      X86_OP_PRF_SIZE_OP
     195        sgdt    [ss:xBX]
     196.again: ud2
     197        jmp     .again
     198AssertCompile(.again - BS3_CMN_NM(bs3CpuBasic2_sgdt_opsize_ss_bx_ud2) == 5)
     199BS3_PROC_END_CMN   bs3CpuBasic2_sgdt_opsize_ss_bx_ud2
    183200%endif
    184201
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-SelFlatDataToProtFar16.asm

    r60657 r60679  
    5656
    5757        ;
     58        ; Check if we can use the protected mode stack or data selector.
     59        ; The latter ensures the usability of this function for setting SS.
     60        ;
     61%if TMPL_BITS == 16
     62        mov     ax, [xBP + xCB + cbCurRetAddr]
     63        mov     dx, [xBP + xCB + cbCurRetAddr + 2]
     64        test    dx, dx
     65        jnz     .not_stack
     66        mov     dx, BS3_SEL_R0_SS16
     67%else
     68        mov     eax, [xBP + xCB + cbCurRetAddr]
     69        test    eax, 0ffff0000h
     70        jnz     .not_stack
     71        or      eax, BS3_SEL_R0_SS16 << 16
     72%endif
     73        jmp     .return
     74
     75.not_stack:
     76%if TMPL_BITS == 16
     77        sub     ax, BS3_ADDR_BS3DATA16 & 0xffff
     78        sbb     dx, BS3_ADDR_BS3DATA16 >> 16
     79        jnz     .do_tiled
     80        mov     dx, BS3_SEL_R0_DS16
     81%else
     82        sub     eax, BS3_ADDR_BS3DATA16
     83        test    eax, 0ffff0000h
     84        jnz     .do_tiled
     85        or      eax, BS3_SEL_R0_DS16 << 16
     86%endif
     87        jmp     .return
     88
     89        ;
    5890        ; Just translate the address to tiled.
    5991        ;
     92.do_tiled:
    6093%if TMPL_BITS == 16
    6194        ; Convert upper 16-bit to a tiled selector.
     
    95128%endif
    96129
     130.return:
    97131        pop     xBP
    98132        BS3_HYBRID_RET
Note: See TracChangeset for help on using the changeset viewer.

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