+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2023, Microsoft Corporation.
+ *
+ * Author:
+ *   Roman Kisel <[email protected]>
+ *   Saurabh Sengar <[email protected]>
+ *   Naman Jain <[email protected]>
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/miscdevice.h>
+#include <linux/anon_inodes.h>
+#include <linux/pfn_t.h>
+#include <linux/cpuhotplug.h>
+#include <linux/count_zeros.h>
+#include <linux/eventfd.h>
+#include <linux/poll.h>
+#include <linux/file.h>
+#include <linux/vmalloc.h>
+#include <asm/debugreg.h>
+#include <asm/mshyperv.h>
+#include <trace/events/ipi.h>
+#include <uapi/asm/mtrr.h>
+#include <uapi/linux/mshv.h>
+#include <hyperv/hvhdk.h>
+
+#include "../../kernel/fpu/legacy.h"
+#include "mshv.h"
+#include "mshv_vtl.h"
+#include "hyperv_vmbus.h"
+
+MODULE_AUTHOR("Microsoft");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Microsoft Hyper-V VTL Driver");
+
+#define MSHV_ENTRY_REASON_LOWER_VTL_CALL     0x1
+#define MSHV_ENTRY_REASON_INTERRUPT          0x2
+#define MSHV_ENTRY_REASON_INTERCEPT          0x3
+
+#define MAX_GUEST_MEM_SIZE     BIT_ULL(40)
+#define MSHV_PG_OFF_CPU_MASK   0xFFFF
+#define MSHV_REAL_OFF_SHIFT    16
+#define MSHV_RUN_PAGE_OFFSET   0
+#define MSHV_REG_PAGE_OFFSET   1
+#define VTL2_VMBUS_SINT_INDEX  7
+
+static struct device *mem_dev;
+
+static struct tasklet_struct msg_dpc;
+static wait_queue_head_t fd_wait_queue;
+static bool has_message;
+static struct eventfd_ctx *flag_eventfds[HV_EVENT_FLAGS_COUNT];
+static DEFINE_MUTEX(flag_lock);
+static bool __read_mostly mshv_has_reg_page;
+
+struct mshv_vtl_hvcall_fd {
+       u64 allow_bitmap[2 * PAGE_SIZE];
+       bool allow_map_intialized;

typo allow_map_intialized -> allow_map_initialized

+       /*
+        * Used to protect hvcall setup in IOCTLs
+        */
+       struct mutex init_mutex;
+       struct miscdevice *dev;
+};
+
+struct mshv_vtl_poll_file {
+       struct file *file;
+       wait_queue_entry_t wait;
+       wait_queue_head_t *wqh;
+       poll_table pt;
+       int cpu;
+};
+
[clip]
+
+static int mshv_vtl_hvcall_setup(struct mshv_vtl_hvcall_fd *fd,
+                                struct mshv_vtl_hvcall_setup __user 
*hvcall_setup_user)
+{
+       int ret = 0;
+       struct mshv_vtl_hvcall_setup hvcall_setup;
+
+       mutex_lock(&fd->init_mutex);
+
+       if (fd->allow_map_intialized) {
+               dev_err(fd->dev->this_device,
+                       "Hypercall allow map has already been set, pid %d\n",
+                       current->pid);
+               ret = -EINVAL;
+               goto exit;
+       }
+
+       if (copy_from_user(&hvcall_setup, hvcall_setup_user,
+                          sizeof(struct mshv_vtl_hvcall_setup))) {
+               ret = -EFAULT;
+               goto exit;
+       }
+       if (hvcall_setup.bitmap_size > ARRAY_SIZE(fd->allow_bitmap)) {
+               ret = -EINVAL;
+               goto exit;
+       }

is this valid case if hvcall_setup.bitmap_size == 0 ?

+       if (copy_from_user(&fd->allow_bitmap,
+                          (void __user *)hvcall_setup.allow_bitmap_ptr,
+                          hvcall_setup.bitmap_size)) {
+               ret = -EFAULT;
+               goto exit;
+       }
+
[clip]



Reviewed-by: Alok Tiwari <[email protected]>

Thanks,
Alok


Reply via email to