LINAPI.ob07 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2019-2021, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE LINAPI;
  7. IMPORT SYSTEM, API, Libdl;
  8. TYPE
  9. TP* = ARRAY 2 OF INTEGER;
  10. SOFINI* = PROCEDURE;
  11. VAR
  12. libc*, librt*: INTEGER;
  13. stdout*,
  14. stdin*,
  15. stderr* : INTEGER;
  16. malloc* : PROCEDURE [linux] (size: INTEGER): INTEGER;
  17. free* : PROCEDURE [linux] (ptr: INTEGER);
  18. exit* : PROCEDURE [linux] (code: INTEGER);
  19. puts* : PROCEDURE [linux] (pStr: INTEGER);
  20. fwrite*,
  21. fread* : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER;
  22. fopen* : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER;
  23. fclose* : PROCEDURE [linux] (file: INTEGER): INTEGER;
  24. time* : PROCEDURE [linux] (ptr: INTEGER): INTEGER;
  25. clock_gettime* : PROCEDURE [linux] (clock_id: INTEGER; VAR tp: TP): INTEGER;
  26. PROCEDURE SetFini* (ProcFini: SOFINI);
  27. BEGIN
  28. API.SetFini(ProcFini)
  29. END SetFini;
  30. PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
  31. VAR
  32. sym: INTEGER;
  33. BEGIN
  34. sym := Libdl.sym(lib, name);
  35. ASSERT(sym # 0);
  36. SYSTEM.PUT(VarAdr, sym)
  37. END GetSym;
  38. PROCEDURE init;
  39. BEGIN
  40. libc := API.libc;
  41. GetSym(libc, "exit", SYSTEM.ADR(exit));
  42. GetSym(libc, "puts", SYSTEM.ADR(puts));
  43. GetSym(libc, "malloc", SYSTEM.ADR(malloc));
  44. GetSym(libc, "free", SYSTEM.ADR(free));
  45. GetSym(libc, "fread", SYSTEM.ADR(fread));
  46. GetSym(libc, "fwrite", SYSTEM.ADR(fwrite));
  47. GetSym(libc, "fopen", SYSTEM.ADR(fopen));
  48. GetSym(libc, "fclose", SYSTEM.ADR(fclose));
  49. GetSym(libc, "time", SYSTEM.ADR(time));
  50. GetSym(libc, "stdout", SYSTEM.ADR(stdout)); SYSTEM.GET(stdout, stdout);
  51. GetSym(libc, "stdin", SYSTEM.ADR(stdin)); SYSTEM.GET(stdin, stdin);
  52. GetSym(libc, "stderr", SYSTEM.ADR(stderr)); SYSTEM.GET(stderr, stderr);
  53. librt := Libdl.open("librt.so.1", Libdl.LAZY);
  54. GetSym(librt, "clock_gettime", SYSTEM.ADR(clock_gettime))
  55. END init;
  56. $IF (CPU_X86)
  57. PROCEDURE [oberon-] syscall* (eax, ebx, ecx, edx, esi, edi: INTEGER): INTEGER;
  58. BEGIN
  59. SYSTEM.CODE(
  60. 053H, (* push ebx *)
  61. 056H, (* push esi *)
  62. 057H, (* push edi *)
  63. 08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *)
  64. 08BH, 05DH, 00CH, (* mov ebx, dword [ebp + 12] *)
  65. 08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *)
  66. 08BH, 055H, 014H, (* mov edx, dword [ebp + 20] *)
  67. 08BH, 075H, 018H, (* mov esi, dword [ebp + 24] *)
  68. 08BH, 07DH, 01CH, (* mov edi, dword [ebp + 28] *)
  69. 0CDH, 080H, (* int 128 *)
  70. 05FH, (* pop edi *)
  71. 05EH, (* pop esi *)
  72. 05BH, (* pop ebx *)
  73. 05DH, (* pop ebp *)
  74. 0C2H, 018H, 000H (* ret 24 *)
  75. )
  76. RETURN 0
  77. END syscall;
  78. $ELSIF (CPU_X8664)
  79. PROCEDURE [oberon-] syscall* (rax, rdi, rsi, rdx, r10, r8, r9: INTEGER): INTEGER;
  80. BEGIN
  81. SYSTEM.CODE(
  82. 048H, 08BH, 045H, 010H, (* mov rax, qword [rbp + 16] *)
  83. 048H, 08BH, 07DH, 018H, (* mov rdi, qword [rbp + 24] *)
  84. 048H, 08BH, 075H, 020H, (* mov rsi, qword [rbp + 32] *)
  85. 048H, 08BH, 055H, 028H, (* mov rdx, qword [rbp + 40] *)
  86. 04CH, 08BH, 055H, 030H, (* mov r10, qword [rbp + 48] *)
  87. 04CH, 08BH, 045H, 038H, (* mov r8, qword [rbp + 56] *)
  88. 04CH, 08BH, 04DH, 040H, (* mov r9, qword [rbp + 64] *)
  89. 00FH, 005H, (* syscall *)
  90. 05DH, (* pop rbp *)
  91. 0C2H, 038H, 000H (* ret 56 *)
  92. )
  93. RETURN 0
  94. END syscall;
  95. $END
  96. BEGIN
  97. init
  98. END LINAPI.