segment_alloc may not allocate enough memory.
[mit-jos.git] / lib / syscall.c
blob6e09e6b918e145447344889ec52700a34f406a4e
1 // System call stubs.
3 #include <inc/syscall.h>
4 #include <inc/lib.h>
6 static inline int32_t
7 syscall(int num, int check, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5)
9 int32_t ret;
11 // Generic system call: pass system call number in AX,
12 // up to five parameters in DX, CX, BX, DI, SI.
13 // Interrupt kernel with T_SYSCALL.
15 // The "volatile" tells the assembler not to optimize
16 // this instruction away just because we don't use the
17 // return value.
18 //
19 // The last clause tells the assembler that this can
20 // potentially change the condition codes and arbitrary
21 // memory locations.
23 asm volatile("int %1\n"
24 : "=a" (ret)
25 : "i" (T_SYSCALL),
26 "a" (num),
27 "d" (a1),
28 "c" (a2),
29 "b" (a3),
30 "D" (a4),
31 "S" (a5)
32 : "cc", "memory");
34 if(check && ret > 0)
35 panic("syscall %d returned %d (> 0)", num, ret);
37 return ret;
40 void
41 sys_cputs(const char *s, size_t len)
43 syscall(SYS_cputs, 0, (uint32_t)s, len, 0, 0, 0);
46 int
47 sys_cgetc(void)
49 return syscall(SYS_cgetc, 0, 0, 0, 0, 0, 0);
52 int
53 sys_env_destroy(envid_t envid)
55 return syscall(SYS_env_destroy, 1, envid, 0, 0, 0, 0);
58 envid_t
59 sys_getenvid(void)
61 return syscall(SYS_getenvid, 0, 0, 0, 0, 0, 0);
64 void
65 sys_yield(void)
67 syscall(SYS_yield, 0, 0, 0, 0, 0, 0);
70 int
71 sys_page_alloc(envid_t envid, void *va, int perm)
73 return syscall(SYS_page_alloc, 1, envid, (uint32_t) va, perm, 0, 0);
76 int
77 sys_page_map(envid_t srcenv, void *srcva, envid_t dstenv, void *dstva, int perm)
79 return syscall(SYS_page_map, 1, srcenv, (uint32_t) srcva, dstenv, (uint32_t) dstva, perm);
82 int
83 sys_page_unmap(envid_t envid, void *va)
85 return syscall(SYS_page_unmap, 1, envid, (uint32_t) va, 0, 0, 0);
88 // sys_exofork is inlined in lib.h
90 int
91 sys_env_set_status(envid_t envid, int status)
93 return syscall(SYS_env_set_status, 1, envid, status, 0, 0, 0);
96 int
97 sys_env_set_trapframe(envid_t envid, struct Trapframe *tf)
99 return syscall(SYS_env_set_trapframe, 1, envid, (uint32_t) tf, 0, 0, 0);
103 sys_env_set_pgfault_upcall(envid_t envid, void *upcall)
105 return syscall(SYS_env_set_pgfault_upcall, 1, envid, (uint32_t) upcall, 0, 0, 0);
109 sys_ipc_try_send(envid_t envid, uint32_t value, void *srcva, int perm)
111 return syscall(SYS_ipc_try_send, 0, envid, value, (uint32_t) srcva, perm, 0);
115 sys_ipc_recv(void *dstva)
117 return syscall(SYS_ipc_recv, 1, (uint32_t)dstva, 0, 0, 0, 0);
121 sys_phy_page(envid_t envid, void *va)
123 return syscall(SYS_phy_page, 0, (uint32_t)envid, (uint32_t)va, 0, 0, 0);