1 /* Test for sys_vumap() - by D.C. van Moolenbroek */
2 #include <minix/drivers.h>
3 #include <assert.h>
4
5 #include "com.h"
6
do_request(message * m)7 static int do_request(message *m)
8 {
9 struct vumap_vir vvec[MAPVEC_NR + 3];
10 struct vumap_phys pvec[MAPVEC_NR + 3];
11 int r, r2, access, vcount, pcount;
12 size_t offset;
13
14 assert(m->m_type == VTR_RELAY);
15
16 vcount = m->VTR_VCOUNT;
17 pcount = m->VTR_PCOUNT;
18 offset = m->VTR_OFFSET;
19 access = m->VTR_ACCESS;
20
21 r2 = sys_safecopyfrom(m->m_source, m->VTR_VGRANT, 0, (vir_bytes) vvec,
22 sizeof(vvec[0]) * vcount);
23 assert(r2 == OK);
24
25 r = sys_vumap(m->m_source, vvec, vcount, offset, access, pvec,
26 &pcount);
27
28 if (pcount >= 1 && pcount <= MAPVEC_NR + 3) {
29 r2 = sys_safecopyto(m->m_source, m->VTR_PGRANT, 0,
30 (vir_bytes) pvec, sizeof(pvec[0]) * pcount);
31 assert(r2 == OK);
32 }
33
34 m->VTR_PCOUNT = pcount;
35
36 return r;
37 }
38
sef_cb_init_fresh(int UNUSED (type),sef_init_info_t * UNUSED (info))39 static int sef_cb_init_fresh(int UNUSED(type), sef_init_info_t *UNUSED(info))
40 {
41 return OK;
42 }
43
sef_cb_signal_handler(int sig)44 static void sef_cb_signal_handler(int sig)
45 {
46 if (sig == SIGTERM)
47 exit(0);
48 }
49
sef_local_startup(void)50 static void sef_local_startup(void)
51 {
52 sef_setcb_init_fresh(sef_cb_init_fresh);
53 sef_setcb_signal_handler(sef_cb_signal_handler);
54
55 sef_startup();
56 }
57
main(int argc,char ** argv)58 int main(int argc, char **argv)
59 {
60 message m;
61 int r;
62
63 env_setargs(argc, argv);
64
65 sef_local_startup();
66
67 for (;;) {
68 if ((r = sef_receive(ANY, &m)) != OK)
69 panic("sef_receive failed (%d)\n", r);
70
71 m.m_type = do_request(&m);
72
73 ipc_send(m.m_source, &m);
74 }
75
76 return 0;
77 }
78