vm: Extend the vm_memctl() interface.

Change-Id: I87b7c188bd1fc54a3ec943e7ff1d05c6f4c8a56a
This commit is contained in:
Cristiano Giuffrida 2014-03-11 23:22:55 +01:00 committed by David van Moolenbroek
parent 7f439d4656
commit 48f446ecd5
5 changed files with 96 additions and 9 deletions

View file

@ -713,6 +713,11 @@
# define VM_RS_CTL_REQ m1_i2 # define VM_RS_CTL_REQ m1_i2
# define VM_RS_MEM_PIN 0 /* pin memory */ # define VM_RS_MEM_PIN 0 /* pin memory */
# define VM_RS_MEM_MAKE_VM 1 /* make VM instance */ # define VM_RS_MEM_MAKE_VM 1 /* make VM instance */
# define VM_RS_MEM_HEAP_PREALLOC 2 /* preallocate heap regions */
# define VM_RS_MEM_MAP_PREALLOC 3 /* preallocate mmaped regions */
# define VM_RS_MEM_GET_PREALLOC_MAP 4 /* get preallocated mmaped regions */
# define VM_RS_CTL_ADDR m2_p1
# define VM_RS_CTL_LEN m2_i3
#define VM_WATCH_EXIT (VM_RQ_BASE+43) #define VM_WATCH_EXIT (VM_RQ_BASE+43)

View file

@ -18,7 +18,7 @@ int vm_unmap_phys(endpoint_t who, void *vaddr, size_t len);
int vm_notify_sig(endpoint_t ep, endpoint_t ipc_ep); int vm_notify_sig(endpoint_t ep, endpoint_t ipc_ep);
int vm_set_priv(endpoint_t ep, void *buf, int sys_proc); int vm_set_priv(endpoint_t ep, void *buf, int sys_proc);
int vm_update(endpoint_t src_e, endpoint_t dst_e, int flags); int vm_update(endpoint_t src_e, endpoint_t dst_e, int flags);
int vm_memctl(endpoint_t ep, int req); int vm_memctl(endpoint_t ep, int req, void** addr, size_t *len);
int vm_query_exit(endpoint_t *endpt); int vm_query_exit(endpoint_t *endpt);
int vm_watch_exit(endpoint_t ep); int vm_watch_exit(endpoint_t ep);
int minix_vfs_mmap(endpoint_t who, off_t offset, size_t len, int minix_vfs_mmap(endpoint_t who, off_t offset, size_t len,

View file

@ -3,13 +3,27 @@
#include <string.h> #include <string.h>
int int
vm_memctl(endpoint_t ep, int req) vm_memctl(endpoint_t ep, int req, void** addr, size_t *len)
{ {
message m; message m;
int r;
memset(&m, 0, sizeof(m)); memset(&m, 0, sizeof(m));
m.VM_RS_CTL_ENDPT = ep; m.VM_RS_CTL_ENDPT = ep;
m.VM_RS_CTL_REQ = req; m.VM_RS_CTL_REQ = req;
m.VM_RS_CTL_ADDR = addr ? *addr : 0;
m.VM_RS_CTL_LEN = len ? *len : 0;
return _taskcall(VM_PROC_NR, VM_RS_MEMCTL, &m); r = _taskcall(VM_PROC_NR, VM_RS_MEMCTL, &m);
if(r != OK) {
return r;
}
if(addr) {
*addr = m.VM_RS_CTL_ADDR;
}
if(addr) {
*len = m.VM_RS_CTL_LEN;
}
return OK;
} }

View file

@ -487,7 +487,7 @@ struct rproc *rp;
|| (s = sys_getpriv(&rp->r_priv, child_proc_nr_e)) != OK) { || (s = sys_getpriv(&rp->r_priv, child_proc_nr_e)) != OK) {
printf("RS: unable to set privilege structure: %d\n", s); printf("RS: unable to set privilege structure: %d\n", s);
cleanup_service(rp); cleanup_service(rp);
vm_memctl(RS_PROC_NR, VM_RS_MEM_PIN); vm_memctl(RS_PROC_NR, VM_RS_MEM_PIN, 0, 0);
return ENOMEM; return ENOMEM;
} }
@ -495,7 +495,7 @@ struct rproc *rp;
if ((s = sched_init_proc(rp)) != OK) { if ((s = sched_init_proc(rp)) != OK) {
printf("RS: unable to start scheduling: %d\n", s); printf("RS: unable to start scheduling: %d\n", s);
cleanup_service(rp); cleanup_service(rp);
vm_memctl(RS_PROC_NR, VM_RS_MEM_PIN); vm_memctl(RS_PROC_NR, VM_RS_MEM_PIN,0,0);
return s; return s;
} }
@ -511,7 +511,7 @@ struct rproc *rp;
if ((s = read_exec(rp)) != OK) { if ((s = read_exec(rp)) != OK) {
printf("RS: read_exec failed: %d\n", s); printf("RS: read_exec failed: %d\n", s);
cleanup_service(rp); cleanup_service(rp);
vm_memctl(RS_PROC_NR, VM_RS_MEM_PIN); vm_memctl(RS_PROC_NR, VM_RS_MEM_PIN, 0, 0);
return s; return s;
} }
} }
@ -519,7 +519,7 @@ struct rproc *rp;
printf("RS: execing child with srv_execve()...\n"); printf("RS: execing child with srv_execve()...\n");
s = srv_execve(child_proc_nr_e, rp->r_exec, rp->r_exec_len, rp->r_argv, s = srv_execve(child_proc_nr_e, rp->r_exec, rp->r_exec_len, rp->r_argv,
environ); environ);
vm_memctl(RS_PROC_NR, VM_RS_MEM_PIN); vm_memctl(RS_PROC_NR, VM_RS_MEM_PIN, 0, 0);
if (s != OK) { if (s != OK) {
printf("RS: srv_execve failed: %d\n", s); printf("RS: srv_execve failed: %d\n", s);
cleanup_service(rp); cleanup_service(rp);
@ -534,7 +534,7 @@ struct rproc *rp;
if(rs_verbose) if(rs_verbose)
printf("RS: informing VM of instance %s\n", srv_to_string(rp)); printf("RS: informing VM of instance %s\n", srv_to_string(rp));
s = vm_memctl(rpub->endpoint, VM_RS_MEM_MAKE_VM); s = vm_memctl(rpub->endpoint, VM_RS_MEM_MAKE_VM, 0, 0);
if(s != OK) { if(s != OK) {
printf("vm_memctl failed: %d\n", s); printf("vm_memctl failed: %d\n", s);
cleanup_service(rp); cleanup_service(rp);
@ -1129,7 +1129,7 @@ static int run_script(struct rproc *rp)
return kill_service(rp,"can't let the script run",r); return kill_service(rp,"can't let the script run",r);
} }
/* Pin RS memory again after fork()ing. */ /* Pin RS memory again after fork()ing. */
vm_memctl(RS_PROC_NR, VM_RS_MEM_PIN); vm_memctl(RS_PROC_NR, VM_RS_MEM_PIN, 0, 0);
} }
return OK; return OK;
} }

