14 Dec, 2020

1 commit


10 Nov, 2020

1 commit

  • Update the assigned value of the poll result to be EPOLLHUP instead of
    POLLHUP to match the __poll_t type.

    While at it, simplify the logic of setting the mask result of the poll
    function.

    Reported-by: kernel test robot
    Reviewed-by: Alexander Graf
    Signed-off-by: Andra Paraschiv
    Link: https://lore.kernel.org/r/20201102173622.32169-1-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman

    Andra Paraschiv
     

02 Oct, 2020

1 commit


22 Sep, 2020

14 commits

  • Add Makefile for the Nitro Enclaves driver, considering the option set
    in the kernel config.

    Changelog

    v9 -> v10

    * Update commit message to include the changelog before the SoB tag(s).

    v8 -> v9

    * Remove -Wall flags, could use W=1 as an option for this.

    v7 -> v8

    * No changes.

    v6 -> v7

    * No changes.

    v5 -> v6

    * No changes.

    v4 -> v5

    * No changes.

    v3 -> v4

    * No changes.

    v2 -> v3

    * Remove the GPL additional wording as SPDX-License-Identifier is
    already in place.

    v1 -> v2

    * Update path to Makefile to match the drivers/virt/nitro_enclaves
    directory.

    Reviewed-by: Alexander Graf
    Signed-off-by: Andra Paraschiv
    Link: https://lore.kernel.org/r/20200921121732.44291-16-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman

    Andra Paraschiv
     
  • Add kernel config entry for Nitro Enclaves, including dependencies.

    Changelog

    v9 -> v10

    * Update commit message to include the changelog before the SoB tag(s).

    v8 -> v9

    * No changes.

    v7 -> v8

    * No changes.

    v6 -> v7

    * Remove, for now, the dependency on ARM64 arch. x86 is currently
    supported, with Arm to come afterwards. The NE kernel driver can be
    built for aarch64 arch.

    v5 -> v6

    * No changes.

    v4 -> v5

    * Add arch dependency for Arm / x86.

    v3 -> v4

    * Add PCI and SMP dependencies.

    v2 -> v3

    * Remove the GPL additional wording as SPDX-License-Identifier is
    already in place.

    v1 -> v2

    * Update path to Kconfig to match the drivers/virt/nitro_enclaves
    directory.
    * Update help in Kconfig.

    Reviewed-by: Alexander Graf
    Signed-off-by: Andra Paraschiv
    Link: https://lore.kernel.org/r/20200921121732.44291-15-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman

    Andra Paraschiv
     
  • An enclave is associated with an fd that is returned after the enclave
    creation logic is completed. This enclave fd is further used to setup
    enclave resources. Once the enclave needs to be terminated, the enclave
    fd is closed.

    Add logic for enclave termination, that is mapped to the enclave fd
    release callback. Free the internal enclave info used for bookkeeping.

    Changelog

    v9 -> v10

    * Update commit message to include the changelog before the SoB tag(s).

    v8 -> v9

    * Use the ne_devs data structure to get the refs for the NE PCI device.

    v7 -> v8

    * No changes.

    v6 -> v7

    * Remove the pci_dev_put() call as the NE misc device parent field is
    used now to get the NE PCI device.
    * Update the naming and add more comments to make more clear the logic
    of handling full CPU cores and dedicating them to the enclave.

    v5 -> v6

    * Update documentation to kernel-doc format.
    * Use directly put_page() instead of unpin_user_pages(), to match the
    get_user_pages() calls.

    v4 -> v5

    * Release the reference to the NE PCI device on enclave fd release.
    * Adapt the logic to cpumask enclave vCPU ids and CPU cores.
    * Remove sanity checks for situations that shouldn't happen, only if
    buggy system or broken logic at all.

    v3 -> v4

    * Use dev_err instead of custom NE log pattern.

    v2 -> v3

    * Remove the WARN_ON calls.
    * Update static calls sanity checks.
    * Update kzfree() calls to kfree().

    v1 -> v2

    * Add log pattern for NE.
    * Remove the BUG_ON calls.
    * Update goto labels to match their purpose.
    * Add early exit in release() if there was a slot alloc error in the fd
    creation path.

    Reviewed-by: Alexander Graf
    Signed-off-by: Alexandru Vasile
    Signed-off-by: Andra Paraschiv
    Link: https://lore.kernel.org/r/20200921121732.44291-14-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman

    Andra Paraschiv
     
  • After all the enclave resources are set, the enclave is ready for
    beginning to run.

    Add ioctl command logic for starting an enclave after all its resources,
    memory regions and CPUs, have been set.

    The enclave start information includes the local channel addressing -
    vsock CID - and the flags associated with the enclave.

    Changelog

    v9 -> v10

    * Update commit message to include the changelog before the SoB tag(s).

    v8 -> v9

    * Use the ne_devs data structure to get the refs for the NE PCI device.

    v7 -> v8

    * Add check for invalid enclave CID value e.g. well-known CIDs and
    parent VM CID.
    * Add custom error code for incorrect flag in enclave start info and
    invalid enclave CID.

    v6 -> v7

    * Update the naming and add more comments to make more clear the logic
    of handling full CPU cores and dedicating them to the enclave.

    v5 -> v6

    * Check for invalid enclave start flags.
    * Update documentation to kernel-doc format.

    v4 -> v5

    * Add early exit on enclave start ioctl function call error.
    * Move sanity checks in the enclave start ioctl function, outside of the
    switch-case block.
    * Remove log on copy_from_user() / copy_to_user() failure.

    v3 -> v4

    * Use dev_err instead of custom NE log pattern.
    * Update the naming for the ioctl command from metadata to info.
    * Check for minimum enclave memory size.

    v2 -> v3

    * Remove the WARN_ON calls.
    * Update static calls sanity checks.

    v1 -> v2

    * Add log pattern for NE.
    * Check if enclave state is init when starting an enclave.
    * Remove the BUG_ON calls.

    Reviewed-by: Alexander Graf
    Signed-off-by: Alexandru Vasile
    Signed-off-by: Andra Paraschiv
    Link: https://lore.kernel.org/r/20200921121732.44291-13-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman

    Andra Paraschiv
     
  • Another resource that is being set for an enclave is memory. User space
    memory regions, that need to be backed by contiguous memory regions,
    are associated with the enclave.

    One solution for allocating / reserving contiguous memory regions, that
    is used for integration, is hugetlbfs. The user space process that is
    associated with the enclave passes to the driver these memory regions.

    The enclave memory regions need to be from the same NUMA node as the
    enclave CPUs.

    Add ioctl command logic for setting user space memory region for an
    enclave.

    Changelog

    v9 -> v10

    * Update commit message to include the changelog before the SoB tag(s).

    v8 -> v9

    * Use the ne_devs data structure to get the refs for the NE PCI device.

    v7 -> v8

    * Add early check, while getting user pages, to be multiple of 2 MiB for
    the pages that back the user space memory region.
    * Add custom error code for incorrect user space memory region flag.
    * Include in a separate function the sanity checks for each page of the
    user space memory region.

    v6 -> v7

    * Update check for duplicate user space memory regions to cover
    additional possible scenarios.

    v5 -> v6

    * Check for max number of pages allocated for the internal data
    structure for pages.
    * Check for invalid memory region flags.
    * Check for aligned physical memory regions.
    * Update documentation to kernel-doc format.
    * Check for duplicate user space memory regions.
    * Use directly put_page() instead of unpin_user_pages(), to match the
    get_user_pages() calls.

    v4 -> v5

    * Add early exit on set memory region ioctl function call error.
    * Remove log on copy_from_user() failure.
    * Exit without unpinning the pages on NE PCI dev request failure as
    memory regions from the user space range may have already been added.
    * Add check for the memory region user space address to be 2 MiB
    aligned.
    * Update logic to not have a hardcoded check for 2 MiB memory regions.

    v3 -> v4

    * Check enclave memory regions are from the same NUMA node as the
    enclave CPUs.
    * Use dev_err instead of custom NE log pattern.
    * Update the NE ioctl call to match the decoupling from the KVM API.

    v2 -> v3

    * Remove the WARN_ON calls.
    * Update static calls sanity checks.
    * Update kzfree() calls to kfree().

    v1 -> v2

    * Add log pattern for NE.
    * Update goto labels to match their purpose.
    * Remove the BUG_ON calls.
    * Check if enclave max memory regions is reached when setting an enclave
    memory region.
    * Check if enclave state is init when setting an enclave memory region.

    Reviewed-by: Alexander Graf
    Signed-off-by: Alexandru Vasile
    Signed-off-by: Andra Paraschiv
    Link: https://lore.kernel.org/r/20200921121732.44291-12-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman

    Andra Paraschiv
     
  • Before setting the memory regions for the enclave, the enclave image
    needs to be placed in memory. After the memory regions are set, this
    memory cannot be used anymore by the VM, being carved out.

    Add ioctl command logic to get the offset in enclave memory where to
    place the enclave image. Then the user space tooling copies the enclave
    image in the memory using the given memory offset.

    Changelog

    v9 -> v10

    * Update commit message to include the changelog before the SoB tag(s).

    v8 -> v9

    * No changes.

    v7 -> v8

    * Add custom error code for incorrect enclave image load info flag.

    v6 -> v7

    * No changes.

    v5 -> v6

    * Check for invalid enclave image load flags.

    v4 -> v5

    * Check for the enclave not being started when invoking this ioctl call.
    * Remove log on copy_from_user() / copy_to_user() failure.

    v3 -> v4

    * Use dev_err instead of custom NE log pattern.
    * Set enclave image load offset based on flags.
    * Update the naming for the ioctl command from metadata to info.

    v2 -> v3

    * No changes.

    v1 -> v2

    * New in v2.

    Reviewed-by: Alexander Graf
    Signed-off-by: Andra Paraschiv
    Link: https://lore.kernel.org/r/20200921121732.44291-11-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman

    Andra Paraschiv
     
  • An enclave, before being started, has its resources set. One of its
    resources is CPU.

    A NE CPU pool is set and enclave CPUs are chosen from it. Offline the
    CPUs from the NE CPU pool during the pool setup and online them back
    during the NE CPU pool teardown. The CPU offline is necessary so that
    there would not be more vCPUs than physical CPUs available to the
    primary / parent VM. In that case the CPUs would be overcommitted and
    would change the initial configuration of the primary / parent VM of
    having dedicated vCPUs to physical CPUs.

    The enclave CPUs need to be full cores and from the same NUMA node. CPU
    0 and its siblings have to remain available to the primary / parent VM.

    Add ioctl command logic for setting an enclave vCPU.

    Changelog

    v9 -> v10

    * Update commit message to include the changelog before the SoB tag(s).

    v8 -> v9

    * Use the ne_devs data structure to get the refs for the NE PCI device.

    v7 -> v8

    * No changes.

    v6 -> v7

    * Check for error return value when setting the kernel parameter string.
    * Use the NE misc device parent field to get the NE PCI device.
    * Update the naming and add more comments to make more clear the logic
    of handling full CPU cores and dedicating them to the enclave.
    * Calculate the number of threads per core and not use smp_num_siblings
    that is x86 specific.

    v5 -> v6

    * Check CPUs are from the same NUMA node before going through CPU
    siblings during the NE CPU pool setup.
    * Update documentation to kernel-doc format.

    v4 -> v5

    * Set empty string in case of invalid NE CPU pool.
    * Clear NE CPU pool mask on pool setup failure.
    * Setup NE CPU cores out of the NE CPU pool.
    * Early exit on NE CPU pool setup if enclave(s) already running.
    * Remove sanity checks for situations that shouldn't happen, only if
    buggy system or broken logic at all.
    * Add check for maximum vCPU id possible before looking into the CPU
    pool.
    * Remove log on copy_from_user() / copy_to_user() failure and on admin
    capability check for setting the NE CPU pool.
    * Update the ioctl call to not create a file descriptor for the vCPU.
    * Split the CPU pool usage logic in 2 separate functions - one to get a
    CPU from the pool and the other to check the given CPU is available in
    the pool.

    v3 -> v4

    * Setup the NE CPU pool at runtime via a sysfs file for the kernel
    parameter.
    * Check enclave CPUs to be from the same NUMA node.
    * Use dev_err instead of custom NE log pattern.
    * Update the NE ioctl call to match the decoupling from the KVM API.

    v2 -> v3

    * Remove the WARN_ON calls.
    * Update static calls sanity checks.
    * Update kzfree() calls to kfree().
    * Remove file ops that do nothing for now - open, ioctl and release.

    v1 -> v2

    * Add log pattern for NE.
    * Update goto labels to match their purpose.
    * Remove the BUG_ON calls.
    * Check if enclave state is init when setting enclave vCPU.

    Reviewed-by: Alexander Graf
    Signed-off-by: Alexandru Vasile
    Signed-off-by: Andra Paraschiv
    Link: https://lore.kernel.org/r/20200921121732.44291-10-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman

    Andra Paraschiv
     
  • Add ioctl command logic for enclave VM creation. It triggers a slot
    allocation. The enclave resources will be associated with this slot and
    it will be used as an identifier for triggering enclave run.

    Return a file descriptor, namely enclave fd. This is further used by the
    associated user space enclave process to set enclave resources and
    trigger enclave termination.

    The poll function is implemented in order to notify the enclave process
    when an enclave exits without a specific enclave termination command
    trigger e.g. when an enclave crashes.

    Changelog

    v9 -> v10

    * Update commit message to include the changelog before the SoB tag(s).

    v8 -> v9

    * Use the ne_devs data structure to get the refs for the NE PCI device.

    v7 -> v8

    * No changes.

    v6 -> v7

    * Use the NE misc device parent field to get the NE PCI device.
    * Update the naming and add more comments to make more clear the logic
    of handling full CPU cores and dedicating them to the enclave.

    v5 -> v6

    * Update the code base to init the ioctl function in this patch.
    * Update documentation to kernel-doc format.

    v4 -> v5

    * Release the reference to the NE PCI device on create VM error.
    * Close enclave fd on copy_to_user() failure; rename fd to enclave fd
    while at it.
    * Remove sanity checks for situations that shouldn't happen, only if
    buggy system or broken logic at all.
    * Remove log on copy_to_user() failure.

    v3 -> v4

    * Use dev_err instead of custom NE log pattern.
    * Update the NE ioctl call to match the decoupling from the KVM API.
    * Add metadata for the NUMA node for the enclave memory and CPUs.

    v2 -> v3

    * Remove the WARN_ON calls.
    * Update static calls sanity checks.
    * Update kzfree() calls to kfree().
    * Remove file ops that do nothing for now - open.

    v1 -> v2

    * Add log pattern for NE.
    * Update goto labels to match their purpose.
    * Remove the BUG_ON calls.

    Reviewed-by: Alexander Graf
    Signed-off-by: Alexandru Vasile
    Signed-off-by: Andra Paraschiv
    Link: https://lore.kernel.org/r/20200921121732.44291-9-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman

    Andra Paraschiv
     
  • The Nitro Enclaves driver provides an ioctl interface to the user space
    for enclave lifetime management e.g. enclave creation / termination and
    setting enclave resources such as memory and CPU.

    This ioctl interface is mapped to a Nitro Enclaves misc device.

    Changelog

    v9 -> v10

    * Update commit message to include the changelog before the SoB tag(s).

    v8 -> v9

    * Use the ne_devs data structure to get the refs for the NE misc device
    in the NE PCI device driver logic.

    v7 -> v8

    * Add define for the CID of the primary / parent VM.
    * Update the NE PCI driver shutdown logic to include misc device
    deregister.

    v6 -> v7

    * Set the NE PCI device the parent of the NE misc device to be able to
    use it in the ioctl logic.
    * Update the naming and add more comments to make more clear the logic
    of handling full CPU cores and dedicating them to the enclave.

    v5 -> v6

    * Remove the ioctl to query API version.
    * Update documentation to kernel-doc format.

    v4 -> v5

    * Update the size of the NE CPU pool string from 4096 to 512 chars.

    v3 -> v4

    * Use dev_err instead of custom NE log pattern.
    * Remove the NE CPU pool init during kernel module loading, as the CPU
    pool is now setup at runtime, via a sysfs file for the kernel
    parameter.
    * Add minimum enclave memory size definition.

    v2 -> v3

    * Remove the GPL additional wording as SPDX-License-Identifier is
    already in place.
    * Remove the WARN_ON calls.
    * Remove linux/bug and linux/kvm_host includes that are not needed.
    * Remove "ratelimited" from the logs that are not in the ioctl call
    paths.
    * Remove file ops that do nothing for now - open and release.

    v1 -> v2

    * Add log pattern for NE.
    * Update goto labels to match their purpose.
    * Update ne_cpu_pool data structure to include the global mutex.
    * Update NE misc device mode to 0660.
    * Check if the CPU siblings are included in the NE CPU pool, as full CPU
    cores are given for the enclave(s).

    Reviewed-by: Alexander Graf
    Signed-off-by: Andra Paraschiv
    Link: https://lore.kernel.org/r/20200921121732.44291-8-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman

    Andra Paraschiv
     
  • In addition to the replies sent by the Nitro Enclaves PCI device in
    response to command requests, out-of-band enclave events can happen e.g.
    an enclave crashes. In this case, the Nitro Enclaves driver needs to be
    aware of the event and notify the corresponding user space process that
    abstracts the enclave.

    Register an MSI-X interrupt vector to be used for this kind of
    out-of-band events. The interrupt notifies that the state of an enclave
    changed and the driver logic scans the state of each running enclave to
    identify for which this notification is intended.

    Create an workqueue to handle the out-of-band events. Notify user space
    enclave process that is using a polling mechanism on the enclave fd.

    Changelog

    v9 -> v10

    * Update commit message to include the changelog before the SoB tag(s).

    v8 -> v9

    * Use the reference to the pdev directly from the ne_pci_dev instead of
    the one from the enclave data structure.

    v7 -> v8

    * No changes.

    v6 -> v7

    * No changes.

    v5 -> v6

    * Update documentation to kernel-doc format.

    v4 -> v5

    * Remove sanity checks for situations that shouldn't happen, only if
    buggy system or broken logic at all.

    v3 -> v4

    * Use dev_err instead of custom NE log pattern.
    * Return IRQ_NONE when interrupts are not handled.

    v2 -> v3

    * Remove the WARN_ON calls.
    * Update static calls sanity checks.
    * Remove "ratelimited" from the logs that are not in the ioctl call
    paths.

    v1 -> v2

    * Add log pattern for NE.
    * Update goto labels to match their purpose.

    Reviewed-by: Alexander Graf
    Signed-off-by: Alexandru-Catalin Vasile
    Signed-off-by: Andra Paraschiv
    Link: https://lore.kernel.org/r/20200921121732.44291-7-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman

    Andra Paraschiv
     
  • The Nitro Enclaves PCI device exposes a MMIO space that this driver
    uses to submit command requests and to receive command replies e.g. for
    enclave creation / termination or setting enclave resources.

    Add logic for handling PCI device command requests based on the given
    command type.

    Register an MSI-X interrupt vector for command reply notifications to
    handle this type of communication events.

    Changelog

    v9 -> v10

    * Update commit message to include the changelog before the SoB tag(s).

    v8 -> v9

    * No changes.

    v7 -> v8

    * Update function signature for submit request and retrive reply
    functions as they only returned 0, no error code.
    * Include command type value in the error logs of ne_do_request().

    v6 -> v7

    * No changes.

    v5 -> v6

    * Update documentation to kernel-doc format.

    v4 -> v5

    * Remove sanity checks for situations that shouldn't happen, only if
    buggy system or broken logic at all.

    v3 -> v4

    * Use dev_err instead of custom NE log pattern.
    * Return IRQ_NONE when interrupts are not handled.

    v2 -> v3

    * Remove the WARN_ON calls.
    * Update static calls sanity checks.
    * Remove "ratelimited" from the logs that are not in the ioctl call
    paths.

    v1 -> v2

    * Add log pattern for NE.
    * Remove the BUG_ON calls.
    * Update goto labels to match their purpose.
    * Add fix for kbuild report:
    https://lore.kernel.org/lkml/202004231644.xTmN4Z1z%25lkp@intel.com/

    Reviewed-by: Alexander Graf
    Signed-off-by: Alexandru-Catalin Vasile
    Signed-off-by: Andra Paraschiv
    Link: https://lore.kernel.org/r/20200921121732.44291-6-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman

    Andra Paraschiv
     
  • The Nitro Enclaves PCI device is used by the kernel driver as a means of
    communication with the hypervisor on the host where the primary VM and
    the enclaves run. It handles requests with regard to enclave lifetime.

    Setup the PCI device driver and add support for MSI-X interrupts.

    Changelog

    v9 -> v10

    * Update commit message to include the changelog before the SoB tag(s).

    v8 -> v9

    * Init the reference to the ne_pci_dev in the ne_devs data structure.

    v7 -> v8

    * Add NE PCI driver shutdown logic.

    v6 -> v7

    * No changes.

    v5 -> v6

    * Update documentation to kernel-doc format.

    v4 -> v5

    * Remove sanity checks for situations that shouldn't happen, only if
    buggy system or broken logic at all.

    v3 -> v4

    * Use dev_err instead of custom NE log pattern.
    * Update NE PCI driver name to "nitro_enclaves".

    v2 -> v3

    * Remove the GPL additional wording as SPDX-License-Identifier is
    already in place.
    * Remove the WARN_ON calls.
    * Remove linux/bug include that is not needed.
    * Update static calls sanity checks.
    * Remove "ratelimited" from the logs that are not in the ioctl call
    paths.
    * Update kzfree() calls to kfree().

    v1 -> v2

    * Add log pattern for NE.
    * Update PCI device setup functions to receive PCI device data structure and
    then get private data from it inside the functions logic.
    * Remove the BUG_ON calls.
    * Add teardown function for MSI-X setup.
    * Update goto labels to match their purpose.
    * Implement TODO for NE PCI device disable state check.
    * Update function name for NE PCI device probe / remove.

    Reviewed-by: Alexander Graf
    Signed-off-by: Alexandru-Catalin Vasile
    Signed-off-by: Alexandru Ciobotaru
    Signed-off-by: Andra Paraschiv
    Link: https://lore.kernel.org/r/20200921121732.44291-5-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman

    Andra Paraschiv
     
  • The Nitro Enclaves driver keeps an internal info per each enclave.

    This is needed to be able to manage enclave resources state, enclave
    notifications and have a reference of the PCI device that handles
    command requests for enclave lifetime management.

    Changelog

    v9 -> v10

    * Update commit message to include the changelog before the SoB tag(s).

    v8 -> v9

    * Add data structure to keep references to both Nitro Enclaves misc and
    PCI devices.

    v7 -> v8

    * No changes.

    v6 -> v7

    * Update the naming and add more comments to make more clear the logic
    of handling full CPU cores and dedicating them to the enclave.

    v5 -> v6

    * Update documentation to kernel-doc format.
    * Include in the enclave memory region data structure the user space
    address and size for duplicate user space memory regions checks.

    v4 -> v5

    * Include enclave cores field in the enclave metadata.
    * Update the vCPU ids data structure to be a cpumask instead of a list.

    v3 -> v4

    * Add NUMA node field for an enclave metadata as the enclave memory and
    CPUs need to be from the same NUMA node.

    v2 -> v3

    * Remove the GPL additional wording as SPDX-License-Identifier is
    already in place.

    v1 -> v2

    * Add enclave memory regions and vcpus count for enclave bookkeeping.
    * Update ne_state comments to reflect NE_START_ENCLAVE ioctl naming
    update.

    Reviewed-by: Alexander Graf
    Signed-off-by: Alexandru-Catalin Vasile
    Signed-off-by: Andra Paraschiv
    Link: https://lore.kernel.org/r/20200921121732.44291-4-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman

    Andra Paraschiv
     
  • The Nitro Enclaves (NE) driver communicates with a new PCI device, that
    is exposed to a virtual machine (VM) and handles commands meant for
    handling enclaves lifetime e.g. creation, termination, setting memory
    regions. The communication with the PCI device is handled using a MMIO
    space and MSI-X interrupts.

    This device communicates with the hypervisor on the host, where the VM
    that spawned the enclave itself runs, e.g. to launch a VM that is used
    for the enclave.

    Define the MMIO space of the NE PCI device, the commands that are
    provided by this device. Add an internal data structure used as private
    data for the PCI device driver and the function for the PCI device
    command requests handling.

    Changelog

    v9 -> v10

    * Update commit message to include the changelog before the SoB tag(s).

    v8 -> v9

    * Fix indent for the NE PCI device command types enum.

    v7 -> v8

    * No changes.

    v6 -> v7

    * Update the documentation to include references to the NE PCI device id
    and MMIO bar.

    v5 -> v6

    * Update documentation to kernel-doc format.

    v4 -> v5

    * Add a TODO for including flags in the request to the NE PCI device to
    set a memory region for an enclave. It is not used for now.

    v3 -> v4

    * Remove the "packed" attribute and include padding in the NE data
    structures.

    v2 -> v3

    * Remove the GPL additional wording as SPDX-License-Identifier is
    already in place.

    v1 -> v2

    * Update path naming to drivers/virt/nitro_enclaves.
    * Update NE_ENABLE_OFF / NE_ENABLE_ON defines.

    Reviewed-by: Alexander Graf
    Signed-off-by: Alexandru-Catalin Vasile
    Signed-off-by: Alexandru Ciobotaru
    Signed-off-by: Andra Paraschiv
    Link: https://lore.kernel.org/r/20200921121732.44291-3-andraprs@amazon.com
    Signed-off-by: Greg Kroah-Hartman

    Andra Paraschiv
     

