1ff87ae35SJohn Baldwin /* 2ff87ae35SJohn Baldwin * Copyright (c) 2013 Hudson River Trading LLC 3ff87ae35SJohn Baldwin * Written by: John H. Baldwin <jhb@FreeBSD.org> 4ff87ae35SJohn Baldwin * All rights reserved. 5ff87ae35SJohn Baldwin * 6ff87ae35SJohn Baldwin * Redistribution and use in source and binary forms, with or without 7ff87ae35SJohn Baldwin * modification, are permitted provided that the following conditions 8ff87ae35SJohn Baldwin * are met: 9ff87ae35SJohn Baldwin * 1. Redistributions of source code must retain the above copyright 10ff87ae35SJohn Baldwin * notice, this list of conditions and the following disclaimer. 11ff87ae35SJohn Baldwin * 2. Redistributions in binary form must reproduce the above copyright 12ff87ae35SJohn Baldwin * notice, this list of conditions and the following disclaimer in the 13ff87ae35SJohn Baldwin * documentation and/or other materials provided with the distribution. 14ff87ae35SJohn Baldwin * 15ff87ae35SJohn Baldwin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16ff87ae35SJohn Baldwin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17ff87ae35SJohn Baldwin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18ff87ae35SJohn Baldwin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19ff87ae35SJohn Baldwin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20ff87ae35SJohn Baldwin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21ff87ae35SJohn Baldwin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22ff87ae35SJohn Baldwin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23ff87ae35SJohn Baldwin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24ff87ae35SJohn Baldwin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25ff87ae35SJohn Baldwin * SUCH DAMAGE. 26ff87ae35SJohn Baldwin */ 27ff87ae35SJohn Baldwin 28ff87ae35SJohn Baldwin #include <sys/cdefs.h> 29ff87ae35SJohn Baldwin __FBSDID("$FreeBSD$"); 30ff87ae35SJohn Baldwin 31ff87ae35SJohn Baldwin #include <sys/types.h> 32ff87ae35SJohn Baldwin #include <sys/sysctl.h> 33ff87ae35SJohn Baldwin #include <sys/user.h> 34ff87ae35SJohn Baldwin #include <stdlib.h> 35ff87ae35SJohn Baldwin #include <string.h> 36ff87ae35SJohn Baldwin 37ff87ae35SJohn Baldwin #include "libutil.h" 38ff87ae35SJohn Baldwin 39*f2069331SKonstantin Belousov static struct kinfo_vmobject * 40*f2069331SKonstantin Belousov kinfo_getvmobject_impl(int *cntp, const char *vmobjsysctl) 41ff87ae35SJohn Baldwin { 42ff87ae35SJohn Baldwin char *buf, *bp, *ep; 43ff87ae35SJohn Baldwin struct kinfo_vmobject *kvo, *list, *kp; 44ff87ae35SJohn Baldwin size_t len; 45ff87ae35SJohn Baldwin int cnt, i; 46ff87ae35SJohn Baldwin 47ff87ae35SJohn Baldwin buf = NULL; 48ff87ae35SJohn Baldwin for (i = 0; i < 3; i++) { 49*f2069331SKonstantin Belousov if (sysctlbyname(vmobjsysctl, NULL, &len, NULL, 0) < 0) { 5091601d8cSStephen J. Kiernan free(buf); 51ff87ae35SJohn Baldwin return (NULL); 5291601d8cSStephen J. Kiernan } 53ff87ae35SJohn Baldwin buf = reallocf(buf, len); 54ff87ae35SJohn Baldwin if (buf == NULL) 55ff87ae35SJohn Baldwin return (NULL); 56*f2069331SKonstantin Belousov if (sysctlbyname(vmobjsysctl, buf, &len, NULL, 0) == 0) 57ff87ae35SJohn Baldwin goto unpack; 58ff87ae35SJohn Baldwin if (errno != ENOMEM) { 59ff87ae35SJohn Baldwin free(buf); 60ff87ae35SJohn Baldwin return (NULL); 61ff87ae35SJohn Baldwin } 62ff87ae35SJohn Baldwin } 63ff87ae35SJohn Baldwin free(buf); 64ff87ae35SJohn Baldwin return (NULL); 65ff87ae35SJohn Baldwin 66ff87ae35SJohn Baldwin unpack: 67ff87ae35SJohn Baldwin /* Count items */ 68ff87ae35SJohn Baldwin cnt = 0; 69ff87ae35SJohn Baldwin bp = buf; 70ff87ae35SJohn Baldwin ep = buf + len; 71ff87ae35SJohn Baldwin while (bp < ep) { 72ff87ae35SJohn Baldwin kvo = (struct kinfo_vmobject *)(uintptr_t)bp; 73ff87ae35SJohn Baldwin bp += kvo->kvo_structsize; 74ff87ae35SJohn Baldwin cnt++; 75ff87ae35SJohn Baldwin } 76ff87ae35SJohn Baldwin 77ff87ae35SJohn Baldwin list = calloc(cnt, sizeof(*list)); 78ff87ae35SJohn Baldwin if (list == NULL) { 79ff87ae35SJohn Baldwin free(buf); 80ff87ae35SJohn Baldwin return (NULL); 81ff87ae35SJohn Baldwin } 82ff87ae35SJohn Baldwin 83ff87ae35SJohn Baldwin /* Unpack */ 84ff87ae35SJohn Baldwin bp = buf; 85ff87ae35SJohn Baldwin kp = list; 86ff87ae35SJohn Baldwin while (bp < ep) { 87ff87ae35SJohn Baldwin kvo = (struct kinfo_vmobject *)(uintptr_t)bp; 88ff87ae35SJohn Baldwin memcpy(kp, kvo, kvo->kvo_structsize); 89ff87ae35SJohn Baldwin bp += kvo->kvo_structsize; 90ff87ae35SJohn Baldwin kp->kvo_structsize = sizeof(*kp); 91ff87ae35SJohn Baldwin kp++; 92ff87ae35SJohn Baldwin } 93ff87ae35SJohn Baldwin free(buf); 94ff87ae35SJohn Baldwin *cntp = cnt; 95ff87ae35SJohn Baldwin return (list); 96ff87ae35SJohn Baldwin } 97*f2069331SKonstantin Belousov 98*f2069331SKonstantin Belousov struct kinfo_vmobject * 99*f2069331SKonstantin Belousov kinfo_getvmobject(int *cntp) 100*f2069331SKonstantin Belousov { 101*f2069331SKonstantin Belousov return (kinfo_getvmobject_impl(cntp, "vm.objects")); 102*f2069331SKonstantin Belousov } 103*f2069331SKonstantin Belousov 104*f2069331SKonstantin Belousov struct kinfo_vmobject * 105*f2069331SKonstantin Belousov kinfo_getswapvmobject(int *cntp) 106*f2069331SKonstantin Belousov { 107*f2069331SKonstantin Belousov return (kinfo_getvmobject_impl(cntp, "vm.swap_objects")); 108*f2069331SKonstantin Belousov } 109