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-ia64-devel

[Xen-ia64-devel] [patch 06/12] Kexec: Fix ia64_do_tlb_purge so that it w

To: xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-ia64-devel] [patch 06/12] Kexec: Fix ia64_do_tlb_purge so that it works with XEN
From: Simon Horman <horms@xxxxxxxxxxxx>
Date: Thu, 27 Sep 2007 17:17:20 +0900
Cc: Alex Williamson <alex.williamson@xxxxxx>
Delivery-date: Thu, 27 Sep 2007 01:30:35 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ia64-devel-request@lists.xensource.com?subject=help>
List-id: Discussion of the ia64 port of Xen <xen-ia64-devel.lists.xensource.com>
List-post: <mailto:xen-ia64-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=unsubscribe>
References: <20070927073101.163912627@xxxxxxxxxxxx>
Sender: xen-ia64-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: quilt/0.46-1
Fix ia64_do_tlb_purge, its broken in too many ways

1. Call SET_PER_CPU_DATA before making any calls to GET_THIS_PADDR
   to ensure that per-cpu data is set up correctly.

2. Use the per_cpu variable to derive CURRENT_STACK_OFFSET rather
   than reading it from a kernel register. See 1) for explanation
   of why.

3. In the VHPT pruning code, don't use r25 as ia64_jump_to_sal,
   which branches to ia64_do_tlb_purge expects r25 to be preserved.
   There seems no reason not to use r2 as per the other purges
   done in ia64_do_tlb_purge.  Furthermore use r16 and r18 instead
   of r20 and r24 for consistency reasons.

4. Move __va_ul(vcpu_vhpt_maddr(v)) comment outside of
   #if VHPT_ENABLED as it also applies to code further down that
   is outside the #if

Cc: Tristan Gingold <tgingold@xxxxxxx>,
Cc: Yutaka Ezaki <yutaka.ezaki@xxxxxxxxxxxxxx>,
Cc: Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx>,
Cc: Kazuhiro Suzuki <kaz@xxxxxxxxxxxxxx>,
Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>

---
Date: Thu, 13 Sep 2007 15:31:43 +0900
From: Horms <horms@xxxxxxxxxxxx>

Fixes as suggested by SUZUKI Kazuhiro:
- Fix up comment relating to the use of SET_PER_CPU_DATA -
  it was describing a previous version of the fix.
- 2.6.18 does perge the DTR for PERCPU data, so there is
  no need to guard it with #ifdef XEN, although later
  kernels do remove this code
- Dereference what is at offset IA64_DOMAIN_FLAGS_OFFSET

Index: xen-unstable.hg/xen/arch/ia64/linux-xen/mca_asm.S
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/linux-xen/mca_asm.S      2007-07-11 
12:05:33.000000000 +0900
+++ xen-unstable.hg/xen/arch/ia64/linux-xen/mca_asm.S   2007-07-11 
13:13:56.000000000 +0900
@@ -195,6 +195,10 @@
  */
 
 ia64_do_tlb_purge:
+#ifdef XEN
+       // This needs to be called in order for GET_THIS_PADDR to work
+       SET_PER_CPU_DATA();;
+#endif
 #define O(member)      IA64_CPUINFO_##member##_OFFSET
 
        GET_THIS_PADDR(r2, cpu_info)    // load phys addr of cpu_info into r2
@@ -263,7 +269,16 @@ ia64_do_tlb_purge:
        srlz.i
        ;;
        // 4. Purge DTR for stack.
+#ifdef XEN
+       // Kernel registers are saved in a per_cpu cpu_kr_ia64_t
+       // to allow the kernel registers themselves to be used by domains.
+       GET_THIS_PADDR(r2, cpu_kr);;
+       add r2=IA64_KR_CURRENT_STACK_OFFSET,r2
+       ;;
+       ld8 r16=[r2]
+#else
        mov r16=IA64_KR(CURRENT_STACK)
+#endif
        ;;
        shl r16=r16,IA64_GRANULE_SHIFT
        movl r19=PAGE_OFFSET
@@ -277,8 +292,8 @@ ia64_do_tlb_purge:
        ;;
 #ifdef XEN
        // 5. VHPT
+       // r2 = __va_ul(vcpu_vhpt_maddr(v));
 #if VHPT_ENABLED
-       // r25 = __va_ul(vcpu_vhpt_maddr(v));
        GET_THIS_PADDR(r2,cpu_kr);;
        add r2=IA64_KR_CURRENT_OFFSET,r2;;
        ld8 r2=[r2];;
@@ -289,18 +304,18 @@ ia64_do_tlb_purge:
        add r2=IA64_VCPU_VHPT_MADDR_OFFSET,r2;;
        dep r2=0,r2,60,4;;                      // virtual to physical
        ld8 r2=[r2];; 
-       dep r25=-1,r2,60,4;;                    // physical to virtual
+       dep r2=-1,r2,60,4;;                     // physical to virtual
        br.sptk         .percpu_vhpt_done
 #endif
 .not_pervcpu_vhpt:
        GET_THIS_PADDR(r2, vhpt_paddr);; 
        ld8 r2=[r2];; 
-       dep r25=-1,r2,60,4;;                    // physical to virtual
+       dep r2=-1,r2,60,4;;                     // physical to virtual
 .percpu_vhpt_done:
-       dep r20=0,r25,0,IA64_GRANULE_SHIFT
-       mov r24=IA64_GRANULE_SHIFT<<2
+       dep r16=0,r2,0,IA64_GRANULE_SHIFT
+       mov r18=IA64_GRANULE_SHIFT<<2
        ;;
-       ptr.d r20,r24
+       ptr.d r16,r18
        ;;
        srlz.d
        ;;

-- 

-- 
Horms
  H: http://www.vergenet.net/~horms/
  W: http://www.valinux.co.jp/en/


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