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

exit_thread_trampoline:
	addl $4, %esp
	pushl (%esp)
	ret

# void start_thread(uint32_t esp, uint32_t eip)
.global start_thread
start_thread:
	movl 8(%esp), %ecx
	movl 4(%esp), %esp
	movl $0, %ebp
	pushl $exit_thread_trampoline
	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

# void thread_jump_userspace(uint32_t rsp, uint32_t rip)
.global thread_jump_userspace
thread_jump_userspace:
	movl $0x23, %eax
	movw %ax, %ds
	movw %ax, %es
	movw %ax, %fs
	movw %ax, %gs

	movl 8(%esp), %ecx
	movl 4(%esp), %esp

	pushl $0x23
	pushl %esp
	pushfl
	pushl $0x1B
	pushl %ecx
	iret