Separated Architecture independent thread controll into the root of the tree
[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      Threads_SetName(char *NewName);
21 extern int      Threads_GetPID();
22 extern int      Threads_GetTID();
23 extern int      Threads_GetUID();
24 extern int      Threads_GetGID();
25
26 // === CODE ===
27 void SyscallHandler(tSyscallRegs *Regs)
28 {
29         Uint64  ret = 0;
30         Uint    err = 0;
31         #if DEBUG
32         ENTER("iThread iNum", gCurrentThread->TID, Regs->Num);
33         if(Regs->Num < NUM_SYSCALLS)
34                 LOG("Syscall %s", cSYSCALL_NAMES[Regs->Num]);
35         LOG("Arg1: 0x%x, Arg2: 0x%x, Arg3: 0x%x", Regs->Arg1, Regs->Arg2, Regs->Arg3);
36         #endif
37         switch(Regs->Num)
38         {
39         // -- Exit the current thread
40         case SYS_EXIT:  Threads_Exit(); break;
41         
42         // -- Put the current thread to sleep
43         case SYS_SLEEP: Threads_Sleep();        break;
44         
45         // -- Yield current timeslice
46         case SYS_YIELD: Threads_Yield();        break;
47         
48         // -- Clone the current thread
49         case SYS_CLONE:
50                 // Call clone system call
51                 ret = Proc_Clone(&err, Regs->Arg1);
52                 // Change user stack if requested
53                 if(ret == 0 && Regs->Arg2)
54                         Regs->StackPointer = Regs->Arg2;
55                 break;
56         
57         // -- Send a signal
58         case SYS_KILL:
59                 err = -ENOSYS;
60                 ret = -1;
61                 break;
62         
63         // -- Wait for a thread
64         case SYS_WAITTID:
65                 ret = Threads_WaitTID(Regs->Arg1, (void*)Regs->Arg2);
66                 break;
67         
68         case SYS_GETPHYS:
69                 ret = MM_GetPhysAddr(Regs->Arg1);
70                 break;
71         // -- Map an address
72         case SYS_MAP:   MM_Map(Regs->Arg1, Regs->Arg2); break;
73         // -- Allocate an address
74         case SYS_ALLOCATE:      ret = MM_Allocate(Regs->Arg1);  break;
75         // -- Unmap an address
76         case SYS_UNMAP:         MM_Deallocate(Regs->Arg1);      break;
77         
78         // -- Get Thread/Process IDs
79         case SYS_GETTID:        ret = Threads_GetTID(); break;
80         case SYS_GETPID:        ret = Threads_GetPID(); break;
81         // -- Get User/Group IDs
82         case SYS_GETUID:        ret = Threads_GetUID(); break;
83         case SYS_GETGID:        ret = Threads_GetGID(); break;
84         
85         // -- Send Message
86         case SYS_SENDMSG:
87                 ret = Proc_SendMessage(&err, Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3);
88                 break;
89         // -- Check for messages
90         case SYS_GETMSG:
91                 ret = Proc_GetMessage(&err, (Uint*)Regs->Arg1, (void*)Regs->Arg2);
92                 break;
93         
94         // -- Set the thread's name
95         case SYS_SETNAME:
96                 // Sanity Check
97                 if(!Regs->Arg1) {       ret = -1;       err = -EINVAL;  break;  }
98                 Threads_SetName( (void*)Regs->Arg1 );
99                 break;
100         
101         // ---
102         // Binary Control
103         // ---
104         case SYS_EXECVE:
105                 ret = Proc_Execve((char*)Regs->Arg1, (char**)Regs->Arg2, (char**)Regs->Arg3);
106                 break;
107         case SYS_LOADBIN:
108                 ret = Binary_Load((char*)Regs->Arg1, (Uint*)Regs->Arg2);
109                 break;
110         
111         // ---
112         // Virtual Filesystem
113         // ---
114         case SYS_OPEN:
115                 ret = VFS_Open((char*)Regs->Arg1, Regs->Arg2 | VFS_OPENFLAG_USER);
116                 break;
117         
118         case SYS_CLOSE:
119                 VFS_Close( Regs->Arg1 );
120                 break;
121         
122         case SYS_WRITE:
123                 #if BITS < 64
124                 VFS_Write( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 );
125                 #else
126                 VFS_Write( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 );
127                 #endif
128                 break;
129         
130         case SYS_READ:
131                 #if BITS < 64
132                 VFS_Read( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 );
133                 #else
134                 VFS_Read( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 );
135                 #endif
136                 break;
137         
138         case SYS_FINFO:
139                 ret = VFS_FInfo( Regs->Arg1, (void*)Regs->Arg2, Regs->Arg3 );
140                 break;
141         
142         // -- Debug
143         case SYS_DEBUG:
144                 Log((char*)Regs->Arg1,
145                         Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6);
146                 break;
147         
148         // -- Default (Return Error)
149         default:
150                 Warning("SyscallHandler: Unknown System Call %i", Regs->Num);
151                 if(Regs->Num < NUM_SYSCALLS)
152                         Warning(" Syscall '%s'", cSYSCALL_NAMES[Regs->Num]);
153                 err = -ENOSYS;
154                 ret = -1;
155                 break;
156         }
157         #if BITS < 64
158         Regs->Return = ret&0xFFFFFFFF;
159         Regs->RetHi = ret >> 32;
160         #else
161         Regs->Return = ret;
162         #endif
163         Regs->Error = err;
164         #if DEBUG
165         LOG("SyscallHandler: err = %i", err);
166         LEAVE('x', ret);
167         #endif
168 }
169

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