# count for ~1 million instructions thread 1 # count for ~2 million instructions thread 2 # count for additional 500 million each before exit .globl _start _start: ################################################# # 1000 cycles in initial thread # ################################################# xor %eax,%eax mov $499,%ecx # load counter initial_loop: dec %ecx # repeat count times jnz initial_loop ##################################################### # Spawn a thread! # ##################################################### clone: mov $120,%eax # clone syscall # Note, clone syscall is different than the glibc implementation # int clone (flags, stack_pointer,parent_tidptr,child_tidptr,tls) # Flags in #/usr/include/bits/sched.h # CLONE_THREAD 0x10000 # CLONE_SIGHAND 0x800 # CLONE_VM 0x100 # above must be called together # Below required for Valgrind # CLONE_FS 0x200 # CLONE_FILES 0x400 mov $0x10f00,%ebx mov $(new_stack+4096),%ecx # new stack mov $0,%edx # args (none) int $0x80 cmp $0,%eax # are we in new thread? jz thread2 # if so, jump to thrad2 ############################################### # thread1 # ############################################### thread1: mov $499997,%ecx # load counter thread1_loop: dec %ecx # repeat count times jnz thread1_loop xor %ebx,%ebx # we return 0 jmp exit thread2: mov $999997,%ecx # load counter thread2_loop: dec %ecx # repeat count times jnz thread2_loop mov $5,%ebx # we return 5 #================================ # Exit #================================ exit: # count an additional 500 million mov $250000,%ecx # load counter exit_loop: dec %ecx # repeat count times jnz exit_loop actual_exit: mov $1,%eax # put exit syscall number (60) in rax int $0x80 .bss .lcomm new_stack,4096