1*d4815699Sskrll /* $NetBSD: kvm_hppa.c,v 1.4 2010/06/24 20:42:24 skrll Exp $ */ 202ac1ae2Sfredette 302ac1ae2Sfredette /*- 402ac1ae2Sfredette * Copyright (c) 1989, 1992, 1993 502ac1ae2Sfredette * The Regents of the University of California. All rights reserved. 602ac1ae2Sfredette * 702ac1ae2Sfredette * This code is derived from software developed by the Computer Systems 802ac1ae2Sfredette * Engineering group at Lawrence Berkeley Laboratory under DARPA contract 902ac1ae2Sfredette * BG 91-66 and contributed to Berkeley. 1002ac1ae2Sfredette * 1102ac1ae2Sfredette * Redistribution and use in source and binary forms, with or without 1202ac1ae2Sfredette * modification, are permitted provided that the following conditions 1302ac1ae2Sfredette * are met: 1402ac1ae2Sfredette * 1. Redistributions of source code must retain the above copyright 1502ac1ae2Sfredette * notice, this list of conditions and the following disclaimer. 1602ac1ae2Sfredette * 2. Redistributions in binary form must reproduce the above copyright 1702ac1ae2Sfredette * notice, this list of conditions and the following disclaimer in the 1802ac1ae2Sfredette * documentation and/or other materials provided with the distribution. 19eb7c1594Sagc * 3. Neither the name of the University nor the names of its contributors 2002ac1ae2Sfredette * may be used to endorse or promote products derived from this software 2102ac1ae2Sfredette * without specific prior written permission. 2202ac1ae2Sfredette * 2302ac1ae2Sfredette * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2402ac1ae2Sfredette * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2502ac1ae2Sfredette * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2602ac1ae2Sfredette * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2702ac1ae2Sfredette * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2802ac1ae2Sfredette * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2902ac1ae2Sfredette * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3002ac1ae2Sfredette * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3102ac1ae2Sfredette * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3202ac1ae2Sfredette * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3302ac1ae2Sfredette * SUCH DAMAGE. 3402ac1ae2Sfredette */ 3502ac1ae2Sfredette 3602ac1ae2Sfredette #include <sys/cdefs.h> 3702ac1ae2Sfredette #if defined(LIBC_SCCS) && !defined(lint) 3802ac1ae2Sfredette #if 0 3902ac1ae2Sfredette static char sccsid[] = "@(#)kvm_hp300.c 8.1 (Berkeley) 6/4/93"; 4002ac1ae2Sfredette #else 41*d4815699Sskrll __RCSID("$NetBSD: kvm_hppa.c,v 1.4 2010/06/24 20:42:24 skrll Exp $"); 4202ac1ae2Sfredette #endif 4302ac1ae2Sfredette #endif /* LIBC_SCCS and not lint */ 4402ac1ae2Sfredette 4502ac1ae2Sfredette /* 4602ac1ae2Sfredette * hppa machine dependent routines for kvm. 4702ac1ae2Sfredette * XXX fredette - largely unimplemented so far. what is here 4802ac1ae2Sfredette * is lifted and disabled. 4902ac1ae2Sfredette */ 5002ac1ae2Sfredette 5102ac1ae2Sfredette #include <sys/param.h> 5202ac1ae2Sfredette #include <sys/user.h> 5302ac1ae2Sfredette #include <sys/proc.h> 5402ac1ae2Sfredette #include <sys/stat.h> 5502ac1ae2Sfredette #include <sys/kcore.h> 5602ac1ae2Sfredette #include <machine/kcore.h> 5702ac1ae2Sfredette #include <stdlib.h> 5802ac1ae2Sfredette #include <unistd.h> 5902ac1ae2Sfredette #include <nlist.h> 6002ac1ae2Sfredette #include <kvm.h> 6102ac1ae2Sfredette 6202ac1ae2Sfredette #include <uvm/uvm_extern.h> 6302ac1ae2Sfredette 6402ac1ae2Sfredette #include <limits.h> 6502ac1ae2Sfredette #include <db.h> 6602ac1ae2Sfredette 6702ac1ae2Sfredette #include "kvm_private.h" 6802ac1ae2Sfredette 6902ac1ae2Sfredette #include <machine/pmap.h> 7002ac1ae2Sfredette #include <machine/pte.h> 7102ac1ae2Sfredette #include <machine/vmparam.h> 7202ac1ae2Sfredette 7302ac1ae2Sfredette #ifndef btop 7402ac1ae2Sfredette #define btop(x) (((unsigned)(x)) >> PGSHIFT) /* XXX */ 7502ac1ae2Sfredette #define ptob(x) ((caddr_t)((x) << PGSHIFT)) /* XXX */ 7602ac1ae2Sfredette #endif 7702ac1ae2Sfredette 7802ac1ae2Sfredette void 79*d4815699Sskrll _kvm_freevtop(kvm_t *kd) 8002ac1ae2Sfredette { 8102ac1ae2Sfredette 8202ac1ae2Sfredette /* Not actually used for anything right now, but safe. */ 8302ac1ae2Sfredette if (kd->vmst != 0) 8402ac1ae2Sfredette free(kd->vmst); 8502ac1ae2Sfredette } 8602ac1ae2Sfredette 8702ac1ae2Sfredette /*ARGSUSED*/ 8802ac1ae2Sfredette int 89*d4815699Sskrll _kvm_initvtop(kvm_t *kd) 9002ac1ae2Sfredette { 9102ac1ae2Sfredette 92*d4815699Sskrll return 0; 9302ac1ae2Sfredette } 9402ac1ae2Sfredette 9502ac1ae2Sfredette /* 9602ac1ae2Sfredette * Translate a kernel virtual address to a physical address. 9702ac1ae2Sfredette */ 9802ac1ae2Sfredette int 99*d4815699Sskrll _kvm_kvatop(kvm_t *kd, u_long va, u_long *pa) 10002ac1ae2Sfredette { 10102ac1ae2Sfredette #if 0 10202ac1ae2Sfredette cpu_kcore_hdr_t *cpu_kh; 10302ac1ae2Sfredette u_long page_off; 10402ac1ae2Sfredette pd_entry_t pde; 10502ac1ae2Sfredette pt_entry_t pte; 10602ac1ae2Sfredette u_long pde_pa, pte_pa; 10702ac1ae2Sfredette #endif 10802ac1ae2Sfredette 10902ac1ae2Sfredette if (ISALIVE(kd)) { 11002ac1ae2Sfredette _kvm_err(kd, 0, "vatop called in live kernel!"); 11102ac1ae2Sfredette return (0); 11202ac1ae2Sfredette } 11302ac1ae2Sfredette 11402ac1ae2Sfredette _kvm_syserr(kd, 0, "could not read PTE"); 11502ac1ae2Sfredette 11602ac1ae2Sfredette #if 0 11702ac1ae2Sfredette cpu_kh = kd->cpu_data; 11802ac1ae2Sfredette page_off = va & PGOFSET; 11902ac1ae2Sfredette 12002ac1ae2Sfredette /* 12102ac1ae2Sfredette * Find and read the page directory entry. 12202ac1ae2Sfredette */ 12302ac1ae2Sfredette pde_pa = cpu_kh->ptdpaddr + (pdei(va) * sizeof(pd_entry_t)); 124a7a2d171Sad if (_kvm_pread(kd, kd->pmfd, (void *)&pde, sizeof(pde), 12502ac1ae2Sfredette _kvm_pa2off(kd, pde_pa)) != sizeof(pde)) { 12602ac1ae2Sfredette _kvm_syserr(kd, 0, "could not read PDE"); 12702ac1ae2Sfredette goto lose; 12802ac1ae2Sfredette } 12902ac1ae2Sfredette 13002ac1ae2Sfredette /* 13102ac1ae2Sfredette * Find and read the page table entry. 13202ac1ae2Sfredette */ 13302ac1ae2Sfredette if ((pde & PG_V) == 0) { 13402ac1ae2Sfredette _kvm_err(kd, 0, "invalid translation (invalid PDE)"); 13502ac1ae2Sfredette goto lose; 13602ac1ae2Sfredette } 13702ac1ae2Sfredette pte_pa = (pde & PG_FRAME) + (ptei(va) * sizeof(pt_entry_t)); 138a7a2d171Sad if (_kvm_pread(kd, kd->pmfd, (void *) &pte, sizeof(pte), 13902ac1ae2Sfredette _kvm_pa2off(kd, pte_pa)) != sizeof(pte)) { 14002ac1ae2Sfredette _kvm_syserr(kd, 0, "could not read PTE"); 14102ac1ae2Sfredette goto lose; 14202ac1ae2Sfredette } 14302ac1ae2Sfredette 14402ac1ae2Sfredette /* 14502ac1ae2Sfredette * Validate the PTE and return the physical address. 14602ac1ae2Sfredette */ 14702ac1ae2Sfredette if ((pte & PG_V) == 0) { 14802ac1ae2Sfredette _kvm_err(kd, 0, "invalid translation (invalid PTE)"); 14902ac1ae2Sfredette goto lose; 15002ac1ae2Sfredette } 15102ac1ae2Sfredette *pa = (pte & PG_FRAME) + page_off; 15202ac1ae2Sfredette return (int)(NBPG - page_off); 15302ac1ae2Sfredette 15402ac1ae2Sfredette lose: 15502ac1ae2Sfredette #endif 15602ac1ae2Sfredette *pa = (u_long)~0L; 157*d4815699Sskrll return 0; 15802ac1ae2Sfredette } 15902ac1ae2Sfredette 16002ac1ae2Sfredette /* 16102ac1ae2Sfredette * Translate a physical address to a file-offset in the crash dump. 16202ac1ae2Sfredette */ 16302ac1ae2Sfredette off_t 164*d4815699Sskrll _kvm_pa2off(kvm_t *kd, u_long pa) 16502ac1ae2Sfredette { 16602ac1ae2Sfredette #if 0 16702ac1ae2Sfredette cpu_kcore_hdr_t *cpu_kh; 16802ac1ae2Sfredette phys_ram_seg_t *ramsegs; 16902ac1ae2Sfredette off_t off; 17002ac1ae2Sfredette int i; 17102ac1ae2Sfredette 17202ac1ae2Sfredette cpu_kh = kd->cpu_data; 17302ac1ae2Sfredette ramsegs = (void *)((char *)(void *)cpu_kh + ALIGN(sizeof *cpu_kh)); 17402ac1ae2Sfredette 17502ac1ae2Sfredette off = 0; 17602ac1ae2Sfredette for (i = 0; i < cpu_kh->nmemsegs; i++) { 17702ac1ae2Sfredette if (pa >= ramsegs[i].start && 17802ac1ae2Sfredette (pa - ramsegs[i].start) < ramsegs[i].size) { 17902ac1ae2Sfredette off += (pa - ramsegs[i].start); 18002ac1ae2Sfredette break; 18102ac1ae2Sfredette } 18202ac1ae2Sfredette off += ramsegs[i].size; 18302ac1ae2Sfredette } 18402ac1ae2Sfredette 185*d4815699Sskrll return kd->dump_off + off; 18602ac1ae2Sfredette #endif 18702ac1ae2Sfredette return 0; 18802ac1ae2Sfredette } 18902ac1ae2Sfredette 19002ac1ae2Sfredette /* 19102ac1ae2Sfredette * Machine-dependent initialization for ALL open kvm descriptors, 19202ac1ae2Sfredette * not just those for a kernel crash dump. Some architectures 19302ac1ae2Sfredette * have to deal with these NOT being constants! (i.e. m68k) 19402ac1ae2Sfredette */ 19502ac1ae2Sfredette int 196*d4815699Sskrll _kvm_mdopen(kvm_t *kd) 19702ac1ae2Sfredette { 19802ac1ae2Sfredette 19902ac1ae2Sfredette kd->usrstack = USRSTACK; 20002ac1ae2Sfredette kd->min_uva = VM_MIN_ADDRESS; 20102ac1ae2Sfredette kd->max_uva = VM_MAXUSER_ADDRESS; 20202ac1ae2Sfredette 203*d4815699Sskrll return 0; 20402ac1ae2Sfredette } 205