xref: /minix3/minix/servers/mib/hw.c (revision 25d39513e7c757eb8ae5ac9f6f9c43db7138235f)
1*25d39513SDavid van Moolenbroek /* MIB service - hw.c - implementation of the CTL_HW subtree */
2*25d39513SDavid van Moolenbroek 
3*25d39513SDavid van Moolenbroek #include "mib.h"
4*25d39513SDavid van Moolenbroek 
5*25d39513SDavid van Moolenbroek #if defined(__i386__)
6*25d39513SDavid van Moolenbroek static const char mach[] = "i386";	/* machine (cpu) type */
7*25d39513SDavid van Moolenbroek static const char arch[] = "i386";	/* architecture */
8*25d39513SDavid van Moolenbroek #elif defined(__arm__)
9*25d39513SDavid van Moolenbroek static const char mach[] = "evbarm";	/* machine (cpu) type */
10*25d39513SDavid van Moolenbroek static const char arch[] = "evbarm";	/* architecture */
11*25d39513SDavid van Moolenbroek #else
12*25d39513SDavid van Moolenbroek #error "unknown machine architecture"
13*25d39513SDavid van Moolenbroek #endif
14*25d39513SDavid van Moolenbroek 
15*25d39513SDavid van Moolenbroek /*
16*25d39513SDavid van Moolenbroek  * Implementation of CTL_HW HW_PHYSMEM/HW_PHYSMEM64.
17*25d39513SDavid van Moolenbroek  */
18*25d39513SDavid van Moolenbroek static ssize_t
mib_hw_physmem(struct mib_call * call __unused,struct mib_node * node,struct mib_oldp * oldp,struct mib_newp * newp __unused)19*25d39513SDavid van Moolenbroek mib_hw_physmem(struct mib_call * call __unused, struct mib_node * node,
20*25d39513SDavid van Moolenbroek 	struct mib_oldp * oldp, struct mib_newp * newp __unused)
21*25d39513SDavid van Moolenbroek {
22*25d39513SDavid van Moolenbroek 	struct vm_stats_info vsi;
23*25d39513SDavid van Moolenbroek 	u_quad_t physmem64;
24*25d39513SDavid van Moolenbroek 	unsigned int physmem;
25*25d39513SDavid van Moolenbroek 
26*25d39513SDavid van Moolenbroek 	if (vm_info_stats(&vsi) != OK)
27*25d39513SDavid van Moolenbroek 		return EINVAL;
28*25d39513SDavid van Moolenbroek 
29*25d39513SDavid van Moolenbroek 	physmem64 = (u_quad_t)vsi.vsi_total * vsi.vsi_pagesize;
30*25d39513SDavid van Moolenbroek 
31*25d39513SDavid van Moolenbroek 	if (node->node_size == sizeof(int)) {
32*25d39513SDavid van Moolenbroek 		if (physmem64 > UINT_MAX)
33*25d39513SDavid van Moolenbroek 			physmem = UINT_MAX;
34*25d39513SDavid van Moolenbroek 		else
35*25d39513SDavid van Moolenbroek 			physmem = (unsigned int)physmem64;
36*25d39513SDavid van Moolenbroek 
37*25d39513SDavid van Moolenbroek 		return mib_copyout(oldp, 0, &physmem, sizeof(physmem));
38*25d39513SDavid van Moolenbroek 	} else
39*25d39513SDavid van Moolenbroek 		return mib_copyout(oldp, 0, &physmem64, sizeof(physmem64));
40*25d39513SDavid van Moolenbroek }
41*25d39513SDavid van Moolenbroek 
42*25d39513SDavid van Moolenbroek /*
43*25d39513SDavid van Moolenbroek  * Implementation of CTL_HW HW_USERMEM/HW_USERMEM64.
44*25d39513SDavid van Moolenbroek  */
45*25d39513SDavid van Moolenbroek static ssize_t
mib_hw_usermem(struct mib_call * call __unused,struct mib_node * node,struct mib_oldp * oldp,struct mib_newp * newp __unused)46*25d39513SDavid van Moolenbroek mib_hw_usermem(struct mib_call * call __unused, struct mib_node * node,
47*25d39513SDavid van Moolenbroek 	struct mib_oldp * oldp, struct mib_newp * newp __unused)
48*25d39513SDavid van Moolenbroek {
49*25d39513SDavid van Moolenbroek 	struct vm_stats_info vsi;
50*25d39513SDavid van Moolenbroek 	struct vm_usage_info vui;
51*25d39513SDavid van Moolenbroek 	u_quad_t usermem64;
52*25d39513SDavid van Moolenbroek 	unsigned int usermem;
53*25d39513SDavid van Moolenbroek 
54*25d39513SDavid van Moolenbroek 	if (vm_info_stats(&vsi) != OK)
55*25d39513SDavid van Moolenbroek 		return EINVAL;
56*25d39513SDavid van Moolenbroek 
57*25d39513SDavid van Moolenbroek 	usermem64 = (u_quad_t)vsi.vsi_total * vsi.vsi_pagesize;
58*25d39513SDavid van Moolenbroek 
59*25d39513SDavid van Moolenbroek 	if (vm_info_usage(KERNEL, &vui) != OK)
60*25d39513SDavid van Moolenbroek 		return EINVAL;
61*25d39513SDavid van Moolenbroek 
62*25d39513SDavid van Moolenbroek 	if (usermem64 >= vui.vui_total)
63*25d39513SDavid van Moolenbroek 		usermem64 -= vui.vui_total;
64*25d39513SDavid van Moolenbroek 	else
65*25d39513SDavid van Moolenbroek 		usermem64 = 0;
66*25d39513SDavid van Moolenbroek 
67*25d39513SDavid van Moolenbroek 	if (node->node_size == sizeof(int)) {
68*25d39513SDavid van Moolenbroek 		if (usermem64 > UINT_MAX)
69*25d39513SDavid van Moolenbroek 			usermem = UINT_MAX;
70*25d39513SDavid van Moolenbroek 		else
71*25d39513SDavid van Moolenbroek 			usermem = (unsigned int)usermem64;
72*25d39513SDavid van Moolenbroek 
73*25d39513SDavid van Moolenbroek 		return mib_copyout(oldp, 0, &usermem, sizeof(usermem));
74*25d39513SDavid van Moolenbroek 	} else
75*25d39513SDavid van Moolenbroek 		return mib_copyout(oldp, 0, &usermem64, sizeof(usermem64));
76*25d39513SDavid van Moolenbroek }
77*25d39513SDavid van Moolenbroek 
78*25d39513SDavid van Moolenbroek /*
79*25d39513SDavid van Moolenbroek  * Implementation of CTL_HW HW_NCPUONLINE.
80*25d39513SDavid van Moolenbroek  */
81*25d39513SDavid van Moolenbroek static ssize_t
mib_hw_ncpuonline(struct mib_call * call __unused,struct mib_node * node __unused,struct mib_oldp * oldp,struct mib_newp * newp __unused)82*25d39513SDavid van Moolenbroek mib_hw_ncpuonline(struct mib_call * call __unused,
83*25d39513SDavid van Moolenbroek 	struct mib_node * node __unused, struct mib_oldp * oldp,
84*25d39513SDavid van Moolenbroek 	struct mib_newp * newp __unused)
85*25d39513SDavid van Moolenbroek {
86*25d39513SDavid van Moolenbroek 	struct machine machine;
87*25d39513SDavid van Moolenbroek 	int ncpuonline;
88*25d39513SDavid van Moolenbroek 
89*25d39513SDavid van Moolenbroek 	if (sys_getmachine(&machine) != OK)
90*25d39513SDavid van Moolenbroek 		return EINVAL;
91*25d39513SDavid van Moolenbroek 
92*25d39513SDavid van Moolenbroek 	ncpuonline = machine.processors_count;
93*25d39513SDavid van Moolenbroek 
94*25d39513SDavid van Moolenbroek 	return mib_copyout(oldp, 0, &ncpuonline, sizeof(ncpuonline));
95*25d39513SDavid van Moolenbroek }
96*25d39513SDavid van Moolenbroek 
97*25d39513SDavid van Moolenbroek /* The CTL_HW nodes. */
98*25d39513SDavid van Moolenbroek static struct mib_node mib_hw_table[] = {
99*25d39513SDavid van Moolenbroek /* 1*/	[HW_MACHINE]		= MIB_STRING(_P | _RO, mach, "machine",
100*25d39513SDavid van Moolenbroek 				    "Machine class"),
101*25d39513SDavid van Moolenbroek /* 2*/	/* HW_MODEL: not yet supported */
102*25d39513SDavid van Moolenbroek /* 3*/	[HW_NCPU]		= MIB_INT(_P | _RO, CONFIG_MAX_CPUS,
103*25d39513SDavid van Moolenbroek 				    "ncpu", "Number of CPUs configured"),
104*25d39513SDavid van Moolenbroek /* 4*/	[HW_BYTEORDER]		= MIB_INT(_P | _RO, BYTE_ORDER, "byteorder",
105*25d39513SDavid van Moolenbroek 				    "System byte order"),
106*25d39513SDavid van Moolenbroek /* 5*/	[HW_PHYSMEM]		= MIB_FUNC(_P | _RO | CTLFLAG_UNSIGNED |
107*25d39513SDavid van Moolenbroek 				    CTLTYPE_INT, sizeof(int), mib_hw_physmem,
108*25d39513SDavid van Moolenbroek 				    "physmem", "Bytes of physical memory"),
109*25d39513SDavid van Moolenbroek /* 6*/	[HW_USERMEM]		= MIB_FUNC(_P | _RO | CTLFLAG_UNSIGNED |
110*25d39513SDavid van Moolenbroek 				    CTLTYPE_INT, sizeof(int), mib_hw_usermem,
111*25d39513SDavid van Moolenbroek 				    "usermem", "Bytes of non-kernel memory"),
112*25d39513SDavid van Moolenbroek /* 7*/	[HW_PAGESIZE]		= MIB_INT(_P | _RO, PAGE_SIZE, "pagesize",
113*25d39513SDavid van Moolenbroek 				    "Software page size"),
114*25d39513SDavid van Moolenbroek /* 8*/	/* HW_DISKNAMES: not yet supported */
115*25d39513SDavid van Moolenbroek /* 9*/	/* HW_IOSTATS: not yet supported */
116*25d39513SDavid van Moolenbroek /*10*/	[HW_MACHINE_ARCH]	= MIB_STRING(_P | _RO, arch, "machine_arch",
117*25d39513SDavid van Moolenbroek 				    "Machine CPU class"),
118*25d39513SDavid van Moolenbroek /*11*/	/* HW_ALIGNBYTES: not yet supported */
119*25d39513SDavid van Moolenbroek /*12*/	/* HW_CNMAGIC: not yet supported */
120*25d39513SDavid van Moolenbroek /*13*/	[HW_PHYSMEM64]		= MIB_FUNC(_P | _RO | CTLTYPE_QUAD,
121*25d39513SDavid van Moolenbroek 				    sizeof(u_quad_t), mib_hw_physmem,
122*25d39513SDavid van Moolenbroek 				    "physmem64", "Bytes of physical memory"),
123*25d39513SDavid van Moolenbroek /*14*/	[HW_USERMEM64]		= MIB_FUNC(_P | _RO | CTLTYPE_QUAD,
124*25d39513SDavid van Moolenbroek 				    sizeof(u_quad_t), mib_hw_usermem,
125*25d39513SDavid van Moolenbroek 				    "usermem64", "Bytes of non-kernel memory"),
126*25d39513SDavid van Moolenbroek /*15*/	/* HW_IOSTATNAMES: not yet supported */
127*25d39513SDavid van Moolenbroek /*16*/	[HW_NCPUONLINE]		= MIB_FUNC(_P | _RO | CTLTYPE_INT, sizeof(int),
128*25d39513SDavid van Moolenbroek 				    mib_hw_ncpuonline, "ncpuonline",
129*25d39513SDavid van Moolenbroek 				    "Number of CPUs online"),
130*25d39513SDavid van Moolenbroek };
131*25d39513SDavid van Moolenbroek 
132*25d39513SDavid van Moolenbroek /*
133*25d39513SDavid van Moolenbroek  * Initialize the CTL_HW subtree.
134*25d39513SDavid van Moolenbroek  */
135*25d39513SDavid van Moolenbroek void
mib_hw_init(struct mib_node * node)136*25d39513SDavid van Moolenbroek mib_hw_init(struct mib_node * node)
137*25d39513SDavid van Moolenbroek {
138*25d39513SDavid van Moolenbroek 
139*25d39513SDavid van Moolenbroek 	MIB_INIT_ENODE(node, mib_hw_table);
140*25d39513SDavid van Moolenbroek }
141