summaryrefslogtreecommitdiffstats
path: root/tools/KSE/ksetest/kse_asm.S
blob: a12358c62c8196e72d30abb7b51462d4b642c23a (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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*-
 * $FreeBSD$
 */

#include <machine/asmacros.h>

/*****************************************************************************/
/* Scheduling                                                                */
/*****************************************************************************/

	.data

	.text

#define TF_GS		-0x04 /* don't laugh! */
#define TF_FS		0x00
#define TF_ES		0x04
#define TF_DS		0x08
#define TF_EDI		0x0c
#define TF_ESI		0x10
#define TF_EBP		0x14
#define TF_ISP		0x18
#define TF_EBX		0x1c
#define TF_EDX		0x20
#define TF_ECX		0x24
#define TF_EAX		0x28
#define TF_TRAPNO	0x2c
#define TF_ERR		0x30
#define TF_EIP		0x34
#define TF_CS		0x38
#define TF_EFLAGS	0x3c
#define TF_ESP		0x40
#define TF_SS		0x44

/*
 * savethread
 */
GEN_ENTRY(savethread)

	/* Switch to new thread.  First, save context as needed. */
	pushl	%edx
	movl	8(%esp), %edx	/* get context area */
	
	movl	%eax,TF_EAX(%edx)
	movl	%ebx,TF_EBX(%edx)
	movl	%ecx,TF_ECX(%edx)
	popl	%eax			/* get dx off the stack again */
	movl	%eax,TF_EDX(%edx)
	movl	(%esp),%eax		/* get the return address */
	movl	%eax,TF_EIP(%edx)
	movl	%esp,TF_ESP(%edx)
	movl	%esp,TF_ISP(%edx)	/* XXX */
	movl	%ebp,TF_EBP(%edx)
	movl	%esi,TF_ESI(%edx)
	movl	%edi,TF_EDI(%edx)
	movl	%cs,TF_CS(%edx)
	movl	%ds,TF_DS(%edx)
	movl	%es,TF_ES(%edx)
	movl	%fs,TF_FS(%edx)
	movl	%gs,TF_GS(%edx)
	ret


GEN_ENTRY(loadthread)
	mov	4(%esp), %edx	/* get context area */

/*	movl	TF_ISP(%edx), %esp */	/* select which is correct */
	movl	TF_ESP(%edx), %esp	/* get the new stack online */
	movl	TF_EBP(%edx), %ebp
	movl	TF_EIP(%edx),%eax
	push	%eax			/* return adddress */
#if 0
	movl	TF_CS(%edx), %cs
	movl	TF_DS(%edx), %ds
	movl	TF_ES(%edx), %es
	movl	TF_FS(%edx), %fs
	movl	TF_GS(%edx), %gs
#endif
	movl	TF_ESI(%edx), %esi
	movl	TF_EDI(%edx), %edi

	movl	TF_EDX(%edx), %eax
	pushl	%eax		
	movl	TF_ECX(%edx), %ecx
	movl	TF_EBX(%edx), %ebx
	movl	TF_EAX(%edx), %eax
	popl	%edx
	ret
OpenPOWER on IntegriCloud