All new accounts created on Gitlab now require administrator approval. If you invite any collaborators, please let Flux staff know so they can approve the accounts.

Commit 6fc489e4 authored by Pankaj Kumar's avatar Pankaj Kumar

Added Initial libcap grant file

parent 33293c86
......@@ -747,7 +747,7 @@ int __lcd_cap_grant(struct cspace *cspacesrc, cptr_t c_src,
/*
* Look up source
*/
ret = __lcd_cnode_get(cspacesrc, c_src, &cnodesrc);
ret = __lcd_cnode_get(cspacesrc, c_src, false, &cnodesrc);
if (ret) {
LCD_ERR("couldn't get source cnode");
goto fail1;
......
#include <lcd-domains/types.h>
#include "../internal.h"
/*
* Regular grant.
* This function is used to grant the capabilities from one cspace to other.
* Suppose A and B have an ipc channel that connects them. The operating
* system (user of libcap) could provide the following mechanism for A to
* grant rights to B.
* A does an "ipc send" and stores a2 in a special ipc message buffer,
* and B does a receive and stores b2 in its ipc receive buffer. When the
* operating system sees that, it would carry out the grant
* using libcap library in the following way:
*
* 1. Resolve process A to cspace A
* 2. Resolve process B to cspace B
* 3. Invoke grant function in the library (libcap):
*/
static int libcap_grant_capability(void *s_cspace, void *d_cspace,
unsigned long s_cptr, unsigned long d_cptr)
{
int ret;
struct cspace *src_cspace = (struct cspace *) s_cspace;
struct cspace *dest_cspace = (struct cspace *) d_cspace;
cptr_c src_cptr = (cptr_c) s_cptr;
cptr_c dest_cptr = (cptr_c) d_cptr;
if (cptr_is_null(c_src) || cptr_is_null(c_dst)) {
LCD_ERR("trying to grant with a null cptr");
return -EINVAL;
}
/* If we know source and destination cspace and corresponding
* c_ptr. Then we can simply use the functionality provided
* by the LCD framework
*/
ret = __lcd_cap_grant(src_cspace, src_cptr, dest_cspace, dest_cptr);
if (ret) {
LCD_ERR("failed to transfer cap @ 0x%lx in lcd %p to slot @ 0x%lx in lcd %p",
cptr_val(src_cptr), src_cspace, cptr_val(dest_cptr),
dest_cspace);
}
return ret;
}
/*
* Setting values of destination cnode based on src cnode.
* May be needed if such scenario exists.
*
*/
static int libcap_try_grant_cnode(void *cspacedst, void *cnodesrc,
void *cnodedst)
{
/*
* Set dest cnode's fields with source's
* Removed cdt part from LCD stuff. Assuming cdt is maintained by user.
*/
((struct cnode*) cnodedst)->type = ((struct cnode*) cnodesrc)->type;
((struct cnode*) cnodedst)->object = ((struct cnode*) cnodesrc)->object;
((struct cnode*) cnodedst)->cspace = (struct cspace*) cspacedst;
((struct cnode*) cnodedst)->cdt_root = ((struct cnode*) cnodesrc)->cdt_root;
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment