Added VFS_ReadDir and SYS_READDIR, Implemented basic directory listing in CLIShell
[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         // -- Get the physical address of a page
69         case SYS_GETPHYS:
70                 ret = MM_GetPhysAddr(Regs->Arg1);
71                 break;
72         
73         // -- Map an address
74         case SYS_MAP:   MM_Map(Regs->Arg1, Regs->Arg2); break;
75         
76         // -- Allocate an address
77         case SYS_ALLOCATE:      ret = MM_Allocate(Regs->Arg1);  break;
78         
79         // -- Unmap an address
80         case SYS_UNMAP:         MM_Deallocate(Regs->Arg1);      break;
81         
82         // -- Get Thread/Process IDs
83         case SYS_GETTID:        ret = Threads_GetTID(); break;
84         case SYS_GETPID:        ret = Threads_GetPID(); break;
85         
86         // -- Get User/Group IDs
87         case SYS_GETUID:        ret = Threads_GetUID(); break;
88         case SYS_GETGID:        ret = Threads_GetGID(); break;
89         
90         // -- Send Message
91         case SYS_SENDMSG:
92                 ret = Proc_SendMessage(&err, Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3);
93                 break;
94         // -- Check for messages
95         case SYS_GETMSG:
96                 ret = Proc_GetMessage(&err, (Uint*)Regs->Arg1, (void*)Regs->Arg2);
97                 break;
98         
99         // -- Set the thread's name
100         case SYS_SETNAME:
101                 // Sanity Check
102                 if(!Regs->Arg1) {       ret = -1;       err = -EINVAL;  break;  }
103                 Threads_SetName( (void*)Regs->Arg1 );
104                 break;
105         
106         // ---
107         // Binary Control
108         // ---
109         case SYS_EXECVE:
110                 ret = Proc_Execve((char*)Regs->Arg1, (char**)Regs->Arg2, (char**)Regs->Arg3);
111                 break;
112         case SYS_LOADBIN:
113                 ret = Binary_Load((char*)Regs->Arg1, (Uint*)Regs->Arg2);
114                 break;
115         
116         // ---
117         // Virtual Filesystem
118         // ---
119         case SYS_OPEN:
120                 ret = VFS_Open((char*)Regs->Arg1, Regs->Arg2 | VFS_OPENFLAG_USER);
121                 break;
122         
123         case SYS_CLOSE:
124                 VFS_Close( Regs->Arg1 );
125                 break;
126         
127         case SYS_WRITE:
128                 #if BITS < 64
129                 VFS_Write( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 );
130                 #else
131                 VFS_Write( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 );
132                 #endif
133                 break;
134         
135         case SYS_READ:
136                 #if BITS < 64
137                 VFS_Read( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 );
138                 #else
139                 VFS_Read( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 );
140                 #endif
141                 break;
142         
143         case SYS_FINFO:
144                 ret = VFS_FInfo( Regs->Arg1, (void*)Regs->Arg2, Regs->Arg3 );
145                 break;
146                 
147         case SYS_READDIR:
148                 ret = VFS_ReadDir( Regs->Arg1, (void*)Regs->Arg2 );
149                 break;
150         
151         // -- Debug
152         case SYS_DEBUG:
153                 Log((char*)Regs->Arg1,
154                         Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6);
155                 break;
156         
157         // -- Default (Return Error)
158         default:
159                 Warning("SyscallHandler: Unknown System Call %i", Regs->Num);
160                 if(Regs->Num < NUM_SYSCALLS)
161                         Warning(" Syscall '%s'", cSYSCALL_NAMES[Regs->Num]);
162                 err = -ENOSYS;
163                 ret = -1;
164                 break;
165         }
166         #if BITS < 64
167         Regs->Return = ret&0xFFFFFFFF;
168         Regs->RetHi = ret >> 32;
169         #else
170         Regs->Return = ret;
171         #endif
172         Regs->Error = err;
173         #if DEBUG
174         LOG("SyscallHandler: err = %i", err);
175         LEAVE('x', ret);
176         #endif
177 }
178

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