[prev in list] [next in list] [prev in thread] [next in thread] 

List:       bochs-cvs
Subject:    [Bochs-cvs] [12811] trunk/bochs
From:       vruppert () users ! sourceforge ! net
Date:       2015-08-23 16:09:24
Message-ID: E1ZTXpo-0004cl-V7 () sfs-ml-2 ! v29 ! ch3 ! sourceforge ! com
[Download RAW message or body]

Revision: 12811
Author:   vruppert
Date:     2015-08-23 16:09:24 +0000 (Sun, 23 Aug 2015)
Log Message:
-----------
Added runtime config handler for the USB cdrom and modified parameter handling
similar to the ATAPI implementation (including locked tray case).
Fixed status indicator activity and minor other changes.

Modified Paths:
--------------
    trunk/bochs/gui/siminterface.cc
    trunk/bochs/iodev/usb/scsi_device.cc
    trunk/bochs/iodev/usb/scsi_device.h
    trunk/bochs/iodev/usb/usb_msd.cc
    trunk/bochs/iodev/usb/usb_msd.h

Modified: trunk/bochs/gui/siminterface.cc
===================================================================
--- trunk/bochs/gui/siminterface.cc	2015-08-23 07:04:56 UTC (rev 12810)
+++ trunk/bochs/gui/siminterface.cc	2015-08-23 16:09:24 UTC (rev 12811)
@@ -909,20 +909,20 @@
 
 void bx_real_sim_c::unregister_runtime_config_handler(int id)
 {
-  rt_conf_entry_t *prev = NULL, *next = rt_conf_entries;
+  rt_conf_entry_t *prev = NULL, *curr = rt_conf_entries;
 
-  while (next != NULL) {
-    if (next->id == id) {
+  while (curr != NULL) {
+    if (curr->id == id) {
       if (prev != NULL) {
-        prev->next = next->next;
+        prev->next = curr->next;
       } else {
-        rt_conf_entries = next->next;
+        rt_conf_entries = curr->next;
       }
-      free(next);
+      free(curr);
       break;
     } else {
-      prev = next;
-      next = next->next;
+      prev = curr;
+      curr = curr->next;
     }
   }
 }

Modified: trunk/bochs/iodev/usb/scsi_device.cc
===================================================================
--- trunk/bochs/iodev/usb/scsi_device.cc	2015-08-23 07:04:56 UTC (rev 12810)
+++ trunk/bochs/iodev/usb/scsi_device.cc	2015-08-23 16:09:24 UTC (rev 12811)
@@ -9,7 +9,7 @@
 //
 //  Written by Paul Brook
 //
-//  Copyright (C) 2007-2014  The Bochs Project
+//  Copyright (C) 2007-2015  The Bochs Project
 //
 //  This library is free software; you can redistribute it and/or
 //  modify it under the terms of the GNU Lesser General Public
@@ -380,7 +380,7 @@
   completion(dev, SCSI_REASON_DATA, r->tag, r->buf_len);
 }
 
-void scsi_device_t::scsi_read_data(Bit32u tag)
+bx_bool scsi_device_t::scsi_read_data(Bit32u tag)
 {
   Bit32u i, n;
   int ret = 0;
@@ -388,18 +388,18 @@
   SCSIRequest *r = scsi_find_request(tag);
   if (!r) {
     BX_ERROR(("bad read tag 0x%x", tag));
-    return;
+    return 0;
   }
   if (r->sector_count == (Bit32u)-1) {
     BX_DEBUG(("read buf_len=%d", r->buf_len));
     r->sector_count = 0;
     completion(dev, SCSI_REASON_DATA, r->tag, r->buf_len);
-    return;
+    return 0;
   }
   BX_DEBUG(("read sector_count=%d", r->sector_count));
   if (r->sector_count == 0) {
     scsi_command_complete(r, STATUS_GOOD, SENSE_NO_SENSE);
-    return;
+    return 0;
   }
 
   n = r->sector_count;
@@ -432,6 +432,7 @@
   }
   r->sector += n;
   r->sector_count -= n;
+  return 1;
 }
 
 void scsi_device_t::scsi_write_complete(void *req, int ret)
