xref: /dflybsd-src/lib/libkvm/kvm_util.c (revision 3b40b13cb855a8293b87df34a6c7652671b3358e)
124e51f36SHiten Pandya /*
29cca02b8SHiten Pandya  * Copyright (c) 2003, 2004 The DragonFly Project.  All rights reserved.
324e51f36SHiten Pandya  *
49cca02b8SHiten Pandya  * This code is derived from software contributed to The DragonFly Project
59cca02b8SHiten Pandya  * by Hiten Pandya <hmp@backplane.com>.
624e51f36SHiten Pandya  *
724e51f36SHiten Pandya  * Redistribution and use in source and binary forms, with or without
824e51f36SHiten Pandya  * modification, are permitted provided that the following conditions
924e51f36SHiten Pandya  * are met:
1024e51f36SHiten Pandya  *
1124e51f36SHiten Pandya  * 1. Redistributions of source code must retain the above copyright
129cca02b8SHiten Pandya  *    notice, this list of conditions and the following disclaimer.
1324e51f36SHiten Pandya  * 2. Redistributions in binary form must reproduce the above copyright
1424e51f36SHiten Pandya  *    notice, this list of conditions and the following disclaimer in
1524e51f36SHiten Pandya  *    the documentation and/or other materials provided with the
1624e51f36SHiten Pandya  *    distribution.
179cca02b8SHiten Pandya  * 3. Neither the name of The DragonFly Project nor the names of its
189cca02b8SHiten Pandya  *    contributors may be used to endorse or promote products derived
199cca02b8SHiten Pandya  *    from this software without specific, prior written permission.
2024e51f36SHiten Pandya  *
219cca02b8SHiten Pandya  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
229cca02b8SHiten Pandya  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
239cca02b8SHiten Pandya  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
249cca02b8SHiten Pandya  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
259cca02b8SHiten Pandya  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
269cca02b8SHiten Pandya  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
279cca02b8SHiten Pandya  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
289cca02b8SHiten Pandya  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
299cca02b8SHiten Pandya  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
309cca02b8SHiten Pandya  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
319cca02b8SHiten Pandya  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
329cca02b8SHiten Pandya  * SUCH DAMAGE.
3324e51f36SHiten Pandya  */
3424e51f36SHiten Pandya 
3524e51f36SHiten Pandya /*
3624e51f36SHiten Pandya  * Useful functions that are used across the source base for
3724e51f36SHiten Pandya  * various purpose.
3824e51f36SHiten Pandya  */
3924e51f36SHiten Pandya 
4024e51f36SHiten Pandya #include <sys/param.h>
4124e51f36SHiten Pandya #include <sys/nchstats.h>
4224e51f36SHiten Pandya #include <sys/sysctl.h>
4324e51f36SHiten Pandya #include <strings.h>
44*3b40b13cSzrj 
45*3b40b13cSzrj #include "kvm.h"
4624e51f36SHiten Pandya 
4724e51f36SHiten Pandya /*
4824e51f36SHiten Pandya  * Aggregate the per-cpu counters we retrieved via sysctl(2)
4924e51f36SHiten Pandya  * to give the total across the CPUs.  Use a nasty trick to
5024e51f36SHiten Pandya  * aggregate the counters in the structure! YYY
5124e51f36SHiten Pandya  */
5224e51f36SHiten Pandya void
kvm_nch_cpuagg(struct nchstats * unagg,struct nchstats * ttl,int cpucnt)5324e51f36SHiten Pandya kvm_nch_cpuagg(struct nchstats *unagg, struct nchstats *ttl, int cpucnt)
5424e51f36SHiten Pandya {
5524e51f36SHiten Pandya 	int i, off, siz;
5624e51f36SHiten Pandya 	siz = sizeof(struct nchstats);
5724e51f36SHiten Pandya 
5824e51f36SHiten Pandya 	if (!unagg && !ttl)
5924e51f36SHiten Pandya 		return;
6024e51f36SHiten Pandya 
6124e51f36SHiten Pandya 	bzero(ttl, siz);
6224e51f36SHiten Pandya 
6324e51f36SHiten Pandya 	/* kick hmp@ for this nasty loop! :-) */
6424e51f36SHiten Pandya 	for (i = 0; i < cpucnt; ++i) {
6524e51f36SHiten Pandya 		for (off = 0; off < siz; off += sizeof(u_long)) {
6624e51f36SHiten Pandya 			*(u_long *)((char *)(*(&ttl)) + off) +=
6724e51f36SHiten Pandya 			*(u_long *)((char *)&unagg[i] + off);
6824e51f36SHiten Pandya 		}
6924e51f36SHiten Pandya 	}
7024e51f36SHiten Pandya }
71