- implementation of save/restore for the SCSI emulation started

- SCSI buffer length fixes ported from the Qemu project
This commit is contained in:
Volker Ruppert 2007-05-05 12:30:23 +00:00
parent 65a99eb736
commit e88a8b48a1
4 changed files with 35 additions and 16 deletions

View File

@ -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 // 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* scsi_device_t::scsi_new_request(Bit32u tag)
{ {
SCSIRequest *r; 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)); BX_DEBUG(("request Sense (len %d)", len));
if (len < 4) if (len < 4)
goto fail; goto fail;
memset(buf, 0, 4); memset(outbuf, 0, 4);
outbuf[0] = 0xf0; outbuf[0] = 0xf0;
outbuf[1] = 0; outbuf[1] = 0;
outbuf[2] = sense; 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); memcpy(&outbuf[32], "1.0", 4);
outbuf[2] = 3; outbuf[2] = 3;
outbuf[3] = 2; outbuf[3] = 2;
outbuf[4] = 32; outbuf[4] = 31;
outbuf[7] = 0x10 | (tcq ? 0x02 : 0); outbuf[7] = 0x10 | (tcq ? 0x02 : 0);
r->buf_len = 36; r->buf_len = 36;
break; break;
@ -400,10 +409,11 @@ Bit32s scsi_device_t::scsi_send_command(Bit32u tag, Bit8u *buf, int lun)
p += 4; p += 4;
if ((page == 8 || page == 0x3f)) { if ((page == 8 || page == 0x3f)) {
/* Caching page. */ /* Caching page. */
memset(p, 0, 20);
p[0] = 8; p[0] = 8;
p[1] = 0x12; p[1] = 0x12;
p[2] = 4; /* WCE */ p[2] = 4; /* WCE */
p += 19; p += 20;
} }
if ((page == 0x3f || page == 0x2a) if ((page == 0x3f || page == 0x2a)
&& (type == SCSIDEV_TYPE_CDROM)) { && (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[19] = (16 * 176) & 0xff;
p[20] = (16 * 176) >> 8; // 16x write speed current p[20] = (16 * 176) >> 8; // 16x write speed current
p[21] = (16 * 176) & 0xff; p[21] = (16 * 176) & 0xff;
p += 21; p += 22;
} }
r->buf_len = p - outbuf; r->buf_len = p - outbuf;
outbuf[0] = r->buf_len - 4; outbuf[0] = r->buf_len - 4;

View File

@ -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 // Copyright (C) 2007 Volker Ruppert
@ -64,6 +64,9 @@ public:
scsi_completionfn _completion, void *_dev); scsi_completionfn _completion, void *_dev);
virtual ~scsi_device_t(void); 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); Bit32s scsi_send_command(Bit32u tag, Bit8u *buf, int lun);
void scsi_command_complete(SCSIRequest *r, int sense); void scsi_command_complete(SCSIRequest *r, int sense);
void scsi_cancel_io(Bit32u tag); void scsi_cancel_io(Bit32u tag);

View File

@ -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 // Copyright (C) 2007 Volker Ruppert
@ -155,6 +155,9 @@ bx_bool usb_msd_device_t::init(const char *filename)
return 0; return 0;
} else { } else {
s.scsi_dev = new scsi_device_t(s.hdimage, 0, usb_msd_command_complete, (void*)this); 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; s.mode = USB_MSDM_CBW;
d.connected = 1; d.connected = 1;
return 1; return 1;
@ -164,14 +167,14 @@ bx_bool usb_msd_device_t::init(const char *filename)
#if BX_SUPPORT_SAVE_RESTORE #if BX_SUPPORT_SAVE_RESTORE
void usb_msd_device_t::register_state_specific(bx_list_c *parent) 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); s.sr_list = new bx_list_c(parent, "s", "USB MSD Device State", 8);
new bx_shadow_num_c(list, "mode", &s.mode); new bx_shadow_num_c(s.sr_list, "mode", &s.mode);
new bx_shadow_num_c(list, "scsi_len", &s.scsi_len); new bx_shadow_num_c(s.sr_list, "scsi_len", &s.scsi_len);
new bx_shadow_num_c(list, "usb_len", &s.usb_len); new bx_shadow_num_c(s.sr_list, "usb_len", &s.usb_len);
new bx_shadow_num_c(list, "data_len", &s.data_len); new bx_shadow_num_c(s.sr_list, "data_len", &s.data_len);
new bx_shadow_num_c(list, "residue", &s.residue); new bx_shadow_num_c(s.sr_list, "residue", &s.residue);
new bx_shadow_num_c(list, "tag", &s.tag); new bx_shadow_num_c(s.sr_list, "tag", &s.tag);
new bx_shadow_num_c(list, "result", &s.result); new bx_shadow_num_c(s.sr_list, "result", &s.result);
} }
#endif #endif

View File

@ -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 // Copyright (C) 2007 Volker Ruppert
@ -58,6 +58,9 @@ private:
device_image_t *hdimage; device_image_t *hdimage;
scsi_device_t *scsi_dev; scsi_device_t *scsi_dev;
USBPacket *packet; USBPacket *packet;
#if BX_SUPPORT_SAVE_RESTORE
bx_list_c *sr_list;
#endif
} s; } s;
}; };