diff options
| -rw-r--r-- | arch/ia64/kernel/entry.S | 79 |
1 files changed, 39 insertions, 40 deletions
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index d97a07c77a43..a7542c3d3b3c 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
| @@ -625,7 +625,7 @@ END(ia64_ret_from_syscall) | |||
| 625 | * r8-r11: restored (syscall return value(s)) | 625 | * r8-r11: restored (syscall return value(s)) |
| 626 | * r12: restored (user-level stack pointer) | 626 | * r12: restored (user-level stack pointer) |
| 627 | * r13: restored (user-level thread pointer) | 627 | * r13: restored (user-level thread pointer) |
| 628 | * r14: cleared | 628 | * r14: set to __kernel_syscall_via_epc |
| 629 | * r15: restored (syscall #) | 629 | * r15: restored (syscall #) |
| 630 | * r16-r17: cleared | 630 | * r16-r17: cleared |
| 631 | * r18: user-level b6 | 631 | * r18: user-level b6 |
| @@ -646,7 +646,7 @@ END(ia64_ret_from_syscall) | |||
| 646 | * pr: restored (user-level pr) | 646 | * pr: restored (user-level pr) |
| 647 | * b0: restored (user-level rp) | 647 | * b0: restored (user-level rp) |
| 648 | * b6: restored | 648 | * b6: restored |
| 649 | * b7: cleared | 649 | * b7: set to __kernel_syscall_via_epc |
| 650 | * ar.unat: restored (user-level ar.unat) | 650 | * ar.unat: restored (user-level ar.unat) |
| 651 | * ar.pfs: restored (user-level ar.pfs) | 651 | * ar.pfs: restored (user-level ar.pfs) |
| 652 | * ar.rsc: restored (user-level ar.rsc) | 652 | * ar.rsc: restored (user-level ar.rsc) |
| @@ -708,63 +708,63 @@ ENTRY(ia64_leave_syscall) | |||
| 708 | (pNonSys) break 0 // bug check: we shouldn't be here if pNonSys is TRUE! | 708 | (pNonSys) break 0 // bug check: we shouldn't be here if pNonSys is TRUE! |
| 709 | ;; | 709 | ;; |
| 710 | invala // M0|1 invalidate ALAT | 710 | invala // M0|1 invalidate ALAT |
| 711 | rsm psr.i | psr.ic // M2 initiate turning off of interrupt and interruption collection | 711 | rsm psr.i | psr.ic // M2 turn off interrupts and interruption collection |
| 712 | cmp.eq p9,p0=r0,r0 // set p9 to indicate that we should restore cr.ifs | 712 | cmp.eq p9,p0=r0,r0 // A set p9 to indicate that we should restore cr.ifs |
| 713 | 713 | ||
| 714 | ld8 r29=[r2],16 // load cr.ipsr | 714 | ld8 r29=[r2],16 // M0|1 load cr.ipsr |
| 715 | ld8 r28=[r3],16 // load cr.iip | 715 | ld8 r28=[r3],16 // M0|1 load cr.iip |
| 716 | mov r22=r0 // clear r22 | 716 | mov r22=r0 // A clear r22 |
| 717 | ;; | 717 | ;; |
| 718 | ld8 r30=[r2],16 // M0|1 load cr.ifs | 718 | ld8 r30=[r2],16 // M0|1 load cr.ifs |
| 719 | ld8 r25=[r3],16 // M0|1 load ar.unat | 719 | ld8 r25=[r3],16 // M0|1 load ar.unat |
| 720 | (pUStk) add r14=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13 | 720 | (pUStk) add r14=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13 |
| 721 | ;; | 721 | ;; |
| 722 | ld8 r26=[r2],PT(B0)-PT(AR_PFS) // M0|1 load ar.pfs | 722 | ld8 r26=[r2],PT(B0)-PT(AR_PFS) // M0|1 load ar.pfs |
| 723 | (pKStk) mov r22=psr // M2 read PSR now that interrupts are disabled | 723 | (pKStk) mov r22=psr // M2 read PSR now that interrupts are disabled |
| 724 | nop 0 | 724 | nop 0 |
| 725 | ;; | 725 | ;; |
| 726 | ld8 r21=[r2],PT(AR_RNAT)-PT(B0) // load b0 | 726 | ld8 r21=[r2],PT(AR_RNAT)-PT(B0) // M0|1 load b0 |
| 727 | ld8 r27=[r3],PT(PR)-PT(AR_RSC) // load ar.rsc | 727 | ld8 r27=[r3],PT(PR)-PT(AR_RSC) // M0|1 load ar.rsc |
| 728 | mov f6=f0 // clear f6 | 728 | mov f6=f0 // F clear f6 |
| 729 | ;; | 729 | ;; |
| 730 | ld8 r24=[r2],PT(AR_FPSR)-PT(AR_RNAT) // load ar.rnat (may be garbage) | 730 | ld8 r24=[r2],PT(AR_FPSR)-PT(AR_RNAT) // M0|1 load ar.rnat (may be garbage) |
| 731 | ld8 r31=[r3],PT(R1)-PT(PR) // load predicates | 731 | ld8 r31=[r3],PT(R1)-PT(PR) // M0|1 load predicates |
| 732 | mov f7=f0 // clear f7 | 732 | mov f7=f0 // F clear f7 |
| 733 | ;; | 733 | ;; |
| 734 | ld8 r20=[r2],PT(R12)-PT(AR_FPSR) // load ar.fpsr | 734 | ld8 r20=[r2],PT(R12)-PT(AR_FPSR) // M0|1 load ar.fpsr |
| 735 | ld8.fill r1=[r3],16 // load r1 | 735 | ld8.fill r1=[r3],16 // M0|1 load r1 |
| 736 | (pUStk) mov r17=1 | 736 | (pUStk) mov r17=1 // A |
| 737 | ;; | 737 | ;; |
| 738 | (pUStk) st1 [r14]=r17 | 738 | (pUStk) st1 [r14]=r17 // M2|3 |
| 739 | ld8.fill r13=[r3],16 | 739 | ld8.fill r13=[r3],16 // M0|1 |
| 740 | mov f8=f0 // clear f8 | 740 | mov f8=f0 // F clear f8 |
| 741 | ;; | 741 | ;; |
| 742 | ld8.fill r12=[r2] // restore r12 (sp) | 742 | ld8.fill r12=[r2] // M0|1 restore r12 (sp) |
| 743 | ld8.fill r15=[r3] // restore r15 | 743 | ld8.fill r15=[r3] // M0|1 restore r15 |
| 744 | mov b6=r18 // I0 restore b6 | 744 | mov b6=r18 // I0 restore b6 |
| 745 | 745 | ||
| 746 | addl r17=THIS_CPU(ia64_phys_stacked_size_p8),r0 | 746 | addl r17=THIS_CPU(ia64_phys_stacked_size_p8),r0 // A |
| 747 | mov f9=f0 // clear f9 | 747 | mov f9=f0 // F clear f9 |
| 748 | (pKStk) br.cond.dpnt.many skip_rbs_switch | 748 | (pKStk) br.cond.dpnt.many skip_rbs_switch // B |
| 749 | 749 | ||
| 750 | srlz.d // M0 ensure interruption collection is off | 750 | srlz.d // M0 ensure interruption collection is off (for cover) |
| 751 | shr.u r18=r19,16 // I0|1 get byte size of existing "dirty" partition | 751 | shr.u r18=r19,16 // I0|1 get byte size of existing "dirty" partition |
| 752 | cover // B add current frame into dirty partition and set cr.ifs | 752 | cover // B add current frame into dirty partition & set cr.ifs |
| 753 | ;; | 753 | ;; |
| 754 | (pUStk) ld4 r17=[r17] // r17 = cpu_data->phys_stacked_size_p8 | 754 | (pUStk) ld4 r17=[r17] // M0|1 r17 = cpu_data->phys_stacked_size_p8 |
| 755 | mov r19=ar.bsp // M2 get new backing store pointer | 755 | mov r19=ar.bsp // M2 get new backing store pointer |
| 756 | mov f10=f0 // clear f10 | 756 | mov f10=f0 // F clear f10 |
| 757 | 757 | ||
| 758 | nop.m 0 | 758 | nop.m 0 |
| 759 | movl r14=__kernel_syscall_via_epc // X | 759 | movl r14=__kernel_syscall_via_epc // X |
| 760 | ;; | 760 | ;; |
| 761 | mov.m ar.csd=r0 // M2 clear ar.csd | 761 | mov.m ar.csd=r0 // M2 clear ar.csd |
| 762 | mov.m ar.ccv=r0 // clear ar.ccv | 762 | mov.m ar.ccv=r0 // M2 clear ar.ccv |
| 763 | mov b7=r14 // I0 clear b7 (hint with __kernel_syscall_via_epc) | 763 | mov b7=r14 // I0 clear b7 (hint with __kernel_syscall_via_epc) |
| 764 | 764 | ||
| 765 | mov.m ar.ssd=r0 // M2 clear ar.ssd | 765 | mov.m ar.ssd=r0 // M2 clear ar.ssd |
| 766 | mov f11=f0 // clear f11 | 766 | mov f11=f0 // F clear f11 |
| 767 | br.cond.sptk.many rbs_switch | 767 | br.cond.sptk.many rbs_switch // B |
| 768 | END(ia64_leave_syscall) | 768 | END(ia64_leave_syscall) |
| 769 | 769 | ||
| 770 | #ifdef CONFIG_IA32_SUPPORT | 770 | #ifdef CONFIG_IA32_SUPPORT |
| @@ -940,7 +940,6 @@ GLOBAL_ENTRY(ia64_leave_kernel) | |||
| 940 | * NOTE: alloc, loadrs, and cover can't be predicated. | 940 | * NOTE: alloc, loadrs, and cover can't be predicated. |
| 941 | */ | 941 | */ |
| 942 | (pNonSys) br.cond.dpnt dont_preserve_current_frame | 942 | (pNonSys) br.cond.dpnt dont_preserve_current_frame |
| 943 | |||
| 944 | cover // add current frame into dirty partition and set cr.ifs | 943 | cover // add current frame into dirty partition and set cr.ifs |
| 945 | ;; | 944 | ;; |
| 946 | mov r19=ar.bsp // get new backing store pointer | 945 | mov r19=ar.bsp // get new backing store pointer |
