Subversion Repositories Kolibri OS

Rev

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
(*
2
    BSD 2-Clause License
3
 
4
    Copyright (c) 2019-2020, Anton Krotov
5
    All rights reserved.
6
*)
7
 
8
MODULE LINAPI;
9
 
8097 maxcodehac 10
IMPORT SYSTEM, API, Libdl;
7983 leency 11
 
12
 
13
TYPE
14
 
8097 maxcodehac 15
    TP* = ARRAY 2 OF INTEGER;
16
    SOFINI* = PROCEDURE;
7983 leency 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
 
8097 maxcodehac 46
PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
7983 leency 47
VAR
8097 maxcodehac 48
    sym: INTEGER;
7983 leency 49
 
50
BEGIN
8097 maxcodehac 51
    sym := Libdl.sym(lib, name);
52
    ASSERT(sym # 0);
53
    SYSTEM.PUT(VarAdr, sym)
54
END GetSym;
7983 leency 55
 
8097 maxcodehac 56
 
57
PROCEDURE init;
58
BEGIN
7983 leency 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));
7983 leency 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);
7983 leency 74
 
8097 maxcodehac 75
    librt := Libdl.open("librt.so.1", Libdl.LAZY);
7983 leency 76
 
8097 maxcodehac 77
    GetSym(librt, "clock_gettime", SYSTEM.ADR(clock_gettime))
7983 leency 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.