VirtualBox

Changeset 82232 in vbox


Ignore:
Timestamp:
Nov 27, 2019 12:52:28 AM (5 years ago)
Author:
vboxsync
Message:

DevSB16: Converted I/O port handlers. bugref:9218

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/DevSB16.cpp

    r82231 r82232  
    5656#include <VBox/vmm/pdmdev.h>
    5757#include <VBox/vmm/pdmaudioifs.h>
     58#include <VBox/AssertGuest.h>
    5859
    5960#include "VBoxDD.h"
     
    199200    int align;
    200201
    201     RTLISTANCHOR                   lstDrv;
     202    RTLISTANCHOR        lstDrv;
    202203    /** IRQ timer   */
    203     TMTIMERHANDLE                  hTimerIRQ;
     204    TMTIMERHANDLE       hTimerIRQ;
    204205    /** The base interface for LUN\#0. */
    205     PDMIBASE                       IBase;
     206    PDMIBASE            IBase;
    206207    /** Output stream. */
    207     SB16STREAM                     Out;
     208    SB16STREAM          Out;
    208209
    209210    /** The timer for pumping data thru the attached LUN drivers. */
    210     TMTIMERHANDLE                  hTimerIO;
     211    TMTIMERHANDLE       hTimerIO;
    211212    /** The timer interval for pumping data thru the LUN drivers in timer ticks. */
    212     uint64_t                       cTicksTimerIOInterval;
     213    uint64_t            cTicksTimerIOInterval;
    213214    /** Timestamp of the last timer callback (sb16TimerIO).
    214215     * Used to calculate the time actually elapsed between two timer callbacks. */
    215     uint64_t                       tsTimerIO;
     216    uint64_t            tsTimerIO;
    216217    /** Number of active (running) SDn streams. */
    217     uint8_t                        cStreamsActive;
     218    uint8_t             cStreamsActive;
    218219    /** Flag indicating whether the timer is active or not. */
    219     bool volatile                  fTimerActive;
    220     uint8_t                        u8Padding1[5];
     220    bool volatile       fTimerActive;
     221    uint8_t             u8Padding1[5];
     222
     223    /** The two mixer I/O ports (port + 4). */
     224    IOMIOPORTHANDLE     hIoPortsMixer;
     225    /** The 10 DSP I/O ports (port + 6). */
     226    IOMIOPORTHANDLE     hIoPortsDsp;
    221227
    222228    /* mixer state */
     
    945951
    946952/**
    947  * @callback_method_impl{PFNIOMIOPORTOUT}
    948  */
    949 static DECLCALLBACK(int) dsp_write(PPDMDEVINS pDevIns, void *opaque, RTIOPORT nport, uint32_t val, unsigned cb)
    950 {
    951     RT_NOREF(pDevIns, cb);
    952     PSB16STATE pThis = (PSB16STATE)opaque;
    953     int iport = nport - pThis->port;
    954 
    955     LogFlowFunc(("write %#x <- %#x\n", nport, val));
    956     switch (iport)
    957     {
    958         case 0x06:
    959             switch (val)
     953 * @callback_method_impl{PFNIOMIOPORTNEWOUT}
     954 */
     955static DECLCALLBACK(VBOXSTRICTRC) sb16IoPortDspWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb)
     956{
     957    PSB16STATE pThis = PDMDEVINS_2_DATA(pDevIns, PSB16STATE);
     958    RT_NOREF(pvUser, cb);
     959
     960    LogFlowFunc(("write %#x <- %#x\n", offPort, u32));
     961    switch (offPort)
     962    {
     963        case 0:
     964            switch (u32)
    960965            {
    961966                case 0x00:
     
    9961001
    9971002                default:
    998                     pThis->v2x6 = val;
     1003                    pThis->v2x6 = u32;
    9991004                    break;
    10001005            }
    10011006            break;
    10021007
    1003         case 0x0c:                      /* Write data or command | write status */
     1008        case 6:                        /* Write data or command | write status */
    10041009#if 0
    10051010            if (pThis->highspeed)
     
    10081013            if (0 == pThis->needed_bytes)
    10091014            {
    1010                 sb16HandleCommand(pDevIns, pThis, val);
     1015                sb16HandleCommand(pDevIns, pThis, u32);
    10111016#if 0
    10121017                if (0 == pThis->needed_bytes) {
     
    10231028                else
    10241029                {
    1025                     pThis->in2_data[pThis->in_index++] = val;
     1030                    pThis->in2_data[pThis->in_index++] = u32;
    10261031                    if (pThis->in_index == pThis->needed_bytes)
    10271032                    {
     
    10371042
    10381043        default:
    1039             LogFlowFunc(("nport=%#x, val=%#x)\n", nport, val));
     1044            LogFlowFunc(("offPort=%#x, u32=%#x)\n", offPort, u32));
    10401045            break;
    10411046    }
     
    10461051
    10471052/**
    1048  * @callback_method_impl{PFNIOMIOPORTIN}
    1049  */
    1050 static DECLCALLBACK(int) dsp_read(PPDMDEVINS pDevIns, void *opaque, RTIOPORT nport, uint32_t *pu32, unsigned cb)
    1051 {
    1052     RT_NOREF(pDevIns, cb);
    1053     PSB16STATE pThis = (PSB16STATE)opaque;
    1054     int iport, retval, ack = 0;
    1055 
    1056     iport = nport - pThis->port;
     1053 * @callback_method_impl{PFNIOMIOPORTNEWIN}
     1054 */
     1055static DECLCALLBACK(VBOXSTRICTRC) sb16IoPortDspRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t *pu32, unsigned cb)
     1056{
     1057    PSB16STATE pThis = PDMDEVINS_2_DATA(pDevIns, PSB16STATE);
     1058    uint32_t retval;
     1059    int ack = 0;
     1060    RT_NOREF(pvUser, cb);
     1061
    10571062
    10581063    /** @todo reject non-byte access?
    10591064     *  The spec does not mention a non-byte access so we should check how real hardware behaves. */
    10601065
    1061     switch (iport)
    1062     {
    1063         case 0x06:                  /* reset */
     1066    switch (offPort)
     1067    {
     1068        case 0:                     /* reset */
    10641069            retval = 0xff;
    10651070            break;
    10661071
    1067         case 0x0a:                  /* read data */
     1072        case 4:                     /* read data */
    10681073            if (pThis->out_data_len)
    10691074            {
     
    10801085            break;
    10811086
    1082         case 0x0c:                  /* 0 can write */
     1087        case 6:                     /* 0 can write */
    10831088            retval = pThis->can_write ? 0 : 0x80;
    10841089            break;
    10851090
    1086         case 0x0d:                  /* timer interrupt clear */
     1091        case 7:                     /* timer interrupt clear */
    10871092            /* LogFlowFunc(("timer interrupt clear\n")); */
    10881093            retval = 0;
     
    10991104            break;
    11001105
    1101         case 0x0f:                  /* irq 16 ack */
     1106        case 9:                     /* irq 16 ack */
    11021107            retval = 0xff;
    11031108            if (pThis->mixer_regs[0x82] & 2)
     
    11101115
    11111116        default:
    1112             goto error;
     1117            LogFlowFunc(("warning: sb16IoPortDspRead %#x error\n", offPort));
     1118            return VERR_IOM_IOPORT_UNUSED;
    11131119    }
    11141120
    11151121    if (!ack)
    1116         LogFlowFunc(("read %#x -> %#x\n", nport, retval));
     1122        LogFlowFunc(("read %#x -> %#x\n", offPort, retval));
    11171123
    11181124    *pu32 = retval;
    11191125    return VINF_SUCCESS;
    1120 
    1121  error:
    1122     LogFlowFunc(("warning: dsp_read %#x error\n", nport));
    1123     return VERR_IOM_IOPORT_UNUSED;
    11241126}
    11251127
     
    13371339    bool        fUpdateStream = false;
    13381340
    1339     LogFlowFunc(("mixer_write [%#x] <- %#x\n", pThis->mixer_nreg, val));
     1341    LogFlowFunc(("sb16IoPortMixerWrite [%#x] <- %#x\n", pThis->mixer_nreg, val));
    13401342
    13411343    switch (pThis->mixer_nreg)
     
    14621464
    14631465/**
    1464  * @callback_method_impl{PFNIOMIOPORTOUT}
    1465  */
    1466 static DECLCALLBACK(int) mixer_write(PPDMDEVINS pDevIns, void *opaque, RTIOPORT nport, uint32_t val, unsigned cb)
    1467 {
    1468     RT_NOREF(pDevIns);
    1469     PSB16STATE pThis = (PSB16STATE)opaque;
    1470     int iport = nport - pThis->port;
     1466 * @callback_method_impl{PFNIOMIOPORTNEWOUT}
     1467 */
     1468static DECLCALLBACK(VBOXSTRICTRC) sb16IoPortMixerWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb)
     1469{
     1470    PSB16STATE pThis = PDMDEVINS_2_DATA(pDevIns, PSB16STATE);
     1471    RT_NOREF(pvUser);
     1472
    14711473    switch (cb)
    14721474    {
    14731475        case 1:
    1474             switch (iport)
     1476            switch (offPort)
    14751477            {
    1476                 case 4:
    1477                     mixer_write_indexb(pThis, val);
     1478                case 0:
     1479                    mixer_write_indexb(pThis, u32);
    14781480                    break;
    1479                 case 5:
    1480                     mixer_write_datab(pThis, val);
     1481                case 1:
     1482                    mixer_write_datab(pThis, u32);
    14811483                    break;
     1484                default:
     1485                    AssertFailed();
    14821486            }
    14831487            break;
    14841488        case 2:
    1485             mixer_write_indexb(pThis, val & 0xff);
    1486             mixer_write_datab(pThis, (val >> 8) & 0xff);
     1489            mixer_write_indexb(pThis, u32 & 0xff);
     1490            mixer_write_datab(pThis, (u32 >> 8) & 0xff);
    14871491            break;
    14881492        default:
    1489             AssertMsgFailed(("Port=%#x cb=%d u32=%#x\n", nport, cb, val));
     1493            ASSERT_GUEST_MSG_FAILED(("offPort=%#x cb=%d u32=%#x\n", offPort, cb, u32));
    14901494            break;
    14911495    }
     
    14941498
    14951499/**
    1496  * @callback_method_impl{PFNIOMIOPORTIN}
    1497  */
    1498 static DECLCALLBACK(int) mixer_read(PPDMDEVINS pDevIns, void *opaque, RTIOPORT nport, uint32_t *pu32, unsigned cb)
    1499 {
    1500     RT_NOREF(pDevIns, cb, nport);
    1501     PSB16STATE pThis = (PSB16STATE)opaque;
     1500 * @callback_method_impl{PFNIOMIOPORTNEWIN}
     1501 */
     1502static DECLCALLBACK(VBOXSTRICTRC) sb16IoPortMixerRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t *pu32, unsigned cb)
     1503{
     1504    PSB16STATE pThis = PDMDEVINS_2_DATA(pDevIns, PSB16STATE);
     1505    RT_NOREF(pvUser, cb, offPort);
    15021506
    15031507#ifndef DEBUG_SB16_MOST
    15041508    if (pThis->mixer_nreg != 0x82)
    1505         LogFlowFunc(("mixer_read[%#x] -> %#x\n", pThis->mixer_nreg, pThis->mixer_regs[pThis->mixer_nreg]));
     1509        LogFlowFunc(("sb16IoPortMixerRead[%#x] -> %#x\n", pThis->mixer_nreg, pThis->mixer_regs[pThis->mixer_nreg]));
    15061510#else
    1507     LogFlowFunc(("mixer_read[%#x] -> %#x\n", pThis->mixer_nreg, pThis->mixer_regs[pThis->mixer_nreg]));
     1511    LogFlowFunc(("sb16IoPortMixerRead[%#x] -> %#x\n", pThis->mixer_nreg, pThis->mixer_regs[pThis->mixer_nreg]));
    15081512#endif
    15091513    *pu32 = pThis->mixer_regs[pThis->mixer_nreg];
     
    24462450     * Register I/O and DMA.
    24472451     */
    2448     rc = PDMDevHlpIOPortRegister(pDevIns, pThis->port + 0x04,  2, pThis, mixer_write, mixer_read, NULL, NULL, "SB16");
     2452    static const IOMIOPORTDESC s_aAllDescs[] =
     2453    {
     2454        { "FM Music Status Port",           "FM Music Register Address Port",           NULL, NULL },   // 00h
     2455        { NULL,                             "FM Music Data Port",                       NULL, NULL },   // 01h
     2456        { "Advanced FM Music Status Port",  "Advanced FM Music Register Address Port",  NULL, NULL },   // 02h
     2457        { NULL,                             "Advanced FM Music Data Port",              NULL, NULL },   // 03h
     2458        { NULL,                             "Mixer chip Register Address Port",         NULL, NULL },   // 04h
     2459        { "Mixer chip Data Port",           NULL,                                       NULL, NULL },   // 05h
     2460        { NULL,                             "DSP Reset",                                NULL, NULL },   // 06h
     2461        { "Unused7",                        "Unused7",                                  NULL, NULL },   // 07h
     2462        { "FM Music Status Port",           "FM Music Register Port",                   NULL, NULL },   // 08h
     2463        { NULL,                             "FM Music Data Port",                       NULL, NULL },   // 09h
     2464        { "DSP Read Data Port",             NULL,                                       NULL, NULL },   // 0Ah
     2465        { "UnusedB",                        "UnusedB",                                  NULL, NULL },   // 0Bh
     2466        { "DSP Write-Buffer Status",        "DSP Write Command/Data",                   NULL, NULL },   // 0Ch
     2467        { "UnusedD",                        "UnusedD",                                  NULL, NULL },   // 0Dh
     2468        { "DSP Read-Buffer Status",         NULL,                                       NULL, NULL },   // 0Eh
     2469        { "IRQ16ACK",                       NULL,                                       NULL, NULL },   // 0Fh
     2470        { "CD-ROM Data Register",           "CD-ROM Command Register",                  NULL, NULL },   // 10h
     2471        { "CD-ROM Status Register",         NULL,                                       NULL, NULL },   // 11h
     2472        { NULL,                             "CD-ROM Reset Register",                    NULL, NULL },   // 12h
     2473        { NULL,                             "CD-ROM Enable Register",                   NULL, NULL },   // 13h
     2474        { NULL,                             NULL,                                       NULL, NULL },
     2475    };
     2476
     2477    rc = PDMDevHlpIoPortCreateAndMap(pDevIns, pThis->port + 0x04 /*uPort*/, 2 /*cPorts*/,
     2478                                     sb16IoPortMixerWrite, sb16IoPortMixerRead,
     2479                                     "SB16 - Mixer", &s_aAllDescs[4], &pThis->hIoPortsMixer);
    24492480    AssertRCReturn(rc, rc);
    2450     rc = PDMDevHlpIOPortRegister(pDevIns, pThis->port + 0x06, 10, pThis, dsp_write,   dsp_read,   NULL, NULL, "SB16");
     2481    rc = PDMDevHlpIoPortCreateAndMap(pDevIns, pThis->port + 0x06 /*uPort*/, 10 /*cPorts*/,
     2482                                     sb16IoPortDspWrite, sb16IoPortDspRead,
     2483                                     "SB16 - DSP", &s_aAllDescs[6], &pThis->hIoPortsDsp);
    24512484    AssertRCReturn(rc, rc);
    24522485
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