acrn-hypervisor/hypervisor/arch/x86/configs/pci_dev.c
Junjie Mao 83a938bae6 HV: treewide: fix violations of coding guideline C-TY-27 & C-TY-28
The coding guideline rules C-TY-27 and C-TY-28, combined, requires that
assignment and arithmetic operations shall be applied only on operands of the
same kind. This patch either adds explicit type casts or adjust types of
variables to align the types of operands.

The only semantic change introduced by this patch is the promotion of the
second argument of set_vmcs_bit() and clear_vmcs_bit() to
uint64_t (formerly uint32_t). This avoids clear_vmcs_bit() to accidentally
clears the upper 32 bits of the requested VMCS field.

Other than that, this patch has no semantic change. Specifically this patch
is not meant to fix buggy narrowing operations, only to make these
operations explicit.

Tracked-On: #6776
Signed-off-by: Junjie Mao <junjie.mao@intel.com>
Acked-by: Eddie Dong <eddie.dong@intel.com>
2021-11-04 18:15:47 +08:00

90 lines
2.4 KiB
C

/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <asm/vm_config.h>
#include <pci.h>
#include <asm/pci_dev.h>
#include <vpci.h>
/*
* @pre pdev != NULL;
*/
static bool is_allocated_to_prelaunched_vm(struct pci_pdev *pdev)
{
bool found = false;
uint16_t vmid;
uint16_t pci_idx;
struct acrn_vm_config *vm_config;
struct acrn_vm_pci_dev_config *dev_config;
for (vmid = 0U; (vmid < CONFIG_MAX_VM_NUM) && !found; vmid++) {
vm_config = get_vm_config(vmid);
if (vm_config->load_order == PRE_LAUNCHED_VM) {
for (pci_idx = 0U; pci_idx < vm_config->pci_dev_num; pci_idx++) {
dev_config = &vm_config->pci_devs[pci_idx];
if ((dev_config->emu_type == PCI_DEV_TYPE_PTDEV) &&
bdf_is_equal(dev_config->pbdf, pdev->bdf)) {
dev_config->pdev = pdev;
found = true;
break;
}
}
}
}
return found;
}
/*
* @brief Initialize a acrn_vm_pci_dev_config structure
*
* Initialize a acrn_vm_pci_dev_config structure with a specified the pdev structure.
* A acrn_vm_pci_dev_config is used to store a PCI device configuration for a VM. The
* caller of the function init_one_dev_config should guarantee execution atomically.
*
* @pre pdev != NULL
*
* @return If there's a successfully initialized acrn_vm_pci_dev_config return it, otherwise return NULL;
*/
struct acrn_vm_pci_dev_config *init_one_dev_config(struct pci_pdev *pdev)
{
uint16_t vmid;
struct acrn_vm_config *vm_config;
struct acrn_vm_pci_dev_config *dev_config = NULL;
if (!is_allocated_to_prelaunched_vm(pdev)) {
for (vmid = 0U; vmid < CONFIG_MAX_VM_NUM; vmid++) {
vm_config = get_vm_config(vmid);
if (vm_config->load_order != SERVICE_VM) {
continue;
}
dev_config = &vm_config->pci_devs[vm_config->pci_dev_num];
if (is_hv_owned_pdev(pdev->bdf)) {
/* Service VM need to emulate the type1 pdevs owned by HV */
dev_config->emu_type = PCI_DEV_TYPE_SERVICE_VM_EMUL;
if (is_bridge(pdev)) {
dev_config->vdev_ops = &vpci_bridge_ops;
} else if (is_host_bridge(pdev)) {
dev_config->vdev_ops = &vhostbridge_ops;
} else {
/* May have type0 device, E.g. debug pci uart */
break;
}
} else {
dev_config->emu_type = PCI_DEV_TYPE_PTDEV;
}
dev_config->vbdf.value = pdev->bdf.value;
dev_config->pbdf.value = pdev->bdf.value;
dev_config->pdev = pdev;
vm_config->pci_dev_num++;
}
}
return dev_config;
}