DEADSOFTWARE

Kernel: fix kernels compilation and processor types
[cpc.git] / src / native / posix / 486 / System / Mod / Kernel.cp
index b4311ab3806cb2e76f31dc7dde9d587f577d203e..7853c5178860262ae65fb327a594d7b5c459697e 100644 (file)
@@ -15,7 +15,7 @@ MODULE Kernel;
     littleEndian* = TRUE;
     timeResolution* = 1000; (* ticks per second *)
 
-    processor* = 1;  (* generic c *)
+    processor* = 10;  (* 486 *)
 
     objType* = "ocf"; (* file types *)
     symType* = "osf";
@@ -202,8 +202,8 @@ MODULE Kernel;
     trapCount-: INTEGER;
     err-, pc-, sp-, fp-, stack-, val-: INTEGER;
 
-    isTry: BOOLEAN;
-    startEnv: setjmp.sigjmp_buf;
+    isTry, checkReadable: BOOLEAN;
+    startEnv, checkReadableEnv: setjmp.sigjmp_buf;
     tryEnv: setjmp.jmp_buf;
 
     argc-: INTEGER;
@@ -519,28 +519,27 @@ MODULE Kernel;
     FreeMem(modAdr, modSize)
   END InvalModMem;
 
-  PROCEDURE TryRead (from, to, c: INTEGER);
-    VAR i: INTEGER; x: BYTE;
+  PROCEDURE IsReadable* (from, to: INTEGER): BOOLEAN;
+    VAR r: BOOLEAN; jmp: setjmp.sigjmp_buf; res: setjmp.int; i: INTEGER; x: BYTE;
   BEGIN
-    IF from <= to THEN
-      FOR i := from TO to DO
-        S.GET(i, x)
-      END
-    ELSE
-      FOR i := to TO from BY -1 DO
-        S.GET(i, x)
+    r := checkReadable;
+    jmp := checkReadableEnv;
+    checkReadable := TRUE;
+    res := setjmp.sigsetjmp(checkReadableEnv, 1);
+    IF res = 0 THEN
+      IF from <= to THEN
+        FOR i := from TO to DO
+          S.GET(i, x)
+        END
+      ELSE
+        FOR i := to TO from BY -1 DO
+          S.GET(i, x)
+        END
       END
     END;
-  END TryRead;
-
-  PROCEDURE^ Try* (h: TryHandler; a, b, c: INTEGER);
-
-  PROCEDURE IsReadable* (from, to: INTEGER): BOOLEAN;
-    VAR i: INTEGER;
-  BEGIN
-    i := trapCount;
-    Try(TryRead, from, to, 0);
-    RETURN trapCount = i
+    checkReadableEnv := jmp;
+    checkReadable := r;
+    RETURN res = 0
   END IsReadable;
 
   (* --------------------- NEW implementation (portable) -------------------- *)
@@ -588,9 +587,9 @@ MODULE Kernel;
     | 9: eltyp := S.ADR(Char16Type)
     | 10: eltyp := S.ADR(Int64Type)
     | 11: eltyp := S.ADR(ProcType)
-    | 12: HALT(101)  (* COM interface pointers not supported *)
+    | 12: eltyp := S.ADR(UPtrType)
     ELSE
-      ASSERT(~ODD(eltyp), 102)  (* COM interface pointers not supported *)
+      ASSERT(~ODD(eltyp), 101)  (* COM interface pointers not supported *)
     END;
     t := S.VAL(Type, eltyp);
     headSize := 4 * nofdim + 12;
@@ -1645,6 +1644,9 @@ MODULE Kernel;
   PROCEDURE [ccall] TrapHandler (signo: signal.int; IN info: signal.siginfo_t; context: ADDRESS);
     VAR res: signal.int;
   BEGIN
+    IF checkReadable THEN
+      setjmp.siglongjmp(checkReadableEnv, 1)
+    END;
     IF trapped THEN
       DefaultTrapViewer;
       IF ~secondTrap THEN trapped := FALSE; secondTrap := TRUE END
@@ -1678,8 +1680,14 @@ MODULE Kernel;
         pc := info.info.sigill.si_addr;
         err := 202; (* illigal instruction *)
         IF IsReadable(pc, pc + 4) THEN
-          S.GET(pc, val)
-          (* !!! err := halt code *)
+          S.GET(pc, val);
+          IF val MOD 100H = 8DH THEN (* lea reg,reg *)
+            IF val DIV 100H MOD 100H = 0F0H THEN
+              err := val DIV 10000H MOD 100H (* trap *)
+            ELSIF val DIV 1000H MOD 10H = 0EH THEN
+              err := 128 + val DIV 100H MOD 10H (* run time error *)
+            END
+          END
         END;
     ELSE (* unknown *)
     END;