Browse Source

OpenBSD siginfo clarified

Alexander Shiryaev 12 years ago
parent
commit
83db8eabec

+ 30 - 20
BlackBox/_OpenBSD_/Lin/Mod/Libc.txt

@@ -476,29 +476,39 @@ MODULE LinLibc ["libc.so.66.0"];
 		pid_t* = INTEGER; (* OpenBSD 5.2: 32-bit *)
 		pid_t* = INTEGER; (* OpenBSD 5.2: 32-bit *)
 		uid_t* = INTEGER; (* OpenBSD 5.2: 32-bit *)
 		uid_t* = INTEGER; (* OpenBSD 5.2: 32-bit *)
 
 
+(*
 		sigval_t* = INTEGER; (* OpenBSD: 32-bit (union sigval) *)
 		sigval_t* = INTEGER; (* OpenBSD: 32-bit (union sigval) *)
+*)
+		sigval = RECORD [union]
+			sival_int*: INTEGER; (* integer value *)
+			sival_ptr*: PtrVoid; (* pointer value *)
+		END;
 
 
 		siginfo_t* = RECORD [untagged] (* OpenBSD 5.2 /usr/include/sys/siginfo.h *)
 		siginfo_t* = RECORD [untagged] (* OpenBSD 5.2 /usr/include/sys/siginfo.h *)
-			si_signo*: INTEGER; 	(* Signal number *) (* OpenBSD: 32-bit *)
-			si_code*: INTEGER;   	(* Signal code *) (* OpenBSD: 32-bit *)
-			si_errno*: INTEGER;  	(* An errno value *) (* OpenBSD: 32-bit *)
-
-			(* OpenBSD 5.2: 29 * 4 B below *)
-
-			si_pid*: pid_t;    	(* Sending process ID *)
-			si_uid*: uid_t;    	(* Real user ID of sending process *)
-			si_status*: INTEGER; 	(* Exit value or signal *) (* OpenBSD 5.2: 32-bit *)
-
-			(* si_utime*: clock_t;  	(* User time consumed *) *) (* OpenBSD: XXX *)
-			si_stime*: clock_t;  	(* System time consumed *)
-			(* si_value*: sigval_t;  	(* Signal value *) *) (* OpenBSD: XXX *)
-			(* si_int*: INTEGER;    	(* POSIX.1b signal *) *) (* OpenBSD: XXX *)
-			(* si_ptr*: PtrVoid;    	(* POSIX.1b signal *) *) (* OpenBSD: XXX *)
-			(* si_addr*: PtrVoid;   	(* Memory location which caused fault *) *) (* OpenBSD: XXX *)
-			(* si_band*: INTEGER;   	(* Band event *) *) (* OpenBSD: XXX *)
-			(* si_fd*: INTEGER;     	(* File descriptor *) *) (* OpenBSD: XXX *)
-
-			xxx: ARRAY [untagged] 25 OF INTEGER; (* OpenBSD *)
+			si_signo*: INTEGER; (* signal from signal.h *)
+			si_code*: INTEGER; (* code from above *)
+			si_errno*: INTEGER; (* error from errno.h *)
+			_data*: RECORD [union]
+				_pad*: ARRAY [untagged] 29 (* SI_PAD *) OF INTEGER; (* for future growth *)
+				_proc*: RECORD [untagged] (* kill(), SIGCLD, siqqueue() *)
+					_pid*: pid_t; (* process ID *)
+					_pdata*: RECORD [union]
+						_kill*: RECORD [untagged]
+							_uid*: uid_t;
+							_value*: sigval;
+						END;
+						_cld*: RECORD [untagged]
+							_utime*: clock_t;
+							_status*: INTEGER;
+							_stime*: clock_t;
+						END;
+					END;
+				END;
+				_fault*: RECORD [untagged] (* SIGSEGV, SIGBUS, SIGILL and SIGFPE *)
+					_addr*: PtrVoid; (* faulting address *)
+					_trapno*: INTEGER; (* illegal trap number *)
+				END;
+			END;
 		END;
 		END;
 		Ptrsiginfo_t* = POINTER TO siginfo_t;
 		Ptrsiginfo_t* = POINTER TO siginfo_t;
 
 

+ 30 - 20
BlackBox/_OpenBSD_/Lin/Mod/gen-Libc/Libc.txt.templ

@@ -144,29 +144,39 @@ MODULE LinLibc ["libc.so.66.0"];
 		pid_t* = INTEGER; (* OpenBSD 5.2: 32-bit *)
 		pid_t* = INTEGER; (* OpenBSD 5.2: 32-bit *)
 		uid_t* = INTEGER; (* OpenBSD 5.2: 32-bit *)
 		uid_t* = INTEGER; (* OpenBSD 5.2: 32-bit *)
 
 
+(*
 		sigval_t* = INTEGER; (* OpenBSD: 32-bit (union sigval) *)
 		sigval_t* = INTEGER; (* OpenBSD: 32-bit (union sigval) *)
+*)
+		sigval = RECORD [union]
+			sival_int*: INTEGER; (* integer value *)
+			sival_ptr*: PtrVoid; (* pointer value *)
+		END;
 
 
 		siginfo_t* = RECORD [untagged] (* OpenBSD 5.2 /usr/include/sys/siginfo.h *)
 		siginfo_t* = RECORD [untagged] (* OpenBSD 5.2 /usr/include/sys/siginfo.h *)
