haiku/headers/private/kernel/arch/ppc/arch_real_time_data.h
Ingo Weinhold 262e0a636b We use the same strategy for computing the system time as on x86 now.
The time base conversion factor is the 32 bit value
  2^32 * 1000000 / time base frequency,
so the system time can be computed by
  system time = time base * conversion factor / 2^32.
The expression in system_time() looks more complicated now, but is
actually much faster (factor 2.5 on my Mac mini). I'm positively
surprised, how good the assembly looks, that GCC 4 generates. There's
not that much potential for optimization by hand-coding the function.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15863 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-01-07 23:05:56 +00:00

37 lines
1.4 KiB
C

/*
* Copyright 2006, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
* All rights reserved. Distributed under the terms of the MIT License.
*/
#ifndef _KERNEL_ARCH_REAL_TIME_DATA_H
#define _KERNEL_ARCH_REAL_TIME_DATA_H
#include <StorageDefs.h>
#include <SupportDefs.h>
struct ppc_real_time_data {
vint64 system_time_offset;
};
struct arch_real_time_data {
struct ppc_real_time_data data[2];
vint32 system_time_conversion_factor;
vint32 version;
// Since there're no cheap atomic_{set,get,add}64() on PPC 32 (i.e. one
// that doesn't involve a syscall), we can't have just a single
// system_time_offset and set/get it atomically.
// That's why have our data twice. One set is current (indexed by
// version % 2). When setting the offset, we do that with disabled
// interrupts and protected by a spinlock. We write the new values
// into the other array element and increment the version.
// A reader first reads the version, then the date of interest, and
// finally rechecks the version. If it hasn't changed in the meantime,
// the read value is fine, otherwise it runs the whole procedure again.
//
// system_time_conversion_factor is currently consider constant,
// although that is not necessarily true. We simply don't support
// changing conversion factors at the moment.
};
#endif /* _KERNEL_ARCH_REAL_TIME_DATA_H */