f0bf933e69
- qemu-user: add device mapper and loopback ioctls, enabling kpatkx OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=40
98 lines
3.2 KiB
Diff
98 lines
3.2 KiB
Diff
From 2f5760ec14a8f595c347f8a6ad2f8b6adfc20bc2 Mon Sep 17 00:00:00 2001
|
|
From: David Gibson <david@gibson.dropbear.id.au>
|
|
Date: Mon, 12 Dec 2011 18:24:33 +0000
|
|
Subject: [PATCH] pseries: Add a routine to find a stable "default" vty and use it
|
|
|
|
In vty_lookup() we have a special case for supporting early debug in
|
|
the kernel. This accepts reg == 0 as a special case to mean "any vty".
|
|
|
|
We implement this by searching the vtys on the bus and returning the
|
|
first we find. This means that the vty we chose depends on the order
|
|
the vtys are specified on the QEMU command line - because that determines
|
|
the order of the vtys on the bus.
|
|
|
|
We'd rather the command line order was irrelevant, so instead return
|
|
the vty with the lowest reg value. This is still a guess as to what the
|
|
user really means, but it is at least stable WRT command line ordering.
|
|
|
|
Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
|
|
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
|
Signed-off-by: Alexander Graf <agraf@suse.de>
|
|
|
|
[agraf] fix braces
|
|
(cherry picked from commit 98331f8ad6a3e2cfbb402d72e6be47eac7706251)
|
|
---
|
|
hw/spapr_vty.c | 47 ++++++++++++++++++++++++++++++++++++++---------
|
|
1 files changed, 38 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/hw/spapr_vty.c b/hw/spapr_vty.c
|
|
index f23cc36..e2fec58 100644
|
|
--- a/hw/spapr_vty.c
|
|
+++ b/hw/spapr_vty.c
|
|
@@ -156,24 +156,53 @@ static VIOsPAPRDeviceInfo spapr_vty = {
|
|
},
|
|
};
|
|
|
|
+static VIOsPAPRDevice *spapr_vty_get_default(VIOsPAPRBus *bus)
|
|
+{
|
|
+ VIOsPAPRDevice *sdev, *selected;
|
|
+ DeviceState *iter;
|
|
+
|
|
+ /*
|
|
+ * To avoid the console bouncing around we want one VTY to be
|
|
+ * the "default". We haven't really got anything to go on, so
|
|
+ * arbitrarily choose the one with the lowest reg value.
|
|
+ */
|
|
+
|
|
+ selected = NULL;
|
|
+ QTAILQ_FOREACH(iter, &bus->bus.children, sibling) {
|
|
+ /* Only look at VTY devices */
|
|
+ if (iter->info != &spapr_vty.qdev) {
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ sdev = DO_UPCAST(VIOsPAPRDevice, qdev, iter);
|
|
+
|
|
+ /* First VTY we've found, so it is selected for now */
|
|
+ if (!selected) {
|
|
+ selected = sdev;
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ /* Choose VTY with lowest reg value */
|
|
+ if (sdev->reg < selected->reg) {
|
|
+ selected = sdev;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return selected;
|
|
+}
|
|
+
|
|
static VIOsPAPRDevice *vty_lookup(sPAPREnvironment *spapr, target_ulong reg)
|
|
{
|
|
VIOsPAPRDevice *sdev;
|
|
|
|
sdev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
|
|
if (!sdev && reg == 0) {
|
|
- DeviceState *qdev;
|
|
-
|
|
/* Hack for kernel early debug, which always specifies reg==0.
|
|
- * We search all VIO devices, and grab the first available vty
|
|
- * device. This attempts to mimic existing PowerVM behaviour
|
|
+ * We search all VIO devices, and grab the vty with the lowest
|
|
+ * reg. This attempts to mimic existing PowerVM behaviour
|
|
* (early debug does work there, despite having no vty with
|
|
* reg==0. */
|
|
- QTAILQ_FOREACH(qdev, &spapr->vio_bus->bus.children, sibling) {
|
|
- if (qdev->info == &spapr_vty.qdev) {
|
|
- return DO_UPCAST(VIOsPAPRDevice, qdev, qdev);
|
|
- }
|
|
- }
|
|
+ return spapr_vty_get_default(spapr->vio_bus);
|
|
}
|
|
|
|
return sdev;
|
|
--
|
|
1.6.0.2
|
|
|