Merge branch 'fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6
[safe/jmp/linux-2.6] / arch / s390 / kernel / entry.S
index 1268aa2..48215d1 100644 (file)
@@ -53,6 +53,8 @@ _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
                 _TIF_MCCK_PENDING | _TIF_RESTART_SVC | _TIF_SINGLE_STEP )
 _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
                 _TIF_MCCK_PENDING)
+_TIF_SYSCALL = (_TIF_SYSCALL_TRACE>>8 | _TIF_SYSCALL_AUDIT>>8 | \
+               _TIF_SECCOMP>>8 | _TIF_SYSCALL_TRACEPOINT>>8)
 
 STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER
 STACK_SIZE  = 1 << STACK_SHIFT
@@ -265,7 +267,7 @@ sysc_do_restart:
        sth     %r7,SP_SVCNR(%r15)
        sll     %r7,2             # svc number *4
        l       %r8,BASED(.Lsysc_table)
-       tm      __TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
+       tm      __TI_flags+2(%r9),_TIF_SYSCALL
        l       %r8,0(%r7,%r8)    # get system call addr.
        bnz     BASED(sysc_tracesys)
        basr    %r14,%r8          # call sys_xxxx
@@ -276,7 +278,8 @@ sysc_return:
        bnz     BASED(sysc_work)  # there is work to do (signals etc.)
 sysc_restore:
 #ifdef CONFIG_TRACE_IRQFLAGS
-       la      %r1,BASED(sysc_restore_trace_psw)
+       la      %r1,BASED(sysc_restore_trace_psw_addr)
+       l       %r1,0(%r1)
        lpsw    0(%r1)
 sysc_restore_trace:
        TRACE_IRQS_CHECK
@@ -287,10 +290,15 @@ sysc_leave:
 sysc_done:
 
 #ifdef CONFIG_TRACE_IRQFLAGS
+sysc_restore_trace_psw_addr:
+       .long sysc_restore_trace_psw
+
+       .section .data,"aw",@progbits
        .align  8
        .globl  sysc_restore_trace_psw
 sysc_restore_trace_psw:
        .long   0, sysc_restore_trace + 0x80000000
+       .previous
 #endif
 
 #
@@ -405,7 +413,7 @@ sysc_tracego:
        basr    %r14,%r8                # call sys_xxx
        st      %r2,SP_R2(%r15)         # store return value
 sysc_tracenogo:
-       tm      __TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
+       tm      __TI_flags+2(%r9),_TIF_SYSCALL
        bz      BASED(sysc_return)
        l       %r1,BASED(.Ltrace_exit)
        la      %r2,SP_PTREGS(%r15)     # load pt_regs
@@ -557,10 +565,10 @@ pgm_svcper:
        lh      %r7,0x8a                # get svc number from lowcore
        l       %r9,__LC_THREAD_INFO    # load pointer to thread_info struct
        TRACE_IRQS_OFF
-       l       %r1,__TI_task(%r9)
-       mvc     __THREAD_per+__PER_atmid(2,%r1),__LC_PER_ATMID
-       mvc     __THREAD_per+__PER_address(4,%r1),__LC_PER_ADDRESS
-       mvc     __THREAD_per+__PER_access_id(1,%r1),__LC_PER_ACCESS_ID
+       l       %r8,__TI_task(%r9)
+       mvc     __THREAD_per+__PER_atmid(2,%r8),__LC_PER_ATMID
+       mvc     __THREAD_per+__PER_address(4,%r8),__LC_PER_ADDRESS
+       mvc     __THREAD_per+__PER_access_id(1,%r8),__LC_PER_ACCESS_ID
        oi      __TI_flags+3(%r9),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP
        TRACE_IRQS_ON
        stosm   __SF_EMPTY(%r15),0x03   # reenable interrupts
@@ -604,7 +612,8 @@ io_return:
        bnz     BASED(io_work)          # there is work to do (signals etc.)
 io_restore:
 #ifdef CONFIG_TRACE_IRQFLAGS
-       la      %r1,BASED(io_restore_trace_psw)
+       la      %r1,BASED(io_restore_trace_psw_addr)
+       l       %r1,0(%r1)
        lpsw    0(%r1)
 io_restore_trace:
        TRACE_IRQS_CHECK
@@ -615,10 +624,15 @@ io_leave:
 io_done:
 
 #ifdef CONFIG_TRACE_IRQFLAGS
+io_restore_trace_psw_addr:
+       .long io_restore_trace_psw
+
+       .section .data,"aw",@progbits
        .align  8
        .globl  io_restore_trace_psw
 io_restore_trace_psw:
        .long   0, io_restore_trace + 0x80000000
+       .previous
 #endif
 
 #
@@ -837,16 +851,29 @@ mcck_return:
        __CPUINIT
        .globl restart_int_handler
 restart_int_handler:
+       basr    %r1,0
+restart_base:
+       spt     restart_vtime-restart_base(%r1)
+       stck    __LC_LAST_UPDATE_CLOCK
+       mvc     __LC_LAST_UPDATE_TIMER(8),restart_vtime-restart_base(%r1)
+       mvc     __LC_EXIT_TIMER(8),restart_vtime-restart_base(%r1)
        l       %r15,__LC_SAVE_AREA+60  # load ksp
        lctl    %c0,%c15,__LC_CREGS_SAVE_AREA # get new ctl regs
        lam     %a0,%a15,__LC_AREGS_SAVE_AREA
        lm      %r6,%r15,__SF_GPRS(%r15) # load registers from clone
+       l       %r1,__LC_THREAD_INFO
+       mvc     __LC_USER_TIMER(8),__TI_user_timer(%r1)
+       mvc     __LC_SYSTEM_TIMER(8),__TI_system_timer(%r1)
+       xc      __LC_STEAL_TIMER(8),__LC_STEAL_TIMER
        stosm   __SF_EMPTY(%r15),0x04   # now we can turn dat on
        basr    %r14,0
        l       %r14,restart_addr-.(%r14)
        br      %r14                    # branch to start_secondary
 restart_addr:
        .long   start_secondary
+       .align  8
+restart_vtime:
+       .long   0x7fffffff,0xffffffff
        .previous
 #else
 /*
@@ -1094,6 +1121,7 @@ cleanup_io_leave_insn:
 
                .section .rodata, "a"
 #define SYSCALL(esa,esame,emu) .long esa
+       .globl  sys_call_table
 sys_call_table:
 #include "syscalls.S"
 #undef SYSCALL