kvm_sun3.c revision 1.14 1 1.14 jym /* $NetBSD: kvm_sun3.c,v 1.14 2010/09/20 23:23:16 jym Exp $ */
2 1.3 thorpej
3 1.1 gwr /*-
4 1.1 gwr * Copyright (c) 1992, 1993
5 1.1 gwr * The Regents of the University of California. All rights reserved.
6 1.1 gwr *
7 1.1 gwr * This code is derived from software developed by the Computer Systems
8 1.1 gwr * Engineering group at Lawrence Berkeley Laboratory under DARPA contract
9 1.1 gwr * BG 91-66 and contributed to Berkeley.
10 1.1 gwr *
11 1.1 gwr * Redistribution and use in source and binary forms, with or without
12 1.1 gwr * modification, are permitted provided that the following conditions
13 1.1 gwr * are met:
14 1.1 gwr * 1. Redistributions of source code must retain the above copyright
15 1.1 gwr * notice, this list of conditions and the following disclaimer.
16 1.1 gwr * 2. Redistributions in binary form must reproduce the above copyright
17 1.1 gwr * notice, this list of conditions and the following disclaimer in the
18 1.1 gwr * documentation and/or other materials provided with the distribution.
19 1.12 agc * 3. Neither the name of the University nor the names of its contributors
20 1.1 gwr * may be used to endorse or promote products derived from this software
21 1.1 gwr * without specific prior written permission.
22 1.1 gwr *
23 1.1 gwr * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 1.1 gwr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 1.1 gwr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 1.1 gwr * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 1.1 gwr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 1.1 gwr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 1.1 gwr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 1.1 gwr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 1.1 gwr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 1.1 gwr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 1.1 gwr * SUCH DAMAGE.
34 1.1 gwr */
35 1.1 gwr
36 1.7 mikel #include <sys/cdefs.h>
37 1.4 gwr #if defined(LIBC_SCCS) && !defined(lint)
38 1.4 gwr #if 0
39 1.4 gwr static char sccsid[] = "@(#)kvm_sparc.c 8.1 (Berkeley) 6/4/93";
40 1.4 gwr #else
41 1.14 jym __RCSID("$NetBSD: kvm_sun3.c,v 1.14 2010/09/20 23:23:16 jym Exp $");
42 1.4 gwr #endif
43 1.4 gwr #endif /* LIBC_SCCS and not lint */
44 1.4 gwr
45 1.1 gwr /*
46 1.4 gwr * Sun3 machine dependent routines for kvm.
47 1.5 gwr *
48 1.5 gwr * Note: This file has to build on ALL m68k machines,
49 1.8 briggs * so do NOT include any <machine / *.h> files here.
50 1.1 gwr */
51 1.1 gwr
52 1.5 gwr #include <sys/types.h>
53 1.4 gwr #include <sys/kcore.h>
54 1.4 gwr
55 1.1 gwr #include <unistd.h>
56 1.4 gwr #include <limits.h>
57 1.1 gwr #include <nlist.h>
58 1.1 gwr #include <kvm.h>
59 1.4 gwr #include <db.h>
60 1.1 gwr
61 1.6 thorpej #include <m68k/kcore.h>
62 1.6 thorpej
63 1.5 gwr #include "kvm_private.h"
64 1.5 gwr #include "kvm_m68k.h"
65 1.5 gwr
66 1.13 jym int _kvm_sun3_initvtop(kvm_t *);
67 1.13 jym void _kvm_sun3_freevtop(kvm_t *);
68 1.14 jym int _kvm_sun3_kvatop (kvm_t *, vaddr_t, paddr_t *);
69 1.14 jym off_t _kvm_sun3_pa2off (kvm_t *, paddr_t);
70 1.5 gwr
71 1.5 gwr struct kvm_ops _kvm_ops_sun3 = {
72 1.5 gwr _kvm_sun3_initvtop,
73 1.5 gwr _kvm_sun3_freevtop,
74 1.5 gwr _kvm_sun3_kvatop,
75 1.5 gwr _kvm_sun3_pa2off };
76 1.1 gwr
77 1.6 thorpej #define _kvm_pg_pa(v, s, pte) \
78 1.6 thorpej (((pte) & (s)->pg_frame) << (v)->pgshift)
79 1.6 thorpej
80 1.6 thorpej #define _kvm_va_segnum(s, x) \
81 1.6 thorpej ((u_int)(x) >> (s)->segshift)
82 1.6 thorpej #define _kvm_pte_num_mask(v) \
83 1.6 thorpej (0xf << (v)->pgshift)
84 1.6 thorpej #define _kvm_va_pte_num(v, va) \
85 1.6 thorpej (((va) & _kvm_pte_num_mask((v))) >> (v)->pgshift)
86 1.6 thorpej
87 1.5 gwr /*
88 1.6 thorpej * XXX Re-define these here, no other place for them.
89 1.6 thorpej */
90 1.6 thorpej #define NKSEG 256 /* kernel segmap entries */
91 1.6 thorpej #define NPAGSEG 16 /* pages per segment */
92 1.1 gwr
93 1.5 gwr /* Finally, our local stuff... */
94 1.6 thorpej struct private_vmstate {
95 1.4 gwr /* Page Map Entry Group (PMEG) */
96 1.4 gwr int pmeg[NKSEG][NPAGSEG];
97 1.1 gwr };
98 1.1 gwr
99 1.4 gwr /*
100 1.4 gwr * Prepare for translation of kernel virtual addresses into offsets
101 1.4 gwr * into crash dump files. We use the MMU specific goop written at the
102 1.4 gwr * beginning of a crash dump by dumpsys()
103 1.4 gwr * Note: sun3 MMU specific!
104 1.4 gwr */
105 1.1 gwr int
106 1.13 jym _kvm_sun3_initvtop(kvm_t *kd)
107 1.1 gwr {
108 1.6 thorpej cpu_kcore_hdr_t *h = kd->cpu_data;
109 1.6 thorpej char *p;
110 1.4 gwr
111 1.4 gwr p = kd->cpu_data;
112 1.6 thorpej p += (h->page_size - sizeof(kcore_seg_t));
113 1.6 thorpej kd->vmst->private = p;
114 1.1 gwr
115 1.1 gwr return (0);
116 1.1 gwr }
117 1.1 gwr
118 1.4 gwr void
119 1.13 jym _kvm_sun3_freevtop(kvm_t *kd)
120 1.4 gwr {
121 1.4 gwr /* This was set by pointer arithmetic, not allocation. */
122 1.6 thorpej kd->vmst->private = (void*)0;
123 1.4 gwr }
124 1.1 gwr
125 1.1 gwr /*
126 1.1 gwr * Translate a kernel virtual address to a physical address using the
127 1.1 gwr * mapping information in kd->vm. Returns the result in pa, and returns
128 1.9 simonb * the number of bytes that are contiguously available from this
129 1.11 wiz * physical address. This routine is used only for crash dumps.
130 1.1 gwr */
131 1.1 gwr int
132 1.14 jym _kvm_sun3_kvatop(kvm_t *kd, vaddr_t va, paddr_t *pap)
133 1.1 gwr {
134 1.6 thorpej cpu_kcore_hdr_t *h = kd->cpu_data;
135 1.6 thorpej struct sun3_kcore_hdr *s = &h->un._sun3;
136 1.6 thorpej struct vmstate *v = kd->vmst;
137 1.6 thorpej struct private_vmstate *pv = v->private;
138 1.6 thorpej int pte, offset;
139 1.4 gwr u_int segnum, sme, ptenum;
140 1.14 jym paddr_t pa;
141 1.4 gwr
142 1.4 gwr if (ISALIVE(kd)) {
143 1.4 gwr _kvm_err(kd, 0, "vatop called in live kernel!");
144 1.6 thorpej return(0);
145 1.4 gwr }
146 1.1 gwr
147 1.6 thorpej if (va < h->kernbase) {
148 1.4 gwr _kvm_err(kd, 0, "not a kernel address");
149 1.6 thorpej return(0);
150 1.1 gwr }
151 1.1 gwr
152 1.4 gwr /*
153 1.4 gwr * Get the segmap entry (sme) from the kernel segmap.
154 1.4 gwr * Note: only have segmap entries from KERNBASE to end.
155 1.4 gwr */
156 1.6 thorpej segnum = _kvm_va_segnum(s, va - h->kernbase);
157 1.6 thorpej ptenum = _kvm_va_pte_num(v, va);
158 1.6 thorpej offset = va & v->pgofset;
159 1.4 gwr
160 1.4 gwr /* The segmap entry selects a PMEG. */
161 1.6 thorpej sme = s->ksegmap[segnum];
162 1.6 thorpej pte = pv->pmeg[sme][ptenum];
163 1.4 gwr
164 1.6 thorpej if ((pte & (s)->pg_valid) == 0) {
165 1.14 jym _kvm_err(kd, 0, "page not valid (VA=%#"PRIxVADDR")", va);
166 1.1 gwr return (0);
167 1.1 gwr }
168 1.6 thorpej pa = _kvm_pg_pa(v, s, pte) + offset;
169 1.4 gwr
170 1.4 gwr *pap = pa;
171 1.6 thorpej return (h->page_size - offset);
172 1.4 gwr }
173 1.1 gwr
174 1.4 gwr /*
175 1.11 wiz * Translate a physical address to a file-offset in the crash dump.
176 1.4 gwr */
177 1.4 gwr off_t
178 1.14 jym _kvm_sun3_pa2off(kvm_t *kd, paddr_t pa)
179 1.4 gwr {
180 1.4 gwr return(kd->dump_off + pa);
181 1.1 gwr }
182