# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxxxxx>
# Node ID d7f71de58c4b484820c49f45ed40fd577c3368d6
# Parent cefb1f761f0b9894459d571618846141ec6f36e2
[LINUX] Fix backward compatibility with hypervisors which do not support kexec.
Also do not rely on side effects in BUG_ON(x) -- use if(x) BUG() instead.
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxxxxx>
---
linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c | 21 +++++++++++++-----
1 files changed, 16 insertions(+), 5 deletions(-)
diff -r cefb1f761f0b -r d7f71de58c4b
linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c Thu Nov 30
18:08:34 2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c Thu Nov 30
18:21:50 2006 +0000
@@ -20,7 +20,7 @@ void xen_machine_kexec_setup_resources(v
{
xen_kexec_range_t range;
struct resource *res;
- int k = 0;
+ int err, k = 0;
if (!is_initial_xendomain())
return;
@@ -32,8 +32,16 @@ void xen_machine_kexec_setup_resources(v
range.range = KEXEC_RANGE_MA_CPU;
range.nr = k;
- if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range))
+ /*
+ * Anything other than EINVAL or success indictates
+ * that we are not running on a hypervisor which
+ * supports kexec.
+ */
+ err = HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range);
+ if (err == -EINVAL)
break;
+ else if (err)
+ return;
k++;
}
@@ -52,7 +60,8 @@ void xen_machine_kexec_setup_resources(v
range.range = KEXEC_RANGE_MA_CPU;
range.nr = k;
- BUG_ON(HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range));
+ if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range))
+ BUG();
res = xen_phys_cpus + k;
@@ -68,7 +77,8 @@ void xen_machine_kexec_setup_resources(v
memset(&range, 0, sizeof(range));
range.range = KEXEC_RANGE_MA_XEN;
- BUG_ON(HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range));
+ if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range))
+ BUG();
xen_hypervisor_res.name = "Hypervisor code and data";
xen_hypervisor_res.start = range.start;
@@ -80,7 +90,8 @@ void xen_machine_kexec_setup_resources(v
memset(&range, 0, sizeof(range));
range.range = KEXEC_RANGE_MA_CRASH;
- BUG_ON(HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range));
+ if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range))
+ BUG();
if (range.size) {
crashk_res.start = range.start;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|