]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/ia64/kernel/fsys.S
Merge branch 'topic/hda' into for-linus
[linux-2.6-omap-h63xx.git] / arch / ia64 / kernel / fsys.S
index 6a72db7ddecc010e0ddccb246e7d701c00164f50..c1625c7e17795b093acd281eb7d2a56fd1a6be47 100644 (file)
@@ -61,13 +61,29 @@ ENTRY(fsys_getpid)
        .prologue
        .altrp b6
        .body
+       add r17=IA64_TASK_GROUP_LEADER_OFFSET,r16
+       ;;
+       ld8 r17=[r17]                           // r17 = current->group_leader
        add r9=TI_FLAGS+IA64_TASK_SIZE,r16
        ;;
        ld4 r9=[r9]
-       add r8=IA64_TASK_TGID_OFFSET,r16
+       add r17=IA64_TASK_TGIDLINK_OFFSET,r17
        ;;
        and r9=TIF_ALLWORK_MASK,r9
-       ld4 r8=[r8]                             // r8 = current->tgid
+       ld8 r17=[r17]                           // r17 = current->group_leader->pids[PIDTYPE_PID].pid
+       ;;
+       add r8=IA64_PID_LEVEL_OFFSET,r17
+       ;;
+       ld4 r8=[r8]                             // r8 = pid->level
+       add r17=IA64_PID_UPID_OFFSET,r17        // r17 = &pid->numbers[0]
+       ;;
+       shl r8=r8,IA64_UPID_SHIFT
+       ;;
+       add r17=r17,r8                          // r17 = &pid->numbers[pid->level]
+       ;;
+       ld4 r8=[r17]                            // r8 = pid->numbers[pid->level].nr
+       ;;
+       mov r17=0
        ;;
        cmp.ne p8,p0=0,r9
 (p8)   br.spnt.many fsys_fallback_syscall
@@ -126,15 +142,25 @@ ENTRY(fsys_set_tid_address)
        .altrp b6
        .body
        add r9=TI_FLAGS+IA64_TASK_SIZE,r16
+       add r17=IA64_TASK_TGIDLINK_OFFSET,r16
        ;;
        ld4 r9=[r9]
        tnat.z p6,p7=r32                // check argument register for being NaT
+       ld8 r17=[r17]                           // r17 = current->pids[PIDTYPE_PID].pid
        ;;
        and r9=TIF_ALLWORK_MASK,r9
-       add r8=IA64_TASK_PID_OFFSET,r16
+       add r8=IA64_PID_LEVEL_OFFSET,r17
        add r18=IA64_TASK_CLEAR_CHILD_TID_OFFSET,r16
        ;;
-       ld4 r8=[r8]
+       ld4 r8=[r8]                             // r8 = pid->level
+       add r17=IA64_PID_UPID_OFFSET,r17        // r17 = &pid->numbers[0]
+       ;;
+       shl r8=r8,IA64_UPID_SHIFT
+       ;;
+       add r17=r17,r8                          // r17 = &pid->numbers[pid->level]
+       ;;
+       ld4 r8=[r17]                            // r8 = pid->numbers[pid->level].nr
+       ;;
        cmp.ne p8,p0=0,r9
        mov r17=-1
        ;;
@@ -656,7 +682,11 @@ GLOBAL_ENTRY(fsys_bubble_down)
        nop.i 0
        ;;
        mov ar.rsc=0                            // M2   set enforced lazy mode, pl 0, LE, loadrs=0
+#ifdef CONFIG_VIRT_CPU_ACCOUNTING
+       mov.m r30=ar.itc                        // M    get cycle for accounting
+#else
        nop.m 0
+#endif
        nop.i 0
        ;;
        mov r23=ar.bspstore                     // M2 (12 cyc) save ar.bspstore
@@ -678,6 +708,28 @@ GLOBAL_ENTRY(fsys_bubble_down)
        cmp.ne pKStk,pUStk=r0,r0                // A    set pKStk <- 0, pUStk <- 1
        br.call.sptk.many b7=ia64_syscall_setup // B
        ;;
+#ifdef CONFIG_VIRT_CPU_ACCOUNTING
+       // mov.m r30=ar.itc is called in advance
+       add r16=TI_AC_STAMP+IA64_TASK_SIZE,r2
+       add r17=TI_AC_LEAVE+IA64_TASK_SIZE,r2
+       ;;
+       ld8 r18=[r16],TI_AC_STIME-TI_AC_STAMP   // time at last check in kernel
+       ld8 r19=[r17],TI_AC_UTIME-TI_AC_LEAVE   // time at leave kernel
+       ;;
+       ld8 r20=[r16],TI_AC_STAMP-TI_AC_STIME   // cumulated stime
+       ld8 r21=[r17]                           // cumulated utime
+       sub r22=r19,r18                         // stime before leave kernel
+       ;;
+       st8 [r16]=r30,TI_AC_STIME-TI_AC_STAMP   // update stamp
+       sub r18=r30,r19                         // elapsed time in user mode
+       ;;
+       add r20=r20,r22                         // sum stime
+       add r21=r21,r18                         // sum utime
+       ;;
+       st8 [r16]=r20                           // update stime
+       st8 [r17]=r21                           // update utime
+       ;;
+#endif
        mov ar.rsc=0x3                          // M2   set eager mode, pl 0, LE, loadrs=0
        mov rp=r14                              // I0   set the real return addr
        and r3=_TIF_SYSCALL_TRACEAUDIT,r3       // A