1/*
2 * Copyright 2004, Axel Dörfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <libroot_private.h>
8#include <real_time_data.h>
9#include <arch_cpu.h>
10
11
12void
13__arch_init_time(struct real_time_data *data, bool setDefaults)
14{
15	uint32 conversionFactor;
16	uint64 conversionFactorNsecs;
17
18	if (setDefaults) {
19		data->arch_data.system_time_offset = 0;
20		data->arch_data.system_time_conversion_factor = 100000;
21	}
22
23	// TODO: this should only store a pointer to that value
24	// When resolving this TODO, also resolve the one in the Jamfile.
25
26	conversionFactor = data->arch_data.system_time_conversion_factor;
27	conversionFactorNsecs = (uint64)conversionFactor * 1000;
28
29	if (conversionFactorNsecs >> 32 != 0) {
30		// the TSC frequency is < 1 GHz, which forces us to shift the factor
31		__x86_setup_system_time(conversionFactor, conversionFactorNsecs >> 16,
32			true);
33	} else {
34		// the TSC frequency is >= 1 GHz
35		__x86_setup_system_time(conversionFactor, conversionFactorNsecs, false);
36	}
37}
38
39
40bigtime_t
41__arch_get_system_time_offset(struct real_time_data *data)
42{
43	//we don't use atomic_get64 because memory is read-only, maybe find another way to lock
44	return data->arch_data.system_time_offset;
45}
46
47