1 /* The kernel call implemented in this file:
2 * m_type: SYS_VMCTL
3 *
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 */
9
10 #include "kernel/system.h"
11 #include <assert.h>
12 #include <minix/type.h>
13
14 #include "arch_proto.h"
15
set_ttbr(struct proc * p,u32_t ttbr,u32_t * v)16 static void set_ttbr(struct proc *p, u32_t ttbr, u32_t *v)
17 {
18 /* Set process TTBR. */
19 p->p_seg.p_ttbr = ttbr;
20 assert(p->p_seg.p_ttbr);
21 p->p_seg.p_ttbr_v = v;
22 if(p == get_cpulocal_var(ptproc)) {
23 write_ttbr0(p->p_seg.p_ttbr);
24 }
25 if(p->p_nr == VM_PROC_NR) {
26 if (arch_enable_paging(p) != OK)
27 panic("arch_enable_paging failed");
28 }
29 RTS_UNSET(p, RTS_VMINHIBIT);
30 }
31
32 /*===========================================================================*
33 * arch_do_vmctl *
34 *===========================================================================*/
arch_do_vmctl(register message * m_ptr,struct proc * p)35 int arch_do_vmctl(
36 register message *m_ptr, /* pointer to request message */
37 struct proc *p
38 )
39 {
40 switch(m_ptr->SVMCTL_PARAM) {
41 case VMCTL_GET_PDBR:
42 /* Get process page directory base reg (TTBR). */
43 m_ptr->SVMCTL_VALUE = p->p_seg.p_ttbr;
44 return OK;
45 case VMCTL_SETADDRSPACE:
46 set_ttbr(p, m_ptr->SVMCTL_PTROOT, (u32_t *) m_ptr->SVMCTL_PTROOT_V);
47 return OK;
48 case VMCTL_FLUSHTLB:
49 {
50 reload_ttbr0();
51 return OK;
52 }
53 }
54
55 printf("arch_do_vmctl: strange param %d\n", m_ptr->SVMCTL_PARAM);
56 return EINVAL;
57 }
58