1*9da22751SDavid van Moolenbroek /* $NetBSD: kvm_private.h,v 1.20 2011/09/12 21:11:32 christos Exp $ */ 2*9da22751SDavid van Moolenbroek 3*9da22751SDavid van Moolenbroek /*- 4*9da22751SDavid van Moolenbroek * Copyright (c) 1992, 1993 5*9da22751SDavid van Moolenbroek * The Regents of the University of California. All rights reserved. 6*9da22751SDavid van Moolenbroek * 7*9da22751SDavid van Moolenbroek * This code is derived from software developed by the Computer Systems 8*9da22751SDavid van Moolenbroek * Engineering group at Lawrence Berkeley Laboratory under DARPA contract 9*9da22751SDavid van Moolenbroek * BG 91-66 and contributed to Berkeley. 10*9da22751SDavid van Moolenbroek * 11*9da22751SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without 12*9da22751SDavid van Moolenbroek * modification, are permitted provided that the following conditions 13*9da22751SDavid van Moolenbroek * are met: 14*9da22751SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright 15*9da22751SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer. 16*9da22751SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright 17*9da22751SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the 18*9da22751SDavid van Moolenbroek * documentation and/or other materials provided with the distribution. 19*9da22751SDavid van Moolenbroek * 3. Neither the name of the University nor the names of its contributors 20*9da22751SDavid van Moolenbroek * may be used to endorse or promote products derived from this software 21*9da22751SDavid van Moolenbroek * without specific prior written permission. 22*9da22751SDavid van Moolenbroek * 23*9da22751SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24*9da22751SDavid van Moolenbroek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25*9da22751SDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26*9da22751SDavid van Moolenbroek * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27*9da22751SDavid van Moolenbroek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28*9da22751SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29*9da22751SDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30*9da22751SDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31*9da22751SDavid van Moolenbroek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32*9da22751SDavid van Moolenbroek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33*9da22751SDavid van Moolenbroek * SUCH DAMAGE. 34*9da22751SDavid van Moolenbroek * 35*9da22751SDavid van Moolenbroek * @(#)kvm_private.h 8.1 (Berkeley) 6/4/93 36*9da22751SDavid van Moolenbroek */ 37*9da22751SDavid van Moolenbroek 38*9da22751SDavid van Moolenbroek struct __kvm { 39*9da22751SDavid van Moolenbroek /* 40*9da22751SDavid van Moolenbroek * a string to be prepended to error messages 41*9da22751SDavid van Moolenbroek * provided for compatibility with sun's interface 42*9da22751SDavid van Moolenbroek * if this value is null, errors are saved in errbuf[] 43*9da22751SDavid van Moolenbroek */ 44*9da22751SDavid van Moolenbroek const char *program; 45*9da22751SDavid van Moolenbroek char *errp; /* XXX this can probably go away */ 46*9da22751SDavid van Moolenbroek char errbuf[_POSIX2_LINE_MAX]; 47*9da22751SDavid van Moolenbroek int pmfd; /* physical memory file (or crash dump) */ 48*9da22751SDavid van Moolenbroek int vmfd; /* virtual memory file (-1 if crash dump) */ 49*9da22751SDavid van Moolenbroek int swfd; /* swap file (e.g., /dev/drum) */ 50*9da22751SDavid van Moolenbroek int nlfd; /* namelist file (e.g., /vmunix) */ 51*9da22751SDavid van Moolenbroek char alive; /* live kernel? */ 52*9da22751SDavid van Moolenbroek struct kinfo_proc *procbase; 53*9da22751SDavid van Moolenbroek struct kinfo_proc2 *procbase2; 54*9da22751SDavid van Moolenbroek struct kinfo_lwp *lwpbase; 55*9da22751SDavid van Moolenbroek size_t procbase_len; 56*9da22751SDavid van Moolenbroek size_t procbase2_len; 57*9da22751SDavid van Moolenbroek size_t lwpbase_len; 58*9da22751SDavid van Moolenbroek u_long usrstack; /* address of end of user stack */ 59*9da22751SDavid van Moolenbroek u_long min_uva, max_uva; /* min/max user virtual address */ 60*9da22751SDavid van Moolenbroek int nbpg; /* page size */ 61*9da22751SDavid van Moolenbroek char *swapspc; /* (dynamic) storage for swapped pages */ 62*9da22751SDavid van Moolenbroek char *argspc, *argbuf; /* (dynamic) storage for argv strings */ 63*9da22751SDavid van Moolenbroek size_t argspc_len; /* length of the above */ 64*9da22751SDavid van Moolenbroek char **argv; /* (dynamic) storage for argv pointers */ 65*9da22751SDavid van Moolenbroek int argc; /* length of above (not actual # present) */ 66*9da22751SDavid van Moolenbroek 67*9da22751SDavid van Moolenbroek /* 68*9da22751SDavid van Moolenbroek * Header structures for kernel dumps. Only gets filled in for 69*9da22751SDavid van Moolenbroek * dead kernels. 70*9da22751SDavid van Moolenbroek */ 71*9da22751SDavid van Moolenbroek struct kcore_hdr *kcore_hdr; 72*9da22751SDavid van Moolenbroek size_t cpu_dsize; 73*9da22751SDavid van Moolenbroek void *cpu_data; 74*9da22751SDavid van Moolenbroek off_t dump_off; /* Where the actual dump starts */ 75*9da22751SDavid van Moolenbroek 76*9da22751SDavid van Moolenbroek /* 77*9da22751SDavid van Moolenbroek * Kernel virtual address translation state. This only gets filled 78*9da22751SDavid van Moolenbroek * in for dead kernels; otherwise, the running kernel (i.e. kmem) 79*9da22751SDavid van Moolenbroek * will do the translations for us. It could be big, so we 80*9da22751SDavid van Moolenbroek * only allocate it if necessary. 81*9da22751SDavid van Moolenbroek */ 82*9da22751SDavid van Moolenbroek struct vmstate *vmst; /* XXX: should become obsoleted */ 83*9da22751SDavid van Moolenbroek /* 84*9da22751SDavid van Moolenbroek * These kernel variables are used for looking up user addresses, 85*9da22751SDavid van Moolenbroek * and are cached for efficiency. 86*9da22751SDavid van Moolenbroek */ 87*9da22751SDavid van Moolenbroek struct pglist *vm_page_buckets; 88*9da22751SDavid van Moolenbroek int vm_page_hash_mask; 89*9da22751SDavid van Moolenbroek /* Buffer for raw disk I/O. */ 90*9da22751SDavid van Moolenbroek size_t fdalign; 91*9da22751SDavid van Moolenbroek uint8_t *iobuf; 92*9da22751SDavid van Moolenbroek size_t iobufsz; 93*9da22751SDavid van Moolenbroek char kernelname[MAXPATHLEN]; 94*9da22751SDavid van Moolenbroek }; 95*9da22751SDavid van Moolenbroek 96*9da22751SDavid van Moolenbroek /* Levels of aliveness */ 97*9da22751SDavid van Moolenbroek #define KVM_ALIVE_DEAD 0 /* dead, working from core file */ 98*9da22751SDavid van Moolenbroek #define KVM_ALIVE_FILES 1 /* alive, working from open kmem/drum */ 99*9da22751SDavid van Moolenbroek #define KVM_ALIVE_SYSCTL 2 /* alive, sysctl-type calls only */ 100*9da22751SDavid van Moolenbroek 101*9da22751SDavid van Moolenbroek #define ISALIVE(kd) ((kd)->alive != KVM_ALIVE_DEAD) 102*9da22751SDavid van Moolenbroek #define ISKMEM(kd) ((kd)->alive == KVM_ALIVE_FILES) 103*9da22751SDavid van Moolenbroek #define ISSYSCTL(kd) ((kd)->alive == KVM_ALIVE_SYSCTL || ISKMEM(kd)) 104*9da22751SDavid van Moolenbroek 105*9da22751SDavid van Moolenbroek /* 106*9da22751SDavid van Moolenbroek * Functions used internally by kvm, but across kvm modules. 107*9da22751SDavid van Moolenbroek */ 108*9da22751SDavid van Moolenbroek void _kvm_err(kvm_t *, const char *, const char *, ...) 109*9da22751SDavid van Moolenbroek __attribute__((__format__(__printf__, 3, 4))); 110*9da22751SDavid van Moolenbroek int _kvm_dump_mkheader(kvm_t *, kvm_t *); 111*9da22751SDavid van Moolenbroek void _kvm_freeprocs(kvm_t *); 112*9da22751SDavid van Moolenbroek void _kvm_freevtop(kvm_t *); 113*9da22751SDavid van Moolenbroek int _kvm_mdopen(kvm_t *); 114*9da22751SDavid van Moolenbroek int _kvm_initvtop(kvm_t *); 115*9da22751SDavid van Moolenbroek int _kvm_kvatop(kvm_t *, vaddr_t, paddr_t *); 116*9da22751SDavid van Moolenbroek void *_kvm_malloc(kvm_t *, size_t); 117*9da22751SDavid van Moolenbroek off_t _kvm_pa2off(kvm_t *, paddr_t); 118*9da22751SDavid van Moolenbroek void *_kvm_realloc(kvm_t *, void *, size_t); 119*9da22751SDavid van Moolenbroek void _kvm_syserr(kvm_t *, const char *, const char *, ...) 120*9da22751SDavid van Moolenbroek __attribute__((__format__(__printf__, 3, 4))); 121*9da22751SDavid van Moolenbroek ssize_t _kvm_pread(kvm_t *, int, void *, size_t, off_t); 122*9da22751SDavid van Moolenbroek 123*9da22751SDavid van Moolenbroek #define KREAD(kd, addr, obj) \ 124*9da22751SDavid van Moolenbroek (kvm_read(kd, addr, (obj), sizeof(*obj)) != sizeof(*obj)) 125*9da22751SDavid van Moolenbroek 126*9da22751SDavid van Moolenbroek #define KVM_ALLOC(kd, member, size) \ 127*9da22751SDavid van Moolenbroek do { \ 128*9da22751SDavid van Moolenbroek if (kd->member == NULL) \ 129*9da22751SDavid van Moolenbroek kd->member = _kvm_malloc(kd, kd->member ## _len = size); \ 130*9da22751SDavid van Moolenbroek else if (kd->member ## _len < size) \ 131*9da22751SDavid van Moolenbroek kd->member = _kvm_realloc(kd, kd->member, \ 132*9da22751SDavid van Moolenbroek kd->member ## _len = size); \ 133*9da22751SDavid van Moolenbroek if (kd->member == NULL) { \ 134*9da22751SDavid van Moolenbroek kd->member ## _len = 0; \ 135*9da22751SDavid van Moolenbroek return (NULL); \ 136*9da22751SDavid van Moolenbroek } \ 137*9da22751SDavid van Moolenbroek } while (/*CONSTCOND*/0) 138