| Commit | Line | Data |
|---|---|---|
| 050a21aa SS |
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. | |
| 050a21aa SS |
27 | */ |
| 28 | ||
| 29 | #include <machine/asm.h> | |
| 30 | #include <asmcontext.h> | |
| 31 | ||
| 32 | /* | |
| 18c5c90b | 33 | * int get_mcontext(mcontext_t *mcp : rdi) |
| 050a21aa SS |
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) | |
| 18c5c90b MD |
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) */ | |
| 050a21aa SS |
64 | |
| 65 | /* | |
| 66 | * Saved stack pointer as if we had returned from this | |
| 67 | * procedure. | |
| 68 | */ | |
| 18c5c90b MD |
69 | movq %rsp,MC_RSP(%eax) |
| 70 | addq $8,MC_RSP(%eax) | |
| 050a21aa SS |
71 | |
| 72 | /* | |
| 73 | * Save eflags | |
| 18c5c90b | 74 | * XXX |
| 050a21aa SS |
75 | */ |
| 76 | ||
| 77 | /* | |
| 78 | * Saved instruction pointer as if we had returned from | |
| 79 | * this procedure. | |
| 80 | */ | |
| 18c5c90b MD |
81 | movq (%rsp),%rdx |
| 82 | movq %rdx,MC_RIP(%rdi) | |
| 050a21aa SS |
83 | |
| 84 | /* | |
| 85 | * On restore as if procedure returned the value 1 | |
| 86 | */ | |
| 18c5c90b | 87 | movq $1,MC_RAX(%rdi) |
| 050a21aa SS |
88 | |
| 89 | /* | |
| 90 | * Set MC_LEN | |
| 91 | */ | |
| 92 | movl $SIZEOF_MCONTEXT_T,MC_LEN(%eax) | |
| 93 | ||
| 94 | /* | |
| 95 | * Return 0 | |
| 96 | */ | |
| 18c5c90b | 97 | subq %rax,%rax |
| 050a21aa SS |
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) | |
| 18c5c90b MD |
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) */ | |
| 050a21aa SS |
134 | |
| 135 | /* | |
| 136 | * Load the new stack pointer | |
| 137 | */ | |
| 18c5c90b | 138 | movq MC_RSP(%rdi),%rsp |
| 050a21aa SS |
139 | |
| 140 | /* | |
| 141 | * Restore the flags | |
| 18c5c90b | 142 | * XXX |
| 050a21aa SS |
143 | */ |
| 144 | ||
| 145 | /* | |
| 146 | * Push the return pc so we can 'ret' to it. | |
| 050a21aa | 147 | */ |
| 18c5c90b | 148 | pushq MC_RIP(%rdi) |
| 050a21aa SS |
149 | |
| 150 | /* | |
| 18c5c90b | 151 | * Finally rax and rdi |
| 050a21aa | 152 | */ |
| 18c5c90b MD |
153 | movq MC_RAX(%rdi),%rax |
| 154 | movq MC_RDI(%rdi),%rdi | |
| 155 | retq | |
| 156 |