# uint32_t read_rip()
.global read_rip
read_rip:
	popl %eax
	jmp *%eax

exit_thread_trampoline:
	addl $16, %esp
	popl %eax
	pushl $0x696969
	pushl %eax
	ret

# void start_thread(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t rsp, uint32_t rip)
.global start_thread
start_thread:
	movl %esp, %eax
	movl 24(%eax), %ecx
	movl 20(%eax), %esp

	pushl 16(%eax)
	pushl 12(%eax)
	pushl 8(%eax)
	pushl 4(%eax)
	pushl $exit_thread_trampoline

	movl $0, %ebp

	sti
	jmp *%ecx

# void continue_thread(uint32_t rsp, uint32_t rip)
.global continue_thread
continue_thread:
	movl 8(%esp), %ecx
	movl 4(%esp), %esp
	movl $0, %eax
	jmp *%ecx