2020-05-25 22:48:33 +02:00
|
|
|
(*
|
|
|
|
BSD 2-Clause License
|
|
|
|
|
|
|
|
Copyright (c) 2019-2020, Anton Krotov
|
|
|
|
All rights reserved.
|
|
|
|
*)
|
|
|
|
|
|
|
|
MODULE LINAPI;
|
|
|
|
|
2020-10-13 09:58:51 +02:00
|
|
|
IMPORT SYSTEM, API, Libdl;
|
2020-05-25 22:48:33 +02:00
|
|
|
|
|
|
|
|
|
|
|
TYPE
|
|
|
|
|
2020-10-13 09:58:51 +02:00
|
|
|
TP* = ARRAY 2 OF INTEGER;
|
|
|
|
SOFINI* = PROCEDURE;
|
2020-05-25 22:48:33 +02:00
|
|
|
|
|
|
|
|
|
|
|
VAR
|
|
|
|
|
|
|
|
libc*, librt*: INTEGER;
|
|
|
|
|
|
|
|
stdout*,
|
|
|
|
stdin*,
|
|
|
|
stderr* : INTEGER;
|
|
|
|
|
|
|
|
malloc* : PROCEDURE [linux] (size: INTEGER): INTEGER;
|
|
|
|
free* : PROCEDURE [linux] (ptr: INTEGER);
|
|
|
|
exit* : PROCEDURE [linux] (code: INTEGER);
|
|
|
|
puts* : PROCEDURE [linux] (pStr: INTEGER);
|
|
|
|
fwrite*,
|
|
|
|
fread* : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER;
|
|
|
|
fopen* : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER;
|
|
|
|
fclose* : PROCEDURE [linux] (file: INTEGER): INTEGER;
|
|
|
|
time* : PROCEDURE [linux] (ptr: INTEGER): INTEGER;
|
|
|
|
|
|
|
|
clock_gettime* : PROCEDURE [linux] (clock_id: INTEGER; VAR tp: TP): INTEGER;
|
|
|
|
|
|
|
|
|
|
|
|
PROCEDURE SetFini* (ProcFini: SOFINI);
|
|
|
|
BEGIN
|
|
|
|
API.SetFini(ProcFini)
|
|
|
|
END SetFini;
|
|
|
|
|
|
|
|
|
2020-10-13 09:58:51 +02:00
|
|
|
PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
|
2020-05-25 22:48:33 +02:00
|
|
|
VAR
|
2020-10-13 09:58:51 +02:00
|
|
|
sym: INTEGER;
|
2020-05-25 22:48:33 +02:00
|
|
|
|
|
|
|
BEGIN
|
2020-10-13 09:58:51 +02:00
|
|
|
sym := Libdl.sym(lib, name);
|
|
|
|
ASSERT(sym # 0);
|
|
|
|
SYSTEM.PUT(VarAdr, sym)
|
|
|
|
END GetSym;
|
|
|
|
|
2020-05-25 22:48:33 +02:00
|
|
|
|
2020-10-13 09:58:51 +02:00
|
|
|
PROCEDURE init;
|
|
|
|
BEGIN
|
2020-05-25 22:48:33 +02:00
|
|
|
libc := API.libc;
|
|
|
|
|
2020-10-13 09:58:51 +02:00
|
|
|
GetSym(libc, "exit", SYSTEM.ADR(exit));
|
|
|
|
GetSym(libc, "puts", SYSTEM.ADR(puts));
|
|
|
|
GetSym(libc, "malloc", SYSTEM.ADR(malloc));
|
|
|
|
GetSym(libc, "free", SYSTEM.ADR(free));
|
|
|
|
GetSym(libc, "fread", SYSTEM.ADR(fread));
|
|
|
|
GetSym(libc, "fwrite", SYSTEM.ADR(fwrite));
|
|
|
|
GetSym(libc, "fopen", SYSTEM.ADR(fopen));
|
|
|
|
GetSym(libc, "fclose", SYSTEM.ADR(fclose));
|
|
|
|
GetSym(libc, "time", SYSTEM.ADR(time));
|
2020-05-25 22:48:33 +02:00
|
|
|
|
2020-10-13 09:58:51 +02:00
|
|
|
GetSym(libc, "stdout", SYSTEM.ADR(stdout)); SYSTEM.GET(stdout - SYSTEM.SIZE(INTEGER), stdout);
|
|
|
|
GetSym(libc, "stdin", SYSTEM.ADR(stdin)); SYSTEM.GET(stdin - SYSTEM.SIZE(INTEGER), stdin);
|
|
|
|
GetSym(libc, "stderr", SYSTEM.ADR(stderr)); SYSTEM.GET(stderr - SYSTEM.SIZE(INTEGER), stderr);
|
2020-05-25 22:48:33 +02:00
|
|
|
|
2020-10-13 09:58:51 +02:00
|
|
|
librt := Libdl.open("librt.so.1", Libdl.LAZY);
|
2020-05-25 22:48:33 +02:00
|
|
|
|
2020-10-13 09:58:51 +02:00
|
|
|
GetSym(librt, "clock_gettime", SYSTEM.ADR(clock_gettime))
|
2020-05-25 22:48:33 +02:00
|
|
|
END init;
|
|
|
|
|
|
|
|
|
|
|
|
PROCEDURE [stdcall64-] syscall* (rax, rdi, rsi, rdx, r10, r8, r9: INTEGER): INTEGER;
|
|
|
|
BEGIN
|
|
|
|
SYSTEM.CODE(
|
|
|
|
048H, 08BH, 045H, 010H, (* mov rax, qword [rbp + 16] *)
|
|
|
|
048H, 08BH, 07DH, 018H, (* mov rdi, qword [rbp + 24] *)
|
|
|
|
048H, 08BH, 075H, 020H, (* mov rsi, qword [rbp + 32] *)
|
|
|
|
048H, 08BH, 055H, 028H, (* mov rdx, qword [rbp + 40] *)
|
|
|
|
04CH, 08BH, 055H, 030H, (* mov r10, qword [rbp + 48] *)
|
|
|
|
04CH, 08BH, 045H, 038H, (* mov r8, qword [rbp + 56] *)
|
|
|
|
04CH, 08BH, 04DH, 040H, (* mov r9, qword [rbp + 64] *)
|
|
|
|
00FH, 005H, (* syscall *)
|
|
|
|
0C9H, (* leave *)
|
|
|
|
0C2H, 038H, 000H (* ret 56 *)
|
|
|
|
)
|
|
|
|
RETURN 0
|
|
|
|
END syscall;
|
|
|
|
|
|
|
|
|
|
|
|
BEGIN
|
|
|
|
init
|
|
|
|
END LINAPI.
|