linux-asm.S - vx32 - Local 9vx git repository for patches.
(HTM) git clone git://r-36.net/vx32
(DIR) Log
(DIR) Files
(DIR) Refs
---
linux-asm.S (2122B)
---
1 // Context routines for Linux
2
3 // vx32_getcontext(struct mcontext_t *ss);
4 // see /usr/include/sys/ucontext.h for layout.
5 // notice that we don't set the floating-point state.
6 // notice also that unlike the linux getcontext,
7 // we *do* copy the segment registers
8
9 #ifdef i386
10
11 .globl vx32_getcontext
12 vx32_getcontext:
13 movl 4(%esp), %eax
14
15 movl %ecx, 40(%eax)
16 movl $0, %ecx
17 movw %gs, %cx
18 movl %ecx, 0(%eax)
19 movw %fs, %cx
20 movl %ecx, 4(%eax)
21 movw %es, %cx
22 movl %ecx, 8(%eax)
23 movw %ds, %cx
24 movl %ecx, 12(%eax)
25 movl %edi, 16(%eax)
26 movl %esi, 20(%eax)
27 movl %ebp, 24(%eax)
28 /* 28(%eax) is esp */
29 movl %ebx, 32(%eax)
30 movl %edx, 36(%eax)
31 /* 40(%eax) is ecx, saved above */
32 movl $1, 44(%eax) /* eax */
33 movl $0, 48(%eax) /* trapno */
34 movl $0, 52(%eax) /* err */
35 /* 56(%eax) is eip */
36 movw %cs, %cx
37 movl %ecx, 60(%eax)
38 pushf
39 movl 0(%esp), %ecx
40 popf
41 movl %ecx, 64(%eax)
42 /* 68(%eax) is another esp */
43 movw %ss, %cx
44 movl %ecx, 72(%eax)
45
46 movl 0(%esp), %ecx /* %eip */
47 movl %ecx, 56(%eax)
48 leal 4(%esp), %ecx /* %esp */
49 movl %ecx, 28(%eax)
50 movl %ecx, 68(%eax)
51
52 movl 40(%eax), %ecx /* restore %ecx */
53 movl $0, %eax
54 ret
55
56 #else /* x86-64 */
57
58 .globl vx32_getcontext
59 vx32_getcontext:
60 // mcontext_t pointer is in %rdi
61 movq %r8, 0(%rdi)
62 movq %r9, 8(%rdi)
63 movq %r10, 16(%rdi)
64 movq %r11, 24(%rdi)
65 movq %r12, 32(%rdi)
66 movq %r13, 40(%rdi)
67 movq %r14, 48(%rdi)
68 movq %r15, 56(%rdi)
69 movq %rdi, 64(%rdi)
70 movq %rsi, 72(%rdi)
71 movq %rbp, 80(%rdi)
72 movq %rbx, 88(%rdi)
73 movq %rdx, 96(%rdi)
74 movq $1, 104(%rdi) /* %rax */
75 movq %rcx, 112(%rdi)
76 /* 120(%rdi) is rsp */
77 leaq 8(%rsp), %rax
78 movq %rax, 120(%rdi)
79 /* 128(%rdi) is rip */
80 movq 0(%rsp), %rax
81 movq %rax, 128(%rdi)
82 /* 136(%rdi) is eflags */
83 pushf
84 popq %rax
85 movq %rax, 136(%rdi)
86 /* 144(%rdi) is cs, gs, fs, pad */
87 xorq %rax, %rax
88 movw %fs, %ax
89 shlq $16, %rax
90 movw %gs, %ax
91 shlq $16, %rax
92 movw %cs, %ax
93 movq %rax, 144(%rdi)
94 /* 152(%rdi) is err */
95 movq $0, 152(%rdi)
96 /* 160(%rdi) is trapno */
97 movq $0, 160(%rdi)
98 /* 168(%rdi) is oldmask */
99 movq $0, 168(%rdi)
100 /* 176(%rdi) is cr2 */
101 movq $0, 176(%rdi)
102 movq $0, %rax
103 ret
104
105 #endif