Exemple #1
0
int ds_retrieve_map(const char *ds_name, char *vaddr, size_t *length,
		int nr_snapshot, int flags)
{
	cp_grant_id_t gid;
	int r;

	/* Map a mapped memory range. */
	if(flags & DSMF_MAP_MAPPED) {
		/* Request DS to grant. */
		m.DS_FLAGS = DSF_TYPE_MAP | DSMF_MAP_MAPPED;
		r = do_invoke_ds(DS_RETRIEVE, ds_name);
		if(r != OK)
			return r;

		/* Do the safemap. */
		if(*length > (size_t) m.DS_VAL_LEN)
			*length = (size_t) m.DS_VAL_LEN;
		*length = (size_t) CLICK_FLOOR(*length);
		r = sys_safemap(DS_PROC_NR, m.DS_VAL, 0,
				(vir_bytes)vaddr, *length, D, 0);

	/* Copy mapped memory range or a snapshot. */
	} else if(flags & (DSMF_COPY_MAPPED|DSMF_COPY_SNAPSHOT)) {
		/* Grant for memory range first. */
		gid = cpf_grant_direct(DS_PROC_NR, (vir_bytes)vaddr,
				*length, CPF_WRITE);
		if(!GRANT_VALID(gid))
			return errno;

		m.DS_VAL = gid;
		m.DS_VAL_LEN = *length;
		if(flags & DSMF_COPY_MAPPED) {
			m.DS_FLAGS = DSF_TYPE_MAP | DSMF_COPY_MAPPED;
		}
		else {
			m.DS_NR_SNAPSHOT = nr_snapshot;
			m.DS_FLAGS = DSF_TYPE_MAP | DSMF_COPY_SNAPSHOT;
		}
		r = do_invoke_ds(DS_RETRIEVE, ds_name);
		*length = m.DS_VAL_LEN;
		cpf_revoke(gid);
	}
	else {
		return EINVAL;
	}

	return r;
}
Exemple #2
0
int ds_retrieve_label_name(char *ds_name, u32_t num)
{
	int r;
	m.DS_VAL = num;
	r = do_invoke_ds(DS_RETRIEVE_LABEL, ds_name);
	return r;
}
Exemple #3
0
int ds_check(char *ds_key, int *type)
{
	int r;
	r = do_invoke_ds(DS_CHECK, ds_key);
	*type = m.DS_FLAGS;
	return r;
}
Exemple #4
0
int ds_retrieve_label_name(char *ds_name, endpoint_t endpoint)
{
	int r;
	m.DS_VAL = (u32_t) endpoint;
	r = do_invoke_ds(DS_RETRIEVE_LABEL, ds_name);
	return r;
}
Exemple #5
0
int ds_snapshot_map(const char *ds_name, int *nr_snapshot)
{
	int r;
	r = do_invoke_ds(DS_SNAPSHOT, ds_name);
	*nr_snapshot = m.DS_NR_SNAPSHOT;
	return r;
}
Exemple #6
0
int ds_retrieve_u32(const char *ds_name, u32_t *value)
{
	int r;
	m.DS_FLAGS = DSF_TYPE_U32;
	r = do_invoke_ds(DS_RETRIEVE, ds_name);
	*value = m.DS_VAL;
	return r;
}
Exemple #7
0
int ds_retrieve_label_endpt(const char *ds_name, endpoint_t *endpoint)
{
	int r;
	m.DS_FLAGS = DSF_TYPE_LABEL;
	r = do_invoke_ds(DS_RETRIEVE, ds_name);
	*endpoint = (endpoint_t) m.DS_VAL;
	return r;
}
Exemple #8
0
int ds_publish_str(const char *ds_name, char *value, int flags)
{
	if(strlen(value) >= DS_MAX_STRLEN)
		return EINVAL;
	strcpy((char *)(&m.DS_STRING), value);
	m.DS_FLAGS = DSF_TYPE_STR | flags;
	return do_invoke_ds(DS_PUBLISH, ds_name);
}
Exemple #9
0
int ds_check(char *ds_key, int *type, endpoint_t *owner_e)
{
	int r;
	r = do_invoke_ds(DS_CHECK, ds_key);
	if(type) *type = m.DS_FLAGS;
	if(owner_e) *owner_e = m.DS_OWNER;
	return r;
}
Exemple #10
0
int ds_retrieve_str(const char *ds_name, char *value, size_t len_str)
{
	int r;
	m.DS_FLAGS = DSF_TYPE_STR;
	r = do_invoke_ds(DS_RETRIEVE, ds_name);
	strncpy(value, (char *)(&m.DS_STRING), DS_MAX_STRLEN);
	value[DS_MAX_STRLEN - 1] = '\0';
	return r;
}
Exemple #11
0
int ds_publish_mem(const char *ds_name, void *vaddr, size_t length, int flags)
{
	cp_grant_id_t gid;
	int r;

	/* Grant for memory range. */
	gid = cpf_grant_direct(DS_PROC_NR, (vir_bytes)vaddr, length, CPF_READ);
	if(!GRANT_VALID(gid))
		return errno;

	m.DS_VAL = gid;
	m.DS_VAL_LEN = length;
	m.DS_FLAGS = DSF_TYPE_MEM | flags;

	r = do_invoke_ds(DS_PUBLISH, ds_name);
	cpf_revoke(gid);

	return r;
}
Exemple #12
0
int ds_retrieve_mem(const char *ds_name, char *vaddr, size_t *length)
{
	cp_grant_id_t gid;
	int r;

	/* Grant for memory range. */
	gid = cpf_grant_direct(DS_PROC_NR, (vir_bytes)vaddr, *length, CPF_WRITE);
	if(!GRANT_VALID(gid))
		return errno;

	m.DS_VAL = gid;
	m.DS_VAL_LEN = *length;
	m.DS_FLAGS = DSF_TYPE_MEM;
	r = do_invoke_ds(DS_RETRIEVE, ds_name);
	*length = m.DS_VAL_LEN;
	cpf_revoke(gid);

	return r;
}
Exemple #13
0
int ds_publish_map(const char *ds_name, void *vaddr, size_t length, int flags)
{
	cp_grant_id_t gid;
	int r;

	if(((vir_bytes)vaddr % CLICK_SIZE != 0) || (length % CLICK_SIZE != 0))
		return EINVAL;

	/* Grant for mapped memory range. */
	gid = cpf_grant_direct(DS_PROC_NR, (vir_bytes)vaddr, length,
			CPF_READ | CPF_MAP);
	if(!GRANT_VALID(gid))
		return errno;

	m.DS_VAL = gid;
	m.DS_VAL_LEN = length;
	m.DS_FLAGS = DSF_TYPE_MAP | flags;

	r = do_invoke_ds(DS_PUBLISH, ds_name);

	return r;
}
Exemple #14
0
int ds_publish_u32(const char *ds_name, u32_t value, int flags)
{
	m.DS_VAL = value;
	m.DS_FLAGS = DSF_TYPE_U32 | flags;
	return do_invoke_ds(DS_PUBLISH, ds_name);
}
Exemple #15
0
int ds_delete_u32(const char *ds_name)
{
	m.DS_FLAGS = DSF_TYPE_U32;
	return do_invoke_ds(DS_DELETE, ds_name);
}
Exemple #16
0
int ds_publish_label(const char *ds_name, endpoint_t endpoint, int flags)
{
	m.DS_VAL = (u32_t) endpoint;
	m.DS_FLAGS = DSF_TYPE_LABEL | flags;
	return do_invoke_ds(DS_PUBLISH, ds_name);
}
Exemple #17
0
int ds_delete_str(const char *ds_name)
{
	m.DS_FLAGS = DSF_TYPE_STR;
	return do_invoke_ds(DS_DELETE, ds_name);
}
Exemple #18
0
int ds_subscribe(const char *regexp, int flags)
{
	m.DS_FLAGS = flags;
	return do_invoke_ds(DS_SUBSCRIBE, regexp);
}
Exemple #19
0
int ds_delete_label(const char *ds_name)
{
	m.DS_FLAGS = DSF_TYPE_LABEL;
	return do_invoke_ds(DS_DELETE, ds_name);
}
Exemple #20
0
int ds_delete_map(const char *ds_name)
{
	m.DS_FLAGS = DSF_TYPE_MAP;
	return do_invoke_ds(DS_DELETE, ds_name);
}