dma.c,v
来自「TCP-IP红宝书源代码」· C,V 代码 · 共 154 行
C,V
154 行
head 1.1;
access;
symbols;
locks
dls:1.1; strict;
comment @ * @;
1.1
date 97.09.21.19.29.30; author dls; state Dist;
branches;
next ;
desc
@@
1.1
log
@pre-3e code
@
text
@/* dma.c - various Sun virtual memory utils */
#include <conf.h>
#include <kernel.h>
#include <network.h>
int
map()
{
}
sm_size
setsmreg()
{
}
#ifdef notdef
/*
* getfc3 - Fetch a value from Function Code 3 space
*/
u_long
getfc3(size,addr)
register u_long size, *addr;
{
MOVL(#3, d0);
MOVC(d0, sfc);
if (size == sizeof(u_char))
MOVSB(a5@@, d7);
else if (size == sizeof(u_short))
MOVSW(a5@@, d7);
else if (size == sizeof(u_long))
MOVSL(a5@@, d7);
return(size);
}
/*
* setfc3 - write to Function Code 3 space
*/
u_long
setfc3(size,addr,entry)
register u_long size, *addr,entry;
{
MOVL(#3, d0);
MOVC(d0, dfc);
if (size == sizeof(u_char))
MOVSB(d6, a5@@);
else if (size == sizeof(u_short))
MOVSW(d6, a5@@);
else if (size == sizeof(u_long))
MOVSL(d6, a5@@);
}
pg_size
getpgreg(addr)
register u_long addr;
{
addr = ((addr & ~PAGEMASK) + PG_OFF) & ADDRMASK;
return((pg_size) getfc3(sizeof(pg_size), addr));
}
pg_size
setpgreg(addr,entry)
register u_long addr;
register pg_size entry;
{
register pg_size ret = getpgreg(addr);
addr = ((addr & ~PAGEMASK) + PG_OFF) & ADDRMASK;
setfc3(sizeof(pg_size), addr, entry);
return(ret);
}
/*
* getsmreg - get the contents of the segment map corresponding
* to virtual address "addr"
*/
sm_size
getsmreg(addr)
register u_long addr;
{
addr = ((addr & ~SEGMASK) + SM_OFF) & ADDRMASK;
return((sm_size) getfc3(sizeof(sm_size), addr));
}
/*
* setsmreg - set the segment map entry for virtual address "addr"
* to point to "entry"
*/
sm_size
setsmreg(addr,entry)
register u_long addr;
register sm_size entry;
{
register sm_size ret = getsmreg(addr);
addr = ((addr & ~SEGMASK) + SM_OFF) & ADDRMASK;
setfc3(sizeof(sm_size), addr, entry);
return(ret);
}
/*
* map(virt, size, phys, space)
* Make redundant virtual mapping for frames.
* Used to allow ethernet DMA for V7.
*/
map(virt, size, phys, space)
register u_long virt, size, phys;
register enum pm_type space;
{
pg_t page;
register struct pg_field *pgp = &page.pg_field;
register i;
pgp->pg_valid = 1;
pgp->pg_permission = PMP_ALL;
pgp->pg_space = space;
phys = BTOP(phys);
size = BTOP(size);
for (i = 0; i < size; i++){ /* for each page, */
pgp->pg_pagenum = phys++;
setpgreg(virt + PTOB(i), page.pg_whole);
}
}
#endif /* notdef */
@
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?