nvc_internal.h 4.0 KB
Newer Older
J
Jonathan Calmels 已提交
1
/*
J
Jonathan Calmels 已提交
2
 * Copyright (c) 2017-2018, NVIDIA CORPORATION. All rights reserved.
J
Jonathan Calmels 已提交
3 4 5 6 7
 */

#ifndef HEADER_NVC_INTERNAL_H
#define HEADER_NVC_INTERNAL_H

8
#include <sys/capability.h>
J
Jonathan Calmels 已提交
9 10
#include <sys/types.h>

J
Jonathan Calmels 已提交
11
#include <paths.h>
J
Jonathan Calmels 已提交
12 13 14 15 16 17 18
#include <stdbool.h>
#include <stdint.h>

#pragma GCC visibility push(default)
#include "nvc.h"
#pragma GCC visibility pop

J
Jonathan Calmels 已提交
19
#include "common.h"
J
Jonathan Calmels 已提交
20 21 22
#include "driver.h"
#include "error.h"
#include "ldcache.h"
23
#include "utils.h"
J
Jonathan Calmels 已提交
24

J
Jonathan Calmels 已提交
25 26
#define NV_DEVICE_MAJOR          195
#define NV_CTL_DEVICE_MINOR      255
27
#define NV_MODESET_DEVICE_MINOR  254
J
Jonathan Calmels 已提交
28 29 30 31
#define NV_DEVICE_PATH           _PATH_DEV "nvidia%d"
#define NV_CTL_DEVICE_PATH       _PATH_DEV "nvidiactl"
#define NV_UVM_DEVICE_PATH       _PATH_DEV "nvidia-uvm"
#define NV_UVM_TOOLS_DEVICE_PATH _PATH_DEV "nvidia-uvm-tools"
32
#define NV_MODESET_DEVICE_PATH   _PATH_DEV "nvidia-modeset"
J
Jonathan Calmels 已提交
33 34
#define NV_PERSISTENCED_SOCKET   _PATH_VARRUN "nvidia-persistenced/socket"
#define NV_MPS_PIPE_DIR          _PATH_TMP "nvidia-mps"
35 36
#define NV_PROC_DRIVER           "/proc/driver/nvidia"
#define NV_UVM_PROC_DRIVER       "/proc/driver/nvidia-uvm"
37
#define NV_APP_PROFILE_DIR       "/etc/nvidia/nvidia-application-profiles-rc.d"
J
Jonathan Calmels 已提交
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

struct nvc_context {
        bool initialized;
        struct error err;
        struct nvc_config cfg;
        int mnt_ns;
        struct driver drv;
};

struct nvc_container {
        int32_t flags;
        struct nvc_container_config cfg;
        uid_t uid;
        gid_t gid;
        char *mnt_ns;
        char *dev_cg;
};

56
enum {
57 58 59 60 61 62 63
        NVC_INIT,
        NVC_INIT_KMODS,
        NVC_SHUTDOWN,
        NVC_CONTAINER,
        NVC_INFO,
        NVC_MOUNT,
        NVC_LDCACHE,
64 65
};

66
static const cap_value_t pcaps[] = {
67
        CAP_CHOWN,           /* kmods */
68
        CAP_DAC_OVERRIDE,    /* rhel userns, cgroups */
69
        CAP_DAC_READ_SEARCH, /* userns */
70
        CAP_FOWNER,          /* kmods */
71 72 73 74 75 76 77 78 79 80
        CAP_KILL,            /* privsep */
        CAP_MKNOD,           /* kmods */
        CAP_SETGID,          /* privsep, userns */
        CAP_SETPCAP,         /* bounds, userns */
        CAP_SETUID,          /* privsep, userns */
        CAP_SYS_ADMIN,       /* setns, mount */
        CAP_SYS_CHROOT,      /* setns, chroot */
        CAP_SYS_PTRACE,      /* procns */
};

81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
static const cap_value_t ecaps[][nitems(pcaps) + 1] = {
        [NVC_INIT]       = {CAP_KILL, CAP_SETUID, CAP_SETGID, CAP_SYS_CHROOT, -1},

        [NVC_INIT_KMODS] = {CAP_KILL,  CAP_SETUID, CAP_SETGID, CAP_SYS_CHROOT,
                            CAP_CHOWN, CAP_FOWNER, CAP_MKNOD, CAP_SETPCAP, -1},

        [NVC_SHUTDOWN]   = {CAP_KILL, -1},

        [NVC_CONTAINER]  = {CAP_KILL, CAP_DAC_READ_SEARCH, CAP_SYS_PTRACE, -1},

        [NVC_INFO]       = {CAP_KILL, -1},

        [NVC_MOUNT]      = {CAP_KILL, CAP_SETUID, CAP_SETGID, CAP_SYS_CHROOT,
                            CAP_SYS_ADMIN, CAP_DAC_READ_SEARCH, CAP_SYS_PTRACE, CAP_DAC_OVERRIDE, -1},

        [NVC_LDCACHE]    = {CAP_KILL, CAP_SETUID, CAP_SETGID, CAP_SYS_CHROOT,
                            CAP_SYS_ADMIN, CAP_DAC_READ_SEARCH, CAP_SYS_PTRACE, CAP_SETPCAP, -1},
98 99
};

100
static const cap_value_t bcaps[] = {
101
        CAP_DAC_OVERRIDE,
102
        CAP_SYS_MODULE,
103 104 105
};

static inline size_t
106
ecaps_size(int idx)
107 108 109
{
        size_t i;

110 111
        for (i = 0; i < nitems(*ecaps); ++i) {
            if (ecaps[idx][i] == -1)
112 113 114 115 116
                break;
        }
        return (i);
}

J
Jonathan Calmels 已提交
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
static inline int
validate_context(struct nvc_context *ctx)
{
        if (ctx == NULL)
                return (-1);
        if (!ctx->initialized) {
                error_setx(&ctx->err, "context uninitialized");
                return (-1);
        }
        return (0);
}

static inline int
validate_args(struct nvc_context *ctx, bool predicate)
{
        if (!predicate) {
                error_setx(&ctx->err, "invalid argument");
                return (-1);
        }
        return (0);
}

139
/* Prototypes from nvc.c */
J
Jonathan Calmels 已提交
140
void nvc_entrypoint(void);
J
Jonathan Calmels 已提交
141

142 143 144 145
/* Prototypes from nvc_info.c */
bool match_binary_flags(const char *, int32_t);
bool match_library_flags(const char *, int32_t);

J
Jonathan Calmels 已提交
146
#endif /* HEADER_NVC_INTERNAL_H */