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 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 39 static int sef_cb_init_fresh(int UNUSED(type), sef_init_info_t *UNUSED(info)) 40 { 41 return OK; 42 } 43 44 static void sef_cb_signal_handler(int sig) 45 { 46 if (sig == SIGTERM) 47 exit(0); 48 } 49 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 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