Move MMU dependent DDB goo into a pmap helper function.

This commit is contained in:
pk 1997-08-04 20:02:59 +00:00
parent 24ad0e8316
commit 3ffd287cc0
2 changed files with 87 additions and 90 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: db_interface.c,v 1.15 1997/02/05 00:01:50 pk Exp $ */
/* $NetBSD: db_interface.c,v 1.16 1997/08/04 20:03:01 pk Exp $ */
/*
* Mach Operating System
@ -101,7 +101,6 @@ int db_active = 0;
extern char *trap_type[];
void kdb_kbd_trap __P((struct trapframe *));
static void db_write_text __P((unsigned char *, int));
void db_prom_cmd __P((db_expr_t, int, db_expr_t, char *));
/*
@ -173,81 +172,6 @@ db_read_bytes(addr, size, data)
*data++ = *src++;
}
/*
* XXX - stolen from pmap.c
*/
#if defined(SUN4M)
#define getpte4m(va) lda((va & 0xFFFFF000) | ASI_SRMMUFP_L3, \
ASI_SRMMUFP)
void setpte4m __P((vm_offset_t va, int pte));
#endif
#define getpte4(va) lda(va, ASI_PTE)
#define setpte4(va, pte) sta(va, ASI_PTE, pte)
#if defined(SUN4M) && !(defined(SUN4C) || defined(SUN4))
#define getpte getpte4m
#define setpte setpte4m
#elif defined(SUN4M)
#define getpte(va) (cputyp==CPU_SUN4M ? getpte4m(va) : getpte4(va))
#define setpte(va, pte) (cputyp==CPU_SUN4M ? setpte4m(va, pte) \
: setpte4(va,pte))
#else
#define getpte getpte4
#define setpte setpte4
#endif
#define splpmap() splimp()
static void
db_write_text(dst, ch)
unsigned char *dst;
int ch;
{
int s, pte0, pte;
vm_offset_t va;
s = splpmap();
va = (unsigned long)dst & (~PGOFSET);
pte0 = getpte(va);
#if defined(SUN4M)
#if defined(SUN4) || defined(SUN4C)
if (cputyp == CPU_SUN4M) {
#endif
if ((pte0 & SRMMU_TETYPE) != SRMMU_TEPTE) {
db_printf(" address %p not a valid page\n", dst);
splx(s);
return;
}
pte = pte0 | PPROT_WRITE;
setpte(va, pte);
#if defined(SUN4) || defined(SUN4C)
} else {
#endif
#endif /* 4m */
#if defined(SUN4) || defined(SUN4C)
if ((pte0 & PG_V) == 0) {
db_printf(" address %p not a valid page\n", dst);
splx(s);
return;
}
pte = pte0 | PG_W;
setpte(va, pte);
#if defined(SUN4M)
}
#endif
#endif /* 4/4c */
*dst = (unsigned char)ch;
setpte(va, pte0);
splx(s);
}
/*
* Write bytes to kernel address space for debugger.
*/
@ -263,7 +187,7 @@ db_write_bytes(addr, size, data)
dst = (char *)addr;
while (size-- > 0) {
if ((dst >= (char *)VM_MIN_KERNEL_ADDRESS) && (dst < etext))
db_write_text(dst, *data);
pmap_writetext(dst, *data);
else
*dst = *data;
dst++, data++;

View File

@ -1,4 +1,4 @@
/* $NetBSD: pmap.c,v 1.91 1997/07/29 09:42:11 fair Exp $ */
/* $NetBSD: pmap.c,v 1.92 1997/08/04 20:02:59 pk Exp $ */
/*
* Copyright (c) 1996
@ -637,7 +637,7 @@ setptesw4m(pm, va, pte)
setpgt4m(sm->sg_pte + VA_SUN4M_VPG(va), pte);
}
/* Set the page table entry for va to pte. Flushes cache. */
/* Set the page table entry for va to pte. */
__inline void
setpte4m(va, pte)
register vm_offset_t va;
@ -5729,7 +5729,7 @@ pmap_extract4m(pm, va)
if (rm == NULL) {
#ifdef DEBUG
if (pmapdebug & PDB_FOLLOW)
printf("getptesw4m: no regmap entry");
printf("pmap_extract: no regmap entry");
#endif
return (0);
}
@ -5737,7 +5737,7 @@ pmap_extract4m(pm, va)
if (sm == NULL) {
#ifdef DEBUG
if (pmapdebug & PDB_FOLLOW)
panic("getptesw4m: no segmap");
panic("pmap_extract: no segmap");
#endif
return (0);
}
@ -5764,6 +5764,7 @@ pmap_extract4m(pm, va)
* This routine is only advisory and need not do anything.
*/
/* ARGSUSED */
int donotdoit=0;
void
pmap_copy(dst_pmap, src_pmap, dst_addr, len, src_addr)
struct pmap *dst_pmap, *src_pmap;
@ -5771,17 +5772,43 @@ pmap_copy(dst_pmap, src_pmap, dst_addr, len, src_addr)
vm_size_t len;
vm_offset_t src_addr;
{
#if 0
#if 1
struct regmap *rm;
struct segmap *sm;
if (donotdoit) return;
#ifdef DIAGNOSTIC
if (VA_OFF(src_addr) != 0)
printf("pmap_copy: addr not page aligned: 0x%lx\n", src_addr);
if ((len & (NBPG-1)) != 0)
printf("pmap_copy: length not page aligned: 0x%lx\n", len);
#endif
if (src_pmap == NULL)
return;
if (CPU_ISSUN4M) {
register int i, pte;
for (i = 0; i < len/NBPG; i++) {
pte = getptesw4m(src_pmap, src_addr);
int i, npg, pte;
vm_offset_t pa;
npg = len >> PGSHIFT;
for (i = 0; i < npg; i++) {
tlb_flush_page(src_addr);
rm = &src_pmap->pm_regmap[VA_VREG(src_addr)];
if (rm == NULL)
continue;
sm = &rm->rg_segmap[VA_VSEG(src_addr)];
if (sm == NULL || sm->sg_npte == 0)
continue;
pte = sm->sg_pte[VA_SUN4M_VPG(src_addr)];
if ((pte & SRMMU_TETYPE) != SRMMU_TEPTE)
continue;
pa = ptoa((pte & SRMMU_PPNMASK) >> SRMMU_PPNSHIFT);
pmap_enter(dst_pmap, dst_addr,
ptoa((pte & SRMMU_PPNMASK) >>
SRMMU_PPNSHIFT) |
VA_OFF(src_addr),
pa,
(pte & PPROT_WRITE)
? VM_PROT_WRITE| VM_PROT_READ
? (VM_PROT_WRITE | VM_PROT_READ)
: VM_PROT_READ,
0);
src_addr += NBPG;
@ -6584,6 +6611,52 @@ out:
return (error);
}
/*
* Helper function for debuggers.
*/
void
pmap_writetext(dst, ch)
unsigned char *dst;
int ch;
{
int s, pte0, pte;
vm_offset_t va;
s = splpmap();
va = (unsigned long)dst & (~PGOFSET);
cpuinfo.cache_flush(dst, 1);
#if defined(SUN4M)
if (CPU_ISSUN4M) {
pte0 = getpte4m(va);
if ((pte0 & SRMMU_TETYPE) != SRMMU_TEPTE) {
splx(s);
return;
}
pte = pte0 | PPROT_WRITE;
setpte4m(va, pte);
*dst = (unsigned char)ch;
setpte4m(va, pte0);
}
#endif
#if defined(SUN4) || defined(SUN4C)
if (CPU_ISSUN4C || CPU_ISSUN4) {
pte0 = getpte4(va);
if ((pte0 & PG_V) == 0) {
splx(s);
return;
}
pte = pte0 | PG_W;
setpte4(va, pte);
*dst = (unsigned char)ch;
setpte4(va, pte0);
}
#endif
cpuinfo.cache_flush(dst, 1);
splx(s);
}
#ifdef EXTREME_DEBUG
static void test_region __P((int, int, int));