Parcourir la 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 il y a 9 ans
Parent
commit
dcb8ceb665

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

@@ -22,6 +22,9 @@ VAR
 	stackBottom-	: ADDRESS;	(* of main thread *)
 
 
+	argc-: WORD; 
+	argv-: ADDRESS;
+
 	PROCEDURE {INITIAL, NOPAF} EntryPoint;
 	CODE
 		; ELF header
@@ -175,6 +178,7 @@ VAR
 		
 		Trace.Init;
 		Trace.Char := Char;
+		
 		stackBottom := ADDRESSOF( i ) + 2*SIZEOF(ADDRESS);
 		ASSERT(dlsym # NIL);
 		Dlsym(0,"dlopen", ADDRESS OF dlopen);
@@ -183,14 +187,16 @@ VAR
 		ASSERT(dlclose # NIL); 
 		Dlsym(0,"exit", ADDRESS OF exit);
 		ASSERT(exit # NIL);
-		
-		TRACE(ADDRESS OF last);
-		TRACE(base);
-		TRACE(ADDRESS OF last - base);
 	END Init;
 	
 	PROCEDURE {INITIAL,NOPAF} Init0;
 	BEGIN
+		CODE{SYSTEM.i386}
+			MOV EAX, [ESP]
+			MOV argc, EAX
+			LEA EAX, [ESP+4]
+			MOV argv, EAX
+		END;
 		Init;
 	END Init0;
 	
@@ -205,10 +211,12 @@ BEGIN
 	Trace.String("Glue loaded"); Trace.Ln;
 END Glue.
 
+
+
 SystemTools.FreeDownTo FoxIntermediateBackend ~
 
 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 
 		Generic.Unix.Objects.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 ~
-		~ 
+~ 
+
+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 ~
 #	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 
 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 
 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 

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

@@ -244,21 +244,23 @@ CONST
 	HUPCL*		= {10};
 	CLOCAL*	= {11};
 	
+	(*
 	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_SETREGS    = 13;
-
+	*)
+	
 TYPE
 	Termios* = RECORD
 		iflags*, oflags*, cflags*, lflags*: SET;
@@ -346,24 +348,24 @@ TYPE
 
 	Mcontext* = POINTER TO McontextDesc;
 	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_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_err-		: LONGINT;
-				r_pc *	: LONGINT;
-				r_cs-		: LONGINT;
+				r_pc *	: ADDRESS;
+				r_cs-		: ADDRESS;
 				r_flags-	: LONGINT;
-				r_sp *	: LONGINT;		(* sp at error (signal) *)
+				r_sp *	: ADDRESS;		(* sp at error (signal) *)
 				r_ss-		: LONGINT;
 				fpc-		: ADDRESS; 	(* FPcontext *)
 				oldmask-	: LONGINT;
@@ -388,13 +390,32 @@ TYPE
 		ss: WORD;
 	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;
-	aargc: ADDRESS;
 
 	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;
 	
@@ -490,7 +511,9 @@ VAR
 	readdir-		: PROCEDURE {C} ( dir: ADDRESS ): Dirent;
 	closedir-		: PROCEDURE {C} ( dir: ADDRESS );
 
+	(*
 	sigsetjmp-	: PROCEDURE {C} ( env: ADDRESS;  savemask: LONGINT ): LONGINT;
+	*)
 	siglongjmp-	: PROCEDURE {C} ( env: ADDRESS;  val: LONGINT );
 
 	kill-			: PROCEDURE {C} ( pid, sig: LONGINT ): LONGINT;
@@ -656,10 +679,6 @@ VAR
 	    sigdelset( ADDRESS OF new, SIGSEGV );
 	    sigdelset( ADDRESS OF new, SIGTERM );
 	    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_setcancelstate( PTHREAD_CANCEL_ENABLE, NIL );
@@ -717,12 +736,11 @@ VAR
 	    END;  
     END ThrKill;
     
+    (* did not work 
     PROCEDURE TraceThread*(p: Thread_t);
     VAR regs: PtraceRegsStruct; res: WORD;
     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; 
     	TRACE(res);
     	res := ptrace(PTRACE_GETREGS,p,NIL, ADDRESS OF regs);
@@ -732,69 +750,49 @@ VAR
     	TRACE(regs.ebp, regs.esp, regs.IP, regs.flags);
     	res := ptrace(PTRACE_DETACH, p, NIL, NIL);
     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;
 	VAR
@@ -1005,9 +1003,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 				ctime-	: Timeval;
 				unused-	: ARRAY 2 OF LONGINT;
 		*)
-			TRACE(fd);
 		res := fxstat(3, fd, buf);
-		TRACE(res, buf.ino, buf.rdev, buf.size);
 		RETURN res;
 	END fstat;
 
@@ -1066,16 +1062,12 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 	END InitXErrorHandlers;
 	
 	PROCEDURE Init;
-	VAR test: ADDRESS; 
+	VAR test: ADDRESS; i: LONGINT; s: ARRAY 256 OF CHAR;
 	BEGIN
 		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[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, "sigsuspend", ADDRESSOF(sigsuspend));
 				
-		(*
-		Dlsym( libc, "putc", ADDRESSOF(test));
-		*)
-		
 		Dlsym( libc, "read",		ADDRESSOF( read ) );
 		Dlsym( libc, "write",	ADDRESSOF( write ) );
 		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( libc, "siglongjmp",	ADDRESSOF( siglongjmp ) );*)
+		Dlsym( libc, "siglongjmp",	ADDRESSOF( siglongjmp ) );
 
 
 		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);
 
 		getSysinfo;
-		
+				
 		CreateSignalStack;
 		InitSignalHandler;
 		

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

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

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

@@ -202,8 +202,13 @@ TYPE
 				context.r_bp := Machine.CurrentBP();
 				context.r_pc := ADDRESS OF FindRoots;
 			END;
-
+			
 			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);
 
 			IF Heaps.GCType= Heaps.HeuristicStackInspectionGC THEN
@@ -217,8 +222,11 @@ TYPE
 			ELSIF Heaps.GCType = Heaps.MetaDataForStackGC THEN
 				IF bp < stackBottom THEN
 					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);
+						TRACE(n);
 						IF ODD(n) THEN (* procedure descriptor at bp *)
+							IF n > 1024 THEN
 							desc := S.VAL(Modules.ProcedureDescPointer, n-1);
 							IF desc # NIL THEN
 								a0 := ADDRESSOF(desc.offsets);
@@ -232,10 +240,12 @@ TYPE
 									END;
 								END;
 							END;
+							END;
 							S.GET(bp + SIZEOF(ADDRESS), bp);
 						ELSE (* classical stack frame *)
 							bp := n; 
 						END;
+						TRACE(bp);
 					END;
 					
 					ASSERT((bp = stackBottom) OR (bp<1024) ,12345);
@@ -713,11 +723,17 @@ TYPE
 	(*--------------------  Garbage Collection  ------------------------------------*)
 	
 	PROCEDURE GetContext(ctxt: Unix.Ucontext);
-	VAR t: Process;
+	VAR t: Process; bp: ADDRESS;
 	BEGIN
 		t := CurrentProcess();
 		TRACE(t, t.threadId);
+		TRACE(Machine.CurrentBP(), ctxt.mc.r_bp);
 		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;
 	
 	PROCEDURE SuspendActivities;