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] [rfc 09/15] Kexec: Fix ia64_do_tlb_purge so that it wor

To: xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-ia64-devel] [rfc 09/15] Kexec: Fix ia64_do_tlb_purge so that it works with XEN
From: Simon Horman <horms@xxxxxxxxxxxx>
Date: Fri, 17 Aug 2007 15:50:51 +0900
Cc: Yutaka Ezaki <yutaka.ezaki@xxxxxxxxxxxxxx>
Delivery-date: Fri, 17 Aug 2007 00:42:37 -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: <20070817065042.645546902@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. Make all calls to GET_THIS_PADDR before purging the DTR for PERCPU.
   This is because the kernel registers are saved in per_cpu data to allow
   the real kernel registers to be used by domains.

2. Wrap the purging of the DTR for PERCPU in #ifdef XEN as Linux
   doesn't seem to do this (any more?)

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

4. Fix VHPT purging code to treat what is at the IA64_DOMAIN_FLAGS_OFFSET
   offset as a litteral value (flag) rather than a pointer to a literal.

5. 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.

6. 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

7. There is no 7th change

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>

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
@@ -244,6 +248,7 @@ ia64_do_tlb_purge:
        ;;
        srlz.d
        ;;
+#ifdef XEN
        // 2. Purge DTR for PERCPU data.
        movl r16=PERCPU_ADDR
        mov r18=PERCPU_PAGE_SHIFT<<2
@@ -252,6 +257,7 @@ ia64_do_tlb_purge:
        ;;
        srlz.d
        ;;
+#endif
        // 3. Purge ITR for PAL code.
        GET_THIS_PADDR(r2, ia64_mca_pal_base)
        ;;
@@ -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,25 +304,24 @@ ia64_do_tlb_purge:
        ld8 r3=[r3];; 
        dep r3=0,r3,60,4;;                      // virtual to physical
        add r3=IA64_DOMAIN_FLAGS_OFFSET,r3;;
-       ld8 r3=[r3];; 
        and r3=HAS_PERVCPU_VHPT_MASK,r3;;
        cmp.eq p6,p0=r3,r0;;
 (p6)   br.cond.sptk    .not_pervcpu_vhpt
        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