|
Lines 647-673
ENTRY(break_fault)
Link Here
|
| 647 |
SAVE_REST |
647 |
SAVE_REST |
| 648 |
br.call.sptk.many rp=demine_args // clear NaT bits in (potential) syscall args |
648 |
br.call.sptk.many rp=demine_args // clear NaT bits in (potential) syscall args |
| 649 |
|
649 |
|
|
|
650 |
// demine_args exits with r2 containing the frame marker when the syscall was issued. |
| 651 |
and r18=0x7f,r2 // get sof of issuer's cfm |
| 652 |
extr.u r17=r2,7,7 // get sol of issuer's cfm |
| 653 |
|
| 650 |
mov r3=255 |
654 |
mov r3=255 |
| 651 |
adds r15=-1024,r15 // r15 contains the syscall number---subtract 1024 |
655 |
adds r15=-1024,r15 // r15 contains the syscall number---subtract 1024 |
| 652 |
adds r2=IA64_TASK_PTRACE_OFFSET,r13 // r2 = ¤t->ptrace |
656 |
adds r2=IA64_TASK_PTRACE_OFFSET,r13 // r2 = ¤t->ptrace |
| 653 |
;; |
657 |
;; |
|
|
658 |
add r17=8,r17 // sol + 8 |
| 654 |
cmp.geu p6,p7=r3,r15 // (syscall > 0 && syscall <= 1024+255) ? |
659 |
cmp.geu p6,p7=r3,r15 // (syscall > 0 && syscall <= 1024+255) ? |
| 655 |
movl r16=sys_call_table |
660 |
movl r16=sys_call_table |
| 656 |
;; |
661 |
;; |
|
|
662 |
(p6) cmp.lt p7,p6=r17,r18 // frame size can't be more than local+8 |
| 663 |
;; |
| 657 |
(p6) shladd r16=r15,3,r16 |
664 |
(p6) shladd r16=r15,3,r16 |
| 658 |
movl r15=ia64_ret_from_syscall |
|
|
| 659 |
(p7) adds r16=(__NR_ni_syscall-1024)*8,r16 // force __NR_ni_syscall |
665 |
(p7) adds r16=(__NR_ni_syscall-1024)*8,r16 // force __NR_ni_syscall |
|
|
666 |
ld8 r2=[r2] // r2 = current->ptrace |
| 667 |
movl r15=ia64_ret_from_syscall |
| 660 |
;; |
668 |
;; |
| 661 |
ld8 r16=[r16] // load address of syscall entry point |
669 |
ld8 r16=[r16] // load address of syscall entry point |
| 662 |
mov rp=r15 // set the real return addr |
670 |
mov rp=r15 // set the real return addr |
| 663 |
;; |
|
|
| 664 |
ld8 r2=[r2] // r2 = current->ptrace |
| 665 |
mov r19=PT_TRACEAUDITMASK // r19 = PT_TRACESYS|PT_AUDITED |
671 |
mov r19=PT_TRACEAUDITMASK // r19 = PT_TRACESYS|PT_AUDITED |
| 666 |
mov b6=r16 |
672 |
;; |
| 667 |
|
673 |
|
| 668 |
// arrange things so we skip over break instruction when returning: |
674 |
// arrange things so we skip over break instruction when returning: |
| 669 |
|
675 |
|
| 670 |
adds r16=16,sp // get pointer to cr_ipsr |
676 |
adds r16=16,sp // get pointer to cr_ipsr |
|
|
677 |
mov b6=r16 |
| 671 |
adds r17=24,sp // get pointer to cr_iip |
678 |
adds r17=24,sp // get pointer to cr_iip |
| 672 |
;; |
679 |
;; |
| 673 |
ld8 r18=[r16] // fetch cr_ipsr |
680 |
ld8 r18=[r16] // fetch cr_ipsr |
|
Lines 693-698
ENTRY(break_fault)
Link Here
|
| 693 |
// NOT REACHED |
700 |
// NOT REACHED |
| 694 |
END(break_fault) |
701 |
END(break_fault) |
| 695 |
|
702 |
|
|
|
703 |
// Ensure that the syscall arguments plus r15 (syscall number) are valid. |
| 704 |
// Exit with r2 containing the frame size when the syscall was issued. |
| 696 |
ENTRY(demine_args) |
705 |
ENTRY(demine_args) |
| 697 |
alloc r2=ar.pfs,8,0,0,0 |
706 |
alloc r2=ar.pfs,8,0,0,0 |
| 698 |
tnat.nz p8,p0=in0 |
707 |
tnat.nz p8,p0=in0 |