Merge commit 'v2.6.26-rc8' into x86/mce
[cascardo/linux.git] / arch / ia64 / kernel / head.S
index 44d540e..ddeab4e 100644 (file)
@@ -178,7 +178,7 @@ swapper_pg_dir:
 halt_msg:
        stringz "Halting kernel\n"
 
-       .text
+       .section .text.head,"ax"
 
        .global start_ap
 
@@ -392,6 +392,8 @@ self:       hint @pause
        br.sptk.many self               // endless loop
 END(_start)
 
+       .text
+
 GLOBAL_ENTRY(ia64_save_debug_regs)
        alloc r16=ar.pfs,1,0,0,0
        mov r20=ar.lc                   // preserve ar.lc
@@ -1000,6 +1002,26 @@ GLOBAL_ENTRY(sched_clock)
        br.ret.sptk.many rp
 END(sched_clock)
 
+#ifdef CONFIG_VIRT_CPU_ACCOUNTING
+GLOBAL_ENTRY(cycle_to_cputime)
+       alloc r16=ar.pfs,1,0,0,0
+       addl r8=THIS_CPU(cpu_info) + IA64_CPUINFO_NSEC_PER_CYC_OFFSET,r0
+       ;;
+       ldf8 f8=[r8]
+       ;;
+       setf.sig f9=r32
+       ;;
+       xmpy.lu f10=f9,f8       // calculate low 64 bits of 128-bit product     (4 cyc)
+       xmpy.hu f11=f9,f8       // calculate high 64 bits of 128-bit product
+       ;;
+       getf.sig r8=f10         //                                              (5 cyc)
+       getf.sig r9=f11
+       ;;
+       shrp r8=r9,r8,IA64_NSEC_PER_CYC_SHIFT
+       br.ret.sptk.many rp
+END(cycle_to_cputime)
+#endif /* CONFIG_VIRT_CPU_ACCOUNTING */
+
 GLOBAL_ENTRY(start_kernel_thread)
        .prologue
        .save rp, r0                            // this is the end of the call-chain
@@ -1174,6 +1196,7 @@ tlb_purge_done:
        RESTORE_REG(cr.dcr, r25, r17);;
        RESTORE_REG(cr.iva, r25, r17);;
        RESTORE_REG(cr.pta, r25, r17);;
+       srlz.d;;        // required not to violate RAW dependency
        RESTORE_REG(cr.itv, r25, r17);;
        RESTORE_REG(cr.pmv, r25, r17);;
        RESTORE_REG(cr.cmcv, r25, r17);;