Commit 272a25a2 authored by Jisheng Zhang's avatar Jisheng Zhang Committed by Daniel Lezcano

clocksource/drivers/pistachio: Fix wrong calculated clocksource read value

Let's assume the counter value is 0xf0000000, the pistachio clocksource
read cycles function should return ~0x0fffffff but actually it returns
0xffffffff0fffffff.

That occurs because:

	~(cycle_t)value is different from (cycle_t)~value.

unsigned long val = ~(unsigned long)0xf0000000;
40049a:       48 b8 ff ff ff 0f ff    movabs $0xffffffff0fffffff,%rax

unsigned long val = (unsigned long)~0xf0000000;
40049a:       48 c7 45 f8 ff ff ff    movq   $0xfffffff,-0x8(%rbp)

We fix this issue by calculating bitwise-not counter, then cast to
cycle_t.
Signed-off-by: default avatarJisheng Zhang <jszhang@marvell.com>
Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
parent 08e4b448
...@@ -84,7 +84,7 @@ pistachio_clocksource_read_cycles(struct clocksource *cs) ...@@ -84,7 +84,7 @@ pistachio_clocksource_read_cycles(struct clocksource *cs)
counter = gpt_readl(pcs->base, TIMER_CURRENT_VALUE, 0); counter = gpt_readl(pcs->base, TIMER_CURRENT_VALUE, 0);
raw_spin_unlock_irqrestore(&pcs->lock, flags); raw_spin_unlock_irqrestore(&pcs->lock, flags);
return ~(cycle_t)counter; return (cycle_t)~counter;
} }
static u64 notrace pistachio_read_sched_clock(void) static u64 notrace pistachio_read_sched_clock(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment