diff options
author | Ronald G. Minnich <rminnich@gmail.com> | 2013-05-08 17:08:55 +0200 |
---|---|---|
committer | Ronald G. Minnich <rminnich@gmail.com> | 2013-05-25 14:22:06 +0200 |
commit | 5750fddcba16101e39bf9ec739d9a8bc8e2c0ae9 (patch) | |
tree | edf7dcb2d0fd756a784a547d6163f8f8c412bcd8 /src/include/cpu/x86 | |
parent | 60c54cc017becb842156644bcda2591a13ba10bc (diff) |
Intel GM45, 945, SNB: Move `multiply_to_tsc()` to `tsc.h`
multiply_to_tsc was being copied everywhere, which is bad
practice. Put it in the tsc.h include file where it belongs.
Delete the copies of it.
Per secunet, no copyright notice is needed.
This might be a good time to get a copyright notice into tsc.h
anyway.
Change-Id: Ied0013ad4b1a9e5e2b330614bb867fd806f9a407
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Reviewed-on: http://review.coreboot.org/3242
Tested-by: build bot (Jenkins)
Reviewed-by: Nico Huber <nico.huber@secunet.com>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Diffstat (limited to 'src/include/cpu/x86')
-rw-r--r-- | src/include/cpu/x86/tsc.h | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/include/cpu/x86/tsc.h b/src/include/cpu/x86/tsc.h index 8e49a669eb..66451ad711 100644 --- a/src/include/cpu/x86/tsc.h +++ b/src/include/cpu/x86/tsc.h @@ -27,6 +27,19 @@ static inline tsc_t rdtsc(void) } #if !defined(__ROMCC__) +/* Simple 32- to 64-bit multiplication. Uses 16-bit words to avoid overflow. + * This code is used to prevent use of libgcc's umoddi3. + */ +static inline void multiply_to_tsc(tsc_t *const tsc, const u32 a, const u32 b) +{ + tsc->lo = (a & 0xffff) * (b & 0xffff); + tsc->hi = ((tsc->lo >> 16) + + ((a & 0xffff) * (b >> 16)) + + ((b & 0xffff) * (a >> 16))); + tsc->lo = ((tsc->hi & 0xffff) << 16) | (tsc->lo & 0xffff); + tsc->hi = ((a >> 16) * (b >> 16)) + (tsc->hi >> 16); +} + /* Too many registers for ROMCC */ static inline unsigned long long rdtscll(void) { |