blob: 657d167790c03184ebb6e318e1b37a151154db74 [file] [log] [blame]
Ulrich Weigand65bc8101999-11-12 01:00:34 +00001/*
2 * Sparc signal handling routines
Vincent BĂ©ron9a624912002-05-31 23:06:46 +00003 *
Ulrich Weigand65bc8101999-11-12 01:00:34 +00004 * Copyright 1999 Ulrich Weigand
Alexandre Julliard0799c1a2002-03-09 23:29:33 +00005 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
Jonathan Ernst360a3f92006-05-18 14:49:52 +020018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
Ulrich Weigand65bc8101999-11-12 01:00:34 +000019 */
20
21#ifdef __sparc__
22
23#include "config.h"
Alexandre Julliardfb9cead2005-09-14 10:36:58 +000024#include "wine/port.h"
Ulrich Weigand65bc8101999-11-12 01:00:34 +000025
Alexandre Julliardfb9cead2005-09-14 10:36:58 +000026#include <assert.h>
Ulrich Weigand65bc8101999-11-12 01:00:34 +000027#include <signal.h>
28#include <stdlib.h>
Patrik Stridvalld016f812002-08-17 00:43:16 +000029#ifdef HAVE_UNISTD_H
30# include <unistd.h>
31#endif
Alexandre Julliarde37c6e12003-09-05 23:08:26 +000032#include <stdarg.h>
Ulrich Weigandafd6a4b2000-06-04 01:48:05 +000033#include <stdio.h>
Ulrich Weigand65bc8101999-11-12 01:00:34 +000034#include <sys/ucontext.h>
35
Alexandre Julliarde37c6e12003-09-05 23:08:26 +000036#include "windef.h"
Alexandre Julliarde37c6e12003-09-05 23:08:26 +000037#include "winternl.h"
Patrik Stridvallbc38d6b2001-07-20 18:00:00 +000038#include "winnt.h"
39
40#include "wine/exception.h"
Alexandre Julliard217fdab2003-06-30 21:00:15 +000041#include "ntdll_misc.h"
Patrik Stridvallbc38d6b2001-07-20 18:00:00 +000042
Alexandre Julliard0799c1a2002-03-09 23:29:33 +000043#include "wine/debug.h"
Ulrich Weigand65bc8101999-11-12 01:00:34 +000044
Alexandre Julliard0799c1a2002-03-09 23:29:33 +000045WINE_DEFAULT_DEBUG_CHANNEL(seh);
Ulrich Weigand65bc8101999-11-12 01:00:34 +000046
Juraj Hercek386d51d2002-11-08 18:54:10 +000047#define HANDLER_DEF(name) void name( int __signal, struct siginfo *__siginfo, ucontext_t *__context )
48#define HANDLER_CONTEXT (__context)
49
Patrik Stridvall43255542002-08-09 01:07:29 +000050typedef int (*wine_signal_handler)(unsigned int sig);
Eric Pouech3d4d7e02002-07-31 18:46:09 +000051
52static wine_signal_handler handlers[256];
53
Eric Pouech3d4d7e02002-07-31 18:46:09 +000054/***********************************************************************
55 * dispatch_signal
56 */
Andrew Talbot01086672007-03-17 10:28:32 +000057static inline int dispatch_signal(unsigned int sig)
Eric Pouech3d4d7e02002-07-31 18:46:09 +000058{
59 if (handlers[sig] == NULL) return 0;
60 return handlers[sig](sig);
61}
62
63
Ulrich Weigand65bc8101999-11-12 01:00:34 +000064/*
65 * FIXME: All this works only on Solaris for now
66 */
67
68/**********************************************************************
69 * save_context
70 */
71static void save_context( CONTEXT *context, ucontext_t *ucontext )
72{
73 /* Special registers */
74 context->psr = ucontext->uc_mcontext.gregs[REG_PSR];
75 context->pc = ucontext->uc_mcontext.gregs[REG_PC];
76 context->npc = ucontext->uc_mcontext.gregs[REG_nPC];
77 context->y = ucontext->uc_mcontext.gregs[REG_Y];
78 context->wim = 0; /* FIXME */
79 context->tbr = 0; /* FIXME */
80
81 /* Global registers */
82 context->g0 = 0; /* always */
83 context->g1 = ucontext->uc_mcontext.gregs[REG_G1];
84 context->g2 = ucontext->uc_mcontext.gregs[REG_G2];
85 context->g3 = ucontext->uc_mcontext.gregs[REG_G3];
86 context->g4 = ucontext->uc_mcontext.gregs[REG_G4];
87 context->g5 = ucontext->uc_mcontext.gregs[REG_G5];
88 context->g6 = ucontext->uc_mcontext.gregs[REG_G6];
89 context->g7 = ucontext->uc_mcontext.gregs[REG_G7];
90
91 /* Current 'out' registers */
92 context->o0 = ucontext->uc_mcontext.gregs[REG_O0];
93 context->o1 = ucontext->uc_mcontext.gregs[REG_O1];
94 context->o2 = ucontext->uc_mcontext.gregs[REG_O2];
95 context->o3 = ucontext->uc_mcontext.gregs[REG_O3];
96 context->o4 = ucontext->uc_mcontext.gregs[REG_O4];
97 context->o5 = ucontext->uc_mcontext.gregs[REG_O5];
98 context->o6 = ucontext->uc_mcontext.gregs[REG_O6];
99 context->o7 = ucontext->uc_mcontext.gregs[REG_O7];
100
101 /* FIXME: what if the current register window isn't saved? */
102 if ( ucontext->uc_mcontext.gwins && ucontext->uc_mcontext.gwins->wbcnt > 0 )
103 {
104 /* Current 'local' registers from first register window */
105 context->l0 = ucontext->uc_mcontext.gwins->wbuf[0].rw_local[0];
106 context->l1 = ucontext->uc_mcontext.gwins->wbuf[0].rw_local[1];
107 context->l2 = ucontext->uc_mcontext.gwins->wbuf[0].rw_local[2];
108 context->l3 = ucontext->uc_mcontext.gwins->wbuf[0].rw_local[3];
109 context->l4 = ucontext->uc_mcontext.gwins->wbuf[0].rw_local[4];
110 context->l5 = ucontext->uc_mcontext.gwins->wbuf[0].rw_local[5];
111 context->l6 = ucontext->uc_mcontext.gwins->wbuf[0].rw_local[6];
112 context->l7 = ucontext->uc_mcontext.gwins->wbuf[0].rw_local[7];
113
114 /* Current 'in' registers from first register window */
115 context->i0 = ucontext->uc_mcontext.gwins->wbuf[0].rw_in[0];
116 context->i1 = ucontext->uc_mcontext.gwins->wbuf[0].rw_in[1];
117 context->i2 = ucontext->uc_mcontext.gwins->wbuf[0].rw_in[2];
118 context->i3 = ucontext->uc_mcontext.gwins->wbuf[0].rw_in[3];
119 context->i4 = ucontext->uc_mcontext.gwins->wbuf[0].rw_in[4];
120 context->i5 = ucontext->uc_mcontext.gwins->wbuf[0].rw_in[5];
121 context->i6 = ucontext->uc_mcontext.gwins->wbuf[0].rw_in[6];
122 context->i7 = ucontext->uc_mcontext.gwins->wbuf[0].rw_in[7];
123 }
124}
125
126/**********************************************************************
127 * restore_context
128 */
129static void restore_context( CONTEXT *context, ucontext_t *ucontext )
130{
131 /* FIXME */
132}
133
134/**********************************************************************
135 * save_fpu
136 */
137static void save_fpu( CONTEXT *context, ucontext_t *ucontext )
138{
139 /* FIXME */
140}
141
142/**********************************************************************
143 * restore_fpu
144 */
145static void restore_fpu( CONTEXT *context, ucontext_t *ucontext )
146{
147 /* FIXME */
148}
149
150
Alexandre Julliard2654be02006-01-11 20:20:32 +0100151/***********************************************************************
Alexandre Julliardd2ad6f82006-04-20 15:40:28 +0200152 * get_cpu_context
153 *
154 * Get the context of the current thread.
155 */
156void get_cpu_context( CONTEXT *context )
157{
158 FIXME("not implemented\n");
159}
160
161
162/***********************************************************************
Alexandre Julliard2654be02006-01-11 20:20:32 +0100163 * set_cpu_context
164 *
165 * Set the new CPU context.
166 */
167void set_cpu_context( const CONTEXT *context )
168{
169 FIXME("not implemented\n");
170}
171
172
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000173/**********************************************************************
174 * segv_handler
175 *
176 * Handler for SIGSEGV.
177 */
178static void segv_handler( int signal, siginfo_t *info, ucontext_t *ucontext )
179{
180 EXCEPTION_RECORD rec;
181 CONTEXT context;
182
Alexandre Julliard81b9ca52008-11-25 12:02:16 +0100183 rec.ExceptionCode = EXCEPTION_ACCESS_VIOLATION;
184
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000185 /* we want the page-fault case to be fast */
186 if ( info->si_code == SEGV_ACCERR )
Alexandre Julliard81b9ca52008-11-25 12:02:16 +0100187 if (!(rec.ExceptionCode = virtual_handle_fault( info->si_addr, 0 ))) return;
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000188
189 save_context( &context, ucontext );
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000190 rec.ExceptionRecord = NULL;
191 rec.ExceptionFlags = EXCEPTION_CONTINUABLE;
192 rec.ExceptionAddress = (LPVOID)context.pc;
193 rec.NumberParameters = 2;
194 rec.ExceptionInformation[0] = 0; /* FIXME: read/write access ? */
Dmitry Timoshkov0497af02005-02-24 13:15:36 +0000195 rec.ExceptionInformation[1] = (ULONG_PTR)info->si_addr;
Vincent BĂ©ron9a624912002-05-31 23:06:46 +0000196
Alexandre Julliard26050b42005-05-07 18:10:30 +0000197 __regs_RtlRaiseException( &rec, &context );
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000198 restore_context( &context, ucontext );
199}
200
201/**********************************************************************
202 * bus_handler
203 *
204 * Handler for SIGBUS.
205 */
206static void bus_handler( int signal, siginfo_t *info, ucontext_t *ucontext )
207{
208 EXCEPTION_RECORD rec;
209 CONTEXT context;
210
211 save_context( &context, ucontext );
212 rec.ExceptionRecord = NULL;
213 rec.ExceptionFlags = EXCEPTION_CONTINUABLE;
214 rec.ExceptionAddress = (LPVOID)context.pc;
215 rec.NumberParameters = 0;
216
217 if ( info->si_code == BUS_ADRALN )
218 rec.ExceptionCode = EXCEPTION_DATATYPE_MISALIGNMENT;
219 else
220 rec.ExceptionCode = EXCEPTION_ACCESS_VIOLATION;
Vincent BĂ©ron9a624912002-05-31 23:06:46 +0000221
Alexandre Julliard26050b42005-05-07 18:10:30 +0000222 __regs_RtlRaiseException( &rec, &context );
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000223 restore_context( &context, ucontext );
224}
225
226/**********************************************************************
227 * ill_handler
228 *
229 * Handler for SIGILL.
230 */
231static void ill_handler( int signal, siginfo_t *info, ucontext_t *ucontext )
232{
233 EXCEPTION_RECORD rec;
234 CONTEXT context;
235
236 switch ( info->si_code )
237 {
238 default:
239 case ILL_ILLOPC:
240 case ILL_ILLOPN:
241 case ILL_ILLADR:
242 case ILL_ILLTRP:
243 rec.ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION;
244 break;
245
246 case ILL_PRVOPC:
247 case ILL_PRVREG:
248 rec.ExceptionCode = EXCEPTION_PRIV_INSTRUCTION;
249 break;
250
251 case ILL_BADSTK:
252 rec.ExceptionCode = EXCEPTION_STACK_OVERFLOW;
253 break;
254 }
Vincent BĂ©ron9a624912002-05-31 23:06:46 +0000255
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000256 save_context( &context, ucontext );
257 rec.ExceptionRecord = NULL;
258 rec.ExceptionFlags = EXCEPTION_CONTINUABLE;
259 rec.ExceptionAddress = (LPVOID)context.pc;
260 rec.NumberParameters = 0;
Alexandre Julliard26050b42005-05-07 18:10:30 +0000261 __regs_RtlRaiseException( &rec, &context );
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000262 restore_context( &context, ucontext );
263}
264
265
266/**********************************************************************
267 * trap_handler
268 *
269 * Handler for SIGTRAP.
270 */
271static void trap_handler( int signal, siginfo_t *info, ucontext_t *ucontext )
272{
273 EXCEPTION_RECORD rec;
274 CONTEXT context;
275
276 switch ( info->si_code )
277 {
278 case TRAP_TRACE:
279 rec.ExceptionCode = EXCEPTION_SINGLE_STEP;
280 break;
281 case TRAP_BRKPT:
282 default:
283 rec.ExceptionCode = EXCEPTION_BREAKPOINT;
284 break;
285 }
286
287 save_context( &context, ucontext );
288 rec.ExceptionFlags = EXCEPTION_CONTINUABLE;
289 rec.ExceptionRecord = NULL;
290 rec.ExceptionAddress = (LPVOID)context.pc;
291 rec.NumberParameters = 0;
Alexandre Julliard26050b42005-05-07 18:10:30 +0000292 __regs_RtlRaiseException( &rec, &context );
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000293 restore_context( &context, ucontext );
294}
295
296
297/**********************************************************************
298 * fpe_handler
299 *
300 * Handler for SIGFPE.
301 */
302static void fpe_handler( int signal, siginfo_t *info, ucontext_t *ucontext )
303{
304 EXCEPTION_RECORD rec;
305 CONTEXT context;
306
307 switch ( info->si_code )
308 {
309 case FPE_FLTSUB:
310 rec.ExceptionCode = EXCEPTION_ARRAY_BOUNDS_EXCEEDED;
311 break;
312 case FPE_INTDIV:
313 rec.ExceptionCode = EXCEPTION_INT_DIVIDE_BY_ZERO;
314 break;
315 case FPE_INTOVF:
316 rec.ExceptionCode = EXCEPTION_INT_OVERFLOW;
317 break;
318 case FPE_FLTDIV:
319 rec.ExceptionCode = EXCEPTION_FLT_DIVIDE_BY_ZERO;
320 break;
321 case FPE_FLTOVF:
322 rec.ExceptionCode = EXCEPTION_FLT_OVERFLOW;
323 break;
324 case FPE_FLTUND:
325 rec.ExceptionCode = EXCEPTION_FLT_UNDERFLOW;
326 break;
327 case FPE_FLTRES:
328 rec.ExceptionCode = EXCEPTION_FLT_INEXACT_RESULT;
329 break;
330 case FPE_FLTINV:
331 default:
332 rec.ExceptionCode = EXCEPTION_FLT_INVALID_OPERATION;
333 break;
334 }
335
336 save_context( &context, ucontext );
337 save_fpu( &context, ucontext );
338 rec.ExceptionFlags = EXCEPTION_CONTINUABLE;
339 rec.ExceptionRecord = NULL;
340 rec.ExceptionAddress = (LPVOID)context.pc;
341 rec.NumberParameters = 0;
Alexandre Julliard26050b42005-05-07 18:10:30 +0000342 __regs_RtlRaiseException( &rec, &context );
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000343 restore_context( &context, ucontext );
344 restore_fpu( &context, ucontext );
345}
346
347
348/**********************************************************************
349 * int_handler
350 *
351 * Handler for SIGINT.
352 */
353static void int_handler( int signal, siginfo_t *info, ucontext_t *ucontext )
354{
Eric Pouech3d4d7e02002-07-31 18:46:09 +0000355 if (!dispatch_signal(SIGINT))
Eric Pouech93bfa0d2002-06-02 21:22:22 +0000356 {
357 EXCEPTION_RECORD rec;
358 CONTEXT context;
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000359
Eric Pouech93bfa0d2002-06-02 21:22:22 +0000360 save_context( &context, ucontext );
361 rec.ExceptionCode = CONTROL_C_EXIT;
362 rec.ExceptionFlags = EXCEPTION_CONTINUABLE;
363 rec.ExceptionRecord = NULL;
364 rec.ExceptionAddress = (LPVOID)context.pc;
365 rec.NumberParameters = 0;
Alexandre Julliard26050b42005-05-07 18:10:30 +0000366 __regs_RtlRaiseException( &rec, &context );
Eric Pouech93bfa0d2002-06-02 21:22:22 +0000367 restore_context( &context, ucontext );
368 }
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000369}
370
Lionel Ulmerbdb44552002-10-28 23:56:58 +0000371/**********************************************************************
372 * abrt_handler
373 *
374 * Handler for SIGABRT.
375 */
376static HANDLER_DEF(abrt_handler)
377{
378 EXCEPTION_RECORD rec;
379 CONTEXT context;
380
381 save_context( &context, HANDLER_CONTEXT );
382 rec.ExceptionCode = EXCEPTION_WINE_ASSERTION;
383 rec.ExceptionFlags = EH_NONCONTINUABLE;
384 rec.ExceptionRecord = NULL;
Juraj Hercek386d51d2002-11-08 18:54:10 +0000385 rec.ExceptionAddress = (LPVOID)context.pc;
Lionel Ulmerbdb44552002-10-28 23:56:58 +0000386 rec.NumberParameters = 0;
Alexandre Julliard26050b42005-05-07 18:10:30 +0000387 __regs_RtlRaiseException( &rec, &context ); /* Should never return.. */
Lionel Ulmerbdb44552002-10-28 23:56:58 +0000388 restore_context( &context, HANDLER_CONTEXT );
389}
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000390
Alexandre Julliardd04ccb82003-03-04 22:18:43 +0000391
392/**********************************************************************
Alexandre Julliard3b244b92007-12-20 12:19:35 +0100393 * quit_handler
Alexandre Julliard6a26e3f2003-03-21 23:45:26 +0000394 *
Alexandre Julliard3b244b92007-12-20 12:19:35 +0100395 * Handler for SIGQUIT.
Alexandre Julliard6a26e3f2003-03-21 23:45:26 +0000396 */
Alexandre Julliard3b244b92007-12-20 12:19:35 +0100397static HANDLER_DEF(quit_handler)
Alexandre Julliard6a26e3f2003-03-21 23:45:26 +0000398{
Alexandre Julliard4dba1722003-11-06 00:08:05 +0000399 server_abort_thread(0);
Alexandre Julliard6a26e3f2003-03-21 23:45:26 +0000400}
401
402
403/**********************************************************************
Alexandre Julliardd04ccb82003-03-04 22:18:43 +0000404 * usr1_handler
405 *
406 * Handler for SIGUSR1, used to signal a thread that it got suspended.
407 */
408static HANDLER_DEF(usr1_handler)
409{
Alexandre Julliard73c72392005-11-02 20:54:12 +0000410 CONTEXT context;
Eric Pouech14d04b62003-04-03 23:57:11 +0000411
Alexandre Julliard73c72392005-11-02 20:54:12 +0000412 save_context( &context, HANDLER_CONTEXT );
413 wait_suspend( &context );
414 restore_context( &context, HANDLER_CONTEXT );
Alexandre Julliardfb9cead2005-09-14 10:36:58 +0000415}
416
417
418/**********************************************************************
419 * get_signal_stack_total_size
420 *
421 * Retrieve the size to allocate for the signal stack, including the TEB at the bottom.
422 * Must be a power of two.
423 */
424size_t get_signal_stack_total_size(void)
425{
426 assert( sizeof(TEB) <= getpagesize() );
427 return getpagesize(); /* this is just for the TEB, we don't need a signal stack */
Alexandre Julliardd04ccb82003-03-04 22:18:43 +0000428}
429
430
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000431/***********************************************************************
432 * set_handler
433 *
434 * Set a signal handler
435 */
436static int set_handler( int sig, void (*func)() )
437{
438 struct sigaction sig_act;
439
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000440 sig_act.sa_sigaction = func;
Alexandre Julliardc388c582007-01-18 12:20:56 +0100441 sig_act.sa_mask = server_block_set;
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000442 sig_act.sa_flags = SA_SIGINFO;
443
444 return sigaction( sig, &sig_act, NULL );
445}
446
447
Ove Kaavene4a98ec2001-06-15 19:43:15 +0000448/***********************************************************************
Eric Pouech3d4d7e02002-07-31 18:46:09 +0000449 * __wine_set_signal_handler (NTDLL.@)
450 */
Patrik Stridvall43255542002-08-09 01:07:29 +0000451int __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh)
Eric Pouech3d4d7e02002-07-31 18:46:09 +0000452{
453 if (sig > sizeof(handlers) / sizeof(handlers[0])) return -1;
454 if (handlers[sig] != NULL) return -2;
455 handlers[sig] = wsh;
456 return 0;
457}
458
459
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000460/**********************************************************************
Alexandre Julliard531ff0b2008-07-03 20:18:23 +0200461 * signal_init_thread
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000462 */
Alexandre Julliard531ff0b2008-07-03 20:18:23 +0200463void signal_init_thread(void)
464{
465}
466
467/**********************************************************************
468 * signal_init_process
469 */
470void signal_init_process(void)
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000471{
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000472 if (set_handler( SIGINT, (void (*)())int_handler ) == -1) goto error;
473 if (set_handler( SIGFPE, (void (*)())fpe_handler ) == -1) goto error;
474 if (set_handler( SIGSEGV, (void (*)())segv_handler ) == -1) goto error;
475 if (set_handler( SIGILL, (void (*)())ill_handler ) == -1) goto error;
476 if (set_handler( SIGBUS, (void (*)())bus_handler ) == -1) goto error;
477 if (set_handler( SIGTRAP, (void (*)())trap_handler ) == -1) goto error;
Lionel Ulmerbdb44552002-10-28 23:56:58 +0000478 if (set_handler( SIGABRT, (void (*)())abrt_handler ) == -1) goto error;
Alexandre Julliard3b244b92007-12-20 12:19:35 +0100479 if (set_handler( SIGQUIT, (void (*)())quit_handler ) == -1) goto error;
Alexandre Julliardd04ccb82003-03-04 22:18:43 +0000480 if (set_handler( SIGUSR1, (void (*)())usr1_handler ) == -1) goto error;
Eric Friasc8866c02004-11-21 15:38:26 +0000481 /* 'ta 6' tells the kernel to synthesize any unaligned accesses this
482 process makes, instead of just signalling an error and terminating
483 the process. wine-devel did not reach a conclusion on whether
484 this is correct, because that is what x86 does, or it is harmful
485 because it could obscure problems in user code */
486 asm("ta 6"); /* 6 == ST_FIX_ALIGN defined in sys/trap.h */
Alexandre Julliard531ff0b2008-07-03 20:18:23 +0200487 signal_init_thread();
488 return;
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000489
490 error:
491 perror("sigaction");
Alexandre Julliard531ff0b2008-07-03 20:18:23 +0200492 exit(1);
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000493}
494
Alexandre Julliard50c6b742002-01-07 18:02:35 +0000495
496/**********************************************************************
Alexandre Julliardb59627c2000-09-24 03:11:54 +0000497 * __wine_enter_vm86
498 */
499void __wine_enter_vm86( CONTEXT *context )
500{
501 MESSAGE("vm86 mode not supported on this platform\n");
502}
503
504/**********************************************************************
Patrik Stridvall3ca98232001-06-20 23:03:14 +0000505 * DbgBreakPoint (NTDLL.@)
Ulrich Weigandafd6a4b2000-06-04 01:48:05 +0000506 */
507void WINAPI DbgBreakPoint(void)
508{
Gregg Mattinson07db3252002-06-21 20:10:07 +0000509 kill(getpid(), SIGTRAP);
Ulrich Weigandafd6a4b2000-06-04 01:48:05 +0000510}
511
512/**********************************************************************
Patrik Stridvall3ca98232001-06-20 23:03:14 +0000513 * DbgUserBreakPoint (NTDLL.@)
Ulrich Weigandafd6a4b2000-06-04 01:48:05 +0000514 */
515void WINAPI DbgUserBreakPoint(void)
516{
Gregg Mattinson07db3252002-06-21 20:10:07 +0000517 kill(getpid(), SIGTRAP);
Ulrich Weigandafd6a4b2000-06-04 01:48:05 +0000518}
519
Ulrich Weigand65bc8101999-11-12 01:00:34 +0000520#endif /* __sparc__ */