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