Message ID | 71f0403498e3107af0d749484b2710d1cefd1ace.1270680209.git.rth@twiddle.net |
---|---|
State | New |
Headers | show |
On Wed, Apr 07, 2010 at 03:42:54PM -0700, Richard Henderson wrote: > A minimal implementation that more or less corresponds to the > user-level version used by target-i386. More hoops will want > to be jumped through when alpha gets system-level emulation. This patch looks ok, but it mixed host and target changes. Can you please split it? > Signed-off-by: Richard Henderson <rth@twiddle.net> > --- > qemu-timer.h | 13 +++++++++++++ > target-alpha/cpu.h | 1 - > target-alpha/op_helper.c | 5 +++-- > 3 files changed, 16 insertions(+), 3 deletions(-) > > diff --git a/qemu-timer.h b/qemu-timer.h > index d2e15f4..6e2d2e1 100644 > --- a/qemu-timer.h > +++ b/qemu-timer.h > @@ -209,6 +209,19 @@ static inline int64_t cpu_get_real_ticks(void) > return (int64_t)(count * cyc_per_count); > } > > +#elif defined(__alpha__) > + > +static inline int64_t cpu_get_real_ticks(void) > +{ > + uint64_t cc; > + uint32_t cur, ofs; > + > + asm volatile("rpcc %0" : "=r"(cc)); > + cur = cc; > + ofs = cc >> 32; > + return cur - ofs; > +} > + > #else > /* The host CPU doesn't have an easily accessible cycle counter. > Just return a monotonically increasing value. This will be > diff --git a/target-alpha/cpu.h b/target-alpha/cpu.h > index dae23e2..c2f6a50 100644 > --- a/target-alpha/cpu.h > +++ b/target-alpha/cpu.h > @@ -355,7 +355,6 @@ struct CPUAlphaState { > uint64_t ir[31]; > float64 fir[31]; > uint64_t pc; > - uint32_t pcc[2]; > uint64_t ipr[IPR_LAST]; > uint64_t ps; > uint64_t unique; > diff --git a/target-alpha/op_helper.c b/target-alpha/op_helper.c > index bfc095c..ff5ae26 100644 > --- a/target-alpha/op_helper.c > +++ b/target-alpha/op_helper.c > @@ -21,6 +21,7 @@ > #include "host-utils.h" > #include "softfloat.h" > #include "helper.h" > +#include "qemu-timer.h" > > /*****************************************************************************/ > /* Exceptions processing helpers */ > @@ -33,8 +34,8 @@ void QEMU_NORETURN helper_excp (int excp, int error) > > uint64_t helper_load_pcc (void) > { > - /* XXX: TODO */ > - return 0; > + /* ??? This isn't a timer for which we have any rate info. */ > + return (uint32_t)cpu_get_real_ticks(); > } > > uint64_t helper_load_fpcr (void) > -- > 1.6.6.1 > > > >
diff --git a/qemu-timer.h b/qemu-timer.h index d2e15f4..6e2d2e1 100644 --- a/qemu-timer.h +++ b/qemu-timer.h @@ -209,6 +209,19 @@ static inline int64_t cpu_get_real_ticks(void) return (int64_t)(count * cyc_per_count); } +#elif defined(__alpha__) + +static inline int64_t cpu_get_real_ticks(void) +{ + uint64_t cc; + uint32_t cur, ofs; + + asm volatile("rpcc %0" : "=r"(cc)); + cur = cc; + ofs = cc >> 32; + return cur - ofs; +} + #else /* The host CPU doesn't have an easily accessible cycle counter. Just return a monotonically increasing value. This will be diff --git a/target-alpha/cpu.h b/target-alpha/cpu.h index dae23e2..c2f6a50 100644 --- a/target-alpha/cpu.h +++ b/target-alpha/cpu.h @@ -355,7 +355,6 @@ struct CPUAlphaState { uint64_t ir[31]; float64 fir[31]; uint64_t pc; - uint32_t pcc[2]; uint64_t ipr[IPR_LAST]; uint64_t ps; uint64_t unique; diff --git a/target-alpha/op_helper.c b/target-alpha/op_helper.c index bfc095c..ff5ae26 100644 --- a/target-alpha/op_helper.c +++ b/target-alpha/op_helper.c @@ -21,6 +21,7 @@ #include "host-utils.h" #include "softfloat.h" #include "helper.h" +#include "qemu-timer.h" /*****************************************************************************/ /* Exceptions processing helpers */ @@ -33,8 +34,8 @@ void QEMU_NORETURN helper_excp (int excp, int error) uint64_t helper_load_pcc (void) { - /* XXX: TODO */ - return 0; + /* ??? This isn't a timer for which we have any rate info. */ + return (uint32_t)cpu_get_real_ticks(); } uint64_t helper_load_fpcr (void)
A minimal implementation that more or less corresponds to the user-level version used by target-i386. More hoops will want to be jumped through when alpha gets system-level emulation. Signed-off-by: Richard Henderson <rth@twiddle.net> --- qemu-timer.h | 13 +++++++++++++ target-alpha/cpu.h | 1 - target-alpha/op_helper.c | 5 +++-- 3 files changed, 16 insertions(+), 3 deletions(-)