VirtualBox

source: vbox/trunk/src/VBox/Devices/Storage/VSCSI/VSCSISense.cpp@ 104932

Last change on this file since 104932 was 103902, checked in by vboxsync, 9 months ago

VSCSI: Fixed a problem with potentially unset cbSector in READ CD command. Added more logging.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.3 KB
Line 
1/* $Id: VSCSISense.cpp 103902 2024-03-18 17:11:22Z vboxsync $ */
2/** @file
3 * Virtual SCSI driver: Sense handling
4 */
5
6/*
7 * Copyright (C) 2006-2023 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * SPDX-License-Identifier: GPL-3.0-only
26 */
27#define LOG_GROUP LOG_GROUP_VSCSI
28#include <VBox/log.h>
29#include <iprt/assert.h>
30#include <iprt/string.h>
31
32#include "VSCSIInternal.h"
33
34void vscsiSenseInit(PVSCSISENSE pVScsiSense)
35{
36 memset(pVScsiSense->abSenseBuf, 0, sizeof(pVScsiSense->abSenseBuf));
37
38 /* Fill in valid sense information (can't be just zeros). */
39 pVScsiSense->abSenseBuf[0] = (1 << 7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED; /* Fixed format */
40 pVScsiSense->abSenseBuf[2] = SCSI_SENSE_NONE;
41 pVScsiSense->abSenseBuf[7] = 10;
42 pVScsiSense->abSenseBuf[12] = SCSI_ASC_NONE;
43}
44
45int vscsiReqSenseOkSet(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq)
46{
47 LogFlowFunc(("STATUS OK\n"));
48 memset(pVScsiSense->abSenseBuf, 0, sizeof(pVScsiSense->abSenseBuf));
49
50 pVScsiSense->abSenseBuf[0] = (1 << 7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED; /* Fixed format */
51 pVScsiSense->abSenseBuf[2] = SCSI_SENSE_NONE;
52 pVScsiSense->abSenseBuf[7] = 10;
53 pVScsiSense->abSenseBuf[12] = SCSI_ASC_NONE;
54 pVScsiSense->abSenseBuf[13] = SCSI_ASC_NONE; /* Should be ASCQ but it has the same value for success. */
55
56 if (pVScsiReq->pbSense && pVScsiReq->cbSense)
57 {
58 pVScsiReq->cbSenseWritten = RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense);
59 memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, pVScsiReq->cbSenseWritten);
60 }
61
62 return SCSI_STATUS_OK;
63}
64
65int vscsiReqSenseErrorSet(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq, uint8_t uSCSISenseKey, uint8_t uSCSIASC, uint8_t uSCSIASCQ)
66{
67 LogFlowFunc(("CHECK CONDITION: %s %s\n", SCSISenseText(uSCSISenseKey), SCSISenseExtText(uSCSIASC, uSCSIASCQ)));
68 memset(pVScsiSense->abSenseBuf, 0, sizeof(pVScsiSense->abSenseBuf));
69 pVScsiSense->abSenseBuf[0] = (1 << 7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED; /* Fixed format */
70 pVScsiSense->abSenseBuf[2] = uSCSISenseKey;
71 pVScsiSense->abSenseBuf[7] = 10;
72 pVScsiSense->abSenseBuf[12] = uSCSIASC;
73 pVScsiSense->abSenseBuf[13] = uSCSIASCQ;
74
75 if (pVScsiReq->pbSense && pVScsiReq->cbSense)
76 {
77 pVScsiReq->cbSenseWritten = RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense);
78 memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, pVScsiReq->cbSenseWritten);
79 }
80
81 return SCSI_STATUS_CHECK_CONDITION;
82}
83
84int vscsiReqSenseErrorInfoSet(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq, uint8_t uSCSISenseKey, uint8_t uSCSIASC, uint8_t uSCSIASCQ, uint32_t uInfo)
85{
86 LogFlowFunc(("CHECK CONDITION: %s %s uInfo:%02x\n", SCSISenseText(uSCSISenseKey), SCSISenseExtText(uSCSIASC, uSCSIASCQ), uInfo));
87 memset(pVScsiSense->abSenseBuf, 0, sizeof(pVScsiSense->abSenseBuf));
88 pVScsiSense->abSenseBuf[0] = RT_BIT(7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED; /* Fixed format */
89 pVScsiSense->abSenseBuf[2] = uSCSISenseKey;
90 scsiH2BE_U32(&pVScsiSense->abSenseBuf[3], uInfo);
91 pVScsiSense->abSenseBuf[7] = 10;
92 pVScsiSense->abSenseBuf[12] = uSCSIASC;
93 pVScsiSense->abSenseBuf[13] = uSCSIASCQ;
94
95 if (pVScsiReq->pbSense && pVScsiReq->cbSense)
96 {
97 pVScsiReq->cbSenseWritten = RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense);
98 memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, pVScsiReq->cbSenseWritten);
99 }
100
101 return SCSI_STATUS_CHECK_CONDITION;
102}
103
104int vscsiReqSenseCmd(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq)
105{
106 /* Copy the current sense data to the buffer. */
107 RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, pVScsiSense->abSenseBuf, sizeof(pVScsiSense->abSenseBuf));
108 return vscsiReqSenseOkSet(pVScsiSense, pVScsiReq);
109}
110
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette