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-changelog

[Xen-changelog] [xen-unstable] [IA64] Fix wrong insertion of TLB entry i

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [IA64] Fix wrong insertion of TLB entry in region 0
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 04 Oct 2007 17:41:15 -0700
Delivery-date: Thu, 04 Oct 2007 17:44:24 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1191254270 21600
# Node ID 2d1b8ae1548d139f9f8532c90a1e61fc199a3394
# Parent  3874bdc782044e5fe9e4181a411b07f2a4bc0155
[IA64] Fix wrong insertion of TLB entry in region 0

On PV domain with metaphysical mode, emulation of itc.d in region 0
doesn't work well and inserts an wrong TC entry.
Because set_one_rr() doesn't set the machine region register.
i.e. metaphyisical_rr0 is used instead of guest's rr[0].

This bug causes Dom0/U crash when an application uses region 0.
Actually I met the crash when I was building open GFW (java uses
region 0).

Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
---
 xen/arch/ia64/xen/regionreg.c    |   11 +++++++++--
 xen/arch/ia64/xen/vcpu.c         |   10 +++++-----
 xen/include/asm-ia64/regionreg.h |    3 ++-
 3 files changed, 16 insertions(+), 8 deletions(-)

diff -r 3874bdc78204 -r 2d1b8ae1548d xen/arch/ia64/xen/regionreg.c
--- a/xen/arch/ia64/xen/regionreg.c     Mon Oct 01 09:53:48 2007 -0600
+++ b/xen/arch/ia64/xen/regionreg.c     Mon Oct 01 09:57:50 2007 -0600
@@ -271,8 +271,16 @@ int set_one_rr(unsigned long rr, unsigne
        return 1;
 }
 
+void set_virtual_rr0(void)
+{
+       struct vcpu *v = current;
+
+       ia64_set_rr(0, v->arch.metaphysical_saved_rr0);
+       ia64_srlz_d();
+}
+
 // set rr0 to the passed rid (for metaphysical mode so don't use domain offset
-int set_metaphysical_rr0(void)
+void set_metaphysical_rr0(void)
 {
        struct vcpu *v = current;
 //     ia64_rr rrv;
@@ -280,7 +288,6 @@ int set_metaphysical_rr0(void)
 //     rrv.ve = 1;     FIXME: TURN ME BACK ON WHEN VHPT IS WORKING
        ia64_set_rr(0, v->arch.metaphysical_rid_dt);
        ia64_srlz_d();
-       return 1;
 }
 
 void init_all_rr(struct vcpu *v)
diff -r 3874bdc78204 -r 2d1b8ae1548d xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Mon Oct 01 09:53:48 2007 -0600
+++ b/xen/arch/ia64/xen/vcpu.c  Mon Oct 01 09:57:50 2007 -0600
@@ -280,7 +280,7 @@ static void vcpu_pkr_set_psr_handling(VC
  VCPU processor status register access routines
 **************************************************************************/
 
-void vcpu_set_metaphysical_mode(VCPU * vcpu, BOOLEAN newmode)
+static void vcpu_set_metaphysical_mode(VCPU * vcpu, BOOLEAN newmode)
 {
        /* only do something if mode changes */
        if (!!newmode ^ !!PSCB(vcpu, metaphysical_mode)) {
@@ -288,7 +288,7 @@ void vcpu_set_metaphysical_mode(VCPU * v
                if (newmode)
                        set_metaphysical_rr0();
                else if (PSCB(vcpu, rrs[0]) != -1)
-                       set_one_rr(0, PSCB(vcpu, rrs[0]));
+                       set_virtual_rr0();
        }
 }
 
@@ -1635,7 +1635,7 @@ vcpu_get_domain_bundle(VCPU * vcpu, REGS
                // This may cause tlb miss. see vcpu_translate(). Be careful!
                swap_rr0 = (!region && PSCB(vcpu, metaphysical_mode));
                if (swap_rr0) {
-                       set_one_rr(0x0, PSCB(vcpu, rrs[0]));
+                       set_virtual_rr0();
                }
                *bundle = __get_domain_bundle(gip);
                if (swap_rr0) {
@@ -2368,7 +2368,7 @@ IA64FAULT vcpu_itc_d(VCPU * vcpu, u64 pt
        if (!pteval)
                return IA64_ILLOP_FAULT;
        if (swap_rr0)
-               set_one_rr(0x0, PSCB(vcpu, rrs[0]));
+               set_virtual_rr0();
        vcpu_itc_no_srlz(vcpu, 2, ifa, pteval, pte, _itir.itir, &entry);
        if (swap_rr0)
                set_metaphysical_rr0();
@@ -2396,7 +2396,7 @@ IA64FAULT vcpu_itc_i(VCPU * vcpu, u64 pt
        if (!pteval)
                return IA64_ILLOP_FAULT;
        if (swap_rr0)
-               set_one_rr(0x0, PSCB(vcpu, rrs[0]));
+               set_virtual_rr0();
        vcpu_itc_no_srlz(vcpu, 1, ifa, pteval, pte, _itir.itir, &entry);
        if (swap_rr0)
                set_metaphysical_rr0();
diff -r 3874bdc78204 -r 2d1b8ae1548d xen/include/asm-ia64/regionreg.h
--- a/xen/include/asm-ia64/regionreg.h  Mon Oct 01 09:53:48 2007 -0600
+++ b/xen/include/asm-ia64/regionreg.h  Mon Oct 01 09:57:50 2007 -0600
@@ -80,7 +80,8 @@ struct vcpu;
 struct vcpu;
 extern void init_all_rr(struct vcpu *v);
 
-extern int set_metaphysical_rr0(void);
+extern void set_virtual_rr0(void);
+extern void set_metaphysical_rr0(void);
 
 extern void load_region_regs(struct vcpu *v);
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [IA64] Fix wrong insertion of TLB entry in region 0, Xen patchbot-unstable <=