diff options
-rw-r--r-- | arch/tile/kernel/intvec_32.S | 5 | ||||
-rw-r--r-- | arch/tile/kernel/intvec_64.S | 5 | ||||
-rw-r--r-- | arch/tile/kernel/ptrace.c | 15 | ||||
-rw-r--r-- | arch/tile/kernel/single_step.c | 3 | ||||
-rw-r--r-- | arch/tile/kernel/traps.c | 13 | ||||
-rw-r--r-- | arch/tile/kernel/unaligned.c | 13 | ||||
-rw-r--r-- | arch/tile/mm/fault.c | 3 |
7 files changed, 16 insertions, 41 deletions
diff --git a/arch/tile/kernel/intvec_32.S b/arch/tile/kernel/intvec_32.S index 33d48812872a..9ff75e3a318a 100644 --- a/arch/tile/kernel/intvec_32.S +++ b/arch/tile/kernel/intvec_32.S | |||
@@ -572,7 +572,7 @@ intvec_\vecname: | |||
572 | } | 572 | } |
573 | wh64 r52 | 573 | wh64 r52 |
574 | 574 | ||
575 | #ifdef CONFIG_TRACE_IRQFLAGS | 575 | #if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING) |
576 | .ifnc \function,handle_nmi | 576 | .ifnc \function,handle_nmi |
577 | /* | 577 | /* |
578 | * We finally have enough state set up to notify the irq | 578 | * We finally have enough state set up to notify the irq |
@@ -588,6 +588,9 @@ intvec_\vecname: | |||
588 | { move r32, r2; move r33, r3 } | 588 | { move r32, r2; move r33, r3 } |
589 | .endif | 589 | .endif |
590 | TRACE_IRQS_OFF | 590 | TRACE_IRQS_OFF |
591 | #ifdef CONFIG_CONTEXT_TRACKING | ||
592 | jal context_tracking_user_exit | ||
593 | #endif | ||
591 | .ifnc \function,handle_syscall | 594 | .ifnc \function,handle_syscall |
592 | { move r0, r30; move r1, r31 } | 595 | { move r0, r30; move r1, r31 } |
593 | { move r2, r32; move r3, r33 } | 596 | { move r2, r32; move r3, r33 } |
diff --git a/arch/tile/kernel/intvec_64.S b/arch/tile/kernel/intvec_64.S index 080b77269ccd..3b51bdf37d11 100644 --- a/arch/tile/kernel/intvec_64.S +++ b/arch/tile/kernel/intvec_64.S | |||
@@ -753,7 +753,7 @@ intvec_\vecname: | |||
753 | } | 753 | } |
754 | wh64 r52 | 754 | wh64 r52 |
755 | 755 | ||
756 | #ifdef CONFIG_TRACE_IRQFLAGS | 756 | #if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING) |
757 | .ifnc \function,handle_nmi | 757 | .ifnc \function,handle_nmi |
758 | /* | 758 | /* |
759 | * We finally have enough state set up to notify the irq | 759 | * We finally have enough state set up to notify the irq |
@@ -769,6 +769,9 @@ intvec_\vecname: | |||
769 | { move r32, r2; move r33, r3 } | 769 | { move r32, r2; move r33, r3 } |
770 | .endif | 770 | .endif |
771 | TRACE_IRQS_OFF | 771 | TRACE_IRQS_OFF |
772 | #ifdef CONFIG_CONTEXT_TRACKING | ||
773 | jal context_tracking_user_exit | ||
774 | #endif | ||
772 | .ifnc \function,handle_syscall | 775 | .ifnc \function,handle_syscall |
773 | { move r0, r30; move r1, r31 } | 776 | { move r0, r30; move r1, r31 } |
774 | { move r2, r32; move r3, r33 } | 777 | { move r2, r32; move r3, r33 } |
diff --git a/arch/tile/kernel/ptrace.c b/arch/tile/kernel/ptrace.c index bdc126faf741..54e7b723db99 100644 --- a/arch/tile/kernel/ptrace.c +++ b/arch/tile/kernel/ptrace.c | |||
@@ -255,13 +255,6 @@ int do_syscall_trace_enter(struct pt_regs *regs) | |||
255 | { | 255 | { |
256 | u32 work = ACCESS_ONCE(current_thread_info()->flags); | 256 | u32 work = ACCESS_ONCE(current_thread_info()->flags); |
257 | 257 | ||
258 | /* | ||
259 | * If TIF_NOHZ is set, we are required to call user_exit() before | ||
260 | * doing anything that could touch RCU. | ||
261 | */ | ||
262 | if (work & _TIF_NOHZ) | ||
263 | user_exit(); | ||
264 | |||
265 | if (secure_computing() == -1) | 258 | if (secure_computing() == -1) |
266 | return -1; | 259 | return -1; |
267 | 260 | ||
@@ -281,12 +274,6 @@ void do_syscall_trace_exit(struct pt_regs *regs) | |||
281 | long errno; | 274 | long errno; |
282 | 275 | ||
283 | /* | 276 | /* |
284 | * We may come here right after calling schedule_user() | ||
285 | * in which case we can be in RCU user mode. | ||
286 | */ | ||
287 | user_exit(); | ||
288 | |||
289 | /* | ||
290 | * The standard tile calling convention returns the value (or negative | 277 | * The standard tile calling convention returns the value (or negative |
291 | * errno) in r0, and zero (or positive errno) in r1. | 278 | * errno) in r0, and zero (or positive errno) in r1. |
292 | * It saves a couple of cycles on the hot path to do this work in | 279 | * It saves a couple of cycles on the hot path to do this work in |
@@ -322,7 +309,5 @@ void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs) | |||
322 | /* Handle synthetic interrupt delivered only by the simulator. */ | 309 | /* Handle synthetic interrupt delivered only by the simulator. */ |
323 | void __kprobes do_breakpoint(struct pt_regs* regs, int fault_num) | 310 | void __kprobes do_breakpoint(struct pt_regs* regs, int fault_num) |
324 | { | 311 | { |
325 | enum ctx_state prev_state = exception_enter(); | ||
326 | send_sigtrap(current, regs); | 312 | send_sigtrap(current, regs); |
327 | exception_exit(prev_state); | ||
328 | } | 313 | } |
diff --git a/arch/tile/kernel/single_step.c b/arch/tile/kernel/single_step.c index 53f7b9def07b..862973074bf9 100644 --- a/arch/tile/kernel/single_step.c +++ b/arch/tile/kernel/single_step.c | |||
@@ -23,7 +23,6 @@ | |||
23 | #include <linux/types.h> | 23 | #include <linux/types.h> |
24 | #include <linux/err.h> | 24 | #include <linux/err.h> |
25 | #include <linux/prctl.h> | 25 | #include <linux/prctl.h> |
26 | #include <linux/context_tracking.h> | ||
27 | #include <asm/cacheflush.h> | 26 | #include <asm/cacheflush.h> |
28 | #include <asm/traps.h> | 27 | #include <asm/traps.h> |
29 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
@@ -739,7 +738,6 @@ static DEFINE_PER_CPU(unsigned long, ss_saved_pc); | |||
739 | 738 | ||
740 | void gx_singlestep_handle(struct pt_regs *regs, int fault_num) | 739 | void gx_singlestep_handle(struct pt_regs *regs, int fault_num) |
741 | { | 740 | { |
742 | enum ctx_state prev_state = exception_enter(); | ||
743 | unsigned long *ss_pc = this_cpu_ptr(&ss_saved_pc); | 741 | unsigned long *ss_pc = this_cpu_ptr(&ss_saved_pc); |
744 | struct thread_info *info = (void *)current_thread_info(); | 742 | struct thread_info *info = (void *)current_thread_info(); |
745 | int is_single_step = test_ti_thread_flag(info, TIF_SINGLESTEP); | 743 | int is_single_step = test_ti_thread_flag(info, TIF_SINGLESTEP); |
@@ -756,7 +754,6 @@ void gx_singlestep_handle(struct pt_regs *regs, int fault_num) | |||
756 | __insn_mtspr(SPR_SINGLE_STEP_CONTROL_K, control); | 754 | __insn_mtspr(SPR_SINGLE_STEP_CONTROL_K, control); |
757 | send_sigtrap(current, regs); | 755 | send_sigtrap(current, regs); |
758 | } | 756 | } |
759 | exception_exit(prev_state); | ||
760 | } | 757 | } |
761 | 758 | ||
762 | 759 | ||
diff --git a/arch/tile/kernel/traps.c b/arch/tile/kernel/traps.c index 0011a9ff0525..4d9651c5b1ad 100644 --- a/arch/tile/kernel/traps.c +++ b/arch/tile/kernel/traps.c | |||
@@ -20,7 +20,6 @@ | |||
20 | #include <linux/reboot.h> | 20 | #include <linux/reboot.h> |
21 | #include <linux/uaccess.h> | 21 | #include <linux/uaccess.h> |
22 | #include <linux/ptrace.h> | 22 | #include <linux/ptrace.h> |
23 | #include <linux/context_tracking.h> | ||
24 | #include <asm/stack.h> | 23 | #include <asm/stack.h> |
25 | #include <asm/traps.h> | 24 | #include <asm/traps.h> |
26 | #include <asm/setup.h> | 25 | #include <asm/setup.h> |
@@ -254,7 +253,6 @@ static int do_bpt(struct pt_regs *regs) | |||
254 | void __kprobes do_trap(struct pt_regs *regs, int fault_num, | 253 | void __kprobes do_trap(struct pt_regs *regs, int fault_num, |
255 | unsigned long reason) | 254 | unsigned long reason) |
256 | { | 255 | { |
257 | enum ctx_state prev_state = exception_enter(); | ||
258 | siginfo_t info = { 0 }; | 256 | siginfo_t info = { 0 }; |
259 | int signo, code; | 257 | int signo, code; |
260 | unsigned long address = 0; | 258 | unsigned long address = 0; |
@@ -263,7 +261,7 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num, | |||
263 | 261 | ||
264 | /* Handle breakpoints, etc. */ | 262 | /* Handle breakpoints, etc. */ |
265 | if (is_kernel && fault_num == INT_ILL && do_bpt(regs)) | 263 | if (is_kernel && fault_num == INT_ILL && do_bpt(regs)) |
266 | goto done; | 264 | return; |
267 | 265 | ||
268 | /* Re-enable interrupts, if they were previously enabled. */ | 266 | /* Re-enable interrupts, if they were previously enabled. */ |
269 | if (!(regs->flags & PT_FLAGS_DISABLE_IRQ)) | 267 | if (!(regs->flags & PT_FLAGS_DISABLE_IRQ)) |
@@ -277,7 +275,7 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num, | |||
277 | const char *name; | 275 | const char *name; |
278 | char buf[100]; | 276 | char buf[100]; |
279 | if (fixup_exception(regs)) /* ILL_TRANS or UNALIGN_DATA */ | 277 | if (fixup_exception(regs)) /* ILL_TRANS or UNALIGN_DATA */ |
280 | goto done; | 278 | return; |
281 | if (fault_num >= 0 && | 279 | if (fault_num >= 0 && |
282 | fault_num < ARRAY_SIZE(int_name) && | 280 | fault_num < ARRAY_SIZE(int_name) && |
283 | int_name[fault_num] != NULL) | 281 | int_name[fault_num] != NULL) |
@@ -319,7 +317,7 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num, | |||
319 | case INT_GPV: | 317 | case INT_GPV: |
320 | #if CHIP_HAS_TILE_DMA() | 318 | #if CHIP_HAS_TILE_DMA() |
321 | if (retry_gpv(reason)) | 319 | if (retry_gpv(reason)) |
322 | goto done; | 320 | return; |
323 | #endif | 321 | #endif |
324 | /*FALLTHROUGH*/ | 322 | /*FALLTHROUGH*/ |
325 | case INT_UDN_ACCESS: | 323 | case INT_UDN_ACCESS: |
@@ -346,7 +344,7 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num, | |||
346 | if (!state || | 344 | if (!state || |
347 | (void __user *)(regs->pc) != state->buffer) { | 345 | (void __user *)(regs->pc) != state->buffer) { |
348 | single_step_once(regs); | 346 | single_step_once(regs); |
349 | goto done; | 347 | return; |
350 | } | 348 | } |
351 | } | 349 | } |
352 | #endif | 350 | #endif |
@@ -390,9 +388,6 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num, | |||
390 | if (signo != SIGTRAP) | 388 | if (signo != SIGTRAP) |
391 | trace_unhandled_signal("trap", regs, address, signo); | 389 | trace_unhandled_signal("trap", regs, address, signo); |
392 | force_sig_info(signo, &info, current); | 390 | force_sig_info(signo, &info, current); |
393 | |||
394 | done: | ||
395 | exception_exit(prev_state); | ||
396 | } | 391 | } |
397 | 392 | ||
398 | void do_nmi(struct pt_regs *regs, int fault_num, unsigned long reason) | 393 | void do_nmi(struct pt_regs *regs, int fault_num, unsigned long reason) |
diff --git a/arch/tile/kernel/unaligned.c b/arch/tile/kernel/unaligned.c index d075f92ccee0..0db5f7c9d9e5 100644 --- a/arch/tile/kernel/unaligned.c +++ b/arch/tile/kernel/unaligned.c | |||
@@ -25,7 +25,6 @@ | |||
25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/compat.h> | 26 | #include <linux/compat.h> |
27 | #include <linux/prctl.h> | 27 | #include <linux/prctl.h> |
28 | #include <linux/context_tracking.h> | ||
29 | #include <asm/cacheflush.h> | 28 | #include <asm/cacheflush.h> |
30 | #include <asm/traps.h> | 29 | #include <asm/traps.h> |
31 | #include <asm/uaccess.h> | 30 | #include <asm/uaccess.h> |
@@ -1449,7 +1448,6 @@ void jit_bundle_gen(struct pt_regs *regs, tilegx_bundle_bits bundle, | |||
1449 | 1448 | ||
1450 | void do_unaligned(struct pt_regs *regs, int vecnum) | 1449 | void do_unaligned(struct pt_regs *regs, int vecnum) |
1451 | { | 1450 | { |
1452 | enum ctx_state prev_state = exception_enter(); | ||
1453 | tilegx_bundle_bits __user *pc; | 1451 | tilegx_bundle_bits __user *pc; |
1454 | tilegx_bundle_bits bundle; | 1452 | tilegx_bundle_bits bundle; |
1455 | struct thread_info *info = current_thread_info(); | 1453 | struct thread_info *info = current_thread_info(); |
@@ -1503,7 +1501,7 @@ void do_unaligned(struct pt_regs *regs, int vecnum) | |||
1503 | *((tilegx_bundle_bits *)(regs->pc))); | 1501 | *((tilegx_bundle_bits *)(regs->pc))); |
1504 | jit_bundle_gen(regs, bundle, align_ctl); | 1502 | jit_bundle_gen(regs, bundle, align_ctl); |
1505 | } | 1503 | } |
1506 | goto done; | 1504 | return; |
1507 | } | 1505 | } |
1508 | 1506 | ||
1509 | /* | 1507 | /* |
@@ -1527,7 +1525,7 @@ void do_unaligned(struct pt_regs *regs, int vecnum) | |||
1527 | 1525 | ||
1528 | trace_unhandled_signal("unaligned fixup trap", regs, 0, SIGBUS); | 1526 | trace_unhandled_signal("unaligned fixup trap", regs, 0, SIGBUS); |
1529 | force_sig_info(info.si_signo, &info, current); | 1527 | force_sig_info(info.si_signo, &info, current); |
1530 | goto done; | 1528 | return; |
1531 | } | 1529 | } |
1532 | 1530 | ||
1533 | 1531 | ||
@@ -1544,7 +1542,7 @@ void do_unaligned(struct pt_regs *regs, int vecnum) | |||
1544 | trace_unhandled_signal("segfault in unalign fixup", regs, | 1542 | trace_unhandled_signal("segfault in unalign fixup", regs, |
1545 | (unsigned long)info.si_addr, SIGSEGV); | 1543 | (unsigned long)info.si_addr, SIGSEGV); |
1546 | force_sig_info(info.si_signo, &info, current); | 1544 | force_sig_info(info.si_signo, &info, current); |
1547 | goto done; | 1545 | return; |
1548 | } | 1546 | } |
1549 | 1547 | ||
1550 | if (!info->unalign_jit_base) { | 1548 | if (!info->unalign_jit_base) { |
@@ -1579,7 +1577,7 @@ void do_unaligned(struct pt_regs *regs, int vecnum) | |||
1579 | 1577 | ||
1580 | if (IS_ERR((void __force *)user_page)) { | 1578 | if (IS_ERR((void __force *)user_page)) { |
1581 | pr_err("Out of kernel pages trying do_mmap\n"); | 1579 | pr_err("Out of kernel pages trying do_mmap\n"); |
1582 | goto done; | 1580 | return; |
1583 | } | 1581 | } |
1584 | 1582 | ||
1585 | /* Save the address in the thread_info struct */ | 1583 | /* Save the address in the thread_info struct */ |
@@ -1592,9 +1590,6 @@ void do_unaligned(struct pt_regs *regs, int vecnum) | |||
1592 | 1590 | ||
1593 | /* Generate unalign JIT */ | 1591 | /* Generate unalign JIT */ |
1594 | jit_bundle_gen(regs, GX_INSN_BSWAP(bundle), align_ctl); | 1592 | jit_bundle_gen(regs, GX_INSN_BSWAP(bundle), align_ctl); |
1595 | |||
1596 | done: | ||
1597 | exception_exit(prev_state); | ||
1598 | } | 1593 | } |
1599 | 1594 | ||
1600 | #endif /* __tilegx__ */ | 1595 | #endif /* __tilegx__ */ |
diff --git a/arch/tile/mm/fault.c b/arch/tile/mm/fault.c index 13eac59bf16a..26734214818c 100644 --- a/arch/tile/mm/fault.c +++ b/arch/tile/mm/fault.c | |||
@@ -35,7 +35,6 @@ | |||
35 | #include <linux/syscalls.h> | 35 | #include <linux/syscalls.h> |
36 | #include <linux/uaccess.h> | 36 | #include <linux/uaccess.h> |
37 | #include <linux/kdebug.h> | 37 | #include <linux/kdebug.h> |
38 | #include <linux/context_tracking.h> | ||
39 | 38 | ||
40 | #include <asm/pgalloc.h> | 39 | #include <asm/pgalloc.h> |
41 | #include <asm/sections.h> | 40 | #include <asm/sections.h> |
@@ -845,9 +844,7 @@ static inline void __do_page_fault(struct pt_regs *regs, int fault_num, | |||
845 | void do_page_fault(struct pt_regs *regs, int fault_num, | 844 | void do_page_fault(struct pt_regs *regs, int fault_num, |
846 | unsigned long address, unsigned long write) | 845 | unsigned long address, unsigned long write) |
847 | { | 846 | { |
848 | enum ctx_state prev_state = exception_enter(); | ||
849 | __do_page_fault(regs, fault_num, address, write); | 847 | __do_page_fault(regs, fault_num, address, write); |
850 | exception_exit(prev_state); | ||
851 | } | 848 | } |
852 | 849 | ||
853 | #if CHIP_HAS_TILE_DMA() | 850 | #if CHIP_HAS_TILE_DMA() |