[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[XenPPC] [Patch] Detect non hypervisor hardware



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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.