4 #include <minix/callnr.h>
6 #include <minix/config.h>
7 #include <minix/const.h>
9 #include <minix/endpoint.h>
10 #include <minix/keymap.h>
11 #include <minix/minlib.h>
12 #include <minix/type.h>
13 #include <minix/ipc.h>
14 #include <minix/sysutil.h>
15 #include <minix/syslib.h>
16 #include <minix/safecopies.h>
17 #include <minix/bitmap.h>
31 /*===========================================================================*
33 *===========================================================================*/
34 int do_rs_set_priv(message
*m
)
41 if ((r
= vm_isokendpt(nr
, &n
)) != OK
) {
42 printf("do_rs_set_priv: bad endpoint %d\n", nr
);
49 r
= sys_datacopy(m
->m_source
, (vir_bytes
) m
->VM_RS_BUF
,
50 SELF
, (vir_bytes
) vmp
->vm_call_mask
,
51 sizeof(vmp
->vm_call_mask
));
59 /*===========================================================================*
61 *===========================================================================*/
62 int do_rs_update(message
*m_ptr
)
64 endpoint_t src_e
, dst_e
, reply_e
;
66 struct vmproc
*src_vmp
, *dst_vmp
;
69 src_e
= m_ptr
->VM_RS_SRC_ENDPT
;
70 dst_e
= m_ptr
->VM_RS_DST_ENDPT
;
72 /* Lookup slots for source and destination process. */
73 if(vm_isokendpt(src_e
, &src_p
) != OK
) {
74 printf("do_rs_update: bad src endpoint %d\n", src_e
);
77 src_vmp
= &vmproc
[src_p
];
78 if(vm_isokendpt(dst_e
, &dst_p
) != OK
) {
79 printf("do_rs_update: bad dst endpoint %d\n", dst_e
);
82 dst_vmp
= &vmproc
[dst_p
];
84 /* Let the kernel do the update first. */
85 r
= sys_update(src_e
, dst_e
);
90 /* Do the update in VM now. */
91 r
= swap_proc_slot(src_vmp
, dst_vmp
);
95 r
= swap_proc_dyn_data(src_vmp
, dst_vmp
);
99 pt_bind(&src_vmp
->vm_pt
, src_vmp
);
100 pt_bind(&dst_vmp
->vm_pt
, dst_vmp
);
102 /* Reply, update-aware. */
103 reply_e
= m_ptr
->m_source
;
104 if(reply_e
== src_e
) reply_e
= dst_e
;
105 else if(reply_e
== dst_e
) reply_e
= src_e
;
107 r
= send(reply_e
, m_ptr
);
109 panic("send() error");
115 /*===========================================================================*
116 * rs_memctl_make_vm_instance *
117 *===========================================================================*/
118 static int rs_memctl_make_vm_instance(struct vmproc
*new_vm_vmp
)
123 struct vmproc
*this_vm_vmp
;
125 this_vm_vmp
= &vmproc
[VM_PROC_NR
];
127 /* Pin memory for the new VM instance. */
128 r
= map_pin_memory(new_vm_vmp
);
133 /* Preallocate page tables for the entire address space for both
134 * VM and the new VM instance.
138 r
= pt_ptalloc_in_range(&this_vm_vmp
->vm_pt
, 0, 0, flags
, verify
);
142 r
= pt_ptalloc_in_range(&new_vm_vmp
->vm_pt
, 0, 0, flags
, verify
);
147 /* Let the new VM instance map VM's page tables and its own. */
148 r
= pt_ptmap(this_vm_vmp
, new_vm_vmp
);
152 r
= pt_ptmap(new_vm_vmp
, new_vm_vmp
);
160 /*===========================================================================*
162 *===========================================================================*/
163 int do_rs_memctl(message
*m_ptr
)
169 ep
= m_ptr
->VM_RS_CTL_ENDPT
;
170 req
= m_ptr
->VM_RS_CTL_REQ
;
172 /* Lookup endpoint. */
173 if ((r
= vm_isokendpt(ep
, &proc_nr
)) != OK
) {
174 printf("do_rs_memctl: bad endpoint %d\n", ep
);
177 vmp
= &vmproc
[proc_nr
];
179 /* Process request. */
184 /* Do not perform VM_RS_MEM_PIN yet - it costs the full
185 * size of the RS stack (64MB by default) in memory,
186 * and it's needed for functionality that isn't complete /
187 * merged in current Minix (surviving VM crashes).
191 r
= map_pin_memory(vmp
);
197 case VM_RS_MEM_MAKE_VM
:
198 r
= rs_memctl_make_vm_instance(vmp
);
201 printf("do_rs_memctl: bad request %d\n", req
);