mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
96 lines
2.0 KiB
ArmAsm
96 lines
2.0 KiB
ArmAsm
# 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 %rax,%rax
|
|
mov $499,%rcx # load counter
|
|
initial_loop:
|
|
dec %rcx # repeat count times
|
|
jnz initial_loop
|
|
|
|
|
|
#####################################################
|
|
# Spawn a thread! #
|
|
#####################################################
|
|
clone:
|
|
mov $56,%rax # 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,%rdi
|
|
|
|
|
|
mov $(new_stack+4096),%rsi # new stack
|
|
|
|
|
|
|
|
mov $0,%rdx # args (none)
|
|
|
|
syscall
|
|
|
|
cmp $0,%rax # are we in new thread?
|
|
jz thread2 # if so, jump to thrad2
|
|
|
|
|
|
###############################################
|
|
# thread1 #
|
|
###############################################
|
|
|
|
thread1:
|
|
|
|
mov $499997,%rcx # load counter
|
|
thread1_loop:
|
|
dec %rcx # repeat count times
|
|
jnz thread1_loop
|
|
|
|
xor %rdi,%rdi # we return 0
|
|
jmp exit
|
|
|
|
thread2:
|
|
mov $999997,%rcx # load counter
|
|
thread2_loop:
|
|
dec %rcx # repeat count times
|
|
jnz thread2_loop
|
|
|
|
mov $5,%rdi # we return 5
|
|
|
|
|
|
#================================
|
|
# Exit
|
|
#================================
|
|
exit:
|
|
|
|
# count an additional 500 million
|
|
|
|
mov $250000,%rcx # load counter
|
|
exit_loop:
|
|
dec %rcx # repeat count times
|
|
jnz exit_loop
|
|
|
|
actual_exit:
|
|
mov $60,%rax # put exit syscall number (60) in rax
|
|
syscall
|
|
|
|
.bss
|
|
.lcomm new_stack,4096
|