44 lines
		
	
	
		
			1014 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1014 B
		
	
	
	
		
			C
		
	
	
	
	
	
/* The kernel call implemented in this file:
 | 
						|
 *   m_type:	SYS_MAPDMA
 | 
						|
 *
 | 
						|
 * The parameters for this kernel call are:
 | 
						|
 *    m5_l1:	CP_SRC_ADDR	(virtual address)	
 | 
						|
 *    m5_l3:	CP_NR_BYTES	(size of datastructure) 	
 | 
						|
 */
 | 
						|
 | 
						|
#include "../system.h"
 | 
						|
 | 
						|
/*==========================================================================*
 | 
						|
 *				do_mapdma				    *
 | 
						|
 *==========================================================================*/
 | 
						|
PUBLIC int do_mapdma(m_ptr)
 | 
						|
register message *m_ptr;	/* pointer to request message */
 | 
						|
{
 | 
						|
	int r;
 | 
						|
	endpoint_t proc_e;
 | 
						|
	int proc_p;
 | 
						|
	vir_bytes base, size;
 | 
						|
	phys_bytes phys_base;
 | 
						|
	struct proc *proc;
 | 
						|
	message m;
 | 
						|
 | 
						|
	proc_e = m_ptr->CP_SRC_ENDPT;
 | 
						|
	base= m_ptr->CP_SRC_ADDR;
 | 
						|
	size= m_ptr->CP_NR_BYTES;
 | 
						|
 | 
						|
	if (!isokendpt(proc_e, &proc_p))
 | 
						|
		return(EINVAL);
 | 
						|
 | 
						|
	proc = proc_addr(proc_p);
 | 
						|
 | 
						|
        phys_base= umap_virtual(proc, D, base, size);
 | 
						|
        if (!phys_base)
 | 
						|
        {
 | 
						|
                kprintf("do_mapdma: umap_virtual failed\n");
 | 
						|
		return EFAULT;
 | 
						|
	}
 | 
						|
 | 
						|
	m_ptr->CP_DST_ADDR = phys_base;
 | 
						|
	return OK;
 | 
						|
}
 |