From a098f5f15367e9b4d6baafb4b4a308dd9e67dfbd Mon Sep 17 00:00:00 2001 From: Benjamin David Lunt Date: Sat, 18 Feb 2023 12:36:25 -0700 Subject: [PATCH] Use defines instead of bits --- bochs/iodev/usb/scsi_device.cc | 44 ++++++++++++++------------- bochs/iodev/usb/scsi_device.h | 54 +++++++++++++++++++++++++++++++++- 2 files changed, 76 insertions(+), 22 deletions(-) diff --git a/bochs/iodev/usb/scsi_device.cc b/bochs/iodev/usb/scsi_device.cc index 7a9f2bdfd..90134d30b 100644 --- a/bochs/iodev/usb/scsi_device.cc +++ b/bochs/iodev/usb/scsi_device.cc @@ -485,7 +485,7 @@ Bit8u* scsi_device_t::scsi_get_buf(Bit32u tag) return r->dma_buf; } -Bit32s scsi_device_t::scsi_send_command(Bit32u tag, Bit8u *buf, const Bit8u cmd_len, int lun, bool async) +Bit32s scsi_device_t::scsi_send_command(Bit32u tag, Bit8u *buf, Bit8u cmd_len, int lun, bool async) { Bit64u nb_sectors; Bit64u lba; @@ -807,47 +807,47 @@ Bit32s scsi_device_t::scsi_send_command(Bit32u tag, Bit8u *buf, const Bit8u cmd_ BX_DEBUG(("Event Status notification: Requested Byte 0x%02X", buf[4])); len = (Bit32s) (((Bit32u) buf[7] << 8) | buf[8]); - if (buf[1] & 1) { // polled bit is set + if (buf[1] & EVENT_STATUS_POLLED) { // polled bit is set // only do the Event Header if length <= 4, else we can do the Event // buf[4] can be zero. Usually the Guest is requesting the support class event bitmap when this happens. if (len > 4) { // hightest priority (lowest bit set) gets executed (only) - if (buf[4] & (1<<0)) { // Reserved bit is set (MMC4R05A.PDF, 6.7.1.3, page 242, not considered an error) + if (buf[4] & EVENT_STATUS_RESERVED_0) { // Reserved bit is set (MMC4R05A.PDF, 6.7.1.3, page 242, not considered an error) BX_DEBUG(("Event Status Notify: bit 0 in the request byte is set")); Class = 0; } - if (buf[4] & (1<<1)) { // Opertaional Change request bit is set + if (buf[4] & EVENT_STATUS_OP_CHANGE) { // Operational Change request bit is set Class = 1; //p[0] = 0; // Bits 3:0 = Event Code (must be zero until an event occurs, then zero after read until next event occurs) } else - if (buf[4] & (1<<2)) { // Power Management request bit is set + if (buf[4] & EVENT_STATUS_POWER_MAN) { // Power Management request bit is set Class = 2; //p[0] = 0; // Bits 3:0 = Event Code (must be zero until an event occurs, then zero after read until next event occurs) } else - if (buf[4] & (1<<3)) { // External Request request bit is set + if (buf[4] & EVENT_STATUS_EXT_REQ) { // External Request request bit is set Class = 3; //p[0] = 0; // Bits 3:0 = Event Code (must be zero until an event occurs, then zero after read until next event occurs) } else - if (buf[4] & (1<<4)) { // MEDIA request bit is set + if (buf[4] & EVENT_STATUS_MEDIA_REQ) { // MEDIA request bit is set Class = 4; // TODO: We need to get the status from the Host. Did the CD-ROM get ejected or inserted? // For now, we put no change (zero) p[0] = 0; // Bits 3:0 = Event Code (must be zero until an event occurs, then zero after read until next event occurs) // (MMC4R05A.PDF Section 6.7.2.5, page 248) - p[1] = (1<<1); // bits 7:2 = reserved, bit 1 = Media Present, bit 0 = Door/Tray open + p[1] = EVENT_STATUS_MED_PRES | EVENT_STATUS_MED_N_OPEN; // bits 7:2 = reserved, bit 1 = Media Present, bit 0 = Door/Tray open p[2] = 0; // Start slot p[3] = 0; // End slot out_len += 4; // 8 total bytes } else - if (buf[4] & (1<<5)) { // Multi-Initiator request bit is set + if (buf[4] & EVENT_STATUS_MULTI_INIT) { // Multi-Initiator request bit is set Class = 5; //p[0] = 0; // Bits 3:0 = Event Code (must be zero until an event occurs, then zero after read until next event occurs) } else - if (buf[4] & (1<<6)) { // Device Busy request bit is set + if (buf[4] & EVENT_STATUS_DEV_BUSY) { // Device Busy request bit is set Class = 6; //p[0] = 0; // Bits 3:0 = Event Code (must be zero until an event occurs, then zero after read until next event occurs) } - if (buf[4] & (1<<7)) { // Reserved bit is set (MMC4R05A.PDF, 6.7.1.3, page 242, not considered an error) + if (buf[4] & EVENT_STATUS_RESERVED_7) { // Reserved bit is set (MMC4R05A.PDF, 6.7.1.3, page 242, not considered an error) BX_DEBUG(("Event Status Notify: bit 7 in the request byte is set")); Class = 7; } @@ -863,7 +863,7 @@ Bit32s scsi_device_t::scsi_send_command(Bit32u tag, Bit8u *buf, const Bit8u cmd_ outbuf[0] = ((out_len >> 8) & 0xFF); // this is the out_len (the count of bytes sent to the guest) (big-endian) outbuf[1] = ((out_len >> 0) & 0xFF); outbuf[2] = 0x00 | Class; // bit 7 = 0, bits 6:3 = resv, bits 2:0 = class returned - outbuf[3] = 0b00010000; // supported Event Classes (only event class 4 supported at this time) + outbuf[3] = EVENT_STATUS_MEDIA_REQ; // supported Event Classes (only event class 4 supported at this time) } else { // polled bit // we don't (currently) support asynchronous operation. goto fail; @@ -878,18 +878,20 @@ Bit32s scsi_device_t::scsi_send_command(Bit32u tag, Bit8u *buf, const Bit8u cmd_ BX_DEBUG(("Read Disc Information: Data type requested 0x%02X", buf[1] & 7)); out_len = (Bit32s) (((Bit32u) buf[7] << 8) | buf[8]); - switch (buf[1] & 7) { + switch (buf[1] & DISC_INFO_MASK) { // mmc6r02f.pdf, section 6.21.4, page 379(427) ?? - case 0: // Standard Disk Information + case DISC_INFO_STANDARD: // Standard Disk Information outbuf[ 0] = (32 * (0 * 8)) >> 8; // msb length 32 + (8 * number of OPC tables) outbuf[ 1] = (32 * (0 * 8)) >> 0; // lsb length - outbuf[ 2] = (0 << 5) | (0 << 4) | (3 << 2) | (2 << 0); // Type = 0, Eraseable = 0, State of last session = 3 (Complete), Disc status = 2 (Finalized Disc) + // Type = 0, Eraseable = 0, State of last session = 3 (Complete), Disc status = 2 (Finalized Disc) + outbuf[ 2] = (DISC_INFO_STANDARD << 5) | DI_STAND_N_ERASABLE | DI_STAND_LAST_STATE_COMP | DI_STAND_STATUS_FINAL; outbuf[ 3] = 1; // number of first track on disc (1 based) outbuf[ 4] = 1; // number of sessions (LSB) outbuf[ 5] = 1; // first track number in last session (LSB) outbuf[ 6] = 1; // last track number in last session (LSB) - outbuf[ 7] = (0 << 7) | (0 << 6) | (1 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (0 << 0); // DID_V, DBC_V, URU, DAC_V, R, Legacy?, BG Format Status - outbuf[ 8] = 0x00; // Disc Type ( 0 = CD-ROM) + // DID_V, DBC_V, URU, DAC_V, R, Legacy?, BG Format Status + outbuf[ 7] = DI_STAND_DID_N_VALID | DI_STAND_DBC_N_VALID | DI_STAND_URU_OKAY | DI_STAND_DAC_N_VALID | DI_STAND_N_LEGACY | DI_STAND_BG_FORMAT_0; + outbuf[ 8] = DI_STAND_DISC_TYPE_0; // Disc Type ( 0 = CD-ROM) outbuf[ 9] = 0; // number of sessions (MSB) outbuf[10] = 0; // first track number in last session (MSB) outbuf[11] = 0; // last track number in last session (MSB) @@ -925,13 +927,13 @@ Bit32s scsi_device_t::scsi_send_command(Bit32u tag, Bit8u *buf, const Bit8u cmd_ // OPC Table entries = 0 // return length - r->buf_len = BX_MIN(out_len, (2 + 32) * (0 * 8)); + r->buf_len = BX_MIN(out_len, (2 + 32) + (0 * 8)); // (len word + sizeof(information)) + (OPC Table Entry count * Size of entry) break; - case 1: // Track Resources Information + case DISC_INFO_TRACK: // Track Resources Information // I am not absolutely sure these are the correct values. outbuf[ 0] = 0; // msb length outbuf[ 1] = 10; // lsb length - outbuf[ 2] = (1 << 5) | (0 << 0); // Type = 1, reserved + outbuf[ 2] = DISC_INFO_TRACK | (0 << 0); // Type = 1, reserved outbuf[ 3] = 0; // reserved outbuf[ 4] = ((7927 >> 8) & 0xFF); // maximum possible tracks on disc (MSB) outbuf[ 5] = ((7927 >> 0) & 0xFF); // maximum possible tracks on disc (LSB) @@ -945,7 +947,7 @@ Bit32s scsi_device_t::scsi_send_command(Bit32u tag, Bit8u *buf, const Bit8u cmd_ // return length r->buf_len = BX_MIN(out_len, 12); break; - case 2: // POW Resources Information + case DISC_INFO_POW_RES: // POW Resources Information // unsupported, so return 0 bytes diff --git a/bochs/iodev/usb/scsi_device.h b/bochs/iodev/usb/scsi_device.h index 2081b550e..c0a6eafc4 100644 --- a/bochs/iodev/usb/scsi_device.h +++ b/bochs/iodev/usb/scsi_device.h @@ -42,6 +42,58 @@ enum scsi_reason { SCSI_REASON_DATA }; +// SCSI_CD_EVENT_STATUS items +#define EVENT_STATUS_POLLED 1 +#define EVENT_STATUS_RESERVED_0 (1<<0) // reserved (bit 0) +#define EVENT_STATUS_OP_CHANGE (1<<1) // Operatinal Change (bit 1) +#define EVENT_STATUS_POWER_MAN (1<<2) // Power Management (bit 2) +#define EVENT_STATUS_EXT_REQ (1<<3) // External Request (bit 3) +#define EVENT_STATUS_MEDIA_REQ (1<<4) // Media Request (bit 4) + #define EVENT_STATUS_MED_N_PRES (0<<1) // Media is not present + #define EVENT_STATUS_MED_PRES (1<<1) // Media is present + #define EVENT_STATUS_MED_N_OPEN (0<<0) // Door/Tray is not open + #define EVENT_STATUS_MED_OPEN (1<<0) // Door/Tray is open +#define EVENT_STATUS_MULTI_INIT (1<<5) // Multi-Initiator (bit 5) +#define EVENT_STATUS_DEV_BUSY (1<<6) // Device Busy (bit 6) +#define EVENT_STATUS_RESERVED_7 (1<<7) // reserved (bit 7) + +// SCSI_CD_READ_DISC_INFO items +#define DISC_INFO_MASK 0x07 // mask to get disk info type +#define DISC_INFO_STANDARD 0 + #define DI_STAND_N_ERASABLE (0<<4) // Non-erasable + #define DI_STAND_ERASABLE (1<<4) // Erasable + #define DI_STAND_LAST_STATE_MT (0<<2) // Empty session + #define DI_STAND_LAST_STATE_INC (1<<2) // Incomplete session + #define DI_STAND_LAST_STATE_DAM (2<<2) // Damaged session + #define DI_STAND_LAST_STATE_COMP (3<<2) // Complete session + #define DI_STAND_STATUS_MT (0<<0) // Empty disc + #define DI_STAND_STATUS_INC (1<<0) // Incomplete disc + #define DI_STAND_STATUS_FINAL (2<<0) // Finalized disc + #define DI_STAND_STATUS_OTHER (3<<0) // Other type + #define DI_STAND_DID_N_VALID (0<<7) // Disc ID area not valid + #define DI_STAND_DID_VALID (1<<7) // Disc ID area valid + #define DI_STAND_DBC_N_VALID (0<<6) // Disc Barcode area not valid + #define DI_STAND_DBC_VALID (1<<6) // Disc Barcode area valid + #define DI_STAND_URU_N_OKAY (0<<5) // Unrestricted use not okay + #define DI_STAND_URU_OKAY (1<<5) // Unrestricted use okay + #define DI_STAND_DAC_N_VALID (0<<4) // Disc Application Code not valid + #define DI_STAND_DAC_VALID (1<<4) // Disc Application Code valid + #define DI_STAND_N_LEGACY (0<<2) // Not Legacy? + #define DI_STAND_LEGACY (1<<2) // Legacy? + #define DI_STAND_BG_FORMAT_0 (0<<0) // Background Format Status code 0 + #define DI_STAND_BG_FORMAT_1 (1<<0) // Background Format Status code 1 + #define DI_STAND_BG_FORMAT_2 (2<<0) // Background Format Status code 2 + #define DI_STAND_BG_FORMAT_3 (3<<0) // Background Format Status code 3 + #define DI_STAND_DISC_TYPE_0 0x00 // Disc type: CD-DA or CD-ROM + #define DI_STAND_DISC_TYPE_1 0x10 // Disc type: CD-I disc + #define DI_STAND_DISC_TYPE_2 0x20 // Disc type: CD-ROM XA Disc + #define DI_STAND_DISC_TYPE_x 0xFF // Disc type: Undefined +#define DISC_INFO_TRACK 1 +#define DISC_INFO_POW_RES 2 + + + + #define SENSE_NO_SENSE 0 #define SENSE_NOT_READY 2 #define SENSE_MEDIUM_ERROR 3 @@ -77,7 +129,7 @@ public: virtual ~scsi_device_t(void); void register_state(bx_list_c *parent, const char *name); - Bit32s scsi_send_command(Bit32u tag, Bit8u *buf, const Bit8u cmd_len, int lun, bool async); + Bit32s scsi_send_command(Bit32u tag, Bit8u *buf, Bit8u cmd_len, int lun, bool async); void scsi_command_complete(SCSIRequest *r, int status, int sense); void scsi_cancel_io(Bit32u tag); void scsi_read_complete(void *req, int ret);