-			si_signo*: INTEGER; 	(* Signal number *) (* OpenBSD: 32-bit *)
-			si_code*: INTEGER;   	(* Signal code *) (* OpenBSD: 32-bit *)
-			si_errno*: INTEGER;  	(* An errno value *) (* OpenBSD: 32-bit *)
-
-			(* OpenBSD 5.2: 29 * 4 B below *)
-
-			si_pid*: pid_t;    	(* Sending process ID *)
-			si_uid*: uid_t;    	(* Real user ID of sending process *)
-			si_status*: INTEGER; 	(* Exit value or signal *) (* OpenBSD 5.2: 32-bit *)
-
-			(* si_utime*: clock_t;  	(* User time consumed *) *) (* OpenBSD: XXX *)
-			si_stime*: clock_t;  	(* System time consumed *)
-			(* si_value*: sigval_t;  	(* Signal value *) *) (* OpenBSD: XXX *)
-			(* si_int*: INTEGER;    	(* POSIX.1b signal *) *) (* OpenBSD: XXX *)
-			(* si_ptr*: PtrVoid;    	(* POSIX.1b signal *) *) (* OpenBSD: XXX *)
-			(* si_addr*: PtrVoid;   	(* Memory location which caused fault *) *) (* OpenBSD: XXX *)
-			(* si_band*: INTEGER;   	(* Band event *) *) (* OpenBSD: XXX *)
-			(* si_fd*: INTEGER;     	(* File descriptor *) *) (* OpenBSD: XXX *)
-
-			xxx: ARRAY [untagged] 25 OF INTEGER; (* OpenBSD *)
+			si_signo*: INTEGER; (* signal from signal.h *)
+			si_code*: INTEGER; (* code from above *)
+			si_errno*: INTEGER; (* error from errno.h *)
+			_data*: RECORD [union]
+				_pad*: ARRAY [untagged] 29 (* SI_PAD *) OF INTEGER; (* for future growth *)
+				_proc*: RECORD [untagged] (* kill(), SIGCLD, siqqueue() *)
+					_pid*: pid_t; (* process ID *)
+					_pdata*: RECORD [union]
+						_kill*: RECORD [untagged]
+							_uid*: uid_t;
+							_value*: sigval;
+						END;
+						_cld*: RECORD [untagged]
+							_utime*: clock_t;
+							_status*: INTEGER;
+							_stime*: clock_t;
+						END;
+					END;
+				END;
+				_fault*: RECORD [untagged] (* SIGSEGV, SIGBUS, SIGILL and SIGFPE *)
+					_addr*: PtrVoid; (* faulting address *)
+					_trapno*: INTEGER; (* illegal trap number *)
+				END;
+			END;
 		END;
 		END;
 		Ptrsiginfo_t* = POINTER TO siginfo_t;
 		Ptrsiginfo_t* = POINTER TO siginfo_t;
 
 

BIN
BlackBox/_OpenBSD_/System/Mod/Kernel.odc


+ 7 - 3
BlackBox/_OpenBSD_/System/Mod/Kernel.txt

@@ -1941,9 +1941,13 @@ MODULE Kernel;
 		KV("TRAPNO", context.sc_trapno); WriteString(", ");
 		KV("TRAPNO", context.sc_trapno); WriteString(", ");
 		KV("ERR", context.sc_err); WriteLn;
 		KV("ERR", context.sc_err); WriteLn;
 
 
-		(* WriteString("--------------------------------"); WriteLn; *)
+		WriteString("---- siginfo: ------------------"); WriteLn;
 
 
-		(* TODO: show siginfo *)
+		KV("signo", siginfo.si_signo); WriteString(", ");
+		KV("code", siginfo.si_code); WriteString(", ");
+		KV("errno", siginfo.si_errno); WriteLn;
+		KV("fault.addr", siginfo._data._fault._addr); WriteString(", ");
+		KV("fault.trapno", siginfo._data._fault._trapno); WriteLn;
 
 
 		WriteString("================================"); WriteLn
 		WriteString("================================"); WriteLn
 	END ShowTrap;
 	END ShowTrap;
@@ -1972,7 +1976,7 @@ MODULE Kernel;
 			(* OpenBSD *)
 			(* OpenBSD *)
 				ShowTrap(sig, siginfo, context);
 				ShowTrap(sig, siginfo, context);
 				sp := context.sc_esp; fp := context.sc_ebp; pc := context.sc_eip;
 				sp := context.sc_esp; fp := context.sc_ebp; pc := context.sc_eip;
-				val := siginfo.si_pid; (* XXX *)
+				val := siginfo._data._fault._addr;
 
 
 	(*
 	(*
 		Int(sig); Int(siginfo.si_signo); Int(siginfo.si_code); Int(siginfo.si_errno);
 		Int(sig); Int(siginfo.si_signo); Int(siginfo.si_code); Int(siginfo.si_errno);

BIN
BlackBox/_OpenBSD_/libBB.so


BIN
BlackBox/_OpenBSD_/libBB0.so