@@ -458,7 +459,7 @@
   }
 }
 
-int scsi_device_t::scsi_write_data(Bit32u tag)
+bx_bool scsi_device_t::scsi_write_data(Bit32u tag)
 {
   SCSIRequest *r;
   Bit32u n;
@@ -468,7 +469,7 @@
   r = scsi_find_request(tag);
   if (!r) {
     BX_ERROR(("bad write tag 0x%x", tag));
-    return 1;
+    return 0;
   }
   if (type == SCSIDEV_TYPE_DISK) {
     n = r->buf_len / 512;
@@ -484,17 +485,20 @@
       if (ret < r->buf_len) {
         BX_ERROR(("could not write() hard drive image file"));
         scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
+        return 0;
       } else {
         scsi_write_complete((void*)r, 0);
       }
     } else {
       scsi_write_complete(r, 0);
+      return 0;
     }
   } else {
     BX_ERROR(("CD-ROM: write not supported"));
     scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
+    return 0;
   }
-  return 0;
+  return 1;
 }
 
 Bit8u* scsi_device_t::scsi_get_buf(Bit32u tag)
@@ -844,6 +848,8 @@
     case 0x28:
     case 0x88:
       BX_DEBUG(("Read (sector " FMT_LL "d, count %d)", lba, len));
+      if (!inserted)
+        goto notready;
       if (lba > max_lba)
         goto illegal_lba;
       r->sector = lba;

Modified: trunk/bochs/iodev/usb/scsi_device.h
===================================================================
--- trunk/bochs/iodev/usb/scsi_device.h	2015-08-23 07:04:56 UTC (rev 12810)
+++ trunk/bochs/iodev/usb/scsi_device.h	2015-08-23 16:09:24 UTC (rev 12811)
@@ -9,7 +9,7 @@
 //
 //  Written by Paul Brook
 //
-//  Copyright (C) 2007-2014  The Bochs Project
+//  Copyright (C) 2007-2015  The Bochs Project
 //
 //  This library is free software; you can redistribute it and/or
 //  modify it under the terms of the GNU Lesser General Public
@@ -78,13 +78,14 @@
   void scsi_command_complete(SCSIRequest *r, int status, int sense);
   void scsi_cancel_io(Bit32u tag);
   void scsi_read_complete(void *req, int ret);
-  void scsi_read_data(Bit32u tag);
+  bx_bool scsi_read_data(Bit32u tag);
   void scsi_write_complete(void *req, int ret);
-  int scsi_write_data(Bit32u tag);
+  bx_bool scsi_write_data(Bit32u tag);
   Bit8u* scsi_get_buf(Bit32u tag);
   const char *get_serial_number() {return drive_serial_str;}
   void set_inserted(bx_bool value);
   bx_bool get_inserted() {return inserted;}
+  bx_bool get_locked() {return locked;}
   static void seek_timer_handler(void *);
   void seek_timer(void);
   bx_bool save_requests(const char *path);

Modified: trunk/bochs/iodev/usb/usb_msd.cc
===================================================================
--- trunk/bochs/iodev/usb/usb_msd.cc	2015-08-23 07:04:56 UTC (rev 12810)
+++ trunk/bochs/iodev/usb/usb_msd.cc	2015-08-23 16:09:24 UTC (rev 12811)
@@ -281,7 +281,7 @@
     s.config->set_device_param(this);
     path = new bx_param_string_c(s.config, "path", "Path", "", "", BX_PATHNAME_LEN);
     path->set(s.fname);
-    path->set_handler(cd_param_string_handler);
+    path->set_handler(cdrom_path_handler);
     status = new bx_param_enum_c(s.config,
       "status",
       "Status",
@@ -289,13 +289,14 @@
       media_status_names,
       BX_INSERTED,
       BX_EJECTED);
