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