From d3d1eb995bab5cf6595c27de5e372eb208e8ae3d Mon Sep 17 00:00:00 2001 From: John Dyson Date: Thu, 7 Aug 1997 05:15:52 +0000 Subject: [PATCH] Fix the DDB breakpoint code when using the 4MB page support. --- sys/amd64/amd64/db_interface.c | 23 ++++++++++++++++------- sys/amd64/amd64/pmap.c | 13 ++++++++++--- sys/i386/i386/db_interface.c | 23 ++++++++++++++++------- sys/i386/i386/pmap.c | 13 ++++++++++--- sys/i386/include/param.h | 5 ++++- 5 files changed, 56 insertions(+), 21 deletions(-) diff --git a/sys/amd64/amd64/db_interface.c b/sys/amd64/amd64/db_interface.c index 5c5bcccd003..738b647658d 100644 --- a/sys/amd64/amd64/db_interface.c +++ b/sys/amd64/amd64/db_interface.c @@ -23,7 +23,7 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * - * $Id: db_interface.c,v 1.34 1997/07/18 21:27:52 fsmp Exp $ + * $Id: db_interface.c,v 1.35 1997/07/20 08:37:17 bde Exp $ */ /* @@ -254,14 +254,23 @@ db_write_bytes(addr, size, data) ptep0 = pmap_pte(kernel_pmap, addr); oldmap0 = *ptep0; *ptep0 |= PG_RW; + if ((*ptep0 & PG_PS) == 0) { - addr1 = trunc_page(addr + size - 1); + addr1 = trunc_page(addr + size - 1); - /* Map another page if the data crosses a page boundary. */ - if (trunc_page(addr) != addr1) { - ptep1 = pmap_pte(kernel_pmap, addr1); - oldmap1 = *ptep1; - *ptep1 |= PG_RW; + /* Map another page if the data crosses a page boundary. */ + if (trunc_page(addr) != addr1) { + ptep1 = pmap_pte(kernel_pmap, addr1); + oldmap1 = *ptep1; + *ptep1 |= PG_RW; + } + } else { + addr1 = trunc_4mpage(addr + size - 1); + if (trunc_4mpage(addr) != addr1) { + ptep1 = pmap_pte(kernel_pmap, addr1); + oldmap1 = *ptep1; + *ptep1 |= PG_RW; + } } invltlb(); diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 315b5c19f16..1fee006c831 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -39,7 +39,7 @@ * SUCH DAMAGE. * * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91 - * $Id: pmap.c,v 1.156 1997/08/05 22:24:08 dyson Exp $ + * $Id: pmap.c,v 1.157 1997/08/07 03:52:50 dyson Exp $ */ /* @@ -232,8 +232,15 @@ pmap_pte(pmap, va) register pmap_t pmap; vm_offset_t va; { - if (pmap && *pmap_pde(pmap, va)) { - return get_ptbase(pmap) + i386_btop(va); + unsigned *pdeaddr; + + if (pmap) { + pdeaddr = (unsigned *) pmap_pde(pmap, va); + if (*pdeaddr & PG_PS) + return pdeaddr; + if (*pdeaddr) { + return get_ptbase(pmap) + i386_btop(va); + } } return (0); } diff --git a/sys/i386/i386/db_interface.c b/sys/i386/i386/db_interface.c index 5c5bcccd003..738b647658d 100644 --- a/sys/i386/i386/db_interface.c +++ b/sys/i386/i386/db_interface.c @@ -23,7 +23,7 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * - * $Id: db_interface.c,v 1.34 1997/07/18 21:27:52 fsmp Exp $ + * $Id: db_interface.c,v 1.35 1997/07/20 08:37:17 bde Exp $ */ /* @@ -254,14 +254,23 @@ db_write_bytes(addr, size, data) ptep0 = pmap_pte(kernel_pmap, addr); oldmap0 = *ptep0; *ptep0 |= PG_RW; + if ((*ptep0 & PG_PS) == 0) { - addr1 = trunc_page(addr + size - 1); + addr1 = trunc_page(addr + size - 1); - /* Map another page if the data crosses a page boundary. */ - if (trunc_page(addr) != addr1) { - ptep1 = pmap_pte(kernel_pmap, addr1); - oldmap1 = *ptep1; - *ptep1 |= PG_RW; + /* Map another page if the data crosses a page boundary. */ + if (trunc_page(addr) != addr1) { + ptep1 = pmap_pte(kernel_pmap, addr1); + oldmap1 = *ptep1; + *ptep1 |= PG_RW; + } + } else { + addr1 = trunc_4mpage(addr + size - 1); + if (trunc_4mpage(addr) != addr1) { + ptep1 = pmap_pte(kernel_pmap, addr1); + oldmap1 = *ptep1; + *ptep1 |= PG_RW; + } } invltlb(); diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 315b5c19f16..1fee006c831 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -39,7 +39,7 @@ * SUCH DAMAGE. * * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91 - * $Id: pmap.c,v 1.156 1997/08/05 22:24:08 dyson Exp $ + * $Id: pmap.c,v 1.157 1997/08/07 03:52:50 dyson Exp $ */ /* @@ -232,8 +232,15 @@ pmap_pte(pmap, va) register pmap_t pmap; vm_offset_t va; { - if (pmap && *pmap_pde(pmap, va)) { - return get_ptbase(pmap) + i386_btop(va); + unsigned *pdeaddr; + + if (pmap) { + pdeaddr = (unsigned *) pmap_pde(pmap, va); + if (*pdeaddr & PG_PS) + return pdeaddr; + if (*pdeaddr) { + return get_ptbase(pmap) + i386_btop(va); + } } return (0); } diff --git a/sys/i386/include/param.h b/sys/i386/include/param.h index bb3a70063cf..1015164559b 100644 --- a/sys/i386/include/param.h +++ b/sys/i386/include/param.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)param.h 5.8 (Berkeley) 6/28/91 - * $Id: param.h,v 1.30 1997/07/24 23:48:51 fsmp Exp $ + * $Id: param.h,v 1.31 1997/08/04 19:14:47 fsmp Exp $ */ #ifndef _MACHINE_PARAM_H_ @@ -64,6 +64,7 @@ #define NPDEPG (PAGE_SIZE/(sizeof (pd_entry_t))) #define PDRSHIFT 22 /* LOG2(NBPDR) */ #define NBPDR (1<> PAGE_SHIFT) #define ptoa(x) ((unsigned)(x) << PAGE_SHIFT)