From e88a8b48a1dd6f80f5c0bf1fcb0d970a06410786 Mon Sep 17 00:00:00 2001 From: Volker Ruppert Date: Sat, 5 May 2007 12:30:23 +0000 Subject: [PATCH] - implementation of save/restore for the SCSI emulation started - SCSI buffer length fixes ported from the Qemu project --- bochs/iodev/scsi_device.cc | 20 +++++++++++++++----- bochs/iodev/scsi_device.h | 5 ++++- bochs/iodev/usb_msd.cc | 21 ++++++++++++--------- bochs/iodev/usb_msd.h | 5 ++++- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/bochs/iodev/scsi_device.cc b/bochs/iodev/scsi_device.cc index 368efd950..b9f30b3ce 100644 --- a/bochs/iodev/scsi_device.cc +++ b/bochs/iodev/scsi_device.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: scsi_device.cc,v 1.3 2007-03-18 15:18:02 vruppert Exp $ +// $Id: scsi_device.cc,v 1.4 2007-05-05 12:30:23 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2007 Volker Ruppert @@ -75,6 +75,15 @@ scsi_device_t::~scsi_device_t(void) { } +#if BX_SUPPORT_SAVE_RESTORE +void scsi_device_t::register_state(bx_list_c *parent, const char *name) +{ + bx_list_c *list = new bx_list_c(parent, name, "", 1); + new bx_shadow_num_c(list, "sense", &sense); + // TODO: save/restore for SCSI requests +} +#endif + SCSIRequest* scsi_device_t::scsi_new_request(Bit32u tag) { SCSIRequest *r; @@ -344,7 +353,7 @@ Bit32s scsi_device_t::scsi_send_command(Bit32u tag, Bit8u *buf, int lun) BX_DEBUG(("request Sense (len %d)", len)); if (len < 4) goto fail; - memset(buf, 0, 4); + memset(outbuf, 0, 4); outbuf[0] = 0xf0; outbuf[1] = 0; outbuf[2] = sense; @@ -368,7 +377,7 @@ Bit32s scsi_device_t::scsi_send_command(Bit32u tag, Bit8u *buf, int lun) memcpy(&outbuf[32], "1.0", 4); outbuf[2] = 3; outbuf[3] = 2; - outbuf[4] = 32; + outbuf[4] = 31; outbuf[7] = 0x10 | (tcq ? 0x02 : 0); r->buf_len = 36; break; @@ -400,10 +409,11 @@ Bit32s scsi_device_t::scsi_send_command(Bit32u tag, Bit8u *buf, int lun) p += 4; if ((page == 8 || page == 0x3f)) { /* Caching page. */ + memset(p, 0, 20); p[0] = 8; p[1] = 0x12; p[2] = 4; /* WCE */ - p += 19; + p += 20; } if ((page == 0x3f || page == 0x2a) && (type == SCSIDEV_TYPE_CDROM)) { @@ -432,7 +442,7 @@ Bit32s scsi_device_t::scsi_send_command(Bit32u tag, Bit8u *buf, int lun) p[19] = (16 * 176) & 0xff; p[20] = (16 * 176) >> 8; // 16x write speed current p[21] = (16 * 176) & 0xff; - p += 21; + p += 22; } r->buf_len = p - outbuf; outbuf[0] = r->buf_len - 4; diff --git a/bochs/iodev/scsi_device.h b/bochs/iodev/scsi_device.h index c9f548938..1725730c5 100644 --- a/bochs/iodev/scsi_device.h +++ b/bochs/iodev/scsi_device.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: scsi_device.h,v 1.3 2007-03-18 15:18:02 vruppert Exp $ +// $Id: scsi_device.h,v 1.4 2007-05-05 12:30:23 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2007 Volker Ruppert @@ -64,6 +64,9 @@ public: scsi_completionfn _completion, void *_dev); virtual ~scsi_device_t(void); +#if BX_SUPPORT_SAVE_RESTORE + void register_state(bx_list_c *parent, const char *name); +#endif Bit32s scsi_send_command(Bit32u tag, Bit8u *buf, int lun); void scsi_command_complete(SCSIRequest *r, int sense); void scsi_cancel_io(Bit32u tag); diff --git a/bochs/iodev/usb_msd.cc b/bochs/iodev/usb_msd.cc index fd63a9f5a..f93f2a5fb 100644 --- a/bochs/iodev/usb_msd.cc +++ b/bochs/iodev/usb_msd.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: usb_msd.cc,v 1.4 2007-04-09 09:04:54 vruppert Exp $ +// $Id: usb_msd.cc,v 1.5 2007-05-05 12:30:23 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2007 Volker Ruppert @@ -155,6 +155,9 @@ bx_bool usb_msd_device_t::init(const char *filename) return 0; } else { s.scsi_dev = new scsi_device_t(s.hdimage, 0, usb_msd_command_complete, (void*)this); +#if BX_SUPPORT_SAVE_RESTORE + s.scsi_dev->register_state(s.sr_list, "scsidev"); +#endif s.mode = USB_MSDM_CBW; d.connected = 1; return 1; @@ -164,14 +167,14 @@ bx_bool usb_msd_device_t::init(const char *filename) #if BX_SUPPORT_SAVE_RESTORE void usb_msd_device_t::register_state_specific(bx_list_c *parent) { - bx_list_c *list = new bx_list_c(parent, "s", "USB MSD Device State", 7); - new bx_shadow_num_c(list, "mode", &s.mode); - new bx_shadow_num_c(list, "scsi_len", &s.scsi_len); - new bx_shadow_num_c(list, "usb_len", &s.usb_len); - new bx_shadow_num_c(list, "data_len", &s.data_len); - new bx_shadow_num_c(list, "residue", &s.residue); - new bx_shadow_num_c(list, "tag", &s.tag); - new bx_shadow_num_c(list, "result", &s.result); + s.sr_list = new bx_list_c(parent, "s", "USB MSD Device State", 8); + new bx_shadow_num_c(s.sr_list, "mode", &s.mode); + new bx_shadow_num_c(s.sr_list, "scsi_len", &s.scsi_len); + new bx_shadow_num_c(s.sr_list, "usb_len", &s.usb_len); + new bx_shadow_num_c(s.sr_list, "data_len", &s.data_len); + new bx_shadow_num_c(s.sr_list, "residue", &s.residue); + new bx_shadow_num_c(s.sr_list, "tag", &s.tag); + new bx_shadow_num_c(s.sr_list, "result", &s.result); } #endif diff --git a/bochs/iodev/usb_msd.h b/bochs/iodev/usb_msd.h index 17ce8ee6b..0fdebe915 100644 --- a/bochs/iodev/usb_msd.h +++ b/bochs/iodev/usb_msd.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: usb_msd.h,v 1.3 2007-04-09 09:04:54 vruppert Exp $ +// $Id: usb_msd.h,v 1.4 2007-05-05 12:30:23 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2007 Volker Ruppert @@ -58,6 +58,9 @@ private: device_image_t *hdimage; scsi_device_t *scsi_dev; USBPacket *packet; +#if BX_SUPPORT_SAVE_RESTORE + bx_list_c *sr_list; +#endif } s; };