make vfs & filesystems use failable copying
[minix3.git] / kernel / arch / i386 / arch_do_vmctl.c
blobc6f36ec46ba28e37ea3fefe8941ddbcca70053b5
1 /* The kernel call implemented in this file:
2 * m_type: SYS_VMCTL
4 * The parameters for this kernel call are:
5 * SVMCTL_WHO which process
6 * SVMCTL_PARAM set this setting (VMCTL_*)
7 * SVMCTL_VALUE to this value
8 */
10 #include "kernel/system.h"
11 #include <assert.h>
12 #include <minix/type.h>
14 #include "arch_proto.h"
16 extern phys_bytes video_mem_vaddr;
18 extern char *video_mem;
20 static void setcr3(struct proc *p, u32_t cr3, u32_t *v)
22 /* Set process CR3. */
23 p->p_seg.p_cr3 = cr3;
24 assert(p->p_seg.p_cr3);
25 p->p_seg.p_cr3_v = v;
26 if(p == get_cpulocal_var(ptproc)) {
27 write_cr3(p->p_seg.p_cr3);
29 if(p->p_nr == VM_PROC_NR) {
30 if (arch_enable_paging(p) != OK)
31 panic("arch_enable_paging failed");
33 RTS_UNSET(p, RTS_VMINHIBIT);
36 /*===========================================================================*
37 * arch_do_vmctl *
38 *===========================================================================*/
39 int arch_do_vmctl(m_ptr, p)
40 register message *m_ptr; /* pointer to request message */
41 struct proc *p;
43 switch(m_ptr->SVMCTL_PARAM) {
44 case VMCTL_GET_PDBR:
45 /* Get process page directory base reg (CR3). */
46 m_ptr->SVMCTL_VALUE = p->p_seg.p_cr3;
47 return OK;
48 case VMCTL_SETADDRSPACE:
49 setcr3(p, m_ptr->SVMCTL_PTROOT, (u32_t *) m_ptr->SVMCTL_PTROOT_V);
50 return OK;
51 case VMCTL_FLUSHTLB:
53 reload_cr3();
54 return OK;
56 case VMCTL_I386_INVLPG:
58 i386_invlpg(m_ptr->SVMCTL_VALUE);
59 return OK;
65 printf("arch_do_vmctl: strange param %d\n", m_ptr->SVMCTL_PARAM);
66 return EINVAL;