Explorar el Código

Added basic support for restoring context

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7327 8c9fc860-2736-0410-a75d-ab315db34111
negelef hace 7 años
padre
commit
85e53c4a26

+ 5 - 3
source/Activities.Mod

@@ -134,6 +134,8 @@ VAR working, physicalProcessors, virtualProcessors: Counters.AlignedCounter;
 (** The scheduler stops its execution if all processors are idle, unless there are activities waiting for interrupts. *)
 VAR awaiting*: Counters.AlignedCounter;
 
+PROCEDURE StoreActivity EXTERN "Environment.StoreActivity";
+
 PROCEDURE GetProcessTime-(): HUGEINT;
 VAR activity: Activity; diff: Timer.Counter;
 BEGIN{UNCOOPERATIVE, UNCHECKED}
@@ -239,7 +241,7 @@ BEGIN {UNCOOPERATIVE, UNCHECKED}
 	nextActivity.processor.runningActivity := nextActivity;
 	nextActivity.startTime := Timer.GetCounter();
 	activity := NIL;
-	SYSTEM.SetActivity (nextActivity);
+	SYSTEM.SetActivity (nextActivity); StoreActivity;
 	SYSTEM.SetFramePointer (nextActivity.framePointer);
 END SwitchTo;
 
@@ -295,9 +297,9 @@ PROCEDURE CallVirtual- (procedure: PROCEDURE (value: ADDRESS); value: ADDRESS; p
 VAR currentActivity {UNTRACED}: Activity; stackPointer: ADDRESS;
 BEGIN {UNCOOPERATIVE, UNCHECKED}
 	ASSERT (processor # NIL);
-	currentActivity := SYSTEM.GetActivity ()(Activity); stackPointer := SYSTEM.GetStackPointer (); SYSTEM.SetActivity (processor);
+	currentActivity := SYSTEM.GetActivity ()(Activity); stackPointer := SYSTEM.GetStackPointer (); SYSTEM.SetActivity (processor); StoreActivity;
 	SYSTEM.SetStackPointer (ADDRESS OF processor.stack[LEN (processor.stack) - CPU.StackDisplacement]);
-	procedure (value); SYSTEM.SetActivity (currentActivity); SYSTEM.SetStackPointer (stackPointer);
+	procedure (value); SYSTEM.SetActivity (currentActivity); StoreActivity; SYSTEM.SetStackPointer (stackPointer);
 END CallVirtual;
 
 (** Creates a new activity that calls the specified procedure. *)

+ 8 - 0
source/BIOS.Environment.Mod

@@ -312,6 +312,14 @@ PROCEDURE GetInit- (n: SIZE; VAR val: LONGINT);
 BEGIN val := initRegs[n]
 END GetInit;
 
+PROCEDURE StoreActivity;
+BEGIN {UNCOOPERATIVE, UNCHECKED}
+END StoreActivity;
+
+PROCEDURE RestoreActivity;
+BEGIN {UNCOOPERATIVE, UNCHECKED}
+END RestoreActivity;
+
 PROCEDURE Initialize-;
 CONST Channel0 = 0; RateGenerator = 4;
 BEGIN {UNCOOPERATIVE, UNCHECKED}

+ 2 - 1
source/Coop.Win32.Kernel32.Mod

@@ -782,8 +782,9 @@ VAR
 	PROCEDURE {WINAPI} ExceptionHandler( VAR excpRec: ExceptionRecord; excpFrame: ExcpFrmPtr;
 	 										VAR context: Context;  dispatch: LONGINT ): LONGINT;
 	PROCEDURE Trap EXTERN "Runtime.Trap" (number: SIZE);
+	PROCEDURE RestoreActivity EXTERN "Environment.RestoreActivity";
 	BEGIN {UNCOOPERATIVE, UNCHECKED}
-		SYSTEM.SetActivity (context.ECX);
+		RestoreActivity;
 		Trap (excpRec.ExceptionCode);
 	END ExceptionHandler;
 

+ 8 - 0
source/RPI.Environment.Mod

@@ -170,6 +170,14 @@ BEGIN {UNCOOPERATIVE, UNCHECKED}
 	END;
 END Blink;
 
+PROCEDURE StoreActivity;
+BEGIN {UNCOOPERATIVE, UNCHECKED}
+END StoreActivity;
+
+PROCEDURE RestoreActivity;
+BEGIN {UNCOOPERATIVE, UNCHECKED}
+END RestoreActivity;
+
 PROCEDURE Initialize-;
 VAR i: LONGINT;
 BEGIN {UNCOOPERATIVE, UNCHECKED}

+ 13 - 0
source/Win32.Environment.Mod

@@ -12,6 +12,7 @@ CONST Running* = 0; ShuttingDown* = 1; Rebooting* = 2;
 CONST DefaultConfigFile = "aos.ini";
 CONST UserConfigFile = "myaos.ini";
 
+VAR activity: WORD;
 VAR status* := 0: WORD;
 VAR heap: Kernel32.HANDLE;
 VAR sleepingQueue: Queues.Queue;
@@ -217,9 +218,20 @@ PROCEDURE GetInit- (n: SIZE; VAR val: LONGINT);
 BEGIN val := 0;
 END GetInit;
 
+PROCEDURE StoreActivity;
+BEGIN {UNCOOPERATIVE, UNCHECKED}
+	Kernel32.TlsSetValue(activity, SYSTEM.VAL(ADDRESS, SYSTEM.GetActivity ()));
+END StoreActivity;
+
+PROCEDURE RestoreActivity;
+BEGIN {UNCOOPERATIVE, UNCHECKED}
+	SYSTEM.SetActivity(SYSTEM.VAL(Activities.Activity,Kernel32.TlsGetValue(activity)));
+END RestoreActivity;
+
 PROCEDURE Initialize-;
 VAR trace: ARRAY 32 OF CHAR;
 BEGIN {UNCOOPERATIVE, UNCHECKED}
+	activity := Kernel32.TlsAlloc();
 	heap := Kernel32.GetProcessHeap();
 	stdout := Kernel32.GetStdHandle(Kernel32.STDOutput);
 
@@ -248,6 +260,7 @@ END Initialize;
 
 PROCEDURE Terminate-;
 BEGIN {UNCOOPERATIVE, UNCHECKED}
+	Kernel32.TlsFree(activity);
 END Terminate;
 
 BEGIN

+ 8 - 0
source/Zynq.Environment.Mod

@@ -103,6 +103,14 @@ BEGIN {UNCOOPERATIVE, UNCHECKED}
 	memory := MemorySize - ADDRESS OF KernelEnd;
 END InitMemory;
 
+PROCEDURE StoreActivity;
+BEGIN {UNCOOPERATIVE, UNCHECKED}
+END StoreActivity;
+
+PROCEDURE RestoreActivity;
+BEGIN {UNCOOPERATIVE, UNCHECKED}
+END RestoreActivity;
+
 PROCEDURE Initialize-;
 BEGIN {UNCOOPERATIVE, UNCHECKED}
 	CPU.Initialize; InitTrace; InitMemory;