58 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| /* exception.h
 | |
| 
 | |
| This software is a copyrighted work licensed under the terms of the
 | |
| Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
 | |
| details. */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #define exception_list void
 | |
| typedef struct _DISPATCHER_CONTEXT *PDISPATCHER_CONTEXT;
 | |
| 
 | |
| class exception
 | |
| {
 | |
|   static EXCEPTION_DISPOSITION myfault (EXCEPTION_RECORD *, exception_list *,
 | |
| 					CONTEXT *, PDISPATCHER_CONTEXT);
 | |
|   static EXCEPTION_DISPOSITION handle (EXCEPTION_RECORD *, exception_list *,
 | |
| 				       CONTEXT *, PDISPATCHER_CONTEXT);
 | |
| public:
 | |
|   exception () __attribute__ ((always_inline))
 | |
|   {
 | |
|     /* Install SEH handler. */
 | |
|     asm volatile ("\n\
 | |
|     1:									\n\
 | |
|       .seh_handler							  \
 | |
| 	_ZN9exception6handleEP17_EXCEPTION_RECORDPvP8_CONTEXTP19_DISPATCHER_CONTEXT,	  \
 | |
| 	@except								\n\
 | |
|       .seh_handlerdata							\n\
 | |
|       .long 1								\n\
 | |
|       .rva 1b, 2f, 2f, 2f						\n\
 | |
|       .seh_code								\n");
 | |
|   };
 | |
|   ~exception () __attribute__ ((always_inline))
 | |
|   {
 | |
|     asm volatile ("\n\
 | |
|       nop								\n\
 | |
|     2:									\n\
 | |
|       nop								\n");
 | |
|   }
 | |
| };
 | |
| 
 | |
| LONG CALLBACK myfault_altstack_handler (EXCEPTION_POINTERS *);
 | |
| 
 | |
| class cygwin_exception
 | |
| {
 | |
|   PUINT_PTR framep;
 | |
|   PCONTEXT ctx;
 | |
|   EXCEPTION_RECORD *e;
 | |
|   HANDLE h;
 | |
|   void dump_exception ();
 | |
|   void open_stackdumpfile ();
 | |
| public:
 | |
|   cygwin_exception (PUINT_PTR in_framep, PCONTEXT in_ctx = NULL, EXCEPTION_RECORD *in_e = NULL):
 | |
|     framep (in_framep), ctx (in_ctx), e (in_e), h (NULL) {}
 | |
|   void dumpstack ();
 | |
|   PCONTEXT context () const {return ctx;}
 | |
|   EXCEPTION_RECORD *exception_record () const {return e;}
 | |
| };
 |