Signed-off-by: Maria Butrico <butrico@xxxxxxxxxxxxxx> and Mark Mergen
<mergen@xxxxxxxxxx>
summary: Detect non hypervisor hardware
Added a flag, opt_nohv. Ths flag is set if
1) the operator specifies the nohv boot argument; or
2) the hardware on which we are running has the open firmware
property '/compatible' such that it contains the string
"Power Macintosh". Both the rack mounted G5 and the tower
G5 do have such string in this property.
Added a domain flag option, _DOMF_prob, that indicates that the
domain is running in problem state. Code that uses this flag is
not part of this patch.
diff -r 47697f5b6e13 xen/arch/ppc/boot_of.c
--- a/xen/arch/ppc/boot_of.c Tue Apr 4 18:21:00 2006 -0400
+++ b/xen/arch/ppc/boot_of.c Tue Apr 11 12:13:49 2006 -0400
@@ -24,6 +24,7 @@
#include <xen/compile.h>
#include <public/of-devtree.h>
#include <asm/page.h>
+#include <xen/string.h>
static ulong of_vec;
static ulong of_msr;
@@ -33,6 +34,7 @@ static char dom0args[256];
static char dom0args[256];
extern unsigned int timebase_freq;
+extern int opt_nohv;
#undef OF_DEBUG
@@ -825,6 +827,56 @@ int __init boot_of_rtas(void)
return 1;
}
+/*
+ * return 0 if all ok
+ * OF_FAILURE if error
+ */
+int __init boot_of_nohv(void)
+{
+ char xservers_string[] = "Power Macintosh";
+ int of_root;
+ char compatible_string[256];
+ int compatible_length;
+
+ of_root = of_finddevice("/");
+ if (OF_FAILURE == of_root)
+ return OF_FAILURE;
+
+ compatible_length = of_getprop(of_root, "compatible", compatible_string,
+ sizeof (compatible_string));
+ if (compatible_length != OF_FAILURE) {
+ // null separated string yuck
+ char *cmpstr;
+ int used_length;
+#if 0
+ of_printf("%s :\n", __func__);
+ for (used_length = 0; used_length < compatible_length;
+ used_length++) {
+ if (compatible_string[used_length] == '\0' ) {
+ of_printf(" NULL\n");
+ } else {
+ of_printf("%c", compatible_string[used_length]);
+ }
+ }
+#endif
+ // loop over each null terminated piece of the compatible property
+ for (cmpstr = compatible_string, used_length = 0;
+ used_length < compatible_length;
+ cmpstr = &compatible_string[used_length]) {
+ if (strstr(cmpstr, xservers_string)) {
+ of_printf("Non hypervisor hardware found. Call Mark
Mergen!\n");
+ opt_nohv = 1;
+ return 0;
+ }
+ used_length += strlen(cmpstr) + 1;
+ }
+ } else {
+ return OF_FAILURE;
+ }
+
+ return 0;
+}
+
multiboot_info_t __init *boot_of_init(
ulong r3, ulong r4, ulong vec, ulong r6, ulong r7, ulong orig_msr)
{
@@ -861,6 +913,8 @@ multiboot_info_t __init *boot_of_init(
boot_of_serial();
boot_of_cpus();
boot_of_rtas();
+
+ boot_of_nohv();
/* end of OF */
of_printf("closing OF stdout...\n");
diff -r 47697f5b6e13 xen/arch/ppc/setup.c
--- a/xen/arch/ppc/setup.c Tue Apr 4 18:21:00 2006 -0400
+++ b/xen/arch/ppc/setup.c Tue Apr 11 12:13:49 2006 -0400
@@ -43,6 +43,12 @@ int opt_noht = 0;
int opt_noht = 0;
boolean_param("noht", opt_noht);
+/* opt_nohv: If true, hardware has no hypervisor (HV) mode or nohv boot
+ * parameter was specified.
+ */
+int opt_nohv = 0;
+boolean_param("nohv", opt_nohv);
+
int opt_earlygdb = 0;
boolean_param("earlygdb", opt_earlygdb);
@@ -282,6 +288,8 @@ static void __init __start_xen(multiboot
if (dom0 == NULL)
panic("Error creating domain 0\n");
set_bit(_DOMF_privileged, &dom0->domain_flags);
+ if (opt_nohv)
+ set_bit(_DOMF_prob, &dom0->domain_flags);
/* Grab the DOM0 command line. Skip past the image name. */
cmdline = (char *)(mod[0].string ? __va((ulong)mod[0].string) : NULL);
diff -r 47697f5b6e13 xen/include/xen/sched.h
--- a/xen/include/xen/sched.h Tue Apr 4 18:21:00 2006 -0400
+++ b/xen/include/xen/sched.h Tue Apr 11 12:13:49 2006 -0400
@@ -388,6 +388,10 @@ extern struct domain *domain_list;
/* Domain is being debugged by controller software. */
#define _DOMF_debugging 4
#define DOMF_debugging (1UL<<_DOMF_debugging)
+ /* run domain in prob mode */
+#define _DOMF_prob 7
+#define DOMF_prob (1UL<<_DOMF_prob)
+
static inline int vcpu_runnable(struct vcpu *v)
{
_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel
|