From: Sam Eiderman <sameid@google.com>
To: qemu-devel@nongnu.org
Cc: arbel.moshe@oracle.com, karl.heubaum@oracle.com,
kevin@koconnor.net, kraxel@redhat.com, kwolf@redhat.com,
liran.alon@oracle.com, qemu-block@nongnu.org, sameid@google.com,
seabios@seabios.org, lersek@redhat.com, philmd@redhat.com,
jsnow@redhat.com, Sam Eiderman <shmuel.eiderman@oracle.com>
Subject: [PATCH v8 7/8] bootdevice: FW_CFG interface for LCHS values
Date: Wed, 16 Oct 2019 19:41:44 +0300 [thread overview]
Message-ID: <20191016164145.115898-9-sameid@google.com> (raw)
In-Reply-To: <20191016164145.115898-1-sameid@google.com>
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>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: Sam Eiderman <shmuel.eiderman@oracle.com>
Signed-off-by: Sam Eiderman <sameid@google.com>
---
bootdevice.c | 31 +++++++++++++++++++++++++++++++
hw/nvram/fw_cfg.c | 14 +++++++++++---
include/sysemu/sysemu.h | 1 +
3 files changed, 43 insertions(+), 3 deletions(-)
diff --git a/bootdevice.c b/bootdevice.c
index 2cf6b37c57..03aaffcc8d 100644
--- a/bootdevice.c
+++ b/bootdevice.c
@@ -405,3 +405,34 @@ void del_boot_device_lchs(DeviceState *dev, const char *suffix)
}
}
}
+
+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 5bc5c79cbc..80c57fdc4e 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -106,6 +106,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.700.g56cf767bdb-goog
next prev parent reply other threads:[~2019-10-16 16:55 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-16 16:41 [PATCH v8 0/8] Add Qemu to SeaBIOS LCHS interface Sam Eiderman
2019-10-16 16:41 ` [PATCH v8 1/8] block: Refactor macros - fix tabbing Sam Eiderman
2019-10-16 16:41 ` [PATCH v8 1/1] hd-geo-test: Add tests for lchs override Sam Eiderman
2019-10-16 16:41 ` [PATCH v8 2/8] block: Support providing LCHS from user Sam Eiderman
2019-10-22 10:20 ` Philippe Mathieu-Daudé
2019-10-16 16:41 ` [PATCH v8 3/8] bootdevice: Add interface to gather LCHS Sam Eiderman
2019-10-22 10:22 ` Philippe Mathieu-Daudé
2019-10-16 16:41 ` [PATCH v8 4/8] scsi: Propagate unrealize() callback to scsi-hd Sam Eiderman
2019-10-22 10:23 ` Philippe Mathieu-Daudé
2019-10-16 16:41 ` [PATCH v8 5/8] bootdevice: Gather LCHS from all relevant devices Sam Eiderman
2019-10-22 10:30 ` Philippe Mathieu-Daudé
2019-10-16 16:41 ` [PATCH v8 6/8] bootdevice: Refactor get_boot_devices_list Sam Eiderman
2019-10-22 10:32 ` Philippe Mathieu-Daudé
2019-10-16 16:41 ` Sam Eiderman [this message]
2019-10-22 10:35 ` [PATCH v8 7/8] bootdevice: FW_CFG interface for LCHS values Philippe Mathieu-Daudé
2019-10-16 16:41 ` [PATCH v8 8/8] hd-geo-test: Add tests for lchs override Sam Eiderman
2019-10-16 20:13 ` [PATCH v8 0/8] Add Qemu to SeaBIOS LCHS interface no-reply
2019-10-21 21:02 ` John Snow
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191016164145.115898-9-sameid@google.com \
--to=sameid@google.com \
--cc=arbel.moshe@oracle.com \
--cc=jsnow@redhat.com \
--cc=karl.heubaum@oracle.com \
--cc=kevin@koconnor.net \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=lersek@redhat.com \
--cc=liran.alon@oracle.com \
--cc=philmd@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=seabios@seabios.org \
--cc=shmuel.eiderman@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.