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