07 Sep, 2020

1 commit

  • First, when memory allocation for sg_list_unaligned failed, there
    is a bug of calling put_pages() as we haven't pinned any pages.

    Second, if get_user_pages_fast() failed we should unpin num_pinned
    pages.

    This will address both.

    As part of these changes, minor update in documentation.

    Fixes: 6db7199407ca ("drivers/virt: introduce Freescale hypervisor management driver")
    Signed-off-by: Souptick Joarder
    Reviewed-by: Dan Carpenter
    Reviewed-by: John Hubbard
    Link: https://lore.kernel.org/r/1598995271-6755-1-git-send-email-jrdr.linux@gmail.com
    Signed-off-by: Greg Kroah-Hartman

    Souptick Joarder
     

28 Aug, 2020

1 commit


10 Jul, 2020

8 commits

  • The session lock is a mutex, not a spinlock, fix the comments to match.

    Acked-by: Arnd Bergmann
    Signed-off-by: Hans de Goede
    Link: https://lore.kernel.org/r/20200709120858.63928-9-hdegoede@redhat.com
    Signed-off-by: Greg Kroah-Hartman

    Hans de Goede
     
  • Every now and then upstream adds new ioctls without notifying us,
    log unknown ioctl requests as an error to catch these.

    Acked-by: Arnd Bergmann
    Signed-off-by: Hans de Goede
    Link: https://lore.kernel.org/r/20200709120858.63928-8-hdegoede@redhat.com
    Signed-off-by: Greg Kroah-Hartman

    Hans de Goede
     
  • Upstream VirtualBox has defined and is using a few new request types for
    vmmdev requests passed through /dev/vboxguest to the hypervisor.

    Add the defines for these to vbox_vmmdev_types.h and add add them to the
    whitelists of vmmdev requests which userspace is allowed to make.

    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1789545
    Acked-by: Arnd Bergmann
    Signed-off-by: Hans de Goede
    Link: https://lore.kernel.org/r/20200709120858.63928-7-hdegoede@redhat.com
    Signed-off-by: Greg Kroah-Hartman

    Hans de Goede
     
  • Add support for the new VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES ioctl, this
    is necessary for automatic resizing of the guest resolution to match the
    VM-window size to work with the new VMSVGA virtual GPU which is now the
    new default in VirtualBox.

    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1789545
    Acked-by: Arnd Bergmann
    Signed-off-by: Hans de Goede
    Link: https://lore.kernel.org/r/20200709120858.63928-6-hdegoede@redhat.com
    Signed-off-by: Greg Kroah-Hartman

    Hans de Goede
     
  • Add vbg_set_host_capabilities() helper function, this is a preparation
    patch for adding support for the VBGL_IOCTL_GUEST_CAPS_ACQUIRE ioctl.

    Acked-by: Arnd Bergmann
    Signed-off-by: Hans de Goede
    Link: https://lore.kernel.org/r/20200709120858.63928-5-hdegoede@redhat.com
    Signed-off-by: Greg Kroah-Hartman

    Hans de Goede
     
  • Rename guest_caps[_tracker] struct members to set_guest_caps[_tracker]
    this is a preparation patch for adding support for the
    VBGL_IOCTL_GUEST_CAPS_ACQUIRE ioctl.

    Acked-by: Arnd Bergmann
    Signed-off-by: Hans de Goede
    Link: https://lore.kernel.org/r/20200709120858.63928-4-hdegoede@redhat.com
    Signed-off-by: Greg Kroah-Hartman

    Hans de Goede
     
  • Check the passed in capabilities against VMMDEV_GUEST_CAPABILITIES_MASK
    instead of against VMMDEV_EVENT_VALID_EVENT_MASK.
    This tightens the allowed mask from 0x7ff to 0x7.

    Fixes: 0ba002bc4393 ("virt: Add vboxguest driver for Virtual Box Guest integration")
    Cc: stable@vger.kernel.org
    Acked-by: Arnd Bergmann
    Signed-off-by: Hans de Goede
    Link: https://lore.kernel.org/r/20200709120858.63928-3-hdegoede@redhat.com
    Signed-off-by: Greg Kroah-Hartman

    Hans de Goede
     
  • Until this commit the mainline kernel version (this version) of the
    vboxguest module contained a bug where it defined
    VBGL_IOCTL_VMMDEV_REQUEST_BIG and VBGL_IOCTL_LOG using
    _IOC(_IOC_READ | _IOC_WRITE, 'V', ...) instead of
    _IO(V, ...) as the out of tree VirtualBox upstream version does.

    Since the VirtualBox userspace bits are always built against VirtualBox
    upstream's headers, this means that so far the mainline kernel version
    of the vboxguest module has been failing these 2 ioctls with -ENOTTY.
    I guess that VBGL_IOCTL_VMMDEV_REQUEST_BIG is never used causing us to
    not hit that one and sofar the vboxguest driver has failed to actually
    log any log messages passed it through VBGL_IOCTL_LOG.

    This commit changes the VBGL_IOCTL_VMMDEV_REQUEST_BIG and VBGL_IOCTL_LOG
    defines to match the out of tree VirtualBox upstream vboxguest version,
    while keeping compatibility with the old wrong request defines so as
    to not break the kernel ABI in case someone has been using the old
    request defines.

    Fixes: f6ddd094f579 ("virt: Add vboxguest driver for Virtual Box Guest integration UAPI")
    Cc: stable@vger.kernel.org
    Acked-by: Arnd Bergmann
    Reviewed-by: Arnd Bergmann
    Signed-off-by: Hans de Goede
    Link: https://lore.kernel.org/r/20200709120858.63928-2-hdegoede@redhat.com
    Signed-off-by: Greg Kroah-Hartman

    Hans de Goede
     

