/*! @brief Handle messages received by the CPIO file server. @param s The global file server state. (No ownership transfer) @param msg The received message. (No ownership transfer) @return DISPATCH_SUCCESS if message dispatched, DISPATCH_ERROR if unknown message. */ static int fileserv_handle_message(struct fs_state *s, srv_msg_t *msg) { int result; int label = seL4_GetMR(0); void *userptr; (void) result; if (dispatch_notification(msg) == DISPATCH_SUCCESS) { return DISPATCH_SUCCESS; } if (check_dispatch_serv(msg, &userptr) == DISPATCH_SUCCESS) { result = rpc_sv_serv_dispatcher(userptr, label); assert(result == DISPATCH_SUCCESS); return DISPATCH_SUCCESS; } if (check_dispatch_data(msg, &userptr) == DISPATCH_SUCCESS) { result = rpc_sv_data_dispatcher(userptr, label); assert(result == DISPATCH_SUCCESS); return DISPATCH_SUCCESS; } dprintf("Unknown message (badge = %d msgInfo = %d label = %d (0x%x)).\n", msg->badge, seL4_MessageInfo_get_label(msg->message), label, label); ROS_ERROR("File server unknown message."); assert(!"File server unknown message."); return DISPATCH_ERROR; }
/*! @brief Process server IPC message handler. Handles dispatching of all process server IPC messages. Calls each individual dispatcher until the correct dispatcher for the message type has been found. @param s The process server global state. @param msg The process server recieved message info. */ static void proc_server_handle_message(struct procserv_state *s, struct procserv_msg *msg) { int result; int label = seL4_GetMR(0); void *userptr = NULL; (void) result; /* Attempt to dispatch to procserv syscall dispatcher. */ if (check_dispatch_syscall(msg, &userptr) == DISPATCH_SUCCESS) { result = rpc_sv_proc_dispatcher(userptr, label); assert(result == DISPATCH_SUCCESS); mem_syscall_postaction(); proc_syscall_postaction(); return; } /* Attempt to dispatch to VM fault dispatcher. */ if (check_dispatch_fault(msg, &userptr) == DISPATCH_SUCCESS) { result = dispatch_vm_fault(msg, &userptr); assert(result == DISPATCH_SUCCESS); return; } /* Attempt to dispatch to RAM dataspace syscall dispatcher. */ if (check_dispatch_dataspace(msg, &userptr) == DISPATCH_SUCCESS) { result = rpc_sv_data_dispatcher(userptr, label); assert(result == DISPATCH_SUCCESS); mem_syscall_postaction(); return; } /* Attempt to dispatch to nameserv syscall dispatcher. */ if (check_dispatch_nameserv(msg, &userptr) == DISPATCH_SUCCESS) { result = rpc_sv_name_dispatcher(userptr, label); assert(result == DISPATCH_SUCCESS); return; } /* Unknown message. Block calling client indefinitely. */ dprintf("Unknown message (badge = %d msgInfo = %d syscall = 0x%x).\n", msg->badge, seL4_MessageInfo_get_label(msg->message), label); ROS_ERROR("Process server unknown message. ¯\(º_o)/¯"); }
/*! @brief Handle messages recieved by the timer server. @param s The global timer server state. (No ownership transfer) @param msg The recieved message. (No ownership transfer) @return DISPATCH_SUCCESS if message dispatched, DISPATCH_ERROR if unknown message. */ static int timer_server_handle_message(struct timeserv_state *s, srv_msg_t *msg) { int result = DISPATCH_PASS; int label = seL4_GetMR(0); void *userptr; //printf("====In timer_server_handle_message====\n"); if (dispatch_client_watch(msg) == DISPATCH_SUCCESS) { result = DISPATCH_SUCCESS; } if (dev_dispatch_interrupt(&timeServ.irqState, msg) == DISPATCH_SUCCESS) { result = DISPATCH_SUCCESS; } if (result == DISPATCH_SUCCESS) { //printf("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n"); //printf("will return result\n"); return result; } if (check_dispatch_data(msg, &userptr) == DISPATCH_SUCCESS) { result = rpc_sv_data_dispatcher(userptr, label); assert(result == DISPATCH_SUCCESS); return DISPATCH_SUCCESS; } if (check_dispatch_serv(msg, &userptr) == DISPATCH_SUCCESS) { result = rpc_sv_serv_dispatcher(userptr, label); assert(result == DISPATCH_SUCCESS); return DISPATCH_SUCCESS; } dprintf("Unknown message (badge = %d msgInfo = %d label = %d).\n", msg->badge, seL4_MessageInfo_get_label(msg->message), label); ROS_ERROR("timer server unknown message."); assert(!"timer server unknown message."); return DISPATCH_ERROR; }