All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface
@ 2019-08-27  8:24 Sam Eiderman via Qemu-devel
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 1/8] block: Refactor macros - fix tabbing Sam Eiderman via Qemu-devel
                   ` (12 more replies)
  0 siblings, 13 replies; 20+ messages in thread
From: Sam Eiderman via Qemu-devel @ 2019-08-27  8:24 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, qemu-block, seabios, kevin, liran.alon, kraxel, sameid,
	karl.heubaum

v1:

Non-standard logical geometries break under QEMU.

A virtual disk which contains an operating system which depends on
logical geometries (consistent values being reported from BIOS INT13
AH=08) will most likely break under QEMU/SeaBIOS if it has non-standard
logical geometries - for example 56 SPT (sectors per track).
No matter what QEMU will guess - SeaBIOS, for large enough disks - will
use LBA translation, which will report 63 SPT instead.

In addition we can not enforce SeaBIOS to rely on phyiscal geometries at
all. A virtio-blk-pci virtual disk with 255 phyiscal heads can not
report more than 16 physical heads when moved to an IDE controller, the
ATA spec allows a maximum of 16 heads - this is an artifact of
virtualization.

By supplying the logical geometies directly we are able to support such
"exotic" disks.

We will use fw_cfg to do just that.

v2:

Fix missing parenthesis check in
    "hd-geo-test: Add tests for lchs override"

v3:

* Rename fw_cfg key to "bios-geometry".
* Remove "extendible" interface.
* Add cpu_to_le32 fix as Laszlo suggested or big endian hosts
* Fix last qtest commit - automatic docker tester for some reason does not have qemu-img set

v4:

* Change fw_cfg interface from mixed textual/binary to textual only

v5:

* Fix line > 80 chars in tests/hd-geo-test.c

v6:

* Small fixes for issues pointed by Max
* (&conf->conf)->lcyls to conf->conf.lcyls and so on
* Remove scsi_unrealize from everything other than scsi-hd
* Add proper include to sysemu.h
* scsi_device_unrealize() after scsi_device_purge_requests()

Sam Eiderman (8):
  block: Refactor macros - fix tabbing
  block: Support providing LCHS from user
  bootdevice: Add interface to gather LCHS
  scsi: Propagate unrealize() callback to scsi-hd
  bootdevice: Gather LCHS from all relevant devices
  bootdevice: Refactor get_boot_devices_list
  bootdevice: FW_CFG interface for LCHS values
  hd-geo-test: Add tests for lchs override

 bootdevice.c             | 148 ++++++++--
 hw/block/virtio-blk.c    |   6 +
 hw/ide/qdev.c            |   7 +-
 hw/nvram/fw_cfg.c        |  14 +-
 hw/scsi/scsi-bus.c       |  16 ++
 hw/scsi/scsi-disk.c      |  12 +
 include/hw/block/block.h |  22 +-
 include/hw/scsi/scsi.h   |   1 +
 include/sysemu/sysemu.h  |   4 +
 tests/Makefile.include   |   2 +-
 tests/hd-geo-test.c      | 582 +++++++++++++++++++++++++++++++++++++++
 11 files changed, 773 insertions(+), 41 deletions(-)

-- 
2.23.0.187.g17f5b7556c-goog



^ permalink raw reply	[flat|nested] 20+ messages in thread

* [Qemu-devel] [PATCH v6 1/8] block: Refactor macros - fix tabbing
  2019-08-27  8:24 [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface Sam Eiderman via Qemu-devel
@ 2019-08-27  8:24 ` Sam Eiderman via Qemu-devel
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 2/8] block: Support providing LCHS from user Sam Eiderman via Qemu-devel
                   ` (11 subsequent siblings)
  12 siblings, 0 replies; 20+ messages in thread
From: Sam Eiderman via Qemu-devel @ 2019-08-27  8:24 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, qemu-block, Arbel Moshe, seabios, kevin, liran.alon,
	kraxel, Sam Eiderman, sameid, karl.heubaum

From: Sam Eiderman <shmuel.eiderman@oracle.com>

Fixing tabbing in block related macros.

Reviewed-by: Karl Heubaum <karl.heubaum@oracle.com>
Reviewed-by: Arbel Moshe <arbel.moshe@oracle.com>
Signed-off-by: Sam Eiderman <shmuel.eiderman@oracle.com>
---
 hw/ide/qdev.c            |  2 +-
 include/hw/block/block.h | 16 ++++++++--------
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index 6fba6b62b8..6dd219944f 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -290,7 +290,7 @@ static void ide_drive_realize(IDEDevice *dev, Error **errp)
     DEFINE_BLOCK_PROPERTIES(IDEDrive, dev.conf),        \
     DEFINE_BLOCK_ERROR_PROPERTIES(IDEDrive, dev.conf),  \
     DEFINE_PROP_STRING("ver",  IDEDrive, dev.version),  \
-    DEFINE_PROP_UINT64("wwn",  IDEDrive, dev.wwn, 0),    \
+    DEFINE_PROP_UINT64("wwn",  IDEDrive, dev.wwn, 0),   \
     DEFINE_PROP_STRING("serial",  IDEDrive, dev.serial),\
     DEFINE_PROP_STRING("model", IDEDrive, dev.model)
 
diff --git a/include/hw/block/block.h b/include/hw/block/block.h
index 607539057a..fd55a30bca 100644
--- a/include/hw/block/block.h
+++ b/include/hw/block/block.h
@@ -50,21 +50,21 @@ static inline unsigned int get_physical_block_exp(BlockConf *conf)
                           _conf.logical_block_size),                    \
     DEFINE_PROP_BLOCKSIZE("physical_block_size", _state,                \
                           _conf.physical_block_size),                   \
-    DEFINE_PROP_UINT16("min_io_size", _state, _conf.min_io_size, 0),  \
+    DEFINE_PROP_UINT16("min_io_size", _state, _conf.min_io_size, 0),    \
     DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 0),    \
-    DEFINE_PROP_UINT32("discard_granularity", _state, \
-                       _conf.discard_granularity, -1), \
-    DEFINE_PROP_ON_OFF_AUTO("write-cache", _state, _conf.wce, \
-                            ON_OFF_AUTO_AUTO), \
+    DEFINE_PROP_UINT32("discard_granularity", _state,                   \
+                       _conf.discard_granularity, -1),                  \
+    DEFINE_PROP_ON_OFF_AUTO("write-cache", _state, _conf.wce,           \
+                            ON_OFF_AUTO_AUTO),                          \
     DEFINE_PROP_BOOL("share-rw", _state, _conf.share_rw, false)
 
 #define DEFINE_BLOCK_PROPERTIES(_state, _conf)                          \
     DEFINE_PROP_DRIVE("drive", _state, _conf.blk),                      \
     DEFINE_BLOCK_PROPERTIES_BASE(_state, _conf)
 
-#define DEFINE_BLOCK_CHS_PROPERTIES(_state, _conf)      \
-    DEFINE_PROP_UINT32("cyls", _state, _conf.cyls, 0),  \
-    DEFINE_PROP_UINT32("heads", _state, _conf.heads, 0), \
+#define DEFINE_BLOCK_CHS_PROPERTIES(_state, _conf)                      \
+    DEFINE_PROP_UINT32("cyls", _state, _conf.cyls, 0),                  \
+    DEFINE_PROP_UINT32("heads", _state, _conf.heads, 0),                \
     DEFINE_PROP_UINT32("secs", _state, _conf.secs, 0)
 
 #define DEFINE_BLOCK_ERROR_PROPERTIES(_state, _conf)                    \
-- 
2.23.0.187.g17f5b7556c-goog



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [Qemu-devel] [PATCH v6 2/8] block: Support providing LCHS from user
  2019-08-27  8:24 [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface Sam Eiderman via Qemu-devel
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 1/8] block: Refactor macros - fix tabbing Sam Eiderman via Qemu-devel
@ 2019-08-27  8:24 ` Sam Eiderman via Qemu-devel
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 3/8] bootdevice: Add interface to gather LCHS Sam Eiderman via Qemu-devel
                   ` (10 subsequent siblings)
  12 siblings, 0 replies; 20+ messages in thread
From: Sam Eiderman via Qemu-devel @ 2019-08-27  8:24 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, qemu-block, Arbel Moshe, seabios, kevin, liran.alon,
	kraxel, Sam Eiderman, sameid, karl.heubaum

From: Sam Eiderman <shmuel.eiderman@oracle.com>

Add logical geometry variables to BlockConf.

A user can now supply "lcyls", "lheads" & "lsecs" for any HD device
that supports CHS ("cyls", "heads", "secs").

These devices include:
    * ide-hd
    * scsi-hd
    * virtio-blk-pci

In future commits we will use the provided LCHS and pass it to the BIOS
through fw_cfg to be supplied using INT13 routines.

Reviewed-by: Karl Heubaum <karl.heubaum@oracle.com>
Reviewed-by: Arbel Moshe <arbel.moshe@oracle.com>
Signed-off-by: Sam Eiderman <shmuel.eiderman@oracle.com>
---
 include/hw/block/block.h | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/include/hw/block/block.h b/include/hw/block/block.h
index fd55a30bca..d7246f3862 100644
--- a/include/hw/block/block.h
+++ b/include/hw/block/block.h
@@ -26,6 +26,7 @@ typedef struct BlockConf {
     uint32_t discard_granularity;
     /* geometry, not all devices use this */
     uint32_t cyls, heads, secs;
+    uint32_t lcyls, lheads, lsecs;
     OnOffAuto wce;
     bool share_rw;
     BlockdevOnError rerror;
@@ -65,7 +66,10 @@ static inline unsigned int get_physical_block_exp(BlockConf *conf)
 #define DEFINE_BLOCK_CHS_PROPERTIES(_state, _conf)                      \
     DEFINE_PROP_UINT32("cyls", _state, _conf.cyls, 0),                  \
     DEFINE_PROP_UINT32("heads", _state, _conf.heads, 0),                \
-    DEFINE_PROP_UINT32("secs", _state, _conf.secs, 0)
+    DEFINE_PROP_UINT32("secs", _state, _conf.secs, 0),                  \
+    DEFINE_PROP_UINT32("lcyls", _state, _conf.lcyls, 0),                \
+    DEFINE_PROP_UINT32("lheads", _state, _conf.lheads, 0),              \
+    DEFINE_PROP_UINT32("lsecs", _state, _conf.lsecs, 0)
 
 #define DEFINE_BLOCK_ERROR_PROPERTIES(_state, _conf)                    \
     DEFINE_PROP_BLOCKDEV_ON_ERROR("rerror", _state, _conf.rerror,       \
-- 
2.23.0.187.g17f5b7556c-goog



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [Qemu-devel] [PATCH v6 3/8] bootdevice: Add interface to gather LCHS
  2019-08-27  8:24 [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface Sam Eiderman via Qemu-devel
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 1/8] block: Refactor macros - fix tabbing Sam Eiderman via Qemu-devel
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 2/8] block: Support providing LCHS from user Sam Eiderman via Qemu-devel
@ 2019-08-27  8:24 ` Sam Eiderman via Qemu-devel
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 4/8] scsi: Propagate unrealize() callback to scsi-hd Sam Eiderman via Qemu-devel
                   ` (9 subsequent siblings)
  12 siblings, 0 replies; 20+ messages in thread
From: Sam Eiderman via Qemu-devel @ 2019-08-27  8:24 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, qemu-block, Arbel Moshe, seabios, kevin, liran.alon,
	kraxel, Sam Eiderman, sameid, karl.heubaum

From: Sam Eiderman <shmuel.eiderman@oracle.com>

Add an interface to provide direct logical CHS values for boot devices.
We will use this interface in the next commits.

Reviewed-by: Karl Heubaum <karl.heubaum@oracle.com>
Reviewed-by: Arbel Moshe <arbel.moshe@oracle.com>
Signed-off-by: Sam Eiderman <shmuel.eiderman@oracle.com>
---
 bootdevice.c            | 55 +++++++++++++++++++++++++++++++++++++++++
 include/sysemu/sysemu.h |  3 +++
 2 files changed, 58 insertions(+)

diff --git a/bootdevice.c b/bootdevice.c
index 1d225202f9..bc5e1c2de4 100644
--- a/bootdevice.c
+++ b/bootdevice.c
@@ -343,3 +343,58 @@ void device_add_bootindex_property(Object *obj, int32_t *bootindex,
     /* initialize devices' bootindex property to -1 */
     object_property_set_int(obj, -1, name, NULL);
 }
+
+typedef struct FWLCHSEntry FWLCHSEntry;
+
+struct FWLCHSEntry {
+    QTAILQ_ENTRY(FWLCHSEntry) link;
+    DeviceState *dev;
+    char *suffix;
+    uint32_t lcyls;
+    uint32_t lheads;
+    uint32_t lsecs;
+};
+
+static QTAILQ_HEAD(, FWLCHSEntry) fw_lchs =
+    QTAILQ_HEAD_INITIALIZER(fw_lchs);
+
+void add_boot_device_lchs(DeviceState *dev, const char *suffix,
+                          uint32_t lcyls, uint32_t lheads, uint32_t lsecs)
+{
+    FWLCHSEntry *node;
+
+    if (!lcyls && !lheads && !lsecs) {
+        return;
+    }
+
+    assert(dev != NULL || suffix != NULL);
+
+    node = g_malloc0(sizeof(FWLCHSEntry));
+    node->suffix = g_strdup(suffix);
+    node->dev = dev;
+    node->lcyls = lcyls;
+    node->lheads = lheads;
+    node->lsecs = lsecs;
+
+    QTAILQ_INSERT_TAIL(&fw_lchs, node, link);
+}
+
+void del_boot_device_lchs(DeviceState *dev, const char *suffix)
+{
+    FWLCHSEntry *i;
+
+    if (dev == NULL) {
+        return;
+    }
+
+    QTAILQ_FOREACH(i, &fw_lchs, link) {
+        if ((!suffix || !g_strcmp0(i->suffix, suffix)) &&
+             i->dev == dev) {
+            QTAILQ_REMOVE(&fw_lchs, i, link);
+            g_free(i->suffix);
+            g_free(i);
+
+            break;
+        }
+    }
+}
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index d2c38f611a..1a33f25a5a 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -105,6 +105,9 @@ void device_add_bootindex_property(Object *obj, int32_t *bootindex,
                                    DeviceState *dev, Error **errp);
 void restore_boot_order(void *opaque);
 void validate_bootdevices(const char *devices, Error **errp);
+void add_boot_device_lchs(DeviceState *dev, const char *suffix,
+                          uint32_t lcyls, uint32_t lheads, uint32_t lsecs);
+void del_boot_device_lchs(DeviceState *dev, const char *suffix);
 
 /* handler to set the boot_device order for a specific type of MachineClass */
 typedef void QEMUBootSetHandler(void *opaque, const char *boot_order,
-- 
2.23.0.187.g17f5b7556c-goog



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [Qemu-devel] [PATCH v6 4/8] scsi: Propagate unrealize() callback to scsi-hd
  2019-08-27  8:24 [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface Sam Eiderman via Qemu-devel
                   ` (2 preceding siblings ...)
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 3/8] bootdevice: Add interface to gather LCHS Sam Eiderman via Qemu-devel
@ 2019-08-27  8:24 ` Sam Eiderman via Qemu-devel
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 5/8] bootdevice: Gather LCHS from all relevant devices Sam Eiderman via Qemu-devel
                   ` (8 subsequent siblings)
  12 siblings, 0 replies; 20+ messages in thread
