xref: /minix/minix/lib/libsys/sys_vmctl.c (revision 83133719)
1 #include "syslib.h"
2 
3 int sys_vmctl(endpoint_t who, int param, u32_t value)
4 {
5   message m;
6   int r;
7 
8   m.SVMCTL_WHO = who;
9   m.SVMCTL_PARAM = param;
10   m.SVMCTL_VALUE = value;
11   r = _kernel_call(SYS_VMCTL, &m);
12   return(r);
13 }
14 
15 /* Get page directory base register */
16 int sys_vmctl_get_pdbr(endpoint_t who, u32_t *pdbr)
17 {
18   message m;
19   int r;
20 
21   m.SVMCTL_WHO = who;
22   m.SVMCTL_PARAM = VMCTL_GET_PDBR;
23   r = _kernel_call(SYS_VMCTL, &m);
24   if(r == OK) {
25 	*pdbr = m.SVMCTL_VALUE;
26   }
27   return(r);
28 }
29 
30 int sys_vmctl_set_addrspace(endpoint_t who,
31         phys_bytes ptroot, void *ptroot_v)
32 {
33   message m;
34   int r;
35 
36   m.SVMCTL_WHO = who;
37   m.SVMCTL_PARAM = VMCTL_SETADDRSPACE;
38   m.SVMCTL_PTROOT = ptroot;
39   m.SVMCTL_PTROOT_V = ptroot_v;
40   r = _kernel_call(SYS_VMCTL, &m);
41 
42   return(r);
43 }
44 
45 int sys_vmctl_get_memreq(endpoint_t *who, vir_bytes *mem,
46         vir_bytes *len, int *wrflag, endpoint_t *who_s, vir_bytes *mem_s,
47         endpoint_t *requestor)
48 {
49   message m;
50   int r;
51 
52   m.SVMCTL_WHO = SELF;
53   m.SVMCTL_PARAM = VMCTL_MEMREQ_GET;
54   r = _kernel_call(SYS_VMCTL, &m);
55   if(r >= 0) {
56 	*who = m.SVMCTL_MRG_TARGET;
57 	*mem = m.SVMCTL_MRG_ADDR;
58 	*len = m.SVMCTL_MRG_LENGTH;
59 	*wrflag = m.SVMCTL_MRG_FLAG;
60 	*who_s = m.SVMCTL_MRG_EP2;
61 	*mem_s = m.SVMCTL_MRG_ADDR2;
62 	*requestor = (endpoint_t) m.SVMCTL_MRG_REQUESTOR;
63   }
64   return r;
65 }
66 
67 int sys_vmctl_get_mapping(int index,
68 	phys_bytes *addr, phys_bytes *len, int *flags)
69 {
70 	int r;
71 	message m;
72 
73 	m.SVMCTL_WHO = SELF;
74 	m.SVMCTL_PARAM = VMCTL_KERN_PHYSMAP;
75 	m.SVMCTL_VALUE = (int) index;
76 
77 	r = _kernel_call(SYS_VMCTL, &m);
78 
79 	if(r != OK)
80 		return r;
81 
82 	*addr = m.SVMCTL_MAP_PHYS_ADDR;
83 	*len = m.SVMCTL_MAP_PHYS_LEN;
84 	*flags = m.SVMCTL_MAP_FLAGS;
85 
86 	return OK;
87 }
88 
89 int sys_vmctl_reply_mapping(int index, vir_bytes addr)
90 {
91 	message m;
92 
93 	m.SVMCTL_WHO = SELF;
94 	m.SVMCTL_PARAM = VMCTL_KERN_MAP_REPLY;
95 	m.SVMCTL_VALUE = index;
96 	m.SVMCTL_MAP_VIR_ADDR = (char *) addr;
97 
98 	return _kernel_call(SYS_VMCTL, &m);
99 }
100