diff options
author | Markus Metzger <markus.t.metzger@intel.com> | 2008-12-11 07:49:59 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-12-12 02:08:12 -0500 |
commit | c2724775ce57c98b8af9694857b941dc61056516 (patch) | |
tree | c3936699317da3233bc31e92d68cb582ec17d193 /arch/x86/kernel/process_64.c | |
parent | b0884e25fe361f2ca228808fb5fd1b74cb04e711 (diff) |
x86, bts: provide in-kernel branch-trace interface
Impact: cleanup
Move the BTS bits from ptrace.c into ds.c.
Signed-off-by: Markus Metzger <markus.t.metzger@intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/process_64.c')
-rw-r--r-- | arch/x86/kernel/process_64.c | 50 |
1 files changed, 12 insertions, 38 deletions
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index fbb321d53d34..1cfd2a4bf853 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
@@ -237,11 +237,14 @@ void exit_thread(void) | |||
237 | put_cpu(); | 237 | put_cpu(); |
238 | } | 238 | } |
239 | #ifdef CONFIG_X86_DS | 239 | #ifdef CONFIG_X86_DS |
240 | /* Free any DS contexts that have not been properly released. */ | 240 | /* Free any BTS tracers that have not been properly released. */ |
241 | if (unlikely(t->ds_ctx)) { | 241 | if (unlikely(current->bts)) { |
242 | /* we clear debugctl to make sure DS is not used. */ | 242 | ds_release_bts(current->bts); |
243 | update_debugctlmsr(0); | 243 | current->bts = NULL; |
244 | ds_free(t->ds_ctx); | 244 | |
245 | kfree(current->bts_buffer); | ||
246 | current->bts_buffer = NULL; | ||
247 | current->bts_size = 0; | ||
245 | } | 248 | } |
246 | #endif /* CONFIG_X86_DS */ | 249 | #endif /* CONFIG_X86_DS */ |
247 | } | 250 | } |
@@ -471,35 +474,14 @@ static inline void __switch_to_xtra(struct task_struct *prev_p, | |||
471 | struct tss_struct *tss) | 474 | struct tss_struct *tss) |
472 | { | 475 | { |
473 | struct thread_struct *prev, *next; | 476 | struct thread_struct *prev, *next; |
474 | unsigned long debugctl; | ||
475 | 477 | ||
476 | prev = &prev_p->thread, | 478 | prev = &prev_p->thread, |
477 | next = &next_p->thread; | 479 | next = &next_p->thread; |
478 | 480 | ||
479 | debugctl = prev->debugctlmsr; | 481 | if (test_tsk_thread_flag(next_p, TIF_DS_AREA_MSR) || |
480 | 482 | test_tsk_thread_flag(prev_p, TIF_DS_AREA_MSR)) | |
481 | #ifdef CONFIG_X86_DS | 483 | ds_switch_to(prev_p, next_p); |
482 | { | 484 | else if (next->debugctlmsr != prev->debugctlmsr) |
483 | unsigned long ds_prev = 0, ds_next = 0; | ||
484 | |||
485 | if (prev->ds_ctx) | ||
486 | ds_prev = (unsigned long)prev->ds_ctx->ds; | ||
487 | if (next->ds_ctx) | ||
488 | ds_next = (unsigned long)next->ds_ctx->ds; | ||
489 | |||
490 | if (ds_next != ds_prev) { | ||
491 | /* | ||
492 | * We clear debugctl to make sure DS | ||
493 | * is not in use when we change it: | ||
494 | */ | ||
495 | debugctl = 0; | ||
496 | update_debugctlmsr(0); | ||
497 | wrmsrl(MSR_IA32_DS_AREA, ds_next); | ||
498 | } | ||
499 | } | ||
500 | #endif /* CONFIG_X86_DS */ | ||
501 | |||
502 | if (next->debugctlmsr != debugctl) | ||
503 | update_debugctlmsr(next->debugctlmsr); | 485 | update_debugctlmsr(next->debugctlmsr); |
504 | 486 | ||
505 | if (test_tsk_thread_flag(next_p, TIF_DEBUG)) { | 487 | if (test_tsk_thread_flag(next_p, TIF_DEBUG)) { |
@@ -534,14 +516,6 @@ static inline void __switch_to_xtra(struct task_struct *prev_p, | |||
534 | */ | 516 | */ |
535 | memset(tss->io_bitmap, 0xff, prev->io_bitmap_max); | 517 | memset(tss->io_bitmap, 0xff, prev->io_bitmap_max); |
536 | } | 518 | } |
537 | |||
538 | #ifdef CONFIG_X86_PTRACE_BTS | ||
539 | if (test_tsk_thread_flag(prev_p, TIF_BTS_TRACE_TS)) | ||
540 | ptrace_bts_take_timestamp(prev_p, BTS_TASK_DEPARTS); | ||
541 | |||
542 | if (test_tsk_thread_flag(next_p, TIF_BTS_TRACE_TS)) | ||
543 | ptrace_bts_take_timestamp(next_p, BTS_TASK_ARRIVES); | ||
544 | #endif /* CONFIG_X86_PTRACE_BTS */ | ||
545 | } | 519 | } |
546 | 520 | ||
547 | /* | 521 | /* |