rename amd64 architecture to x86_64
[dragonfly.git] / lib / libc / x86_64 / gen / mcontext.S
1 /*
2  * Copyright (c) 2007 Matthew T. Emmerton <matt@gsicomp.on.ca>
3  * All rights reserved.
4  * Copyright (c) 2007 Matthew Dillon <dillon@backplane.com>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Neither the name of the author nor the names of its contributors
13  *    may be used to endorse or promote products derived from this software
14  *    without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28
29 #include <machine/asm.h>
30 #include <asmcontext.h>
31
32         /*
33          * int get_mcontext(mcontext_t *mcp : rdi)
34          *
35          * Copy the caller's context into the mcontext, %eax excepted.
36          */
37         .weak   get_mcontext
38         .set    get_mcontext,_get_mcontext
39 ENTRY(_get_mcontext)
40         /*      MC_ONSTACK(%rdi)        */
41         movq    %rdi,MC_RDI(%rdi)
42         movq    %rsi,MC_RSI(%rdi)
43         movq    %rdx,MC_RDX(%rdi)
44         movq    %r8,MC_R8(%rdi)
45         movq    %r9,MC_R9(%rdi)
46         /* movq %rax,MC_RAX(%rdi) - not needed, replaced below */
47         movq    %rbx,MC_RBX(%rdi)
48         movq    %rbp,MC_RBP(%rdi)
49         movq    %r10,MC_R10(%rdi)
50         movq    %r11,MC_R11(%rdi)
51         movq    %r12,MC_R12(%rdi)
52         movq    %r13,MC_R13(%rdi)
53         movq    %r14,MC_R14(%rdi)
54         movq    %r15,MC_R15(%rdi)
55         /*      MC_TRAPNO(%rdi) */
56         /*      MC_ADDR(%rdi)   */
57         /*      MC_FLAGS(%rdi)  */
58         /*      MC_ERR(%rdi)    */
59         /*      MC_RIP(%rdi)    - see below */
60         /*      MC_CS(%rdi)     */
61         /*      MC_RFLAGS(%rdi) */
62         /*      MC_RSP(%rdi)    - see below */
63         /*      MC_SS(%rdi)     */
64
65         /*
66          * Saved stack pointer as if we had returned from this
67          * procedure.
68          */
69         movq    %rsp,MC_RSP(%eax)
70         addq    $8,MC_RSP(%eax)
71
72         /*
73          * Save eflags
74          * XXX
75          */
76
77         /*
78          * Saved instruction pointer as if we had returned from
79          * this procedure.
80          */
81         movq    (%rsp),%rdx
82         movq    %rdx,MC_RIP(%rdi)
83
84         /*
85          * On restore as if procedure returned the value 1
86          */
87         movq    $1,MC_RAX(%rdi) 
88
89         /*
90          * Set MC_LEN
91          */
92         movl    $SIZEOF_MCONTEXT_T,MC_LEN(%eax)
93
94         /*
95          * Return 0
96          */
97         subq    %rax,%rax
98         ret
99
100
101         /*
102          * int set_mcontext(mcontext_t *mcp)
103          *
104          * Load the register context, effectively switching to the
105          * new context.
106          */
107         .weak   set_mcontext
108         .set    set_mcontext,_set_mcontext
109 ENTRY(_set_mcontext)
110         /*      MC_ONSTACK(%rdi)        */
111         /*      MC_RDI(%rdi)    - see below */
112         movq    MC_RSI(%rdi),%rsi
113         movq    MC_RDX(%rdi),%rdx
114         movq    MC_R8(%rdi),%r8
115         movq    MC_R9(%rdi),%r9
116         /*      MC_RAX(%rdi)    - see below */
117         movq    MC_RBX(%rdi),%rbx
118         movq    MC_RBP(%rdi),%rbp
119         movq    MC_R10(%rdi),%r10
120         movq    MC_R11(%rdi),%r11
121         movq    MC_R12(%rdi),%r12
122         movq    MC_R13(%rdi),%r13
123         movq    MC_R14(%rdi),%r14
124         movq    MC_R15(%rdi),%r15
125         /*      MC_TRAPNO(%rdi) */
126         /*      MC_ADDR(%rdi)   */
127         /*      MC_FLAGS(%rdi)  */
128         /*      MC_ERR(%rdi)    */
129         /*      MC_RIP(%rdi)    - see below */
130         /*      MC_CS(%rdi)     */
131         /*      MC_RFLAGS(%rdi) */
132         /*      MC_RSP(%rdi)    - see below */
133         /*      MC_SS(%rdi)     */
134
135         /*
136          * Load the new stack pointer
137          */
138         movq    MC_RSP(%rdi),%rsp
139
140         /*
141          * Restore the flags
142          * XXX
143          */
144
145         /*
146          * Push the return pc so we can 'ret' to it.
147          */
148         pushq   MC_RIP(%rdi)
149
150         /*
151          * Finally rax and rdi
152          */
153         movq    MC_RAX(%rdi),%rax
154         movq    MC_RDI(%rdi),%rdi
155         retq
156