Browse Source

argc / argv and some cleanup (objects introduced more trace, will be removed)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6935 8c9fc860-2736-0410-a75d-ab315db34111
felixf 9 years ago
parent
commit
dcb8ceb665

+ 36 - 7
source/Generic.Linux.I386.Glue.Mod

@@ -22,6 +22,9 @@ VAR
 	stackBottom-	: ADDRESS;	(* of main thread *)
 	stackBottom-	: ADDRESS;	(* of main thread *)
 
 
 
 
+	argc-: WORD; 
+	argv-: ADDRESS;
+
 	PROCEDURE {INITIAL, NOPAF} EntryPoint;
 	PROCEDURE {INITIAL, NOPAF} EntryPoint;
 	CODE
 	CODE
 		; ELF header
 		; ELF header
@@ -175,6 +178,7 @@ VAR
 		
 		
 		Trace.Init;
 		Trace.Init;
 		Trace.Char := Char;
 		Trace.Char := Char;
+		
 		stackBottom := ADDRESSOF( i ) + 2*SIZEOF(ADDRESS);
 		stackBottom := ADDRESSOF( i ) + 2*SIZEOF(ADDRESS);
 		ASSERT(dlsym # NIL);
 		ASSERT(dlsym # NIL);
 		Dlsym(0,"dlopen", ADDRESS OF dlopen);
 		Dlsym(0,"dlopen", ADDRESS OF dlopen);
@@ -183,14 +187,16 @@ VAR
 		ASSERT(dlclose # NIL); 
 		ASSERT(dlclose # NIL); 
 		Dlsym(0,"exit", ADDRESS OF exit);
 		Dlsym(0,"exit", ADDRESS OF exit);
 		ASSERT(exit # NIL);
 		ASSERT(exit # NIL);
-		
-		TRACE(ADDRESS OF last);
-		TRACE(base);
-		TRACE(ADDRESS OF last - base);
 	END Init;
 	END Init;
 	
 	
 	PROCEDURE {INITIAL,NOPAF} Init0;
 	PROCEDURE {INITIAL,NOPAF} Init0;
 	BEGIN
 	BEGIN
+		CODE{SYSTEM.i386}
+			MOV EAX, [ESP]
+			MOV argc, EAX
+			LEA EAX, [ESP+4]
+			MOV argv, EAX
+		END;
 		Init;
 		Init;
 	END Init0;
 	END Init0;
 	
 	
@@ -205,10 +211,12 @@ BEGIN
 	Trace.String("Glue loaded"); Trace.Ln;
 	Trace.String("Glue loaded"); Trace.Ln;
 END Glue.
 END Glue.
 
 
+
+
 SystemTools.FreeDownTo FoxIntermediateBackend ~
 SystemTools.FreeDownTo FoxIntermediateBackend ~
 
 
 SystemTools.DoCommands
 SystemTools.DoCommands
-	Compiler.Compile -p=Linux32G  --preciseGC 
+	Compiler.Compile -p=Linux32G
 		Runtime.Mod Trace.Mod Generic.Linux.I386.Glue.Mod Generic.Linux.I386.Unix.Mod Generic.Unix.I386.Machine.Mod Heaps.Mod  Generic.Modules.Mod 
 		Runtime.Mod Trace.Mod Generic.Linux.I386.Glue.Mod Generic.Linux.I386.Unix.Mod Generic.Unix.I386.Machine.Mod Heaps.Mod  Generic.Modules.Mod 
 		Generic.Unix.Objects.Mod 
 		Generic.Unix.Objects.Mod 
 		Unix.Kernel.Mod KernelLog.Mod Plugins.Mod Streams.Mod 
 		Unix.Kernel.Mod KernelLog.Mod Plugins.Mod Streams.Mod 
@@ -227,7 +235,28 @@ BitSets StringPool ObjectFile GenericLinker Reflection  GenericLoader  BootConso
  ~
  ~
 
 
 	FSTools.CloseFiles simple_elf ~
 	FSTools.CloseFiles simple_elf ~
-		~ 
+~ 
+
+MODULE Test;
+
+IMPORT StdIO, Commands, Streams, Modules;
+
+PROCEDURE Execute(context: Commands.Context);
+VAR str, msg: ARRAY 256 OF CHAR;  res: LONGINT;
+BEGIN
+	IF ~context.arg.GetString(str) THEN RETURN END;
+	IF ~context.arg.GetString(str) THEN 
+		context.out.String("no command"); context.out.Ln;
+		RETURN
+	END;
+	Commands.Activate(str, context, {Commands.Wait}, res, msg);
+END Execute;
+
+BEGIN
+	Execute(StdIO.env);
+	Modules.Shutdown(1);
+END Test.
+
 
 
 #	Release.Build --path="../obg/"  WinAosNewObjectFile ~
 #	Release.Build --path="../obg/"  WinAosNewObjectFile ~
 #	StaticLinker.Link --fileFormat=PE32 --fileName=A2.exe --extension=GofW --displacement=401000H --path="../obg/" 
 #	StaticLinker.Link --fileFormat=PE32 --fileName=A2.exe --extension=GofW --displacement=401000H --path="../obg/" 
@@ -254,7 +283,7 @@ UTF8Strings.Mod FileTrapWriter.Mod Caches.Mod DiskVolumes.Mod OldDiskVolumes.Mod
 DiskFS.Mod OldDiskFS.Mod OberonFS.Mod FATVolumes.Mod FATFiles.Mod ISO9660Volumes.Mod 
 DiskFS.Mod OldDiskFS.Mod OberonFS.Mod FATVolumes.Mod FATFiles.Mod ISO9660Volumes.Mod 
 ISO9660Files.Mod Unix.UnixFiles.Mod RelativeFileSystem.Mod Loader.Mod Unix.BootConsole.Mod
 ISO9660Files.Mod Unix.UnixFiles.Mod RelativeFileSystem.Mod Loader.Mod Unix.BootConsole.Mod
 
 
-Compiler.Compile -p=Linux32G --preciseGC
+Compiler.Compile -p=Linux32G
 Displays.Mod Inputs.Mod Options.Mod Events.Mod EventsUtils.Mod EventsKernelLog.Mod 
 Displays.Mod Inputs.Mod Options.Mod Events.Mod EventsUtils.Mod EventsKernelLog.Mod 
 EventsFileLog.Mod EventsMemoryLog.Mod DynamicStrings.Mod XMLObjects.Mod XML.Mod XMLScanner.Mod 
 EventsFileLog.Mod EventsMemoryLog.Mod DynamicStrings.Mod XMLObjects.Mod XML.Mod XMLScanner.Mod 
 XMLParser.Mod Configuration.Mod FileHandlers.Mod BootShell.Mod I386.Network.Mod ActiveTimers.Mod 
 XMLParser.Mod Configuration.Mod FileHandlers.Mod BootShell.Mod I386.Network.Mod ActiveTimers.Mod 

+ 100 - 112
source/Generic.Linux.I386.Unix.Mod

@@ -244,21 +244,23 @@ CONST
 	HUPCL*		= {10};
 	HUPCL*		= {10};
 	CLOCAL*	= {11};
 	CLOCAL*	= {11};
 	
 	
+	(*
 	PTRACE_TRACEME     =        0;
 	PTRACE_TRACEME     =        0;
-PTRACE_PEEKTEXT    =        1;
-PTRACE_PEEKDATA     =       2;
-PTRACE_PEEKUSR     =        3;
-PTRACE_POKETEXT    =        4;
-PTRACE_POKEDATA    =        5;
-PTRACE_POKEUSR    =         6;
-PTRACE_CONT       =         7;
-PTRACE_KILL           =     8;
-PTRACE_SINGLESTEP    =      9;
-PTRACE_ATTACH         =    16;
-PTRACE_DETACH           =  17;
+	PTRACE_PEEKTEXT    =        1;
+	PTRACE_PEEKDATA     =       2;
+	PTRACE_PEEKUSR     =        3;
+	PTRACE_POKETEXT    =        4;
+	PTRACE_POKEDATA    =        5;
+	PTRACE_POKEUSR    =         6;
+	PTRACE_CONT       =         7;
+	PTRACE_KILL           =     8;
+	PTRACE_SINGLESTEP    =      9;
+	PTRACE_ATTACH         =    16;
+	PTRACE_DETACH           =  17;
 	PTRACE_GETREGS  = 12;
 	PTRACE_GETREGS  = 12;
 	PTRACE_SETREGS    = 13;
 	PTRACE_SETREGS    = 13;
-
+	*)
+	
 TYPE
 TYPE
 	Termios* = RECORD
 	Termios* = RECORD
 		iflags*, oflags*, cflags*, lflags*: SET;
 		iflags*, oflags*, cflags*, lflags*: SET;
@@ -346,24 +348,24 @@ TYPE
 
 
 	Mcontext* = POINTER TO McontextDesc;
 	Mcontext* = POINTER TO McontextDesc;
 	McontextDesc* = RECORD
 	McontextDesc* = RECORD
-				r_gs-		: LONGINT;
-				r_fs-		: LONGINT;
-				r_es-		: LONGINT;
-				r_ds-		: LONGINT;
-				r_di-		: LONGINT;
-				r_si-		: LONGINT;
+				r_gs-		: ADDRESS;
+				r_fs-		: ADDRESS;
+				r_es-		: ADDRESS;
+				r_ds-		: ADDRESS;
+				r_di-		: ADDRESS;
+				r_si-		: ADDRESS;
 				r_bp *	: ADDRESS;
 				r_bp *	: ADDRESS;
-				r_sp_ 	: LONGINT;
-				r_bx-		: LONGINT;
-				r_dx-		: LONGINT;
-				r_cx-		: LONGINT;
-				r_ax-		: LONGINT;
+				r_sp_x-	: ADDRESS;
+				r_bx-		: ADDRESS;
+				r_dx-		: ADDRESS;
+				r_cx-		: ADDRESS;
+				r_ax-		: ADDRESS;
 				r_trapno-	: LONGINT;
 				r_trapno-	: LONGINT;
 				r_err-		: LONGINT;
 				r_err-		: LONGINT;
-				r_pc *	: LONGINT;
-				r_cs-		: LONGINT;
+				r_pc *	: ADDRESS;
+				r_cs-		: ADDRESS;
 				r_flags-	: LONGINT;
 				r_flags-	: LONGINT;
-				r_sp *	: LONGINT;		(* sp at error (signal) *)
+				r_sp *	: ADDRESS;		(* sp at error (signal) *)
 				r_ss-		: LONGINT;
 				r_ss-		: LONGINT;
 				fpc-		: ADDRESS; 	(* FPcontext *)
 				fpc-		: ADDRESS; 	(* FPcontext *)
 				oldmask-	: LONGINT;
 				oldmask-	: LONGINT;
@@ -388,13 +390,32 @@ TYPE
 		ss: WORD;
 		ss: WORD;
 	END;
 	END;
 	
 	
-VAR
+	Sigaction = RECORD
+		sa_handler: ADDRESS;
+		(*filler1: ADDRESS;*)
+		sa_mask: Sigset_t;
+		sa_flags: ADDRESS;
+		filler: ADDRESS;
+	END;
+	
+	Sched_param = RECORD
+		sched_priority: LONGINT;
+		safety: ARRAY 8 OF ADDRESS; 
+	END;
+	
+
+VAR 
+	suspend_mutex: MutexType;
+	mainthread: Thread_t;
+	suspend_done: LONGINT;
+	resume_done: LONGINT;
+	sasuspend, saresume: Sigaction;
+	
 	argc-: LONGINT;  argv-: ADDRESS;
 	argc-: LONGINT;  argv-: ADDRESS;
-	aargc: ADDRESS;
 
 
 	sysinfo-: RECORD
 	sysinfo-: RECORD
-				sysname-, nodename-, release-, version-, machine-: ARRAY 65 OF CHAR;
-			END;
+		sysname-, nodename-, release-, version-, machine-: ARRAY 65 OF CHAR;
+	END;
 			
 			
 	sigstack-: ARRAY 32*4096 OF CHAR;
 	sigstack-: ARRAY 32*4096 OF CHAR;
 	
 	
@@ -490,7 +511,9 @@ VAR
 	readdir-		: PROCEDURE {C} ( dir: ADDRESS ): Dirent;
 	readdir-		: PROCEDURE {C} ( dir: ADDRESS ): Dirent;
 	closedir-		: PROCEDURE {C} ( dir: ADDRESS );
 	closedir-		: PROCEDURE {C} ( dir: ADDRESS );
 
 
+	(*
 	sigsetjmp-	: PROCEDURE {C} ( env: ADDRESS;  savemask: LONGINT ): LONGINT;
 	sigsetjmp-	: PROCEDURE {C} ( env: ADDRESS;  savemask: LONGINT ): LONGINT;
+	*)
 	siglongjmp-	: PROCEDURE {C} ( env: ADDRESS;  val: LONGINT );
 	siglongjmp-	: PROCEDURE {C} ( env: ADDRESS;  val: LONGINT );
 
 
 	kill-			: PROCEDURE {C} ( pid, sig: LONGINT ): LONGINT;
 	kill-			: PROCEDURE {C} ( pid, sig: LONGINT ): LONGINT;
@@ -656,10 +679,6 @@ VAR
 	    sigdelset( ADDRESS OF new, SIGSEGV );
 	    sigdelset( ADDRESS OF new, SIGSEGV );
 	    sigdelset( ADDRESS OF new, SIGTERM );
 	    sigdelset( ADDRESS OF new, SIGTERM );
 	    sigdelset( ADDRESS OF new, T_SIGSUSPEND );
 	    sigdelset( ADDRESS OF new, T_SIGSUSPEND );
-	    (*
-	    res := ptrace(PTRACE_TRACEME, 0,0,0);
-	    TRACE(res);
-	    *)
 
 
 	    res := pthread_sigmask( SIG_SETMASK, ADDRESS OF new, ADDRESS OF old );
 	    res := pthread_sigmask( SIG_SETMASK, ADDRESS OF new, ADDRESS OF old );
 	    res := pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NIL );
 	    res := pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NIL );
@@ -717,12 +736,11 @@ VAR
 	    END;  
 	    END;  
     END ThrKill;
     END ThrKill;
     
     
+    (* did not work 
     PROCEDURE TraceThread*(p: Thread_t);
     PROCEDURE TraceThread*(p: Thread_t);
     VAR regs: PtraceRegsStruct; res: WORD;
     VAR regs: PtraceRegsStruct; res: WORD;
     BEGIN
     BEGIN
-    
-    	TRACE(p, pthread_self());
-    	res := ptrace(PTRACE_ATTACH, p , NIL, NIL); 
+       	res := ptrace(PTRACE_ATTACH, p , NIL, NIL); 
     	IF res < 0 THEN Perror("attach") END; 
     	IF res < 0 THEN Perror("attach") END; 
     	TRACE(res);
     	TRACE(res);
     	res := ptrace(PTRACE_GETREGS,p,NIL, ADDRESS OF regs);
     	res := ptrace(PTRACE_GETREGS,p,NIL, ADDRESS OF regs);
@@ -732,69 +750,49 @@ VAR
     	TRACE(regs.ebp, regs.esp, regs.IP, regs.flags);
     	TRACE(regs.ebp, regs.esp, regs.IP, regs.flags);
     	res := ptrace(PTRACE_DETACH, p, NIL, NIL);
     	res := ptrace(PTRACE_DETACH, p, NIL, NIL);
     END TraceThread;
     END TraceThread;
-    	
+    *)
 	
 	
-PROCEDURE {C} resume_handler(sig: LONGINT);
-BEGIN
-END resume_handler;
-
-PROCEDURE ThrResume*(thr: Thread_t);
-VAR n: LONGINT; res: LONGINT;
-BEGIN
-    res := pthread_mutex_lock( ADDRESS OF suspend_mutex );
-    resume_done := 0; n := 1;
-    res := pthread_kill( thr, T_SIGRESUME ); 
-    
-    WHILE (resume_done # 1) & (n < 50) DO ThrSleep(1); INC(n) END; 
-    res := pthread_mutex_unlock( ADDRESS OF suspend_mutex );
-END ThrResume;
-
-VAR suspendHandler*: PROCEDURE(c: Ucontext);
-
-PROCEDURE {C} suspend_handler(sig: LONGINT; scp: ADDRESS; ucp: ADDRESS);
-VAR block: Sigset_t; res: LONGINT;
-BEGIN
-	TRACE(sig, scp, ucp);
-	IF suspendHandler # NIL THEN suspendHandler(S.VAL(Ucontext,ucp)) END;
-    res := sigfillset( ADDRESS OF block );
-    sigdelset(  ADDRESS OF block, T_SIGRESUME );
-    suspend_done := 1;
-    res := sigsuspend(  ADDRESS OF block ); (* await T_SIGRESUME *)
-    resume_done := 1;
-END suspend_handler;
-
-PROCEDURE ThrSuspend*(thr: Thread_t);
-VAR res: LONGINT;
-BEGIN
-    res := pthread_mutex_lock(ADDRESS OF suspend_mutex );
-    suspend_done := 0;
-    res := pthread_kill( thr, T_SIGSUSPEND );
-    WHILE (suspend_done # 1) DO ThrSleep( 1 ) END;
-    res := pthread_mutex_unlock( ADDRESS OF suspend_mutex );
-END ThrSuspend;
+	PROCEDURE {C} resume_handler(sig: LONGINT);
+	BEGIN
+	END resume_handler;
+
+	PROCEDURE ThrResume*(thr: Thread_t);
+	VAR n: LONGINT; res: LONGINT;
+	BEGIN
+	    res := pthread_mutex_lock( ADDRESS OF suspend_mutex );
+	    resume_done := 0; n := 1;
+	    res := pthread_kill( thr, T_SIGRESUME ); 
+	    
+	    WHILE (resume_done # 1) & (n < 50) DO ThrSleep(1); INC(n) END; 
+	    res := pthread_mutex_unlock( ADDRESS OF suspend_mutex );
+	END ThrResume;
+
+	VAR suspendHandler*: PROCEDURE(c: Ucontext);
+
+	PROCEDURE {C} suspend_handler(sig: LONGINT; scp: ADDRESS; ucp: ADDRESS);
+	VAR block: Sigset_t; res: LONGINT;
+	BEGIN
+		IF suspendHandler # NIL THEN suspendHandler(S.VAL(Ucontext,ucp)) END;
+	    res := sigfillset( ADDRESS OF block );
+	    sigdelset(  ADDRESS OF block, T_SIGRESUME );
+	    suspend_done := 1;
+	    res := sigsuspend(  ADDRESS OF block ); (* await T_SIGRESUME *)
+	    resume_done := 1;
+	END suspend_handler;
+
+	PROCEDURE ThrSuspend*(thr: Thread_t);
+	VAR res: LONGINT;
+	BEGIN
+	    res := pthread_mutex_lock(ADDRESS OF suspend_mutex );
+	    suspend_done := 0;
+	    res := pthread_kill( thr, T_SIGSUSPEND );
+	    WHILE (suspend_done # 1) DO ThrSleep( 1 ) END;
+	    res := pthread_mutex_unlock( ADDRESS OF suspend_mutex );
+	END ThrSuspend;
+
 
 
-TYPE
-	Sigaction = RECORD
-		sa_handler: ADDRESS;
-		(*filler1: ADDRESS;*)
-		sa_mask: Sigset_t;
-		sa_flags: ADDRESS;
-		filler: ADDRESS;
-	END;
-	
-	Sched_param = RECORD
-		sched_priority: LONGINT;
-		safety: ARRAY 8 OF ADDRESS; 
-	END;
-	
-VAR 
-	suspend_mutex: MutexType;
-	mainthread: Thread_t;
-	suspend_done: LONGINT;
-	resume_done: LONGINT;
 
 
 
 
-	sasuspend, saresume: Sigaction;
 
 
 	PROCEDURE ThrInitialize*(VAR low, high: LONGINT): BOOLEAN;
 	PROCEDURE ThrInitialize*(VAR low, high: LONGINT): BOOLEAN;
 	VAR
 	VAR
@@ -1005,9 +1003,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 				ctime-	: Timeval;
 				ctime-	: Timeval;
 				unused-	: ARRAY 2 OF LONGINT;
 				unused-	: ARRAY 2 OF LONGINT;
 		*)
 		*)
-			TRACE(fd);
 		res := fxstat(3, fd, buf);
 		res := fxstat(3, fd, buf);
-		TRACE(res, buf.ino, buf.rdev, buf.size);
 		RETURN res;
 		RETURN res;
 	END fstat;
 	END fstat;
 
 
@@ -1066,16 +1062,12 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 	END InitXErrorHandlers;
 	END InitXErrorHandlers;
 	
 	
 	PROCEDURE Init;
 	PROCEDURE Init;
-	VAR test: ADDRESS; 
+	VAR test: ADDRESS; i: LONGINT; s: ARRAY 256 OF CHAR;
 	BEGIN
 	BEGIN
 		TRACE("Unix init start");
 		TRACE("Unix init start");
-		(*
-		Dlsym( 0, "argc", ADDRESSOF( aargc ) );  
-		IF aargc # NIL THEN
-			S.GET( aargc, argc );
-		END;
-		Dlsym( 0, "argv", ADDRESSOF( argv ) );
-		*)
+		
+		argc := Glue.argc;
+		argv := Glue.argv;
 
 
 		libraryPaths[0] := "/lib/i386-linux-gnu";
 		libraryPaths[0] := "/lib/i386-linux-gnu";
 		libraryPaths[1] := "/usr/lib/i386-linux-gnu";
 		libraryPaths[1] := "/usr/lib/i386-linux-gnu";
@@ -1130,10 +1122,6 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		Dlsym( libc, "sigaltstack", ADDRESSOF(sigaltstack));
 		Dlsym( libc, "sigaltstack", ADDRESSOF(sigaltstack));
 		Dlsym( libc, "sigsuspend", ADDRESSOF(sigsuspend));
 		Dlsym( libc, "sigsuspend", ADDRESSOF(sigsuspend));
 				
 				
-		(*
-		Dlsym( libc, "putc", ADDRESSOF(test));
-		*)
-		
 		Dlsym( libc, "read",		ADDRESSOF( read ) );
 		Dlsym( libc, "read",		ADDRESSOF( read ) );
 		Dlsym( libc, "write",	ADDRESSOF( write ) );
 		Dlsym( libc, "write",	ADDRESSOF( write ) );
 		Dlsym( libc, "open",		ADDRESSOF( open ) );
 		Dlsym( libc, "open",		ADDRESSOF( open ) );
@@ -1179,7 +1167,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 
 
 
 
 		(*Dlsym( libp, "sigsetjmp",	ADDRESSOF( sigsetjmp ) );*)
 		(*Dlsym( libp, "sigsetjmp",	ADDRESSOF( sigsetjmp ) );*)
-		(*Dlsym( libc, "siglongjmp",	ADDRESSOF( siglongjmp ) );*)
+		Dlsym( libc, "siglongjmp",	ADDRESSOF( siglongjmp ) );
 
 
 
 
 		Dlsym( libc, "malloc",		ADDRESSOF( malloc ) );
 		Dlsym( libc, "malloc",		ADDRESSOF( malloc ) );
@@ -1198,7 +1186,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		Dlsym( libx, "XSetIOErrorHandler", ADDRESS OF xSetIOErrorHandler);
 		Dlsym( libx, "XSetIOErrorHandler", ADDRESS OF xSetIOErrorHandler);
 
 
 		getSysinfo;
 		getSysinfo;
-		
+				
 		CreateSignalStack;
 		CreateSignalStack;
 		InitSignalHandler;
 		InitSignalHandler;
 		
 		

+ 1 - 9
source/Generic.Unix.I386.Machine.Mod

@@ -706,9 +706,7 @@ END GetTimer;
 	VAR i: LONGINT;  a: ADDRESS;
 	VAR i: LONGINT;  a: ADDRESS;
 	BEGIN 
 	BEGIN 
 		i := 0;  
 		i := 0;  
-		WHILE i < MaxLocks DO  
-			TRACE(i);
-		mtx[i] := Unix.MtxInit(0);  INC( i )  END;   
+		WHILE i < MaxLocks DO  	mtx[i] := Unix.MtxInit(0);  INC( i )  END;   
 	END InitLocks;  
 	END InitLocks;  
 
 
 	PROCEDURE CleanupLocks*;  
 	PROCEDURE CleanupLocks*;  
@@ -1004,20 +1002,14 @@ END GetTimer;
 		COPY( Unix.Version, version );  Append( version, Version );
 		COPY( Unix.Version, version );  Append( version, Version );
 		timer0 := GetTimer( );  ticks := 0;
 		timer0 := GetTimer( );  ticks := 0;
 		InitThreads;
 		InitThreads;
-		TRACE(0);
 		InitLocks;
 		InitLocks;
-		TRACE(1);
 		traceHeap := 1 IN Glue.debug;
 		traceHeap := 1 IN Glue.debug;
 		InitConfig;
 		InitConfig;
-		TRACE(2);
 		InitLog;
 		InitLog;
-		TRACE(3);
 		CPUSpeed;
 		CPUSpeed;
-		TRACE(4);
 		IF CpuIdSupported() THEN
 		IF CpuIdSupported() THEN
 			CPUID( vendor, ver, features, features2 );	 SetupSSE2Ext
 			CPUID( vendor, ver, features, features2 );	 SetupSSE2Ext
 		END;
 		END;
-		TRACE(5);
 		fcr := (FCR() - {0,2,3,10,11}) + {0..5,8,9};	(* default FCR RC=00B *)
 		fcr := (FCR() - {0,2,3,10,11}) + {0..5,8,9};	(* default FCR RC=00B *)
 		TRACE("Machine Init End");
 		TRACE("Machine Init End");
 	END Init;
 	END Init;

+ 18 - 2
source/Generic.Unix.Objects.Mod

@@ -202,8 +202,13 @@ TYPE
 				context.r_bp := Machine.CurrentBP();
 				context.r_bp := Machine.CurrentBP();
 				context.r_pc := ADDRESS OF FindRoots;
 				context.r_pc := ADDRESS OF FindRoots;
 			END;
 			END;
-
+			
 			sp := context.r_sp; bp := context.r_bp; (*pc := context.r_pc;*)
 			sp := context.r_sp; bp := context.r_bp; (*pc := context.r_pc;*)
+
+			TRACE(context.r_si, context.r_di, context.r_bp, context.r_sp_x);
+			TRACE(context.r_bx, context.r_dx, context.r_cx, context.r_ax);
+			TRACE(context.r_pc, context.r_sp, context.fpc);
+			
 			TRACE(sp, bp, stackBottom);
 			TRACE(sp, bp, stackBottom);
 
 
 			IF Heaps.GCType= Heaps.HeuristicStackInspectionGC THEN
 			IF Heaps.GCType= Heaps.HeuristicStackInspectionGC THEN
@@ -217,8 +222,11 @@ TYPE
 			ELSIF Heaps.GCType = Heaps.MetaDataForStackGC THEN
 			ELSIF Heaps.GCType = Heaps.MetaDataForStackGC THEN
 				IF bp < stackBottom THEN
 				IF bp < stackBottom THEN
 					WHILE (bp # Heaps.NilVal) & (bp > 1024) & (bp < stackBottom)  DO (* do not test for bp >= sp: could be wrong temporarily! *)
 					WHILE (bp # Heaps.NilVal) & (bp > 1024) & (bp < stackBottom)  DO (* do not test for bp >= sp: could be wrong temporarily! *)
+						TRACE(bp);
 						S.GET(bp, n);
 						S.GET(bp, n);
+						TRACE(n);
 						IF ODD(n) THEN (* procedure descriptor at bp *)
 						IF ODD(n) THEN (* procedure descriptor at bp *)
+							IF n > 1024 THEN
 							desc := S.VAL(Modules.ProcedureDescPointer, n-1);
 							desc := S.VAL(Modules.ProcedureDescPointer, n-1);
 							IF desc # NIL THEN
 							IF desc # NIL THEN
 								a0 := ADDRESSOF(desc.offsets);
 								a0 := ADDRESSOF(desc.offsets);
@@ -232,10 +240,12 @@ TYPE
 									END;
 									END;
 								END;
 								END;
 							END;
 							END;
+							END;
 							S.GET(bp + SIZEOF(ADDRESS), bp);
 							S.GET(bp + SIZEOF(ADDRESS), bp);
 						ELSE (* classical stack frame *)
 						ELSE (* classical stack frame *)
 							bp := n; 
 							bp := n; 
 						END;
 						END;
+						TRACE(bp);
 					END;
 					END;
 					
 					
 					ASSERT((bp = stackBottom) OR (bp<1024) ,12345);
 					ASSERT((bp = stackBottom) OR (bp<1024) ,12345);
@@ -713,11 +723,17 @@ TYPE
 	(*--------------------  Garbage Collection  ------------------------------------*)
 	(*--------------------  Garbage Collection  ------------------------------------*)
 	
 	
 	PROCEDURE GetContext(ctxt: Unix.Ucontext);
 	PROCEDURE GetContext(ctxt: Unix.Ucontext);
-	VAR t: Process;
+	VAR t: Process; bp: ADDRESS;
 	BEGIN
 	BEGIN
 		t := CurrentProcess();
 		t := CurrentProcess();
 		TRACE(t, t.threadId);
 		TRACE(t, t.threadId);
+		TRACE(Machine.CurrentBP(), ctxt.mc.r_bp);
 		Unix.CopyContext(ctxt.mc, t.context);
 		Unix.CopyContext(ctxt.mc, t.context);
+		bp := Machine.CurrentBP(); 
+		TRACE(bp);
+		S.GET(bp+4, bp); 
+		TRACE(bp);
+		t.context.r_bp := bp;
 	END GetContext;
 	END GetContext;
 	
 	
 	PROCEDURE SuspendActivities;
 	PROCEDURE SuspendActivities;