V10/cmd/adb/seq/mchsys.c
/*
* system-mode mapping
* 32032/sequent version
*/
#include "defs.h"
#include "machine.h"
#include "space.h"
#include <machine/pte.h>
#include <machine/param.h>
static long sysptb, usrptb;
static int kmode;
#define KOFF 0
#define KSYS 1
#define KUSR 2
printkm()
{
printf("%R$k\n%R$u\n", sysptb, usrptb);
if (kmode == KSYS)
printf("sys\n");
else if (kmode == KUSR)
printf("user\n");
else
printf("off\n");
}
kmsys()
{
if (adrflg) {
sysptb = dot;
kmode = KSYS;
return;
}
if (expr(0)) {
if (expv)
kmode = KSYS;
else
kmode = KUSR;
return;
}
printkm();
}
kmproc()
{
if (adrflg) {
sysptb = dot;
kmode = KUSR;
return;
}
if (expr(0)) {
if (expv)
kmode = KUSR;
else
kmode = KSYS;
return;
}
printkm();
}
/*
* map a kernel address to a physical address
* arg is a pointer to be filled in
* returns nonzero if address is valid
*/
int
kmap(paddr, sp)
ADDR *paddr;
{
switch (kmode) {
case KUSR:
return (transl(paddr, sp, usrptb));
case KSYS:
return (transl(paddr, sp, sysptb));
default:
return (1);
}
}
/*
* virtual -> physical addr, given the right pt base
*/
static long
transl(ap, sp, ptb)
register long *ap;
int sp;
long ptb;
{
long pt;
pt = ltow(lget((ADDR)(ptb + L1IDX(*ap) * sizeof(struct pte)), sp|RAWADDR));
if (errflg)
return (0);
if ((pt & PG_V) == 0)
return (0);
pt = PTETOPHYS(pt) + L2IDX(*ap) * sizeof(struct pte);
pt = ltow(lget((ADDR)pt, sp|RAWADDR));
if (errflg)
return (0);
*ap = (*ap & PGOFSET) + PTETOPHYS(pt);
return (1);
}