diff options
author | Markus Metzger <markus.t.metzger@intel.com> | 2008-01-30 13:31:20 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 13:31:20 +0100 |
commit | 3c68904fee1459b6d51040864e15d19098eedef7 (patch) | |
tree | 5891ac83e6f09d1ef722629a7c0be56a3b1c0a0e /arch/x86 | |
parent | 2f4aaf53c21e644ba0f581ce62b985d767388c64 (diff) |
x86, ptrace: use jiffies for BTS timestamps
Replace sched_clock() with jiffies for BTS timestamps.
Signed-off-by: Markus Metzger <markus.t.metzger@intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/kernel/ds.c | 30 | ||||
-rw-r--r-- | arch/x86/kernel/ptrace.c | 2 |
2 files changed, 11 insertions, 21 deletions
diff --git a/arch/x86/kernel/ds.c b/arch/x86/kernel/ds.c index 996a7c4f596..e7855def97c 100644 --- a/arch/x86/kernel/ds.c +++ b/arch/x86/kernel/ds.c @@ -167,23 +167,13 @@ static inline void set_info_type(char *base, unsigned char value) { (*(unsigned char *)(base + ds_cfg.info_type.offset)) = value; } -/* - * The info data might overlap with the info type on some architectures. - * We therefore read and write the exact number of bytes. - */ -static inline unsigned long long get_info_data(char *base) +static inline unsigned long get_info_data(char *base) { - unsigned long long value = 0; - memcpy(&value, - base + ds_cfg.info_data.offset, - ds_cfg.info_data.size); - return value; + return *(unsigned long *)(base + ds_cfg.info_data.offset); } -static inline void set_info_data(char *base, unsigned long long value) +static inline void set_info_data(char *base, unsigned long value) { - memcpy(base + ds_cfg.info_data.offset, - &value, - ds_cfg.info_data.size); + (*(unsigned long *)(base + ds_cfg.info_data.offset)) = value; } @@ -282,8 +272,8 @@ int ds_read_bts(void *ds, size_t index, struct bts_struct *out) memset(out, 0, sizeof(*out)); if (get_from_ip(bts) == BTS_ESCAPE_ADDRESS) { - out->qualifier = get_info_type(bts); - out->variant.timestamp = get_info_data(bts); + out->qualifier = get_info_type(bts); + out->variant.jiffies = get_info_data(bts); } else { out->qualifier = BTS_BRANCH; out->variant.lbr.from_ip = get_from_ip(bts); @@ -319,7 +309,7 @@ int ds_write_bts(void *ds, const struct bts_struct *in) case BTS_TASK_DEPARTS: set_from_ip(bts, BTS_ESCAPE_ADDRESS); set_info_type(bts, in->qualifier); - set_info_data(bts, in->variant.timestamp); + set_info_data(bts, in->variant.jiffies); break; default: @@ -350,7 +340,7 @@ static const struct ds_configuration ds_cfg_netburst = { .from_ip = { 0, 4 }, .to_ip = { 4, 4 }, .info_type = { 4, 1 }, - .info_data = { 5, 7 }, + .info_data = { 8, 4 }, .debugctl_mask = (1<<2)|(1<<3) }; @@ -364,7 +354,7 @@ static const struct ds_configuration ds_cfg_pentium_m = { .from_ip = { 0, 4 }, .to_ip = { 4, 4 }, .info_type = { 4, 1 }, - .info_data = { 5, 7 }, + .info_data = { 8, 4 }, .debugctl_mask = (1<<6)|(1<<7) }; #endif /* _i386_ */ @@ -379,7 +369,7 @@ static const struct ds_configuration ds_cfg_core2 = { .from_ip = { 0, 8 }, .to_ip = { 8, 8 }, .info_type = { 8, 1 }, - .info_data = { 9, 7 }, + .info_data = { 16, 8 }, .debugctl_mask = (1<<6)|(1<<7)|(1<<9) }; diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index 8d0dd8b5eff..ec86abaab53 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c @@ -616,7 +616,7 @@ void ptrace_bts_take_timestamp(struct task_struct *tsk, { struct bts_struct rec = { .qualifier = qualifier, - .variant.timestamp = sched_clock() + .variant.jiffies = jiffies }; if (ptrace_bts_get_buffer_size(tsk) <= 0) |