vm: Extend the vm_memctl() interface.
Change-Id: I87b7c188bd1fc54a3ec943e7ff1d05c6f4c8a56a
This commit is contained in:
parent
7f439d4656
commit
48f446ecd5
5 changed files with 96 additions and 9 deletions
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue