2
0
Эх сурвалжийг харах

Finally found the problem with traps on several threads: only one signal stack was in use ...
Temporarily activated the common signal stack only for segmentation faults to catch stack overflows (but even here we should not share the same stack for different threads!)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7000 8c9fc860-2736-0410-a75d-ab315db34111

felixf 8 жил өмнө
parent
commit
d0debdb858

+ 6 - 2
source/Generic.Linux.I386.Unix.Mod

@@ -996,7 +996,11 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 	BEGIN
 		sigemptyset(ADDRESS OF mask);
 		act.sa_mask := mask;
-		act.sa_flags :=  SA_SIGINFO + SA_ONSTACK + SA_NODEFER;
+		IF sig = SIGSEGV THEN (* segmentation violation *)
+			act.sa_flags :=  SA_SIGINFO +  SA_ONSTACK +  SA_NODEFER;
+		ELSE
+			act.sa_flags :=  SA_SIGINFO + (* SA_ONSTACK + *) SA_NODEFER;
+		END;
 		act.sa_handler := ADDRESS OF SigHandler;
 		IF sigaction( sig, ADDRESS OF act, 0 ) # 0 THEN
 			Perror("sigaction");
@@ -1191,7 +1195,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		Dlsym( libc, "closedir",	ADDRESSOF( closedir ) );
 
 
-		Dlsym( libp, "__sigsetjmp",	ADDRESSOF( sigsetjmp ) );
+		Dlsym( libc, "__sigsetjmp",	ADDRESSOF( sigsetjmp ) );
 		Dlsym( libc, "siglongjmp",	ADDRESSOF( siglongjmp ) );
 
 

+ 1 - 1
source/Generic.Unix.Traps.Mod

@@ -233,11 +233,11 @@ VAR
 		END;
 		entry := Modules.GetExceptionHandler( pc );
 		WHILE (entry = -1) & (fp <= process.stackBottom) & (fp#0) DO
-			sp := fp;   (* Save the old framepointer into the stack pointer *)
 			fp := CheckBP(fp);
 			S.GET( fp + AddrSize, pc );
 			pc := pc - 1;   (*  CALL instruction, machine dependent!!! *)
 			entry := Modules.GetExceptionHandler( pc );
+			sp := fp;   (* Save the old framepointer into the stack pointer *)
 			S.GET( fp, fp ) (* Unwind PAF *)
 		END;
 		IF entry # -1 THEN