-    status->set_handler(cd_param_handler);
+    status->set_handler(cdrom_status_handler);
     status->set_ask_format("Is the device inserted or ejected? [%s] ");
     if (SIM->is_wx_selected()) {
       bx_list_c *usb = (bx_list_c*)SIM->get_param("ports.usb");
       usb->add(s.config);
     }
     s.statusbar_id = bx_gui->register_statusitem("USB-CD", 1);
+    s.rt_conf_id = SIM->register_runtime_config_handler(this, runtime_config_handler);
   }
 
   put("usb_msd", "USBMSD");
@@ -311,6 +312,7 @@
     delete s.hdimage;
   } else if (s.cdrom != NULL) {
     delete s.cdrom;
+    SIM->unregister_runtime_config_handler(s.rt_conf_id);
     if (SIM->is_wx_selected()) {
       bx_list_c *usb = (bx_list_c*)SIM->get_param("ports.usb");
       usb->remove(s.config->get_name());
@@ -638,11 +640,13 @@
           s.scsi_dev->scsi_send_command(s.tag, cbw.cmd, cbw.lun);
           if (s.residue == 0) {
             if (s.mode == USB_MSDM_DATAIN) {
-              bx_gui->statusbar_setitem(s.statusbar_id, 1);
-              s.scsi_dev->scsi_read_data(s.tag);
+              if (s.scsi_dev->scsi_read_data(s.tag)) {
+                bx_gui->statusbar_setitem(s.statusbar_id, 1);
+              }
             } else if (s.mode == USB_MSDM_DATAOUT) {
-              bx_gui->statusbar_setitem(s.statusbar_id, 1, 1);
-              s.scsi_dev->scsi_write_data(s.tag);
+              if (s.scsi_dev->scsi_write_data(s.tag)) {
+                bx_gui->statusbar_setitem(s.statusbar_id, 1, 1);
+              }
             }
           }
           ret = len;
@@ -774,11 +778,13 @@
   s.data_len -= len;
   if (s.scsi_len == 0) {
     if (s.mode == USB_MSDM_DATAIN) {
-      bx_gui->statusbar_setitem(s.statusbar_id, 1);
-      s.scsi_dev->scsi_read_data(s.tag);
+      if (s.scsi_dev->scsi_read_data(s.tag)) {
+        bx_gui->statusbar_setitem(s.statusbar_id, 1);
+      }
     } else if (s.mode == USB_MSDM_DATAOUT) {
-      bx_gui->statusbar_setitem(s.statusbar_id, 1, 1);
-      s.scsi_dev->scsi_write_data(s.tag);
+      if (s.scsi_dev->scsi_write_data(s.tag)) {
+        bx_gui->statusbar_setitem(s.statusbar_id, 1, 1);
+      }
     }
   }
 }
@@ -871,49 +877,71 @@
   return s.scsi_dev->get_inserted();
 }
 
+bx_bool usb_msd_device_c::get_locked()
+{
+  return s.scsi_dev->get_locked();
+}
+
+void usb_msd_device_c::runtime_config_handler(void *this_ptr)
+{
+  usb_msd_device_c *class_ptr = (usb_msd_device_c *) this_ptr;
+  class_ptr->runtime_config();
+}
+
+void usb_msd_device_c::runtime_config(void)
+{
+  if (s.status_changed) {
+    set_inserted(0);
+    if (SIM->get_param_enum("status", s.config)->get() == BX_INSERTED) {
+      set_inserted(1);
+    }
+    s.status_changed = 0;
+  }
+}
+
 #undef LOG_THIS
 #define LOG_THIS cdrom->
 
 // USB hub runtime parameter handlers
