Added SYS_GETACL system call and implemented it in userland
[tpg/acess2.git] / Kernel / syscalls.c
1 /*
2  * AcessOS Microkernel Version
3  * syscalls.c
4  */
5 #define DEBUG   0
6
7 #include <common.h>
8 #include <syscalls.h>
9 #include <proc.h>
10 #include <errno.h>
11
12 // === IMPORTS ===
13 extern int      Proc_Clone(Uint *Err, Uint Flags);
14 extern int      Threads_WaitTID(int TID, int *status);
15 extern Uint     Proc_SendMessage(Uint *Err, Uint Dest, Uint Length, void *Data);
16 extern int      Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer);
17 extern int      Proc_Execve(char *File, char **ArgV, char **EnvP);
18 extern Uint     Binary_Load(char *file, Uint *entryPoint);
19 extern int      VFS_FInfo(int FD, void *Dest, int MaxACLs);
20 extern int      VFS_GetACL(int FD, void *Dest);
21 extern int      Threads_SetName(char *NewName);
22 extern int      Threads_GetPID();
23 extern int      Threads_GetTID();
24 extern int      Threads_GetUID();
25 extern int      Threads_GetGID();
26
27 // === CODE ===
28 // TODO: Do sanity checking on arguments, ATM the user can really fuck with the kernel
29 void SyscallHandler(tSyscallRegs *Regs)
30 {
31         Uint64  ret = 0;
32         Uint    err = 0;
33         #if DEBUG
34         ENTER("iThread iNum", Threads_GetTID(), Regs->Num);
35         if(Regs->Num < NUM_SYSCALLS)
36                 LOG("Syscall %s", cSYSCALL_NAMES[Regs->Num]);
37         LOG("Arg1: 0x%x, Arg2: 0x%x, Arg3: 0x%x", Regs->Arg1, Regs->Arg2, Regs->Arg3);
38         #endif
39         switch(Regs->Num)
40         {
41         // -- Exit the current thread
42         case SYS_EXIT:  Threads_Exit(); break;
43         
44         // -- Put the current thread to sleep
45         case SYS_SLEEP: Threads_Sleep();        break;
46         
47         // -- Yield current timeslice
48         case SYS_YIELD: Threads_Yield();        break;
49         
50         // -- Clone the current thread
51         case SYS_CLONE:
52                 // Call clone system call
53                 ret = Proc_Clone(&err, Regs->Arg1);
54                 // Change user stack if requested
55                 if(ret == 0 && Regs->Arg2)
56                         Regs->StackPointer = Regs->Arg2;
57                 break;
58         
59         // -- Send a signal
60         case SYS_KILL:
61                 err = -ENOSYS;
62                 ret = -1;
63                 break;
64         
65         // -- Wait for a thread
66         case SYS_WAITTID:
67                 ret = Threads_WaitTID(Regs->Arg1, (void*)Regs->Arg2);
68                 break;
69         
70         // -- Get the physical address of a page
71         case SYS_GETPHYS:
72                 ret = MM_GetPhysAddr(Regs->Arg1);
73                 break;
74         
75         // -- Map an address
76         case SYS_MAP:   MM_Map(Regs->Arg1, Regs->Arg2); break;
77         
78         // -- Allocate an address
79         case SYS_ALLOCATE:      ret = MM_Allocate(Regs->Arg1);  break;
80         
81         // -- Unmap an address
82         case SYS_UNMAP:         MM_Deallocate(Regs->Arg1);      break;
83         
84         // -- Get Thread/Process IDs
85         case SYS_GETTID:        ret = Threads_GetTID(); break;
86         case SYS_GETPID:        ret = Threads_GetPID(); break;
87         
88         // -- Get User/Group IDs
89         case SYS_GETUID:        ret = Threads_GetUID(); break;
90         case SYS_GETGID:        ret = Threads_GetGID(); break;
91         
92         // -- Send Message
93         case SYS_SENDMSG:
94                 ret = Proc_SendMessage(&err, Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3);
95                 break;
96         // -- Check for messages
97         case SYS_GETMSG:
98                 ret = Proc_GetMessage(&err, (Uint*)Regs->Arg1, (void*)Regs->Arg2);
99                 break;
100         
101         // -- Set the thread's name
102         case SYS_SETNAME:
103                 // Sanity Check
104                 if(!Regs->Arg1) {       ret = -1;       err = -EINVAL;  break;  }
105                 Threads_SetName( (void*)Regs->Arg1 );
106                 break;
107         
108         // ---
109         // Binary Control
110         // ---
111         case SYS_EXECVE:
112                 ret = Proc_Execve((char*)Regs->Arg1, (char**)Regs->Arg2, (char**)Regs->Arg3);
113                 break;
114         case SYS_LOADBIN:
115                 ret = Binary_Load((char*)Regs->Arg1, (Uint*)Regs->Arg2);
116                 break;
117         
118         // ---
119         // Virtual Filesystem
120         // ---
121         case SYS_OPEN:
122                 ret = VFS_Open((char*)Regs->Arg1, Regs->Arg2 | VFS_OPENFLAG_USER);
123                 break;
124         
125         case SYS_CLOSE:
126                 VFS_Close( Regs->Arg1 );
127                 break;
128         
129         case SYS_WRITE:
130                 #if BITS < 64
131                 VFS_Write( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 );
132                 #else
133                 VFS_Write( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 );
134                 #endif
135                 break;
136         
137         case SYS_READ:
138                 #if BITS < 64
139                 VFS_Read( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 );
140                 #else
141                 VFS_Read( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 );
142                 #endif
143                 break;
144         
145         case SYS_FINFO:
146                 ret = VFS_FInfo( Regs->Arg1, (void*)Regs->Arg2, Regs->Arg3 );
147                 break;
148                 
149         case SYS_GETACL:
150                 ret = VFS_GetACL( Regs->Arg1, (void*)Regs->Arg2 );
151                 break;
152                 
153         case SYS_READDIR:
154                 ret = VFS_ReadDir( Regs->Arg1, (void*)Regs->Arg2 );
155                 break;
156         
157         // -- Debug
158         case SYS_DEBUG:
159                 Log((char*)Regs->Arg1,
160                         Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6);
161                 break;
162         
163         // -- Default (Return Error)
164         default:
165                 Warning("SyscallHandler: Unknown System Call %i", Regs->Num);
166                 if(Regs->Num < NUM_SYSCALLS)
167                         Warning(" Syscall '%s'", cSYSCALL_NAMES[Regs->Num]);
168                 err = -ENOSYS;
169                 ret = -1;
170                 break;
171         }
172         #if BITS < 64
173         Regs->Return = ret&0xFFFFFFFF;
174         Regs->RetHi = ret >> 32;
175         #else
176         Regs->Return = ret;
177         #endif
178         Regs->Error = err;
179         #if DEBUG
180         LOG("SyscallHandler: err = %i", err);
181         LEAVE('x', ret);
182         #endif
183 }
184

UCC git Repository :: git.ucc.asn.au