summaryrefslogtreecommitdiff
path: root/macho/ptrace.a
diff options
context:
space:
mode:
Diffstat (limited to 'macho/ptrace.a')
-rw-r--r--macho/ptrace.a739
1 files changed, 739 insertions, 0 deletions
diff --git a/macho/ptrace.a b/macho/ptrace.a
new file mode 100644
index 0000000..05de0e3
--- /dev/null
+++ b/macho/ptrace.a
@@ -0,0 +1,739 @@
+
+.macro lea_ &r,&a
+ lis $0,ha16($1)
+ addi $0,$0,lo16($1)
+.endmacro
+
+MACOSX = 1
+USE_TEMPORARY_MEMORY = 1
+CHECK_STACK_OVERFLOWS = 0
+MODULE_NAMES = 1
+
+#define sp r1
+
+#define d0 r24
+#define d1 r25
+#define d2 r26
+#define d3 r27
+#define d4 r28
+#define d5 r29
+#define d6 r30
+#define d7 r31
+
+#define a0 r23
+#define a1 r22
+#define a2 r21
+#define a3 r20
+#define a4 r19
+#define a5 r18
+#define a6 r17
+
+#define o0 r3
+#define o1 r4
+#define o2 r5
+#define o3 r6
+#define o4 r7
+#define o5 r8
+
+#define g2 r9
+#define g3 r10
+
+#define g0 r11
+#define g1 r12
+
+#define int_reg r16
+#define char_reg r15
+#define real_reg r14
+#define bool_reg r13
+
+ .globl init_profiler
+ .globl profile_r
+ .globl profile_l
+ .globl profile_l2
+ .globl profile_n
+ .globl profile_n2
+ .globl profile_s
+ .globl profile_s2
+ .globl profile_t
+ .globl profile_ti
+ .globl write_profile_information
+ .globl write_profile_stack
+
+ .if USE_TEMPORARY_MEMORY
+ .globl _TempNewHandle
+ .globl _TempHLock
+ .globl _TempHUnlock
+ .globl _TempDisposeHandle
+ .else
+ .globl _NewPtr
+ .endif
+ .globl __STRING__
+ .globl writeFC
+ .globl writeFI
+ .globl print_error
+ .globl _stack_size
+ .globl _er_print_string
+ .globl _er_print_char
+ .if CHECK_STACK_OVERFLOWS
+ .globl _Debugger
+ .endif
+
+#define FunctionProfile_next 0
+#define FunctionProfile_name 4
+
+#define FunctionProfile 8
+
+#define Globals_n_free_records_in_block 0
+ # comment 0 n free records in block
+#define Globals_last_allocated_block 4
+ # comment 4 latest allocated block
+#define Globals_profile_records 8
+ # comment 8 profile record list
+#define Globals_stack_pointer 12
+ # comment 12 stack pointer
+#define Globals_n_words_free 16
+ .if USE_TEMPORARY_MEMORY
+#define Globals_temp_handle_list 20
+#define Globals_profile_stack_handle 24
+ .if CHECK_STACK_OVERFLOWS
+Globals_end_profile_stack = 28
+Globals = 32
+ .else
+Globals = 28
+ .endif
+ .else
+ .if CHECK_STACK_OVERFLOWS
+Globals_end_profile_stack = 20
+Globals = 24
+ .else
+Globals = 20
+ .endif
+ .endif
+
+ .text
+profile_ti:
+ lea_ r5,profile_globals
+ b profile_t_
+
+profile_t:
+ mflr r12
+ lea_ r5,profile_globals
+ mtctr r12
+ mtlr r0
+profile_t_:
+ lwz r6,Globals_stack_pointer(r5)
+ lwzu r4,-4(r6)
+ stw r6,Globals_stack_pointer(r5)
+ bctr
+
+profile_r:
+ lea_ r5,profile_globals
+ lwz r6,Globals_stack_pointer(r5)
+ lwzu r4,-4(r6)
+ stw r6,Globals_stack_pointer(r5)
+ blr
+
+profile_l:
+ mflr r12
+ lea_ r5,profile_globals
+ lwz r4,0(r3)
+ mtctr r12
+
+ cmpwi 0,r4,0
+ beql allocate_function_profile_record
+
+ lwz r6,Globals_stack_pointer(r5)
+ stw r4,0(r6)
+ addi r6,r6,4
+ .if CHECK_STACK_OVERFLOWS
+ lwz r12,Globals_end_profile_stack(r5)
+ .endif
+ stw r6,Globals_stack_pointer(r5)
+ .if CHECK_STACK_OVERFLOWS
+ cmpw r6,r12
+ bge profile_stack_overflow
+ .endif
+ mtlr r0
+ bctr
+
+profile_l2:
+ mflr r12
+ lea_ r5,profile_globals
+ lwz r4,0(r3)
+ mtctr r12
+
+ cmpwi 0,r4,0
+ beql allocate_function_profile_record
+
+ lwz r6,Globals_stack_pointer(r5)
+ stw r4,0(r6)
+ stw r4,4(r6)
+ addi r6,r6,8
+ .if CHECK_STACK_OVERFLOWS
+ lwz r12,Globals_end_profile_stack(r5)
+ .endif
+ stw r6,Globals_stack_pointer(r5)
+ .if CHECK_STACK_OVERFLOWS
+ cmpw r6,r12
+ bge profile_stack_overflow
+ .endif
+
+ mtlr r0
+ bctr
+
+profile_n:
+ mflr r12
+ lea_ r5,profile_globals
+ lwz r4,0(r3)
+ mtctr r12
+
+ cmpwi 0,r4,0
+ beql allocate_function_profile_record
+
+ lwz r6,Globals_stack_pointer(r5)
+ stw r4,0(r6)
+ addi r6,r6,4
+ .if CHECK_STACK_OVERFLOWS
+ lwz r12,Globals_end_profile_stack(r5)
+ .endif
+ stw r6,Globals_stack_pointer(r5)
+ .if CHECK_STACK_OVERFLOWS
+ cmpw r6,r12
+ bge profile_stack_overflow
+ .endif
+ mtlr r0
+ bctr
+
+profile_n2:
+ mflr r12
+ lea_ r5,profile_globals
+ lwz r4,0(r3)
+ mtctr r12
+
+ cmpwi 0,r4,0
+ beql allocate_function_profile_record
+
+ lwz r6,Globals_stack_pointer(r5)
+ stw r4,0(r6)
+ stw r4,4(r6)
+ addi r6,r6,8
+ .if CHECK_STACK_OVERFLOWS
+ lwz r12,Globals_end_profile_stack(r5)
+ .endif
+ stw r6,Globals_stack_pointer(r5)
+ .if CHECK_STACK_OVERFLOWS
+ cmpw r6,r12
+ bge profile_stack_overflow
+ .endif
+ mtlr r0
+ bctr
+
+profile_s2:
+ mflr r12
+ lea_ r5,profile_globals
+ lwz r4,0(r3)
+ mtctr r12
+
+ cmpwi 0,r4,0
+ beql allocate_function_profile_record
+
+ lwz r6,Globals_stack_pointer(r5)
+ stw r4,0(r6)
+ stw r4,4(r6)
+ addi r6,r6,8
+ .if CHECK_STACK_OVERFLOWS
+ lwz r12,Globals_end_profile_stack(r5)
+ .endif
+ stw r6,Globals_stack_pointer(r5)
+ .if CHECK_STACK_OVERFLOWS
+ cmpw r6,r12
+ bge profile_stack_overflow
+ .endif
+ mtlr r0
+ bctr
+
+profile_s:
+ mflr r12
+ lea_ r5,profile_globals
+ lwz r4,0(r3)
+ mtctr r12
+
+ cmpwi 0,r4,0
+ beql allocate_function_profile_record
+
+ lwz r6,Globals_stack_pointer(r5)
+
+ stw r4,0(r6)
+ addi r6,r6,4
+ .if CHECK_STACK_OVERFLOWS
+ lwz r12,Globals_end_profile_stack(r5)
+ .endif
+ stw r6,Globals_stack_pointer(r5)
+ .if CHECK_STACK_OVERFLOWS
+ cmpw r6,r12
+ bge profile_stack_overflow
+ .endif
+ mtlr r0
+ bctr
+
+allocate_function_profile_record:
+ lwz r6,Globals_n_free_records_in_block(r5)
+ lwz r4,Globals_last_allocated_block(r5)
+ cmpwi 0,r6,0
+ bne+ no_alloc
+
+ stw r0,-4(sp)
+ stw r3,-8(sp)
+ stw r9,-12(sp)
+ stw r10,-16(sp)
+ mfctr r11
+ stw r11,-20(sp)
+ mflr r12
+ stw r12,-24(sp)
+
+ .if USE_TEMPORARY_MEMORY
+ li r3,(512*FunctionProfile)+4
+ .else
+ li r3,512*FunctionProfile
+ .endif
+ .if MACOSX
+ mr g0,sp
+ ori sp,sp,28
+ stwu g0,-(64+32+28)(sp)
+ .else
+ stwu sp,-(64+32)(sp)
+ .endif
+ .if USE_TEMPORARY_MEMORY
+ bl allocate_temp_memory_handle
+ .else
+ bl _NewPtr
+ nop
+ .endif
+ .if MACOSX
+ lwz sp,0(sp)
+ .else
+ addi sp,sp,64+32
+ .endif
+ and. r4,r3,r3
+
+ lwz r12,-24(sp)
+ lwz r11,-20(sp)
+ mtlr r12
+ lwz r10,-16(sp)
+ mtctr r11
+ lwz r9,-12(sp)
+ lwz r3,-8(sp)
+ lwz r0,-4(sp)
+
+ lea_ r5,profile_globals
+
+ beq profiler_memory_error
+
+ .if USE_TEMPORARY_MEMORY
+ lwz r6,Globals_temp_handle_list(r5)
+ stw r4,Globals_temp_handle_list(r5)
+ lwz r4,0(r4)
+ stw r6,0(r4)
+ addi r4,r4,4
+ .endif
+ li r6,512
+ stw r4,Globals_last_allocated_block(r5)
+
+no_alloc:
+ subi r6,r6,1
+ stw r6,Globals_n_free_records_in_block(r5)
+ addi r7,r4,FunctionProfile
+ stw r7,Globals_last_allocated_block(r5)
+
+ lwz r6,Globals_profile_records(r5)
+ li r8,0
+ stw r6,FunctionProfile_next(r4)
+ stw r4,Globals_profile_records(r5)
+ stw r3,FunctionProfile_name(r4)
+
+ stw r4,0(r3)
+ blr
+
+write_profile_information:
+ .if USE_TEMPORARY_MEMORY
+ mflr r0
+ .if MACOSX
+ mr g0,sp
+ ori sp,sp,28
+ stwu g0,-(96+28)(sp)
+ .else
+ stwu sp,-96(sp)
+ .endif
+ stw r0,96-4(sp)
+ lea_ r5,profile_globals
+ lwz r3,Globals_profile_stack_handle(r5)
+ bl free_temp_memory_handle
+
+ lea_ r5,profile_globals
+
+ stw r31,96-8(sp)
+
+ lwz r31,Globals_temp_handle_list(r5)
+ b free_temp_handles
+
+free_temp_handles_lp:
+ mr r3,r31
+ lwz r31,0(r31)
+ lwz r31,0(r31)
+ bl free_temp_memory_handle
+
+free_temp_handles:
+ cmpwi 0,r31,0
+ bne free_temp_handles_lp
+
+ lwz r31,96-8(sp)
+
+ lwz r0,96-4(sp)
+ .if MACOSX
+ lwz sp,0(sp)
+ .else
+ addi sp,sp,96
+ .endif
+ mtlr r0
+ .endif
+ lwz r0,0(sp)
+ addi sp,sp,4
+ blr
+
+write_profile_stack:
+ mflr r0
+ lea_ d0,profile_globals
+ stwu r0,-4(sp)
+ lwz d0,Globals_stack_pointer(d0)
+
+ cmpwi 0,d0,0
+ beq stack_not_initialised
+
+ .if MACOSX
+ mr g0,sp
+ ori sp,sp,28
+ stwu g0,-(64+28)(sp)
+ .else
+ stwu sp,-64(sp)
+ .endif
+ lea_ o0,stack_trace_string
+ bl _er_print_string
+ .if MACOSX
+ lwz sp,0(sp)
+ .else
+ addi sp,sp,64
+ .endif
+
+ li d2,12
+write_functions_on_stack:
+ lwzu d1,-4(d0)
+ cmpwi 0,d1,0
+ beq end_profile_stack
+
+ lwz o0,FunctionProfile_name(d1)
+
+ .if MACOSX
+ mr g0,sp
+ ori sp,sp,28
+ stwu g0,-(64+28)(sp)
+ .else
+ stwu sp,-64(sp)
+ .endif
+ addi o0,o0,4
+ bl _er_print_string
+ li o0,13
+ bl _er_print_char
+ .if MACOSX
+ lwz sp,0(sp)
+ .else
+ addi sp,sp,64
+ .endif
+
+ subic. d2,d2,1
+ .if 0
+ b write_functions_on_stack
+ .else
+ bne write_functions_on_stack
+ .endif
+
+end_profile_stack:
+stack_not_initialised:
+ lwz r0,0(sp)
+ mtlr r0
+ lwz r0,4(sp)
+ addi sp,sp,8
+ blr
+
+init_profiler:
+ .if 0
+ mflr r0
+ stw r0,-4(sp)
+ stwu sp,-64(sp)
+
+ bl .Debugger
+ nop
+
+ lwz r0,64-4(sp)
+ addi sp,sp,64
+ mtlr r0
+ .endif
+
+ mflr r0
+ stwu r0,-4(sp)
+
+ .if 1
+ lea_ r3,_stack_size
+ lwz r3,0(r3)
+ .else
+ li r3, (512*1024) % 65536
+ addis r3,r3,(512*1024) / 65536
+ .endif
+
+ .if MACOSX
+ mr g0,sp
+ ori sp,sp,28
+ stwu g0,-(64+28)(sp)
+ .else
+ stwu sp,-64(sp)
+ .endif
+ .if USE_TEMPORARY_MEMORY
+ bl allocate_temp_memory_handle
+ .else
+ bl _NewPtr
+ nop
+ .endif
+ .if MACOSX
+ lwz sp,0(sp)
+ .else
+ addi sp,sp,64
+ .endif
+ lea_ r5,profile_globals
+
+ and. r9,r3,r3
+ beq init_profiler_error
+
+ .if USE_TEMPORARY_MEMORY
+ stw r9,Globals_profile_stack_handle(r5)
+ lwz r9,0(r9)
+ li r0,0
+ stw r0,Globals_temp_handle_list(r5)
+ .endif
+ .if CHECK_STACK_OVERFLOWS
+ .if 1
+ lea_ r3,_stack_size
+ lwz r3,0(r3)
+ .else
+ li r3, (512*1024) % 65536
+ addis r3,r3,(512*1024) / 65536
+ .endif
+ add r3,r3,r9
+ stw r3,Globals_end_profile_stack(r5)
+ .endif
+ lea_ r3,start_string
+ bl allocate_function_profile_record
+
+ lwz r0,0(sp)
+ addi sp,sp,4
+ mtlr r0
+
+ li r0,0
+ stw r4,4(r9)
+ stw r0,0(r9)
+ addi r9,r9,8
+ stw r9,Globals_stack_pointer(r5)
+ stw d7,Globals_n_words_free(r5)
+
+ lwz r0,0(sp)
+ addi sp,sp,4
+
+ blr
+
+ .if USE_TEMPORARY_MEMORY
+allocate_temp_memory_handle:
+ mflr r0
+ stw r31,-4(sp)
+ stw r0,8(sp)
+ stwu sp,-96(sp)
+
+ addi r4,sp,56
+ bl L_TempNewHandle$stub
+ nop
+
+ mr. r31,r3
+ beq return_r31
+
+ addi r4,sp,56
+ bl L_TempHLock$stub
+ nop
+
+ lha r0,56(sp)
+ cmpwi r0,0
+ beq+ return_r31
+
+ mr r3,r31
+ addi r4,sp,56
+ bl L_TempDisposeHandle$stub
+ nop
+
+ li r31,0
+return_r31:
+ lwz r0,104(sp)
+ mr r3,r31
+ mtlr r0
+ addi sp,sp,96
+ lwz r31,-4(sp)
+ blr
+
+free_temp_memory_handle:
+ mflr r0
+ stw r3,-4(sp)
+ stw r0,8(sp)
+ stwu sp,-96(sp)
+
+ addi r4,sp,56
+ bl L_TempHUnlock$stub
+ nop
+
+ lwz r3,96-4(sp)
+ addi r4,sp,56
+ bl L_TempDisposeHandle$stub
+ nop
+
+ lwz r0,104(sp)
+ addi sp,sp,96
+ mtlr r0
+ blr
+ .endif
+
+init_profiler_error:
+ lea_ o0,not_enough_memory_for_profile_stack
+ lea_ r5,profile_globals
+ li r4,0
+ stw r4,Globals_stack_pointer(r5)
+ b print_error
+profiler_memory_error:
+ lea_ o0,not_enough_memory_for_profiler
+ b print_error
+ .if CHECK_STACK_OVERFLOWS
+profile_stack_overflow:
+ mflr r0
+ stw r0,-4(sp)
+ stwu sp,-64(sp)
+
+ bl .Debugger
+ nop
+
+ lwz r0,64-4(sp)
+ addi sp,sp,64
+ mtlr r0
+ b profile_stack_overflow
+ .endif
+
+ .data
+ .align 2
+ .comm profile_globals,Globals
+
+ .align 2
+ .if MODULE_NAMES
+m_system_:
+ .long 6
+ .ascii "System"
+ .byte 0,0
+ .long m_system_
+ .endif
+start_string:
+ .long 0
+ .ascii "start"
+ .byte 0
+ .align 2
+not_enough_memory_for_profile_stack:
+ .ascii "not enough memory for profile stack"
+ .byte 13
+ .byte 0
+not_enough_memory_for_profiler:
+ .ascii "not enough memory for profiler"
+ .byte 13
+ .byte 0
+stack_trace_string:
+ .ascii "Stack trace:"
+ .byte 13
+ .byte 0
+ .align 2
+
+.picsymbol_stub
+L_TempDisposeHandle$stub:
+ .indirect_symbol _TempDisposeHandle
+ mflr r0
+ bcl 20,31,L21$pb
+L21$pb:
+ mflr r11
+ addis r11,r11,ha16(L21$lz-L21$pb)
+ mtlr r0
+ lwz r12,lo16(L21$lz-L21$pb)(r11)
+ mtctr r12
+ addi r11,r11,lo16(L21$lz-L21$pb )
+ bctr
+.lazy_symbol_pointer
+L21$lz:
+ .indirect_symbol _TempDisposeHandle
+ .long dyld_stub_binding_helper
+
+
+.picsymbol_stub
+L_TempHLock$stub:
+ .indirect_symbol _TempHLock
+ mflr r0
+ bcl 20,31,L22$pb
+L22$pb:
+ mflr r11
+ addis r11,r11,ha16(L22$lz-L22$pb)
+ mtlr r0
+ lwz r12,lo16(L22$lz-L22$pb)(r11)
+ mtctr r12
+ addi r11,r11,lo16(L22$lz-L22$pb )
+ bctr
+.lazy_symbol_pointer
+L22$lz:
+ .indirect_symbol _TempHLock
+ .long dyld_stub_binding_helper
+
+
+
+.picsymbol_stub
+L_TempHUnlock$stub:
+ .indirect_symbol _TempHUnlock
+ mflr r0
+ bcl 20,31,L23$pb
+L23$pb:
+ mflr r11
+ addis r11,r11,ha16(L23$lz-L23$pb)
+ mtlr r0
+ lwz r12,lo16(L23$lz-L23$pb)(r11)
+ mtctr r12
+ addi r11,r11,lo16(L23$lz-L23$pb )
+ bctr
+.lazy_symbol_pointer
+L23$lz:
+ .indirect_symbol _TempHUnlock
+ .long dyld_stub_binding_helper
+
+
+
+.picsymbol_stub
+L_TempNewHandle$stub:
+ .indirect_symbol _TempNewHandle
+ mflr r0
+ bcl 20,31,L24$pb
+L24$pb:
+ mflr r11
+ addis r11,r11,ha16(L24$lz-L24$pb)
+ mtlr r0
+ lwz r12,lo16(L24$lz-L24$pb)(r11)
+ mtctr r12
+ addi r11,r11,lo16(L24$lz-L24$pb )
+ bctr
+.lazy_symbol_pointer
+L24$lz:
+ .indirect_symbol _TempNewHandle
+ .long dyld_stub_binding_helper
+