VirtualBox

Changeset 28684 in vbox


Ignore:
Timestamp:
Apr 24, 2010 2:22:22 PM (15 years ago)
Author:
vboxsync
Message:

VBoxSCSI: Always reset the state if the protocol is violated and make it possible to reset the state from the BIOS

Location:
trunk/src/VBox/Devices
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/BIOS/scsi.c

    r28530 r28684  
    2929#define VBOXSCSI_REGISTER_DATA_IN  1
    3030#define VBOXSCSI_REGISTER_IDENTIFY 2
     31#define VBOXSCSI_REGISTER_RESET    3
    3132
    3233#define VBOXSCSI_MAX_DEVICES 16 /* Maximum number of devices a SCSI device can have. */
     
    456457        /* Detected - Enumerate attached devices. */
    457458        VBOXSCSI_DEBUG("scsi_init: BusLogic SCSI adapter detected\n");
     459        outb(BUSLOGIC_ISA_IO_PORT+VBOXSCSI_REGISTER_RESET, 0);
    458460        scsi_enumerate_attached_devices(BUSLOGIC_ISA_IO_PORT);
    459461    }
     
    471473        /* Detected - Enumerate attached devices. */
    472474        VBOXSCSI_DEBUG("scsi_init: LsiLogic SCSI adapter detected\n");
     475        outb(LSILOGIC_ISA_IO_PORT+VBOXSCSI_REGISTER_RESET, 0);
    473476        scsi_enumerate_attached_devices(LSILOGIC_ISA_IO_PORT);
    474477    }
  • trunk/src/VBox/Devices/Storage/VBoxSCSI.cpp

    r28065 r28684  
    4141#include "VBoxSCSI.h"
    4242
    43 /**
    44  * Initializes the state for the SCSI interface.
    45  *
    46  * @returns VBox status code.
    47  * @param   pVBoxSCSI    Pointer to the unitialized SCSI state.
    48  */
    49 int vboxscsiInitialize(PVBOXSCSI pVBoxSCSI)
     43static void vboxscsiReset(PVBOXSCSI pVBoxSCSI)
    5044{
    5145    pVBoxSCSI->regIdentify = 0;
     
    5650    pVBoxSCSI->cbBuf       = 0;
    5751    pVBoxSCSI->iBuf        = 0;
     52    if (pVBoxSCSI->pBuf)
     53        RTMemFree(pVBoxSCSI->pBuf);
     54
    5855    pVBoxSCSI->pBuf        = NULL;
    5956    pVBoxSCSI->enmState    = VBOXSCSISTATE_NO_COMMAND;
     57
     58}
     59
     60/**
     61 * Initializes the state for the SCSI interface.
     62 *
     63 * @returns VBox status code.
     64 * @param   pVBoxSCSI    Pointer to the unitialized SCSI state.
     65 */
     66int vboxscsiInitialize(PVBOXSCSI pVBoxSCSI)
     67{
     68    pVBoxSCSI->pBuf        = NULL;
     69    vboxscsiReset(pVBoxSCSI);
    6070
    6171    return VINF_SUCCESS;
     
    153163            else if (pVBoxSCSI->enmState == VBOXSCSISTATE_READ_TXDIR)
    154164            {
    155                 pVBoxSCSI->enmState = VBOXSCSISTATE_READ_CDB_SIZE;
    156                 pVBoxSCSI->uTxDir = uVal;
     165                if (uVal != VBOXSCSI_TXDIR_FROM_DEVICE && uVal != VBOXSCSI_TXDIR_TO_DEVICE)
     166                    vboxscsiReset(pVBoxSCSI);
     167                else
     168                {
     169                    pVBoxSCSI->enmState = VBOXSCSISTATE_READ_CDB_SIZE;
     170                    pVBoxSCSI->uTxDir = uVal;
     171                }
    157172            }
    158173            else if (pVBoxSCSI->enmState == VBOXSCSISTATE_READ_CDB_SIZE)
    159174            {
    160                 pVBoxSCSI->enmState = VBOXSCSISTATE_READ_BUFFER_SIZE_LOW;
    161                 pVBoxSCSI->cbCDB = uVal;
     175                if (uVal > VBOXSCSI_CDB_SIZE_MAX)
     176                    vboxscsiReset(pVBoxSCSI);
     177                else
     178                {
     179                    pVBoxSCSI->enmState = VBOXSCSISTATE_READ_BUFFER_SIZE_LOW;
     180                    pVBoxSCSI->cbCDB = uVal;
     181                }
    162182            }
    163183            else if (pVBoxSCSI->enmState == VBOXSCSISTATE_READ_BUFFER_SIZE_LOW)
     
    202222        case 1:
    203223        {
    204             AssertMsg(pVBoxSCSI->enmState == VBOXSCSISTATE_COMMAND_READY, ("Invalid state\n"));
    205             pVBoxSCSI->pBuf[pVBoxSCSI->iBuf++] = uVal;
    206             if (pVBoxSCSI->iBuf == pVBoxSCSI->cbBuf)
    207             {
    208                 rc = VERR_MORE_DATA;
    209                 ASMAtomicXchgBool(&pVBoxSCSI->fBusy, true);
     224            if (   pVBoxSCSI->enmState != VBOXSCSISTATE_COMMAND_READY
     225                || pVBoxSCSI->uTxDir != VBOXSCSI_TXDIR_TO_DEVICE)
     226            {
     227                /* Reset the state */
     228                vboxscsiReset(pVBoxSCSI);
     229            }
     230            else
     231            {
     232                pVBoxSCSI->pBuf[pVBoxSCSI->iBuf++] = uVal;
     233                if (pVBoxSCSI->iBuf == pVBoxSCSI->cbBuf)
     234                {
     235                    rc = VERR_MORE_DATA;
     236                    ASMAtomicXchgBool(&pVBoxSCSI->fBusy, true);
     237                }
    210238            }
    211239            break;
     
    214242        {
    215243            pVBoxSCSI->regIdentify = uVal;
     244            break;
     245        }
     246        case 3:
     247        {
     248            /* Reset */
     249            vboxscsiReset(pVBoxSCSI);
    216250            break;
    217251        }
  • trunk/src/VBox/Devices/Storage/VBoxSCSI.h

    r21321 r28684  
    4444 * |   2    |  R/W   | Detect   |
    4545 * +--------+--------+----------+
     46 * |   3    |  Write | Reset    |
     47 * +--------+--------+----------+
    4648 *
    4749 * The register at port 0 receives the SCSI CDB issued from the driver when writing to it but
     
    8284#define VBOXSCSI_TXDIR_FROM_DEVICE 0
    8385#define VBOXSCSI_TXDIR_TO_DEVICE   1
     86
     87/** Maximum CDB size the BIOS driver sends. */
     88#define VBOXSCSI_CDB_SIZE_MAX     10
    8489
    8590typedef struct VBOXSCSI
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