From 3dbac0faf6b7dc794192d426b80fe2adba124c7a Mon Sep 17 00:00:00 2001 From: tegge Date: Sun, 17 Aug 1997 17:42:59 +0000 Subject: Copy code from gnu/usr.bin/gdb/gdb/kvm-fbsd.c to deal with 4 MB pages. --- lib/libkvm/kvm_amd64.c | 13 +++++++++++++ lib/libkvm/kvm_i386.c | 13 +++++++++++++ 2 files changed, 26 insertions(+) (limited to 'lib/libkvm') diff --git a/lib/libkvm/kvm_amd64.c b/lib/libkvm/kvm_amd64.c index c32fd53..d36b922 100644 --- a/lib/libkvm/kvm_amd64.c +++ b/lib/libkvm/kvm_amd64.c @@ -151,6 +151,19 @@ _kvm_vatop(kvm_t *kd, u_long va, u_long *pa) if (((u_long)pde & PG_V) == 0) goto invalid; + if ((u_long)pde & PG_PS) { + /* + * No second-level page table; ptd describes one 4MB page. + * (We assume that the kernel wouldn't set PG_PS without enabling + * it cr0, and that the kernel doesn't support 36-bit physical + * addresses). + */ +#define PAGE4M_MASK (NBPDR - 1) +#define PG_FRAME4M (~PAGE4M_MASK) + *pa = ((u_long)pde & PG_FRAME4M) + (va & PAGE4M_MASK); + return (NBPDR - (va & PAGE4M_MASK)); + } + pteindex = (va >> PAGE_SHIFT) & (NPTEPG-1); pte_pa = ((u_long)pde & PG_FRAME) + (pteindex * sizeof(pt_entry_t)); diff --git a/lib/libkvm/kvm_i386.c b/lib/libkvm/kvm_i386.c index c32fd53..d36b922 100644 --- a/lib/libkvm/kvm_i386.c +++ b/lib/libkvm/kvm_i386.c @@ -151,6 +151,19 @@ _kvm_vatop(kvm_t *kd, u_long va, u_long *pa) if (((u_long)pde & PG_V) == 0) goto invalid; + if ((u_long)pde & PG_PS) { + /* + * No second-level page table; ptd describes one 4MB page. + * (We assume that the kernel wouldn't set PG_PS without enabling + * it cr0, and that the kernel doesn't support 36-bit physical + * addresses). + */ +#define PAGE4M_MASK (NBPDR - 1) +#define PG_FRAME4M (~PAGE4M_MASK) + *pa = ((u_long)pde & PG_FRAME4M) + (va & PAGE4M_MASK); + return (NBPDR - (va & PAGE4M_MASK)); + } + pteindex = (va >> PAGE_SHIFT) & (NPTEPG-1); pte_pa = ((u_long)pde & PG_FRAME) + (pteindex * sizeof(pt_entry_t)); -- cgit v1.1