void handle_pagefault(void) { seL4_Word pc = seL4_GetMR(0); seL4_Word fault_addr = seL4_GetMR(1); bool ifault = (bool)seL4_GetMR(2); seL4_Word fsr = seL4_GetMR(3); dprintf(0, "vm fault at 0x%08x, align = 0x%08x, pc = 0x%08x, proc = %d, %s\n", fault_addr, PAGE_ALIGN(fault_addr), pc, proc_get_id(), ifault ? "iFault" : "dFault"); seL4_CPtr reply_cap; /* Save the caller */ reply_cap = cspace_save_reply_cap(cur_cspace); assert(reply_cap != CSPACE_NULL); dprintf(3, "handle_pagefault: reply_cap = %d\n", (int)reply_cap); sos_VMFaultHandler(reply_cap, fault_addr, fsr, ifault); }
void handle_vm_fault(seL4_Word badge, int pid) { seL4_CPtr reply_cap; seL4_Word fault_vaddr = seL4_GetMR(1); if (SOS_DEBUG) printf("handle_vm_fault, %p\n", (void *) fault_vaddr); // Get the page of the fault address fault_vaddr &= PAGE_MASK; //dprintf(0, "Handling fault at: 0x%08x\n", fault_vaddr); reply_cap = cspace_save_reply_cap(cur_cspace); int err = map_if_valid(fault_vaddr, pid, handle_vm_fault_cb, NULL, reply_cap); if (err == GUARD_PAGE_FAULT || err == UNKNOWN_REGION || err == NULL_DEREF) { //kill the process as it has faulted invalid memory kill_process(pid, pid, reply_cap); } if (SOS_DEBUG) printf("handle_vm_fault finished\n"); }
void handle_syscall(seL4_Word badge, int num_args) { seL4_Word syscall_number; seL4_CPtr reply_cap; syscall_number = seL4_GetMR(0); /* Save the caller */ reply_cap = cspace_save_reply_cap(cur_cspace); assert(reply_cap != CSPACE_NULL); /* Process system call */ switch (syscall_number) { case SOS_SYSCALL_PRINT: { dprintf(3, "\n---sos print called---\n"); size_t msg_len = num_args; char data[seL4_MsgMaxLength]; for (size_t i=0; i<msg_len; i++) { data[i] = (char)seL4_GetMR(i+1); } serv_sys_print(reply_cap, data, msg_len); break; } case SOS_SYSCALL_SYSBRK: { dprintf(3, "\n---sos sbrk called---\n"); seL4_Word newbrk = (seL4_Word)seL4_GetMR(1); serv_sys_sbrk(reply_cap, newbrk); break; } case SOS_SYSCALL_OPEN: { dprintf(3, "\n---sos open called---\n"); seL4_Word path = (seL4_Word)seL4_GetMR(1); size_t nbyte = (size_t)seL4_GetMR(2); uint32_t flags = (uint32_t)seL4_GetMR(3); serv_sys_open(reply_cap, path, nbyte, flags); break; } case SOS_SYSCALL_CLOSE: { dprintf(3, "\n---sos close called---\n"); int fd = seL4_GetMR(1); serv_sys_close(reply_cap, fd); break; } case SOS_SYSCALL_READ: { dprintf(3, "\n---sos read called at %lu---\n", (long unsigned)time_stamp()); int fd = (int)seL4_GetMR(1); seL4_Word buf = (seL4_Word)seL4_GetMR(2); size_t nbyte = (size_t)seL4_GetMR(3); serv_sys_read(reply_cap, fd, buf, nbyte); break; } case SOS_SYSCALL_WRITE: { dprintf(3, "\n---sos write called at %lu---\n", (long unsigned)time_stamp()); int fd = (int)seL4_GetMR(1); seL4_Word buf = (seL4_Word)seL4_GetMR(2); size_t nbyte = (size_t)seL4_GetMR(3); serv_sys_write(reply_cap, fd, buf, nbyte); break; } case SOS_SYSCALL_SLEEP: { serv_sys_sleep(reply_cap, seL4_GetMR(1)); break; } case SOS_SYSCALL_TIMESTAMP: { serv_sys_timestamp(reply_cap); break; } case SOS_SYSCALL_GETDIRENT: { dprintf(3, "\n---sos getdirent called at %lu---\n", (long unsigned)time_stamp()); int pos = (int)seL4_GetMR(1); char *name = (char *)seL4_GetMR(2); size_t nbyte = (size_t)seL4_GetMR(3); serv_sys_getdirent(reply_cap, pos, name, nbyte); break; } case SOS_SYSCALL_STAT: { char *path = (char *)seL4_GetMR(1); size_t path_len = (size_t)seL4_GetMR(2); sos_stat_t *stat = (sos_stat_t *)seL4_GetMR(3); serv_sys_stat(reply_cap, path, path_len, stat); break; } case SOS_SYSCALL_PROC_CREATE: { dprintf(3, "\n---sos proc create called at %lu---\n", (long unsigned)time_stamp()); char *path = (char *)seL4_GetMR(1); size_t len = (size_t)seL4_GetMR(2); serv_proc_create(path, len, _sos_ipc_ep_cap, reply_cap); break; } case SOS_SYSCALL_PROC_DESTROY: { pid_t pid = (pid_t)seL4_GetMR(1); serv_proc_destroy(pid, reply_cap); break; } case SOS_SYSCALL_PROC_GET_ID: { dprintf(3, "\n---sos proc get id called at %lu---\n", (long unsigned)time_stamp()); serv_proc_get_id(reply_cap); break; } case SOS_SYSCALL_PROC_WAIT: { dprintf(3, "\n---sos proc wait called at %lu---\n", (long unsigned)time_stamp()); pid_t pid = (pid_t)seL4_GetMR(1); serv_proc_wait(pid, reply_cap); break; } case SOS_SYSCALL_PROC_STATUS: { dprintf(3, "\n---sos proc status called at %lu---\n", (long unsigned)time_stamp()); seL4_Word buf = (seL4_Word)seL4_GetMR(1); unsigned max = (unsigned)seL4_GetMR(2); serv_proc_status(buf, max, reply_cap); break; } default: dprintf(3, "Unknown syscall %d\n", syscall_number); /* we don't want to reply to an unknown syscall */ } }