Subversion Repositories Kolibri OS

Rev

Rev 7983 | 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, Libdl;
  11.  
  12.  
  13. TYPE
  14.  
  15.     TP* = ARRAY 2 OF INTEGER;
  16.     SOFINI* = PROCEDURE;
  17.  
  18.  
  19. VAR
  20.  
  21.     libc*, librt*: INTEGER;
  22.  
  23.     stdout*,
  24.     stdin*,
  25.     stderr*        : INTEGER;
  26.  
  27.     malloc*        : PROCEDURE [linux] (size: INTEGER): INTEGER;
  28.     free*          : PROCEDURE [linux] (ptr: INTEGER);
  29.     exit*          : PROCEDURE [linux] (code: INTEGER);
  30.     puts*          : PROCEDURE [linux] (pStr: INTEGER);
  31.     fwrite*,
  32.     fread*         : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER;
  33.     fopen*         : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER;
  34.     fclose*        : PROCEDURE [linux] (file: INTEGER): INTEGER;
  35.     time*          : PROCEDURE [linux] (ptr: INTEGER): INTEGER;
  36.  
  37.     clock_gettime* : PROCEDURE [linux] (clock_id: INTEGER; VAR tp: TP): INTEGER;
  38.  
  39.  
  40. PROCEDURE SetFini* (ProcFini: SOFINI);
  41. BEGIN
  42.     API.SetFini(ProcFini)
  43. END SetFini;
  44.  
  45.  
  46. PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
  47. VAR
  48.     sym: INTEGER;
  49.  
  50. BEGIN
  51.     sym := Libdl.sym(lib, name);
  52.     ASSERT(sym # 0);
  53.     SYSTEM.PUT(VarAdr, sym)
  54. END GetSym;
  55.  
  56.  
  57. PROCEDURE init;
  58. BEGIN
  59.     libc := API.libc;
  60.  
  61.     GetSym(libc, "exit",   SYSTEM.ADR(exit));
  62.     GetSym(libc, "puts",   SYSTEM.ADR(puts));
  63.     GetSym(libc, "malloc", SYSTEM.ADR(malloc));
  64.     GetSym(libc, "free",   SYSTEM.ADR(free));
  65.     GetSym(libc, "fread",  SYSTEM.ADR(fread));
  66.     GetSym(libc, "fwrite", SYSTEM.ADR(fwrite));
  67.     GetSym(libc, "fopen",  SYSTEM.ADR(fopen));
  68.     GetSym(libc, "fclose", SYSTEM.ADR(fclose));
  69.     GetSym(libc, "time",   SYSTEM.ADR(time));
  70.  
  71.     GetSym(libc, "stdout", SYSTEM.ADR(stdout)); SYSTEM.GET(stdout - SYSTEM.SIZE(INTEGER), stdout);
  72.     GetSym(libc, "stdin",  SYSTEM.ADR(stdin));  SYSTEM.GET(stdin  - SYSTEM.SIZE(INTEGER), stdin);
  73.     GetSym(libc, "stderr", SYSTEM.ADR(stderr)); SYSTEM.GET(stderr - SYSTEM.SIZE(INTEGER), stderr);
  74.  
  75.     librt := Libdl.open("librt.so.1", Libdl.LAZY);
  76.  
  77.     GetSym(librt, "clock_gettime", SYSTEM.ADR(clock_gettime))
  78. END init;
  79.  
  80.  
  81. PROCEDURE [stdcall64-] syscall* (rax, rdi, rsi, rdx, r10, r8, r9: INTEGER): INTEGER;
  82. BEGIN
  83.     SYSTEM.CODE(
  84.     048H, 08BH, 045H, 010H,  (*  mov rax, qword [rbp + 16]  *)
  85.     048H, 08BH, 07DH, 018H,  (*  mov rdi, qword [rbp + 24]  *)
  86.     048H, 08BH, 075H, 020H,  (*  mov rsi, qword [rbp + 32]  *)
  87.     048H, 08BH, 055H, 028H,  (*  mov rdx, qword [rbp + 40]  *)
  88.     04CH, 08BH, 055H, 030H,  (*  mov r10, qword [rbp + 48]  *)
  89.     04CH, 08BH, 045H, 038H,  (*  mov r8,  qword [rbp + 56]  *)
  90.     04CH, 08BH, 04DH, 040H,  (*  mov r9,  qword [rbp + 64]  *)
  91.     00FH, 005H,              (*  syscall                    *)
  92.     0C9H,                    (*  leave                      *)
  93.     0C2H, 038H, 000H         (*  ret 56                     *)
  94.     )
  95.     RETURN 0
  96. END syscall;
  97.  
  98.  
  99. BEGIN
  100.     init
  101. END LINAPI.