/* $Id: VBoxSCSI.h 93115 2022-01-01 11:31:46Z vboxsync $ */ /** @file * VBox storage devices - Simple SCSI interface for BIOS access. */ /* * Copyright (C) 2006-2022 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; * you can redistribute it and/or modify it under the terms of the GNU * General Public License (GPL) as published by the Free Software * Foundation, in version 2 as it comes in the "COPYING" file of the * VirtualBox OSE distribution. VirtualBox OSE is distributed in the * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. */ /** @page pg_drv_scsi Simple SCSI interface for BIOS access. * * This is a simple interface to access SCSI devices from the BIOS which is * shared between the BusLogic and the LsiLogic SCSI host adapters to simplify * the BIOS part. * * The first interface (if available) will be starting at port 0x430 and * each will occupy 4 ports. The ports are used as described below: * * +--------+--------+----------+ * | Offset | Access | Purpose | * +--------+--------+----------+ * | 0 | Write | Command | * +--------+--------+----------+ * | 0 | Read | Status | * +--------+--------+----------+ * | 1 | Write | Data in | * +--------+--------+----------+ * | 1 | Read | Data out | * +--------+--------+----------+ * | 2 | R/W | Detect | * +--------+--------+----------+ * | 3 | Read | SCSI rc | * +--------+--------+----------+ * | 3 | Write | Reset | * +--------+--------+----------+ * * The register at port 0 receives the SCSI CDB issued from the driver when * writing to it but before writing the actual CDB the first write gives the * size of the CDB in bytes. * * Reading the port at offset 0 gives status information about the adapter. If * the busy bit is set the adapter is processing a previous issued request if it is * cleared the command finished and the adapter can process another request. * The driver has to poll this bit because the adapter will not assert an IRQ * for simplicity reasons. * * The register at offset 2 is to detect if a host adapter is available. If the * driver writes a value to this port and gets the same value after reading it * again the adapter is available. * * Any write to the register at offset 3 causes the interface to be reset. A * read returns the SCSI status code of the last operation. * * This part has no R0 or RC components. */ #ifndef VBOX_INCLUDED_SRC_Storage_VBoxSCSI_h #define VBOX_INCLUDED_SRC_Storage_VBoxSCSI_h #ifndef RT_WITHOUT_PRAGMA_ONCE # pragma once #endif /******************************************************************************* * Header Files * *******************************************************************************/ #include #include #ifdef IN_RING3 RT_C_DECLS_BEGIN /** * Helper shared by the LsiLogic and BusLogic device emulations to load legacy saved states * before the removal of the VBoxSCSI interface. * * @returns VBox status code. * @param pHlp Pointer to the Ring-3 device helper table. * @param pSSM The SSM handle to operate on. */ DECLINLINE(int) vboxscsiR3LoadExecLegacy(PCPDMDEVHLPR3 pHlp, PSSMHANDLE pSSM) { pHlp->pfnSSMSkip(pSSM, 4); /* * The CDB buffer was increased with r104155 in trunk (backported to 5.0 * in r104311) without bumping the SSM state versions which leaves us * with broken saved state restoring for older VirtualBox releases * (up to 5.0.10). */ if ( ( pHlp->pfnSSMHandleRevision(pSSM) < 104311 && pHlp->pfnSSMHandleVersion(pSSM) < VBOX_FULL_VERSION_MAKE(5, 0, 12)) || ( pHlp->pfnSSMHandleRevision(pSSM) < 104155 && pHlp->pfnSSMHandleVersion(pSSM) >= VBOX_FULL_VERSION_MAKE(5, 0, 51))) pHlp->pfnSSMSkip(pSSM, 12); else pHlp->pfnSSMSkip(pSSM, 20); pHlp->pfnSSMSkip(pSSM, 1); /*iCDB*/ uint32_t cbBufLeft, iBuf; pHlp->pfnSSMGetU32(pSSM, &cbBufLeft); pHlp->pfnSSMGetU32(pSSM, &iBuf); pHlp->pfnSSMSkip(pSSM, 2); /*fBusy, enmState*/ if (cbBufLeft + iBuf) pHlp->pfnSSMSkip(pSSM, cbBufLeft + iBuf); return VINF_SUCCESS; } RT_C_DECLS_END #endif /* IN_RING3 */ #endif /* !VBOX_INCLUDED_SRC_Storage_VBoxSCSI_h */