WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] Mini-OS update of events initialisation

To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] Mini-OS update of events initialisation
From: Grzegorz Milos <gm281@xxxxxxxxx>
Date: Wed, 15 Nov 2006 19:39:32 +0000
Delivery-date: Wed, 15 Nov 2006 11:40:06 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 1.5 (X11/20051025)
This patch moves initialisation of events (masking event channels) earlier during the boot process. Otherwise 64bit guests would sometimes crash.

Signed-off-by: Grzegorz Milos <gm281@xxxxxxxxx>

Admittedly, I cannot explain the behavior I observed fully. This patch seems to fix it well, but I'd be grateful if someone on the list could explain it.

The problem only appears in 64 bit guest, and only if MiniOS keeps accessing the console ring page (which it does, as all printks write to the console, even before events are initialised. Of course without sending notifications). What happens is that after a while, usually in memory initialisation stage, but at fairly random place MiniOS gets "restarted" i.e. start_kernel is called again. This leads to a crash as soon as MiniOS tries to remap shared info page. It looks like if Xen or xend decided that MiniOS domain should have masked the event channels before writing to the console page, and reboot it ...

Any ideas?

Thanks
Gregor
diff -r 8ed53f24279e -r 2ba83e480bd6 extras/mini-os/include/x86/os.h
--- a/extras/mini-os/include/x86/os.h   Wed Nov 15 16:27:37 2006 +0000
+++ b/extras/mini-os/include/x86/os.h   Wed Nov 15 19:10:33 2006 +0000
@@ -18,6 +18,8 @@
 #ifndef __ASSEMBLY__
 #include <types.h>
 #include <hypervisor.h>
+
+#define USED    __attribute__ ((used))
 
 extern void do_exit(void);
 #define BUG do_exit
diff -r 8ed53f24279e -r 2ba83e480bd6 extras/mini-os/kernel.c
--- a/extras/mini-os/kernel.c   Wed Nov 15 16:27:37 2006 +0000
+++ b/extras/mini-os/kernel.c   Wed Nov 15 19:10:33 2006 +0000
@@ -116,6 +116,9 @@ void start_kernel(start_info_t *si)
     printk("  cmd_line:   %s\n",  
            si->cmd_line ? (const char *)si->cmd_line : "NULL");
 
+    /* Set up events. */
+    init_events();
+    
     arch_print_info();
 
     setup_xen_features();
@@ -123,9 +126,6 @@ void start_kernel(start_info_t *si)
     /* Init memory management. */
     init_mm();
 
-    /* Set up events. */
-    init_events();
-    
     /* Init time and timers. */
     init_time();
 
diff -r 8ed53f24279e -r 2ba83e480bd6 extras/mini-os/mm.c
--- a/extras/mini-os/mm.c       Wed Nov 15 16:27:37 2006 +0000
+++ b/extras/mini-os/mm.c       Wed Nov 15 19:10:33 2006 +0000
@@ -148,7 +148,7 @@ static chunk_head_t  free_tail[FREELIST_
  * Prints allocation[0/1] for @nr_pages, starting at @start
  * address (virtual).
  */
-static void print_allocation(void *start, int nr_pages)
+USED static void print_allocation(void *start, int nr_pages)
 {
     unsigned long pfn_start = virt_to_pfn(start);
     int count;
@@ -163,7 +163,7 @@ static void print_allocation(void *start
  * Prints chunks (making them with letters) for @nr_pages starting
  * at @start (virtual).
  */
-static void print_chunks(void *start, int nr_pages)
+USED static void print_chunks(void *start, int nr_pages)
 {
     char chunks[1001], current='A';
     int order, count;
@@ -408,7 +408,6 @@ void new_pt_frame(unsigned long *pt_pfn,
          do_exit();
          break;
     }
-
     /* Update the entry */
 #if defined(__x86_64__)
     tab = pte_to_virt(tab[l4_table_offset(pt_page)]);
@@ -446,7 +445,6 @@ void new_pt_frame(unsigned long *pt_pfn,
        printk("ERROR: mmu_update failed\n");
        do_exit();
     }
-
     *pt_pfn += 1;
 }
 
@@ -581,7 +579,6 @@ void build_pagetable(unsigned long *star
         }
         start_address += PAGE_SIZE;
     }
-
     *start_pfn = pt_pfn;
 }
 
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>