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","memor !! 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 184
185 185
186 int _sos_fork() 186 int _sos_fork()
187 { 187 {
188 return _sos_syscall0(SOS_SYSCALL_ID_FORK); 188 return _sos_syscall0(SOS_SYSCALL_ID_FORK);
189 } 189 }
190 190
191 191
192 int _sos_exec(const char * prog) 192 int _sos_exec(const char * prog)
193 { 193 {
194 return _sos_syscall2(SOS_SYSCALL_ID_EXEC, (u 194 return _sos_syscall2(SOS_SYSCALL_ID_EXEC, (unsigned int)prog,
195 (unsigned int)strlen(pr 195 (unsigned int)strlen(prog));
196 } 196 }
197 197
198 198
>> 199 int _sos_fakemmap(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_FAKEMMAP,
>> 203 (unsigned int)ptr_hint_addr, len, prot, flags,
>> 204 (unsigned int)resource_path,
>> 205 (offset >> 32),
>> 206 (offset & 0xffffffff));
>> 207 }
>> 208
>> 209
199 int _sos_munmap(void * start, size_t length) 210 int _sos_munmap(void * start, size_t length)
200 { 211 {
201 return _sos_syscall2(SOS_SYSCALL_ID_MUNMAP, 212 return _sos_syscall2(SOS_SYSCALL_ID_MUNMAP,
202 (unsigned int)start, 213 (unsigned int)start,
203 length); 214 length);
204 } 215 }
205 216
206 217
207 int _sos_mprotect(const void *addr, size_t len 218 int _sos_mprotect(const void *addr, size_t len, int prot)
208 { 219 {
209 return _sos_syscall3(SOS_SYSCALL_ID_MPROTECT 220 return _sos_syscall3(SOS_SYSCALL_ID_MPROTECT,
210 (unsigned int)addr, 221 (unsigned int)addr,
211 len, 222 len,
212 (unsigned int)prot); 223 (unsigned int)prot);
213 } 224 }
214 225
215 226
216 int _sos_mresize(void * old_addr, size_t old_l 227 int _sos_mresize(void * old_addr, size_t old_len,
217 void * *new_addr, size_t new_ 228 void * *new_addr, size_t new_len,
218 unsigned long flags) 229 unsigned long flags)
219 { 230 {
220 return _sos_syscall5(SOS_SYSCALL_ID_MRESIZE, 231 return _sos_syscall5(SOS_SYSCALL_ID_MRESIZE,
221 (unsigned int)old_addr, 232 (unsigned int)old_addr,
222 old_len, 233 old_len,
223 (unsigned int)new_addr, 234 (unsigned int)new_addr,
224 new_len, 235 new_len,
225 flags); 236 flags);
226 } 237 }
227 238
228 239
229 240
230 241
231 242
232 243
233 244
234 245
235 246
236 static void thread_routine() 247 static void thread_routine()
237 { 248 {
238 249
239 register unsigned long int reg_arg1 asm("%ea 250 register unsigned long int reg_arg1 asm("%eax");
240 register unsigned long int reg_arg2 asm("%eb 251 register unsigned long int reg_arg2 asm("%ebx");
241 252
242 sos_thread_func_t * func = (sos_thread_func_ 253 sos_thread_func_t * func = (sos_thread_func_t*)reg_arg1;
243 unsigned long int arg = reg_arg2; 254 unsigned long int arg = reg_arg2;
244 255
245 func(arg); 256 func(arg);
246 _sos_exit(0); 257 _sos_exit(0);
247 } 258 }
248 259
249 260
250 int _sos_new_thread(sos_thread_func_t *func, 261 int _sos_new_thread(sos_thread_func_t *func,
251 void* arg, 262 void* arg,
252 size_t stack_size) 263 size_t stack_size)
253 { 264 {
254 return _sos_syscall4(SOS_SYSCALL_ID_NEW_THRE 265 return _sos_syscall4(SOS_SYSCALL_ID_NEW_THREAD,
255 (unsigned)thread_routin 266 (unsigned)thread_routine,
256 (unsigned)func, (unsign 267 (unsigned)func, (unsigned)arg,
257 stack_size); 268 stack_size);
258 } 269 }
259 270
260 271
261 int _sos_nanosleep(unsigned long int sec, 272 int _sos_nanosleep(unsigned long int sec,
262 unsigned long int nanosec) 273 unsigned long int nanosec)
263 { 274 {
264 return _sos_syscall2(SOS_SYSCALL_ID_NANOSLEE 275 return _sos_syscall2(SOS_SYSCALL_ID_NANOSLEEP,
265 sec, nanosec); 276 sec, nanosec);
266 } 277 }
267 278
268 279
269 void * _sos_brk(void * new_top_address) 280 void * _sos_brk(void * new_top_address)
270 { 281 {
271 return (void*)_sos_syscall1(SOS_SYSCALL_ID_B 282 return (void*)_sos_syscall1(SOS_SYSCALL_ID_BRK,
272 (unsigned)new_to 283 (unsigned)new_top_address);
273 } 284 }
274 285
275 286
276 int _sos_mount(const char *source, const char 287 int _sos_mount(const char *source, const char *target,
277 const char *filesystemtype, uns 288 const char *filesystemtype, unsigned long mountflags,
278 const char *args) 289 const char *args)
279 { 290 {
280 if (!target || !filesystemtype) 291 if (!target || !filesystemtype)
281 return -1; 292 return -1;
282 293
283 return _sos_syscall7(SOS_SYSCALL_ID_MOUNT, 294 return _sos_syscall7(SOS_SYSCALL_ID_MOUNT,
284 (unsigned int)source, s 295 (unsigned int)source, source?strlen(source):0,
285 (unsigned int)target, s 296 (unsigned int)target, strlen(target),
286 (unsigned int)filesyste 297 (unsigned int)filesystemtype,
287 mountflags, 298 mountflags,
288 (unsigned int)args); 299 (unsigned int)args);
289 } 300 }
290 301
291 302
292 int _sos_umount(const char *target) 303 int _sos_umount(const char *target)
293 { 304 {
294 if (!target) 305 if (!target)
295 return -1; 306 return -1;
296 307
297 return _sos_syscall2(SOS_SYSCALL_ID_UMOUNT, 308 return _sos_syscall2(SOS_SYSCALL_ID_UMOUNT,
298 (unsigned int)target, 309 (unsigned int)target,
299 strlen(target)); 310 strlen(target));
300 } 311 }
301 312
302 313
303 void _sos_sync(void) 314 void _sos_sync(void)
304 { 315 {
305 _sos_syscall0(SOS_SYSCALL_ID_SYNC); 316 _sos_syscall0(SOS_SYSCALL_ID_SYNC);
306 } 317 }
307 318
308 319
309 int _sos_statvfs(const char *path, struct stat 320 int _sos_statvfs(const char *path, struct statvfs *buf)
310 { 321 {
311 if (! path) 322 if (! path)
312 return -1; 323 return -1;
313 324
314 return _sos_syscall3(SOS_SYSCALL_ID_VFSTAT64 325 return _sos_syscall3(SOS_SYSCALL_ID_VFSTAT64,
315 (unsigned)path, 326 (unsigned)path,
316 strlen(path), 327 strlen(path),
317 (unsigned)buf); 328 (unsigned)buf);
318 } 329 }
319 330
320 331
321 int _sos_open(const char * pathname, int flags 332 int _sos_open(const char * pathname, int flags, int mode)
322 { 333 {
323 if (! pathname) 334 if (! pathname)
324 return -1; 335 return -1;
325 !! 336
326 return _sos_syscall4(SOS_SYSCALL_ID_OPEN, 337 return _sos_syscall4(SOS_SYSCALL_ID_OPEN,
327 (unsigned)pathname, 338 (unsigned)pathname,
328 strlen(pathname), 339 strlen(pathname),
329 flags, 340 flags,
330 mode); 341 mode);
331 } 342 }
332 343
333 344
334 int _sos_close(int fd) 345 int _sos_close(int fd)
335 { 346 {
336 return _sos_syscall1(SOS_SYSCALL_ID_CLOSE, f 347 return _sos_syscall1(SOS_SYSCALL_ID_CLOSE, fd);
337 } 348 }
338 349
339 350
340 int _sos_read(int fd, char * buf, size_t * len 351 int _sos_read(int fd, char * buf, size_t * len)
341 { 352 {
342 return _sos_syscall3(SOS_SYSCALL_ID_READ, fd 353 return _sos_syscall3(SOS_SYSCALL_ID_READ, fd,
343 (unsigned int) buf, 354 (unsigned int) buf,
344 (unsigned int) len); 355 (unsigned int) len);
345 } 356 }
346 357
347 358
348 int _sos_write(int fd, const char * buf, size_ 359 int _sos_write(int fd, const char * buf, size_t * len)
349 { 360 {
350 return _sos_syscall3(SOS_SYSCALL_ID_WRITE, f 361 return _sos_syscall3(SOS_SYSCALL_ID_WRITE, fd,
351 (unsigned int) buf, 362 (unsigned int) buf,
352 (unsigned int) len); 363 (unsigned int) len);
353 } 364 }
354 365
355 366
356 int _sos_seek64(int fd, loff_t * offset, int w 367 int _sos_seek64(int fd, loff_t * offset, int whence)
357 { 368 {
358 return _sos_syscall3(SOS_SYSCALL_ID_SEEK64, 369 return _sos_syscall3(SOS_SYSCALL_ID_SEEK64, fd,
359 (unsigned int)offset, 370 (unsigned int)offset,
360 (unsigned int)whence); 371 (unsigned int)whence);
361 } 372 }
362 373
363 374
364 int _sos_fmmap(void ** ptr_hint_addr, size_t l 375 int _sos_fmmap(void ** ptr_hint_addr, size_t len, int prot, int flags,
365 int fd, loff_t offset) 376 int fd, loff_t offset)
366 { 377 {
367 return _sos_syscall7(SOS_SYSCALL_ID_FSMMAP, 378 return _sos_syscall7(SOS_SYSCALL_ID_FSMMAP,
368 (unsigned int)ptr_hint_ 379 (unsigned int)ptr_hint_addr, len, prot, flags,
369 (unsigned int)fd, 380 (unsigned int)fd,
370 (offset 381 (offset >> 32),
371 (offset 382 (offset & 0xffffffff));
372 } 383 }
373 384
374 385
375 int _sos_ftruncate64(int fd, loff_t length) 386 int _sos_ftruncate64(int fd, loff_t length)
376 { 387 {
377 return _sos_syscall2(SOS_SYSCALL_ID_FTRUNCAT 388 return _sos_syscall2(SOS_SYSCALL_ID_FTRUNCATE64, fd,
378 (unsigned int)length); 389 (unsigned int)length);
379 } 390 }
380 391
381 392
382 int _sos_fcntl(int fd, int cmd, int arg) 393 int _sos_fcntl(int fd, int cmd, int arg)
383 { 394 {
384 return _sos_syscall3(SOS_SYSCALL_ID_FCNTL, f 395 return _sos_syscall3(SOS_SYSCALL_ID_FCNTL, fd,
385 (unsigned int)cmd, 396 (unsigned int)cmd,
386 (unsigned int)arg); 397 (unsigned int)arg);
387 } 398 }
388 399
389 400
390 int _sos_ioctl(int fd, int cmd, int arg) <<
391 { <<
392 return _sos_syscall3(SOS_SYSCALL_ID_IOCTL, f <<
393 (unsigned int)cmd, <<
394 (unsigned int)arg); <<
395 } <<
396 <<
397 <<
398 int _sos_creat(const char *pathname, int mode) 401 int _sos_creat(const char *pathname, int mode)
399 { 402 {
400 if (! pathname) 403 if (! pathname)
401 return -1; 404 return -1;
402 405
403 return _sos_syscall3(SOS_SYSCALL_ID_CREAT, 406 return _sos_syscall3(SOS_SYSCALL_ID_CREAT,
404 (unsigned int)pathname, 407 (unsigned int)pathname,
405 strlen(pathname), 408 strlen(pathname),
406 mode); 409 mode);
407 } 410 }
408 411
409 412
410 int _sos_link (const char *oldpath, const char 413 int _sos_link (const char *oldpath, const char *newpath)
411 { 414 {
412 if (!oldpath || !newpath) 415 if (!oldpath || !newpath)
413 return -1; 416 return -1;
414 417
415 return _sos_syscall4(SOS_SYSCALL_ID_LINK, 418 return _sos_syscall4(SOS_SYSCALL_ID_LINK,
416 (unsigned int)oldpath, 419 (unsigned int)oldpath,
417 strlen(oldpath), 420 strlen(oldpath),
418 (unsigned int)newpath, 421 (unsigned int)newpath,
419 strlen(newpath)); 422 strlen(newpath));
420 } 423 }
421 424
422 425
423 int _sos_unlink(const char *pathname) 426 int _sos_unlink(const char *pathname)
424 { 427 {
425 if (! pathname) 428 if (! pathname)
426 return -1; 429 return -1;
427 430
428 return _sos_syscall2(SOS_SYSCALL_ID_UNLINK, 431 return _sos_syscall2(SOS_SYSCALL_ID_UNLINK,
429 (unsigned int)pathname, 432 (unsigned int)pathname,
430 strlen(pathname)); 433 strlen(pathname));
431 } 434 }
432 435
433 436
434 int _sos_rename (const char *oldpath, const ch 437 int _sos_rename (const char *oldpath, const char *newpath)
435 { 438 {
436 if (!oldpath || !newpath) 439 if (!oldpath || !newpath)
437 return -1; 440 return -1;
438 441
439 return _sos_syscall4(SOS_SYSCALL_ID_RENAME, 442 return _sos_syscall4(SOS_SYSCALL_ID_RENAME,
440 (unsigned int)oldpath, 443 (unsigned int)oldpath,
441 strlen(oldpath), 444 strlen(oldpath),
442 (unsigned int)newpath, 445 (unsigned int)newpath,
443 strlen(newpath)); 446 strlen(newpath));
444 } 447 }
445 448
446 449
447 int _sos_symlink(const char *target, const cha 450 int _sos_symlink(const char *target, const char *path)
448 { 451 {
449 if (!path || !target) 452 if (!path || !target)
450 return -1; 453 return -1;
451 454
452 return _sos_syscall4(SOS_SYSCALL_ID_SYMLINK, 455 return _sos_syscall4(SOS_SYSCALL_ID_SYMLINK,
453 (unsigned int)path, 456 (unsigned int)path,
454 strlen(path), 457 strlen(path),
455 (unsigned int)target, 458 (unsigned int)target,
456 strlen(target)); 459 strlen(target));
457 } <<
458 <<
459 <<
460 int _sos_mknod(const char *pathname, mode_t mo <<
461 int type, <<
462 unsigned int major, unsigned mi <<
463 { <<
464 if (!pathname) <<
465 return -1; <<
466 <<
467 return _sos_syscall6(SOS_SYSCALL_ID_MKNOD, <<
468 (unsigned int)pathname, <<
469 strlen(pathname), <<
470 type, mode, major, mino <<
471 } 460 }
472 461
473 462
474 struct dirent; 463 struct dirent;
475 int _sos_readdir(int fd, struct dirent * diren 464 int _sos_readdir(int fd, struct dirent * dirent)
476 { 465 {
477 return _sos_syscall2(SOS_SYSCALL_ID_READDIR, 466 return _sos_syscall2(SOS_SYSCALL_ID_READDIR,
478 fd, 467 fd,
479 (unsigned int)dirent); 468 (unsigned int)dirent);
480 } 469 }
481 470
482 471
483 int _sos_mkdir(const char *pathname, mode_t mo 472 int _sos_mkdir(const char *pathname, mode_t mode)
484 { 473 {
485 if (!pathname) 474 if (!pathname)
486 return -1; 475 return -1;
487 476
488 return _sos_syscall3(SOS_SYSCALL_ID_MKDIR, 477 return _sos_syscall3(SOS_SYSCALL_ID_MKDIR,
489 (unsigned int)pathname, 478 (unsigned int)pathname,
490 strlen(pathname), 479 strlen(pathname),
491 mode); 480 mode);
492 } 481 }
493 482
494 483
495 int _sos_rmdir(const char *pathname) 484 int _sos_rmdir(const char *pathname)
496 { 485 {
497 if (!pathname) 486 if (!pathname)
498 return -1; 487 return -1;
499 488
500 return _sos_syscall2(SOS_SYSCALL_ID_RMDIR, 489 return _sos_syscall2(SOS_SYSCALL_ID_RMDIR,
501 (unsigned int)pathname, 490 (unsigned int)pathname,
502 strlen(pathname)); 491 strlen(pathname));
503 } 492 }
504 493
505 494
506 int _sos_chmod(const char *pathname, mode_t mo 495 int _sos_chmod(const char *pathname, mode_t mode)
507 { 496 {
508 if (!pathname) 497 if (!pathname)
509 return -1; 498 return -1;
510 499
511 return _sos_syscall3(SOS_SYSCALL_ID_CHMOD, 500 return _sos_syscall3(SOS_SYSCALL_ID_CHMOD,
512 (unsigned int)pathname, 501 (unsigned int)pathname,
513 strlen(pathname), 502 strlen(pathname),
514 mode); 503 mode);
515 } 504 }
516 505
517 506
518 int _sos_stat(const char *pathname, int nofoll 507 int _sos_stat(const char *pathname, int nofollow, struct stat * st)
519 { 508 {
520 if (!pathname || !st) 509 if (!pathname || !st)
521 return -1; 510 return -1;
522 511
523 return _sos_syscall4(SOS_SYSCALL_ID_STAT64, 512 return _sos_syscall4(SOS_SYSCALL_ID_STAT64,
524 (unsigned int)pathname, 513 (unsigned int)pathname,
525 strlen(pathname), 514 strlen(pathname),
526 nofollow, 515 nofollow,
527 (unsigned int)st); 516 (unsigned int)st);
528 } 517 }
529 518
530 519
531 int _sos_chroot(const char *dirname) 520 int _sos_chroot(const char *dirname)
532 { 521 {
533 if (!dirname) 522 if (!dirname)
534 return -1; 523 return -1;
535 524
536 return _sos_syscall2(SOS_SYSCALL_ID_CHROOT, 525 return _sos_syscall2(SOS_SYSCALL_ID_CHROOT,
537 (unsigned int)dirname, 526 (unsigned int)dirname,
538 strlen(dirname)); 527 strlen(dirname));
539 } 528 }
540 529
541 530
542 int _sos_chdir(const char *dirname) 531 int _sos_chdir(const char *dirname)
543 { 532 {
544 if (!dirname) 533 if (!dirname)
545 return -1; 534 return -1;
546 535
547 return _sos_syscall2(SOS_SYSCALL_ID_CHDIR, 536 return _sos_syscall2(SOS_SYSCALL_ID_CHDIR,
548 (unsigned int)dirname, 537 (unsigned int)dirname,
549 strlen(dirname)); 538 strlen(dirname));
550 } 539 }
551 540
552 541
553 int _sos_fchdir(int fd) 542 int _sos_fchdir(int fd)
554 { 543 {
555 return _sos_syscall1(SOS_SYSCALL_ID_FCHDIR, 544 return _sos_syscall1(SOS_SYSCALL_ID_FCHDIR,
556 (unsigned int)fd); 545 (unsigned int)fd);
557 } 546 }