do_safecopy split
- removes dependency of do_safecopy() on the m_type field of the kcall messages. - instead of do_safecopy() figuring out what action is requested, the correct safecopy method is called right away.
This commit is contained in:
		
							parent
							
								
									8bca982581
								
							
						
					
					
						commit
						ebbd319ac0
					
				@ -588,10 +588,10 @@ const int flags;
 | 
			
		||||
	caller_ptr->p_sendto_e = dst_e;
 | 
			
		||||
 | 
			
		||||
	/* Process is now blocked.  Put in on the destination's queue. */
 | 
			
		||||
	assert(caller_ptr->p_q_link == NULL);
 | 
			
		||||
	xpp = &dst_ptr->p_caller_q;		/* find end of list */
 | 
			
		||||
	while (*xpp) xpp = &(*xpp)->p_q_link;	
 | 
			
		||||
	*xpp = caller_ptr;			/* add caller to end */
 | 
			
		||||
	caller_ptr->p_q_link = NULL;	/* mark new end of list */
 | 
			
		||||
  }
 | 
			
		||||
  return(OK);
 | 
			
		||||
}
 | 
			
		||||
@ -697,40 +697,37 @@ const int flags;
 | 
			
		||||
    /* Check caller queue. Use pointer pointers to keep code simple. */
 | 
			
		||||
    xpp = &caller_ptr->p_caller_q;
 | 
			
		||||
    while (*xpp) {
 | 
			
		||||
	struct proc * sender = *xpp;
 | 
			
		||||
 | 
			
		||||
        if (src_e == ANY || src_p == proc_nr(sender)) {
 | 
			
		||||
        if (src_e == ANY || src_p == proc_nr(*xpp)) {
 | 
			
		||||
            int call;
 | 
			
		||||
	    assert(!RTS_ISSET(sender, RTS_SLOT_FREE));
 | 
			
		||||
	    assert(!RTS_ISSET(sender, RTS_NO_ENDPOINT));
 | 
			
		||||
	    assert(!RTS_ISSET(*xpp, RTS_SLOT_FREE));
 | 
			
		||||
	    assert(!RTS_ISSET(*xpp, RTS_NO_ENDPOINT));
 | 
			
		||||
 | 
			
		||||
	    /* Found acceptable message. Copy it and update status. */
 | 
			
		||||
  	    assert(!(caller_ptr->p_misc_flags & MF_DELIVERMSG));
 | 
			
		||||
	    caller_ptr->p_delivermsg = sender->p_sendmsg;
 | 
			
		||||
	    caller_ptr->p_delivermsg.m_source = sender->p_endpoint;
 | 
			
		||||
	    caller_ptr->p_delivermsg = (*xpp)->p_sendmsg;
 | 
			
		||||
	    caller_ptr->p_delivermsg.m_source = (*xpp)->p_endpoint;
 | 
			
		||||
	    caller_ptr->p_misc_flags |= MF_DELIVERMSG;
 | 
			
		||||
	    RTS_UNSET(sender, RTS_SENDING);
 | 
			
		||||
	    RTS_UNSET(*xpp, RTS_SENDING);
 | 
			
		||||
 | 
			
		||||
	    call = (sender->p_misc_flags & MF_REPLY_PEND ? SENDREC : SEND);
 | 
			
		||||
	    call = ((*xpp)->p_misc_flags & MF_REPLY_PEND ? SENDREC : SEND);
 | 
			
		||||
	    IPC_STATUS_ADD_CALL(caller_ptr, call);
 | 
			
		||||
 | 
			
		||||
	    /*
 | 
			
		||||
	     * if the message is originaly from the kernel on behalf of this
 | 
			
		||||
	     * process, we must send the status flags accordingly
 | 
			
		||||
	     */
 | 
			
		||||
	    if (sender->p_misc_flags & MF_SENDING_FROM_KERNEL) {
 | 
			
		||||
	    if ((*xpp)->p_misc_flags & MF_SENDING_FROM_KERNEL) {
 | 
			
		||||
		IPC_STATUS_ADD_FLAGS(caller_ptr, IPC_FLG_MSG_FROM_KERNEL);
 | 
			
		||||
		/* we can clean the flag now, not need anymore */
 | 
			
		||||
		sender->p_misc_flags &= ~MF_SENDING_FROM_KERNEL;
 | 
			
		||||
		(*xpp)->p_misc_flags &= ~MF_SENDING_FROM_KERNEL;
 | 
			
		||||
	    }
 | 
			
		||||
	    if (sender->p_misc_flags & MF_SIG_DELAY)
 | 
			
		||||
		sig_delay_done(sender);
 | 
			
		||||
	    if ((*xpp)->p_misc_flags & MF_SIG_DELAY)
 | 
			
		||||
		sig_delay_done(*xpp);
 | 
			
		||||
 | 
			
		||||
            *xpp = sender->p_q_link;		/* remove from queue */
 | 
			
		||||
	    sender->p_q_link = NULL;
 | 
			
		||||
            *xpp = (*xpp)->p_q_link;		/* remove from queue */
 | 
			
		||||
            return(OK);				/* report success */
 | 
			
		||||
	}
 | 
			
		||||
	xpp = &sender->p_q_link;		/* proceed to next */
 | 
			
		||||
	xpp = &(*xpp)->p_q_link;		/* proceed to next */
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -208,8 +208,8 @@ PUBLIC void system_init(void)
 | 
			
		||||
  map(SYS_UMAP, do_umap);		/* map virtual to physical address */
 | 
			
		||||
  map(SYS_VIRCOPY, do_vircopy); 	/* use pure virtual addressing */
 | 
			
		||||
  map(SYS_PHYSCOPY, do_copy);	 	/* use physical addressing */
 | 
			
		||||
  map(SYS_SAFECOPYFROM, do_safecopy);	/* copy with pre-granted permission */
 | 
			
		||||
  map(SYS_SAFECOPYTO, do_safecopy);	/* copy with pre-granted permission */
 | 
			
		||||
  map(SYS_SAFECOPYFROM, do_safecopy_from);/* copy with pre-granted permission */
 | 
			
		||||
  map(SYS_SAFECOPYTO, do_safecopy_to);	/* copy with pre-granted permission */
 | 
			
		||||
  map(SYS_VSAFECOPY, do_vsafecopy);	/* vectored safecopy */
 | 
			
		||||
 | 
			
		||||
  /* Mapping. */
 | 
			
		||||
 | 
			
		||||
@ -179,7 +179,8 @@ _PROTOTYPE( int do_vtimer, (struct proc * caller, message *m_ptr) );
 | 
			
		||||
#define do_vtimer do_unused
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
_PROTOTYPE( int do_safecopy, (struct proc * caller, message *m_ptr) );
 | 
			
		||||
_PROTOTYPE( int do_safecopy_to, (struct proc * caller, message *m_ptr) );
 | 
			
		||||
_PROTOTYPE( int do_safecopy_from, (struct proc * caller, message *m_ptr) );
 | 
			
		||||
_PROTOTYPE( int do_vsafecopy, (struct proc * caller, message *m_ptr) );
 | 
			
		||||
_PROTOTYPE( int do_iopenable, (struct proc * caller, message *m_ptr) );
 | 
			
		||||
_PROTOTYPE( int do_vmctl, (struct proc * caller, message *m_ptr) );
 | 
			
		||||
 | 
			
		||||
@ -335,27 +335,25 @@ int access;			/* CPF_READ for a copy from granter to grantee, CPF_WRITE
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*===========================================================================*
 | 
			
		||||
 *				do_safecopy				     *
 | 
			
		||||
 *				do_safecopy_to				     *
 | 
			
		||||
 *===========================================================================*/
 | 
			
		||||
PUBLIC int do_safecopy(struct proc * caller, message * m_ptr)
 | 
			
		||||
PUBLIC int do_safecopy_to(struct proc * caller, message * m_ptr)
 | 
			
		||||
{
 | 
			
		||||
	static int access, src_seg, dst_seg;
 | 
			
		||||
 | 
			
		||||
	/* Set src and dst parameters. */
 | 
			
		||||
	if(m_ptr->m_type == SYS_SAFECOPYFROM) {
 | 
			
		||||
		src_seg = D;
 | 
			
		||||
		dst_seg = m_ptr->SCP_SEG;
 | 
			
		||||
		access = CPF_READ;
 | 
			
		||||
	} else if(m_ptr->m_type == SYS_SAFECOPYTO) {
 | 
			
		||||
		src_seg = m_ptr->SCP_SEG;
 | 
			
		||||
		dst_seg = D;
 | 
			
		||||
		access = CPF_WRITE;
 | 
			
		||||
	} else panic("Impossible system call nr.: %d", m_ptr->m_type);
 | 
			
		||||
 | 
			
		||||
	return safecopy(caller, m_ptr->SCP_FROM_TO, caller->p_endpoint,
 | 
			
		||||
		(cp_grant_id_t) m_ptr->SCP_GID, src_seg, dst_seg,
 | 
			
		||||
		(cp_grant_id_t) m_ptr->SCP_GID, m_ptr->SCP_SEG, D,
 | 
			
		||||
		m_ptr->SCP_BYTES, m_ptr->SCP_OFFSET,
 | 
			
		||||
		(vir_bytes) m_ptr->SCP_ADDRESS, access);
 | 
			
		||||
		(vir_bytes) m_ptr->SCP_ADDRESS, CPF_WRITE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*===========================================================================*
 | 
			
		||||
 *				do_safecopy_from			     *
 | 
			
		||||
 *===========================================================================*/
 | 
			
		||||
PUBLIC int do_safecopy_from(struct proc * caller, message * m_ptr)
 | 
			
		||||
{
 | 
			
		||||
	return safecopy(caller, m_ptr->SCP_FROM_TO, caller->p_endpoint,
 | 
			
		||||
		(cp_grant_id_t) m_ptr->SCP_GID, D, m_ptr->SCP_SEG,
 | 
			
		||||
		m_ptr->SCP_BYTES, m_ptr->SCP_OFFSET,
 | 
			
		||||
		(vir_bytes) m_ptr->SCP_ADDRESS, CPF_READ);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*===========================================================================*
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user