1 /*
2  * Copyright (C) 2018-2022 Intel Corporation.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 /* Routines to notify the VBS-K in kernel */
9 
10 #include <stdio.h>
11 #include <sys/ioctl.h>
12 #include "virtio_kernel.h"
13 #include "log.h"
14 
15 static int virtio_kernel_debug;
16 #define DPRINTF(params) do { if (virtio_kernel_debug) pr_dbg params; } while (0)
17 #define WPRINTF(params) (pr_err params)
18 
19 static int
vbs_dev_info_set(int fd,void * arg)20 vbs_dev_info_set(int fd, void *arg)
21 {
22 	return ioctl(fd, VBS_K_SET_DEV, arg);
23 }
24 
25 static int
vbs_vqs_info_set(int fd,void * arg)26 vbs_vqs_info_set(int fd, void *arg)
27 {
28 	return ioctl(fd, VBS_K_SET_VQ, arg);
29 }
30 
31 /* VBS-K common ops */
32 /**
33  * @brief Virtio kernel module reset.
34  *
35  * @param fd File descriptor representing virtio backend in kernel module.
36  *
37  * @return 0 on OK and non-zero on error.
38  */
39 int
vbs_kernel_reset(int fd)40 vbs_kernel_reset(int fd)
41 {
42 	return ioctl(fd, VBS_K_RESET_DEV, NULL);
43 }
44 
45 /*
46  * We need a way to start/stop vbs_k execution since guest might want to
47  * change the configuration of the virtio device after VBS-K has been
48  * initialized.
49  */
50 /**
51  * @brief Virtio kernel module start.
52  *
53  * @param fd File descriptor representing virtio backend in kernel module.
54  * @param dev Pointer to struct vbs_dev_info.
55  * @param vqs Pointer to struct vbs_vqs_info.
56  *
57  * @return 0 on OK and non-zero on error.
58  */
59 int
vbs_kernel_start(int fd,struct vbs_dev_info * dev,struct vbs_vqs_info * vqs)60 vbs_kernel_start(int fd, struct vbs_dev_info *dev, struct vbs_vqs_info *vqs)
61 {
62 	int ret;
63 
64 	if (fd < 0) {
65 		WPRINTF(("%s: fd < 0\n", __func__));
66 		return -VIRTIO_ERROR_FD_OPEN_FAILED;
67 	}
68 
69 	ret = vbs_dev_info_set(fd, dev);
70 	if (ret < 0) {
71 		WPRINTF(("vbs_kernel_set_dev failed: ret %d\n", ret));
72 		return ret;
73 	}
74 
75 	ret = vbs_vqs_info_set(fd, vqs);
76 	if (ret < 0) {
77 		WPRINTF(("vbs_kernel_set_vqs failed: ret %d\n", ret));
78 		return ret;
79 	}
80 
81 	return VIRTIO_SUCCESS;
82 }
83 
84 /**
85  * @brief Virtio kernel module stop.
86  *
87  * @param fd File descriptor representing virtio backend in kernel module.
88  *
89  * @return 0 on OK and non-zero on error.
90  */
91 int
vbs_kernel_stop(int fd)92 vbs_kernel_stop(int fd)
93 {
94 	DPRINTF(("%s\n", __func__));
95 	return VIRTIO_SUCCESS;
96 }
97