xref: /netbsd-src/lib/libkvm/kvm_hppa.c (revision 104ea677951e7b2cca90d7e254308b7992ac0050)
1*104ea677Schristos /*	$NetBSD: kvm_hppa.c,v 1.8 2022/01/10 19:51:30 christos 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*104ea677Schristos __RCSID("$NetBSD: kvm_hppa.c,v 1.8 2022/01/10 19:51:30 christos 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/proc.h>
5302ac1ae2Sfredette #include <sys/stat.h>
5402ac1ae2Sfredette #include <sys/kcore.h>
55962a341dSjym #include <sys/types.h>
56962a341dSjym 
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 
69962a341dSjym #include <machine/kcore.h>
7002ac1ae2Sfredette #include <machine/pmap.h>
7102ac1ae2Sfredette #include <machine/pte.h>
7202ac1ae2Sfredette #include <machine/vmparam.h>
7302ac1ae2Sfredette 
7402ac1ae2Sfredette #ifndef btop
7502ac1ae2Sfredette #define	btop(x)		(((unsigned)(x)) >> PGSHIFT)	/* XXX */
7602ac1ae2Sfredette #define	ptob(x)		((caddr_t)((x) << PGSHIFT))	/* XXX */
7702ac1ae2Sfredette #endif
7802ac1ae2Sfredette 
7902ac1ae2Sfredette void
_kvm_freevtop(kvm_t * kd)80d4815699Sskrll _kvm_freevtop(kvm_t *kd)
8102ac1ae2Sfredette {
8202ac1ae2Sfredette 
8302ac1ae2Sfredette 	/* Not actually used for anything right now, but safe. */
8402ac1ae2Sfredette 	if (kd->vmst != 0)
8502ac1ae2Sfredette 		free(kd->vmst);
8602ac1ae2Sfredette }
8702ac1ae2Sfredette 
8802ac1ae2Sfredette /*ARGSUSED*/
8902ac1ae2Sfredette int
_kvm_initvtop(kvm_t * kd)90d4815699Sskrll _kvm_initvtop(kvm_t *kd)
9102ac1ae2Sfredette {
9202ac1ae2Sfredette 
93d4815699Sskrll 	return 0;
9402ac1ae2Sfredette }
9502ac1ae2Sfredette 
9602ac1ae2Sfredette /*
9702ac1ae2Sfredette  * Translate a kernel virtual address to a physical address.
9802ac1ae2Sfredette  */
9902ac1ae2Sfredette int
_kvm_kvatop(kvm_t * kd,vaddr_t va,paddr_t * pa)100962a341dSjym _kvm_kvatop(kvm_t *kd, vaddr_t va, paddr_t *pa)
10102ac1ae2Sfredette {
10202ac1ae2Sfredette #if 0
10302ac1ae2Sfredette 	cpu_kcore_hdr_t *cpu_kh;
10402ac1ae2Sfredette 	u_long page_off;
10502ac1ae2Sfredette 	pd_entry_t pde;
10602ac1ae2Sfredette 	pt_entry_t pte;
10702ac1ae2Sfredette 	u_long pde_pa, pte_pa;
10802ac1ae2Sfredette #endif
10902ac1ae2Sfredette 
11002ac1ae2Sfredette 	if (ISALIVE(kd)) {
11102ac1ae2Sfredette 		_kvm_err(kd, 0, "vatop called in live kernel!");
112c6d6c8c2Sskrll 		return 0;
11302ac1ae2Sfredette 	}
11402ac1ae2Sfredette 
11502ac1ae2Sfredette 	_kvm_syserr(kd, 0, "could not read PTE");
11602ac1ae2Sfredette 
11702ac1ae2Sfredette #if 0
11802ac1ae2Sfredette 	cpu_kh = kd->cpu_data;
11902ac1ae2Sfredette 	page_off = va & PGOFSET;
12002ac1ae2Sfredette 
12102ac1ae2Sfredette 	/*
12202ac1ae2Sfredette 	 * Find and read the page directory entry.
12302ac1ae2Sfredette 	 */
12402ac1ae2Sfredette 	pde_pa = cpu_kh->ptdpaddr + (pdei(va) * sizeof(pd_entry_t));
125a7a2d171Sad 	if (_kvm_pread(kd, kd->pmfd, (void *)&pde, sizeof(pde),
12602ac1ae2Sfredette 	    _kvm_pa2off(kd, pde_pa)) != sizeof(pde)) {
12702ac1ae2Sfredette 		_kvm_syserr(kd, 0, "could not read PDE");
12802ac1ae2Sfredette 		goto lose;
12902ac1ae2Sfredette 	}
13002ac1ae2Sfredette 
13102ac1ae2Sfredette 	/*
13202ac1ae2Sfredette 	 * Find and read the page table entry.
13302ac1ae2Sfredette 	 */
13402ac1ae2Sfredette 	if ((pde & PG_V) == 0) {
13502ac1ae2Sfredette 		_kvm_err(kd, 0, "invalid translation (invalid PDE)");
13602ac1ae2Sfredette 		goto lose;
13702ac1ae2Sfredette 	}
13802ac1ae2Sfredette 	pte_pa = (pde & PG_FRAME) + (ptei(va) * sizeof(pt_entry_t));
139a7a2d171Sad 	if (_kvm_pread(kd, kd->pmfd, (void *) &pte, sizeof(pte),
14002ac1ae2Sfredette 	    _kvm_pa2off(kd, pte_pa)) != sizeof(pte)) {
14102ac1ae2Sfredette 		_kvm_syserr(kd, 0, "could not read PTE");
14202ac1ae2Sfredette 		goto lose;
14302ac1ae2Sfredette 	}
14402ac1ae2Sfredette 
14502ac1ae2Sfredette 	/*
14602ac1ae2Sfredette 	 * Validate the PTE and return the physical address.
14702ac1ae2Sfredette 	 */
14802ac1ae2Sfredette 	if ((pte & PG_V) == 0) {
14902ac1ae2Sfredette 		_kvm_err(kd, 0, "invalid translation (invalid PTE)");
15002ac1ae2Sfredette 		goto lose;
15102ac1ae2Sfredette 	}
15202ac1ae2Sfredette 	*pa = (pte & PG_FRAME) + page_off;
15302ac1ae2Sfredette 	return (int)(NBPG - page_off);
15402ac1ae2Sfredette 
15502ac1ae2Sfredette  lose:
15602ac1ae2Sfredette #endif
15702ac1ae2Sfredette 	*pa = (u_long)~0L;
158d4815699Sskrll 	return 0;
15902ac1ae2Sfredette }
16002ac1ae2Sfredette 
16102ac1ae2Sfredette /*
16202ac1ae2Sfredette  * Translate a physical address to a file-offset in the crash dump.
16302ac1ae2Sfredette  */
16402ac1ae2Sfredette off_t
_kvm_pa2off(kvm_t * kd,paddr_t pa)165962a341dSjym _kvm_pa2off(kvm_t *kd, paddr_t pa)
16602ac1ae2Sfredette {
16702ac1ae2Sfredette #if 0
16802ac1ae2Sfredette 	cpu_kcore_hdr_t *cpu_kh;
16902ac1ae2Sfredette 	phys_ram_seg_t *ramsegs;
17002ac1ae2Sfredette 	off_t off;
17102ac1ae2Sfredette 	int i;
17202ac1ae2Sfredette 
17302ac1ae2Sfredette 	cpu_kh = kd->cpu_data;
17402ac1ae2Sfredette 	ramsegs = (void *)((char *)(void *)cpu_kh + ALIGN(sizeof *cpu_kh));
17502ac1ae2Sfredette 
17602ac1ae2Sfredette 	off = 0;
17702ac1ae2Sfredette 	for (i = 0; i < cpu_kh->nmemsegs; i++) {
17802ac1ae2Sfredette 		if (pa >= ramsegs[i].start &&
17902ac1ae2Sfredette 		    (pa - ramsegs[i].start) < ramsegs[i].size) {
18002ac1ae2Sfredette 			off += (pa - ramsegs[i].start);
18102ac1ae2Sfredette 			break;
18202ac1ae2Sfredette 		}
18302ac1ae2Sfredette 		off += ramsegs[i].size;
18402ac1ae2Sfredette 	}
18502ac1ae2Sfredette 
186d4815699Sskrll 	return kd->dump_off + off;
18702ac1ae2Sfredette #endif
18802ac1ae2Sfredette 	return 0;
18902ac1ae2Sfredette }
19002ac1ae2Sfredette 
19102ac1ae2Sfredette /*
19202ac1ae2Sfredette  * Machine-dependent initialization for ALL open kvm descriptors,
19302ac1ae2Sfredette  * not just those for a kernel crash dump.  Some architectures
19402ac1ae2Sfredette  * have to deal with these NOT being constants!  (i.e. m68k)
19502ac1ae2Sfredette  */
19602ac1ae2Sfredette int
_kvm_mdopen(kvm_t * kd)197d4815699Sskrll _kvm_mdopen(kvm_t *kd)
19802ac1ae2Sfredette {
19902ac1ae2Sfredette 
20002ac1ae2Sfredette 	kd->min_uva = VM_MIN_ADDRESS;
20102ac1ae2Sfredette 	kd->max_uva = VM_MAXUSER_ADDRESS;
20202ac1ae2Sfredette 
203d4815699Sskrll 	return 0;
20402ac1ae2Sfredette }
205