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
|