14 Jun, 2020

1 commit

  • Since commit 84af7a6194e4 ("checkpatch: kconfig: prefer 'help' over
    '---help---'"), the number of '---help---' has been gradually
    decreasing, but there are still more than 2400 instances.

    This commit finishes the conversion. While I touched the lines,
    I also fixed the indentation.

    There are a variety of indentation styles found.

    a) 4 spaces + '---help---'
    b) 7 spaces + '---help---'
    c) 8 spaces + '---help---'
    d) 1 space + 1 tab + '---help---'
    e) 1 tab + '---help---' (correct indentation)
    f) 1 tab + 1 space + '---help---'
    g) 1 tab + 2 spaces + '---help---'

    In order to convert all of them to 1 tab + 'help', I ran the
    following commend:

    $ find . -name 'Kconfig*' | xargs sed -i 's/^[[:space:]]*---help---/\thelp/'

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     

19 Mar, 2020

1 commit

  • Convert the various uses of fallthrough comments to fallthrough;

    Done via script
    Link: https://lore.kernel.org/lkml/b56602fcf79f849e733e7b521bb0e17895d390fa.1582230379.git.joe@perches.com/

    And by hand:

    drivers/virt/vboxguest/vboxguest_core.c has a fallthrough comment outside
    of an #ifdef block that causes gcc to emit a warning if converted in-place.

    So move the new fallthrough; inside the containing #ifdef/#endif too.

    Signed-off-by: Joe Perches
    Acked-by: Hans de Goede
    Link: https://lore.kernel.org/r/68773b4cd82288b78ca6fcde8c43e249a025378a.1584040050.git.joe@perches.com
    Signed-off-by: Greg Kroah-Hartman

    Joe Perches
     

