aboutsummaryrefslogtreecommitdiff
path: root/lib/libkvm
diff options
context:
space:
mode:
authorTor Egge <tegge@FreeBSD.org>1997-08-17 17:42:59 +0000
committerTor Egge <tegge@FreeBSD.org>1997-08-17 17:42:59 +0000
commit4afb0d5a5b8f11334ae9bbf36057f9d97e1681b7 (patch)
tree3b745b8dde6ffdef786c315d2e563dae2fee4f63 /lib/libkvm
parent19c0663e5ee83d84ff22fa7a7b486fc2c058c7cb (diff)
downloadsrc-4afb0d5a5b8f11334ae9bbf36057f9d97e1681b7.tar.gz
src-4afb0d5a5b8f11334ae9bbf36057f9d97e1681b7.zip
Copy code from gnu/usr.bin/gdb/gdb/kvm-fbsd.c to deal with 4 MB pages.
Notes
Notes: svn path=/head/; revision=28318
Diffstat (limited to 'lib/libkvm')
-rw-r--r--lib/libkvm/kvm_amd64.c13
-rw-r--r--lib/libkvm/kvm_i386.c13
2 files changed, 26 insertions, 0 deletions
diff --git a/lib/libkvm/kvm_amd64.c b/lib/libkvm/kvm_amd64.c
index c32fd5305a1d..d36b922584e3 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 c32fd5305a1d..d36b922584e3 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));