// Dispatches to the correct kernel function, passing the arguments. int64_t syscall(uint64_t syscallno, uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5) { // Call the function corresponding to the 'syscallno' parameter. // Return any appropriate return value. // LAB 3: Your code here. uint64_t retval = 0; switch (syscallno) { case SYS_cputs: sys_cputs((char *) a1, (size_t) a2); return retval; case SYS_cgetc: return (int64_t) sys_cgetc(); case SYS_getenvid: return (int64_t) sys_getenvid(); case SYS_env_destroy: return (int64_t) sys_env_destroy((envid_t) a1); case SYS_yield: sys_yield(); return retval; case SYS_exofork: return (int64_t)sys_exofork(); case SYS_page_alloc: return (int64_t)sys_page_alloc((envid_t)a1, (void *)a2, (int)a3); case SYS_page_map: return (int64_t)sys_page_map((envid_t)a1, (void *)a2, (envid_t)a3, (void *)a4, (int)a5); case SYS_page_unmap: return (int64_t)sys_page_unmap((envid_t)a1, (void *)a2); case SYS_env_set_status: return (int64_t)sys_env_set_status((envid_t)a1, (int)a2); case SYS_env_set_pgfault_upcall: return (int64_t)sys_env_set_pgfault_upcall((envid_t)a1, (void *)a2); case SYS_ipc_try_send: return (int64_t) sys_ipc_try_send((envid_t) a1, (uint32_t) a2, (void *) a3, (unsigned) a4); case SYS_ipc_recv: return (int64_t)sys_ipc_recv((void*)a1); case SYS_env_set_trapframe: return sys_env_set_trapframe((envid_t)a1, (struct Trapframe*)a2); case SYS_time_msec: return sys_time_msec(); case SYS_net_try_send: return sys_net_try_send((char *) a1, (int) a2); case SYS_net_try_receive: return sys_net_try_receive((char *) a1, (int *) a2); default: return -E_INVAL; } panic("syscall not implemented"); }
void input(envid_t ns_envid) { binaryname = "ns_input"; // LAB 6: Your code here: // - read a packet from the device driver // - send it to the network server // Hint: When you IPC a page to the network server, it will be // reading from it for a while, so don't immediately receive // another packet in to the same physical page. int r; if ((r = sys_page_alloc(0, pkt, PTE_P|PTE_U|PTE_W)) < 0) panic("sys_page_alloc: %e", r); envid_t current_envid = sys_getenvid(); while (1) { //cprintf("Reading a packet from the device driver\n"); int length; while((r=sys_net_try_receive(pkt->jp_data, &length))<0) { msleep(100); } nsipcbuf.pkt.jp_len = length; //cprintf("Received a packet from the device driver, data = %s, length = %d\n", nsipcbuf.pkt.jp_data, nsipcbuf.pkt.jp_len); //cprintf("Sending a packet to the network server in environment....%0x\n", current_envid); ipc_send(ns_envid, NSREQ_INPUT, pkt, PTE_P|PTE_W|PTE_U); //cprintf("packet sent to the network server\n"); msleep(100); } }
void input(envid_t ns_envid) { binaryname = "ns_input"; // LAB 6: Your code here: // - read a packet from the device driver // - send it to the network server // Hint: When you IPC a page to the network server, it will be // reading from it for a while, so don't immediately receive // another packet in to the same physical page. #define RECV_BUF_SIZE 2048 char buf[RECV_BUF_SIZE]; int len, r, i; int perm = PTE_U | PTE_P | PTE_W; len = RECV_BUF_SIZE -1; while (1) { // receive buffer from e1000 while ((r = sys_net_try_receive(buf, &len)) < 0) { //cprintf("input trying to receive\n"); sys_yield(); } //cprintf("RECEIVING!\n"); // allocate a page to store the returned buffer // Whenever a new page is allocated, old will be deallocated // by page_insert automatically. while ((r = sys_page_alloc(0, &nsipcbuf, perm)) < 0); nsipcbuf.pkt.jp_len = len; memmove(nsipcbuf.pkt.jp_data, buf, len); while ((r = sys_ipc_try_send(ns_envid, NSREQ_INPUT, &nsipcbuf, perm)) < 0); } }
// Dispatches to the correct kernel function, passing the arguments. int32_t syscall(uint32_t syscallno, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5) { // Call the function corresponding to the 'syscallno' parameter. // Return any appropriate return value. // LAB 3: Your code here. switch(syscallno) { case SYS_cputs: sys_cputs((char *) a1, (size_t) a2); break; case SYS_cgetc: return sys_cgetc(); case SYS_getenvid: return sys_getenvid(); case SYS_env_destroy: return sys_env_destroy((envid_t) a1); case SYS_yield: sys_yield(); break; case SYS_exofork: return sys_exofork(); case SYS_env_set_status: return sys_env_set_status((envid_t) a1, (int) a2); case SYS_env_set_trapframe: return sys_env_set_trapframe((envid_t) a1, (struct Trapframe *) a2); case SYS_page_alloc: return sys_page_alloc((envid_t) a1, (void *) a2, (int) a3); case SYS_page_map: return sys_page_map((envid_t) a1, (void *) a2, (envid_t) a3, (void *) a4, (int) a5); case SYS_page_unmap: return sys_page_unmap((envid_t) a1, (void *) a2); case SYS_env_set_pgfault_upcall: return sys_env_set_pgfault_upcall((envid_t) a1, (void *) a2); case SYS_ipc_try_send: return sys_ipc_try_send((envid_t) a1, (uint32_t) a2, (void *) a3, (unsigned) a4); case SYS_ipc_recv: return sys_ipc_recv((void *) a1); case SYS_env_swap: return sys_env_swap((envid_t) a1); case SYS_time_msec: return sys_time_msec(); case SYS_net_try_send: return sys_net_try_send((char *) a1, (int) a2); case SYS_net_try_receive: return sys_net_try_receive((char *) a1, (int *) a2); case SYS_get_mac: return sys_get_mac((uint32_t *) a1, (uint32_t *) a2); case SYS_env_lease: return sys_env_lease((struct Env*) a1, (envid_t *) a2); case SYS_copy_mem: return sys_copy_mem((envid_t) a1, (void *) a2, (void *) a3, (int) a4, (bool) a5); case SYS_get_perms: return sys_get_perms((envid_t) a1, (void *) a2, (int *) a3); case SYS_env_unsuspend: return sys_env_unsuspend((envid_t) a1, (uint32_t) a2, (uint32_t) a3); case SYS_env_set_thisenv: return sys_env_set_thisenv((envid_t) a1, (void *) a2); case SYS_migrate: return sys_migrate((void *) a1); case SYS_lease_complete: return sys_lease_complete(); default: return -E_INVAL; } return 0; // for syscall that return void }