aboutsummaryrefslogtreecommitdiff
path: root/core/thread/thread_asm.S
blob: ec3e0add8a0e81deef3a108f096d7ae81f03f99a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
	.globl	__switch_to
	.type	__switch_to, @function
__switch_to:
	movl	__current, %edx
	pushl	%ebx
	pushl	%ebp
	pushl	%esi
	pushl	%edi
	pushl	RealModeSSSP
	pushl	errno			/* Hack! */
	movl	%esp, (%edx)

	movl	%eax, __current
	movl	(%eax), %esp
	popl	errno
	popl	RealModeSSSP
	popl	%edi
	popl	%esi
	popl	%ebp
	popl	%ebx
	ret
	.size	__switch_to, .-__switch_to

	.globl	__start_thread
	.type	__start_thread, @function
__start_thread:
	movl	%edi, %eax		/* Thread function argument */

	pushl	$0			/* For gdb's benefit */
	movl	%esp, %ebp		/* For gdb's benefit */

	pushl	%ebx			/* Set up the flags/interrupt state */
	popfl

	call	*%esi			/* Run the desired function */
	jmp	__exit_thread		/* If we get here, kill the thread */
	.size	__start_thread, .-__start_thread