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"
13 #include "arch_proto.h"
15 extern phys_bytes video_mem_vaddr
;
17 extern char *video_mem
;
19 static void setcr3(struct proc
*p
, u32_t cr3
, u32_t
*v
)
21 /* Set process CR3. */
23 assert(p
->p_seg
.p_cr3
);
25 if(p
== get_cpulocal_var(ptproc
)) {
26 write_cr3(p
->p_seg
.p_cr3
);
28 if(p
->p_nr
== VM_PROC_NR
) {
29 if (arch_enable_paging(p
) != OK
)
30 panic("arch_enable_paging failed");
32 RTS_UNSET(p
, RTS_VMINHIBIT
);
35 /*===========================================================================*
37 *===========================================================================*/
39 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
);