Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. (*
  2.     BSD 2-Clause License
  3.  
  4.     Copyright (c) 2019-2020, Anton Krotov
  5.     All rights reserved.
  6. *)
  7.  
  8. MODULE LINAPI;
  9.  
  10. IMPORT SYSTEM, API;
  11.  
  12.  
  13. TYPE
  14.  
  15.     TP* = API.TP;
  16.     SOFINI* = API.SOFINI;
  17.  
  18.  
  19. VAR
  20.  
  21.     argc*, envc*: INTEGER;
  22.  
  23.     libc*, librt*: INTEGER;
  24.  
  25.     stdout*,
  26.     stdin*,
  27.     stderr*        : INTEGER;
  28.  
  29.     malloc*        : PROCEDURE [linux] (size: INTEGER): INTEGER;
  30.     free*          : PROCEDURE [linux] (ptr: INTEGER);
  31.     exit*          : PROCEDURE [linux] (code: INTEGER);
  32.     puts*          : PROCEDURE [linux] (pStr: INTEGER);
  33.     fwrite*,
  34.     fread*         : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER;
  35.     fopen*         : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER;
  36.     fclose*        : PROCEDURE [linux] (file: INTEGER): INTEGER;
  37.     time*          : PROCEDURE [linux] (ptr: INTEGER): INTEGER;
  38.  
  39.     clock_gettime* : PROCEDURE [linux] (clock_id: INTEGER; VAR tp: TP): INTEGER;
  40.  
  41.  
  42. PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
  43. VAR
  44.     i, len, ptr: INTEGER;
  45.     c: CHAR;
  46.  
  47. BEGIN
  48.     i := 0;
  49.     len := LEN(s) - 1;
  50.     IF (0 <= n) & (n <= argc + envc) & (n # argc) & (len > 0) THEN
  51.         SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr);
  52.         REPEAT
  53.             SYSTEM.GET(ptr, c);
  54.             s[i] := c;
  55.             INC(i);
  56.             INC(ptr)
  57.         UNTIL (c = 0X) OR (i = len)
  58.     END;
  59.     s[i] := 0X
  60. END GetArg;
  61.  
  62.  
  63. PROCEDURE GetEnv* (n: INTEGER; VAR s: ARRAY OF CHAR);
  64. BEGIN
  65.     IF (0 <= n) & (n < envc) THEN
  66.         GetArg(n + argc + 1, s)
  67.     ELSE
  68.         s[0] := 0X
  69.     END
  70. END GetEnv;
  71.  
  72.  
  73. PROCEDURE SetFini* (ProcFini: SOFINI);
  74. BEGIN
  75.     API.SetFini(ProcFini)
  76. END SetFini;
  77.  
  78.  
  79. PROCEDURE init;
  80. VAR
  81.     ptr: INTEGER;
  82.  
  83. BEGIN
  84.     IF API.MainParam # 0 THEN
  85.         envc := -1;
  86.         SYSTEM.GET(API.MainParam, argc);
  87.         REPEAT
  88.             SYSTEM.GET(API.MainParam + (envc + argc + 3) * SYSTEM.SIZE(INTEGER), ptr);
  89.             INC(envc)
  90.         UNTIL ptr = 0
  91.     ELSE
  92.         envc := 0;
  93.         argc := 0
  94.     END;
  95.  
  96.     libc := API.libc;
  97.  
  98.     stdout := API.stdout;
  99.     stdin  := API.stdin;
  100.     stderr := API.stderr;
  101.  
  102.     malloc := API.malloc;
  103.     free   := API.free;
  104.     exit   := API._exit;
  105.     puts   := API.puts;
  106.     fwrite := API.fwrite;
  107.     fread  := API.fread;
  108.     fopen  := API.fopen;
  109.     fclose := API.fclose;
  110.     time   := API.time;
  111.  
  112.     librt := API.librt;
  113.  
  114.     clock_gettime := API.clock_gettime
  115. END init;
  116.  
  117.  
  118. PROCEDURE [stdcall64-] syscall* (rax, rdi, rsi, rdx, r10, r8, r9: INTEGER): INTEGER;
  119. BEGIN
  120.     SYSTEM.CODE(
  121.     048H, 08BH, 045H, 010H,  (*  mov rax, qword [rbp + 16]  *)
  122.     048H, 08BH, 07DH, 018H,  (*  mov rdi, qword [rbp + 24]  *)
  123.     048H, 08BH, 075H, 020H,  (*  mov rsi, qword [rbp + 32]  *)
  124.     048H, 08BH, 055H, 028H,  (*  mov rdx, qword [rbp + 40]  *)
  125.     04CH, 08BH, 055H, 030H,  (*  mov r10, qword [rbp + 48]  *)
  126.     04CH, 08BH, 045H, 038H,  (*  mov r8,  qword [rbp + 56]  *)
  127.     04CH, 08BH, 04DH, 040H,  (*  mov r9,  qword [rbp + 64]  *)
  128.     00FH, 005H,              (*  syscall                    *)
  129.     0C9H,                    (*  leave                      *)
  130.     0C2H, 038H, 000H         (*  ret 56                     *)
  131.     )
  132.     RETURN 0
  133. END syscall;
  134.  
  135.  
  136. BEGIN
  137.     init
  138. END LINAPI.