1 /* $NetBSD: kvm_vax.c,v 1.6 1997/10/20 12:49:50 ragge Exp $ */ 2 3 /*- 4 * Copyright (c) 1992, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software developed by the Computer Systems 8 * Engineering group at Lawrence Berkeley Laboratory under DARPA contract 9 * BG 91-66 and contributed to Berkeley. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgement: 21 * This product includes software developed by the University of 22 * California, Berkeley and its contributors. 23 * 4. Neither the name of the University nor the names of its contributors 24 * may be used to endorse or promote products derived from this software 25 * without specific prior written permission. 26 * 27 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 28 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 30 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 31 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 32 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 37 * SUCH DAMAGE. 38 */ 39 40 /* 41 * VAX machine dependent routines for kvm. Hopefully, the forthcoming 42 * vm code will one day obsolete this module. Furthermore, I hope it 43 * gets here soon, because this basically is an error stub! (sorry) 44 * This code may not work anyway. 45 */ 46 47 #include <sys/param.h> 48 #include <sys/user.h> 49 #include <sys/proc.h> 50 #include <sys/stat.h> 51 #include <unistd.h> 52 #include <nlist.h> 53 #include <stdlib.h> 54 #include <kvm.h> 55 56 #include <vm/vm.h> 57 #include <vm/vm_param.h> 58 59 #include <limits.h> 60 #include <db.h> 61 62 #include "kvm_private.h" 63 64 struct vmstate { 65 u_long end; 66 }; 67 68 void 69 _kvm_freevtop(kd) 70 kvm_t *kd; 71 { 72 if (kd->vmst != 0) 73 free(kd->vmst); 74 } 75 76 int 77 _kvm_initvtop(kd) 78 kvm_t *kd; 79 { 80 register struct vmstate *vm; 81 struct stat st; 82 struct nlist nlist[2]; 83 84 vm = (struct vmstate *)_kvm_malloc(kd, sizeof(*vm)); 85 if (vm == 0) 86 return (-1); 87 88 kd->vmst = vm; 89 90 if (fstat(kd->pmfd, &st) < 0) 91 return (-1); 92 93 /* Get end of kernel address */ 94 nlist[0].n_name = "_end"; 95 nlist[1].n_name = 0; 96 if (kvm_nlist(kd, nlist) != 0) { 97 _kvm_err(kd, kd->program, "pmap_stod: no such symbol"); 98 return (-1); 99 } 100 vm->end = (u_long)nlist[0].n_value; 101 102 return (0); 103 } 104 105 #define VA_OFF(va) (va & (NBPG - 1)) 106 107 /* 108 * Translate a kernel virtual address to a physical address using the 109 * mapping information in kd->vm. Returns the result in pa, and returns 110 * the number of bytes that are contiguously available from this 111 * physical address. This routine is used only for crashdumps. 112 */ 113 int 114 _kvm_kvatop(kd, va, pa) 115 kvm_t *kd; 116 u_long va; 117 u_long *pa; 118 { 119 register int end; 120 121 if (va < KERNBASE) { 122 _kvm_err(kd, 0, "invalid address (%x<%x)", va, KERNBASE); 123 return (0); 124 } 125 126 end = kd->vmst->end; 127 if (va >= end) { 128 _kvm_err(kd, 0, "invalid address (%x>=%x)", va, end); 129 return (0); 130 } 131 132 *pa = (va - KERNBASE); 133 return (end - va); 134 } 135 136 /* 137 * Translate a physical address to a file-offset in the crash-dump. 138 * XXX - crash-dumps doesn't work anyway. 139 */ 140 off_t 141 _kvm_pa2off(kd, pa) 142 kvm_t *kd; 143 u_long pa; 144 { 145 return(kd->dump_off + pa); 146 } 147 148 149 /* 150 * Machine-dependent initialization for ALL open kvm descriptors, 151 * not just those for a kernel crash dump. Some architectures 152 * have to deal with these NOT being constants! (i.e. m68k) 153 */ 154 int 155 _kvm_mdopen(kd) 156 kvm_t *kd; 157 { 158 159 kd->usrstack = USRSTACK; 160 kd->min_uva = VM_MIN_ADDRESS; 161 kd->max_uva = VM_MAXUSER_ADDRESS; 162 163 return (0); 164 } 165