|
Lines 44-49
Link Here
|
| 44 |
#include <asm/ptrace.h> |
44 |
#include <asm/ptrace.h> |
| 45 |
#include <asm/system.h> |
45 |
#include <asm/system.h> |
| 46 |
#include <asm/unistd.h> |
46 |
#include <asm/unistd.h> |
|
|
47 |
#include <asm/errno.h> |
| 47 |
|
48 |
|
| 48 |
#if 1 |
49 |
#if 1 |
| 49 |
# define PSR_DEFAULT_BITS psr.ac |
50 |
# define PSR_DEFAULT_BITS psr.ac |
|
Lines 658-669
ENTRY(break_fault)
Link Here
|
| 658 |
movl r15=ia64_ret_from_syscall |
659 |
movl r15=ia64_ret_from_syscall |
| 659 |
(p7) adds r16=(__NR_ni_syscall-1024)*8,r16 // force __NR_ni_syscall |
660 |
(p7) adds r16=(__NR_ni_syscall-1024)*8,r16 // force __NR_ni_syscall |
| 660 |
;; |
661 |
;; |
| 661 |
ld8 r16=[r16] // load address of syscall entry point |
662 |
(p9) ld8 r16=[r16] // load address of syscall entry point |
| 662 |
mov rp=r15 // set the real return addr |
663 |
mov rp=r15 // set the real return addr |
| 663 |
;; |
664 |
;; |
| 664 |
ld8 r2=[r2] // r2 = current->ptrace |
665 |
ld8 r2=[r2] // r2 = current->ptrace |
| 665 |
mov r19=PT_TRACEAUDITMASK // r19 = PT_TRACESYS|PT_AUDITED |
666 |
mov r19=PT_TRACEAUDITMASK // r19 = PT_TRACESYS|PT_AUDITED |
| 666 |
mov b6=r16 |
667 |
(p9) mov b6=r16 |
| 667 |
|
668 |
|
| 668 |
// arrange things so we skip over break instruction when returning: |
669 |
// arrange things so we skip over break instruction when returning: |
| 669 |
|
670 |
|
|
Lines 687-727
ENTRY(break_fault)
Link Here
|
| 687 |
dep r18=r20,r18,41,2 // insert new ei into cr.isr |
688 |
dep r18=r20,r18,41,2 // insert new ei into cr.isr |
| 688 |
;; |
689 |
;; |
| 689 |
st8 [r16]=r18 // store new value for cr.isr |
690 |
st8 [r16]=r18 // store new value for cr.isr |
| 690 |
|
691 |
(p10) br.cond.spnt.many ia64_ret_from_syscall |
| 691 |
(p8) br.call.sptk.many b6=b6 // ignore this return addr |
692 |
(p8) br.call.sptk.many b6=b6 // ignore this return addr |
| 692 |
br.cond.sptk ia64_trace_syscall |
693 |
br.cond.sptk ia64_trace_syscall |
| 693 |
// NOT REACHED |
694 |
// NOT REACHED |
| 694 |
END(break_fault) |
695 |
END(break_fault) |
| 695 |
|
696 |
|
| 696 |
ENTRY(demine_args) |
|
|
| 697 |
alloc r2=ar.pfs,8,0,0,0 |
| 698 |
tnat.nz p8,p0=in0 |
| 699 |
tnat.nz p9,p0=in1 |
| 700 |
;; |
| 701 |
(p8) mov in0=-1 |
| 702 |
tnat.nz p10,p0=in2 |
| 703 |
tnat.nz p11,p0=in3 |
| 704 |
|
| 705 |
(p9) mov in1=-1 |
| 706 |
tnat.nz p12,p0=in4 |
| 707 |
tnat.nz p13,p0=in5 |
| 708 |
;; |
| 709 |
(p10) mov in2=-1 |
| 710 |
tnat.nz p14,p0=in6 |
| 711 |
tnat.nz p15,p0=in7 |
| 712 |
|
| 713 |
(p11) mov in3=-1 |
| 714 |
tnat.nz p8,p0=r15 // demining r15 is not a must, but it is safer |
| 715 |
|
| 716 |
(p12) mov in4=-1 |
| 717 |
(p13) mov in5=-1 |
| 718 |
;; |
| 719 |
(p14) mov in6=-1 |
| 720 |
(p15) mov in7=-1 |
| 721 |
(p8) mov r15=-1 |
| 722 |
br.ret.sptk.many rp |
| 723 |
END(demine_args) |
| 724 |
|
| 725 |
.align 1024 |
697 |
.align 1024 |
| 726 |
///////////////////////////////////////////////////////////////////////////////////////// |
698 |
///////////////////////////////////////////////////////////////////////////////////////// |
| 727 |
// 0x3000 Entry 12 (size 64 bundles) External Interrupt (4) |
699 |
// 0x3000 Entry 12 (size 64 bundles) External Interrupt (4) |
|
Lines 755-760
END(interrupt)
Link Here
|
| 755 |
DBG_FAULT(13) |
727 |
DBG_FAULT(13) |
| 756 |
FAULT(13) |
728 |
FAULT(13) |
| 757 |
|
729 |
|
|
|
730 |
// Ensure that the syscall arguments plus r15 (syscall number) are valid. |
| 731 |
// Exit with r2 containing the frame size when the syscall was issued. |
| 732 |
// This function belongs to break_fault and can live anywhere (even outside |
| 733 |
// the IVT); it's being placed here just to save a little space. |
| 734 |
// On exit: |
| 735 |
// - p10: TRUE if syscall is invoked with more than 8 out |
| 736 |
// Registers or r15's Nat is true |
| 737 |
// - p9: !(p10) |
| 738 |
ENTRY(demine_args) |
| 739 |
alloc r2=ar.pfs,8,0,0,0 |
| 740 |
tnat.nz p8,p0=in0 |
| 741 |
tnat.nz p9,p0=in1 |
| 742 |
;; |
| 743 |
and r18=0x7f,r2 // get sof of issuer's cfm |
| 744 |
extr.u r17=r2,7,7 // get sol of issuer's cfm |
| 745 |
tnat.nz p10,p0=in2 |
| 746 |
(p8) mov in0=-1 |
| 747 |
tnat.nz p11,p0=in3 |
| 748 |
tnat.nz p12,p0=in4 |
| 749 |
;; |
| 750 |
(p9) mov in1=-1 |
| 751 |
tnat.nz p13,p0=in5 |
| 752 |
add r17=8,r17 // sol + 8 |
| 753 |
(p10) mov in2=-1 |
| 754 |
tnat.nz p14,p0=in6 |
| 755 |
tnat.nz p15,p0=in7 |
| 756 |
;; |
| 757 |
cmp.lt p10,p9=r17,r18 // frame size can't be more than local+8 |
| 758 |
(p11) mov in3=-1 |
| 759 |
(p12) mov in4=-1 |
| 760 |
;; |
| 761 |
(p13) mov in5=-1 |
| 762 |
(p9) tnat.nz p10,p9=r15 // demining r15 is not a must, but it is safer |
| 763 |
(p14) mov in6=-1 |
| 764 |
;; |
| 765 |
(p15) mov in7=-1 |
| 766 |
(p10) mov r8=-EINVAL |
| 767 |
br.ret.sptk.many rp |
| 768 |
END(demine_args) |
| 769 |
|
| 758 |
.align 1024 |
770 |
.align 1024 |
| 759 |
///////////////////////////////////////////////////////////////////////////////////////// |
771 |
///////////////////////////////////////////////////////////////////////////////////////// |
| 760 |
// 0x3800 Entry 14 (size 64 bundles) Reserved |
772 |
// 0x3800 Entry 14 (size 64 bundles) Reserved |