summaryrefslogtreecommitdiff
path: root/thread_macho64/athread.s
diff options
context:
space:
mode:
Diffstat (limited to 'thread_macho64/athread.s')
-rw-r--r--thread_macho64/athread.s319
1 files changed, 319 insertions, 0 deletions
diff --git a/thread_macho64/athread.s b/thread_macho64/athread.s
new file mode 100644
index 0000000..980cdb3
--- /dev/null
+++ b/thread_macho64/athread.s
@@ -0,0 +1,319 @@
+
+/* File: athread.a */
+/* Author: John van Groningen */
+/* Machine: amd64 */
+
+ .intel_syntax noprefix
+
+ .text
+
+ .globl _pthread_setspecific
+ .globl _pthread_getspecific
+ .globl _clean_new_thread
+
+_clean_new_thread:
+ push rbx
+ push rbp
+ push r12
+ push r13
+ push r14
+ push r15
+
+ sub rsp,24
+ mov qword ptr 8[rsp],rdi
+
+ mov rdi,768
+ att_call _malloc
+
+ mov rbx,rax
+
+ mov rdi,qword ptr _tlsp_tls_index[rip]
+ mov rsi,rax
+ att_call _pthread_setspecific
+
+ mov r9,rbx
+
+ mov rdi,qword ptr 8[rsp]
+
+ mov rbx,qword ptr 8[rdi]
+ test rbx,rbx
+ cmove rbx,qword ptr (main_thread_local_storage+heap_size_offset)[rip]
+ mov qword ptr heap_size_offset[r9],rbx
+
+ mov rbx,qword ptr 16[rdi]
+ test rbx,rbx
+ cmove rbx,qword ptr (main_thread_local_storage+a_stack_size_offset)[rip]
+ mov qword ptr a_stack_size_offset[r9],rbx
+
+ call init_thread
+
+ mov qword ptr saved_heap_p_offset[r9],rdi
+ mov qword ptr saved_r15_offset[r9],r15
+ mov qword ptr saved_a_stack_p_offset[r9],rsi
+
+ mov qword ptr halt_sp_offset[r9],rsp
+
+ mov rdi,qword ptr 8[rsp]
+ call qword ptr [rdi]
+
+ mov rdi,qword ptr _tlsp_tls_index[rip]
+ att_call _pthread_getspecific
+ mov r9,rax
+
+ add rsp,24
+
+ jmp exit_thread
+
+init_thread:
+ lea rax,128[rsp]
+ sub rsp,32+8
+
+ mov rax,qword ptr heap_size_offset[r9]
+ sub rax,7
+ xor rdx,rdx
+ mov rbx,65
+ div rbx
+ mov qword ptr heap_size_65_offset[r9],rax
+
+ mov rax,qword ptr heap_size_offset[r9]
+ sub rax,7
+ xor rdx,rdx
+ mov rbx,257
+ div rbx
+
+ mov heap_size_257_offset[r9],rax
+
+ add rax,7
+ and rax,-8
+
+ mov qword ptr heap_copied_vector_size_offset[r9],rax
+ mov qword ptr heap_end_after_copy_gc_offset[r9],0
+
+ mov rax,qword ptr heap_size_offset[r9]
+ add rax,7
+ and rax,-8
+ mov qword ptr heap_size_offset[r9],rax
+ add rax,7
+
+ mov rbp,rsp
+ and rsp,-16
+
+ mov rbx,r9
+
+ .if LINUX
+ mov rdi,rax
+ att_call _malloc
+ .else
+ mov rcx,rax
+ call allocate_memory
+ .endif
+ mov rsp,rbp
+
+ mov r9,rbx
+
+ test rax,rax
+ je init_thread_no_memory_2
+
+ mov heap_mbp_offset[r9],rax
+
+ lea rdi,7[rax]
+ and rdi,-8
+
+ mov heap_p_offset[r9],rdi
+
+ mov rbp,rsp
+ and rsp,-16
+
+ mov rbx,r9
+
+ .if LINUX
+ mov r14,rdi
+ mov rdi,qword ptr a_stack_size_offset[r9]
+ add rdi,7
+ att_call _malloc
+ mov rdi,r14
+ .else
+ mov rcx,qword ptr a_stack_size_offset[r9]
+ add rcx,7
+ .if 0
+ call allocate_memory_with_guard_page_at_end
+ .else
+ call allocate_memory
+ .endif
+ .endif
+ mov rsp,rbp
+
+ mov r9,rbx
+
+ test rax,rax
+ je init_thread_no_memory_3
+
+ mov stack_mbp_offset[r9],rax
+
+ add rax,qword ptr a_stack_size_offset[r9]
+ add rax,7+4095
+ and rax,-4096
+/* mov qword ptr a_stack_guard_page[rip],rax */
+ sub rax,qword ptr a_stack_size_offset[r9]
+
+ add rax,7
+ and rax,-8
+
+ mov rsi,rax
+
+ mov stack_p_offset[r9],rax
+
+/* lea rcx,(caf_list+8) */
+/* mov qword ptr caf_listp,rcx */
+
+/* lea rcx,__Nil-8 */
+/* mov qword ptr finalizer_list,rcx */
+/* mov qword ptr free_finalizer_list,rcx */
+
+ mov heap_p1_offset[r9],rdi
+
+ mov rbp,qword ptr heap_size_257_offset[r9]
+ shl rbp,4
+ lea rax,[rdi+rbp*8]
+ mov heap_copied_vector_offset[r9],rax
+ add rax,heap_copied_vector_size_offset[r9]
+ mov heap_p2_offset[r9],rax
+
+ mov byte ptr garbage_collect_flag_offset[r9],0
+
+ test byte ptr _flags[rip],64
+ je init_thread_no_mark1
+
+ mov rax,qword ptr heap_size_65_offset[r9]
+ mov qword ptr heap_vector_offset[r9],rdi
+ add rdi,rax
+
+ add rdi,7
+ and rdi,-8
+
+ mov qword ptr heap_p3_offset[r9],rdi
+ lea rbp,[rax*8]
+ mov byte ptr garbage_collect_flag_offset [r9],-1
+
+init_thread_no_mark1:
+ mov rax,qword ptr heap_size_offset[r9]
+
+ mov rbx,4000
+ test byte ptr _flags[rip],64
+ jne init_thread_no_mark9
+ add rbx,rbx
+init_thread_no_mark9:
+
+ cmp rax,rbx
+ jle init_thread_too_large_or_too_small
+ shr rax,3
+ cmp rax,rbp
+ att_jge init_thread_too_large_or_too_small
+ mov rbp,rax
+init_thread_too_large_or_too_small:
+
+ lea rax,[rdi+rbp*8]
+ mov heap_end_after_gc_offset[r9],rax
+
+ test byte ptr _flags[rip],64
+ je init_thread_no_mark2
+ mov qword ptr bit_vector_size_offset[r9],rbp
+init_thread_no_mark2:
+
+ mov qword ptr bit_counter_offset[r9],0
+ mov qword ptr zero_bits_before_mark_offset[r9],0
+
+ mov r15,rbp
+
+ add rsp,32+8
+ xor rax,rax
+ ret
+
+init_thread_no_memory_2:
+ mov rax,1
+ ret
+
+init_thread_no_memory_3:
+ mov rbp,rsp
+ and rsp,-16
+
+ mov rbx,r9
+
+ .if LINUX
+ mov rdi,heap_mbp_offset[r9]
+ att_call _free
+ .else
+ mov rcx,heap_mbp_offset[r9]
+ call free_memory
+ .endif
+
+ mov rsp,rbp
+
+ mov r9,rbx
+
+ add rsp,32
+
+ mov rax,1
+ ret
+
+
+exit_thread:
+ att_call add_execute_time
+
+ mov rbp,rsp
+ and rsp,-16
+
+ mov rbx,r9
+
+ .if LINUX
+ mov rdi,stack_mbp_offset[r9]
+ att_call _free
+
+ mov r9,rbx
+
+ mov rdi,heap_mbp_offset[r9]
+ att_call _free
+
+ mov rdi,r9
+ att_call _free
+ .else
+ mov rcx,stack_mbp_offset[r9]
+ sub rsp,32
+ call free_memory
+
+ mov r9,rbx
+
+ mov rcx,heap_mbp_offset[r9]
+ call free_memory
+
+ call GetProcessHeap
+
+ mov rcx,rax
+ xor rdx,rdx
+ mov r8,rbx
+ call HeapFree
+
+ add rsp,32
+ .endif
+
+ mov rsp,rbp
+
+ pop r15
+ pop r14
+ pop r13
+ pop r12
+ pop rbp
+ pop rbx
+
+ xor rax,rax
+ ret
+
+/* bit_counter_offset = 0 ? */
+/* zero_bits_before_mark_offset = 1 =0 ? */
+
+/* a_stack_guard_page */
+/* caf_list */
+/* caf_listp */
+/* finalizer_list */
+/* free_finalizer_list */
+/* initial_heap_size */