1/*- 2 * Copyright (c) 1989, 1992, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software developed by the Computer Systems 6 * Engineering group at Lawrence Berkeley Laboratory under DARPA contract 7 * BG 91-66 and contributed to Berkeley. 8 * --- 20 unchanged lines hidden (view full) --- 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * from: FreeBSD: src/lib/libkvm/kvm_i386.c,v 1.15 2001/10/10 17:48:43 34 */ 35 36#include <sys/cdefs.h> |
37__FBSDID("$FreeBSD: head/lib/libkvm/kvm_sparc64.c 221869 2011-05-14 01:53:38Z attilio $"); |
38 39#if defined(LIBC_SCCS) && !defined(lint) 40#if 0 41static char sccsid[] = "@(#)kvm_hp300.c 8.1 (Berkeley) 6/4/93"; 42#endif 43#endif /* LIBC_SCCS and not lint */ 44 45/* --- 137 unchanged lines hidden (view full) --- 183fail_vm: 184 free(vm); 185 return (-1); 186} 187 188int 189_kvm_kvatop(kvm_t *kd, u_long va, off_t *pa) 190{ |
191 struct tte tte; 192 off_t tte_off; 193 u_long vpn; |
194 off_t pa_off; 195 u_long pg_off; 196 int rest; 197 198 pg_off = va & PAGE_MASK; 199 if (va >= VM_MIN_DIRECT_ADDRESS) 200 pa_off = TLB_DIRECT_TO_PHYS(va) & ~PAGE_MASK; |
201 else { 202 vpn = btop(va); 203 tte_off = kd->vmst->vm_tsb_off + 204 ((vpn & kd->vmst->vm_tsb_mask) << TTE_SHIFT); 205 if (!_kvm_read_phys(kd, tte_off, &tte, sizeof(tte))) 206 goto invalid; 207 if (!tte_match(&tte, va)) 208 goto invalid; 209 pa_off = TTE_GET_PA(&tte); 210 } |
211 rest = PAGE_SIZE - pg_off; 212 pa_off = _kvm_find_off(kd->vmst, pa_off, rest); 213 if (pa_off == KVM_OFF_NOTFOUND) 214 goto invalid; 215 *pa = pa_off + pg_off; 216 return (rest); 217 218invalid: 219 _kvm_err(kd, 0, "invalid address (%lx)", va); 220 return (0); 221} |