10 Dec, 2019

1 commit

  • Through a labyrinthian sequence of includes, usage of page_to_phys(),
    virt_to_phys() and out*() is dependent on the include of asm/io.h in
    x86's asm/realmode.h, which is included in x86's asm/acpi.h and thus by
    linux/acpi.h. Explicitly include linux/io.h to break the dependency on
    realmode.h so that a future patch can remove the realmode.h include from
    acpi.h without breaking the build.

    Signed-off-by: Sean Christopherson
    Link: https://lkml.kernel.org/r/20191126165417.22423-8-sean.j.christopherson@intel.com
    Signed-off-by: Ingo Molnar

    Sean Christopherson
     

02 Dec, 2019

1 commit

  • Pull removal of most of fs/compat_ioctl.c from Arnd Bergmann:
    "As part of the cleanup of some remaining y2038 issues, I came to
    fs/compat_ioctl.c, which still has a couple of commands that need
    support for time64_t.

    In completely unrelated work, I spent time on cleaning up parts of
    this file in the past, moving things out into drivers instead.

    After Al Viro reviewed an earlier version of this series and did a lot
    more of that cleanup, I decided to try to completely eliminate the
    rest of it and move it all into drivers.

    This series incorporates some of Al's work and many patches of my own,
    but in the end stops short of actually removing the last part, which
    is the scsi ioctl handlers. I have patches for those as well, but they
    need more testing or possibly a rewrite"

    * tag 'compat-ioctl-5.5' of git://git.kernel.org:/pub/scm/linux/kernel/git/arnd/playground: (42 commits)
    scsi: sd: enable compat ioctls for sed-opal
    pktcdvd: add compat_ioctl handler
    compat_ioctl: move SG_GET_REQUEST_TABLE handling
    compat_ioctl: ppp: move simple commands into ppp_generic.c
    compat_ioctl: handle PPPIOCGIDLE for 64-bit time_t
    compat_ioctl: move PPPIOCSCOMPRESS to ppp_generic
    compat_ioctl: unify copy-in of ppp filters
    tty: handle compat PPP ioctls
    compat_ioctl: move SIOCOUTQ out of compat_ioctl.c
    compat_ioctl: handle SIOCOUTQNSD
    af_unix: add compat_ioctl support
    compat_ioctl: reimplement SG_IO handling
    compat_ioctl: move WDIOC handling into wdt drivers
    fs: compat_ioctl: move FITRIM emulation into file systems
    gfs2: add compat_ioctl support
    compat_ioctl: remove unused convert_in_user macro
    compat_ioctl: remove last RAID handling code
    compat_ioctl: remove /dev/raw ioctl translation
    compat_ioctl: remove PCI ioctl translation
    compat_ioctl: remove joystick ioctl translation
    ...

    Linus Torvalds
     

