Ian Jackson schrieb:
> Kevin Wolf writes ("Re: [PATCH] qemu-xen: Fix PV segfault"):
>> Ian Jackson schrieb:
>>> Kevin Wolf writes ("[PATCH] qemu-xen: Fix PV segfault"):
>>>> Don't access cur_cpu with CONFIG_DM, for PV machines it is NULL.
>>> I'm not sure I understand the execution context here properly. Is
>>> this for blktap ? It would be better to make cur_cpu be set to some
>>> sensible value.
>> No, this is completely independent of blktap. Currently, PV machines
>> just don't have a virtual cpu in qemu - in contrary to FV machines which
>> call a complete pc_machine.init() during their initialization.
>
> Evidently this is a configuration I haven't tested. My PV machines
> don't use a qemu-dm at all.
AFAIK, you automatically get qemu-dm as soon as you use VNC. So this is
probably the most common use case.
While I'm at it: There's another problem with qemu-xen, I can establish
a VNC connection only if I was connected via xm console before. Maybe I
can take a look at this later this week.
> I would very much prefer an answer which didn't make any additional
> changes to vl.c (or other code shared with upstream). If such changes
> are necessary they should be textually small. This will make keeping
> us up to date with qemu upstream much easier.
Yes, I couldn't agree more.
Attached is a new version of the patch which creates a dummy CPU for PV
machines. Now it touches no upstream code any more.
Kevin
>From acd73e1af736e0b0e6fe4af234f828b6a572a841 Mon Sep 17 00:00:00 2001
From: Kevin Wolf <kwolf@xxxxxxx>
Date: Wed, 2 Jul 2008 13:23:49 +0200
Subject: [PATCH] qemu-xen: Fix PV segfault
Create a dummy CPU during PV machine initialization. This avoids NULL pointer
accesses.
Signed-off-by: Kevin Wolf <kwolf@xxxxxxx>
---
hw/xen_machine_pv.c | 5 ++++-
i386-dm/helper2.c | 4 ++++
2 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/hw/xen_machine_pv.c b/hw/xen_machine_pv.c
index 0fec0aa..e51addb 100644
--- a/hw/xen_machine_pv.c
+++ b/hw/xen_machine_pv.c
@@ -45,13 +45,16 @@ static void xen_init_pv(ram_addr_t ram_size, int
vga_ram_size,
{
struct xenfb *xenfb;
extern int domid;
-
+ CPUState *env;
#ifndef CONFIG_STUBDOM
/* Initialize tapdisk client */
init_blktap();
#endif
+ /* Initialize a dummy CPU */
+ env = cpu_init(NULL);
+
/* Connect to text console */
if (serial_hds[0]) {
if (xencons_init(domid, serial_hds[0]) < 0) {
diff --git a/i386-dm/helper2.c b/i386-dm/helper2.c
index 44bed2b..6437c37 100644
--- a/i386-dm/helper2.c
+++ b/i386-dm/helper2.c
@@ -112,6 +112,10 @@ CPUX86State *cpu_x86_init(const char *cpu_model)
return NULL;
cpu_exec_init(env);
+ /* There is no shared_page for PV, we're done now */
+ if (shared_page == NULL)
+ return env;
+
/* init various static tables */
if (!inited) {
inited = 1;
--
1.5.4.5
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|