From: Sam Eiderman via Qemu-devel @ 2019-08-27  8:24 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, qemu-block, Arbel Moshe, seabios, kevin, liran.alon,
	kraxel, Sam Eiderman, sameid, karl.heubaum

From: Sam Eiderman <shmuel.eiderman@oracle.com>

We will need to add LCHS removal logic to scsi-hd's unrealize() in the
next commit.

Signed-off-by: Sam Eiderman <sameid@google.com>
Reviewed-by: Karl Heubaum <karl.heubaum@oracle.com>
Reviewed-by: Arbel Moshe <arbel.moshe@oracle.com>
Signed-off-by: Sam Eiderman <shmuel.eiderman@oracle.com>
---
 hw/scsi/scsi-bus.c     | 16 ++++++++++++++++
 include/hw/scsi/scsi.h |  1 +
 2 files changed, 17 insertions(+)

diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index bccb7cc4c6..359d50d6d0 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -59,6 +59,14 @@ static void scsi_device_realize(SCSIDevice *s, Error **errp)
     }
 }
 
+static void scsi_device_unrealize(SCSIDevice *s, Error **errp)
+{
+    SCSIDeviceClass *sc = SCSI_DEVICE_GET_CLASS(s);
+    if (sc->unrealize) {
+        sc->unrealize(s, errp);
+    }
+}
+
 int scsi_bus_parse_cdb(SCSIDevice *dev, SCSICommand *cmd, uint8_t *buf,
                        void *hba_private)
 {
@@ -217,12 +225,20 @@ static void scsi_qdev_realize(DeviceState *qdev, Error **errp)
 static void scsi_qdev_unrealize(DeviceState *qdev, Error **errp)
 {
     SCSIDevice *dev = SCSI_DEVICE(qdev);
+    Error *local_err = NULL;
 
     if (dev->vmsentry) {
         qemu_del_vm_change_state_handler(dev->vmsentry);
     }
 
     scsi_device_purge_requests(dev, SENSE_CODE(NO_SENSE));
+
+    scsi_device_unrealize(dev, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
     blockdev_mark_auto_del(dev->conf.blk);
 }
 
diff --git a/include/hw/scsi/scsi.h b/include/hw/scsi/scsi.h
index d77a92361b..332ef602f4 100644
--- a/include/hw/scsi/scsi.h
+++ b/include/hw/scsi/scsi.h
@@ -59,6 +59,7 @@ struct SCSIRequest {
 typedef struct SCSIDeviceClass {
     DeviceClass parent_class;
     void (*realize)(SCSIDevice *dev, Error **errp);
+    void (*unrealize)(SCSIDevice *dev, Error **errp);
     int (*parse_cdb)(SCSIDevice *dev, SCSICommand *cmd, uint8_t *buf,
                      void *hba_private);
     SCSIRequest *(*alloc_req)(SCSIDevice *s, uint32_t tag, uint32_t lun,
-- 
2.23.0.187.g17f5b7556c-goog



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [Qemu-devel] [PATCH v6 5/8] bootdevice: Gather LCHS from all relevant devices
  2019-08-27  8:24 [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface Sam Eiderman via Qemu-devel
                   ` (3 preceding siblings ...)
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 4/8] scsi: Propagate unrealize() callback to scsi-hd Sam Eiderman via Qemu-devel
@ 2019-08-27  8:24 ` Sam Eiderman via Qemu-devel
  2019-09-23 21:40   ` [Qemu-block] " John Snow
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 6/8] bootdevice: Refactor get_boot_devices_list Sam Eiderman via Qemu-devel
                   ` (7 subsequent siblings)
  12 siblings, 1 reply; 20+ messages in thread
From: Sam Eiderman via Qemu-devel @ 2019-08-27  8:24 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, qemu-block, Arbel Moshe, seabios, kevin, liran.alon,
	kraxel, Sam Eiderman, sameid, karl.heubaum

From: Sam Eiderman <shmuel.eiderman@oracle.com>

Relevant devices are:
    * ide-hd (and ide-cd, ide-drive)
    * scsi-hd (and scsi-cd, scsi-disk, scsi-block)
    * virtio-blk-pci

We do not call del_boot_device_lchs() for ide-* since we don't need to -
IDE block devices do not support unplugging.

Signed-off-by: Sam Eiderman <sameid@google.com>
Reviewed-by: Karl Heubaum <karl.heubaum@oracle.com>
Reviewed-by: Arbel Moshe <arbel.moshe@oracle.com>
Signed-off-by: Sam Eiderman <shmuel.eiderman@oracle.com>
---
 hw/block/virtio-blk.c |  6 ++++++
 hw/ide/qdev.c         |  5 +++++
 hw/scsi/scsi-disk.c   | 12 ++++++++++++
 3 files changed, 23 insertions(+)

diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
index 18851601cb..6d8ff34a16 100644
--- a/hw/block/virtio-blk.c
+++ b/hw/block/virtio-blk.c
@@ -1186,6 +1186,11 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
     blk_set_guest_block_size(s->blk, s->conf.conf.logical_block_size);
 
     blk_iostatus_enable(s->blk);
+
+    add_boot_device_lchs(dev, "/disk@0,0",
+                         conf->conf.lcyls,
+                         conf->conf.lheads,
+                         conf->conf.lsecs);
 }
 
 static void virtio_blk_device_unrealize(DeviceState *dev, Error **errp)
@@ -1193,6 +1198,7 @@ static void virtio_blk_device_unrealize(DeviceState *dev, Error **errp)
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOBlock *s = VIRTIO_BLK(dev);
 
+    del_boot_device_lchs(dev, "/disk@0,0");
     virtio_blk_data_plane_destroy(s->dataplane);
     s->dataplane = NULL;
     qemu_del_vm_change_state_handler(s->change);
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index 6dd219944f..2ffd387a73 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -220,6 +220,11 @@ static void ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind, Error **errp)
 
     add_boot_device_path(dev->conf.bootindex, &dev->qdev,
                          dev->unit ? "/disk@1" : "/disk@0");
+
+    add_boot_device_lchs(&dev->qdev, dev->unit ? "/disk@1" : "/disk@0",
+                         dev->conf.lcyls,
+                         dev->conf.lheads,
+                         dev->conf.lsecs);
 }
 
 static void ide_dev_get_bootindex(Object *obj, Visitor *v, const char *name,
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
index 915641a0f1..d19896fe4d 100644
--- a/hw/scsi/scsi-disk.c
+++ b/hw/scsi/scsi-disk.c
@@ -35,6 +35,7 @@
 #include "hw/block/block.h"
 #include "hw/qdev-properties.h"
 #include "sysemu/dma.h"
+#include "sysemu/sysemu.h"
 #include "qemu/cutils.h"
 #include "trace.h"
 
@@ -2402,6 +2403,16 @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
     blk_set_guest_block_size(s->qdev.conf.blk, s->qdev.blocksize);
 
     blk_iostatus_enable(s->qdev.conf.blk);
+
+    add_boot_device_lchs(&dev->qdev, NULL,
+                         dev->conf.lcyls,
+                         dev->conf.lheads,
+                         dev->conf.lsecs);
+}
+
+static void scsi_unrealize(SCSIDevice *dev, Error **errp)
+{
+    del_boot_device_lchs(&dev->qdev, NULL);
 }
 
 static void scsi_hd_realize(SCSIDevice *dev, Error **errp)
@@ -3006,6 +3017,7 @@ static void scsi_hd_class_initfn(ObjectClass *klass, void *data)
     SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
 
     sc->realize      = scsi_hd_realize;
+    sc->unrealize    = scsi_unrealize;
     sc->alloc_req    = scsi_new_request;
     sc->unit_attention_reported = scsi_disk_unit_attention_reported;
     dc->desc = "virtual SCSI disk";
-- 
2.23.0.187.g17f5b7556c-goog



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [Qemu-devel] [PATCH v6 6/8] bootdevice: Refactor get_boot_devices_list
  2019-08-27  8:24 [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface Sam Eiderman via Qemu-devel
                   ` (4 preceding siblings ...)
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 5/8] bootdevice: Gather LCHS from all relevant devices Sam Eiderman via Qemu-devel
@ 2019-08-27  8:24 ` Sam Eiderman via Qemu-devel
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 7/8] bootdevice: FW_CFG interface for LCHS values Sam Eiderman via Qemu-devel
                   ` (6 subsequent siblings)
  12 siblings, 0 replies; 20+ messages in thread
From: Sam Eiderman via Qemu-devel @ 2019-08-27  8:24 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, qemu-block, Arbel Moshe, seabios, kevin, liran.alon,
	kraxel, Sam Eiderman, sameid, karl.heubaum

From: Sam Eiderman <shmuel.eiderman@oracle.com>

Move device name construction to a separate function.

We will reuse this function in the following commit to pass logical CHS
parameters through fw_cfg much like we currently pass bootindex.

Reviewed-by: Karl Heubaum <karl.heubaum@oracle.com>
Reviewed-by: Arbel Moshe <arbel.moshe@oracle.com>
Signed-off-by: Sam Eiderman <shmuel.eiderman@oracle.com>
---
 bootdevice.c | 61 +++++++++++++++++++++++++++++-----------------------
 1 file changed, 34 insertions(+), 27 deletions(-)

diff --git a/bootdevice.c b/bootdevice.c
index bc5e1c2de4..2b12fb85a4 100644
--- a/bootdevice.c
+++ b/bootdevice.c
@@ -202,6 +202,39 @@ DeviceState *get_boot_device(uint32_t position)
     return res;
 }
 
+static char *get_boot_device_path(DeviceState *dev, bool ignore_suffixes,
+                                  char *suffix)
+{
+    char *devpath = NULL, *s = NULL, *d, *bootpath;
+
+    if (dev) {
+        devpath = qdev_get_fw_dev_path(dev);
+        assert(devpath);
+    }
+
+    if (!ignore_suffixes) {
+        if (dev) {
+            d = qdev_get_own_fw_dev_path_from_handler(dev->parent_bus, dev);
+            if (d) {
+                assert(!suffix);
+                s = d;
+            } else {
+                s = g_strdup(suffix);
+            }
+        } else {
+            s = g_strdup(suffix);
+        }
+    }
+
+    bootpath = g_strdup_printf("%s%s",
+                               devpath ? devpath : "",
+                               s ? s : "");
+    g_free(devpath);
+    g_free(s);
+
+    return bootpath;
+}
+
 /*
  * This function returns null terminated string that consist of new line
  * separated device paths.
@@ -218,36 +251,10 @@ char *get_boot_devices_list(size_t *size)
     bool ignore_suffixes = mc->ignore_boot_device_suffixes;
 
     QTAILQ_FOREACH(i, &fw_boot_order, link) {
-        char *devpath = NULL,  *suffix = NULL;
         char *bootpath;
-        char *d;
         size_t len;
 
-        if (i->dev) {
-            devpath = qdev_get_fw_dev_path(i->dev);
-            assert(devpath);
-        }
-
-        if (!ignore_suffixes) {
-            if (i->dev) {
-                d = qdev_get_own_fw_dev_path_from_handler(i->dev->parent_bus,
-                                                          i->dev);
-                if (d) {
-                    assert(!i->suffix);
-                    suffix = d;
-                } else {
-                    suffix = g_strdup(i->suffix);
-                }
-            } else {
-                suffix = g_strdup(i->suffix);
-            }
-        }
-
-        bootpath = g_strdup_printf("%s%s",
-                                   devpath ? devpath : "",
-                                   suffix ? suffix : "");
-        g_free(devpath);
-        g_free(suffix);
+        bootpath = get_boot_device_path(i->dev, ignore_suffixes, i->suffix);
 
         if (total) {
             list[total-1] = '\n';
-- 
2.23.0.187.g17f5b7556c-goog



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [Qemu-devel] [PATCH v6 7/8] bootdevice: FW_CFG interface for LCHS values
  2019-08-27  8:24 [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface Sam Eiderman via Qemu-devel
                   ` (5 preceding siblings ...)
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 6/8] bootdevice: Refactor get_boot_devices_list Sam Eiderman via Qemu-devel
@ 2019-08-27  8:24 ` Sam Eiderman via Qemu-devel
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 8/8] hd-geo-test: Add tests for lchs override Sam Eiderman via Qemu-devel
                   ` (5 subsequent siblings)
  12 siblings, 0 replies; 20+ messages in thread
From: Sam Eiderman via Qemu-devel @ 2019-08-27  8:24 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, qemu-block, Arbel Moshe, seabios, kevin, liran.alon,
	kraxel, Sam Eiderman, sameid, karl.heubaum

From: Sam Eiderman <shmuel.eiderman@oracle.com>

Using fw_cfg, supply logical CHS values directly from QEMU to the BIOS.

Non-standard logical geometries break under QEMU.

A virtual disk which contains an operating system which depends on
logical geometries (consistent values being reported from BIOS INT13
AH=08) will most likely break under QEMU/SeaBIOS if it has non-standard
logical geometries - for example 56 SPT (sectors per track).
No matter what QEMU will report - SeaBIOS, for large enough disks - will
use LBA translation, which will report 63 SPT instead.

In addition we cannot force SeaBIOS to rely on physical geometries at
all. A virtio-blk-pci virtual disk with 255 phyiscal heads cannot
report more than 16 physical heads when moved to an IDE controller,
since the ATA spec allows a maximum of 16 heads - this is an artifact of
virtualization.

By supplying the logical geometries directly we are able to support such
"exotic" disks.

We serialize this information in a similar way to the "bootorder"
interface.
The new fw_cfg entry is "bios-geometry".

Reviewed-by: Karl Heubaum <karl.heubaum@oracle.com>
Reviewed-by: Arbel Moshe <arbel.moshe@oracle.com>
Signed-off-by: Sam Eiderman <shmuel.eiderman@oracle.com>
---
 bootdevice.c            | 32 ++++++++++++++++++++++++++++++++
 hw/nvram/fw_cfg.c       | 14 +++++++++++---
 include/sysemu/sysemu.h |  1 +
 3 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/bootdevice.c b/bootdevice.c
index 2b12fb85a4..b034ad7bdc 100644
--- a/bootdevice.c
+++ b/bootdevice.c
@@ -405,3 +405,35 @@ void del_boot_device_lchs(DeviceState *dev, const char *suffix)
         }
     }
 }
