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>
30 /*===========================================================================*
32 *===========================================================================*/
33 int do_rs_set_priv(message
*m
)
40 if ((r
= vm_isokendpt(nr
, &n
)) != OK
) {
41 printf("do_rs_set_priv: bad endpoint %d\n", nr
);
48 r
= sys_datacopy(m
->m_source
, (vir_bytes
) m
->VM_RS_BUF
,
49 SELF
, (vir_bytes
) vmp
->vm_call_mask
,
50 sizeof(vmp
->vm_call_mask
));
58 /*===========================================================================*
60 *===========================================================================*/
61 int do_rs_update(message
*m_ptr
)
63 endpoint_t src_e
, dst_e
, reply_e
;
65 struct vmproc
*src_vmp
, *dst_vmp
;
68 src_e
= m_ptr
->VM_RS_SRC_ENDPT
;
69 dst_e
= m_ptr
->VM_RS_DST_ENDPT
;
71 /* Lookup slots for source and destination process. */
72 if(vm_isokendpt(src_e
, &src_p
) != OK
) {
73 printf("do_rs_update: bad src endpoint %d\n", src_e
);
76 src_vmp
= &vmproc
[src_p
];
77 if(vm_isokendpt(dst_e
, &dst_p
) != OK
) {
78 printf("do_rs_update: bad dst endpoint %d\n", dst_e
);
81 dst_vmp
= &vmproc
[dst_p
];
83 /* Let the kernel do the update first. */
84 r
= sys_update(src_e
, dst_e
);
89 /* Do the update in VM now. */
90 r
= swap_proc_slot(src_vmp
, dst_vmp
);
94 r
= swap_proc_dyn_data(src_vmp
, dst_vmp
);
98 pt_bind(&src_vmp
->vm_pt
, src_vmp
);
99 pt_bind(&dst_vmp
->vm_pt
, dst_vmp
);
101 /* Reply, update-aware. */
102 reply_e
= m_ptr
->m_source
;
103 if(reply_e
== src_e
) reply_e
= dst_e
;
104 else if(reply_e
== dst_e
) reply_e
= src_e
;
106 r
= send(reply_e
, m_ptr
);
108 panic("send() error");
114 /*===========================================================================*
115 * rs_memctl_make_vm_instance *
116 *===========================================================================*/
117 static int rs_memctl_make_vm_instance(struct vmproc
*new_vm_vmp
)
122 struct vmproc
*this_vm_vmp
;
124 this_vm_vmp
= &vmproc
[VM_PROC_NR
];
126 /* Pin memory for the new VM instance. */
127 r
= map_pin_memory(new_vm_vmp
);
132 /* Preallocate page tables for the entire address space for both
133 * VM and the new VM instance.
137 r
= pt_ptalloc_in_range(&this_vm_vmp
->vm_pt
, 0, 0, flags
, verify
);
141 r
= pt_ptalloc_in_range(&new_vm_vmp
->vm_pt
, 0, 0, flags
, verify
);
146 /* Let the new VM instance map VM's page tables and its own. */
147 r
= pt_ptmap(this_vm_vmp
, new_vm_vmp
);
151 r
= pt_ptmap(new_vm_vmp
, new_vm_vmp
);
159 /*===========================================================================*
161 *===========================================================================*/
162 int do_rs_memctl(message
*m_ptr
)
168 ep
= m_ptr
->VM_RS_CTL_ENDPT
;
169 req
= m_ptr
->VM_RS_CTL_REQ
;
171 /* Lookup endpoint. */
172 if ((r
= vm_isokendpt(ep
, &proc_nr
)) != OK
) {
173 printf("do_rs_memctl: bad endpoint %d\n", ep
);
176 vmp
= &vmproc
[proc_nr
];
178 /* Process request. */
183 /* Do not perform VM_RS_MEM_PIN yet - it costs the full
184 * size of the RS stack (64MB by default) in memory,
185 * and it's needed for functionality that isn't complete /
186 * merged in current Minix (surviving VM crashes).
190 r
= map_pin_memory(vmp
);
196 case VM_RS_MEM_MAKE_VM
:
197 r
= rs_memctl_make_vm_instance(vmp
);
200 printf("do_rs_memctl: bad request %d\n", req
);