diff options
Diffstat (limited to 'include/asm-arm/unistd.h')
-rw-r--r-- | include/asm-arm/unistd.h | 65 |
1 files changed, 36 insertions, 29 deletions
diff --git a/include/asm-arm/unistd.h b/include/asm-arm/unistd.h index d626e70faded..77430d6178ae 100644 --- a/include/asm-arm/unistd.h +++ b/include/asm-arm/unistd.h | |||
@@ -15,10 +15,12 @@ | |||
15 | 15 | ||
16 | #include <linux/linkage.h> | 16 | #include <linux/linkage.h> |
17 | 17 | ||
18 | #if defined(__thumb__) | 18 | #define __NR_OABI_SYSCALL_BASE 0x900000 |
19 | |||
20 | #if defined(__thumb__) || defined(__ARM_EABI__) | ||
19 | #define __NR_SYSCALL_BASE 0 | 21 | #define __NR_SYSCALL_BASE 0 |
20 | #else | 22 | #else |
21 | #define __NR_SYSCALL_BASE 0x900000 | 23 | #define __NR_SYSCALL_BASE __NR_OABI_SYSCALL_BASE |
22 | #endif | 24 | #endif |
23 | 25 | ||
24 | /* | 26 | /* |
@@ -373,13 +375,13 @@ | |||
373 | #define __sys1(x) __sys2(x) | 375 | #define __sys1(x) __sys2(x) |
374 | 376 | ||
375 | #ifndef __syscall | 377 | #ifndef __syscall |
376 | #if defined(__thumb__) | 378 | #if defined(__thumb__) || defined(__ARM_EABI__) |
377 | #define __syscall(name) \ | 379 | #define __SYS_REG(name) register long __sysreg __asm__("r7") = __NR_##name; |
378 | "push {r7}\n\t" \ | 380 | #define __SYS_REG_LIST(regs...) "r" (__sysreg) , ##regs |
379 | "mov r7, #" __sys1(__NR_##name) "\n\t" \ | 381 | #define __syscall(name) "swi\t0" |
380 | "swi 0\n\t" \ | ||
381 | "pop {r7}" | ||
382 | #else | 382 | #else |
383 | #define __SYS_REG(name) | ||
384 | #define __SYS_REG_LIST(regs...) regs | ||
383 | #define __syscall(name) "swi\t" __sys1(__NR_##name) "" | 385 | #define __syscall(name) "swi\t" __sys1(__NR_##name) "" |
384 | #endif | 386 | #endif |
385 | #endif | 387 | #endif |
@@ -395,33 +397,34 @@ do { \ | |||
395 | 397 | ||
396 | #define _syscall0(type,name) \ | 398 | #define _syscall0(type,name) \ |
397 | type name(void) { \ | 399 | type name(void) { \ |
400 | __SYS_REG(name) \ | ||
398 | register long __res_r0 __asm__("r0"); \ | 401 | register long __res_r0 __asm__("r0"); \ |
399 | long __res; \ | 402 | long __res; \ |
400 | __asm__ __volatile__ ( \ | 403 | __asm__ __volatile__ ( \ |
401 | __syscall(name) \ | 404 | __syscall(name) \ |
402 | : "=r" (__res_r0) \ | 405 | : "=r" (__res_r0) \ |
403 | : \ | 406 | : __SYS_REG_LIST() ); \ |
404 | : "lr"); \ | ||
405 | __res = __res_r0; \ | 407 | __res = __res_r0; \ |
406 | __syscall_return(type,__res); \ | 408 | __syscall_return(type,__res); \ |
407 | } | 409 | } |
408 | 410 | ||
409 | #define _syscall1(type,name,type1,arg1) \ | 411 | #define _syscall1(type,name,type1,arg1) \ |
410 | type name(type1 arg1) { \ | 412 | type name(type1 arg1) { \ |
413 | __SYS_REG(name) \ | ||
411 | register long __r0 __asm__("r0") = (long)arg1; \ | 414 | register long __r0 __asm__("r0") = (long)arg1; \ |
412 | register long __res_r0 __asm__("r0"); \ | 415 | register long __res_r0 __asm__("r0"); \ |
413 | long __res; \ | 416 | long __res; \ |
414 | __asm__ __volatile__ ( \ | 417 | __asm__ __volatile__ ( \ |
415 | __syscall(name) \ | 418 | __syscall(name) \ |
416 | : "=r" (__res_r0) \ | 419 | : "=r" (__res_r0) \ |
417 | : "r" (__r0) \ | 420 | : __SYS_REG_LIST( "0" (__r0) ) ); \ |
418 | : "lr"); \ | ||
419 | __res = __res_r0; \ | 421 | __res = __res_r0; \ |
420 | __syscall_return(type,__res); \ | 422 | __syscall_return(type,__res); \ |
421 | } | 423 | } |
422 | 424 | ||
423 | #define _syscall2(type,name,type1,arg1,type2,arg2) \ | 425 | #define _syscall2(type,name,type1,arg1,type2,arg2) \ |
424 | type name(type1 arg1,type2 arg2) { \ | 426 | type name(type1 arg1,type2 arg2) { \ |
427 | __SYS_REG(name) \ | ||
425 | register long __r0 __asm__("r0") = (long)arg1; \ | 428 | register long __r0 __asm__("r0") = (long)arg1; \ |
426 | register long __r1 __asm__("r1") = (long)arg2; \ | 429 | register long __r1 __asm__("r1") = (long)arg2; \ |
427 | register long __res_r0 __asm__("r0"); \ | 430 | register long __res_r0 __asm__("r0"); \ |
@@ -429,8 +432,7 @@ type name(type1 arg1,type2 arg2) { \ | |||
429 | __asm__ __volatile__ ( \ | 432 | __asm__ __volatile__ ( \ |
430 | __syscall(name) \ | 433 | __syscall(name) \ |
431 | : "=r" (__res_r0) \ | 434 | : "=r" (__res_r0) \ |
432 | : "r" (__r0),"r" (__r1) \ | 435 | : __SYS_REG_LIST( "0" (__r0), "r" (__r1) ) ); \ |
433 | : "lr"); \ | ||
434 | __res = __res_r0; \ | 436 | __res = __res_r0; \ |
435 | __syscall_return(type,__res); \ | 437 | __syscall_return(type,__res); \ |
436 | } | 438 | } |
@@ -438,6 +440,7 @@ type name(type1 arg1,type2 arg2) { \ | |||
438 | 440 | ||
439 | #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ | 441 | #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ |
440 | type name(type1 arg1,type2 arg2,type3 arg3) { \ | 442 | type name(type1 arg1,type2 arg2,type3 arg3) { \ |
443 | __SYS_REG(name) \ | ||
441 | register long __r0 __asm__("r0") = (long)arg1; \ | 444 | register long __r0 __asm__("r0") = (long)arg1; \ |
442 | register long __r1 __asm__("r1") = (long)arg2; \ | 445 | register long __r1 __asm__("r1") = (long)arg2; \ |
443 | register long __r2 __asm__("r2") = (long)arg3; \ | 446 | register long __r2 __asm__("r2") = (long)arg3; \ |
@@ -446,8 +449,7 @@ type name(type1 arg1,type2 arg2,type3 arg3) { \ | |||
446 | __asm__ __volatile__ ( \ | 449 | __asm__ __volatile__ ( \ |
447 | __syscall(name) \ | 450 | __syscall(name) \ |
448 | : "=r" (__res_r0) \ | 451 | : "=r" (__res_r0) \ |
449 | : "r" (__r0),"r" (__r1),"r" (__r2) \ | 452 | : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2) ) ); \ |
450 | : "lr"); \ | ||
451 | __res = __res_r0; \ | 453 | __res = __res_r0; \ |
452 | __syscall_return(type,__res); \ | 454 | __syscall_return(type,__res); \ |
453 | } | 455 | } |
@@ -455,6 +457,7 @@ type name(type1 arg1,type2 arg2,type3 arg3) { \ | |||
455 | 457 | ||
456 | #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)\ | 458 | #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)\ |
457 | type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ | 459 | type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ |
460 | __SYS_REG(name) \ | ||
458 | register long __r0 __asm__("r0") = (long)arg1; \ | 461 | register long __r0 __asm__("r0") = (long)arg1; \ |
459 | register long __r1 __asm__("r1") = (long)arg2; \ | 462 | register long __r1 __asm__("r1") = (long)arg2; \ |
460 | register long __r2 __asm__("r2") = (long)arg3; \ | 463 | register long __r2 __asm__("r2") = (long)arg3; \ |
@@ -464,8 +467,7 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ | |||
464 | __asm__ __volatile__ ( \ | 467 | __asm__ __volatile__ ( \ |
465 | __syscall(name) \ | 468 | __syscall(name) \ |
466 | : "=r" (__res_r0) \ | 469 | : "=r" (__res_r0) \ |
467 | : "r" (__r0),"r" (__r1),"r" (__r2),"r" (__r3) \ | 470 | : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2), "r" (__r3) ) ); \ |
468 | : "lr"); \ | ||
469 | __res = __res_r0; \ | 471 | __res = __res_r0; \ |
470 | __syscall_return(type,__res); \ | 472 | __syscall_return(type,__res); \ |
471 | } | 473 | } |
@@ -473,6 +475,7 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ | |||
473 | 475 | ||
474 | #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \ | 476 | #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \ |
475 | type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) { \ | 477 | type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) { \ |
478 | __SYS_REG(name) \ | ||
476 | register long __r0 __asm__("r0") = (long)arg1; \ | 479 | register long __r0 __asm__("r0") = (long)arg1; \ |
477 | register long __r1 __asm__("r1") = (long)arg2; \ | 480 | register long __r1 __asm__("r1") = (long)arg2; \ |
478 | register long __r2 __asm__("r2") = (long)arg3; \ | 481 | register long __r2 __asm__("r2") = (long)arg3; \ |
@@ -483,14 +486,15 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) { \ | |||
483 | __asm__ __volatile__ ( \ | 486 | __asm__ __volatile__ ( \ |
484 | __syscall(name) \ | 487 | __syscall(name) \ |
485 | : "=r" (__res_r0) \ | 488 | : "=r" (__res_r0) \ |
486 | : "r" (__r0),"r" (__r1),"r" (__r2),"r" (__r3),"r" (__r4) \ | 489 | : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2), \ |
487 | : "lr"); \ | 490 | "r" (__r3), "r" (__r4) ) ); \ |
488 | __res = __res_r0; \ | 491 | __res = __res_r0; \ |
489 | __syscall_return(type,__res); \ | 492 | __syscall_return(type,__res); \ |
490 | } | 493 | } |
491 | 494 | ||
492 | #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6) \ | 495 | #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6) \ |
493 | type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) { \ | 496 | type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) { \ |
497 | __SYS_REG(name) \ | ||
494 | register long __r0 __asm__("r0") = (long)arg1; \ | 498 | register long __r0 __asm__("r0") = (long)arg1; \ |
495 | register long __r1 __asm__("r1") = (long)arg2; \ | 499 | register long __r1 __asm__("r1") = (long)arg2; \ |
496 | register long __r2 __asm__("r2") = (long)arg3; \ | 500 | register long __r2 __asm__("r2") = (long)arg3; \ |
@@ -502,30 +506,33 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6 | |||
502 | __asm__ __volatile__ ( \ | 506 | __asm__ __volatile__ ( \ |
503 | __syscall(name) \ | 507 | __syscall(name) \ |
504 | : "=r" (__res_r0) \ | 508 | : "=r" (__res_r0) \ |
505 | : "r" (__r0),"r" (__r1),"r" (__r2),"r" (__r3), "r" (__r4),"r" (__r5) \ | 509 | : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2), \ |
506 | : "lr"); \ | 510 | "r" (__r3), "r" (__r4), "r" (__r5) ) ); \ |
507 | __res = __res_r0; \ | 511 | __res = __res_r0; \ |
508 | __syscall_return(type,__res); \ | 512 | __syscall_return(type,__res); \ |
509 | } | 513 | } |
510 | 514 | ||
511 | #ifdef __KERNEL__ | 515 | #ifdef __KERNEL__ |
512 | #define __ARCH_WANT_IPC_PARSE_VERSION | 516 | #define __ARCH_WANT_IPC_PARSE_VERSION |
513 | #define __ARCH_WANT_OLD_READDIR | ||
514 | #define __ARCH_WANT_STAT64 | 517 | #define __ARCH_WANT_STAT64 |
515 | #define __ARCH_WANT_SYS_ALARM | ||
516 | #define __ARCH_WANT_SYS_GETHOSTNAME | 518 | #define __ARCH_WANT_SYS_GETHOSTNAME |
517 | #define __ARCH_WANT_SYS_PAUSE | 519 | #define __ARCH_WANT_SYS_PAUSE |
518 | #define __ARCH_WANT_SYS_TIME | ||
519 | #define __ARCH_WANT_SYS_UTIME | ||
520 | #define __ARCH_WANT_SYS_SOCKETCALL | ||
521 | #define __ARCH_WANT_SYS_GETPGRP | 520 | #define __ARCH_WANT_SYS_GETPGRP |
522 | #define __ARCH_WANT_SYS_LLSEEK | 521 | #define __ARCH_WANT_SYS_LLSEEK |
523 | #define __ARCH_WANT_SYS_NICE | 522 | #define __ARCH_WANT_SYS_NICE |
524 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT | ||
525 | #define __ARCH_WANT_SYS_OLDUMOUNT | ||
526 | #define __ARCH_WANT_SYS_SIGPENDING | 523 | #define __ARCH_WANT_SYS_SIGPENDING |
527 | #define __ARCH_WANT_SYS_SIGPROCMASK | 524 | #define __ARCH_WANT_SYS_SIGPROCMASK |
528 | #define __ARCH_WANT_SYS_RT_SIGACTION | 525 | #define __ARCH_WANT_SYS_RT_SIGACTION |
526 | |||
527 | #if !defined(CONFIG_AEABI) || defined(CONFIG_OABI_COMPAT) | ||
528 | #define __ARCH_WANT_SYS_TIME | ||
529 | #define __ARCH_WANT_SYS_OLDUMOUNT | ||
530 | #define __ARCH_WANT_SYS_ALARM | ||
531 | #define __ARCH_WANT_SYS_UTIME | ||
532 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT | ||
533 | #define __ARCH_WANT_OLD_READDIR | ||
534 | #define __ARCH_WANT_SYS_SOCKETCALL | ||
535 | #endif | ||
529 | #endif | 536 | #endif |
530 | 537 | ||
531 | #ifdef __KERNEL_SYSCALLS__ | 538 | #ifdef __KERNEL_SYSCALLS__ |