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
(*
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.