from DIO_REQUEST. Also do_vdevio. Also do_sdevio, but this function also supports grant id's and offsets. do_segctl: rename protected to prot. do_umap: support for GRANT_SEG umap. do_privctl: support SYS_PRIV_SET_GRANTS, which sets location and size of in-own-address-space grant table. do_safecopy: functions to verify and perform 'safe' (grant-based) copies.
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* The kernel call implemented in this file:
 | 
						|
 *   m_type:	SYS_UMAP
 | 
						|
 *
 | 
						|
 * The parameters for this kernel call are:
 | 
						|
 *    m5_i1:	CP_SRC_PROC_NR	(process number)	
 | 
						|
 *    m5_c1:	CP_SRC_SPACE	(segment where address is: T, D, or S)
 | 
						|
 *    m5_l1:	CP_SRC_ADDR	(virtual address)	
 | 
						|
 *    m5_l2:	CP_DST_ADDR	(returns physical address)	
 | 
						|
 *    m5_l3:	CP_NR_BYTES	(size of datastructure) 	
 | 
						|
 */
 | 
						|
 | 
						|
#include "../system.h"
 | 
						|
 | 
						|
#if USE_UMAP
 | 
						|
 | 
						|
/*==========================================================================*
 | 
						|
 *				do_umap					    *
 | 
						|
 *==========================================================================*/
 | 
						|
PUBLIC int do_umap(m_ptr)
 | 
						|
register message *m_ptr;	/* pointer to request message */
 | 
						|
{
 | 
						|
/* Map virtual address to physical, for non-kernel processes. */
 | 
						|
  int seg_type = m_ptr->CP_SRC_SPACE & SEGMENT_TYPE;
 | 
						|
  int seg_index = m_ptr->CP_SRC_SPACE & SEGMENT_INDEX;
 | 
						|
  vir_bytes offset = m_ptr->CP_SRC_ADDR;
 | 
						|
  int count = m_ptr->CP_NR_BYTES;
 | 
						|
  int endpt = (int) m_ptr->CP_SRC_ENDPT;
 | 
						|
  int proc_nr;
 | 
						|
  phys_bytes phys_addr;
 | 
						|
 | 
						|
  /* Verify process number. */
 | 
						|
  if (endpt == SELF)
 | 
						|
	proc_nr = who_p;
 | 
						|
  else
 | 
						|
	if (! isokendpt(endpt, &proc_nr))
 | 
						|
		return(EINVAL);
 | 
						|
 | 
						|
  /* See which mapping should be made. */
 | 
						|
  switch(seg_type) {
 | 
						|
  case LOCAL_SEG:
 | 
						|
      phys_addr = umap_local(proc_addr(proc_nr), seg_index, offset, count); 
 | 
						|
      break;
 | 
						|
  case REMOTE_SEG:
 | 
						|
      phys_addr = umap_remote(proc_addr(proc_nr), seg_index, offset, count); 
 | 
						|
      break;
 | 
						|
  case BIOS_SEG:
 | 
						|
      phys_addr = umap_bios(proc_addr(proc_nr), offset, count); 
 | 
						|
      break;
 | 
						|
  case GRANT_SEG:
 | 
						|
      phys_addr = umap_grant(proc_addr(proc_nr), offset, count); 
 | 
						|
      break;
 | 
						|
  default:
 | 
						|
      return(EINVAL);
 | 
						|
  }
 | 
						|
  m_ptr->CP_DST_ADDR = phys_addr;
 | 
						|
  return (phys_addr == 0) ? EFAULT: OK;
 | 
						|
}
 | 
						|
 | 
						|
#endif /* USE_UMAP */
 |