#define TIF_NEED_RESCHED       1
 #define TIF_NOTIFY_RESUME      2       /* callback before returning to user */
 #define TIF_FOREIGN_FPSTATE    3       /* CPU's FP state is not current's */
+#define TIF_NOHZ               7
 #define TIF_SYSCALL_TRACE      8
 #define TIF_SYSCALL_AUDIT      9
 #define TIF_SYSCALL_TRACEPOINT 10
 #define _TIF_NEED_RESCHED      (1 << TIF_NEED_RESCHED)
 #define _TIF_NOTIFY_RESUME     (1 << TIF_NOTIFY_RESUME)
 #define _TIF_FOREIGN_FPSTATE   (1 << TIF_FOREIGN_FPSTATE)
+#define _TIF_NOHZ              (1 << TIF_NOHZ)
 #define _TIF_SYSCALL_TRACE     (1 << TIF_SYSCALL_TRACE)
 #define _TIF_SYSCALL_AUDIT     (1 << TIF_SYSCALL_AUDIT)
 #define _TIF_SYSCALL_TRACEPOINT        (1 << TIF_SYSCALL_TRACEPOINT)
                                 _TIF_NOTIFY_RESUME | _TIF_FOREIGN_FPSTATE)
 
 #define _TIF_SYSCALL_WORK      (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
-                                _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP)
+                                _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | \
+                                _TIF_NOHZ)
 
 #endif /* __KERNEL__ */
 #endif /* __ASM_THREAD_INFO_H */
 
 #include <asm/unistd.h>
 #include <asm/unistd32.h>
 
+/*
+ * Context tracking subsystem.  Used to instrument transitions
+ * between user and kernel mode.
+ */
+       .macro ct_user_exit, syscall = 0
+#ifdef CONFIG_CONTEXT_TRACKING
+       bl      context_tracking_user_exit
+       .if \syscall == 1
+       /*
+        * Save/restore needed during syscalls.  Restore syscall arguments from
+        * the values already saved on stack during kernel_entry.
+        */
+       ldp     x0, x1, [sp]
+       ldp     x2, x3, [sp, #S_X2]
+       ldp     x4, x5, [sp, #S_X4]
+       ldp     x6, x7, [sp, #S_X6]
+       .endif
+#endif
+       .endm
+
+       .macro ct_user_enter
+#ifdef CONFIG_CONTEXT_TRACKING
+       bl      context_tracking_user_enter
+#endif
+       .endm
+
 /*
  * Bad Abort numbers
  *-----------------
        .macro  kernel_exit, el, ret = 0
        ldp     x21, x22, [sp, #S_PC]           // load ELR, SPSR
        .if     \el == 0
+       ct_user_enter
        ldr     x23, [sp, #S_SP]                // load return stack pointer
        .endif
        .if     \ret
        mrs     x26, far_el1
        // enable interrupts before calling the main handler
        enable_dbg_and_irq
+       ct_user_exit
        bic     x0, x26, #(0xff << 56)
        mov     x1, x25
        mov     x2, sp
        mrs     x26, far_el1
        // enable interrupts before calling the main handler
        enable_dbg_and_irq
+       ct_user_exit
        mov     x0, x26
        orr     x1, x25, #1 << 24               // use reserved ISS bit for instruction aborts
        mov     x2, sp
         * Floating Point or Advanced SIMD access
         */
        enable_dbg
+       ct_user_exit
        mov     x0, x25
        mov     x1, sp
        adr     lr, ret_to_user
         * Floating Point or Advanced SIMD exception
         */
        enable_dbg
+       ct_user_exit
        mov     x0, x25
        mov     x1, sp
        adr     lr, ret_to_user
         */
        // enable interrupts before calling the main handler
        enable_dbg_and_irq
+       ct_user_exit
        mov     x0, sp
        adr     lr, ret_to_user
        b       do_undefinstr
        mov     x2, sp
        bl      do_debug_exception
        enable_dbg
+       ct_user_exit
        b       ret_to_user
 el0_inv:
        enable_dbg
+       ct_user_exit
        mov     x0, sp
        mov     x1, #BAD_SYNC
        mrs     x2, esr_el1
        bl      trace_hardirqs_off
 #endif
 
+       ct_user_exit
        irq_handler
 
 #ifdef CONFIG_TRACE_IRQFLAGS
 el0_svc_naked:                                 // compat entry point
        stp     x0, scno, [sp, #S_ORIG_X0]      // save the original x0 and syscall number
        enable_dbg_and_irq
+       ct_user_exit 1
 
        ldr     x16, [tsk, #TI_FLAGS]           // check for syscall hooks
        tst     x16, #_TIF_SYSCALL_WORK