+
+/* Serialized as: (device name\0 + lchs struct) x devices */
+char *get_boot_devices_lchs_list(size_t *size)
+{
+    FWLCHSEntry *i;
+    size_t total = 0;
+    char *list = NULL;
+
+    QTAILQ_FOREACH(i, &fw_lchs, link) {
+        char *bootpath;
+        char *chs_string;
+        size_t len;
+
+        bootpath = get_boot_device_path(i->dev, false, i->suffix);
+        chs_string = g_strdup_printf("%s %" PRIu32 " %" PRIu32 " %" PRIu32,
+                                     bootpath, i->lcyls, i->lheads, i->lsecs);
+
+        if (total) {
+            list[total - 1] = '\n';
+        }
+        len = strlen(chs_string) + 1;
+        list = g_realloc(list, total + len);
+        memcpy(&list[total], chs_string, len);
+        total += len;
+        g_free(chs_string);
+        g_free(bootpath);
+    }
+
+    *size = total;
+
+    return list;
+}
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
index 7dc3ac378e..18aff658c0 100644
--- a/hw/nvram/fw_cfg.c
+++ b/hw/nvram/fw_cfg.c
@@ -920,13 +920,21 @@ void *fw_cfg_modify_file(FWCfgState *s, const char *filename,
 
 static void fw_cfg_machine_reset(void *opaque)
 {
+    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
+    FWCfgState *s = opaque;
     void *ptr;
     size_t len;
-    FWCfgState *s = opaque;
-    char *bootindex = get_boot_devices_list(&len);
+    char *buf;
 
-    ptr = fw_cfg_modify_file(s, "bootorder", (uint8_t *)bootindex, len);
+    buf = get_boot_devices_list(&len);
+    ptr = fw_cfg_modify_file(s, "bootorder", (uint8_t *)buf, len);
     g_free(ptr);
+
+    if (!mc->legacy_fw_cfg_order) {
+        buf = get_boot_devices_lchs_list(&len);
+        ptr = fw_cfg_modify_file(s, "bios-geometry", (uint8_t *)buf, len);
+        g_free(ptr);
+    }
 }
 
 static void fw_cfg_machine_ready(struct Notifier *n, void *data)
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 1a33f25a5a..150fe8c0e2 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -108,6 +108,7 @@ void validate_bootdevices(const char *devices, Error **errp);
 void add_boot_device_lchs(DeviceState *dev, const char *suffix,
                           uint32_t lcyls, uint32_t lheads, uint32_t lsecs);
 void del_boot_device_lchs(DeviceState *dev, const char *suffix);
+char *get_boot_devices_lchs_list(size_t *size);
 
 /* handler to set the boot_device order for a specific type of MachineClass */
 typedef void QEMUBootSetHandler(void *opaque, const char *boot_order,
-- 
2.23.0.187.g17f5b7556c-goog



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [Qemu-devel] [PATCH v6 8/8] hd-geo-test: Add tests for lchs override
  2019-08-27  8:24 [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface Sam Eiderman via Qemu-devel
                   ` (6 preceding siblings ...)
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 7/8] bootdevice: FW_CFG interface for LCHS values Sam Eiderman via Qemu-devel
@ 2019-08-27  8:24 ` Sam Eiderman via Qemu-devel
  2019-08-27  9:37 ` [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface no-reply
                   ` (4 subsequent siblings)
  12 siblings, 0 replies; 20+ messages in thread
From: Sam Eiderman via Qemu-devel @ 2019-08-27  8:24 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, qemu-block, Arbel Moshe, seabios, kevin, liran.alon,
	kraxel, Sam Eiderman, sameid, karl.heubaum

From: Sam Eiderman <shmuel.eiderman@oracle.com>

Add QTest tests to check the logical geometry override option.

The tests in hd-geo-test are out of date - they only test IDE and do not
test interesting MBRs.

I added a few helper functions which will make adding more tests easier.

QTest's fw_cfg helper functions support only legacy fw_cfg, so I had to
read the new fw_cfg layout on my own.

Creating qcow2 disks with specific size and MBR layout is currently
unused - we only use a default empty MBR.

Reviewed-by: Karl Heubaum <karl.heubaum@oracle.com>
Reviewed-by: Arbel Moshe <arbel.moshe@oracle.com>
Signed-off-by: Sam Eiderman <shmuel.eiderman@oracle.com>
---
 tests/Makefile.include |   2 +-
 tests/hd-geo-test.c    | 582 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 583 insertions(+), 1 deletion(-)

diff --git a/tests/Makefile.include b/tests/Makefile.include
index 39bed753b3..bd385e2150 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -781,7 +781,7 @@ tests/ide-test$(EXESUF): tests/ide-test.o $(libqos-pc-obj-y)
 tests/ahci-test$(EXESUF): tests/ahci-test.o $(libqos-pc-obj-y) qemu-img$(EXESUF)
 tests/ipmi-kcs-test$(EXESUF): tests/ipmi-kcs-test.o
 tests/ipmi-bt-test$(EXESUF): tests/ipmi-bt-test.o
-tests/hd-geo-test$(EXESUF): tests/hd-geo-test.o
+tests/hd-geo-test$(EXESUF): tests/hd-geo-test.o $(libqos-obj-y)
 tests/boot-order-test$(EXESUF): tests/boot-order-test.o $(libqos-obj-y)
 tests/boot-serial-test$(EXESUF): tests/boot-serial-test.o $(libqos-obj-y)
 tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o \
diff --git a/tests/hd-geo-test.c b/tests/hd-geo-test.c
index 62eb624726..002f5c4a43 100644
--- a/tests/hd-geo-test.c
+++ b/tests/hd-geo-test.c
@@ -17,7 +17,12 @@
 
 #include "qemu/osdep.h"
 #include "qemu-common.h"
+#include "qemu/bswap.h"
+#include "qapi/qmp/qlist.h"
 #include "libqtest.h"
+#include "libqos/fw_cfg.h"
+#include "libqos/libqos.h"
+#include "standard-headers/linux/qemu_fw_cfg.h"
 
 #define ARGV_SIZE 256
 
@@ -388,6 +393,568 @@ static void test_ide_drive_cd_0(void)
     qtest_quit(qts);
 }
 
+typedef struct {
+    bool active;
+    uint32_t head;
+    uint32_t sector;
+    uint32_t cyl;
+    uint32_t end_head;
+    uint32_t end_sector;
+    uint32_t end_cyl;
+    uint32_t start_sect;
+    uint32_t nr_sects;
+} MBRpartitions[4];
+
+static MBRpartitions empty_mbr = { {false, 0, 0, 0, 0, 0, 0, 0, 0},
+                                   {false, 0, 0, 0, 0, 0, 0, 0, 0},
+                                   {false, 0, 0, 0, 0, 0, 0, 0, 0},
+                                   {false, 0, 0, 0, 0, 0, 0, 0, 0} };
+
+static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
+{
+    const char *template = "/tmp/qtest.XXXXXX";
+    char *raw_path = strdup(template);
+    char *qcow2_path = strdup(template);
+    char cmd[100 + 2 * PATH_MAX];
+    uint8_t buf[512];
+    int i, ret, fd, offset;
+    uint64_t qcow2_size = sectors * 512;
+    uint8_t status, parttype, head, sector, cyl;
+    char *qemu_img_path;
+    char *qemu_img_abs_path;
+
+    offset = 0xbe;
+
+    for (i = 0; i < 4; i++) {
+        status = mbr[i].active ? 0x80 : 0x00;
+        g_assert(mbr[i].head < 256);
+        g_assert(mbr[i].sector < 64);
+        g_assert(mbr[i].cyl < 1024);
+        head = mbr[i].head;
+        sector = mbr[i].sector + ((mbr[i].cyl & 0x300) >> 2);
+        cyl = mbr[i].cyl & 0xff;
+
+        buf[offset + 0x0] = status;
+        buf[offset + 0x1] = head;
+        buf[offset + 0x2] = sector;
+        buf[offset + 0x3] = cyl;
+
+        parttype = 0;
+        g_assert(mbr[i].end_head < 256);
+        g_assert(mbr[i].end_sector < 64);
+        g_assert(mbr[i].end_cyl < 1024);
+        head = mbr[i].end_head;
+        sector = mbr[i].end_sector + ((mbr[i].end_cyl & 0x300) >> 2);
+        cyl = mbr[i].end_cyl & 0xff;
+
+        buf[offset + 0x4] = parttype;
+        buf[offset + 0x5] = head;
+        buf[offset + 0x6] = sector;
+        buf[offset + 0x7] = cyl;
+
+        (*(uint32_t *)&buf[offset + 0x8]) = cpu_to_le32(mbr[i].start_sect);
+        (*(uint32_t *)&buf[offset + 0xc]) = cpu_to_le32(mbr[i].nr_sects);
+
+        offset += 0x10;
+    }
+
+    fd = mkstemp(raw_path);
+    g_assert(fd);
+    close(fd);
+
+    fd = open(raw_path, O_WRONLY);
+    g_assert(fd >= 0);
+    ret = write(fd, buf, sizeof(buf));
+    g_assert(ret == sizeof(buf));
+    close(fd);
+
+    fd = mkstemp(qcow2_path);
+    g_assert(fd);
+    close(fd);
+
+    qemu_img_path = getenv("QTEST_QEMU_IMG");
+    g_assert(qemu_img_path);
+    qemu_img_abs_path = realpath(qemu_img_path, NULL);
+    g_assert(qemu_img_abs_path);
+
+    ret = snprintf(cmd, sizeof(cmd),
+                   "%s convert -f raw -O qcow2 %s %s > /dev/null",
+                   qemu_img_abs_path,
+                   raw_path, qcow2_path);
+    g_assert((0 < ret) && (ret <= sizeof(cmd)));
+    ret = system(cmd);
+    g_assert(ret == 0);
+
+    ret = snprintf(cmd, sizeof(cmd),
+                   "%s resize %s %" PRIu64 " > /dev/null",
+                   qemu_img_abs_path,
+                   qcow2_path, qcow2_size);
+    g_assert((0 < ret) && (ret <= sizeof(cmd)));
+    ret = system(cmd);
+    g_assert(ret == 0);
+
+    free(qemu_img_abs_path);
+
+    unlink(raw_path);
+    free(raw_path);
+
+    return qcow2_path;
+}
+
+struct QemuCfgFile {
+    uint32_t  size;        /* file size */
+    uint16_t  select;      /* write this to 0x510 to read it */
+    uint16_t  reserved;
+    char name[56];
+};
+
+static uint16_t find_fw_cfg_file(QFWCFG *fw_cfg,
+                                 const char *filename)
+{
+    struct QemuCfgFile qfile;
+    uint32_t count, e;
+    uint16_t select;
+
+    count = qfw_cfg_get_u32(fw_cfg, FW_CFG_FILE_DIR);
+    count = be32_to_cpu(count);
+    for (select = 0, e = 0; e < count; e++) {
+        qfw_cfg_read_data(fw_cfg, &qfile, sizeof(qfile));
+        if (!strcmp(filename, qfile.name)) {
+            select = be16_to_cpu(qfile.select);
+        }
+    }
+
+    return select;
+}
+
+static void read_fw_cfg_file(QFWCFG *fw_cfg,
+                             const char *filename,
+                             void *data,
+                             size_t len)
+{
+    uint16_t select = find_fw_cfg_file(fw_cfg, filename);
+
+    g_assert(select);
+
+    qfw_cfg_get(fw_cfg, select, data, len);
+}
+
+#define BIOS_GEOMETRY_MAX_SIZE 10000
+
+typedef struct {
+    uint32_t c;
+    uint32_t h;
+    uint32_t s;
+} CHS;
+
+typedef struct {
+    const char *dev_path;
+    CHS chs;
+} CHSResult;
+
+static void read_bootdevices(QFWCFG *fw_cfg, CHSResult expected[])
+{
+    char *buf = g_malloc0(BIOS_GEOMETRY_MAX_SIZE);
+    char *cur;
+    GList *results = NULL, *cur_result;
+    CHSResult *r;
+    int i;
+    int res;
+    bool found;
+
+    read_fw_cfg_file(fw_cfg, "bios-geometry", buf, BIOS_GEOMETRY_MAX_SIZE);
+
+    for (cur = buf; *cur; cur++) {
+        if (*cur == '\n') {
+            *cur = '\0';
+        }
+    }
+    cur = buf;
+
+    while (strlen(cur)) {
+
+        r = g_malloc0(sizeof(*r));
+        r->dev_path = g_malloc0(strlen(cur) + 1);
+        res = sscanf(cur, "%s %" PRIu32 " %" PRIu32 " %" PRIu32,
+                     (char *)r->dev_path,
+                     &(r->chs.c), &(r->chs.h), &(r->chs.s));
+
+        g_assert(res == 4);
+
+        results = g_list_prepend(results, r);
+
+        cur += strlen(cur) + 1;
+    }
+
+    i = 0;
+
+    while (expected[i].dev_path) {
+        found = false;
+        cur_result = results;
+        while (cur_result) {
+            r = cur_result->data;
+            if (!strcmp(r->dev_path, expected[i].dev_path) &&
+                !memcmp(&(r->chs), &(expected[i].chs), sizeof(r->chs))) {
+                found = true;
+                break;
+            }
+            cur_result = g_list_next(cur_result);
+        }
+        g_assert(found);
+        g_free((char *)((CHSResult *)cur_result->data)->dev_path);
+        g_free(cur_result->data);
+        results = g_list_delete_link(results, cur_result);
+        i++;
+    }
+
+    g_assert(results == NULL);
+
+    g_free(buf);
+}
+
+#define MAX_DRIVES 30
+
+typedef struct {
+    char **argv;
+    int argc;
+    char **drives;
+    int n_drives;
+    int n_scsi_disks;
+    int n_scsi_controllers;
+    int n_virtio_disks;
+} TestArgs;
+
+static TestArgs *create_args(void)
+{
+    TestArgs *args = g_malloc0(sizeof(*args));
+    args->argv = g_new0(char *, ARGV_SIZE);
+    args->argc = append_arg(args->argc, args->argv,
+                            ARGV_SIZE, g_strdup("-nodefaults"));
+    args->drives = g_new0(char *, MAX_DRIVES);
+    return args;
+}
+
+static void add_drive_with_mbr(TestArgs *args,
+                               MBRpartitions mbr, uint64_t sectors)
+{
+    char *img_file_name;
+    char part[300];
+    int ret;
+
+    g_assert(args->n_drives < MAX_DRIVES);
+
+    img_file_name = create_qcow2_with_mbr(mbr, sectors);
+
+    args->drives[args->n_drives] = img_file_name;
+    ret = snprintf(part, sizeof(part),
+                   "-drive file=%s,if=none,format=qcow2,id=disk%d",
+                   img_file_name, args->n_drives);
+    g_assert((0 < ret) && (ret <= sizeof(part)));
+    args->argc = append_arg(args->argc, args->argv, ARGV_SIZE, g_strdup(part));
+    args->n_drives++;
+}
+
+static void add_ide_disk(TestArgs *args,
+                         int drive_idx, int bus, int unit, int c, int h, int s)
+{
+    char part[300];
+    int ret;
+
+    ret = snprintf(part, sizeof(part),
+                   "-device ide-hd,drive=disk%d,bus=ide.%d,unit=%d,"
+                   "lcyls=%d,lheads=%d,lsecs=%d",
+                   drive_idx, bus, unit, c, h, s);
+    g_assert((0 < ret) && (ret <= sizeof(part)));
+    args->argc = append_arg(args->argc, args->argv, ARGV_SIZE, g_strdup(part));
+}
+
+static void add_scsi_controller(TestArgs *args,
+                                const char *type,
+                                const char *bus,
+                                int addr)
+{
+    char part[300];
+    int ret;
+
+    ret = snprintf(part, sizeof(part),
+                   "-device %s,id=scsi%d,bus=%s,addr=%d",
+                   type, args->n_scsi_controllers, bus, addr);
+    g_assert((0 < ret) && (ret <= sizeof(part)));
+    args->argc = append_arg(args->argc, args->argv, ARGV_SIZE, g_strdup(part));
+    args->n_scsi_controllers++;
+}
+
+static void add_scsi_disk(TestArgs *args,
+                          int drive_idx, int bus,
+                          int channel, int scsi_id, int lun,
+                          int c, int h, int s)
+{
+    char part[300];
+    int ret;
+
+    ret = snprintf(part, sizeof(part),
+                   "-device scsi-hd,id=scsi-disk%d,drive=disk%d,"
+                   "bus=scsi%d.0,"
+                   "channel=%d,scsi-id=%d,lun=%d,"
+                   "lcyls=%d,lheads=%d,lsecs=%d",
+                   args->n_scsi_disks, drive_idx, bus, channel, scsi_id, lun,
+                   c, h, s);
+    g_assert((0 < ret) && (ret <= sizeof(part)));
+    args->argc = append_arg(args->argc, args->argv, ARGV_SIZE, g_strdup(part));
+    args->n_scsi_disks++;
+}
+
+static void add_virtio_disk(TestArgs *args,
+                            int drive_idx, const char *bus, int addr,
+                            int c, int h, int s)
+{
+    char part[300];
+    int ret;
+
+    ret = snprintf(part, sizeof(part),
+                   "-device virtio-blk-pci,id=virtio-disk%d,"
+                   "drive=disk%d,bus=%s,addr=%d,"
+                   "lcyls=%d,lheads=%d,lsecs=%d",
+                   args->n_virtio_disks, drive_idx, bus, addr, c, h, s);
+    g_assert((0 < ret) && (ret <= sizeof(part)));
+    args->argc = append_arg(args->argc, args->argv, ARGV_SIZE, g_strdup(part));
+    args->n_virtio_disks++;
+}
+
+static void test_override(TestArgs *args, CHSResult expected[])
+{
+    char *joined_args;
+    QFWCFG *fw_cfg;
+    int i;
+
+    joined_args = g_strjoinv(" ", args->argv);
+
+    qtest_start(joined_args);
+    fw_cfg = pc_fw_cfg_init(global_qtest);
+
+    read_bootdevices(fw_cfg, expected);
+
+    g_free(joined_args);
+    qtest_end();
+
+    g_free(fw_cfg);
+
+    for (i = 0; i < args->n_drives; i++) {
+        unlink(args->drives[i]);
+        free(args->drives[i]);
+    }
+    g_free(args->drives);
+    g_strfreev(args->argv);
+    g_free(args);
+}
+
+static void test_override_ide(void)
+{
+    TestArgs *args = create_args();
+    CHSResult expected[] = {
+        {"/pci@i0cf8/ide@1,1/drive@0/disk@0", {10000, 120, 30} },
+        {"/pci@i0cf8/ide@1,1/drive@0/disk@1", {9000, 120, 30} },
+        {"/pci@i0cf8/ide@1,1/drive@1/disk@0", {0, 1, 1} },
+        {"/pci@i0cf8/ide@1,1/drive@1/disk@1", {1, 0, 0} },
+        {NULL, {0, 0, 0} }
+    };
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_ide_disk(args, 0, 0, 0, 10000, 120, 30);
+    add_ide_disk(args, 1, 0, 1, 9000, 120, 30);
+    add_ide_disk(args, 2, 1, 0, 0, 1, 1);
+    add_ide_disk(args, 3, 1, 1, 1, 0, 0);
+    test_override(args, expected);
+}
+
+static void test_override_scsi(void)
+{
+    TestArgs *args = create_args();
+    CHSResult expected[] = {
+        {"/pci@i0cf8/scsi@3/channel@0/disk@0,0", {10000, 120, 30} },
+        {"/pci@i0cf8/scsi@3/channel@0/disk@1,0", {9000, 120, 30} },
+        {"/pci@i0cf8/scsi@3/channel@0/disk@2,0", {1, 0, 0} },
+        {"/pci@i0cf8/scsi@3/channel@0/disk@3,0", {0, 1, 0} },
+        {NULL, {0, 0, 0} }
+    };
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_scsi_controller(args, "lsi53c895a", "pci.0", 3);
+    add_scsi_disk(args, 0, 0, 0, 0, 0, 10000, 120, 30);
+    add_scsi_disk(args, 1, 0, 0, 1, 0, 9000, 120, 30);
+    add_scsi_disk(args, 2, 0, 0, 2, 0, 1, 0, 0);
+    add_scsi_disk(args, 3, 0, 0, 3, 0, 0, 1, 0);
+    test_override(args, expected);
+}
+
+static void test_override_scsi_2_controllers(void)
+{
+    TestArgs *args = create_args();
+    CHSResult expected[] = {
+        {"/pci@i0cf8/scsi@3/channel@0/disk@0,0", {10000, 120, 30} },
+        {"/pci@i0cf8/scsi@3/channel@0/disk@1,0", {9000, 120, 30} },
+        {"/pci@i0cf8/scsi@4/channel@0/disk@0,1", {1, 0, 0} },
+        {"/pci@i0cf8/scsi@4/channel@0/disk@1,2", {0, 1, 0} },
+        {NULL, {0, 0, 0} }
+    };
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_scsi_controller(args, "lsi53c895a", "pci.0", 3);
+    add_scsi_controller(args, "virtio-scsi-pci", "pci.0", 4);
+    add_scsi_disk(args, 0, 0, 0, 0, 0, 10000, 120, 30);
+    add_scsi_disk(args, 1, 0, 0, 1, 0, 9000, 120, 30);
+    add_scsi_disk(args, 2, 1, 0, 0, 1, 1, 0, 0);
+    add_scsi_disk(args, 3, 1, 0, 1, 2, 0, 1, 0);
+    test_override(args, expected);
+}
+
+static void test_override_virtio_blk(void)
+{
+    TestArgs *args = create_args();
+    CHSResult expected[] = {
+        {"/pci@i0cf8/scsi@3/disk@0,0", {10000, 120, 30} },
+        {"/pci@i0cf8/scsi@4/disk@0,0", {9000, 120, 30} },
+        {NULL, {0, 0, 0} }
+    };
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_virtio_disk(args, 0, "pci.0", 3, 10000, 120, 30);
+    add_virtio_disk(args, 1, "pci.0", 4, 9000, 120, 30);
+    test_override(args, expected);
+}
+
+static void test_override_zero_chs(void)
+{
+    TestArgs *args = create_args();
+    CHSResult expected[] = {
+        {NULL, {0, 0, 0} }
+    };
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_ide_disk(args, 0, 1, 1, 0, 0, 0);
+    test_override(args, expected);
+}
+
+static void test_override_scsi_hot_unplug(void)
+{
+    char *joined_args;
+    QFWCFG *fw_cfg;
+    QDict *response;
+    int i;
+    TestArgs *args = create_args();
+    CHSResult expected[] = {
+        {"/pci@i0cf8/scsi@2/channel@0/disk@0,0", {10000, 120, 30} },
+        {"/pci@i0cf8/scsi@2/channel@0/disk@1,0", {20, 20, 20} },
+        {NULL, {0, 0, 0} }
+    };
+    CHSResult expected2[] = {
+        {"/pci@i0cf8/scsi@2/channel@0/disk@1,0", {20, 20, 20} },
+        {NULL, {0, 0, 0} }
+    };
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_scsi_controller(args, "virtio-scsi-pci", "pci.0", 2);
+    add_scsi_disk(args, 0, 0, 0, 0, 0, 10000, 120, 30);
+    add_scsi_disk(args, 1, 0, 0, 1, 0, 20, 20, 20);
+
+    joined_args = g_strjoinv(" ", args->argv);
+
+    qtest_start(joined_args);
+    fw_cfg = pc_fw_cfg_init(global_qtest);
+
+    read_bootdevices(fw_cfg, expected);
+
+    /* unplug device an restart */
+    response = qmp("{ 'execute': 'device_del',"
+                   "  'arguments': {'id': 'scsi-disk0' }}");
+    g_assert(response);
+    g_assert(!qdict_haskey(response, "error"));
+    qobject_unref(response);
+    response = qmp("{ 'execute': 'system_reset', 'arguments': { }}");
+    g_assert(response);
+    g_assert(!qdict_haskey(response, "error"));
+    qobject_unref(response);
+
+    qtest_qmp_eventwait(global_qtest, "RESET");
+
+    read_bootdevices(fw_cfg, expected2);
+
+    g_free(joined_args);
+    qtest_end();
+
+    g_free(fw_cfg);
+
+    for (i = 0; i < args->n_drives; i++) {
+        unlink(args->drives[i]);
+        free(args->drives[i]);
+    }
+    g_free(args->drives);
+    g_strfreev(args->argv);
+    g_free(args);
+}
+
+static void test_override_virtio_hot_unplug(void)
+{
+    char *joined_args;
+    QFWCFG *fw_cfg;
+    QDict *response;
+    int i;
+    TestArgs *args = create_args();
+    CHSResult expected[] = {
+        {"/pci@i0cf8/scsi@2/disk@0,0", {10000, 120, 30} },
+        {"/pci@i0cf8/scsi@3/disk@0,0", {20, 20, 20} },
+        {NULL, {0, 0, 0} }
+    };
+    CHSResult expected2[] = {
+        {"/pci@i0cf8/scsi@3/disk@0,0", {20, 20, 20} },
+        {NULL, {0, 0, 0} }
+    };
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_drive_with_mbr(args, empty_mbr, 1);
+    add_virtio_disk(args, 0, "pci.0", 2, 10000, 120, 30);
+    add_virtio_disk(args, 1, "pci.0", 3, 20, 20, 20);
+
+    joined_args = g_strjoinv(" ", args->argv);
+
+    qtest_start(joined_args);
+    fw_cfg = pc_fw_cfg_init(global_qtest);
+
+    read_bootdevices(fw_cfg, expected);
+
+    /* unplug device an restart */
+    response = qmp("{ 'execute': 'device_del',"
+                   "  'arguments': {'id': 'virtio-disk0' }}");
+    g_assert(response);
+    g_assert(!qdict_haskey(response, "error"));
+    qobject_unref(response);
+    response = qmp("{ 'execute': 'system_reset', 'arguments': { }}");
+    g_assert(response);
+    g_assert(!qdict_haskey(response, "error"));
+    qobject_unref(response);
+
+    qtest_qmp_eventwait(global_qtest, "RESET");
+
+    read_bootdevices(fw_cfg, expected2);
+
+    g_free(joined_args);
+    qtest_end();
+
+    g_free(fw_cfg);
+
+    for (i = 0; i < args->n_drives; i++) {
+        unlink(args->drives[i]);
+        free(args->drives[i]);
+    }
+    g_free(args->drives);
+    g_strfreev(args->argv);
+    g_free(args);
+}
+
 int main(int argc, char **argv)
 {
     Backend i;
@@ -413,6 +980,21 @@ int main(int argc, char **argv)
     qtest_add_func("hd-geo/ide/device/mbr/chs", test_ide_device_mbr_chs);
     qtest_add_func("hd-geo/ide/device/user/chs", test_ide_device_user_chs);
     qtest_add_func("hd-geo/ide/device/user/chst", test_ide_device_user_chst);
+    if (have_qemu_img()) {
+        qtest_add_func("hd-geo/override/ide", test_override_ide);
+        qtest_add_func("hd-geo/override/scsi", test_override_scsi);
+        qtest_add_func("hd-geo/override/scsi_2_controllers",
+                       test_override_scsi_2_controllers);
+        qtest_add_func("hd-geo/override/virtio_blk", test_override_virtio_blk);
+        qtest_add_func("hd-geo/override/zero_chs", test_override_zero_chs);
+        qtest_add_func("hd-geo/override/scsi_hot_unplug",
+                       test_override_scsi_hot_unplug);
+        qtest_add_func("hd-geo/override/virtio_hot_unplug",
+                       test_override_virtio_hot_unplug);
+    } else {
+        g_test_message("QTEST_QEMU_IMG not set or qemu-img missing; "
+                       "skipping hd-geo/override/* tests");
+    }
 
     ret = g_test_run();
 
-- 
2.23.0.187.g17f5b7556c-goog



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface
  2019-08-27  8:24 [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface Sam Eiderman via Qemu-devel
                   ` (7 preceding siblings ...)
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 8/8] hd-geo-test: Add tests for lchs override Sam Eiderman via Qemu-devel
@ 2019-08-27  9:37 ` no-reply
  2019-08-27 10:02 ` no-reply
                   ` (3 subsequent siblings)
  12 siblings, 0 replies; 20+ messages in thread
From: no-reply @ 2019-08-27  9:37 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, qemu-block, seabios, qemu-devel, kevin, liran.alon,
	kraxel, sameid, karl.heubaum

Patchew URL: https://patchew.org/QEMU/20190827082427.64280-1-sameid@google.com/



Hi,

This series seems to have some coding style problems. See output below for
more information:

Message-id: 20190827082427.64280-1-sameid@google.com
Type: series
Subject: [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface

=== TEST SCRIPT BEGIN ===
#!/bin/bash
git rev-parse base > /dev/null || exit 0
git config --local diff.renamelimit 0
git config --local diff.renames True
git config --local diff.algorithm histogram
./scripts/checkpatch.pl --mailback base..
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
Switched to a new branch 'test'
4c35c4b hd-geo-test: Add tests for lchs override
94fe50a bootdevice: FW_CFG interface for LCHS values
feb142b bootdevice: Refactor get_boot_devices_list
d0d1b0a bootdevice: Gather LCHS from all relevant devices
47aaba7 scsi: Propagate unrealize() callback to scsi-hd
c15a6ef bootdevice: Add interface to gather LCHS
5ee6a57 block: Support providing LCHS from user
7058d32 block: Refactor macros - fix tabbing

=== OUTPUT BEGIN ===
1/8 Checking commit 7058d3229d71 (block: Refactor macros - fix tabbing)
ERROR: Macros with complex values should be enclosed in parenthesis
#55: FILE: include/hw/block/block.h:65:
+#define DEFINE_BLOCK_CHS_PROPERTIES(_state, _conf)                      \
+    DEFINE_PROP_UINT32("cyls", _state, _conf.cyls, 0),                  \
+    DEFINE_PROP_UINT32("heads", _state, _conf.heads, 0),                \
     DEFINE_PROP_UINT32("secs", _state, _conf.secs, 0)

total: 1 errors, 0 warnings, 37 lines checked

Patch 1/8 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

2/8 Checking commit 5ee6a57a8e93 (block: Support providing LCHS from user)
3/8 Checking commit c15a6ef42266 (bootdevice: Add interface to gather LCHS)
4/8 Checking commit 47aaba7c960c (scsi: Propagate unrealize() callback to scsi-hd)
5/8 Checking commit d0d1b0a500c3 (bootdevice: Gather LCHS from all relevant devices)
6/8 Checking commit feb142b1966b (bootdevice: Refactor get_boot_devices_list)
7/8 Checking commit 94fe50a2c30f (bootdevice: FW_CFG interface for LCHS values)
8/8 Checking commit 4c35c4b69cae (hd-geo-test: Add tests for lchs override)
WARNING: Block comments use a leading /* on a separate line
#641: FILE: tests/hd-geo-test.c:996:
+                       "skipping hd-geo/override/* tests");

total: 0 errors, 1 warnings, 609 lines checked

Patch 8/8 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
=== OUTPUT END ===

Test command exited with code: 1


The full log is available at
http://patchew.org/logs/20190827082427.64280-1-sameid@google.com/testing.checkpatch/?type=message.
---
Email generated automatically by Patchew [https://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface
  2019-08-27  8:24 [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface Sam Eiderman via Qemu-devel
                   ` (8 preceding siblings ...)
  2019-08-27  9:37 ` [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface no-reply
@ 2019-08-27 10:02 ` no-reply
  2019-09-11 14:36 ` Sam Eiderman via Qemu-devel
                   ` (2 subsequent siblings)
  12 siblings, 0 replies; 20+ messages in thread
From: no-reply @ 2019-08-27 10:02 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, qemu-block, seabios, qemu-devel, kevin, liran.alon,
	kraxel, sameid, karl.heubaum

Patchew URL: https://patchew.org/QEMU/20190827082427.64280-1-sameid@google.com/



Hi,

This series seems to have some coding style problems. See output below for
more information:

Message-id: 20190827082427.64280-1-sameid@google.com
Type: series
Subject: [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface

=== TEST SCRIPT BEGIN ===
#!/bin/bash
git rev-parse base > /dev/null || exit 0
git config --local diff.renamelimit 0
git config --local diff.renames True
git config --local diff.algorithm histogram
./scripts/checkpatch.pl --mailback base..
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
Switched to a new branch 'test'
ae278de hd-geo-test: Add tests for lchs override
715cfa8 bootdevice: FW_CFG interface for LCHS values
54cd6e4 bootdevice: Refactor get_boot_devices_list
381ba9d bootdevice: Gather LCHS from all relevant devices
f16e5f7 scsi: Propagate unrealize() callback to scsi-hd
12bf34c bootdevice: Add interface to gather LCHS
fa36200 block: Support providing LCHS from user
3acc0a3 block: Refactor macros - fix tabbing

=== OUTPUT BEGIN ===
1/8 Checking commit 3acc0a31ae55 (block: Refactor macros - fix tabbing)
ERROR: Macros with complex values should be enclosed in parenthesis
#55: FILE: include/hw/block/block.h:65:
+#define DEFINE_BLOCK_CHS_PROPERTIES(_state, _conf)                      \
+    DEFINE_PROP_UINT32("cyls", _state, _conf.cyls, 0),                  \
+    DEFINE_PROP_UINT32("heads", _state, _conf.heads, 0),                \
     DEFINE_PROP_UINT32("secs", _state, _conf.secs, 0)

total: 1 errors, 0 warnings, 37 lines checked

Patch 1/8 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

2/8 Checking commit fa36200c8ceb (block: Support providing LCHS from user)
3/8 Checking commit 12bf34c38eb5 (bootdevice: Add interface to gather LCHS)
4/8 Checking commit f16e5f7d73f7 (scsi: Propagate unrealize() callback to scsi-hd)
5/8 Checking commit 381ba9d8d879 (bootdevice: Gather LCHS from all relevant devices)
6/8 Checking commit 54cd6e409022 (bootdevice: Refactor get_boot_devices_list)
7/8 Checking commit 715cfa8c4ab1 (bootdevice: FW_CFG interface for LCHS values)
8/8 Checking commit ae278de99d62 (hd-geo-test: Add tests for lchs override)
WARNING: Block comments use a leading /* on a separate line
#641: FILE: tests/hd-geo-test.c:996:
+                       "skipping hd-geo/override/* tests");

total: 0 errors, 1 warnings, 609 lines checked

Patch 8/8 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
=== OUTPUT END ===

Test command exited with code: 1


The full log is available at
http://patchew.org/logs/20190827082427.64280-1-sameid@google.com/testing.checkpatch/?type=message.
---
Email generated automatically by Patchew [https://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface
  2019-08-27  8:24 [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface Sam Eiderman via Qemu-devel
                   ` (9 preceding siblings ...)
  2019-08-27 10:02 ` no-reply
@ 2019-09-11 14:36 ` Sam Eiderman via Qemu-devel
  2019-09-23  8:23   ` Sam Eiderman via
  2019-09-23  9:50 ` [Qemu-devel] " Max Reitz
  2019-09-24 18:49 ` [Qemu-block] " John Snow
  12 siblings, 1 reply; 20+ messages in thread
From: Sam Eiderman via Qemu-devel @ 2019-09-11 14:36 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, qemu-block, seabios, Kevin OConnor, liran.alon, kraxel,
	Karl Heubaum

Gentle ping

On Tue, Aug 27, 2019, 11:24 Sam Eiderman <sameid@google.com> wrote:

> v1:
>
> Non-standard logical geometries break under QEMU.
>
> A virtual disk which contains an operating system which depends on
> logical geometries (consistent values being reported from BIOS INT13
> AH=08) will most likely break under QEMU/SeaBIOS if it has non-standard
> logical geometries - for example 56 SPT (sectors per track).
> No matter what QEMU will guess - SeaBIOS, for large enough disks - will
> use LBA translation, which will report 63 SPT instead.
>
> In addition we can not enforce SeaBIOS to rely on phyiscal geometries at
> all. A virtio-blk-pci virtual disk with 255 phyiscal heads can not
> report more than 16 physical heads when moved to an IDE controller, the
> ATA spec allows a maximum of 16 heads - this is an artifact of
> virtualization.
>
> By supplying the logical geometies directly we are able to support such
> "exotic" disks.
>
> We will use fw_cfg to do just that.
>
> v2:
>
> Fix missing parenthesis check in
>     "hd-geo-test: Add tests for lchs override"
>
> v3:
>
> * Rename fw_cfg key to "bios-geometry".
> * Remove "extendible" interface.
> * Add cpu_to_le32 fix as Laszlo suggested or big endian hosts
> * Fix last qtest commit - automatic docker tester for some reason does not
> have qemu-img set
>
> v4:
>
> * Change fw_cfg interface from mixed textual/binary to textual only
>
> v5:
>
> * Fix line > 80 chars in tests/hd-geo-test.c
>
> v6:
>
> * Small fixes for issues pointed by Max
> * (&conf->conf)->lcyls to conf->conf.lcyls and so on
> * Remove scsi_unrealize from everything other than scsi-hd
> * Add proper include to sysemu.h
> * scsi_device_unrealize() after scsi_device_purge_requests()
>
> Sam Eiderman (8):
>   block: Refactor macros - fix tabbing
>   block: Support providing LCHS from user
>   bootdevice: Add interface to gather LCHS
>   scsi: Propagate unrealize() callback to scsi-hd
>   bootdevice: Gather LCHS from all relevant devices
>   bootdevice: Refactor get_boot_devices_list
>   bootdevice: FW_CFG interface for LCHS values
>   hd-geo-test: Add tests for lchs override
>
>  bootdevice.c             | 148 ++++++++--
>  hw/block/virtio-blk.c    |   6 +
>  hw/ide/qdev.c            |   7 +-
>  hw/nvram/fw_cfg.c        |  14 +-
>  hw/scsi/scsi-bus.c       |  16 ++
>  hw/scsi/scsi-disk.c      |  12 +
>  include/hw/block/block.h |  22 +-
>  include/hw/scsi/scsi.h   |   1 +
>  include/sysemu/sysemu.h  |   4 +
>  tests/Makefile.include   |   2 +-
>  tests/hd-geo-test.c      | 582 +++++++++++++++++++++++++++++++++++++++
>  11 files changed, 773 insertions(+), 41 deletions(-)
>
> --
> 2.23.0.187.g17f5b7556c-goog
>
>

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface
  2019-09-11 14:36 ` Sam Eiderman via Qemu-devel
@ 2019-09-23  8:23   ` Sam Eiderman via
  0 siblings, 0 replies; 20+ messages in thread
From: Sam Eiderman via @ 2019-09-23  8:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: kwolf, qemu-block, seabios, Kevin OConnor, liran.alon, kraxel,
	Karl Heubaum

Gentle ping

On Wed, Sep 11, 2019 at 5:36 PM Sam Eiderman <sameid@google.com> wrote:
>
> Gentle ping
>
> On Tue, Aug 27, 2019, 11:24 Sam Eiderman <sameid@google.com> wrote:
>>
>> v1:
>>
>> Non-standard logical geometries break under QEMU.
>>
>> A virtual disk which contains an operating system which depends on
>> logical geometries (consistent values being reported from BIOS INT13
>> AH=08) will most likely break under QEMU/SeaBIOS if it has non-standard
>> logical geometries - for example 56 SPT (sectors per track).
>> No matter what QEMU will guess - SeaBIOS, for large enough disks - will
>> use LBA translation, which will report 63 SPT instead.
>>
>> In addition we can not enforce SeaBIOS to rely on phyiscal geometries at
>> all. A virtio-blk-pci virtual disk with 255 phyiscal heads can not
>> report more than 16 physical heads when moved to an IDE controller, the
>> ATA spec allows a maximum of 16 heads - this is an artifact of
>> virtualization.
>>
>> By supplying the logical geometies directly we are able to support such
>> "exotic" disks.
>>
>> We will use fw_cfg to do just that.
>>
>> v2:
>>
>> Fix missing parenthesis check in
>>     "hd-geo-test: Add tests for lchs override"
>>
>> v3:
>>
>> * Rename fw_cfg key to "bios-geometry".
>> * Remove "extendible" interface.
>> * Add cpu_to_le32 fix as Laszlo suggested or big endian hosts
>> * Fix last qtest commit - automatic docker tester for some reason does not have qemu-img set
>>
>> v4:
>>
>> * Change fw_cfg interface from mixed textual/binary to textual only
>>
>> v5:
>>
>> * Fix line > 80 chars in tests/hd-geo-test.c
>>
>> v6:
>>
>> * Small fixes for issues pointed by Max
>> * (&conf->conf)->lcyls to conf->conf.lcyls and so on
>> * Remove scsi_unrealize from everything other than scsi-hd
>> * Add proper include to sysemu.h
>> * scsi_device_unrealize() after scsi_device_purge_requests()
>>
>> Sam Eiderman (8):
>>   block: Refactor macros - fix tabbing
>>   block: Support providing LCHS from user
>>   bootdevice: Add interface to gather LCHS
>>   scsi: Propagate unrealize() callback to scsi-hd
>>   bootdevice: Gather LCHS from all relevant devices
>>   bootdevice: Refactor get_boot_devices_list
>>   bootdevice: FW_CFG interface for LCHS values
>>   hd-geo-test: Add tests for lchs override
>>
>>  bootdevice.c             | 148 ++++++++--
>>  hw/block/virtio-blk.c    |   6 +
>>  hw/ide/qdev.c            |   7 +-
>>  hw/nvram/fw_cfg.c        |  14 +-
>>  hw/scsi/scsi-bus.c       |  16 ++
>>  hw/scsi/scsi-disk.c      |  12 +
>>  include/hw/block/block.h |  22 +-
>>  include/hw/scsi/scsi.h   |   1 +
>>  include/sysemu/sysemu.h  |   4 +
>>  tests/Makefile.include   |   2 +-
>>  tests/hd-geo-test.c      | 582 +++++++++++++++++++++++++++++++++++++++
>>  11 files changed, 773 insertions(+), 41 deletions(-)
>>
>> --
>> 2.23.0.187.g17f5b7556c-goog
>>


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface
  2019-08-27  8:24 [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface Sam Eiderman via Qemu-devel
                   ` (10 preceding siblings ...)
  2019-09-11 14:36 ` Sam Eiderman via Qemu-devel
@ 2019-09-23  9:50 ` Max Reitz
  2019-09-24 18:49 ` [Qemu-block] " John Snow
  12 siblings, 0 replies; 20+ messages in thread
From: Max Reitz @ 2019-09-23  9:50 UTC (permalink / raw)
  To: Sam Eiderman, qemu-devel
  Cc: kwolf, qemu-block, seabios, kevin, liran.alon, kraxel, karl.heubaum


[-- Attachment #1.1: Type: text/plain, Size: 2744 bytes --]

On 27.08.19 10:24, Sam Eiderman via Qemu-devel wrote:
> v1:
> 
> Non-standard logical geometries break under QEMU.
> 
> A virtual disk which contains an operating system which depends on
> logical geometries (consistent values being reported from BIOS INT13
> AH=08) will most likely break under QEMU/SeaBIOS if it has non-standard
> logical geometries - for example 56 SPT (sectors per track).
> No matter what QEMU will guess - SeaBIOS, for large enough disks - will
> use LBA translation, which will report 63 SPT instead.
> 
> In addition we can not enforce SeaBIOS to rely on phyiscal geometries at
> all. A virtio-blk-pci virtual disk with 255 phyiscal heads can not
> report more than 16 physical heads when moved to an IDE controller, the
> ATA spec allows a maximum of 16 heads - this is an artifact of
> virtualization.
> 
> By supplying the logical geometies directly we are able to support such
> "exotic" disks.
> 
> We will use fw_cfg to do just that.
> 
> v2:
> 
> Fix missing parenthesis check in
>     "hd-geo-test: Add tests for lchs override"
> 
> v3:
> 
> * Rename fw_cfg key to "bios-geometry".
> * Remove "extendible" interface.
> * Add cpu_to_le32 fix as Laszlo suggested or big endian hosts
> * Fix last qtest commit - automatic docker tester for some reason does not have qemu-img set
> 
> v4:
> 
> * Change fw_cfg interface from mixed textual/binary to textual only
> 
> v5:
> 
> * Fix line > 80 chars in tests/hd-geo-test.c
> 
> v6:
> 
> * Small fixes for issues pointed by Max
> * (&conf->conf)->lcyls to conf->conf.lcyls and so on
> * Remove scsi_unrealize from everything other than scsi-hd
> * Add proper include to sysemu.h
> * scsi_device_unrealize() after scsi_device_purge_requests()
> 
> Sam Eiderman (8):
>   block: Refactor macros - fix tabbing
>   block: Support providing LCHS from user
>   bootdevice: Add interface to gather LCHS
>   scsi: Propagate unrealize() callback to scsi-hd
>   bootdevice: Gather LCHS from all relevant devices
>   bootdevice: Refactor get_boot_devices_list
>   bootdevice: FW_CFG interface for LCHS values
>   hd-geo-test: Add tests for lchs override
> 
>  bootdevice.c             | 148 ++++++++--
>  hw/block/virtio-blk.c    |   6 +
>  hw/ide/qdev.c            |   7 +-
>  hw/nvram/fw_cfg.c        |  14 +-
>  hw/scsi/scsi-bus.c       |  16 ++
>  hw/scsi/scsi-disk.c      |  12 +
>  include/hw/block/block.h |  22 +-
>  include/hw/scsi/scsi.h   |   1 +
>  include/sysemu/sysemu.h  |   4 +
>  tests/Makefile.include   |   2 +-
>  tests/hd-geo-test.c      | 582 +++++++++++++++++++++++++++++++++++++++
>  11 files changed, 773 insertions(+), 41 deletions(-)

Acked-by: Max Reitz <mreitz@redhat.com>


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [Qemu-block] [PATCH v6 5/8] bootdevice: Gather LCHS from all relevant devices
  2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 5/8] bootdevice: Gather LCHS from all relevant devices Sam Eiderman via Qemu-devel
@ 2019-09-23 21:40   ` John Snow
  0 siblings, 0 replies; 20+ messages in thread
From: John Snow @ 2019-09-23 21:40 UTC (permalink / raw)
  To: Sam Eiderman, qemu-devel
  Cc: kwolf, qemu-block, Arbel Moshe, seabios, kevin, liran.alon,
	kraxel, Sam Eiderman



On 8/27/19 4:24 AM, Sam Eiderman via Qemu-block wrote:
> From: Sam Eiderman <shmuel.eiderman@oracle.com>
> 
> Relevant devices are:
>     * ide-hd (and ide-cd, ide-drive)
>     * scsi-hd (and scsi-cd, scsi-disk, scsi-block)
>     * virtio-blk-pci
> 
> We do not call del_boot_device_lchs() for ide-* since we don't need to -
> IDE block devices do not support unplugging.
> 
> Signed-off-by: Sam Eiderman <sameid@google.com>
> Reviewed-by: Karl Heubaum <karl.heubaum@oracle.com>
> Reviewed-by: Arbel Moshe <arbel.moshe@oracle.com>
> Signed-off-by: Sam Eiderman <shmuel.eiderman@oracle.com>

Acked-by: John Snow <jsnow@redhat.com>

> ---
>  hw/block/virtio-blk.c |  6 ++++++
>  hw/ide/qdev.c         |  5 +++++
>  hw/scsi/scsi-disk.c   | 12 ++++++++++++
>  3 files changed, 23 insertions(+)
> 
> diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
> index 18851601cb..6d8ff34a16 100644
> --- a/hw/block/virtio-blk.c
> +++ b/hw/block/virtio-blk.c
> @@ -1186,6 +1186,11 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
>      blk_set_guest_block_size(s->blk, s->conf.conf.logical_block_size);
>  
>      blk_iostatus_enable(s->blk);
> +
> +    add_boot_device_lchs(dev, "/disk@0,0",
> +                         conf->conf.lcyls,
> +                         conf->conf.lheads,
> +                         conf->conf.lsecs);
>  }
>  
>  static void virtio_blk_device_unrealize(DeviceState *dev, Error **errp)
> @@ -1193,6 +1198,7 @@ static void virtio_blk_device_unrealize(DeviceState *dev, Error **errp)
>      VirtIODevice *vdev = VIRTIO_DEVICE(dev);
>      VirtIOBlock *s = VIRTIO_BLK(dev);
>  
> +    del_boot_device_lchs(dev, "/disk@0,0");
>      virtio_blk_data_plane_destroy(s->dataplane);
>      s->dataplane = NULL;
>      qemu_del_vm_change_state_handler(s->change);
> diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
> index 6dd219944f..2ffd387a73 100644
> --- a/hw/ide/qdev.c
> +++ b/hw/ide/qdev.c
> @@ -220,6 +220,11 @@ static void ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind, Error **errp)
>  
>      add_boot_device_path(dev->conf.bootindex, &dev->qdev,
>                           dev->unit ? "/disk@1" : "/disk@0");
> +
> +    add_boot_device_lchs(&dev->qdev, dev->unit ? "/disk@1" : "/disk@0",
> +                         dev->conf.lcyls,
> +                         dev->conf.lheads,
> +                         dev->conf.lsecs);
>  }
>  
>  static void ide_dev_get_bootindex(Object *obj, Visitor *v, const char *name,
> diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
> index 915641a0f1..d19896fe4d 100644
> --- a/hw/scsi/scsi-disk.c
> +++ b/hw/scsi/scsi-disk.c
> @@ -35,6 +35,7 @@
>  #include "hw/block/block.h"
>  #include "hw/qdev-properties.h"
>  #include "sysemu/dma.h"
> +#include "sysemu/sysemu.h"
>  #include "qemu/cutils.h"
>  #include "trace.h"
>  
> @@ -2402,6 +2403,16 @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
>      blk_set_guest_block_size(s->qdev.conf.blk, s->qdev.blocksize);
>  
>      blk_iostatus_enable(s->qdev.conf.blk);
> +
> +    add_boot_device_lchs(&dev->qdev, NULL,
> +                         dev->conf.lcyls,
> +                         dev->conf.lheads,
> +                         dev->conf.lsecs);
> +}
> +
> +static void scsi_unrealize(SCSIDevice *dev, Error **errp)
> +{
> +    del_boot_device_lchs(&dev->qdev, NULL);
>  }
>  
>  static void scsi_hd_realize(SCSIDevice *dev, Error **errp)
> @@ -3006,6 +3017,7 @@ static void scsi_hd_class_initfn(ObjectClass *klass, void *data)
>      SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
>  
>      sc->realize      = scsi_hd_realize;
> +    sc->unrealize    = scsi_unrealize;
>      sc->alloc_req    = scsi_new_request;
>      sc->unit_attention_reported = scsi_disk_unit_attention_reported;
>      dc->desc = "virtual SCSI disk";
> 


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [Qemu-block] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface
  2019-08-27  8:24 [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface Sam Eiderman via Qemu-devel
                   ` (11 preceding siblings ...)
  2019-09-23  9:50 ` [Qemu-devel] " Max Reitz
@ 2019-09-24 18:49 ` John Snow
  2019-09-25  7:58   ` Thomas Huth
  12 siblings, 1 reply; 20+ messages in thread
From: John Snow @ 2019-09-24 18:49 UTC (permalink / raw)
  To: Sam Eiderman, qemu-devel
  Cc: kwolf, qemu-block, seabios, kevin, liran.alon, kraxel

Nobody was making movement on this patch series, and in response to Max
acking the whole series, I was just going to send a pull request for the
whole thing and see who barked, because nobody likes or hates this
series enough to offer any feedback.

Unfortunately, it's rotted on the vine a bit and has some conflicts with
the testing infrastructure now:

/home/jhuston/src/qemu.git/ide/tests/hd-geo-test.c: In function
‘test_override’:
/home/jhuston/src/qemu.git/ide/tests/hd-geo-test.c:732:5: error:
implicit declaration of function ‘qtest_start’
[-Werror=implicit-function-declaration]
  732 |     qtest_start(joined_args);


You can jump right to the test by invoking it like this:

> export QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64
> make tests/hd-geo-test

It looks like some definitions got moved out from under our feet, but
hopefully it won't take long to rectify.

--js

On 8/27/19 4:24 AM, Sam Eiderman via Qemu-block wrote:
> v1:
> 
> Non-standard logical geometries break under QEMU.
> 
> A virtual disk which contains an operating system which depends on
> logical geometries (consistent values being reported from BIOS INT13
> AH=08) will most likely break under QEMU/SeaBIOS if it has non-standard
> logical geometries - for example 56 SPT (sectors per track).
> No matter what QEMU will guess - SeaBIOS, for large enough disks - will
> use LBA translation, which will report 63 SPT instead.
> 
> In addition we can not enforce SeaBIOS to rely on phyiscal geometries at
> all. A virtio-blk-pci virtual disk with 255 phyiscal heads can not
> report more than 16 physical heads when moved to an IDE controller, the
> ATA spec allows a maximum of 16 heads - this is an artifact of
> virtualization.
> 
> By supplying the logical geometies directly we are able to support such
> "exotic" disks.
> 
> We will use fw_cfg to do just that.
> 
> v2:
> 
> Fix missing parenthesis check in
>     "hd-geo-test: Add tests for lchs override"
> 
> v3:
> 
> * Rename fw_cfg key to "bios-geometry".
> * Remove "extendible" interface.
> * Add cpu_to_le32 fix as Laszlo suggested or big endian hosts
> * Fix last qtest commit - automatic docker tester for some reason does not have qemu-img set
> 
> v4:
> 
> * Change fw_cfg interface from mixed textual/binary to textual only
> 
> v5:
> 
> * Fix line > 80 chars in tests/hd-geo-test.c
> 
> v6:
> 
> * Small fixes for issues pointed by Max
> * (&conf->conf)->lcyls to conf->conf.lcyls and so on
> * Remove scsi_unrealize from everything other than scsi-hd
> * Add proper include to sysemu.h
> * scsi_device_unrealize() after scsi_device_purge_requests()
> 
> Sam Eiderman (8):
>   block: Refactor macros - fix tabbing
>   block: Support providing LCHS from user
>   bootdevice: Add interface to gather LCHS
>   scsi: Propagate unrealize() callback to scsi-hd
>   bootdevice: Gather LCHS from all relevant devices
>   bootdevice: Refactor get_boot_devices_list
>   bootdevice: FW_CFG interface for LCHS values
>   hd-geo-test: Add tests for lchs override
> 
>  bootdevice.c             | 148 ++++++++--
>  hw/block/virtio-blk.c    |   6 +
>  hw/ide/qdev.c            |   7 +-
>  hw/nvram/fw_cfg.c        |  14 +-
>  hw/scsi/scsi-bus.c       |  16 ++
>  hw/scsi/scsi-disk.c      |  12 +
>  include/hw/block/block.h |  22 +-
>  include/hw/scsi/scsi.h   |   1 +
>  include/sysemu/sysemu.h  |   4 +
>  tests/Makefile.include   |   2 +-
>  tests/hd-geo-test.c      | 582 +++++++++++++++++++++++++++++++++++++++
>  11 files changed, 773 insertions(+), 41 deletions(-)
> 


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [Qemu-block] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface
  2019-09-24 18:49 ` [Qemu-block] " John Snow
@ 2019-09-25  7:58   ` Thomas Huth
  2019-09-25 10:20     ` Sam Eiderman via
  0 siblings, 1 reply; 20+ messages in thread
From: Thomas Huth @ 2019-09-25  7:58 UTC (permalink / raw)
  To: John Snow, Sam Eiderman, qemu-devel
  Cc: kwolf, qemu-block, seabios, kevin, liran.alon, kraxel

On 24/09/2019 20.49, John Snow wrote:
> Nobody was making movement on this patch series, and in response to Max
> acking the whole series, I was just going to send a pull request for the
> whole thing and see who barked, because nobody likes or hates this
> series enough to offer any feedback.
> 
> Unfortunately, it's rotted on the vine a bit and has some conflicts with
> the testing infrastructure now:
> 
> /home/jhuston/src/qemu.git/ide/tests/hd-geo-test.c: In function
> ‘test_override’:
> /home/jhuston/src/qemu.git/ide/tests/hd-geo-test.c:732:5: error:
> implicit declaration of function ‘qtest_start’
> [-Werror=implicit-function-declaration]
>   732 |     qtest_start(joined_args);
> 
> 
> You can jump right to the test by invoking it like this:
> 
>> export QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64
>> make tests/hd-geo-test
> 
> It looks like some definitions got moved out from under our feet, but
> hopefully it won't take long to rectify.

Please replace qtest_start() with qts = qtest_init() and qtest_end()
with qtest_quit(qts).

See this commit for some more details:

 https://git.qemu.org/?p=qemu.git;a=commitdiff;h=44c2364aaa5e366c4

  Thomas


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [Qemu-block] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface
  2019-09-25  7:58   ` Thomas Huth
@ 2019-09-25 10:20     ` Sam Eiderman via
  2019-09-25 10:22       ` mailer
  2019-09-25 13:11       ` John Snow
  0 siblings, 2 replies; 20+ messages in thread
From: Sam Eiderman via @ 2019-09-25 10:20 UTC (permalink / raw)
  To: Thomas Huth
  Cc: kwolf, qemu-block, seabios, qemu-devel, Kevin OConnor,
	liran.alon, kraxel, John Snow

[-- Attachment #1: Type: text/plain, Size: 1440 bytes --]

Thanks Thomas,

Resubmitting the tests, all other code will remain the same.

Sam

On Wed, Sep 25, 2019 at 10:58 AM Thomas Huth <thuth@redhat.com> wrote:

> On 24/09/2019 20.49, John Snow wrote:
> > Nobody was making movement on this patch series, and in response to Max
> > acking the whole series, I was just going to send a pull request for the
> > whole thing and see who barked, because nobody likes or hates this
> > series enough to offer any feedback.
> >
> > Unfortunately, it's rotted on the vine a bit and has some conflicts with
> > the testing infrastructure now:
> >
> > /home/jhuston/src/qemu.git/ide/tests/hd-geo-test.c: In function
> > ‘test_override’:
> > /home/jhuston/src/qemu.git/ide/tests/hd-geo-test.c:732:5: error:
> > implicit declaration of function ‘qtest_start’
> > [-Werror=implicit-function-declaration]
> >   732 |     qtest_start(joined_args);
> >
> >
> > You can jump right to the test by invoking it like this:
> >
> >> export QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64
> >> make tests/hd-geo-test
> >
> > It looks like some definitions got moved out from under our feet, but
> > hopefully it won't take long to rectify.
>
> Please replace qtest_start() with qts = qtest_init() and qtest_end()
> with qtest_quit(qts).
>
> See this commit for some more details:
>
>  https://git.qemu.org/?p=qemu.git;a=commitdiff;h=44c2364aaa5e366c4
>
>   Thomas
>

[-- Attachment #2: Type: text/html, Size: 2032 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: Re: [Qemu-block] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface
  2019-09-25 10:20     ` Sam Eiderman via
@ 2019-09-25 10:22       ` mailer
  2019-09-25 13:11       ` John Snow
  1 sibling, 0 replies; 20+ messages in thread
From: mailer @ 2019-09-25 10:22 UTC (permalink / raw)
  To: Sam Eiderman via

Hi Sam Eiderman via!

We received your email, but were unable to deliver it because it
contains HTML. HTML emails are not permitted. The following guide can
help you configure your client to send in plain text instead:

https://useplaintext.email

If you have any questions, please reply to this email to reach the mail
admin. We apologise for the inconvenience.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [Qemu-block] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface
  2019-09-25 10:20     ` Sam Eiderman via
  2019-09-25 10:22       ` mailer
@ 2019-09-25 13:11       ` John Snow
  1 sibling, 0 replies; 20+ messages in thread
From: John Snow @ 2019-09-25 13:11 UTC (permalink / raw)
  To: Sam Eiderman, Thomas Huth
  Cc: kwolf, qemu-block, seabios, qemu-devel, Kevin OConnor,
	liran.alon, kraxel



On 9/25/19 6:20 AM, Sam Eiderman wrote:
> Thanks Thomas,
> 
> Resubmitting the tests, all other code will remain the same.
> 
> Sam
> 

OK, feel free to just send the test by itself if only patch 8/8 changes.

--js


^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2019-09-25 13:37 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-27  8:24 [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface Sam Eiderman via Qemu-devel
2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 1/8] block: Refactor macros - fix tabbing Sam Eiderman via Qemu-devel
2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 2/8] block: Support providing LCHS from user Sam Eiderman via Qemu-devel
2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 3/8] bootdevice: Add interface to gather LCHS Sam Eiderman via Qemu-devel
2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 4/8] scsi: Propagate unrealize() callback to scsi-hd Sam Eiderman via Qemu-devel
2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 5/8] bootdevice: Gather LCHS from all relevant devices Sam Eiderman via Qemu-devel
2019-09-23 21:40   ` [Qemu-block] " John Snow
2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 6/8] bootdevice: Refactor get_boot_devices_list Sam Eiderman via Qemu-devel
2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 7/8] bootdevice: FW_CFG interface for LCHS values Sam Eiderman via Qemu-devel
2019-08-27  8:24 ` [Qemu-devel] [PATCH v6 8/8] hd-geo-test: Add tests for lchs override Sam Eiderman via Qemu-devel
2019-08-27  9:37 ` [Qemu-devel] [PATCH v6 0/8] Add Qemu to SeaBIOS LCHS interface no-reply
2019-08-27 10:02 ` no-reply
2019-09-11 14:36 ` Sam Eiderman via Qemu-devel
2019-09-23  8:23   ` Sam Eiderman via
2019-09-23  9:50 ` [Qemu-devel] " Max Reitz
2019-09-24 18:49 ` [Qemu-block] " John Snow
2019-09-25  7:58   ` Thomas Huth
2019-09-25 10:20     ` Sam Eiderman via
2019-09-25 10:22       ` mailer
2019-09-25 13:11       ` John Snow

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.