Removed debug from syscalls, added debug to ld-acess/loadlib
[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 Uint     Proc_SendMessage(Uint *Err, Uint Dest, Uint Length, void *Data);
15 extern int      Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer);
16 extern int      Proc_Execve(char *File, char **ArgV, char **EnvP);
17 extern Uint     Binary_Load(char *file, Uint *entryPoint);
18
19 // === CODE ===
20 void SyscallHandler(tSyscallRegs *Regs)
21 {
22         Uint    ret=0, err=0;
23         #if DEBUG
24         ENTER("iThread iNum", gCurrentThread->TID, Regs->Num);
25         if(Regs->Num < NUM_SYSCALLS)
26                 LOG("Syscall %s", cSYSCALL_NAMES[Regs->Num]);
27         LOG("Arg1: 0x%x, Arg2: 0x%x, Arg3: 0x%x", Regs->Arg1, Regs->Arg2, Regs->Arg3);
28         #endif
29         switch(Regs->Num)
30         {
31         // -- Exit the current thread
32         case SYS_EXIT:  Proc_Exit();    break;
33         
34         // -- Put the current thread to sleep
35         case SYS_SLEEP: Proc_Sleep();   Log(" SyscallHandler: %i is alive", gCurrentThread->TID);       break;
36         
37         // -- Yield current timeslice
38         case SYS_YIELD: Proc_Yield();   break;
39         
40         // -- Clone the current thread
41         case SYS_CLONE:
42                 // Call clone system call
43                 ret = Proc_Clone(&err, Regs->Arg1);
44                 // Change user stack if requested
45                 if(ret == 0 && Regs->Arg2)
46                         Regs->StackPointer = Regs->Arg2;
47                 break;
48         
49         // -- Send a signal
50         case SYS_KILL:
51                 err = -ENOSYS;
52                 ret = -1;
53                 break;
54         
55         // -- Map an address
56         case SYS_MAP:   MM_Map(Regs->Arg1, Regs->Arg2); break;
57         // -- Allocate an address
58         case SYS_ALLOCATE:      ret = MM_Allocate(Regs->Arg1);  break;
59         // -- Unmap an address
60         case SYS_UNMAP:         MM_Deallocate(Regs->Arg1);      break;
61         
62         // -- Get Thread/Process IDs
63         case SYS_GETTID:        ret = gCurrentThread->TID;      break;
64         case SYS_GETPID:        ret = gCurrentThread->TGID;     break;
65         // -- Get User/Group IDs
66         case SYS_GETUID:        ret = gCurrentThread->UID;      break;
67         case SYS_GETGID:        ret = gCurrentThread->GID;      break;
68         
69         // -- Send Message
70         case SYS_SENDMSG:
71                 ret = Proc_SendMessage(&err, Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3);
72                 break;
73         // -- Check for messages
74         case SYS_GETMSG:
75                 ret = Proc_GetMessage(&err, (Uint*)Regs->Arg1, (void*)Regs->Arg2);
76                 break;
77         
78         // -- Set the thread's name
79         case SYS_SETNAME:
80                 // Sanity Check
81                 if(!Regs->Arg1) {       ret = -1;       err = -EINVAL;  break;  }
82                 // Lock Process
83                 LOCK( &gCurrentThread->IsLocked );
84                 // Free old name
85                 if(gCurrentThread->ThreadName && (Uint)gCurrentThread->ThreadName > 0xE0800000)
86                         free(gCurrentThread->ThreadName);
87                 // Change name
88                 gCurrentThread->ThreadName = malloc( strlen( (char*)Regs->Arg1 ) + 1 );
89                 strcpy(gCurrentThread->ThreadName, (char*)Regs->Arg1);
90                 // Unlock
91                 RELEASE( &gCurrentThread->IsLocked );
92                 break;
93         
94         // ---
95         // Binary Control
96         // ---
97         case SYS_EXECVE:
98                 ret = Proc_Execve((char*)Regs->Arg1, (char**)Regs->Arg2, (char**)Regs->Arg3);
99                 break;
100         case SYS_LOADBIN:
101                 ret = Binary_Load((char*)Regs->Arg1, (Uint*)Regs->Arg2);
102                 break;
103         
104         // ---
105         // Virtual Filesystem
106         // ---
107         case SYS_OPEN:
108                 ret = VFS_Open((char*)Regs->Arg1, Regs->Arg2 | VFS_OPENFLAG_USER);
109                 break;
110         
111         case SYS_CLOSE:
112                 VFS_Close( Regs->Arg1 );
113                 break;
114         
115         case SYS_WRITE:
116                 #if BITS < 64
117                 VFS_Write( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 );
118                 #else
119                 VFS_Write( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 );
120                 #endif
121                 break;
122         
123         
124         // -- Debug
125         case SYS_DEBUG:
126                 Log((char*)Regs->Arg1,
127                         Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6);
128                 break;
129         
130         // -- Default (Return Error)
131         default:
132                 Warning("SyscallHandler: Unknown System Call %i", Regs->Num);
133                 if(Regs->Num < NUM_SYSCALLS)
134                         Warning(" Syscall %s", cSYSCALL_NAMES[Regs->Num]);
135                 err = -ENOSYS;
136                 ret = -1;
137                 break;
138         }
139         Regs->Return = ret;
140         Regs->Error = err;
141         #if DEBUG
142         LOG("SyscallHandler: err = %i", err);
143         LEAVE('x', ret);
144         #endif
145 }
146

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