23 Oct, 2019

1 commit

  • The .ioctl and .compat_ioctl file operations have the same prototype so
    they can both point to the same function, which works great almost all
    the time when all the commands are compatible.

    One exception is the s390 architecture, where a compat pointer is only
    31 bit wide, and converting it into a 64-bit pointer requires calling
    compat_ptr(). Most drivers here will never run in s390, but since we now
    have a generic helper for it, it's easy enough to use it consistently.

    I double-checked all these drivers to ensure that all ioctl arguments
    are used as pointers or are ignored, but are not interpreted as integer
    values.

    Acked-by: Jason Gunthorpe
    Acked-by: Daniel Vetter
    Acked-by: Mauro Carvalho Chehab
    Acked-by: Greg Kroah-Hartman
    Acked-by: David Sterba
    Acked-by: Darren Hart (VMware)
    Acked-by: Jonathan Cameron
    Acked-by: Bjorn Andersson
    Acked-by: Dan Williams
    Signed-off-by: Arnd Bergmann

    Arnd Bergmann
     

10 Oct, 2019

1 commit

  • In hgcm_call_preprocess_linaddr memory is allocated for bounce_buf but
    is not released if copy_form_user fails. In order to prevent memory leak
    in case of failure, the assignment to bounce_buf_ret is moved before the
    error check. This way the allocated bounce_buf will be released by the
    caller.

    Fixes: 579db9d45cb4 ("virt: Add vboxguest VMMDEV communication code")
    Signed-off-by: Navid Emamdoost
    Reviewed-by: Hans de Goede
    Link: https://lore.kernel.org/r/20190930204223.3660-1-navid.emamdoost@gmail.com
    Signed-off-by: Greg Kroah-Hartman

    Navid Emamdoost
     

