1/*
2 * Copyright 2013, Pawe�� Dziepak, pdziepak@quarnos.org.
3 * Copyright 2002-2008, Axel D��rfler, axeld@pinc-software.de.
4 * Distributed under the terms of the MIT License.
5 */
6
7
8#include <OS.h>
9
10#include <string.h>
11
12#include <algorithm>
13
14#include <syscalls.h>
15#include <system_info.h>
16
17
18#if _BEOS_R5_COMPATIBLE_
19
20
21#define LEGACY_B_CPU_X86			15
22
23#define LEGACY_B_AT_CLONE_PLATFORM	2
24
25typedef struct {
26	bigtime_t	active_time;	/* usec of doing useful work since boot */
27} legacy_cpu_info;
28
29typedef struct {
30	int32			id[2];				/* unique machine ID */
31	bigtime_t		boot_time;			/* time of boot (usecs since 1/1/1970) */
32
33	int32			cpu_count;			/* number of cpus */
34	int32			cpu_type;			/* type of cpu */
35	int32			cpu_revision;		/* revision # of cpu */
36	legacy_cpu_info	cpu_infos[8];		/* info about individual cpus */
37	int64			cpu_clock_speed;	/* processor clock speed (Hz) */
38	int64			bus_clock_speed;	/* bus clock speed (Hz) */
39	int32			platform_type;	/* type of machine we're on */
40
41	int32			max_pages;			/* total # of accessible pages */
42	int32			used_pages;			/* # of accessible pages in use */
43	int32			page_faults;		/* # of page faults */
44	int32			max_sems;
45	int32			used_sems;
46	int32			max_ports;
47	int32			used_ports;
48	int32			max_threads;
49	int32			used_threads;
50	int32			max_teams;
51	int32			used_teams;
52
53	char			kernel_name[256];
54	char			kernel_build_date[32];
55	char			kernel_build_time[32];
56	int64			kernel_version;
57
58	bigtime_t		_busy_wait_time;	/* reserved for whatever */
59
60	int32			cached_pages;
61	uint32			abi;				/* the system API */
62	int32			ignored_pages;		/* # of ignored/inaccessible pages */
63	int32			pad;
64} legacy_system_info;
65
66
67extern "C" status_t
68_get_system_info(legacy_system_info* info, size_t size)
69{
70	if (info == NULL || size != sizeof(legacy_system_info))
71		return B_BAD_VALUE;
72	memset(info, 0, sizeof(legacy_system_info));
73
74	system_info systemInfo;
75	status_t error = _kern_get_system_info(&systemInfo);
76	if (error != B_OK)
77		return error;
78
79	cpu_info cpuInfos[8];
80	error = _kern_get_cpu_info(0, std::min(systemInfo.cpu_count, uint32(8)),
81			cpuInfos);
82	if (error != B_OK)
83		return error;
84
85	info->boot_time = systemInfo.boot_time;
86	info->cpu_count = std::min(systemInfo.cpu_count, uint32(8));
87	for (int32 i = 0; i < info->cpu_count; i++)
88		info->cpu_infos[i].active_time = cpuInfos[i].active_time;
89
90	info->platform_type = LEGACY_B_AT_CLONE_PLATFORM;
91	info->cpu_type = LEGACY_B_CPU_X86;
92
93	uint32 topologyNodeCount = 0;
94	cpu_topology_node_info* topology = NULL;
95	error = get_cpu_topology_info(NULL, &topologyNodeCount);
96	if (error != B_OK)
97		return B_OK;
98	if (topologyNodeCount != 0) {
99		topology = new(std::nothrow) cpu_topology_node_info[topologyNodeCount];
100		if (topology == NULL)
101			return B_NO_MEMORY;
102	}
103	error = get_cpu_topology_info(topology, &topologyNodeCount);
104	if (error != B_OK) {
105		delete[] topology;
106		return error;
107	}
108
109	for (uint32 i = 0; i < topologyNodeCount; i++) {
110		if (topology[i].type == B_TOPOLOGY_CORE) {
111			info->cpu_clock_speed = topology[i].data.core.default_frequency;
112			break;
113		}
114	}
115	info->bus_clock_speed = info->cpu_clock_speed;
116	delete[] topology;
117
118	info->max_pages = std::min(systemInfo.max_pages, uint64(INT32_MAX));
119	info->used_pages = std::min(systemInfo.used_pages, uint64(INT32_MAX));
120	info->cached_pages = std::min(systemInfo.cached_pages, uint64(INT32_MAX));
121	info->ignored_pages = std::min(systemInfo.ignored_pages, uint64(INT32_MAX));
122	info->page_faults = std::min(systemInfo.page_faults, uint32(INT32_MAX));
123	info->max_sems = std::min(systemInfo.max_sems, uint32(INT32_MAX));
124	info->used_sems = std::min(systemInfo.used_sems, uint32(INT32_MAX));
125	info->max_ports = std::min(systemInfo.max_ports, uint32(INT32_MAX));
126	info->used_ports = std::min(systemInfo.used_ports, uint32(INT32_MAX));
127	info->max_threads = std::min(systemInfo.max_threads, uint32(INT32_MAX));
128	info->used_threads = std::min(systemInfo.used_threads, uint32(INT32_MAX));
129	info->max_teams = std::min(systemInfo.max_teams, uint32(INT32_MAX));
130	info->used_teams = std::min(systemInfo.used_teams, uint32(INT32_MAX));
131
132	strlcpy(info->kernel_name, systemInfo.kernel_name,
133		sizeof(info->kernel_name));
134	strlcpy(info->kernel_build_date, systemInfo.kernel_build_date,
135		sizeof(info->kernel_build_date));
136	strlcpy(info->kernel_build_time, systemInfo.kernel_build_time,
137		sizeof(info->kernel_build_time));
138	info->kernel_version = systemInfo.kernel_version;
139
140	info->abi = systemInfo.abi;
141
142	return B_OK;
143}
144
145
146#endif	// _BEOS_R5_COMPATIBLE_
147
148
149status_t
150__get_system_info(system_info* info)
151{
152	return _kern_get_system_info(info);
153}
154
155
156typedef struct {
157	bigtime_t	active_time;
158	bool		enabled;
159} beta2_cpu_info;
160
161
162extern "C" status_t
163__get_cpu_info(uint32 firstCPU, uint32 cpuCount, beta2_cpu_info* beta2_info)
164{
165	cpu_info info;
166	status_t err = _get_cpu_info_etc(firstCPU, cpuCount, &info, sizeof(info));
167	if (err == B_OK) {
168		beta2_info->active_time = info.active_time;
169		beta2_info->enabled = info.enabled;
170	}
171	return err;
172}
173
174
175status_t
176_get_cpu_info_etc(uint32 firstCPU, uint32 cpuCount, cpu_info* info,
177	size_t size)
178{
179	if (info == NULL || size != sizeof(cpu_info))
180		return B_BAD_VALUE;
181	return _kern_get_cpu_info(firstCPU, cpuCount, info);
182}
183
184
185status_t
186__get_cpu_topology_info(cpu_topology_node_info* topologyInfos,
187	uint32* topologyInfoCount)
188{
189	return _kern_get_cpu_topology_info(topologyInfos, topologyInfoCount);
190}
191
192
193status_t
194__start_watching_system(int32 object, uint32 flags, port_id port, int32 token)
195{
196	return _kern_start_watching_system(object, flags, port, token);
197}
198
199
200status_t
201__stop_watching_system(int32 object, uint32 flags, port_id port, int32 token)
202{
203	return _kern_stop_watching_system(object, flags, port, token);
204}
205
206
207int32
208is_computer_on(void)
209{
210	return _kern_is_computer_on();
211}
212
213
214double
215is_computer_on_fire(void)
216{
217	return 0.63739;
218}
219
220
221B_DEFINE_WEAK_ALIAS(__get_system_info, get_system_info);
222B_DEFINE_WEAK_ALIAS(__get_cpu_info, get_cpu_info);
223B_DEFINE_WEAK_ALIAS(__get_cpu_topology_info, get_cpu_topology_info);
224
225