diff options
Diffstat (limited to 'arch/ia64/kernel/fsys.S')
| -rw-r--r-- | arch/ia64/kernel/fsys.S | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/arch/ia64/kernel/fsys.S b/arch/ia64/kernel/fsys.S index c1625c7e1779..3567d54f8cee 100644 --- a/arch/ia64/kernel/fsys.S +++ b/arch/ia64/kernel/fsys.S | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <asm/unistd.h> | 25 | #include <asm/unistd.h> |
| 26 | 26 | ||
| 27 | #include "entry.h" | 27 | #include "entry.h" |
| 28 | #include "paravirt_inst.h" | ||
| 28 | 29 | ||
| 29 | /* | 30 | /* |
| 30 | * See Documentation/ia64/fsys.txt for details on fsyscalls. | 31 | * See Documentation/ia64/fsys.txt for details on fsyscalls. |
| @@ -279,7 +280,7 @@ ENTRY(fsys_gettimeofday) | |||
| 279 | (p9) cmp.eq p13,p0 = 0,r30 // if mmio_ptr, clear p13 jitter control | 280 | (p9) cmp.eq p13,p0 = 0,r30 // if mmio_ptr, clear p13 jitter control |
| 280 | ;; | 281 | ;; |
| 281 | .pred.rel.mutex p8,p9 | 282 | .pred.rel.mutex p8,p9 |
| 282 | (p8) mov r2 = ar.itc // CPU_TIMER. 36 clocks latency!!! | 283 | MOV_FROM_ITC(p8, p6, r2, r10) // CPU_TIMER. 36 clocks latency!!! |
| 283 | (p9) ld8 r2 = [r30] // MMIO_TIMER. Could also have latency issues.. | 284 | (p9) ld8 r2 = [r30] // MMIO_TIMER. Could also have latency issues.. |
| 284 | (p13) ld8 r25 = [r19] // get itc_lastcycle value | 285 | (p13) ld8 r25 = [r19] // get itc_lastcycle value |
| 285 | ld8 r9 = [r22],IA64_TIMESPEC_TV_NSEC_OFFSET // tv_sec | 286 | ld8 r9 = [r22],IA64_TIMESPEC_TV_NSEC_OFFSET // tv_sec |
| @@ -418,7 +419,7 @@ EX(.fail_efault, ld8 r14=[r33]) // r14 <- *set | |||
| 418 | mov r17=(1 << (SIGKILL - 1)) | (1 << (SIGSTOP - 1)) | 419 | mov r17=(1 << (SIGKILL - 1)) | (1 << (SIGSTOP - 1)) |
| 419 | ;; | 420 | ;; |
| 420 | 421 | ||
| 421 | rsm psr.i // mask interrupt delivery | 422 | RSM_PSR_I(p0, r18, r19) // mask interrupt delivery |
| 422 | mov ar.ccv=0 | 423 | mov ar.ccv=0 |
| 423 | andcm r14=r14,r17 // filter out SIGKILL & SIGSTOP | 424 | andcm r14=r14,r17 // filter out SIGKILL & SIGSTOP |
| 424 | 425 | ||
| @@ -491,7 +492,7 @@ EX(.fail_efault, ld8 r14=[r33]) // r14 <- *set | |||
| 491 | #ifdef CONFIG_SMP | 492 | #ifdef CONFIG_SMP |
| 492 | st4.rel [r31]=r0 // release the lock | 493 | st4.rel [r31]=r0 // release the lock |
| 493 | #endif | 494 | #endif |
| 494 | ssm psr.i | 495 | SSM_PSR_I(p0, p9, r31) |
| 495 | ;; | 496 | ;; |
| 496 | 497 | ||
| 497 | srlz.d // ensure psr.i is set again | 498 | srlz.d // ensure psr.i is set again |
| @@ -513,7 +514,7 @@ EX(.fail_efault, (p15) st8 [r34]=r3) | |||
| 513 | #ifdef CONFIG_SMP | 514 | #ifdef CONFIG_SMP |
| 514 | st4.rel [r31]=r0 // release the lock | 515 | st4.rel [r31]=r0 // release the lock |
| 515 | #endif | 516 | #endif |
| 516 | ssm psr.i | 517 | SSM_PSR_I(p0, p9, r17) |
| 517 | ;; | 518 | ;; |
| 518 | srlz.d | 519 | srlz.d |
| 519 | br.sptk.many fsys_fallback_syscall // with signal pending, do the heavy-weight syscall | 520 | br.sptk.many fsys_fallback_syscall // with signal pending, do the heavy-weight syscall |
| @@ -521,7 +522,7 @@ EX(.fail_efault, (p15) st8 [r34]=r3) | |||
| 521 | #ifdef CONFIG_SMP | 522 | #ifdef CONFIG_SMP |
| 522 | .lock_contention: | 523 | .lock_contention: |
| 523 | /* Rather than spinning here, fall back on doing a heavy-weight syscall. */ | 524 | /* Rather than spinning here, fall back on doing a heavy-weight syscall. */ |
| 524 | ssm psr.i | 525 | SSM_PSR_I(p0, p9, r17) |
| 525 | ;; | 526 | ;; |
| 526 | srlz.d | 527 | srlz.d |
| 527 | br.sptk.many fsys_fallback_syscall | 528 | br.sptk.many fsys_fallback_syscall |
| @@ -592,17 +593,17 @@ ENTRY(fsys_fallback_syscall) | |||
| 592 | adds r17=-1024,r15 | 593 | adds r17=-1024,r15 |
| 593 | movl r14=sys_call_table | 594 | movl r14=sys_call_table |
| 594 | ;; | 595 | ;; |
| 595 | rsm psr.i | 596 | RSM_PSR_I(p0, r26, r27) |
| 596 | shladd r18=r17,3,r14 | 597 | shladd r18=r17,3,r14 |
| 597 | ;; | 598 | ;; |
| 598 | ld8 r18=[r18] // load normal (heavy-weight) syscall entry-point | 599 | ld8 r18=[r18] // load normal (heavy-weight) syscall entry-point |
| 599 | mov r29=psr // read psr (12 cyc load latency) | 600 | MOV_FROM_PSR(p0, r29, r26) // read psr (12 cyc load latency) |
| 600 | mov r27=ar.rsc | 601 | mov r27=ar.rsc |
| 601 | mov r21=ar.fpsr | 602 | mov r21=ar.fpsr |
| 602 | mov r26=ar.pfs | 603 | mov r26=ar.pfs |
| 603 | END(fsys_fallback_syscall) | 604 | END(fsys_fallback_syscall) |
| 604 | /* FALL THROUGH */ | 605 | /* FALL THROUGH */ |
| 605 | GLOBAL_ENTRY(fsys_bubble_down) | 606 | GLOBAL_ENTRY(paravirt_fsys_bubble_down) |
| 606 | .prologue | 607 | .prologue |
| 607 | .altrp b6 | 608 | .altrp b6 |
| 608 | .body | 609 | .body |
| @@ -640,7 +641,7 @@ GLOBAL_ENTRY(fsys_bubble_down) | |||
| 640 | * | 641 | * |
| 641 | * PSR.BE : already is turned off in __kernel_syscall_via_epc() | 642 | * PSR.BE : already is turned off in __kernel_syscall_via_epc() |
| 642 | * PSR.AC : don't care (kernel normally turns PSR.AC on) | 643 | * PSR.AC : don't care (kernel normally turns PSR.AC on) |
| 643 | * PSR.I : already turned off by the time fsys_bubble_down gets | 644 | * PSR.I : already turned off by the time paravirt_fsys_bubble_down gets |
| 644 | * invoked | 645 | * invoked |
| 645 | * PSR.DFL: always 0 (kernel never turns it on) | 646 | * PSR.DFL: always 0 (kernel never turns it on) |
| 646 | * PSR.DFH: don't care --- kernel never touches f32-f127 on its own | 647 | * PSR.DFH: don't care --- kernel never touches f32-f127 on its own |
| @@ -650,7 +651,7 @@ GLOBAL_ENTRY(fsys_bubble_down) | |||
| 650 | * PSR.DB : don't care --- kernel never enables kernel-level | 651 | * PSR.DB : don't care --- kernel never enables kernel-level |
| 651 | * breakpoints | 652 | * breakpoints |
| 652 | * PSR.TB : must be 0 already; if it wasn't zero on entry to | 653 | * PSR.TB : must be 0 already; if it wasn't zero on entry to |
| 653 | * __kernel_syscall_via_epc, the branch to fsys_bubble_down | 654 | * __kernel_syscall_via_epc, the branch to paravirt_fsys_bubble_down |
| 654 | * will trigger a taken branch; the taken-trap-handler then | 655 | * will trigger a taken branch; the taken-trap-handler then |
| 655 | * converts the syscall into a break-based system-call. | 656 | * converts the syscall into a break-based system-call. |
| 656 | */ | 657 | */ |
| @@ -683,7 +684,7 @@ GLOBAL_ENTRY(fsys_bubble_down) | |||
| 683 | ;; | 684 | ;; |
| 684 | mov ar.rsc=0 // M2 set enforced lazy mode, pl 0, LE, loadrs=0 | 685 | mov ar.rsc=0 // M2 set enforced lazy mode, pl 0, LE, loadrs=0 |
| 685 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 686 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
| 686 | mov.m r30=ar.itc // M get cycle for accounting | 687 | MOV_FROM_ITC(p0, p6, r30, r23) // M get cycle for accounting |
| 687 | #else | 688 | #else |
| 688 | nop.m 0 | 689 | nop.m 0 |
| 689 | #endif | 690 | #endif |
| @@ -734,21 +735,21 @@ GLOBAL_ENTRY(fsys_bubble_down) | |||
| 734 | mov rp=r14 // I0 set the real return addr | 735 | mov rp=r14 // I0 set the real return addr |
| 735 | and r3=_TIF_SYSCALL_TRACEAUDIT,r3 // A | 736 | and r3=_TIF_SYSCALL_TRACEAUDIT,r3 // A |
| 736 | ;; | 737 | ;; |
| 737 | ssm psr.i // M2 we're on kernel stacks now, reenable irqs | 738 | SSM_PSR_I(p0, p6, r22) // M2 we're on kernel stacks now, reenable irqs |
| 738 | cmp.eq p8,p0=r3,r0 // A | 739 | cmp.eq p8,p0=r3,r0 // A |
| 739 | (p10) br.cond.spnt.many ia64_ret_from_syscall // B return if bad call-frame or r15 is a NaT | 740 | (p10) br.cond.spnt.many ia64_ret_from_syscall // B return if bad call-frame or r15 is a NaT |
| 740 | 741 | ||
| 741 | nop.m 0 | 742 | nop.m 0 |
| 742 | (p8) br.call.sptk.many b6=b6 // B (ignore return address) | 743 | (p8) br.call.sptk.many b6=b6 // B (ignore return address) |
| 743 | br.cond.spnt ia64_trace_syscall // B | 744 | br.cond.spnt ia64_trace_syscall // B |
| 744 | END(fsys_bubble_down) | 745 | END(paravirt_fsys_bubble_down) |
| 745 | 746 | ||
| 746 | .rodata | 747 | .rodata |
| 747 | .align 8 | 748 | .align 8 |
| 748 | .globl fsyscall_table | 749 | .globl paravirt_fsyscall_table |
| 749 | 750 | ||
| 750 | data8 fsys_bubble_down | 751 | data8 paravirt_fsys_bubble_down |
| 751 | fsyscall_table: | 752 | paravirt_fsyscall_table: |
| 752 | data8 fsys_ni_syscall | 753 | data8 fsys_ni_syscall |
| 753 | data8 0 // exit // 1025 | 754 | data8 0 // exit // 1025 |
| 754 | data8 0 // read | 755 | data8 0 // read |
| @@ -1033,4 +1034,4 @@ fsyscall_table: | |||
| 1033 | 1034 | ||
| 1034 | // fill in zeros for the remaining entries | 1035 | // fill in zeros for the remaining entries |
| 1035 | .zero: | 1036 | .zero: |
| 1036 | .space fsyscall_table + 8*NR_syscalls - .zero, 0 | 1037 | .space paravirt_fsyscall_table + 8*NR_syscalls - .zero, 0 |
