001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028 #include <hwcore/swintr.h>
029 #include <string.h>
030 #include "crt.h"
031
032
033
034
035 void _start() __attribute__((noreturn));
036 void _start()
037 {
038
039 extern int main();
040
041
042 extern char _bbss, _ebss;
043 memset(& _bbss, 0x0, (& _ebss) - (& _bbss));
044
045 _sos_exit(main());
046 }
047
048
049
050
051
052
053
054
055
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
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 }