1#pragma once
 2
 3/* the rest of this file must match virglrenderer/src/apir-protocol.h */
 4
 5#include <unistd.h>
 6
 7#include <cstdint>
 8
 9#define APIR_PROTOCOL_MAJOR 0
10#define APIR_PROTOCOL_MINOR 1
11
12#define APIR_HANDSHAKE_MAGIC 0xab1e
13
14enum ApirCommandType {
15    APIR_COMMAND_TYPE_HANDSHAKE   = 0,
16    APIR_COMMAND_TYPE_LOADLIBRARY = 1,
17    APIR_COMMAND_TYPE_FORWARD     = 2,
18
19    APIR_COMMAND_TYPE_LENGTH      = 3,
20};
21
22typedef uint64_t ApirCommandFlags;
23
24enum ApirLoadLibraryReturnCode {
25    APIR_LOAD_LIBRARY_SUCCESS                        = 0,
26    APIR_LOAD_LIBRARY_HYPERCALL_INITIALIZATION_ERROR = 1,
27    APIR_LOAD_LIBRARY_ALREADY_LOADED                 = 2,
28    APIR_LOAD_LIBRARY_ENV_VAR_MISSING                = 3,
29    APIR_LOAD_LIBRARY_CANNOT_OPEN                    = 4,
30    APIR_LOAD_LIBRARY_SYMBOL_MISSING                 = 5,
31    APIR_LOAD_LIBRARY_INIT_BASE_INDEX                = 6,  // anything above this is a APIR backend library initialization return code
32};
33
34enum ApirForwardReturnCode {
35    APIR_FORWARD_SUCCESS         = 0,
36    APIR_FORWARD_NO_DISPATCH_FCT = 1,
37    APIR_FORWARD_TIMEOUT         = 2,
38
39    APIR_FORWARD_BASE_INDEX      = 3,  // anything above this is a APIR backend library forward return code
40} ;
41
42__attribute__((unused)) static inline const char * apir_command_name(ApirCommandType type) {
43    switch (type) {
44        case APIR_COMMAND_TYPE_HANDSHAKE:
45            return "HandShake";
46        case APIR_COMMAND_TYPE_LOADLIBRARY:
47            return "LoadLibrary";
48        case APIR_COMMAND_TYPE_FORWARD:
49            return "Forward";
50        default:
51            return "unknown";
52    }
53}
54
55__attribute__((unused)) static const char * apir_load_library_error(ApirLoadLibraryReturnCode code) {
56#define APIR_LOAD_LIBRARY_ERROR(code_name) \
57    do {                                   \
58        if (code == code_name)             \
59            return #code_name;             \
60    } while (0)
61
62    APIR_LOAD_LIBRARY_ERROR(APIR_LOAD_LIBRARY_SUCCESS);
63    APIR_LOAD_LIBRARY_ERROR(APIR_LOAD_LIBRARY_HYPERCALL_INITIALIZATION_ERROR);
64    APIR_LOAD_LIBRARY_ERROR(APIR_LOAD_LIBRARY_ALREADY_LOADED);
65    APIR_LOAD_LIBRARY_ERROR(APIR_LOAD_LIBRARY_ENV_VAR_MISSING);
66    APIR_LOAD_LIBRARY_ERROR(APIR_LOAD_LIBRARY_CANNOT_OPEN);
67    APIR_LOAD_LIBRARY_ERROR(APIR_LOAD_LIBRARY_SYMBOL_MISSING);
68    APIR_LOAD_LIBRARY_ERROR(APIR_LOAD_LIBRARY_INIT_BASE_INDEX);
69
70    return "Unknown APIR_COMMAND_TYPE_LoadLibrary error";
71
72#undef APIR_LOAD_LIBRARY_ERROR
73}
74
75__attribute__((unused)) static const char * apir_forward_error(ApirForwardReturnCode code) {
76#define APIR_FORWARD_ERROR(code_name) \
77    do {                              \
78        if (code == code_name)        \
79            return #code_name;        \
80    } while (0)
81
82    APIR_FORWARD_ERROR(APIR_FORWARD_SUCCESS);
83    APIR_FORWARD_ERROR(APIR_FORWARD_NO_DISPATCH_FCT);
84    APIR_FORWARD_ERROR(APIR_FORWARD_TIMEOUT);
85    APIR_FORWARD_ERROR(APIR_FORWARD_BASE_INDEX);
86
87    return "Unknown APIR_COMMAND_TYPE_FORWARD error";
88
89#undef APIR_FORWARD_ERROR
90}