|
@@ -3,7 +3,7 @@ MODULE Kernel;
|
|
|
(* THIS IS TEXT COPY OF Kernel.odc *)
|
|
|
(* DO NOT EDIT *)
|
|
|
|
|
|
- (* A. V. Shiryaev, 2012.09
|
|
|
+ (* A. V. Shiryaev, 2012.11
|
|
|
Linux Kernel
|
|
|
Based on 1.6-rc6 Windows Kernel
|
|
|
+ 20120822 Marc changes
|
|
@@ -16,7 +16,6 @@ MODULE Kernel;
|
|
|
|
|
|
TODO:
|
|
|
handle stack overflow exceptions
|
|
|
- correct cmdLine
|
|
|
Quit from TrapHandler
|
|
|
*)
|
|
|
|
|
@@ -278,10 +277,8 @@ MODULE Kernel;
|
|
|
currentTryContext: POINTER TO Libc.sigjmp_buf; (* trap return context, if Kernel.Try has been used. *)
|
|
|
isReadableContext: Libc.sigjmp_buf; (* for IsReadable *)
|
|
|
isReadableCheck: BOOLEAN;
|
|
|
-
|
|
|
+
|
|
|
guiHook: GuiHook;
|
|
|
-
|
|
|
- cmdLine-: ARRAY 1024 OF CHAR;
|
|
|
|
|
|
(* !!! This variable has to be the last variable in the list. !!! *)
|
|
|
bootInfo-: BootInfo;
|
|
@@ -496,7 +493,7 @@ MODULE Kernel;
|
|
|
|
|
|
(* -------------------- system memory management --------------------- *)
|
|
|
|
|
|
- (* A. V. Shiryaev, 2012.09: NOTE: it seems that GC works correctly with positive addesses only *)
|
|
|
+ (* A. V. Shiryaev, 2012.10: NOTE: it seems that GC works correctly with positive addesses only *)
|
|
|
|
|
|
(*
|
|
|
PROCEDURE HeapAlloc (adr: INTEGER; size: INTEGER; prot: SET): Libc.PtrVoid;
|
|
@@ -1147,18 +1144,64 @@ MODULE Kernel;
|
|
|
END
|
|
|
END GetRefProc;
|
|
|
|
|
|
+ (* A. V. Shiryaev, 2012.11 *)
|
|
|
+ PROCEDURE CheckRefVarReadable (ref: INTEGER): BOOLEAN;
|
|
|
+ VAR ok: BOOLEAN; ch: SHORTCHAR;
|
|
|
+ p: INTEGER; (* address *)
|
|
|
+
|
|
|
+ PROCEDURE Get;
|
|
|
+ BEGIN
|
|
|
+ IF ok THEN
|
|
|
+ IF IsReadable(ref, ref+1) THEN (* S.GET(ref, ch); INC(ref) *) RefCh(ref, ch)
|
|
|
+ ELSE ok := FALSE
|
|
|
+ END
|
|
|
+ END
|
|
|
+ END Get;
|
|
|
+
|
|
|
+ PROCEDURE Num;
|
|
|
+ BEGIN
|
|
|
+ Get; WHILE ok & (ORD(ch) >= 128) DO Get END
|
|
|
+ END Num;
|
|
|
+
|
|
|
+ PROCEDURE Name;
|
|
|
+ BEGIN
|
|
|
+ Get; WHILE ok & (ch # 0X) DO Get END
|
|
|
+ END Name;
|
|
|
+
|
|
|
+ BEGIN
|
|
|
+ ok := TRUE;
|
|
|
+ Get; (* mode *)
|
|
|
+ IF ok & (ch >= 0FDX) THEN
|
|
|
+ Get; (* form *)
|
|
|
+ IF ok & (ch = 10X) THEN
|
|
|
+ IF IsReadable(ref, ref + 4) THEN (* desc *)
|
|
|
+ S.GET(ref, p); INC(ref, 4);
|
|
|
+ ok := IsReadable(p + 2 * 4, p + 3 * 4) (* desc.id *)
|
|
|
+ ELSE ok := FALSE
|
|
|
+ END
|
|
|
+ END;
|
|
|
+ Num; Name
|
|
|
+ END;
|
|
|
+ RETURN ok
|
|
|
+ END CheckRefVarReadable;
|
|
|
+
|
|
|
PROCEDURE GetRefVar* (VAR ref: INTEGER; VAR mode, form: SHORTCHAR; VAR desc: Type;
|
|
|
VAR adr: INTEGER; VAR name: Name);
|
|
|
BEGIN
|
|
|
- S.GET(ref, mode); desc := NIL;
|
|
|
- IF mode >= 0FDX THEN
|
|
|
- mode := SHORT(CHR(ORD(mode) - 0FCH));
|
|
|
- INC(ref); RefCh(ref, form);
|
|
|
- IF form = 10X THEN
|
|
|
- S.GET(ref, desc); INC(ref, 4); form := SHORT(CHR(16 + desc.id MOD 4))
|
|
|
- END;
|
|
|
- RefNum(ref, adr); RefName(ref, name)
|
|
|
+ IF CheckRefVarReadable(ref) THEN
|
|
|
+ S.GET(ref, mode); desc := NIL;
|
|
|
+ IF mode >= 0FDX THEN
|
|
|
+ mode := SHORT(CHR(ORD(mode) - 0FCH));
|
|
|
+ INC(ref); RefCh(ref, form);
|
|
|
+ IF form = 10X THEN
|
|
|
+ S.GET(ref, desc); INC(ref, 4); form := SHORT(CHR(16 + desc.id MOD 4))
|
|
|
+ END;
|
|
|
+ RefNum(ref, adr); RefName(ref, name)
|
|
|
+ ELSE
|
|
|
+ mode := 0X; form := 0X; adr := 0
|
|
|
+ END
|
|
|
ELSE
|
|
|
+ Msg("Kernel.GetRefVar failed!"); Int(ref);
|
|
|
mode := 0X; form := 0X; adr := 0
|
|
|
END
|
|
|
END GetRefVar;
|
|
@@ -2011,32 +2054,13 @@ MODULE Kernel;
|
|
|
told := 0; shift := 0
|
|
|
END Init;
|
|
|
|
|
|
- PROCEDURE SetCmdLine;
|
|
|
- VAR i, l: INTEGER;
|
|
|
- BEGIN
|
|
|
- l := LEN(cmdLine);
|
|
|
- cmdLine := bootInfo.argv[0]$;
|
|
|
- FOR i := 1 TO bootInfo.argc - 1 DO cmdLine := cmdLine + " " + bootInfo.argv[i]END
|
|
|
- END SetCmdLine;
|
|
|
-
|
|
|
- PROCEDURE SetCmdLine2;
|
|
|
- VAR x: Libc.PtrSTR;
|
|
|
- BEGIN
|
|
|
- x := Libc.getenv("CMDLINE");
|
|
|
- IF x # NIL THEN
|
|
|
- cmdLine := x$
|
|
|
- END
|
|
|
- END SetCmdLine2;
|
|
|
-
|
|
|
BEGIN
|
|
|
IF modList = NIL THEN (* only once *)
|
|
|
S.GETREG(SP, baseStack); (* TODO: Check that this is ok. *)
|
|
|
IF bootInfo # NIL THEN
|
|
|
- modList := bootInfo.modList; (* boot loader initializes the bootInfo struct *)
|
|
|
- SetCmdLine
|
|
|
+ modList := bootInfo.modList (* boot loader initializes the bootInfo struct *)
|
|
|
ELSE
|
|
|
- S.GETREG(ML, modList); (* linker loads module list to BX *)
|
|
|
- SetCmdLine2
|
|
|
+ S.GETREG(ML, modList) (* linker loads module list to BX *)
|
|
|
END;
|
|
|
static := init IN modList.opts;
|
|
|
inDll := dll IN modList.opts;
|