Permissions on IDTs.
[akaros.git] / kern / syscall.c
1 /* See COPYRIGHT for copyright information. */
2
3 #include <inc/x86.h>
4 #include <inc/error.h>
5 #include <inc/string.h>
6 #include <inc/assert.h>
7
8 #include <kern/env.h>
9 #include <kern/pmap.h>
10 #include <kern/trap.h>
11 #include <kern/syscall.h>
12 #include <kern/console.h>
13
14 // Print a string to the system console.
15 // The string is exactly 'len' characters long.
16 // Destroys the environment on memory errors.
17 static void
18 sys_cputs(const char *s, size_t len)
19 {
20         // Check that the user has permission to read memory [s, s+len).
21         // Destroy the environment if not.
22         
23         // LAB 3: Your code here.
24
25         // Print the string supplied by the user.
26         cprintf("%.*s", len, s);
27 }
28
29 // Read a character from the system console.
30 // Returns the character.
31 static int
32 sys_cgetc(void)
33 {
34         int c;
35
36         // The cons_getc() primitive doesn't wait for a character,
37         // but the sys_cgetc() system call does.
38         while ((c = cons_getc()) == 0)
39                 /* do nothing */;
40
41         return c;
42 }
43
44 // Returns the current environment's envid.
45 static envid_t
46 sys_getenvid(void)
47 {
48         return curenv->env_id;
49 }
50
51 // Destroy a given environment (possibly the currently running environment).
52 //
53 // Returns 0 on success, < 0 on error.  Errors are:
54 //      -E_BAD_ENV if environment envid doesn't currently exist,
55 //              or the caller doesn't have permission to change envid.
56 static int
57 sys_env_destroy(envid_t envid)
58 {
59         int r;
60         struct Env *e;
61
62         if ((r = envid2env(envid, &e, 1)) < 0)
63                 return r;
64         if (e == curenv)
65                 cprintf("[%08x] exiting gracefully\n", curenv->env_id);
66         else
67                 cprintf("[%08x] destroying %08x\n", curenv->env_id, e->env_id);
68         env_destroy(e);
69         return 0;
70 }
71
72
73
74 // Dispatches to the correct kernel function, passing the arguments.
75 uint32_t
76 syscall(uint32_t syscallno, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5)
77 {
78         // Call the function corresponding to the 'syscallno' parameter.
79         // Return any appropriate return value.
80         // LAB 3: Your code here.
81
82         panic("syscall not implemented");
83 }
84