diff options
author | Bruce Evans <bde@FreeBSD.org> | 1997-07-27 18:29:04 +0000 |
---|---|---|
committer | Bruce Evans <bde@FreeBSD.org> | 1997-07-27 18:29:04 +0000 |
commit | d1ef09338366965fef5450b19a9c7ab8f73bb78e (patch) | |
tree | 75f04f90765ced170b2ace3ebfb28600d23079af | |
parent | a39c8cb67d452d417a7ad5eb092ec9e219ea876b (diff) | |
download | src-d1ef09338366965fef5450b19a9c7ab8f73bb78e.tar.gz src-d1ef09338366965fef5450b19a9c7ab8f73bb78e.zip |
Support 4MB pages.
Notes
Notes:
svn path=/head/; revision=27718
-rw-r--r-- | gnu/usr.bin/binutils/gdb/i386/kvm-fbsd.c | 31 | ||||
-rw-r--r-- | gnu/usr.bin/binutils/gdb/kvm-fbsd.c | 31 | ||||
-rw-r--r-- | gnu/usr.bin/gdb/gdb/kvm-fbsd.c | 31 |
3 files changed, 69 insertions, 24 deletions
diff --git a/gnu/usr.bin/binutils/gdb/i386/kvm-fbsd.c b/gnu/usr.bin/binutils/gdb/i386/kvm-fbsd.c index e0721be25872..fc6b0c6b81da 100644 --- a/gnu/usr.bin/binutils/gdb/i386/kvm-fbsd.c +++ b/gnu/usr.bin/binutils/gdb/i386/kvm-fbsd.c @@ -791,14 +791,29 @@ kvtophys (fd, addr) if (physrd (fd, v, (char *)&pte, sizeof pte) < 0 || (pte&PG_V) == 0) return (~0); - /* - * Read the second-level page table. - */ - v = (pte&PG_FRAME) + ((addr >> PAGE_SHIFT)&(NPTEPG-1)) * sizeof pte; - if (physrd (fd, v, (char *) &pte, sizeof (pte)) < 0 || (pte&PG_V) == 0) - return (~0); - - addr = (pte & PG_FRAME) + (addr & PAGE_MASK); + if (pte & 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) + addr = (pte & PG_FRAME4M) + (addr & PAGE4M_MASK); + } + else + { + /* + * Read the second-level page table. + */ + v = (pte&PG_FRAME) + ((addr >> PAGE_SHIFT)&(NPTEPG-1)) * sizeof pte; + if (physrd (fd, v, (char *) &pte, sizeof (pte)) < 0 || (pte&PG_V) == 0) + return (~0); + + addr = (pte & PG_FRAME) + (addr & PAGE_MASK); + } #if 0 printf ("vtophys (%x) -> %x\n", oldaddr, addr); #endif diff --git a/gnu/usr.bin/binutils/gdb/kvm-fbsd.c b/gnu/usr.bin/binutils/gdb/kvm-fbsd.c index e0721be25872..fc6b0c6b81da 100644 --- a/gnu/usr.bin/binutils/gdb/kvm-fbsd.c +++ b/gnu/usr.bin/binutils/gdb/kvm-fbsd.c @@ -791,14 +791,29 @@ kvtophys (fd, addr) if (physrd (fd, v, (char *)&pte, sizeof pte) < 0 || (pte&PG_V) == 0) return (~0); - /* - * Read the second-level page table. - */ - v = (pte&PG_FRAME) + ((addr >> PAGE_SHIFT)&(NPTEPG-1)) * sizeof pte; - if (physrd (fd, v, (char *) &pte, sizeof (pte)) < 0 || (pte&PG_V) == 0) - return (~0); - - addr = (pte & PG_FRAME) + (addr & PAGE_MASK); + if (pte & 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) + addr = (pte & PG_FRAME4M) + (addr & PAGE4M_MASK); + } + else + { + /* + * Read the second-level page table. + */ + v = (pte&PG_FRAME) + ((addr >> PAGE_SHIFT)&(NPTEPG-1)) * sizeof pte; + if (physrd (fd, v, (char *) &pte, sizeof (pte)) < 0 || (pte&PG_V) == 0) + return (~0); + + addr = (pte & PG_FRAME) + (addr & PAGE_MASK); + } #if 0 printf ("vtophys (%x) -> %x\n", oldaddr, addr); #endif diff --git a/gnu/usr.bin/gdb/gdb/kvm-fbsd.c b/gnu/usr.bin/gdb/gdb/kvm-fbsd.c index e0721be25872..fc6b0c6b81da 100644 --- a/gnu/usr.bin/gdb/gdb/kvm-fbsd.c +++ b/gnu/usr.bin/gdb/gdb/kvm-fbsd.c @@ -791,14 +791,29 @@ kvtophys (fd, addr) if (physrd (fd, v, (char *)&pte, sizeof pte) < 0 || (pte&PG_V) == 0) return (~0); - /* - * Read the second-level page table. - */ - v = (pte&PG_FRAME) + ((addr >> PAGE_SHIFT)&(NPTEPG-1)) * sizeof pte; - if (physrd (fd, v, (char *) &pte, sizeof (pte)) < 0 || (pte&PG_V) == 0) - return (~0); - - addr = (pte & PG_FRAME) + (addr & PAGE_MASK); + if (pte & 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) + addr = (pte & PG_FRAME4M) + (addr & PAGE4M_MASK); + } + else + { + /* + * Read the second-level page table. + */ + v = (pte&PG_FRAME) + ((addr >> PAGE_SHIFT)&(NPTEPG-1)) * sizeof pte; + if (physrd (fd, v, (char *) &pte, sizeof (pte)) < 0 || (pte&PG_V) == 0) + return (~0); + + addr = (pte & PG_FRAME) + (addr & PAGE_MASK); + } #if 0 printf ("vtophys (%x) -> %x\n", oldaddr, addr); #endif |