Commit 5e10fc904e8645b9ffb4b042dca65c64b65f61ee
1 parent
004c9ef4
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
Showing
1 changed file
with
22 additions
and
22 deletions
cpu-all.h
| @@ -996,30 +996,30 @@ void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size); | @@ -996,30 +996,30 @@ void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size); | ||
| 996 | 996 | ||
| 997 | #if defined(_ARCH_PPC) | 997 | #if defined(_ARCH_PPC) |
| 998 | 998 | ||
| 999 | -static inline uint32_t get_tbl(void) | ||
| 1000 | -{ | ||
| 1001 | - uint32_t tbl; | ||
| 1002 | - asm volatile("mftb %0" : "=r" (tbl)); | ||
| 1003 | - return tbl; | ||
| 1004 | -} | ||
| 1005 | - | ||
| 1006 | -static inline uint32_t get_tbu(void) | ||
| 1007 | -{ | ||
| 1008 | - uint32_t tbl; | ||
| 1009 | - asm volatile("mftbu %0" : "=r" (tbl)); | ||
| 1010 | - return tbl; | ||
| 1011 | -} | ||
| 1012 | - | ||
| 1013 | static inline int64_t cpu_get_real_ticks(void) | 999 | static inline int64_t cpu_get_real_ticks(void) |
| 1014 | { | 1000 | { |
| 1015 | - uint32_t l, h, h1; | ||
| 1016 | - /* NOTE: we test if wrapping has occurred */ | ||
| 1017 | - do { | ||
| 1018 | - h = get_tbu(); | ||
| 1019 | - l = get_tbl(); | ||
| 1020 | - h1 = get_tbu(); | ||
| 1021 | - } while (h != h1); | ||
| 1022 | - return ((int64_t)h << 32) | l; | 1001 | + int64_t retval; |
| 1002 | +#ifdef _ARCH_PPC64 | ||
| 1003 | + /* This reads timebase in one 64bit go and includes Cell workaround from: | ||
| 1004 | + http://ozlabs.org/pipermail/linuxppc-dev/2006-October/027052.html | ||
| 1005 | + */ | ||
| 1006 | + __asm__ __volatile__ ( | ||
| 1007 | + "mftb %0\n\t" | ||
| 1008 | + "cmpwi %0,0\n\t" | ||
| 1009 | + "beq- $-8" | ||
| 1010 | + : "=r" (retval)); | ||
| 1011 | +#else | ||
| 1012 | + /* http://ozlabs.org/pipermail/linuxppc-dev/1999-October/003889.html */ | ||
| 1013 | + unsigned long junk; | ||
| 1014 | + __asm__ __volatile__ ( | ||
| 1015 | + "mftbu %1\n\t" | ||
| 1016 | + "mftb %L0\n\t" | ||
| 1017 | + "mftbu %0\n\t" | ||
| 1018 | + "cmpw %0,%1\n\t" | ||
| 1019 | + "bne $-16" | ||
| 1020 | + : "=r" (retval), "=r" (junk)); | ||
| 1021 | +#endif | ||
| 1022 | + return retval; | ||
| 1023 | } | 1023 | } |
| 1024 | 1024 | ||
| 1025 | #elif defined(__i386__) | 1025 | #elif defined(__i386__) |