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