getdmem.c,v

来自「TCP-IP红宝书源代码」· C,V 代码 · 共 109 行

C,V
109
字号
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
@/* getdmem.c - getdmem initdmamem */

#include <conf.h>
#include <kernel.h>
#include <mark.h>
#include <mem.h>
#include <network.h>

long nextdma;
long dmaend;

MARKER dmamark;

/*------------------------------------------------------------------------
 * getdmem  --  allocate heap that can be used for DVMA transfers on the
 *              Sun 3 for device storage, returning lowest WORD address
 *------------------------------------------------------------------------
 */
SYSCALL getdmem(nbytes)
    long nbytes;
{
    long ret;
    
#ifdef DEBUG
    kprintf("getdmem(%ld,phys,virt) called\n",nbytes);
#endif    
    
    if (unmarked(dmamark)) {
	mark(dmamark);
	initdmamem(DMA_NBYTES);
    }

    if ((nextdma + nbytes) <= dmaend) {
	ret = nextdma;
	nextdma += nbytes;
	return(ret);
    }
    else {
	panic("No more memory for DMA buffers");
	return(SYSERR);
    }
}


initdmamem(nbytes)
     long nbytes;
{
    int npages;
    long virt;
    long pmem;

#ifdef DEBUG
    kprintf("initdmamem(%ld) called\n",nbytes);
#endif    

    npages = nbytes / PAGESIZE;

    /* allocate enough heap, plus extra to page allign */
    pmem = getmem(nbytes + PAGESIZE);
#ifdef DEBUG
    kprintf("Getmem returns 0x%lx\n",(unsigned long) pmem);
#endif    
    pmem = ((long) pmem + (PAGESIZE-1)) & ~PAGEMASK;
#ifdef DEBUG
    kprintf("pmem rounded up to 0x%lx\n",(unsigned long) pmem);
#endif    

    virt = pmem | DMA_VM_START;
#ifdef DEBUG
    kprintf("starting at virtual address 0x%lx\n",virt);
#endif    

#ifdef DEBUG
    kprintf("Allocating %ld pages for DMA use\n",npages);
#endif    
    setsmreg(virt, npages*12);
    map(virt, npages*PAGESIZE, pmem, PM_MEM);

    dmaend  = virt + (npages*PAGESIZE) - 1;
    nextdma = virt;
    return(OK);
}


@

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?