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