21 May, 2019

1 commit


15 May, 2019

3 commits

  • The "param.count" value is a u64 thatcomes from the user. The code
    later in the function assumes that param.count is at least one and if
    it's not then it leads to an Oops when we dereference the ZERO_SIZE_PTR.

    Also the addition can have an integer overflow which would lead us to
    allocate a smaller "pages" array than required. I can't immediately
    tell what the possible run times implications are, but it's safest to
    prevent the overflow.

    Link: http://lkml.kernel.org/r/20181218082129.GE32567@kadam
    Fixes: 6db7199407ca ("drivers/virt: introduce Freescale hypervisor management driver")
    Signed-off-by: Dan Carpenter
    Reviewed-by: Andrew Morton
    Cc: Timur Tabi
    Cc: Mihai Caraman
    Cc: Kumar Gala
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Dan Carpenter
     
  • strndup_user() returns error pointers on error, and then in the error
    handling we pass the error pointers to kfree(). It will cause an Oops.

    Link: http://lkml.kernel.org/r/20181218082003.GD32567@kadam
    Fixes: 6db7199407ca ("drivers/virt: introduce Freescale hypervisor management driver")
    Signed-off-by: Dan Carpenter
    Reviewed-by: Andrew Morton
    Cc: Timur Tabi
    Cc: Mihai Caraman
    Cc: Kumar Gala
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Dan Carpenter
     
  • To facilitate additional options to get_user_pages_fast() change the
    singular write parameter to be gup_flags.

    This patch does not change any functionality. New functionality will
    follow in subsequent patches.

    Some of the get_user_pages_fast() call sites were unchanged because they
    already passed FOLL_WRITE or 0 for the write parameter.

    NOTE: It was suggested to change the ordering of the get_user_pages_fast()
    arguments to ensure that callers were converted. This breaks the current
    GUP call site convention of having the returned pages be the final
    parameter. So the suggestion was rejected.

    Link: http://lkml.kernel.org/r/20190328084422.29911-4-ira.weiny@intel.com
    Link: http://lkml.kernel.org/r/20190317183438.2057-4-ira.weiny@intel.com
    Signed-off-by: Ira Weiny
    Reviewed-by: Mike Marshall
    Cc: Aneesh Kumar K.V
    Cc: Benjamin Herrenschmidt
    Cc: Borislav Petkov
    Cc: Dan Williams
    Cc: "David S. Miller"
    Cc: Heiko Carstens
    Cc: Ingo Molnar
    Cc: James Hogan
    Cc: Jason Gunthorpe
    Cc: John Hubbard
    Cc: "Kirill A. Shutemov"
    Cc: Martin Schwidefsky
    Cc: Michal Hocko
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Cc: Ralf Baechle
    Cc: Rich Felker
    Cc: Thomas Gleixner
    Cc: Yoshinori Sato
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ira Weiny
     