-const char *usb_msd_device_c::cd_param_string_handler(bx_param_string_c *param, int set,
+const char *usb_msd_device_c::cdrom_path_handler(bx_param_string_c *param, int set,
                                                       const char *oldval, const char *val, int maxlen)
 {
   usb_msd_device_c *cdrom;
 
   if (set) {
+    if (strlen(val) < 1) {
+      val = "none";
+    }
     cdrom = (usb_msd_device_c*) param->get_parent()->get_device_param();
     if (cdrom != NULL) {
-      bx_bool empty = ((strlen(val) == 0) || (!strcmp(val, "none")));
-      if (!empty) {
-        if (cdrom->get_inserted()) {
-          BX_ERROR(("direct path change not supported (setting to 'none')"));
-          param->set("none");
-        }
+      if (!cdrom->get_locked()) {
+        cdrom->s.status_changed = 1;
       } else {
-        SIM->get_param_enum("status", param->get_parent())->set(BX_EJECTED);
+        val = oldval;
+        BX_ERROR(("cdrom tray locked: path change failed"));
       }
     } else {
-      BX_PANIC(("cd_param_string_handler: cdrom not found"));
+      BX_PANIC(("cdrom_path_handler: cdrom not found"));
     }
   }
   return val;
 }
 
-Bit64s usb_msd_device_c::cd_param_handler(bx_param_c *param, int set, Bit64s val)
+Bit64s usb_msd_device_c::cdrom_status_handler(bx_param_c *param, int set, Bit64s val)
 {
   usb_msd_device_c *cdrom;
-  const char *path;
 
   if (set) {
     cdrom = (usb_msd_device_c*) param->get_parent()->get_device_param();
     if (cdrom != NULL) {
-      path = SIM->get_param_string("path", param->get_parent())->getptr();
-      val &= ((strlen(path) > 0) && (strcmp(path, "none")));
-      if (val != cdrom->get_inserted()) {
-        cdrom->set_inserted(val == BX_INSERTED);
+      if ((val == 1) || !cdrom->get_locked()) {
+        cdrom->s.status_changed = 1;
+      } else if (cdrom->get_locked()) {
+        BX_ERROR(("cdrom tray locked: eject failed"));
+        return BX_INSERTED;
       }
     } else {
-      BX_PANIC(("cd_param_string_handler: cdrom not found"));
+      BX_PANIC(("cdrom_status_handler: cdrom not found"));
     }
   }
   return val;

Modified: trunk/bochs/iodev/usb/usb_msd.h
===================================================================
--- trunk/bochs/iodev/usb/usb_msd.h	2015-08-23 07:04:56 UTC (rev 12810)
+++ trunk/bochs/iodev/usb/usb_msd.h	2015-08-23 16:09:24 UTC (rev 12811)
@@ -6,7 +6,7 @@
 //
 //  Copyright (c) 2006 CodeSourcery.
 //  Written by Paul Brook
-//  Copyright (C) 2009-2014  The Bochs Project
+//  Copyright (C) 2009-2015  The Bochs Project
 //
 //  This library is free software; you can redistribute it and/or
 //  modify it under the terms of the GNU Lesser General Public
@@ -46,6 +46,7 @@
   virtual void cancel_packet(USBPacket *p);
   bx_bool set_inserted(bx_bool value);
   bx_bool get_inserted();
+  bx_bool get_locked();
 
 protected:
   void copy_data();
@@ -76,11 +77,16 @@
     char journal[BX_PATHNAME_LEN]; // undoable / volatile disk only
     int size; // VVFAT disk only
     int statusbar_id;
+    int rt_conf_id;
+    bx_bool status_changed;
   } s;
 
-  static const char *cd_param_string_handler(bx_param_string_c *param, int set,
+  static void runtime_config_handler(void *);
+  void runtime_config(void);
+
+  static const char *cdrom_path_handler(bx_param_string_c *param, int set,
                                              const char *oldval, const char *val, int maxlen);
-  static Bit64s cd_param_handler(bx_param_c *param, int set, Bit64s val);
+  static Bit64s cdrom_status_handler(bx_param_c *param, int set, Bit64s val);
 };
 
 #endif


------------------------------------------------------------------------------
_______________________________________________
Bochs-cvs mailing list
Bochs-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bochs-cvs
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic