Rev 7983 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7983 | leency | 1 | (* |
7597 | akron1 | 2 | BSD 2-Clause License |
3 | |||
7983 | leency | 4 | Copyright (c) 2019-2020, Anton Krotov |
7597 | akron1 | 5 | All rights reserved. |
6 | *) |
||
7 | |||
8 | MODULE LINAPI; |
||
9 | |||
8097 | maxcodehac | 10 | IMPORT SYSTEM, API, Libdl; |
7597 | akron1 | 11 | |
12 | |||
13 | TYPE |
||
14 | |||
8097 | maxcodehac | 15 | TP* = ARRAY 2 OF INTEGER; |
16 | SOFINI* = PROCEDURE; |
||
7597 | akron1 | 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 | |||
7983 | leency | 40 | PROCEDURE SetFini* (ProcFini: SOFINI); |
41 | BEGIN |
||
42 | API.SetFini(ProcFini) |
||
43 | END SetFini; |
||
44 | |||
45 | |||
8097 | maxcodehac | 46 | PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER); |
7597 | akron1 | 47 | VAR |
8097 | maxcodehac | 48 | sym: INTEGER; |
7597 | akron1 | 49 | |
50 | BEGIN |
||
8097 | maxcodehac | 51 | sym := Libdl.sym(lib, name); |
52 | ASSERT(sym # 0); |
||
53 | SYSTEM.PUT(VarAdr, sym) |
||
54 | END GetSym; |
||
7696 | akron1 | 55 | |
8097 | maxcodehac | 56 | |
57 | PROCEDURE init; |
||
58 | BEGIN |
||
7597 | akron1 | 59 | libc := API.libc; |
60 | |||
8097 | maxcodehac | 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)); |
||
7597 | akron1 | 70 | |
8097 | maxcodehac | 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); |
||
7597 | akron1 | 74 | |
8097 | maxcodehac | 75 | librt := Libdl.open("librt.so.1", Libdl.LAZY); |
7597 | akron1 | 76 | |
8097 | maxcodehac | 77 | GetSym(librt, "clock_gettime", SYSTEM.ADR(clock_gettime)) |
7597 | akron1 | 78 | END init; |
79 | |||
80 | |||
81 | PROCEDURE [stdcall-] syscall* (eax, ebx, ecx, edx, esi, edi: INTEGER): INTEGER; |
||
82 | BEGIN |
||
83 | SYSTEM.CODE( |
||
84 | 053H, (* push ebx *) |
||
85 | 056H, (* push esi *) |
||
86 | 057H, (* push edi *) |
||
87 | 08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *) |
||
88 | 08BH, 05DH, 00CH, (* mov ebx, dword [ebp + 12] *) |
||
89 | 08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *) |
||
90 | 08BH, 055H, 014H, (* mov edx, dword [ebp + 20] *) |
||
91 | 08BH, 075H, 018H, (* mov esi, dword [ebp + 24] *) |
||
92 | 08BH, 07DH, 01CH, (* mov edi, dword [ebp + 28] *) |
||
93 | 0CDH, 080H, (* int 128 *) |
||
94 | 05FH, (* pop edi *) |
||
95 | 05EH, (* pop esi *) |
||
96 | 05BH, (* pop ebx *) |
||
97 | 0C9H, (* leave *) |
||
98 | 0C2H, 018H, 000H (* ret 24 *) |
||
99 | ) |
||
100 | RETURN 0 |
||
101 | END syscall; |
||
102 | |||
103 | |||
104 | BEGIN |
||
105 | init |
||
7983 | leency | 106 | END LINAPI. |