68 lines
1.5 KiB
C
68 lines
1.5 KiB
C
|
/* The kernel call implemented in this file:
|
||
|
* m_type: SYS_VMCTL
|
||
|
*
|
||
|
* The parameters for this kernel call are:
|
||
|
* SVMCTL_WHO which process
|
||
|
* SVMCTL_PARAM set this setting (VMCTL_*)
|
||
|
* SVMCTL_VALUE to this value
|
||
|
*/
|
||
|
|
||
|
#include "kernel/system.h"
|
||
|
#include <assert.h>
|
||
|
#include <minix/type.h>
|
||
|
|
||
|
#include "arch_proto.h"
|
||
|
|
||
|
extern phys_bytes video_mem_vaddr;
|
||
|
|
||
|
extern char *video_mem;
|
||
|
|
||
|
static void setcr3(struct proc *p, u32_t cr3, u32_t *v)
|
||
|
{
|
||
|
/* Set process CR3. */
|
||
|
p->p_seg.p_cr3 = cr3;
|
||
|
assert(p->p_seg.p_cr3);
|
||
|
p->p_seg.p_cr3_v = v;
|
||
|
if(p == get_cpulocal_var(ptproc)) {
|
||
|
write_cr3(p->p_seg.p_cr3);
|
||
|
}
|
||
|
if(p->p_nr == VM_PROC_NR) {
|
||
|
if (arch_enable_paging(p) != OK)
|
||
|
panic("arch_enable_paging failed");
|
||
|
}
|
||
|
RTS_UNSET(p, RTS_VMINHIBIT);
|
||
|
}
|
||
|
|
||
|
/*===========================================================================*
|
||
|
* arch_do_vmctl *
|
||
|
*===========================================================================*/
|
||
|
int arch_do_vmctl(m_ptr, p)
|
||
|
register message *m_ptr; /* pointer to request message */
|
||
|
struct proc *p;
|
||
|
{
|
||
|
switch(m_ptr->SVMCTL_PARAM) {
|
||
|
case VMCTL_GET_PDBR:
|
||
|
/* Get process page directory base reg (CR3). */
|
||
|
m_ptr->SVMCTL_VALUE = p->p_seg.p_cr3;
|
||
|
return OK;
|
||
|
case VMCTL_SETADDRSPACE:
|
||
|
setcr3(p, m_ptr->SVMCTL_PTROOT, (u32_t *) m_ptr->SVMCTL_PTROOT_V);
|
||
|
return OK;
|
||
|
case VMCTL_FLUSHTLB:
|
||
|
{
|
||
|
reload_cr3();
|
||
|
return OK;
|
||
|
}
|
||
|
case VMCTL_I386_INVLPG:
|
||
|
{
|
||
|
i386_invlpg(m_ptr->SVMCTL_VALUE);
|
||
|
return OK;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
printf("arch_do_vmctl: strange param %d\n", m_ptr->SVMCTL_PARAM);
|
||
|
return EINVAL;
|
||
|
}
|