Ian Pratt wrote:
What happens if you use non-live relo?
I thought I had tested that way back at the beginning without seeing
the
problem, but I must not have, because I just retested it to be sure
and
it died the same way. (Now I am truly confused and I need to go back
and
re-examine some of my earlier experiments.)
After redoing some of my tests and understanding more about how Xen
handles page tables, I started looking at ptwr_do_page_fault() and put
debugging code into it. (On Xen 3.0.3 x86-64.) The fixup is failing
in
x86_emulate_memop(). Building a debug version of Xen provided some
additional information (the final line is from my debugging, after the
":" is domid, addr, pte, pte flags, type_info, page owner, domain):
You say you can repro the problem using non-live relo. In that case, you
should also be able to repro it using save/restore, which has almost
identical code paths.
Please try and isolate whether the crash happens on save or restore, and
further whether a given saved images crashes every time in the same way
when you try and restore it (mfns will be different, but pfns may be the
same).
Ian
I finally ran down the problem. SAP is protecting the pages PROT_NONE,
so the page-present bit in the pte is not set and
canonicalize/uncanonicalize code in save/restore ignore the pte. I've
attached a patch. It is possible that this change should be made to the
l1e tests in xc_ptrace.c; I'm not sure.
John Byrne
Signed-off-by: John Byrne <john.l.byrne@xxxxxx>
diff -r 1ad7dff99968 tools/libxc/xc_linux_restore.c
--- a/tools/libxc/xc_linux_restore.c Fri Dec 08 18:37:19 2006 +0000
+++ b/tools/libxc/xc_linux_restore.c Fri Dec 08 21:37:27 2006 -0600
@@ -73,7 +73,7 @@ static int uncanonicalize_pagetable(unsi
else
pte = ((uint64_t *)page)[i];
- if(pte & _PAGE_PRESENT) {
+ if(pte_present(pte)) {
pfn = (pte >> PAGE_SHIFT) & 0xffffffff;
diff -r 1ad7dff99968 tools/libxc/xc_linux_save.c
--- a/tools/libxc/xc_linux_save.c Fri Dec 08 18:37:19 2006 +0000
+++ b/tools/libxc/xc_linux_save.c Fri Dec 08 21:36:59 2006 -0600
@@ -471,7 +471,7 @@ static int canonicalize_pagetable(unsign
if (i >= xen_start && i < xen_end)
pte = 0;
- if (pte & _PAGE_PRESENT) {
+ if (pte_present(pte)) {
mfn = (pte >> PAGE_SHIFT) & 0xfffffff;
if (!MFN_IS_IN_PSEUDOPHYS_MAP(mfn)) {
diff -r 1ad7dff99968 tools/libxc/xg_private.h
--- a/tools/libxc/xg_private.h Fri Dec 08 18:37:19 2006 +0000
+++ b/tools/libxc/xg_private.h Fri Dec 08 17:48:49 2006 -0600
@@ -46,6 +46,10 @@ unsigned long csum_page (void * page);
#define _PAGE_PSE 0x080
#define _PAGE_GLOBAL 0x100
+#define _PAGE_PROTNONE 0x080 /* If not present */
+
+#define pte_present(_pteval) ((_pteval) & (_PAGE_PRESENT|_PAGE_PROTNONE))
+
#define L1_PAGETABLE_SHIFT_PAE 12
#define L2_PAGETABLE_SHIFT_PAE 21
#define L3_PAGETABLE_SHIFT_PAE 30
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|