X-Git-Url: https://deadsoftware.ru/gitweb?p=cpc.git;a=blobdiff_plain;f=src%2Fnative%2Fposix%2F486%2FSystem%2FMod%2FKernel.cp;h=93ccf251f7e6b00207a1dbe799004268b0f7b6ae;hp=b4311ab3806cb2e76f31dc7dde9d587f577d203e;hb=7f31515b8ffa0954d6b96af35a3925ab82800ae2;hpb=4257db65ead872485357beb6f30c0f0fa6e7009c diff --git a/src/native/posix/486/System/Mod/Kernel.cp b/src/native/posix/486/System/Mod/Kernel.cp index b4311ab..93ccf25 100644 --- a/src/native/posix/486/System/Mod/Kernel.cp +++ b/src/native/posix/486/System/Mod/Kernel.cp @@ -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) -------------------- *) @@ -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;