Linux Audio

Check our new training course

Linux debugging, profiling, tracing and performance analysis training

Apr 14-17, 2025
Register
Loading...
Note: File does not exist in v3.1.
  1/*
  2 * VMware VMCI Driver
  3 *
  4 * Copyright (C) 2012 VMware, Inc. All rights reserved.
  5 *
  6 * This program is free software; you can redistribute it and/or modify it
  7 * under the terms of the GNU General Public License as published by the
  8 * Free Software Foundation version 2 and no later version.
  9 *
 10 * This program is distributed in the hope that it will be useful, but
 11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 12 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 13 * for more details.
 14 */
 15
 16#include <linux/vmw_vmci_defs.h>
 17#include <linux/vmw_vmci_api.h>
 18#include <linux/atomic.h>
 19#include <linux/kernel.h>
 20#include <linux/module.h>
 21#include <linux/init.h>
 22
 23#include "vmci_driver.h"
 24#include "vmci_event.h"
 25
 26static bool vmci_disable_host;
 27module_param_named(disable_host, vmci_disable_host, bool, 0);
 28MODULE_PARM_DESC(disable_host,
 29		 "Disable driver host personality (default=enabled)");
 30
 31static bool vmci_disable_guest;
 32module_param_named(disable_guest, vmci_disable_guest, bool, 0);
 33MODULE_PARM_DESC(disable_guest,
 34		 "Disable driver guest personality (default=enabled)");
 35
 36static bool vmci_guest_personality_initialized;
 37static bool vmci_host_personality_initialized;
 38
 39/*
 40 * vmci_get_context_id() - Gets the current context ID.
 41 *
 42 * Returns the current context ID.  Note that since this is accessed only
 43 * from code running in the host, this always returns the host context ID.
 44 */
 45u32 vmci_get_context_id(void)
 46{
 47	if (vmci_guest_code_active())
 48		return vmci_get_vm_context_id();
 49	else if (vmci_host_code_active())
 50		return VMCI_HOST_CONTEXT_ID;
 51
 52	return VMCI_INVALID_ID;
 53}
 54EXPORT_SYMBOL_GPL(vmci_get_context_id);
 55
 56static int __init vmci_drv_init(void)
 57{
 58	int vmci_err;
 59	int error;
 60
 61	vmci_err = vmci_event_init();
 62	if (vmci_err < VMCI_SUCCESS) {
 63		pr_err("Failed to initialize VMCIEvent (result=%d)\n",
 64		       vmci_err);
 65		return -EINVAL;
 66	}
 67
 68	if (!vmci_disable_guest) {
 69		error = vmci_guest_init();
 70		if (error) {
 71			pr_warn("Failed to initialize guest personality (err=%d)\n",
 72				error);
 73		} else {
 74			vmci_guest_personality_initialized = true;
 75			pr_info("Guest personality initialized and is %s\n",
 76				vmci_guest_code_active() ?
 77				"active" : "inactive");
 78		}
 79	}
 80
 81	if (!vmci_disable_host) {
 82		error = vmci_host_init();
 83		if (error) {
 84			pr_warn("Unable to initialize host personality (err=%d)\n",
 85				error);
 86		} else {
 87			vmci_host_personality_initialized = true;
 88			pr_info("Initialized host personality\n");
 89		}
 90	}
 91
 92	if (!vmci_guest_personality_initialized &&
 93	    !vmci_host_personality_initialized) {
 94		vmci_event_exit();
 95		return -ENODEV;
 96	}
 97
 98	return 0;
 99}
100module_init(vmci_drv_init);
101
102static void __exit vmci_drv_exit(void)
103{
104	if (vmci_guest_personality_initialized)
105		vmci_guest_exit();
106
107	if (vmci_host_personality_initialized)
108		vmci_host_exit();
109
110	vmci_event_exit();
111}
112module_exit(vmci_drv_exit);
113
114MODULE_AUTHOR("VMware, Inc.");
115MODULE_DESCRIPTION("VMware Virtual Machine Communication Interface.");
116MODULE_VERSION("1.1.4.0-k");
117MODULE_LICENSE("GPL v2");