Browse Source

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 years ago
parent
commit
d0debdb858
2 changed files with 7 additions and 3 deletions
  1. 6 2
      source/Generic.Linux.I386.Unix.Mod
  2. 1 1
      source/Generic.Unix.Traps.Mod

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

@@ -996,7 +996,11 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 	BEGIN
 	BEGIN
 		sigemptyset(ADDRESS OF mask);
 		sigemptyset(ADDRESS OF mask);
 		act.sa_mask := 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;
 		act.sa_handler := ADDRESS OF SigHandler;
 		IF sigaction( sig, ADDRESS OF act, 0 ) # 0 THEN
 		IF sigaction( sig, ADDRESS OF act, 0 ) # 0 THEN
 			Perror("sigaction");
 			Perror("sigaction");
@@ -1191,7 +1195,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		Dlsym( libc, "closedir",	ADDRESSOF( closedir ) );
 		Dlsym( libc, "closedir",	ADDRESSOF( closedir ) );
 
 
 
 
-		Dlsym( libp, "__sigsetjmp",	ADDRESSOF( sigsetjmp ) );
+		Dlsym( libc, "__sigsetjmp",	ADDRESSOF( sigsetjmp ) );
 		Dlsym( libc, "siglongjmp",	ADDRESSOF( siglongjmp ) );
 		Dlsym( libc, "siglongjmp",	ADDRESSOF( siglongjmp ) );
 
 
 
 

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

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