xref: /xnu-10002.41.9/san/memory/kasan-test-x86_64.s (revision 699cd48037512bf4380799317ca44ca453c82f57)
1/*
2 * Copyright (c) 1999-2016 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23/*
24 * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
25 *
26 * HISTORY
27 *  20-Apr-92    Bruce Martin ([email protected])
28 *      Created from M68K sources.
29 */
30
31/*
32 * C library -- _setjmp, _longjmp
33 *
34 *	_longjmp(a,v)
35 * will generate a "return(v)" from
36 * the last call to
37 *	_setjmp(a)
38 * by restoring registers from the stack,
39 * The previous signal state is NOT restored.
40 *
41 */
42
43#include <architecture/i386/asm_help.h>
44
45#define JB_RBX        0
46#define JB_RBP        8
47#define JB_RSP        16
48#define JB_R12        24
49#define JB_R13        32
50#define JB_R14        40
51#define JB_R15        48
52#define JB_RIP        56
53#define JB_RFLAGS     64
54#define JB_MXCSR      72
55#define JB_FPCONTROL  76
56#define JB_MASK       80
57
58LEAF(__setjmp, 0)
59        // %rdi is a jmp_buf (struct sigcontext *)
60
61        // now build sigcontext
62        movq    %rbx, JB_RBX(%rdi)
63        movq    %rbp, JB_RBP(%rdi)
64        movq    %r12, JB_R12(%rdi)
65        movq    %r13, JB_R13(%rdi)
66        movq    %r14, JB_R14(%rdi)
67        movq    %r15, JB_R15(%rdi)
68
69        // RIP is set to the frame return address value
70        movq    (%rsp), %rax
71        movq    %rax, JB_RIP(%rdi)
72        // RSP is set to the frame return address plus 8
73        leaq    8(%rsp), %rax
74        movq    %rax, JB_RSP(%rdi)
75
76        // save fp control word
77        fnstcw  JB_FPCONTROL(%rdi)
78
79        // save MXCSR
80        stmxcsr JB_MXCSR(%rdi)
81
82        // return 0
83        xorl    %eax, %eax
84        ret
85        UNWIND_EPILOGUE
86
87
88LEAF(__longjmp, 0)
89        fninit                          // Clear all FP exceptions
90        // %rdi is a jmp_buf (struct sigcontext *)
91        // %esi is the return value
92        movl    %esi, %eax
93        testl   %esi, %esi
94        jnz     1f
95        incl    %eax
96
97        // general registers
981:
99        movq    JB_RBX(%rdi), %rbx
100        movq    JB_RBP(%rdi), %rbp
101        movq    JB_RSP(%rdi), %rsp
102        movq    JB_R12(%rdi), %r12
103        movq    JB_R13(%rdi), %r13
104        movq    JB_R14(%rdi), %r14
105        movq    JB_R15(%rdi), %r15
106
107        // restore FP control word
108        fldcw   JB_FPCONTROL(%rdi)
109
110        // restore MXCSR
111        ldmxcsr JB_MXCSR(%rdi)
112
113
114        // Make sure DF is reset
115        cld
116
117        jmp             *JB_RIP(%rdi)
118        UNWIND_EPILOGUE
119