struct srv_client* srv_ctable_connect_direct_handler(srv_common_t *srv, srv_msg_t *m, seL4_CPtr liveness, int* _errno) { assert(srv && srv->magic == SRV_MAGIC && m); /* Check that the liveness cap passed in correctly. */ if(!srv_check_dispatch_caps(m, 0x00000000, 1)) { SET_ERRNO_PTR(_errno, EINVALIDPARAM); return NULL; } int error = ENOMEM; /* Copyout the liveness cap, create session cap cslot. Do not printf before the copyout. */ seL4_CPtr livenessCP = rpc_copyout_cptr(liveness); if (!liveness || !livenessCP) { goto error0; } /* Allocate the client structure. */ struct srv_client *c = client_alloc(&srv->clientTable, livenessCP); if (!c) { goto error1; } dprintf("Adding new %s client cID = %d. Hi! (:D)\n", srv->config.serverName, c->cID); assert(c->session); /* Authenticate the client to the process server, using its liveness cap. */ error = proc_watch_client(c->liveness, srv->notifyClientFaultDeathAsyncEP, &c->deathID); if (error != ESUCCESS) { goto error2; } SET_ERRNO_PTR(_errno, ESUCCESS); return c; /* Exit stack. */ error2: client_queue_delete(&srv->clientTable, c->cID); client_table_postaction(&srv->clientTable); error1: seL4_CNode_Delete(REFOS_CSPACE, livenessCP, REFOS_CDEPTH); csfree(livenessCP); error0: SET_ERRNO_PTR(_errno, error); return NULL; }
seL4_CPtr proc_new_async_endpoint_internal(refos_err_t* errno) { int rpc__error_; seL4_CPtr __ret__; memset(&__ret__, 0, sizeof(seL4_CPtr)); rpc_init("proc_new_async_endpoint_internal", RPC_PROC_NEW_ASYNC_ENDPOINT_INTERNAL); rpc_set_dest(REFOS_PROCSERV_EP); rpc__error_ = rpc_call_server(); if (rpc__error_) { rpc_release(); return __ret__; } rpc_pop_buf(errno, sizeof(refos_err_t)); __ret__ = (seL4_CPtr) rpc_pop_cptr(); __ret__ = rpc_copyout_cptr(__ret__); rpc_release(); return __ret__; }
seL4_CPtr proc_get_irq_handler(int irq) { int rpc__error_; seL4_CPtr __ret__; memset(&__ret__, 0, sizeof(seL4_CPtr)); rpc_init("proc_get_irq_handler", RPC_PROC_GET_IRQ_HANDLER); rpc_set_dest(REFOS_PROCSERV_EP); rpc_push_uint(irq); rpc__error_ = rpc_call_server(); if (rpc__error_) { rpc_release(); return __ret__; } __ret__ = (seL4_CPtr) rpc_pop_cptr(); __ret__ = rpc_copyout_cptr(__ret__); rpc_release(); return __ret__; }
seL4_CPtr proc_get_mem_window(uint32_t vaddr) { int rpc__error_; seL4_CPtr __ret__; memset(&__ret__, 0, sizeof(seL4_CPtr)); rpc_init("proc_get_mem_window", RPC_PROC_GET_MEM_WINDOW); rpc_set_dest(REFOS_PROCSERV_EP); rpc_push_uint(vaddr); rpc__error_ = rpc_call_server(); if (rpc__error_) { rpc_release(); return __ret__; } __ret__ = (seL4_CPtr) rpc_pop_cptr(); __ret__ = rpc_copyout_cptr(__ret__); rpc_release(); return __ret__; }
seL4_CPtr proc_get_mem_window_dspace(seL4_CPtr window, refos_err_t* errno) { int rpc__error_; seL4_CPtr __ret__; memset(&__ret__, 0, sizeof(seL4_CPtr)); rpc_init("proc_get_mem_window_dspace", RPC_PROC_GET_MEM_WINDOW_DSPACE); rpc_set_dest(REFOS_PROCSERV_EP); rpc_push_cptr(window); rpc__error_ = rpc_call_server(); if (rpc__error_) { rpc_release(); return __ret__; } rpc_pop_buf(errno, sizeof(refos_err_t)); __ret__ = (seL4_CPtr) rpc_pop_cptr(); __ret__ = rpc_copyout_cptr(__ret__); rpc_release(); return __ret__; }
seL4_CPtr nsv_resolve_segment_internal(seL4_CPtr nameserv, char* path, int* resolvedBytes, refos_err_t* errno) { int rpc__error_; seL4_CPtr __ret__; memset(&__ret__, 0, sizeof(seL4_CPtr)); rpc_init("nsv_resolve_segment_internal", RPC_NSV_RESOLVE_SEGMENT_INTERNAL); rpc_set_dest(nameserv); rpc_push_str(path); rpc__error_ = rpc_call_server(); if (rpc__error_) { rpc_release(); return __ret__; } rpc_pop_buf(resolvedBytes, sizeof(int)); rpc_pop_buf(errno, sizeof(refos_err_t)); __ret__ = (seL4_CPtr) rpc_pop_cptr(); __ret__ = rpc_copyout_cptr(__ret__); rpc_release(); return __ret__; }
refos_err_t srv_ctable_set_param_buffer_handler(srv_common_t *srv, struct srv_client *c, srv_msg_t *m, seL4_CPtr parambufferDataspace, uint32_t parambufferSize) { assert(srv && srv->magic == SRV_MAGIC); assert(c && m); /* Special case: unset the parameter buffer. */ if (!parambufferDataspace && parambufferSize == 0) { seL4_CNode_Revoke(REFOS_CSPACE, c->paramBuffer, REFOS_CDEPTH); seL4_CNode_Delete(REFOS_CSPACE, c->paramBuffer, REFOS_CDEPTH); csfree(c->paramBuffer); c->paramBuffer = 0; c->paramBufferSize = 0; return ESUCCESS; } /* Sanity check parameters. */ if (!srv_check_dispatch_caps(m, 0x00000000, 1)) { return EINVALIDPARAM; } if (parambufferSize == 0) { return EINVALIDPARAM; } /* Set the parameter buffer by copying out the given dspace cap. Do not printf before copyout. */ c->paramBuffer = rpc_copyout_cptr(parambufferDataspace); if (!c->paramBuffer) { ROS_ERROR("Failed to copyout the cap."); return ENOMEM; } c->paramBufferSize = parambufferSize; dprintf("Set param buffer for client cID = %d...\n", c->cID); return ESUCCESS; }
seL4_CPtr proc_create_mem_window_internal(uint32_t vaddr, uint32_t size, uint32_t permissions, uint32_t flags, refos_err_t* errno) { int rpc__error_; seL4_CPtr __ret__; memset(&__ret__, 0, sizeof(seL4_CPtr)); rpc_init("proc_create_mem_window_internal", RPC_PROC_CREATE_MEM_WINDOW_INTERNAL); rpc_set_dest(REFOS_PROCSERV_EP); rpc_push_uint(vaddr); rpc_push_uint(size); rpc_push_uint(permissions); rpc_push_uint(flags); rpc__error_ = rpc_call_server(); if (rpc__error_) { rpc_release(); return __ret__; } rpc_pop_buf(errno, sizeof(refos_err_t)); __ret__ = (seL4_CPtr) rpc_pop_cptr(); __ret__ = rpc_copyout_cptr(__ret__); rpc_release(); return __ret__; }