26 Apr, 2019

1 commit

  • Userspace can make host function calls, called hgcm-calls through the
    /dev/vboxguest device.

    In this case we should not accept all hgcm-function-parameter-types, some
    are only valid for in kernel calls.

    This commit adds proper hgcm-function-parameter-type validation to the
    ioctl for doing a hgcm-call from userspace.

    Cc: stable@vger.kernel.org
    Signed-off-by: Hans de Goede
    Signed-off-by: Greg Kroah-Hartman

    Hans de Goede
     

28 Mar, 2019

1 commit

  • VirtualBox 6.0.x has a new feature where the guest kernel driver passes
    info about the origin of the request (e.g. userspace or kernelspace) to
    the hypervisor.

    If we do not pass this information then when running the 6.0.x userspace
    guest-additions tools on a 6.0.x host, some requests will get denied
    with a VERR_VERSION_MISMATCH error, breaking vboxservice.service and
    the mounting of shared folders marked to be auto-mounted.

    This commit implements passing the requestor info to the host, fixing this.

    Signed-off-by: Hans de Goede
    Signed-off-by: Greg Kroah-Hartman

    Hans de Goede
     

27 Feb, 2019

1 commit

  • In preparation to enabling -Wimplicit-fallthrough, mark switch
    cases where we are expecting to fall through.

    This patch fixes the following warning:

    drivers/virt/vboxguest/vboxguest_core.c: In function ‘vbg_core_ioctl’:
    drivers/virt/vboxguest/vboxguest_core.c:1486:10: warning: this statement may fall through [-Wimplicit-fallthrough=]
    f32bit = true;
    ~~~~~~~^~~~~~
    drivers/virt/vboxguest/vboxguest_core.c:1489:2: note: here
    case VBG_IOCTL_HGCM_CALL(0):
    ^~~~

    Warning level 3 was used: -Wimplicit-fallthrough=3

    Notice that, in this particular case, the code comment is modified
    in accordance with what GCC is expecting to find.

    This patch is part of the ongoing efforts to enable
    -Wimplicit-fallthrough.

    Signed-off-by: Gustavo A. R. Silva
    Reviewed-by: Hans de Goede
    Signed-off-by: Greg Kroah-Hartman

    Gustavo A. R. Silva