SimpleOS

LXR

Navigation



Site hébergé par : enix

The LXR Cross Referencer for SOS

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Article:1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 6.5 ] [ 7 ] [ 7.5 ] [ 8 ] [ 9 ] [ 9.5 ]

001 /* Copyright (C) 2005 David Decotigny
002    Copyright (C) 2003 Thomas Petazzoni
003 
004    This program is free software; you can redistribute it and/or
005    modify it under the terms of the GNU General Public License
006    as published by the Free Software Foundation; either version 2
007    of the License, or (at your option) any later version.
008    
009    This program is distributed in the hope that it will be useful,
010    but WITHOUT ANY WARRANTY; without even the implied warranty of
011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012    GNU General Public License for more details.
013    
014    You should have received a copy of the GNU General Public License
015    along with this program; if not, write to the Free Software
016    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
017    USA. 
018 */
019 
020 
021 /**
022  * @file crt.c
023  *
024  * The C RunTime environment for the basic support of SOS C user
025  * programs
026  */
027 
028 #include <hwcore/swintr.h>
029 #include <string.h>
030 #include "crt.h"
031 
032 /**
033  * Starter function !
034  */
035 void _start() __attribute__((noreturn));
036 void _start()
037 {
038   /* This starter function expects a main() function somewhere */
039   extern int main();
040 
041   /* Reset the bss section */
042   extern char _bbss, _ebss;
043   memset(& _bbss, 0x0, (& _ebss) - (& _bbss));
044 
045   _sos_exit(main());
046 }
047 
048 
049 /*
050  * By convention, the USER SOS programs always pass 4 arguments to the
051  * kernel syscall handler: in eax/../edx. For less arguments, the
052  * unused registers are filled with 0s. For more arguments, the 4th
053  * syscall parameter gives the address of the array containing the
054  * remaining arguments. In any case, eax corresponds to the syscall
055  * IDentifier.
056  */
057 
058 
059 inline
060 int _sos_syscall3(int id,
061                   unsigned int arg1,
062                   unsigned int arg2,
063                   unsigned int arg3)
064 {
065   int ret;
066 
067   asm volatile("movl %1,%%eax \n"
068                "movl %2,%%ebx \n"
069                "movl %3,%%ecx \n"
070                "movl %4,%%edx \n"
071                "int  %5\n"
072                "movl %%eax, %0"
073                :"=g"(ret)
074                :"g"(id),"g"(arg1),"g"(arg2),"g"(arg3)
075                 ,"i"(SOS_SWINTR_SOS_SYSCALL)
076                :"eax","ebx","ecx","edx");
077 
078   return ret;
079 }
080 
081 
082 int _sos_syscall0(int id)
083 {
084   return _sos_syscall3(id, 0, 0, 0);
085 }
086 
087 
088 int _sos_syscall1(int id,
089              unsigned int arg1)
090 {
091   return _sos_syscall3(id, arg1, 0, 0);
092 }
093 
094 
095 int _sos_syscall2(int id,
096                   unsigned int arg1,
097                   unsigned int arg2)
098 {
099   return _sos_syscall3(id, arg1, arg2, 0);
100 }
101 
102 
103 int _sos_syscall4(int id,
104                   unsigned int arg1,
105                   unsigned int arg2,
106                   unsigned int arg3,
107                   unsigned int arg4)
108 {
109   unsigned int args[] = { arg3, arg4 };
110   return _sos_syscall3(id, arg1, arg2, (unsigned)args);
111 }
112 
113 
114 int _sos_syscall5(int id,
115                   unsigned int arg1,
116                   unsigned int arg2,
117                   unsigned int arg3,
118                   unsigned int arg4,
119                   unsigned int arg5)
120 {
121   unsigned int args[] = { arg3, arg4, arg5 };
122   return _sos_syscall3(id, arg1, arg2, (unsigned)args);
123 }
124 
125 
126 int _sos_syscall6(int id,
127                   unsigned int arg1,
128                   unsigned int arg2,
129                   unsigned int arg3,
130                   unsigned int arg4,
131                   unsigned int arg5,
132                   unsigned int arg6)
133 {
134   unsigned int args[] = { arg3, arg4, arg5, arg6 };
135   return _sos_syscall3(id, arg1, arg2, (unsigned)args);
136 }
137 
138 
139 int _sos_syscall7(int id,
140                   unsigned int arg1,
141                   unsigned int arg2,
142                   unsigned int arg3,
143                   unsigned int arg4,
144                   unsigned int arg5,
145                   unsigned int arg6,
146                   unsigned int arg7)
147 {
148   unsigned int args[] = { arg3, arg4, arg5, arg6, arg7 };
149   return _sos_syscall3(id, arg1, arg2, (unsigned)args);
150 }
151 
152 
153 int _sos_syscall8(int id,
154                   unsigned int arg1,
155                   unsigned int arg2,
156                   unsigned int arg3,
157                   unsigned int arg4,
158                   unsigned int arg5,
159                   unsigned int arg6,
160                   unsigned int arg7,
161                   unsigned int arg8)
162 {
163   unsigned int args[] = { arg3, arg4, arg5, arg6, arg7, arg8 };
164   return _sos_syscall3(id, arg1, arg2, (unsigned)args);
165 }
166 
167 
168 void _sos_exit(int status)
169 {
170   _sos_syscall1(SOS_SYSCALL_ID_EXIT, (unsigned)status);
171   
172   /* Never reached ! */
173   for ( ; ; )
174     ;
175 }
176 
177 
178 int _sos_bochs_write(const char * str, unsigned length)
179 {
180   return _sos_syscall2(SOS_SYSCALL_ID_BOCHS_WRITE,
181                        (unsigned)str,
182                        length);
183 }

source navigation ] diff markup ] identifier search ] general search ]