xref: /reactos/sdk/lib/crt/wine/except_arm64.c (revision 1734f297)
1 /*
2  * msvcrt C++ exception handling
3  *
4  * Copyright 2011 Alexandre Julliard
5  * Copyright 2013 André Hentschel
6  * Copyright 2017 Martin Storsjo
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21  */
22 
23 #include "config.h"
24 #include "wine/port.h"
25 
26 #ifdef __aarch64__
27 
28 #include <stdarg.h>
29 
30 #include "ntstatus.h"
31 #define WIN32_NO_STATUS
32 #include "windef.h"
33 #include "winbase.h"
34 #include "winternl.h"
35 #include "msvcrt.h"
36 #include "wine/exception.h"
37 #include "excpt.h"
38 #include "wine/debug.h"
39 
40 #include "cppexcept.h"
41 
42 WINE_DEFAULT_DEBUG_CHANNEL(seh);
43 
44 
45 /*********************************************************************
46  *		__CxxExceptionFilter (MSVCRT.@)
47  */
48 int CDECL __CxxExceptionFilter( PEXCEPTION_POINTERS ptrs,
49                                 const type_info *ti, int flags, void **copy )
50 {
51     FIXME( "%p %p %x %p: not implemented\n", ptrs, ti, flags, copy );
52     return EXCEPTION_CONTINUE_SEARCH;
53 }
54 
55 /*********************************************************************
56  *		__CxxFrameHandler (MSVCRT.@)
57  */
58 EXCEPTION_DISPOSITION CDECL __CxxFrameHandler(EXCEPTION_RECORD *rec, DWORD frame, CONTEXT *context,
59                                               DISPATCHER_CONTEXT *dispatch)
60 {
61     FIXME("%p %x %p %p: not implemented\n", rec, frame, context, dispatch);
62     return ExceptionContinueSearch;
63 }
64 
65 
66 /*********************************************************************
67  *		__CppXcptFilter (MSVCRT.@)
68  */
69 int CDECL __CppXcptFilter(NTSTATUS ex, PEXCEPTION_POINTERS ptr)
70 {
71     /* only filter c++ exceptions */
72     if (ex != CXX_EXCEPTION) return EXCEPTION_CONTINUE_SEARCH;
73     return _XcptFilter(ex, ptr);
74 }
75 
76 
77 /*********************************************************************
78  *		__CxxDetectRethrow (MSVCRT.@)
79  */
80 BOOL CDECL __CxxDetectRethrow(PEXCEPTION_POINTERS ptrs)
81 {
82     PEXCEPTION_RECORD rec;
83 
84     if (!ptrs)
85         return FALSE;
86 
87     rec = ptrs->ExceptionRecord;
88 
89     if (rec->ExceptionCode == CXX_EXCEPTION &&
90         rec->NumberParameters == 3 &&
91         rec->ExceptionInformation[0] == CXX_FRAME_MAGIC_VC6 &&
92         rec->ExceptionInformation[2])
93     {
94         ptrs->ExceptionRecord = msvcrt_get_thread_data()->exc_record;
95         return TRUE;
96     }
97     return (msvcrt_get_thread_data()->exc_record == rec);
98 }
99 
100 
101 /*********************************************************************
102  *		__CxxQueryExceptionSize (MSVCRT.@)
103  */
104 unsigned int CDECL __CxxQueryExceptionSize(void)
105 {
106     return sizeof(cxx_exception_type);
107 }
108 
109 
110 /*******************************************************************
111  *		_setjmp (MSVCRT.@)
112  */
113 __ASM_GLOBAL_FUNC(MSVCRT__setjmp,
114                   "mov x1, #0\n\t"  /* frame */
115                   "b " __ASM_NAME("__wine_setjmpex"));
116 
117 /*******************************************************************
118  *		longjmp (MSVCRT.@)
119  */
120 void __cdecl MSVCRT_longjmp(struct MSVCRT___JUMP_BUFFER *jmp, int retval)
121 {
122     EXCEPTION_RECORD rec;
123 
124     if (!retval) retval = 1;
125     if (jmp->Frame)
126     {
127         rec.ExceptionCode = STATUS_LONGJUMP;
128         rec.ExceptionFlags = 0;
129         rec.ExceptionRecord = NULL;
130         rec.ExceptionAddress = NULL;
131         rec.NumberParameters = 1;
132         rec.ExceptionInformation[0] = (DWORD_PTR)jmp;
133         RtlUnwind((void *)jmp->Frame, (void *)jmp->Lr, &rec, IntToPtr(retval));
134     }
135     __wine_longjmp( (__wine_jmp_buf *)jmp, retval );
136 }
137 
138 /*********************************************************************
139  *              _fpieee_flt (MSVCRT.@)
140  */
141 int __cdecl _fpieee_flt(ULONG exception_code, EXCEPTION_POINTERS *ep,
142         int (__cdecl *handler)(_FPIEEE_RECORD*))
143 {
144     FIXME("(%x %p %p)\n", exception_code, ep, handler);
145     return EXCEPTION_CONTINUE_SEARCH;
146 }
147 
148 #endif  /* __aarch64__ */
149