VirtualBox

Changeset 3145 in vbox


Ignore:
Timestamp:
Jun 18, 2007 3:31:09 PM (17 years ago)
Author:
vboxsync
Message:

Fixed incorrect IOM return checks.

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/iom.h

    r2981 r3145  
    4040 */
    4141#define IOM_NO_PDMINS_CHECKS
     42
     43/**
     44 * Macro for checking if an I/O or MMIO emulation call succeeded.
     45 *
     46 * This macro shall only be used with the IOM APIs where it's mentioned
     47 * in the return value description. And there is must be used to correctly
     48 * determin if the call succeeded and things like the EIP needs updating.
     49 *
     50 *
     51 * @returns Success indicator (true/false).
     52 *
     53 * @param   rc          The status code. This may be evaluated
     54 *                      more than once!
     55 *
     56 * @remark  To avoid making assumptions about the layout of the
     57 *          VINF_EM_FIRST...VINF_EM_LAST range we're checking
     58 *          explicitly for each for exach the exceptions.
     59 *          However, for efficieny we ASSUME that the
     60 *          VINF_EM_LAST is smaller than most of the relevant
     61 *          status codes. We also ASSUME that the
     62 *          VINF_EM_RESCHEDULE_REM status code is the most
     63 *          frequent status code we'll enounter in this range.
     64 *
     65 * @todo    Will have to add VINF_EM_DBG_HYPER_BREAKPOINT if the
     66 *          I/O port and MMIO breakpoints should trigger before
     67 *          the I/O is done. Currently, we don't implement these
     68 *          kind of breakpoints.
     69 */
     70#define IOM_SUCCESS(rc)     (   (rc) == VINF_SUCCESS \
     71                             || (   (rc) <= VINF_EM_LAST \
     72                                 && (rc) != VINF_EM_RESCHEDULE_REM \
     73                                 && (rc) >= VINF_EM_FIRST \
     74                                 && (rc) != VINF_EM_RESCHEDULE_RAW \
     75                                 && (rc) != VINF_EM_RESCHEDULE_HWACC \
     76                                ) \
     77                            )
    4278
    4379
     
    263299 *
    264300 * @returns Strict VBox status code. Informational status codes other than the one documented
    265  *          here are to be treated as internal failure.
    266  * @retval  VINF_SUCCESS                Success.
    267  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     301 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
     302 * @retval  VINF_SUCCESS                Success.
     303 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     304 *                                      status code must be passed on to EM.
    268305 * @retval  VINF_IOM_HC_IOPORT_READ     Defer the read to ring-3. (R0/GC only)
    269306 *
     
    279316 *
    280317 * @returns Strict VBox status code. Informational status codes other than the one documented
    281  *          here are to be treated as internal failure.
    282  * @retval  VINF_SUCCESS                Success.
    283  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     318 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
     319 * @retval  VINF_SUCCESS                Success.
     320 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     321 *                                      status code must be passed on to EM.
    284322 * @retval  VINF_IOM_HC_IOPORT_WRITE    Defer the write to ring-3. (R0/GC only)
    285323 *
     
    295333 *
    296334 * @returns Strict VBox status code. Informational status codes other than the one documented
    297  *          here are to be treated as internal failure.
    298  * @retval  VINF_SUCCESS                Success.
    299  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     335 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
     336 * @retval  VINF_SUCCESS                Success.
     337 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     338 *                                      status code must be passed on to EM.
    300339 * @retval  VINF_IOM_HC_IOPORT_WRITE    Defer the write to ring-3. (R0/GC only)
    301340 * @retval  VINF_EM_RAW_GUEST_TRAP      The exception was left pending. (TRPMRaiseXcptErr)
     
    313352 *
    314353 * @returns Strict VBox status code. Informational status codes other than the one documented
    315  *          here are to be treated as internal failure.
    316  * @retval  VINF_SUCCESS                Success.
    317  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     354 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
     355 * @retval  VINF_SUCCESS                Success.
     356 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     357 *                                      status code must be passed on to EM.
    318358 * @retval  VINF_IOM_HC_IOPORT_READ     Defer the read to ring-3. (R0/GC only)
    319359 * @retval  VINF_EM_RAW_GUEST_TRAP      The exception was left pending. (TRPMRaiseXcptErr)
     
    332372 *
    333373 * @returns Strict VBox status code. Informational status codes other than the one documented
    334  *          here are to be treated as internal failure.
    335  * @retval  VINF_SUCCESS                Success.
    336  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     374 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
     375 * @retval  VINF_SUCCESS                Success.
     376 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     377 *                                      status code must be passed on to EM.
    337378 * @retval  VINF_IOM_HC_IOPORT_READ     Defer the read to ring-3. (R0/GC only)
    338379 *
     
    367408 *
    368409 * @returns Strict VBox status code. Informational status codes other than the one documented
     410 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
     411 * @retval  VINF_SUCCESS                Success.
     412 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     413 *                                      status code must be passed on to EM.
     414 * @retval  VINF_IOM_HC_IOPORT_READ     Defer the read to ring-3. (R0/GC only)
     415 * @retval  VINF_EM_RAW_GUEST_TRAP      The exception was left pending. (TRPMRaiseXcptErr)
     416 * @retval  VINF_TRPM_XCPT_DISPATCHED   The exception was raised and dispatched for raw-mode execution. (TRPMRaiseXcptErr)
     417 * @retval  VINF_EM_RESCHEDULE_REM      The exception was dispatched and cannot be executed in raw-mode. (TRPMRaiseXcptErr)
     418 *
     419 * @param   pVM         The virtual machine (GC pointer ofcourse).
     420 * @param   pRegFrame   Pointer to CPUMCTXCORE guest registers structure.
     421 * @param   pCpu        Disassembler CPU state.
     422 */
     423IOMDECL(int) IOMInterpretINS(PVM pVM, PCPUMCTXCORE pRegFrame, PDISCPUSTATE pCpu);
     424
     425/**
     426 * [REP*] INSB/INSW/INSD
     427 * ES:EDI,DX[,ECX]
     428 *
     429 * @remark Assumes caller checked the access privileges (IOMInterpretCheckPortIOAccess)
     430 *
     431 * @returns Strict VBox status code. Informational status codes other than the one documented
    369432 *          here are to be treated as internal failure.
    370433 * @retval  VINF_SUCCESS                Success.
     
    375438 * @retval  VINF_EM_RESCHEDULE_REM      The exception was dispatched and cannot be executed in raw-mode. (TRPMRaiseXcptErr)
    376439 *
    377  * @param   pVM         The virtual machine (GC pointer ofcourse).
    378  * @param   pRegFrame   Pointer to CPUMCTXCORE guest registers structure.
    379  * @param   pCpu        Disassembler CPU state.
    380  */
    381 IOMDECL(int) IOMInterpretINS(PVM pVM, PCPUMCTXCORE pRegFrame, PDISCPUSTATE pCpu);
    382 
    383 /**
    384  * [REP*] INSB/INSW/INSD
    385  * ES:EDI,DX[,ECX]
    386  *
    387  * @remark Assumes caller checked the access privileges (IOMInterpretCheckPortIOAccess)
    388  *
    389  * @returns Strict VBox status code. Informational status codes other than the one documented
    390  *          here are to be treated as internal failure.
    391  * @retval  VINF_SUCCESS                Success.
    392  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
    393  * @retval  VINF_IOM_HC_IOPORT_READ     Defer the read to ring-3. (R0/GC only)
    394  * @retval  VINF_EM_RAW_GUEST_TRAP      The exception was left pending. (TRPMRaiseXcptErr)
    395  * @retval  VINF_TRPM_XCPT_DISPATCHED   The exception was raised and dispatched for raw-mode execution. (TRPMRaiseXcptErr)
    396  * @retval  VINF_EM_RESCHEDULE_REM      The exception was dispatched and cannot be executed in raw-mode. (TRPMRaiseXcptErr)
    397  *
    398440 * @param   pVM             The virtual machine (GC pointer ofcourse).
    399441 * @param   pRegFrame       Pointer to CPUMCTXCORE guest registers structure.
     
    409451 *
    410452 * @returns Strict VBox status code. Informational status codes other than the one documented
    411  *          here are to be treated as internal failure.
    412  * @retval  VINF_SUCCESS                Success.
    413  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     453 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
     454 * @retval  VINF_SUCCESS                Success.
     455 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     456 *                                      status code must be passed on to EM.
    414457 * @retval  VINF_IOM_HC_IOPORT_WRITE    Defer the write to ring-3. (R0/GC only)
    415458 * @retval  VINF_EM_RAW_GUEST_TRAP      The exception was left pending. (TRPMRaiseXcptErr)
     
    430473 *
    431474 * @returns Strict VBox status code. Informational status codes other than the one documented
    432  *          here are to be treated as internal failure.
    433  * @retval  VINF_SUCCESS                Success.
    434  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     475 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
     476 * @retval  VINF_SUCCESS                Success.
     477 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     478 *                                      status code must be passed on to EM.
    435479 * @retval  VINF_IOM_HC_IOPORT_WRITE    Defer the write to ring-3. (R0/GC only)
    436480 * @retval  VINF_EM_RAW_GUEST_TRAP      The exception was left pending. (TRPMRaiseXcptErr)
     
    510554 *
    511555 * @returns Strict VBox status code. Informational status codes other than the one documented
    512  *          here are to be treated as internal failure.
    513  * @retval  VINF_SUCCESS                Success.
    514  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     556 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
     557 * @retval  VINF_SUCCESS                Success.
     558 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     559 *                                      status code must be passed on to EM.
    515560 * @retval  VINF_IOM_HC_IOPORT_READ     Defer the read to ring-3. (R0/GC only)
    516561 * @retval  VINF_EM_RAW_GUEST_TRAP      The exception was left pending. (TRPMRaiseXcptErr)
  • trunk/src/VBox/VMM/EM.cpp

    r2981 r3145  
    13211321         * (The unhandled cases end up with rc == VINF_EM_RESCHEDULE_REM.)
    13221322         */
    1323         if (rc == VINF_EM_RESCHEDULE_REM)
    1324         {
    1325             /* emulate this instruction only */
    1326             goto emulate_instr;
    1327         }
    1328 
    1329         if (    rc == VINF_SUCCESS
    1330             ||  (rc >= VINF_EM_FIRST && rc <= VINF_EM_LAST))
     1323        if (IOM_SUCCESS(rc))
    13311324        {
    13321325            pCtx->eip += Cpu.opsize;
     
    13421335        }
    13431336        AssertMsg(rc != VINF_TRPM_XCPT_DISPATCHED, ("Handle VINF_TRPM_XCPT_DISPATCHED\n"));
     1337
    13441338        if (VBOX_FAILURE(rc))
    13451339        {
     
    13491343        AssertMsg(rc == VINF_EM_RESCHEDULE_REM, ("rc=%Vrc\n", rc));
    13501344    }
    1351 emulate_instr:
    13521345    STAM_PROFILE_STOP(&pVM->em.s.StatIOEmu, a);
    13531346    return emR3RawExecuteInstruction(pVM, "IO: ");
  • trunk/src/VBox/VMM/VMMAll/EMAll.cpp

    r2981 r3145  
    273273#ifdef IN_GC
    274274    int rc = IOMGCIOPortHandler(pVM, pCtxCore, pCpu);
    275     if (    rc == VINF_SUCCESS
    276         ||  (rc >= VINF_EM_FIRST && rc <= VINF_EM_LAST))
     275    if (IOM_SUCCESS(rc))
    277276        pCtxCore->eip += cbOp;
    278277    return rc;
  • trunk/src/VBox/VMM/VMMAll/IOMAll.cpp

    r2981 r3145  
    720720 *
    721721 * @returns Strict VBox status code. Informational status codes other than the one documented
    722  *          here are to be treated as internal failure.
     722 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
    723723 * @retval  VINF_SUCCESS                Success.
    724  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     724 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     725 *                                      status code must be passed on to EM.
    725726 * @retval  VINF_IOM_HC_IOPORT_READ     Defer the read to ring-3. (R0/GC only)
    726727 *
     
    862863 *
    863864 * @returns Strict VBox status code. Informational status codes other than the one documented
    864  *          here are to be treated as internal failure.
     865 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
    865866 * @retval  VINF_SUCCESS                Success.
    866  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     867 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     868 *                                      status code must be passed on to EM.
    867869 * @retval  VINF_IOM_HC_IOPORT_READ     Defer the read to ring-3. (R0/GC only)
    868870 *
     
    987989 *
    988990 * @returns Strict VBox status code. Informational status codes other than the one documented
    989  *          here are to be treated as internal failure.
     991 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
    990992 * @retval  VINF_SUCCESS                Success.
    991  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     993 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     994 *                                      status code must be passed on to EM.
    992995 * @retval  VINF_IOM_HC_IOPORT_WRITE    Defer the write to ring-3. (R0/GC only)
    993996 *
     
    11071110 *
    11081111 * @returns Strict VBox status code. Informational status codes other than the one documented
    1109  *          here are to be treated as internal failure.
     1112 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
    11101113 * @retval  VINF_SUCCESS                Success.
    1111  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     1114 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     1115 *                                      status code must be passed on to EM.
    11121116 * @retval  VINF_IOM_HC_IOPORT_WRITE    Defer the write to ring-3. (R0/GC only)
    11131117 *
     
    13271331 *
    13281332 * @returns Strict VBox status code. Informational status codes other than the one documented
    1329  *          here are to be treated as internal failure.
     1333 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
    13301334 * @retval  VINF_SUCCESS                Success.
    1331  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     1335 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     1336 *                                      status code must be passed on to EM.
    13321337 * @retval  VINF_IOM_HC_IOPORT_READ     Defer the read to ring-3. (R0/GC only)
    13331338 * @retval  VINF_EM_RAW_GUEST_TRAP      The exception was left pending. (TRPMRaiseXcptErr)
     
    13641369        uint32_t    u32Data = ~0U;
    13651370        rc = IOMIOPortRead(pVM, uPort, &u32Data, cbSize);
    1366         if (    rc == VINF_SUCCESS
    1367             ||  (rc >= VINF_EM_FIRST && rc <= VINF_EM_LAST))
     1371        if (IOM_SUCCESS(rc))
    13681372        {
    13691373            /*
     
    13861390 *
    13871391 * @returns Strict VBox status code. Informational status codes other than the one documented
    1388  *          here are to be treated as internal failure.
     1392 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
    13891393 * @retval  VINF_SUCCESS                Success.
    1390  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     1394 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     1395 *                                      status code must be passed on to EM.
    13911396 * @retval  VINF_IOM_HC_IOPORT_WRITE    Defer the write to ring-3. (R0/GC only)
    13921397 * @retval  VINF_EM_RAW_GUEST_TRAP      The exception was left pending. (TRPMRaiseXcptErr)
  • trunk/src/VBox/VMM/VMMAll/IOMAllMMIO.cpp

    r2981 r3145  
    15921592 *
    15931593 * @returns Strict VBox status code. Informational status codes other than the one documented
    1594  *          here are to be treated as internal failure.
     1594 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
    15951595 * @retval  VINF_SUCCESS                Success.
    1596  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     1596 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     1597 *                                      status code must be passed on to EM.
    15971598 * @retval  VINF_IOM_HC_IOPORT_READ     Defer the read to ring-3. (R0/GC only)
    15981599 * @retval  VINF_EM_RAW_GUEST_TRAP      The exception was left pending. (TRPMRaiseXcptErr)
     
    16771678        uint32_t u32Value;
    16781679        rc = IOMIOPortRead(pVM, uPort, &u32Value, cbTransfer);
    1679         if (rc == VINF_IOM_HC_IOPORT_READ || VBOX_FAILURE(rc))
     1680        if (!IOM_SUCCESS(rc))
    16801681            break;
    16811682        int rc2 = iomRamWrite(pVM, GCPtrDst, &u32Value, cbTransfer);
     
    17031704 *
    17041705 * @returns Strict VBox status code. Informational status codes other than the one documented
    1705  *          here are to be treated as internal failure.
     1706 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
    17061707 * @retval  VINF_SUCCESS                Success.
    1707  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     1708 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     1709 *                                      status code must be passed on to EM.
    17081710 * @retval  VINF_IOM_HC_IOPORT_READ     Defer the read to ring-3. (R0/GC only)
    17091711 * @retval  VINF_EM_RAW_GUEST_TRAP      The exception was left pending. (TRPMRaiseXcptErr)
     
    17461748 *
    17471749 * @returns Strict VBox status code. Informational status codes other than the one documented
    1748  *          here are to be treated as internal failure.
     1750 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
    17491751 * @retval  VINF_SUCCESS                Success.
    1750  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     1752 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     1753 *                                      status code must be passed on to EM.
    17511754 * @retval  VINF_IOM_HC_IOPORT_WRITE    Defer the write to ring-3. (R0/GC only)
    17521755 * @retval  VINF_EM_RAW_GUEST_TRAP      The exception was left pending. (TRPMRaiseXcptErr)
     
    18341837            break;
    18351838        rc = IOMIOPortWrite(pVM, uPort, u32Value, cbTransfer);
    1836         if (rc == VINF_IOM_HC_IOPORT_WRITE || VBOX_FAILURE(rc))
     1839        if (!IOM_SUCCESS(rc))
    18371840            break;
    18381841        GCPtrSrc = (RTGCPTR)((RTUINTPTR)GCPtrSrc + cbTransfer);
     
    18591862 *
    18601863 * @returns Strict VBox status code. Informational status codes other than the one documented
    1861  *          here are to be treated as internal failure.
     1864 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
    18621865 * @retval  VINF_SUCCESS                Success.
    1863  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     1866 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     1867 *                                      status code must be passed on to EM.
    18641868 * @retval  VINF_IOM_HC_IOPORT_WRITE    Defer the write to ring-3. (R0/GC only)
    18651869 * @retval  VINF_EM_RAW_GUEST_TRAP      The exception was left pending. (TRPMRaiseXcptErr)
  • trunk/src/VBox/VMM/VMMGC/IOMGC.cpp

    r2981 r3145  
    5454 *
    5555 * @returns Strict VBox status code. Informational status codes other than the one documented
    56  *          here are to be treated as internal failure.
     56 *          here are to be treated as internal failure. Use IOM_SUCCESS() to check for success.
    5757 * @retval  VINF_SUCCESS                Success.
    58  * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success but schedulinging information needs to be passed onto EM.
     58 * @retval  VINF_EM_FIRST-VINF_EM_LAST  Success with some exceptions (see IOM_SUCCESS()), the
     59 *                                      status code must be passed on to EM.
    5960 * @retval  VINF_IOM_HC_IOPORT_READ     Defer the read to ring-3. (R0/GC only)
    6061 * @retval  VINF_EM_RAW_GUEST_TRAP      The exception was left pending. (TRPMRaiseXcptErr)
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