* Copyright (c) 1989, 1992 The Regents of the University of California.
* This code is derived from software developed by the Computer Systems
* Engineering group at Lawrence Berkeley Laboratory under DARPA contract
* BG 91-66 and contributed to Berkeley. Modified for MIPS by Ralph Campbell.
* %sccs.include.redist.c%
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)kvm_mips.c 5.1 (Berkeley) %G%";
#endif /* LIBC_SCCS and not lint */
* MIPS machine dependent routines for kvm. Hopefully, the forthcoming
* vm code will one day obsolete this module.
#include <machine/machConst.h>
#include <machine/pmap.h>
#define KREAD(kd, addr, p)\
(kvm_read(kd, addr, (char *)(p), sizeof(*(p))) != sizeof(*(p)))
* Translate a kernel virtual address to a physical address.
u_long pte
, addr
, offset
;
va
>= VM_MIN_KERNEL_ADDRESS
+ PMAP_HASH_KPAGES
* NPTEPG
* NBPG
)
if (va
< VM_MIN_KERNEL_ADDRESS
) {
*pa
= MACH_CACHED_TO_PHYS(va
);
return (NBPG
- (va
& PGOFSET
));
addr
= PMAP_HASH_KADDR
+ ((va
- VM_MIN_KERNEL_ADDRESS
) >> PGSHIFT
);
* Can't use KREAD to read kernel segment table entries.
* Fortunately it is 1-to-1 mapped so we don't have to.
if (lseek(kd
->pmfd
, (off_t
)addr
, 0) < 0 ||
read(kd
->pmfd
, (char *)&pte
, sizeof(pte
)) < 0)
*pa
= (pte
& PG_FRAME
) | offset
;
_kvm_err(kd
, 0, "invalid address (%x)", va
);
* Translate a user virtual address to a physical address.
_kvm_uvatop(kd
, p
, va
, pa
)
register struct vmspace
*vms
= p
->p_vmspace
;
kva
= (u_long
)&vms
->vm_pmap
.pm_stab
;
if (kvm_read(kd
, kva
, (char *)&kva
, 4) != 4) {
_kvm_err(kd
, 0, "invalid address (%x)", va
);
return (_kvm_vatop(kd
, kva
, va
, pa
));
_kvm_err(kd
, 0, "invalid address (%x)", va
);