浏览代码

Fixed return from trap by restoring stack pointer properly after return from sigsetjmp

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7817 8c9fc860-2736-0410-a75d-ab315db34111
eth.negelef 7 年之前
父节点
当前提交
23bb7a552e
共有 1 个文件被更改,包括 4 次插入1 次删除
  1. 4 1
      source/Generic.Unix.Objects.Mod

+ 4 - 1
source/Generic.Unix.Objects.Mod

@@ -339,7 +339,7 @@ TYPE
 
 	
 	PROCEDURE BodyStarter;
-	VAR p{UNTRACED}: Process;  res: LONGINT; prevBP: ADDRESS;
+	VAR p{UNTRACED}: Process;  res: LONGINT; prevBP, sp: ADDRESS;
 	BEGIN
 		Unix.MtxLock( startProcess );
 			p := newProcess;  newProcess := NIL;
@@ -357,7 +357,10 @@ TYPE
 		p.SetPriority( p.priority );
 
 		IF Restart IN p.flags THEN
+			(* store and restore stack pointer because it is saved on the stack during SYSVABI calls to ensure stack alignment *)
+			sp := S.GetStackPointer ();
 			res := Unix.sigsetjmp( ADDRESSOF( p.state0[0] ), 1 );
+			S.SetStackPointer (sp);
 		END;
 
 		p.mode := Running;