VirtualBox

Changeset 21286 in vbox


Ignore:
Timestamp:
Jul 7, 2009 12:53:55 AM (15 years ago)
Author:
vboxsync
Message:

tstRTR0MemUserKernel: Testcase for the RTR0MemUser/Kernel API.

Location:
trunk/src/VBox/Runtime/testcase
Files:
1 edited
3 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/testcase/Makefile.kmk

    r21082 r21286  
    7575        tstMemAutoPtr \
    7676        tstRTMemPool \
     77        tstRTR0MemUserKernelDriver \
    7778        tstMove \
    7879        tstMp-1 \
     
    126127        tstLdrObj \
    127128        tstLdrObjR0 \
     129        tstRTR0MemUserKernel \
    128130        tstR0ThreadPreemption
    129131if1of ($(VBOX_LDR_FMT)), lx pe)
     
    290292tstRTMemPool_TEMPLATE = VBOXR3TSTEXE
    291293tstRTMemPool_SOURCES = tstRTMemPool.cpp
     294
     295tstRTR0MemUserKernel_TEMPLATE = VBOXR0
     296tstRTR0MemUserKernel_INST = $(INST_TESTCASE)
     297tstRTR0MemUserKernel_DEFS = IN_RT_R0
     298tstRTR0MemUserKernel_SYSSUFF = .r0
     299tstRTR0MemUserKernel_SOURCES = tstRTR0MemUserKernel.cpp
     300tstRTR0MemUserKernel_LIBS = $(PATH_LIB)/RuntimeR0$(VBOX_SUFF_LIB)
     301if1of ($(VBOX_LDR_FMT), pe lx)
     302 tstRTR0MemUserKernel_LIBS += $(PATH_LIB)/SUPR0$(VBOX_SUFF_LIB)
     303endif
     304
     305tstRTR0MemUserKernelDriver_SOURCES = tstRTR0MemUserKernelDriver.cpp
    292306
    293307tstMove_SOURCES = tstMove.cpp
  • trunk/src/VBox/Runtime/testcase/tstRTR0MemUserKernel.cpp

    r21283 r21286  
    3232*   Header Files                                                               *
    3333*******************************************************************************/
    34 #include <iprt/thread.h>
     34#include <iprt/mem.h>
    3535
    3636#include <iprt/err.h>
     37#include <iprt/param.h>
    3738#include <iprt/time.h>
    3839#include <iprt/string.h>
    3940#include <VBox/sup.h>
    40 #include <VBox/x86.h>
    41 #include "tstR0ThreadPreemption.h"
     41#include "tstRTR0MemUserKernel.h"
    4242
    4343
     
    5151 * @param   pReqHdr     The request header. Input / Output. Optional.
    5252 */
    53 DECLEXPORT(int) TSTR0ThreadPreemptionSrvReqHandler(PSUPDRVSESSION pSession, uint32_t uOperation,
    54                                                    uint64_t u64Arg, PSUPR0SERVICEREQHDR pReqHdr)
     53DECLEXPORT(int) TSTRTR0MemUserKernelSrvReqHandler(PSUPDRVSESSION pSession, uint32_t uOperation,
     54                                                  uint64_t u64Arg, PSUPR0SERVICEREQHDR pReqHdr)
    5555{
    56     if (u64Arg)
    57         return VERR_INVALID_PARAMETER;
    5856    if (!VALID_PTR(pReqHdr))
    5957        return VERR_INVALID_PARAMETER;
     
    6563
    6664    /*
     65     * R3Ptr is valid and good for up to a page. The page before
     66     * and after are both invalid.
     67     */
     68    RTR3PTR R3Ptr = (RTR3PTR)u64Arg;
     69    if (R3Ptr != u64Arg)
     70        return VERR_INVALID_PARAMETER;
     71
     72    /*
     73     * Allocate a kernel buffer.
     74     */
     75    uint8_t *pbKrnlBuf = (uint8_t *)RTMemAlloc(PAGE_SIZE * 2);
     76    if (!pbKrnlBuf)
     77    {
     78        RTStrPrintf(pszErr, cchErr, "!no memory for kernel buffers");
     79        return VINF_SUCCESS;
     80    }
     81
     82    /*
    6783     * The big switch.
    6884     */
    6985    switch (uOperation)
    7086    {
    71         case TSTR0THREADPREMEPTION_SANITY_OK:
     87        case TSTRTR0MEMUSERKERNEL_SANITY_OK:
    7288            break;
    7389
    74         case TSTR0THREADPREMEPTION_SANITY_FAILURE:
     90        case TSTRTR0MEMUSERKERNEL_SANITY_FAILURE:
    7591            RTStrPrintf(pszErr, cchErr, "!42failure42%1024s", "");
    7692            break;
    7793
    78         case TSTR0THREADPREMEPTION_BASIC:
     94        case TSTRTR0MEMUSERKERNEL_BASIC:
    7995        {
    80             RTTHREADPREEMPTSTATE State = RTTHREADPREEMPTSTATE_INITIALIZER;
    81             if (!RTThreadPreemptIsEnabled(NIL_RTTHREAD))
    82                 RTStrPrintf(pszErr, cchErr, "RTThreadPreemptIsEnabled returns false by default");
    83             RTThreadPreemptDisable(&State);
    84             if (RTThreadPreemptIsEnabled(NIL_RTTHREAD))
    85                 RTStrPrintf(pszErr, cchErr, "!RTThreadPreemptIsEnabled returns true after RTThreadPreemptDisable");
    86             else if (!(ASMGetFlags() & X86_EFL_IF))
    87                 RTStrPrintf(pszErr, cchErr, "!Interrupts disabled");
    88             RTThreadPreemptRestore(&State);
     96            int rc = RTR0MemUserCopyFrom(pbKrnlBuf, R3Ptr, PAGE_SIZE);
     97            if (rc == VINF_SUCCESS)
     98            {
     99                rc = RTR0MemUserCopyTo(R3Ptr, pbKrnlBuf, PAGE_SIZE);
     100                if (rc == VINF_SUCCESS)
     101                {
     102                    if (RTR0MemUserIsValidAddr(R3Ptr))
     103                    {
     104                        if (RTR0MemKernelIsValidAddr(pbKrnlBuf))
     105                        {
     106                            if (RTR0MemAreKrnlAndUsrDifferent())
     107                            {
     108                                RTStrPrintf(pszErr, cchErr, "RTR0MemAreKrnlAndUsrDifferent returns true");
     109                                if (!RTR0MemUserIsValidAddr((uintptr_t)pbKrnlBuf))
     110                                {
     111                                    if (!RTR0MemKernelIsValidAddr((void *)R3Ptr))
     112                                    {
     113                                        /* done */
     114                                    }
     115                                    else
     116                                        RTStrPrintf(pszErr, cchErr, "! #5 - RTR0MemKernelIsValidAddr -> true, expected false");
     117                                }
     118                                else
     119                                    RTStrPrintf(pszErr, cchErr, "! #5 - RTR0MemUserIsValidAddr -> true, expected false");
     120                            }
     121                            else
     122                                RTStrPrintf(pszErr, cchErr, "RTR0MemAreKrnlAndUsrDifferent returns false");
     123                        }
     124                        else
     125                            RTStrPrintf(pszErr, cchErr, "! #4 - RTR0MemKernelIsValidAddr -> false, expected true");
     126                    }
     127                    else
     128                        RTStrPrintf(pszErr, cchErr, "! #3 - RTR0MemUserIsValidAddr -> false, expected true");
     129                }
     130                else
     131                    RTStrPrintf(pszErr, cchErr, "! #2 - RTR0MemUserCopyTo -> %Rrc expected %Rrc", rc, VINF_SUCCESS);
     132            }
     133            else
     134                RTStrPrintf(pszErr, cchErr, "! #1 - RTR0MemUserCopyFrom -> %Rrc expected %Rrc", rc, VINF_SUCCESS);
    89135            break;
    90136        }
    91137
    92         case TSTR0THREADPREMEPTION_IS_PENDING:
     138#define TEST_OFF_SIZE(off, size, rcExpect) \
     139    if (1) \
     140    { \
     141        int rc = RTR0MemUserCopyFrom(pbKrnlBuf, R3Ptr + (off), (size)); \
     142        if (rc != (rcExpect)) \
     143        { \
     144            RTStrPrintf(pszErr, cchErr, "!RTR0MemUserCopyFrom(, +%#x, %#x) -> %Rrc, expected %Rrc", \
     145                        (off), (size), rc, (rcExpect)); \
     146            break; \
     147        } \
     148        rc = RTR0MemUserCopyTo(R3Ptr + (off), pbKrnlBuf, (size)); \
     149        if (rc != (rcExpect)) \
     150        { \
     151            RTStrPrintf(pszErr, cchErr, "!RTR0MemUserCopyTo(+%#x,, %#x) -> %Rrc, expected %Rrc", \
     152                        (off), (size), rc, (rcExpect)); \
     153            break; \
     154        } \
     155    } else do {} while (0)
     156
     157        case TSTRTR0MEMUSERKERNEL_GOOD:
    93158        {
    94             RTTHREADPREEMPTSTATE State = RTTHREADPREEMPTSTATE_INITIALIZER;
    95             RTThreadPreemptDisable(&State);
    96             if (!RTThreadPreemptIsEnabled(NIL_RTTHREAD))
    97             {
    98                 if (ASMGetFlags() & X86_EFL_IF)
    99                 {
    100                     uint64_t    u64StartSysTS = RTTimeSystemNanoTS();
    101                     uint64_t    u64StartTS    = RTTimeNanoTS();
    102                     uint64_t    cLoops        = 0;
    103                     uint64_t    cNanosSysElapsed;
    104                     uint64_t    cNanosElapsed;
    105                     bool        fPending;
    106                     do
    107                     {
    108                         fPending         = RTThreadPreemptIsPending(NIL_RTTHREAD);
    109                         cNanosElapsed    = RTTimeNanoTS() - u64StartTS;
    110                         cNanosSysElapsed = RTTimeSystemNanoTS() - u64StartSysTS;
    111                         cLoops++;
    112                     } while (   !fPending
    113                              && cNanosElapsed    < UINT64_C(2)*1000U*1000U*1000U
    114                              && cNanosSysElapsed < UINT64_C(2)*1000U*1000U*1000U
    115                              && cLoops           < 100U*_1M);
    116                     if (!fPending)
    117                         RTStrPrintf(pszErr, cchErr, "!Preempt not pending after %'llu loops / %'llu ns / %'llu ns (sys)",
    118                                     cLoops, cNanosElapsed, cNanosSysElapsed);
    119                     else if (cLoops == 1)
    120                         RTStrPrintf(pszErr, cchErr, "!cLoops=1\n");
    121                     else
    122                         RTStrPrintf(pszErr, cchErr, "RTThreadPreemptIsPending returned true after %'llu loops / %'llu ns / %'llu ns (sys)",
    123                                     cLoops, cNanosElapsed, cNanosSysElapsed);
    124                 }
    125                 else
    126                     RTStrPrintf(pszErr, cchErr, "!Interrupts disabled");
    127             }
    128             else
    129                 RTStrPrintf(pszErr, cchErr, "!RTThreadPreemptIsEnabled returns true after RTThreadPreemptDisable");
    130             RTThreadPreemptRestore(&State);
     159            for (unsigned off = 0; off < 16 && !*pszErr; off++)
     160                for (unsigned cb = 0; cb < PAGE_SIZE - 16; cb++)
     161                    TEST_OFF_SIZE(off, cb, VINF_SUCCESS);
    131162            break;
    132163        }
    133164
    134         case TSTR0THREADPREMEPTION_NESTED:
     165        case TSTRTR0MEMUSERKERNEL_BAD:
    135166        {
    136             bool const fDefault = RTThreadPreemptIsEnabled(NIL_RTTHREAD);
    137             RTTHREADPREEMPTSTATE State1 = RTTHREADPREEMPTSTATE_INITIALIZER;
    138             RTThreadPreemptDisable(&State1);
    139             if (!RTThreadPreemptIsEnabled(NIL_RTTHREAD))
    140             {
    141                 RTTHREADPREEMPTSTATE State2 = RTTHREADPREEMPTSTATE_INITIALIZER;
    142                 RTThreadPreemptDisable(&State2);
    143                 if (!RTThreadPreemptIsEnabled(NIL_RTTHREAD))
    144                 {
    145                     RTTHREADPREEMPTSTATE State3 = RTTHREADPREEMPTSTATE_INITIALIZER;
    146                     RTThreadPreemptDisable(&State3);
    147                     if (RTThreadPreemptIsEnabled(NIL_RTTHREAD))
    148                         RTStrPrintf(pszErr, cchErr, "!RTThreadPreemptIsEnabled returns true after 3rd RTThreadPreemptDisable");
    149 
    150                     RTThreadPreemptRestore(&State3);
    151                     if (RTThreadPreemptIsEnabled(NIL_RTTHREAD) && !*pszErr)
    152                         RTStrPrintf(pszErr, cchErr, "!RTThreadPreemptIsEnabled returns true after 1st RTThreadPreemptRestore");
    153                 }
    154                 else
    155                     RTStrPrintf(pszErr, cchErr, "!RTThreadPreemptIsEnabled returns true after 2nd RTThreadPreemptDisable");
    156 
    157                 RTThreadPreemptRestore(&State2);
    158                 if (RTThreadPreemptIsEnabled(NIL_RTTHREAD) && !*pszErr)
    159                     RTStrPrintf(pszErr, cchErr, "!RTThreadPreemptIsEnabled returns true after 2nd RTThreadPreemptRestore");
    160             }
    161             else
    162                 RTStrPrintf(pszErr, cchErr, "!RTThreadPreemptIsEnabled returns true after 1st RTThreadPreemptDisable");
    163             RTThreadPreemptRestore(&State1);
    164             if (RTThreadPreemptIsEnabled(NIL_RTTHREAD) != fDefault && !*pszErr)
    165                 RTStrPrintf(pszErr, cchErr, "!RTThreadPreemptIsEnabled returns false after 3rd RTThreadPreemptRestore");
     167            for (unsigned off = 0; off < 16 && !*pszErr; off++)
     168                for (unsigned cb = 0; cb < PAGE_SIZE - 16; cb++)
     169                    TEST_OFF_SIZE(off, cb, cb > 0 ? VERR_ACCESS_DENIED : VINF_SUCCESS);
    166170            break;
    167171        }
     
    173177
    174178    /* The error indicator is the '!' in the message buffer. */
     179    RTMemFree(pbKrnlBuf);
    175180    return VINF_SUCCESS;
    176181}
  • trunk/src/VBox/Runtime/testcase/tstRTR0MemUserKernel.h

    r21283 r21286  
    11/* $Id$ */
    22/** @file
    3  * IPRT R0 Testcase - Thread Preemption, common header.
     3 * IPRT R0 Testcase - User & Kernel Memory, common header.
    44 */
    55
     
    3131#ifdef IN_RING0
    3232RT_C_DECLS_BEGIN
    33 DECLEXPORT(int) TSTR0ThreadPreemptionSrvReqHandler(PSUPDRVSESSION pSession, uint32_t uOperation,
    34                                                    uint64_t u64Arg, PSUPR0SERVICEREQHDR pReqHdr);
     33DECLEXPORT(int) TSTRTR0MemUserKernelSrvReqHandler(PSUPDRVSESSION pSession, uint32_t uOperation,
     34                                                  uint64_t u64Arg, PSUPR0SERVICEREQHDR pReqHdr);
    3535RT_C_DECLS_END
    3636#endif
    3737
    38 typedef enum TSTR0THREADPREMEPTION
     38typedef enum TSTRTR0MEMUSERKERNEL
    3939{
    40     TSTR0THREADPREMEPTION_SANITY_OK = 1,
    41     TSTR0THREADPREMEPTION_SANITY_FAILURE,
    42     TSTR0THREADPREMEPTION_BASIC,
    43     TSTR0THREADPREMEPTION_IS_PENDING,
    44     TSTR0THREADPREMEPTION_NESTED
    45 } TSTR0THREADPREMEPTION;
     40    TSTRTR0MEMUSERKERNEL_SANITY_OK = 1,
     41    TSTRTR0MEMUSERKERNEL_SANITY_FAILURE,
     42    TSTRTR0MEMUSERKERNEL_BASIC,
     43    TSTRTR0MEMUSERKERNEL_GOOD,
     44    TSTRTR0MEMUSERKERNEL_BAD
     45} TSTRTR0MEMUSERKERNEL;
    4646
  • trunk/src/VBox/Runtime/testcase/tstRTR0MemUserKernelDriver.cpp

    r21283 r21286  
    4343#ifdef VBOX
    4444# include <VBox/sup.h>
    45 # include "tstR0ThreadPreemption.h"
     45# include "tstRTR0MemUserKernel.h"
    4646#endif
    4747
     
    5757     */
    5858    RTTEST hTest;
    59     int rc = RTTestInitAndCreate("tstR0ThreadPreemption", &hTest);
     59    int rc = RTTestInitAndCreate("tstRTR0MemUserKernel", &hTest);
    6060    if (rc)
    6161        return rc;
    6262    RTTestBanner(hTest);
     63
     64    uint8_t *pbPage = (uint8_t *)RTTestGuardedAllocTail(hTest, PAGE_SIZE);
     65    if (!pbPage)
     66    {
     67        RTTestFailed(hTest, "RTTestGuardedAllocTail failed with rc=%Rrc\n", rc);
     68        return RTTestSummaryAndDestroy(hTest);
     69    }
    6370
    6471    PSUPDRVSESSION pSession;
     
    7380    rc = RTPathExecDir(szPath, sizeof(szPath));
    7481    if (RT_SUCCESS(rc))
    75         rc = RTPathAppend(szPath, sizeof(szPath), "tstR0ThreadPreemption.r0");
     82        rc = RTPathAppend(szPath, sizeof(szPath), "tstRTR0MemUserKernel.r0");
    7683    if (RT_FAILURE(rc))
    7784    {
     
    8188
    8289    void *pvImageBase;
    83     rc = SUPR3LoadServiceModule(szPath, "tstR0ThreadPreemption",
    84                                 "TSTR0ThreadPreemptionSrvReqHandler",
     90    rc = SUPR3LoadServiceModule(szPath, "tstRTR0MemUserKernel",
     91                                "TSTRTR0MemUserKernelSrvReqHandler",
    8592                                &pvImageBase);
    8693    if (RT_FAILURE(rc))
     
    104111    Req.Hdr.cbReq = sizeof(Req);
    105112    Req.szMsg[0] = '\0';
    106     RTTESTI_CHECK_RC(rc = SUPR3CallR0Service("tstR0ThreadPreemption", sizeof("tstR0ThreadPreemption") - 1,
    107                                              TSTR0THREADPREMEPTION_SANITY_OK, 0, &Req.Hdr), VINF_SUCCESS);
     113    RTTESTI_CHECK_RC(rc = SUPR3CallR0Service("tstRTR0MemUserKernel", sizeof("tstRTR0MemUserKernel") - 1,
     114                                             TSTRTR0MEMUSERKERNEL_SANITY_OK, 0, &Req.Hdr), VINF_SUCCESS);
    108115    if (RT_FAILURE(rc))
    109116        return RTTestSummaryAndDestroy(hTest);
     
    115122    Req.Hdr.cbReq = sizeof(Req);
    116123    Req.szMsg[0] = '\0';
    117     RTTESTI_CHECK_RC(rc = SUPR3CallR0Service("tstR0ThreadPreemption", sizeof("tstR0ThreadPreemption") - 1,
    118                                              TSTR0THREADPREMEPTION_SANITY_FAILURE, 0, &Req.Hdr), VINF_SUCCESS);
     124    RTTESTI_CHECK_RC(rc = SUPR3CallR0Service("tstRTR0MemUserKernel", sizeof("tstRTR0MemUserKernel") - 1,
     125                                             TSTRTR0MEMUSERKERNEL_SANITY_FAILURE, 0, &Req.Hdr), VINF_SUCCESS);
    119126    if (RT_FAILURE(rc))
    120127        return RTTestSummaryAndDestroy(hTest);
     
    130137    Req.Hdr.cbReq = sizeof(Req);
    131138    Req.szMsg[0] = '\0';
    132     RTTESTI_CHECK_RC(rc = SUPR3CallR0Service("tstR0ThreadPreemption", sizeof("tstR0ThreadPreemption") - 1,
    133                                              TSTR0THREADPREMEPTION_BASIC, 0, &Req.Hdr), VINF_SUCCESS);
     139    RTTESTI_CHECK_RC(rc = SUPR3CallR0Service("tstRTR0MemUserKernel", sizeof("tstRTR0MemUserKernel") - 1,
     140                                             TSTRTR0MEMUSERKERNEL_BASIC, (uintptr_t)pbPage, &Req.Hdr), VINF_SUCCESS);
    134141    if (RT_FAILURE(rc))
    135142        return RTTestSummaryAndDestroy(hTest);
     
    143150
    144151    /*
    145      * Stay in ring-0 until preemption is pending.
     152     * Good buffer, bail out on failure.
    146153     */
    147     RTTestSub(hTest, "Pending Preemption");
    148     for (int i = 0; ; i++)
    149     {
    150         Req.Hdr.u32Magic = SUPR0SERVICEREQHDR_MAGIC;
    151         Req.Hdr.cbReq = sizeof(Req);
    152         Req.szMsg[0] = '\0';
    153         RTTESTI_CHECK_RC(rc = SUPR3CallR0Service("tstR0ThreadPreemption", sizeof("tstR0ThreadPreemption") - 1,
    154                                                  TSTR0THREADPREMEPTION_IS_PENDING, 0, &Req.Hdr), VINF_SUCCESS);
    155         if (    strcmp(Req.szMsg, "cLoops=1\n")
    156             ||  i >= 64)
    157         {
    158             if (Req.szMsg[0] == '!')
    159                 RTTestIFailed("%s", &Req.szMsg[1]);
    160             else if (Req.szMsg[0])
    161                 RTTestIPrintf(RTTESTLVL_ALWAYS, "%s", Req.szMsg);
    162             break;
    163         }
    164         if ((i % 3) == 0)
    165             RTThreadYield();
    166     }
    167 
    168     /*
    169      * Test nested RTThreadPreemptDisable calls.
    170      */
    171     RTTestSub(hTest, "Nested");
     154    RTTestSub(hTest, "Good buffer");
    172155    Req.Hdr.u32Magic = SUPR0SERVICEREQHDR_MAGIC;
    173156    Req.Hdr.cbReq = sizeof(Req);
    174157    Req.szMsg[0] = '\0';
    175     RTTESTI_CHECK_RC(rc = SUPR3CallR0Service("tstR0ThreadPreemption", sizeof("tstR0ThreadPreemption") - 1,
    176                                              TSTR0THREADPREMEPTION_NESTED, 0, &Req.Hdr), VINF_SUCCESS);
     158    RTTESTI_CHECK_RC(rc = SUPR3CallR0Service("tstRTR0MemUserKernel", sizeof("tstRTR0MemUserKernel") - 1,
     159                                             TSTRTR0MEMUSERKERNEL_GOOD, (uintptr_t)pbPage, &Req.Hdr), VINF_SUCCESS);
     160    if (RT_FAILURE(rc))
     161        return RTTestSummaryAndDestroy(hTest);
    177162    if (Req.szMsg[0] == '!')
     163    {
    178164        RTTestIFailed("%s", &Req.szMsg[1]);
    179     else if (Req.szMsg[0])
     165        return RTTestSummaryAndDestroy(hTest);
     166    }
     167    if (Req.szMsg[0])
     168        RTTestIPrintf(RTTESTLVL_ALWAYS, "%s", Req.szMsg);
     169
     170    /*
     171     * Bad buffer, bail out on failure.
     172     */
     173    RTTestSub(hTest, "Bad buffer");
     174    Req.Hdr.u32Magic = SUPR0SERVICEREQHDR_MAGIC;
     175    Req.Hdr.cbReq = sizeof(Req);
     176    Req.szMsg[0] = '\0';
     177    RTTESTI_CHECK_RC(rc = SUPR3CallR0Service("tstRTR0MemUserKernel", sizeof("tstRTR0MemUserKernel") - 1,
     178                                             TSTRTR0MEMUSERKERNEL_BAD, (uintptr_t)pbPage + PAGE_SIZE, &Req.Hdr), VINF_SUCCESS);
     179    if (RT_FAILURE(rc))
     180        return RTTestSummaryAndDestroy(hTest);
     181    if (Req.szMsg[0] == '!')
     182    {
     183        RTTestIFailed("%s", &Req.szMsg[1]);
     184        return RTTestSummaryAndDestroy(hTest);
     185    }
     186    if (Req.szMsg[0])
    180187        RTTestIPrintf(RTTESTLVL_ALWAYS, "%s", Req.szMsg);
    181188
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