1f5d21610SJoerg Sonnenberger /*
2f5d21610SJoerg Sonnenberger * Copyright (c) 2004 The DragonFly Project. All rights reserved.
3f5d21610SJoerg Sonnenberger *
4f5d21610SJoerg Sonnenberger * This code is derived from software contributed to The DragonFly Project
5f5d21610SJoerg Sonnenberger * by Joerg Sonnenberger <joerg@bec.de>.
6f5d21610SJoerg Sonnenberger *
7f5d21610SJoerg Sonnenberger * Redistribution and use in source and binary forms, with or without
8f5d21610SJoerg Sonnenberger * modification, are permitted provided that the following conditions
9f5d21610SJoerg Sonnenberger * are met:
10f5d21610SJoerg Sonnenberger *
11f5d21610SJoerg Sonnenberger * 1. Redistributions of source code must retain the above copyright
12f5d21610SJoerg Sonnenberger * notice, this list of conditions and the following disclaimer.
13f5d21610SJoerg Sonnenberger * 2. Redistributions in binary form must reproduce the above copyright
14f5d21610SJoerg Sonnenberger * notice, this list of conditions and the following disclaimer in
15f5d21610SJoerg Sonnenberger * the documentation and/or other materials provided with the
16f5d21610SJoerg Sonnenberger * distribution.
17f5d21610SJoerg Sonnenberger * 3. Neither the name of The DragonFly Project nor the names of its
18f5d21610SJoerg Sonnenberger * contributors may be used to endorse or promote products derived
19f5d21610SJoerg Sonnenberger * from this software without specific, prior written permission.
20f5d21610SJoerg Sonnenberger *
21f5d21610SJoerg Sonnenberger * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22f5d21610SJoerg Sonnenberger * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23f5d21610SJoerg Sonnenberger * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24f5d21610SJoerg Sonnenberger * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25f5d21610SJoerg Sonnenberger * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26f5d21610SJoerg Sonnenberger * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27f5d21610SJoerg Sonnenberger * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28f5d21610SJoerg Sonnenberger * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29f5d21610SJoerg Sonnenberger * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30f5d21610SJoerg Sonnenberger * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31f5d21610SJoerg Sonnenberger * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32f5d21610SJoerg Sonnenberger * SUCH DAMAGE.
33f5d21610SJoerg Sonnenberger */
34f5d21610SJoerg Sonnenberger
35abae1c58SMatthew Dillon #include <sys/kinfo.h>
36f5d21610SJoerg Sonnenberger #include <sys/param.h>
37f5d21610SJoerg Sonnenberger #include <sys/sysctl.h>
38f5d21610SJoerg Sonnenberger
39*d21b845bSHiten Pandya #include <assert.h>
407827df93SHiten Pandya #include <stdlib.h>
417827df93SHiten Pandya #include <errno.h>
42f5d21610SJoerg Sonnenberger #include <kinfo.h>
43f5d21610SJoerg Sonnenberger
44f5d21610SJoerg Sonnenberger int
kinfo_get_cpus(int * ncpus)45f5d21610SJoerg Sonnenberger kinfo_get_cpus(int *ncpus)
46f5d21610SJoerg Sonnenberger {
47f5d21610SJoerg Sonnenberger size_t len = sizeof(*ncpus);
48f5d21610SJoerg Sonnenberger
49f5d21610SJoerg Sonnenberger return(sysctlbyname("hw.ncpu", ncpus, &len, NULL, 0));
50f5d21610SJoerg Sonnenberger }
51f5d21610SJoerg Sonnenberger
52f5d21610SJoerg Sonnenberger int
kinfo_get_sched_cputime(struct kinfo_cputime * cputime)53f5d21610SJoerg Sonnenberger kinfo_get_sched_cputime(struct kinfo_cputime *cputime)
54f5d21610SJoerg Sonnenberger {
557827df93SHiten Pandya struct kinfo_cputime *percpu = NULL;
567827df93SHiten Pandya size_t len = sizeof(struct kinfo_cputime) * SMP_MAXCPU;
577827df93SHiten Pandya int cpucount, error = 0;
58f5d21610SJoerg Sonnenberger
59*d21b845bSHiten Pandya _DIAGASSERT(cputime != NULL);
607827df93SHiten Pandya
617827df93SHiten Pandya if ((percpu = malloc(len)) == NULL) {
627827df93SHiten Pandya error = ENOMEM;
637827df93SHiten Pandya goto done;
647827df93SHiten Pandya }
657827df93SHiten Pandya
667827df93SHiten Pandya /* retrieve verbatim per-cpu statistics from kernel */
677827df93SHiten Pandya if (sysctlbyname("kern.cputime", percpu, &len, NULL, 0) < 0) {
687827df93SHiten Pandya error = errno;
697827df93SHiten Pandya goto done;
707827df93SHiten Pandya } else {
71*d21b845bSHiten Pandya percpu = reallocf(percpu, len);
727827df93SHiten Pandya if (percpu == NULL) {
737827df93SHiten Pandya error = ENOMEM;
747827df93SHiten Pandya goto done;
757827df93SHiten Pandya }
767827df93SHiten Pandya }
777827df93SHiten Pandya
787827df93SHiten Pandya /* aggregate per-cpu statistics retrieved from kernel */
797827df93SHiten Pandya cpucount = len / sizeof(struct kinfo_cputime);
807827df93SHiten Pandya cputime_pcpu_statistics(percpu, cputime, cpucount);
817827df93SHiten Pandya
827827df93SHiten Pandya done:
837827df93SHiten Pandya if (percpu != NULL)
847827df93SHiten Pandya free(percpu);
857827df93SHiten Pandya return (error);
86f5d21610SJoerg Sonnenberger }
87f5d21610SJoerg Sonnenberger
88f5d21610SJoerg Sonnenberger int
kinfo_get_sched_hz(int * hz)89f5d21610SJoerg Sonnenberger kinfo_get_sched_hz(int *hz)
90f5d21610SJoerg Sonnenberger {
91f5d21610SJoerg Sonnenberger struct kinfo_clockinfo clockinfo;
92f5d21610SJoerg Sonnenberger size_t len = sizeof(clockinfo);
93f5d21610SJoerg Sonnenberger int retval;
94f5d21610SJoerg Sonnenberger
95f5d21610SJoerg Sonnenberger retval = sysctlbyname("kern.clockrate", &clockinfo, &len, NULL, 0);
96f5d21610SJoerg Sonnenberger if (retval)
97f5d21610SJoerg Sonnenberger return(retval);
98f5d21610SJoerg Sonnenberger
99f5d21610SJoerg Sonnenberger *hz = clockinfo.ci_hz;
100f5d21610SJoerg Sonnenberger return(0);
101f5d21610SJoerg Sonnenberger }
102f5d21610SJoerg Sonnenberger
103f5d21610SJoerg Sonnenberger int
kinfo_get_sched_stathz(int * stathz)104f5d21610SJoerg Sonnenberger kinfo_get_sched_stathz(int *stathz)
105f5d21610SJoerg Sonnenberger {
106f5d21610SJoerg Sonnenberger struct kinfo_clockinfo clockinfo;
107f5d21610SJoerg Sonnenberger size_t len = sizeof(clockinfo);
108f5d21610SJoerg Sonnenberger int retval;
109f5d21610SJoerg Sonnenberger
110f5d21610SJoerg Sonnenberger retval = sysctlbyname("kern.clockrate", &clockinfo, &len, NULL, 0);
111f5d21610SJoerg Sonnenberger if (retval)
112f5d21610SJoerg Sonnenberger return(retval);
113f5d21610SJoerg Sonnenberger
114f5d21610SJoerg Sonnenberger *stathz = clockinfo.ci_stathz;
115f5d21610SJoerg Sonnenberger return(0);
116f5d21610SJoerg Sonnenberger }
117f5d21610SJoerg Sonnenberger
118f5d21610SJoerg Sonnenberger int
kinfo_get_sched_profhz(int * profhz)119f5d21610SJoerg Sonnenberger kinfo_get_sched_profhz(int *profhz)
120f5d21610SJoerg Sonnenberger {
121f5d21610SJoerg Sonnenberger struct kinfo_clockinfo clockinfo;
122f5d21610SJoerg Sonnenberger size_t len = sizeof(clockinfo);
123f5d21610SJoerg Sonnenberger int retval;
124f5d21610SJoerg Sonnenberger
125f5d21610SJoerg Sonnenberger retval = sysctlbyname("kern.clockrate", &clockinfo, &len, NULL, 0);
126f5d21610SJoerg Sonnenberger if (retval)
127f5d21610SJoerg Sonnenberger return(retval);
128f5d21610SJoerg Sonnenberger
129f5d21610SJoerg Sonnenberger *profhz = clockinfo.ci_profhz;
130f5d21610SJoerg Sonnenberger return(0);
131f5d21610SJoerg Sonnenberger }
132