blob: c96204aba130ae58294a8028a43282c4a212160d [file] [log] [blame]
# 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