- partial save/restore support for USB MSD devices (TODO: buffers and SCSI

emulation status not saved)
- changed type of member 'mode' to simplify save/restore
This commit is contained in:
Volker Ruppert 2007-04-09 09:04:54 +00:00
parent 98acd5ef2e
commit bb27085003
2 changed files with 28 additions and 11 deletions

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: usb_msd.cc,v 1.3 2007-03-25 17:37:59 vruppert Exp $
// $Id: usb_msd.cc,v 1.4 2007-04-09 09:04:54 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2007 Volker Ruppert
@ -36,6 +36,13 @@
#define LOG_THIS
enum USBMSDMode {
USB_MSDM_CBW,
USB_MSDM_DATAOUT,
USB_MSDM_DATAIN,
USB_MSDM_CSW
};
struct usb_msd_cbw {
Bit32u sig;
Bit32u tag;
@ -154,6 +161,20 @@ 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);
}
#endif
void usb_msd_device_t::handle_reset()
{
BX_DEBUG(("Reset"));
@ -345,7 +366,7 @@ int usb_msd_device_t::handle_data(USBPacket *p)
if (s.residue && s.usb_len) {
s.data_len -= s.usb_len;
if (s.data_len == 0)
s.mode = USB_MSDM_CSW;
s.mode = USB_MSDM_CSW;
s.usb_len = 0;
}
if (s.usb_len) {

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: usb_msd.h,v 1.2 2007-03-24 11:43:41 vruppert Exp $
// $Id: usb_msd.h,v 1.3 2007-04-09 09:04:54 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2007 Volker Ruppert
@ -25,13 +25,6 @@
class scsi_device_t;
enum USBMSDMode {
USB_MSDM_CBW,
USB_MSDM_DATAOUT,
USB_MSDM_DATAIN,
USB_MSDM_CSW
};
class usb_msd_device_t : public usb_device_t {
public:
@ -42,6 +35,9 @@ public:
virtual void handle_reset();
virtual int handle_control(int request, int value, int index, int length, Bit8u *data);
virtual int handle_data(USBPacket *p);
#if BX_SUPPORT_SAVE_RESTORE
virtual void register_state_specific(bx_list_c *parent);
#endif
protected:
void copy_data();
void send_status();
@ -50,7 +46,7 @@ protected:
private:
struct {
enum USBMSDMode mode;
Bit8u mode;
Bit32u scsi_len;
Bit8u *scsi_buf;
Bit32u usb_len;