1 /* The kernel call implemented in this file:
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
10 #include "kernel/system.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. */
24 assert(p
->p_seg
.p_cr3
);
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 /*===========================================================================*
38 *===========================================================================*/
39 int arch_do_vmctl(m_ptr
, p
)
40 register message
*m_ptr
; /* pointer to request message */
43 switch(m_ptr
->SVMCTL_PARAM
) {
45 /* Get process page directory base reg (CR3). */
46 m_ptr
->SVMCTL_VALUE
= p
->p_seg
.p_cr3
;
48 case VMCTL_SETADDRSPACE
:
49 setcr3(p
, m_ptr
->SVMCTL_PTROOT
, (u32_t
*) m_ptr
->SVMCTL_PTROOT_V
);
56 case VMCTL_I386_INVLPG
:
58 i386_invlpg(m_ptr
->SVMCTL_VALUE
);
65 printf("arch_do_vmctl: strange param %d\n", m_ptr
->SVMCTL_PARAM
);