View file

@ -167,6 +167,65 @@ static int rs_memctl_make_vm_instance(struct vmproc *new_vm_vmp)
return OK; return OK;
} }
/*===========================================================================*
* rs_memctl_heap_prealloc *
*===========================================================================*/
static int rs_memctl_heap_prealloc(struct vmproc *vmp,
vir_bytes *addr, size_t *len)
{
/*
* XXX: Is this still needed?
*/
return OK;
}
/*===========================================================================*
* rs_memctl_map_prealloc *
*===========================================================================*/
static int rs_memctl_map_prealloc(struct vmproc *vmp,
vir_bytes *addr, size_t *len)
{
#if 0
struct vir_region *vr;
if(*len <= 0) {
return EINVAL;
}
*len = CLICK_CEIL(*len);
if(!(vr = map_page_region(vmp, VM_DATATOP - *len, VM_DATATOP, *len,
MAP_NONE, VR_ANON|VR_WRITABLE|VR_CONTIG, MF_PREALLOC))) {
return ENOMEM;
}
map_region_set_tag(vr, VRT_PREALLOC_MAP);
*addr = arch_map2vir(vmp, vr->vaddr);
#endif
return OK;
}
/*===========================================================================*
* rs_memctl_get_prealloc_map *
*===========================================================================*/
static int rs_memctl_get_prealloc_map(struct vmproc *vmp,
vir_bytes *addr, size_t *len)
{
#if 0
struct vir_region *vr;
vr = map_region_lookup_tag(vmp, VRT_PREALLOC_MAP);
if(!vr) {
*addr = 0;
*len = 0;
}
else {
*addr = arch_map2vir(vmp, vr->vaddr);
*len = vr->length;
}
#endif
return OK;
}
/*===========================================================================* /*===========================================================================*
* do_rs_memctl * * do_rs_memctl *
*===========================================================================*/ *===========================================================================*/
@ -207,6 +266,15 @@ int do_rs_memctl(message *m_ptr)
case VM_RS_MEM_MAKE_VM: case VM_RS_MEM_MAKE_VM:
r = rs_memctl_make_vm_instance(vmp); r = rs_memctl_make_vm_instance(vmp);
return r; return r;
case VM_RS_MEM_HEAP_PREALLOC:
r = rs_memctl_heap_prealloc(vmp, (vir_bytes*) &m_ptr->VM_RS_CTL_ADDR, (size_t*) &m_ptr->VM_RS_CTL_LEN);
return r;
case VM_RS_MEM_MAP_PREALLOC:
r = rs_memctl_map_prealloc(vmp, (vir_bytes*) &m_ptr->VM_RS_CTL_ADDR, (size_t*) &m_ptr->VM_RS_CTL_LEN);
return r;
case VM_RS_MEM_GET_PREALLOC_MAP:
r = rs_memctl_get_prealloc_map(vmp, (vir_bytes*) &m_ptr->VM_RS_CTL_ADDR, (size_t*) &m_ptr->VM_RS_CTL_LEN);
return r;
default: default:
printf("do_rs_memctl: bad request %d\n", req); printf("do_rs_memctl: bad request %d\n", req);
return EINVAL; return EINVAL;