Massage PPC version of cpu_get_real_ticks a little
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6435 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
004c9ef410
commit
5e10fc904e
44
cpu-all.h
44
cpu-all.h
|
@ -996,30 +996,30 @@ void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
|
||||||
|
|
||||||
#if defined(_ARCH_PPC)
|
#if defined(_ARCH_PPC)
|
||||||
|
|
||||||
static inline uint32_t get_tbl(void)
|
|
||||||
{
|
|
||||||
uint32_t tbl;
|
|
||||||
asm volatile("mftb %0" : "=r" (tbl));
|
|
||||||
return tbl;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint32_t get_tbu(void)
|
|
||||||
{
|
|
||||||
uint32_t tbl;
|
|
||||||
asm volatile("mftbu %0" : "=r" (tbl));
|
|
||||||
return tbl;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int64_t cpu_get_real_ticks(void)
|
static inline int64_t cpu_get_real_ticks(void)
|
||||||
{
|
{
|
||||||
uint32_t l, h, h1;
|
int64_t retval;
|
||||||
/* NOTE: we test if wrapping has occurred */
|
#ifdef _ARCH_PPC64
|
||||||
do {
|
/* This reads timebase in one 64bit go and includes Cell workaround from:
|
||||||
h = get_tbu();
|
http://ozlabs.org/pipermail/linuxppc-dev/2006-October/027052.html
|
||||||
l = get_tbl();
|
*/
|
||||||
h1 = get_tbu();
|
__asm__ __volatile__ (
|
||||||
} while (h != h1);
|
"mftb %0\n\t"
|
||||||
return ((int64_t)h << 32) | l;
|
"cmpwi %0,0\n\t"
|
||||||
|
"beq- $-8"
|
||||||
|
: "=r" (retval));
|
||||||
|
#else
|
||||||
|
/* http://ozlabs.org/pipermail/linuxppc-dev/1999-October/003889.html */
|
||||||
|
unsigned long junk;
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"mftbu %1\n\t"
|
||||||
|
"mftb %L0\n\t"
|
||||||
|
"mftbu %0\n\t"
|
||||||
|
"cmpw %0,%1\n\t"
|
||||||
|
"bne $-16"
|
||||||
|
: "=r" (retval), "=r" (junk));
|
||||||
|
#endif
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(__i386__)
|
#elif defined(__i386__)
|
||||||
|
|
Loading…
Reference in New Issue