53 lines
		
	
	
	
		
			1.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			53 lines
		
	
	
	
		
			1.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/* 
							 | 
						||
| 
								 | 
							
								 * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
							 | 
						||
| 
								 | 
							
								 * Licensed under the GPL
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef __SYS_SIGCONTEXT_PPC_H
							 | 
						||
| 
								 | 
							
								#define __SYS_SIGCONTEXT_PPC_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define DSISR_WRITE 0x02000000
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define SC_FAULT_ADDR(sc) ({ \
							 | 
						||
| 
								 | 
							
										struct sigcontext *_sc = (sc); \
							 | 
						||
| 
								 | 
							
										long retval = -1; \
							 | 
						||
| 
								 | 
							
										switch (_sc->regs->trap) { \
							 | 
						||
| 
								 | 
							
										case 0x300: \
							 | 
						||
| 
								 | 
							
											/* data exception */ \
							 | 
						||
| 
								 | 
							
											retval = _sc->regs->dar; \
							 | 
						||
| 
								 | 
							
											break; \
							 | 
						||
| 
								 | 
							
										case 0x400: \
							 | 
						||
| 
								 | 
							
											/* instruction exception */ \
							 | 
						||
| 
								 | 
							
											retval = _sc->regs->nip; \
							 | 
						||
| 
								 | 
							
											break; \
							 | 
						||
| 
								 | 
							
										default: \
							 | 
						||
| 
								 | 
							
											panic("SC_FAULT_ADDR: unhandled trap type\n"); \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
										retval; \
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define SC_FAULT_WRITE(sc) ({ \
							 | 
						||
| 
								 | 
							
										struct sigcontext *_sc = (sc); \
							 | 
						||
| 
								 | 
							
										long retval = -1; \
							 | 
						||
| 
								 | 
							
										switch (_sc->regs->trap) { \
							 | 
						||
| 
								 | 
							
										case 0x300: \
							 | 
						||
| 
								 | 
							
											/* data exception */ \
							 | 
						||
| 
								 | 
							
											retval = !!(_sc->regs->dsisr & DSISR_WRITE); \
							 | 
						||
| 
								 | 
							
											break; \
							 | 
						||
| 
								 | 
							
										case 0x400: \
							 | 
						||
| 
								 | 
							
											/* instruction exception: not a write */ \
							 | 
						||
| 
								 | 
							
											retval = 0; \
							 | 
						||
| 
								 | 
							
											break; \
							 | 
						||
| 
								 | 
							
										default: \
							 | 
						||
| 
								 | 
							
											panic("SC_FAULT_ADDR: unhandled trap type\n"); \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
										retval; \
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define SC_IP(sc) ((sc)->regs->nip)
							 | 
						||
| 
								 | 
							
								#define SC_SP(sc) ((sc)->regs->gpr[1])
							 | 
						||
| 
								 | 
							
								#define SEGV_IS_FIXABLE(sc) (1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 |