Diff markup
001 001
002 002
003 003
004 004
005 005
006 006
007 007
008 008
009 009
010 010
011 011
012 012
013 013
014 014
015 015
016 016
017 017
018 018
019 019
020 020
021 021
022 022
023 023
024 024
025 025
026 026
027 027
028 #include <hwcore/swintr.h> 028 #include <hwcore/swintr.h>
029 #include <string.h> 029 #include <string.h>
030 #include "crt.h" 030 #include "crt.h"
031 031
032 032
033 033
034 034
035 void _start() __attribute__((noreturn)); 035 void _start() __attribute__((noreturn));
036 void _start() 036 void _start()
037 { 037 {
038 038
039 extern int main(); 039 extern int main();
040 040
041 041
042 extern char _bbss, _ebss; 042 extern char _bbss, _ebss;
043 memset(& _bbss, 0x0, (& _ebss) - (& _bbss)); 043 memset(& _bbss, 0x0, (& _ebss) - (& _bbss));
044 044
045 _sos_exit(main()); 045 _sos_exit(main());
046 } 046 }
047 047
048 048
049 049
050 050
051 051
052 052
053 053
054 054
055 055
056 056
057 057
058 058
059 inline 059 inline
060 int _sos_syscall3(int id, 060 int _sos_syscall3(int id,
061 unsigned int arg1, 061 unsigned int arg1,
062 unsigned int arg2, 062 unsigned int arg2,
063 unsigned int arg3) 063 unsigned int arg3)
064 { 064 {
065 int ret; 065 int ret;
066 066
067 asm volatile("movl %1,%%eax \n" 067 asm volatile("movl %1,%%eax \n"
068 "movl %2,%%ebx \n" 068 "movl %2,%%ebx \n"
069 "movl %3,%%ecx \n" 069 "movl %3,%%ecx \n"
070 "movl %4,%%edx \n" 070 "movl %4,%%edx \n"
071 "int %5\n" 071 "int %5\n"
072 "movl %%eax, %0" 072 "movl %%eax, %0"
073 :"=g"(ret) 073 :"=g"(ret)
074 :"g"(id),"g"(arg1),"g"(arg2),"g 074 :"g"(id),"g"(arg1),"g"(arg2),"g"(arg3)
075 ,"i"(SOS_SWINTR_SOS_SYSCALL) 075 ,"i"(SOS_SWINTR_SOS_SYSCALL)
076 :"eax","ebx","ecx","edx"); 076 :"eax","ebx","ecx","edx");
077 077
078 return ret; 078 return ret;
079 } 079 }
080 080
081 081
082 int _sos_syscall0(int id) 082 int _sos_syscall0(int id)
083 { 083 {
084 return _sos_syscall3(id, 0, 0, 0); 084 return _sos_syscall3(id, 0, 0, 0);
085 } 085 }
086 086
087 087
088 int _sos_syscall1(int id, 088 int _sos_syscall1(int id,
089 unsigned int arg1) 089 unsigned int arg1)
090 { 090 {
091 return _sos_syscall3(id, arg1, 0, 0); 091 return _sos_syscall3(id, arg1, 0, 0);
092 } 092 }
093 093
094 094
095 int _sos_syscall2(int id, 095 int _sos_syscall2(int id,
096 unsigned int arg1, 096 unsigned int arg1,
097 unsigned int arg2) 097 unsigned int arg2)
098 { 098 {
099 return _sos_syscall3(id, arg1, arg2, 0); 099 return _sos_syscall3(id, arg1, arg2, 0);
100 } 100 }
101 101
102 102
103 int _sos_syscall4(int id, 103 int _sos_syscall4(int id,
104 unsigned int arg1, 104 unsigned int arg1,
105 unsigned int arg2, 105 unsigned int arg2,
106 unsigned int arg3, 106 unsigned int arg3,
107 unsigned int arg4) 107 unsigned int arg4)
108 { 108 {
109 unsigned int args[] = { arg3, arg4 }; 109 unsigned int args[] = { arg3, arg4 };
110 return _sos_syscall3(id, arg1, arg2, (unsign 110 return _sos_syscall3(id, arg1, arg2, (unsigned)args);
111 } 111 }
112 112
113 113
114 int _sos_syscall5(int id, 114 int _sos_syscall5(int id,
115 unsigned int arg1, 115 unsigned int arg1,
116 unsigned int arg2, 116 unsigned int arg2,
117 unsigned int arg3, 117 unsigned int arg3,
118 unsigned int arg4, 118 unsigned int arg4,
119 unsigned int arg5) 119 unsigned int arg5)
120 { 120 {
121 unsigned int args[] = { arg3, arg4, arg5 }; 121 unsigned int args[] = { arg3, arg4, arg5 };
122 return _sos_syscall3(id, arg1, arg2, (unsign 122 return _sos_syscall3(id, arg1, arg2, (unsigned)args);
123 } 123 }
124 124
125 125
126 int _sos_syscall6(int id, 126 int _sos_syscall6(int id,
127 unsigned int arg1, 127 unsigned int arg1,
128 unsigned int arg2, 128 unsigned int arg2,
129 unsigned int arg3, 129 unsigned int arg3,
130 unsigned int arg4, 130 unsigned int arg4,
131 unsigned int arg5, 131 unsigned int arg5,
132 unsigned int arg6) 132 unsigned int arg6)
133 { 133 {
134 unsigned int args[] = { arg3, arg4, arg5, ar 134 unsigned int args[] = { arg3, arg4, arg5, arg6 };
135 return _sos_syscall3(id, arg1, arg2, (unsign 135 return _sos_syscall3(id, arg1, arg2, (unsigned)args);
136 } 136 }
137 137
138 138
139 int _sos_syscall7(int id, 139 int _sos_syscall7(int id,
140 unsigned int arg1, 140 unsigned int arg1,
141 unsigned int arg2, 141 unsigned int arg2,
142 unsigned int arg3, 142 unsigned int arg3,
143 unsigned int arg4, 143 unsigned int arg4,
144 unsigned int arg5, 144 unsigned int arg5,
145 unsigned int arg6, 145 unsigned int arg6,
146 unsigned int arg7) 146 unsigned int arg7)
147 { 147 {
148 unsigned int args[] = { arg3, arg4, arg5, ar 148 unsigned int args[] = { arg3, arg4, arg5, arg6, arg7 };
149 return _sos_syscall3(id, arg1, arg2, (unsign 149 return _sos_syscall3(id, arg1, arg2, (unsigned)args);
150 } 150 }
151 151
152 152
153 int _sos_syscall8(int id, 153 int _sos_syscall8(int id,
154 unsigned int arg1, 154 unsigned int arg1,
155 unsigned int arg2, 155 unsigned int arg2,
156 unsigned int arg3, 156 unsigned int arg3,
157 unsigned int arg4, 157 unsigned int arg4,
158 unsigned int arg5, 158 unsigned int arg5,
159 unsigned int arg6, 159 unsigned int arg6,
160 unsigned int arg7, 160 unsigned int arg7,
161 unsigned int arg8) 161 unsigned int arg8)
162 { 162 {
163 unsigned int args[] = { arg3, arg4, arg5, ar 163 unsigned int args[] = { arg3, arg4, arg5, arg6, arg7, arg8 };
164 return _sos_syscall3(id, arg1, arg2, (unsign 164 return _sos_syscall3(id, arg1, arg2, (unsigned)args);
165 } 165 }
166 166
167 167
168 void _sos_exit(int status) 168 void _sos_exit(int status)
169 { 169 {
170 _sos_syscall1(SOS_SYSCALL_ID_EXIT, (unsigned 170 _sos_syscall1(SOS_SYSCALL_ID_EXIT, (unsigned)status);
171 171
172 172
173 for ( ; ; ) 173 for ( ; ; )
174 ; 174 ;
175 } 175 }
176 176
177 177
178 int _sos_bochs_write(const char * str, unsigne 178 int _sos_bochs_write(const char * str, unsigned length)
179 { 179 {
180 return _sos_syscall2(SOS_SYSCALL_ID_BOCHS_WR 180 return _sos_syscall2(SOS_SYSCALL_ID_BOCHS_WRITE,
181 (unsigned)str, 181 (unsigned)str,
182 length); 182 length);
183 } 183 }
>> 184
>> 185
>> 186 int _sos_fork()
>> 187 {
>> 188 return _sos_syscall0(SOS_SYSCALL_ID_FORK);
>> 189 }
>> 190
>> 191
>> 192 int _sos_exec(const char * prog)
>> 193 {
>> 194 return _sos_syscall2(SOS_SYSCALL_ID_EXEC, (unsigned int)prog,
>> 195 (unsigned int)strlen(prog));
>> 196 }
>> 197
>> 198
>> 199 int _sos_mmap(void ** ptr_hint_addr, size_t len, int prot, int flags,
>> 200 const char *resource_path, loff_t offset)
>> 201 {
>> 202 return _sos_syscall7(SOS_SYSCALL_ID_MMAP,
>> 203 (unsigned int)ptr_hint_addr, len, prot, flags,
>> 204 (unsigned int)resource_path,
>> 205 (offset >> 32),
>> 206 (offset & 0xffffffff));
>> 207 }
>> 208
>> 209
>> 210 int _sos_munmap(void * start, size_t length)
>> 211 {
>> 212 return _sos_syscall2(SOS_SYSCALL_ID_MUNMAP,
>> 213 (unsigned int)start,
>> 214 length);
>> 215 }
>> 216
>> 217
>> 218 int _sos_mprotect(const void *addr, size_t len, int prot)
>> 219 {
>> 220 return _sos_syscall3(SOS_SYSCALL_ID_MPROTECT,
>> 221 (unsigned int)addr,
>> 222 len,
>> 223 (unsigned int)prot);
>> 224 }
>> 225
>> 226
>> 227 int _sos_mresize(void * old_addr, size_t old_len,
>> 228 void * *new_addr, size_t new_len,
>> 229 unsigned long flags)
>> 230 {
>> 231 return _sos_syscall5(SOS_SYSCALL_ID_MRESIZE,
>> 232 (unsigned int)old_addr,
>> 233 old_len,
>> 234 (unsigned int)new_addr,
>> 235 new_len,
>> 236 flags);
>> 237 }
>> 238
>> 239
>> 240
>> 241
>> 242
>> 243
>> 244
>> 245
>> 246
>> 247 static void thread_routine()
>> 248 {
>> 249
>> 250 register unsigned long int reg_arg1 asm("%eax");
>> 251 register unsigned long int reg_arg2 asm("%ebx");
>> 252
>> 253 sos_thread_func_t * func = (sos_thread_func_t*)reg_arg1;
>> 254 unsigned long int arg = reg_arg2;
>> 255
>> 256 func(arg);
>> 257 _sos_exit(0);
>> 258 }
>> 259
>> 260
>> 261 int _sos_new_thread(sos_thread_func_t *func,
>> 262 void* arg,
>> 263 size_t stack_size)
>> 264 {
>> 265 return _sos_syscall4(SOS_SYSCALL_ID_NEW_THREAD,
>> 266 (unsigned)thread_routine,
>> 267 (unsigned)func, (unsigned)arg,
>> 268 stack_size);
>> 269 }
>> 270
>> 271
>> 272 int _sos_nanosleep(unsigned long int sec,
>> 273 unsigned long int nanosec)
>> 274 {
>> 275 return _sos_syscall2(SOS_SYSCALL_ID_NANOSLEEP,
>> 276 sec, nanosec);
>> 277 }
>> 278
>> 279
>> 280 void * _sos_brk(void * new_top_address)
>> 281 {
>> 282 return (void*)_sos_syscall1(SOS_SYSCALL_ID_BRK,
>> 283 (unsigned)new_top_address);
>> 284 }