1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # count for ~1 million instructions thread 1 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # count for ~2 million instructions thread 2 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # count for additional 500 million each before exit 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown .globl _start 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown_start: 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ################################################# 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # 1000 cycles in initial thread # 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ################################################# 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown xor %eax,%eax 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $499,%ecx # load counter 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browninitial_loop: 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown dec %ecx # repeat count times 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jnz initial_loop 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ##################################################### 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Spawn a thread! # 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ##################################################### 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownclone: 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $120,%eax # clone syscall 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Note, clone syscall is different than the glibc implementation 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# int clone (flags, stack_pointer,parent_tidptr,child_tidptr,tls) 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Flags in 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #/usr/include/bits/sched.h 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # CLONE_THREAD 0x10000 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # CLONE_SIGHAND 0x800 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # CLONE_VM 0x100 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # above must be called together 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Below required for Valgrind 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # CLONE_FS 0x200 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # CLONE_FILES 0x400 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $0x10f00,%ebx 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $(new_stack+4096),%ecx # new stack 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $0,%edx # args (none) 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int $0x80 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cmp $0,%eax # are we in new thread? 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jz thread2 # if so, jump to thrad2 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ############################################### 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # thread1 # 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ############################################### 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownthread1: 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $499997,%ecx # load counter 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownthread1_loop: 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown dec %ecx # repeat count times 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jnz thread1_loop 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown xor %ebx,%ebx # we return 0 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jmp exit 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownthread2: 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $999997,%ecx # load counter 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownthread2_loop: 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown dec %ecx # repeat count times 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jnz thread2_loop 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $5,%ebx # we return 5 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #================================ 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Exit 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #================================ 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownexit: 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # count an additional 500 million 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $250000,%ecx # load counter 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownexit_loop: 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown dec %ecx # repeat count times 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jnz exit_loop 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownactual_exit: 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov $1,%eax # put exit syscall number (60) in rax 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int $0x80 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.bss 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.lcomm new_stack,4096 96