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;
|
caller_ptr->p_sendto_e = dst_e;
|
||||||
|
|
||||||
/* Process is now blocked. Put in on the destination's queue. */
|
/* 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 */
|
xpp = &dst_ptr->p_caller_q; /* find end of list */
|
||||||
while (*xpp) xpp = &(*xpp)->p_q_link;
|
while (*xpp) xpp = &(*xpp)->p_q_link;
|
||||||
*xpp = caller_ptr; /* add caller to end */
|
*xpp = caller_ptr; /* add caller to end */
|
||||||
|
caller_ptr->p_q_link = NULL; /* mark new end of list */
|
||||||
}
|
}
|
||||||
return(OK);
|
return(OK);
|
||||||
}
|
}
|
||||||
|
@ -697,40 +697,37 @@ const int flags;
|
||||||
/* Check caller queue. Use pointer pointers to keep code simple. */
|
/* Check caller queue. Use pointer pointers to keep code simple. */
|
||||||
xpp = &caller_ptr->p_caller_q;
|
xpp = &caller_ptr->p_caller_q;
|
||||||
while (*xpp) {
|
while (*xpp) {
|
||||||
struct proc * sender = *xpp;
|
if (src_e == ANY || src_p == proc_nr(*xpp)) {
|
||||||
|
|
||||||
if (src_e == ANY || src_p == proc_nr(sender)) {
|
|
||||||
int call;
|
int call;
|
||||||
assert(!RTS_ISSET(sender, RTS_SLOT_FREE));
|
assert(!RTS_ISSET(*xpp, RTS_SLOT_FREE));
|
||||||
assert(!RTS_ISSET(sender, RTS_NO_ENDPOINT));
|
assert(!RTS_ISSET(*xpp, RTS_NO_ENDPOINT));
|
||||||
|
|
||||||
/* Found acceptable message. Copy it and update status. */
|
/* Found acceptable message. Copy it and update status. */
|
||||||
assert(!(caller_ptr->p_misc_flags & MF_DELIVERMSG));
|
assert(!(caller_ptr->p_misc_flags & MF_DELIVERMSG));
|
||||||
caller_ptr->p_delivermsg = sender->p_sendmsg;
|
caller_ptr->p_delivermsg = (*xpp)->p_sendmsg;
|
||||||
caller_ptr->p_delivermsg.m_source = sender->p_endpoint;
|
caller_ptr->p_delivermsg.m_source = (*xpp)->p_endpoint;
|
||||||
caller_ptr->p_misc_flags |= MF_DELIVERMSG;
|
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);
|
IPC_STATUS_ADD_CALL(caller_ptr, call);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* if the message is originaly from the kernel on behalf of this
|
* if the message is originaly from the kernel on behalf of this
|
||||||
* process, we must send the status flags accordingly
|
* 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);
|
IPC_STATUS_ADD_FLAGS(caller_ptr, IPC_FLG_MSG_FROM_KERNEL);
|
||||||
/* we can clean the flag now, not need anymore */
|
/* 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)
|
if ((*xpp)->p_misc_flags & MF_SIG_DELAY)
|
||||||
sig_delay_done(sender);
|
sig_delay_done(*xpp);
|
||||||
|
|
||||||
*xpp = sender->p_q_link; /* remove from queue */
|
*xpp = (*xpp)->p_q_link; /* remove from queue */
|
||||||
sender->p_q_link = NULL;
|
|
||||||
return(OK); /* report success */
|
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_UMAP, do_umap); /* map virtual to physical address */
|
||||||
map(SYS_VIRCOPY, do_vircopy); /* use pure virtual addressing */
|
map(SYS_VIRCOPY, do_vircopy); /* use pure virtual addressing */
|
||||||
map(SYS_PHYSCOPY, do_copy); /* use physical addressing */
|
map(SYS_PHYSCOPY, do_copy); /* use physical addressing */
|
||||||
map(SYS_SAFECOPYFROM, do_safecopy); /* copy with pre-granted permission */
|
map(SYS_SAFECOPYFROM, do_safecopy_from);/* copy with pre-granted permission */
|
||||||
map(SYS_SAFECOPYTO, do_safecopy); /* copy with pre-granted permission */
|
map(SYS_SAFECOPYTO, do_safecopy_to); /* copy with pre-granted permission */
|
||||||
map(SYS_VSAFECOPY, do_vsafecopy); /* vectored safecopy */
|
map(SYS_VSAFECOPY, do_vsafecopy); /* vectored safecopy */
|
||||||
|
|
||||||
/* Mapping. */
|
/* Mapping. */
|
||||||
|
|
|
@ -179,7 +179,8 @@ _PROTOTYPE( int do_vtimer, (struct proc * caller, message *m_ptr) );
|
||||||
#define do_vtimer do_unused
|
#define do_vtimer do_unused
|
||||||
#endif
|
#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_vsafecopy, (struct proc * caller, message *m_ptr) );
|
||||||
_PROTOTYPE( int do_iopenable, (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) );
|
_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,
|
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,
|
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…
Reference in a new issue