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
383a1e37f3SHiten Pandya #include <assert.h>
39f5d21610SJoerg Sonnenberger #include <err.h>
40f5d21610SJoerg Sonnenberger #include <errno.h>
41f5d21610SJoerg Sonnenberger #include <kcore.h>
42f5d21610SJoerg Sonnenberger #include <kvm.h>
43f5d21610SJoerg Sonnenberger #include <nlist.h>
443a1e37f3SHiten Pandya #include <stdlib.h>
45f5d21610SJoerg Sonnenberger
46f5d21610SJoerg Sonnenberger #include "kcore_private.h"
47f5d21610SJoerg Sonnenberger
48f5d21610SJoerg Sonnenberger int
kcore_get_cpus(struct kcore_data * kc,int * ncpus)49f5d21610SJoerg Sonnenberger kcore_get_cpus(struct kcore_data *kc, int *ncpus)
50f5d21610SJoerg Sonnenberger {
51f5d21610SJoerg Sonnenberger static struct nlist nl[] = {
52f5d21610SJoerg Sonnenberger { "_ncpus", 0, 0, 0, 0},
53f5d21610SJoerg Sonnenberger { NULL, 0, 0, 0, 0}
54f5d21610SJoerg Sonnenberger };
55f5d21610SJoerg Sonnenberger
56f5d21610SJoerg Sonnenberger /* XXX always include ncpus in the kernel. */
57f5d21610SJoerg Sonnenberger if (kcore_get_generic(kc, nl, ncpus, sizeof(*ncpus)))
58f5d21610SJoerg Sonnenberger *ncpus = 1;
59f5d21610SJoerg Sonnenberger return(0);
60f5d21610SJoerg Sonnenberger }
61f5d21610SJoerg Sonnenberger
62f5d21610SJoerg Sonnenberger int
kcore_get_sched_cputime(struct kcore_data * kc,struct kinfo_cputime * cputime)63f5d21610SJoerg Sonnenberger kcore_get_sched_cputime(struct kcore_data *kc, struct kinfo_cputime *cputime)
64f5d21610SJoerg Sonnenberger {
653a1e37f3SHiten Pandya struct kinfo_cputime *percpu = NULL;
66f5d21610SJoerg Sonnenberger static struct nlist nl[] = {
677827df93SHiten Pandya { "cputime_percpu", 0, 0, 0, 0},
68f5d21610SJoerg Sonnenberger { NULL, 0, 0, 0, 0}
69f5d21610SJoerg Sonnenberger };
70dba87daeSHiten Pandya size_t len;
71dba87daeSHiten Pandya int cpucount, error = 0;
72f5d21610SJoerg Sonnenberger
733a1e37f3SHiten Pandya _DIAGASSERT(cputime != NULL);
743a1e37f3SHiten Pandya
753a1e37f3SHiten Pandya error = kcore_get_cpus(kc, &cpucount);
763a1e37f3SHiten Pandya if (error)
773a1e37f3SHiten Pandya goto done;
783a1e37f3SHiten Pandya
793a1e37f3SHiten Pandya len = sizeof(*percpu) * cpucount;
803a1e37f3SHiten Pandya
813a1e37f3SHiten Pandya if ((percpu = malloc(len)) == NULL) {
823a1e37f3SHiten Pandya error = ENOMEM;
833a1e37f3SHiten Pandya goto done;
843a1e37f3SHiten Pandya }
853a1e37f3SHiten Pandya
863a1e37f3SHiten Pandya /* retrieve verbatim per-cpu statistics from kernel core */
873a1e37f3SHiten Pandya error = kcore_get_generic(kc, nl, percpu, len);
883a1e37f3SHiten Pandya if (error)
893a1e37f3SHiten Pandya goto done;
903a1e37f3SHiten Pandya
913a1e37f3SHiten Pandya /* aggregate per-cpu statistics retrieved from kernel core */
923a1e37f3SHiten Pandya cputime_pcpu_statistics(percpu, cputime, cpucount);
933a1e37f3SHiten Pandya
943a1e37f3SHiten Pandya done:
953a1e37f3SHiten Pandya if (percpu != NULL) {
963a1e37f3SHiten Pandya free(percpu);
973a1e37f3SHiten Pandya percpu = NULL;
983a1e37f3SHiten Pandya }
993a1e37f3SHiten Pandya return (error);
100f5d21610SJoerg Sonnenberger }
101f5d21610SJoerg Sonnenberger
102f5d21610SJoerg Sonnenberger int
kcore_get_sched_hz(struct kcore_data * kc,int * hz)103f5d21610SJoerg Sonnenberger kcore_get_sched_hz(struct kcore_data *kc, int *hz)
104f5d21610SJoerg Sonnenberger {
105f5d21610SJoerg Sonnenberger static struct nlist nl[] = {
106f5d21610SJoerg Sonnenberger { "_hz", 0, 0, 0, 0},
107f5d21610SJoerg Sonnenberger { NULL, 0, 0, 0, 0}
108f5d21610SJoerg Sonnenberger };
109f5d21610SJoerg Sonnenberger
110f5d21610SJoerg Sonnenberger return(kcore_get_generic(kc, nl, hz, sizeof(*hz)));
111f5d21610SJoerg Sonnenberger }
112f5d21610SJoerg Sonnenberger
113f5d21610SJoerg Sonnenberger int
kcore_get_sched_profhz(struct kcore_data * kc,int * profhz)114f5d21610SJoerg Sonnenberger kcore_get_sched_profhz(struct kcore_data *kc, int *profhz)
115f5d21610SJoerg Sonnenberger {
116f5d21610SJoerg Sonnenberger static struct nlist nl[] = {
117f5d21610SJoerg Sonnenberger { "_profhz", 0, 0, 0, 0},
118f5d21610SJoerg Sonnenberger { NULL, 0, 0, 0, 0}
119f5d21610SJoerg Sonnenberger };
120f5d21610SJoerg Sonnenberger
121f5d21610SJoerg Sonnenberger return(kcore_get_generic(kc, nl, profhz, sizeof(*profhz)));
122f5d21610SJoerg Sonnenberger }
123f5d21610SJoerg Sonnenberger
124f5d21610SJoerg Sonnenberger int
kcore_get_sched_stathz(struct kcore_data * kc,int * stathz)125f5d21610SJoerg Sonnenberger kcore_get_sched_stathz(struct kcore_data *kc, int *stathz)
126f5d21610SJoerg Sonnenberger {
127f5d21610SJoerg Sonnenberger static struct nlist nl[] = {
128f5d21610SJoerg Sonnenberger { "_stathz", 0, 0, 0, 0},
129f5d21610SJoerg Sonnenberger { NULL, 0, 0, 0, 0}
130f5d21610SJoerg Sonnenberger };
131f5d21610SJoerg Sonnenberger int retval;
132f5d21610SJoerg Sonnenberger
133*fc6d0222SSascha Wildner retval = kcore_get_generic(kc, nl, stathz, sizeof(*stathz));
134f5d21610SJoerg Sonnenberger if (retval == 0 && *stathz == 0)
135f5d21610SJoerg Sonnenberger return(kcore_get_sched_hz(kc, stathz));
136f5d21610SJoerg Sonnenberger return(retval);
137f5d21610SJoerg Sonnenberger }
138