libroot/x86_64: rewrite system_time[_nsecs]() to C++
No functional change intended, just code deobfuscation. Signed-off-by: Paweł Dziepak <[email protected]>
This commit is contained in:
@@ -14,8 +14,7 @@ SEARCH_SOURCE += [ FDirName $(librootSources) os arch generic ] ;
|
|||||||
|
|
||||||
KernelMergeObject kernel_os_arch_$(TARGET_ARCH).o :
|
KernelMergeObject kernel_os_arch_$(TARGET_ARCH).o :
|
||||||
byteorder.S
|
byteorder.S
|
||||||
system_time_asm.S
|
system_time.cpp
|
||||||
system_time.c
|
|
||||||
|
|
||||||
generic_atomic.cpp
|
generic_atomic.cpp
|
||||||
: $(TARGET_KERNEL_PIC_CCFLAGS)
|
: $(TARGET_KERNEL_PIC_CCFLAGS)
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ for architectureObject in [ MultiArchSubDirSetup x86_64 ] {
|
|||||||
byteorder.S
|
byteorder.S
|
||||||
get_stack_frame.S
|
get_stack_frame.S
|
||||||
system_info.cpp
|
system_info.cpp
|
||||||
system_time_asm.S
|
system_time.cpp
|
||||||
thread.cpp
|
thread.cpp
|
||||||
time.cpp
|
time.cpp
|
||||||
tls.cpp
|
tls.cpp
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
/*
|
|
||||||
Just a dummy to avoid a special case in the build system. system_time()
|
|
||||||
is implemented in system_time_asm.S.
|
|
||||||
*/
|
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014, Paweł Dziepak, [email protected].
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
static uint64_t cv_factor;
|
||||||
|
static uint64_t cv_factor_nsec;
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
__x86_setup_system_time(uint64_t cv, uint64_t cv_nsec)
|
||||||
|
{
|
||||||
|
cv_factor = cv;
|
||||||
|
cv_factor_nsec = cv_nsec;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline uint64_t
|
||||||
|
rdtsc()
|
||||||
|
{
|
||||||
|
uint64_t lo, hi;
|
||||||
|
__asm__("rdtsc" : "=a" (lo), "=d" (hi));
|
||||||
|
return lo | (hi << 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" [[gnu::optimize("omit-frame-pointer")]] int64_t
|
||||||
|
system_time()
|
||||||
|
{
|
||||||
|
__uint128_t time = static_cast<__uint128_t>(rdtsc()) * cv_factor;
|
||||||
|
return time >> 64;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" [[gnu::optimize("omit-frame-pointer")]] int64_t
|
||||||
|
system_time_nsecs()
|
||||||
|
{
|
||||||
|
__uint128_t t = static_cast<__uint128_t>(rdtsc()) * cv_factor_nsec;
|
||||||
|
return t >> 32;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
|
|
||||||
* Copyright 2012, Alex Smith, alex@alex-smith.me.uk.
|
|
||||||
* Distributed under the terms of the MIT License.
|
|
||||||
*
|
|
||||||
* Copyright 2001, Travis Geiselbrecht. All rights reserved.
|
|
||||||
* Distributed under the terms of the NewOS License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <asm_defs.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* saves the conversion factor needed for system_time */
|
|
||||||
.lcomm cv_factor 8
|
|
||||||
.lcomm cv_factor_nsecs 8
|
|
||||||
|
|
||||||
|
|
||||||
.text
|
|
||||||
|
|
||||||
|
|
||||||
FUNCTION(__x86_setup_system_time):
|
|
||||||
movq %rdi, cv_factor(%rip)
|
|
||||||
movq %rsi, cv_factor_nsecs(%rip)
|
|
||||||
ret
|
|
||||||
FUNCTION_END(__x86_setup_system_time)
|
|
||||||
|
|
||||||
|
|
||||||
/* int64 system_time(); */
|
|
||||||
FUNCTION(system_time):
|
|
||||||
// (rdtsc * cv_factor) >> 32.
|
|
||||||
// Factor is pre-shifted left by 32 bits.
|
|
||||||
|
|
||||||
movq cv_factor(%rip), %rcx
|
|
||||||
|
|
||||||
// Load 64-bit TSC into %eax (low), %edx (high).
|
|
||||||
rdtsc
|
|
||||||
|
|
||||||
// Convert into a single 64-bit value.
|
|
||||||
shl $32, %rdx
|
|
||||||
orq %rdx, %rax
|
|
||||||
|
|
||||||
// Multiply by conversion factor, result in %rax (low), %rdx (high).
|
|
||||||
mulq %rcx
|
|
||||||
|
|
||||||
// Due to pre-shifting of the factor the whole result in high.
|
|
||||||
movq %rdx, %rax
|
|
||||||
ret
|
|
||||||
FUNCTION_END(system_time)
|
|
||||||
|
|
||||||
|
|
||||||
/* int64 system_time_nsecs(); */
|
|
||||||
FUNCTION(system_time_nsecs):
|
|
||||||
// Same algorithm as system_time(), but with a different factor.
|
|
||||||
// (rdtsc * cv_factor_nsecs) >> 32.
|
|
||||||
// Factor has not been pre-shifted here, otherwise we may lose the upper
|
|
||||||
// 32 bits.
|
|
||||||
|
|
||||||
movq cv_factor_nsecs(%rip), %rcx
|
|
||||||
|
|
||||||
// Load 64-bit TSC into %eax (low), %edx (high).
|
|
||||||
rdtsc
|
|
||||||
|
|
||||||
// Convert into a single 64-bit value.
|
|
||||||
shl $32, %rdx
|
|
||||||
orq %rdx, %rax
|
|
||||||
|
|
||||||
// Multiply by conversion factor, result in %rax (low), %rdx (high).
|
|
||||||
mulq %rcx
|
|
||||||
|
|
||||||
// Shift the result right by 32 bits.
|
|
||||||
shr $32, %rax
|
|
||||||
shl $32, %rdx
|
|
||||||
orq %rdx, %rax
|
|
||||||
ret
|
|
||||||
FUNCTION_END(system_time_nsecs)
|
|
||||||
Reference in New Issue
Block a user