示例#1
0
文件: main.c 项目: gapry/AOS
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);
}
示例#2
0
文件: pagetable.c 项目: KGG814/AOS
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");
}
示例#3
0
文件: main.c 项目: gapry/AOS
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 */
    }

}