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