summaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
diff options
context:
space:
mode:
authorMarkus Metzger <markus.t.metzger@intel.com>2008-01-30 13:31:20 +0100
committerIngo Molnar <mingo@elte.hu>2008-01-30 13:31:20 +0100
commit3c68904fee1459b6d51040864e15d19098eedef7 (patch)
tree5891ac83e6f09d1ef722629a7c0be56a3b1c0a0e /arch/x86/kernel
parent2f4aaf53c21e644ba0f581ce62b985d767388c64 (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/kernel')
-rw-r--r--arch/x86/kernel/ds.c30
-rw-r--r--arch/x86/kernel/ptrace.c2
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)