1/*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
7 * Reserved.  This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 1.0 (the 'License').  You may not use this file
10 * except in compliance with the License.  Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
12 * this file.
13 *
14 * The Original Code and all software distributed under the License are
15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
19 * License for the specific language governing rights and limitations
20 * under the License."
21 *
22 * @APPLE_LICENSE_HEADER_END@
23 */
24/*
25 * Mach Operating System
26 * Copyright (c) 1990 Carnegie-Mellon University
27 * All rights reserved.  The CMU software License Agreement specifies
28 * the terms and conditions for use and redistribution.
29 */
30/*
31 *	File:	hostinfo.c
32 *	Author:	Avadis Tevanian, Jr.
33 *
34 *	Copyright (C) 1987, Avadis Tevanian, Jr.
35 *
36 *	Display information about the host this program is
37 *	execting on.
38 */
39
40#include <mach/mach.h>
41#include <mach/mach_error.h>
42#include <sys/sysctl.h>
43#include <sys/errno.h>
44#include <stdio.h>
45#include <stdlib.h>
46
47struct host_basic_info	hi;
48kernel_version_t	version;
49int			slots[1024];
50
51int main(int argc, char *argv[])
52{
53	kern_return_t		ret;
54	unsigned int		size, count;
55	char			*cpu_name, *cpu_subname;
56	int			i;
57	int 			mib[2];
58	size_t			len;
59	uint64_t		memsize;
60	processor_set_name_port_t		default_pset;
61	host_name_port_t			host;
62	struct processor_set_basic_info	basic_info;
63	struct processor_set_load_info	load_info;
64
65	host = mach_host_self();
66	ret = host_kernel_version(host, version);
67	if (ret != KERN_SUCCESS) {
68		mach_error(argv[0], ret);
69                exit(EXIT_FAILURE);
70	}
71	printf("Mach kernel version:\n\t %s\n", version);
72	size = sizeof(hi)/sizeof(int);
73	ret = host_info(host, HOST_BASIC_INFO, (host_info_t)&hi, &size);
74	if (ret != KERN_SUCCESS) {
75		mach_error(argv[0], ret);
76                exit(EXIT_FAILURE);
77	}
78
79	ret = processor_set_default(host, &default_pset);
80	if (ret != KERN_SUCCESS) {
81		mach_error(argv[0], ret);
82                exit(EXIT_FAILURE);
83	}
84
85	count = PROCESSOR_SET_BASIC_INFO_COUNT;
86	ret = processor_set_info(default_pset, PROCESSOR_SET_BASIC_INFO,
87		&host, (processor_set_info_t)&basic_info, &count);
88	if (ret != KERN_SUCCESS) {
89		mach_error(argv[0], ret);
90                exit(EXIT_FAILURE);
91	}
92
93	count = PROCESSOR_SET_LOAD_INFO_COUNT;
94	ret = processor_set_statistics(default_pset, PROCESSOR_SET_LOAD_INFO,
95		(processor_set_info_t)&load_info, &count);
96	if (ret != KERN_SUCCESS) {
97		mach_error(argv[0], ret);
98                exit(EXIT_FAILURE);
99	}
100
101	mib[0] = CTL_HW;
102	mib[1] = HW_MEMSIZE;
103	len = sizeof(memsize);
104	memsize = 0L;
105	if(sysctl(mib, 2, &memsize, &len, NULL, 0 ) == -1)
106	{
107	    perror("sysctl");
108	    exit(EXIT_FAILURE);
109	}
110
111
112	if (hi.max_cpus > 1)
113		printf("Kernel configured for up to %d processors.\n",
114			hi.max_cpus);
115	else
116		printf("Kernel configured for a single processor only.\n");
117	printf("%d processor%s physically available.\n", hi.physical_cpu,
118		(hi.physical_cpu > 1) ? "s are" : " is");
119
120	printf("%d processor%s logically available.\n", hi.logical_cpu,
121		(hi.logical_cpu > 1) ? "s are" : " is");
122
123	printf("Processor type:");
124	slot_name(hi.cpu_type, hi.cpu_subtype, &cpu_name, &cpu_subname);
125	printf(" %s (%s)\n", cpu_name, cpu_subname);
126
127	printf("Processor%s active:", (hi.avail_cpus > 1) ? "s" : "");
128	for (i = 0; i < hi.avail_cpus; i++)
129		printf(" %d", i);
130	printf("\n");
131
132	if (((float)memsize / (1024.0 * 1024.0)) >= 1024.0)
133	    printf("Primary memory available: %.2f gigabytes\n",
134	      (float)memsize/(1024.0*1024.0*1024.0));
135	else
136	    printf("Primary memory available: %.2f megabytes\n",
137	      (float)memsize/(1024.0*1024.0));
138
139	printf("Default processor set: %d tasks, %d threads, %d processors\n",
140		load_info.task_count, load_info.thread_count, basic_info.processor_count);
141	printf("Load average: %d.%02d, Mach factor: %d.%02d\n",
142		load_info.load_average/LOAD_SCALE,
143		(load_info.load_average%LOAD_SCALE)/10,
144		load_info.mach_factor/LOAD_SCALE,
145		(load_info.mach_factor%LOAD_SCALE)/10);
146
147	exit(0);
148}
149
150