Move MMU dependent DDB goo into a pmap helper function.
This commit is contained in:
parent
24ad0e8316
commit
3ffd287cc0
@ -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++;
|
||||
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user