Hypercall APIs

This section contains APIs for the hypercall services. Sources for the Device Model are found in the ACRN Hypervisor GitHub repo

group acrn_hypercall

Hypercall.

Defines

ACRN_INTR_TYPE_ISA

Interrupt type for acrn_irqline: inject interrupt to IOAPIC

ACRN_INTR_TYPE_IOAPIC

Interrupt type for acrn_irqline: inject interrupt to both PIC and IOAPIC

GUEST_CFG_OFFSET

The guest config pointer offset.

It’s designed to support passing DM config data pointer, based on it, hypervisor would parse then pass DM defined configuration to GUEST VCPU when booting guest VM. the address 0xef000 here is designed by DM, as it arranged all memory layout below 1M, DM add this address to E280 reserved range to make sure there is no overlap for the address 0xef000 usage.

SPACE_SYSTEM_MEMORY

Info The power state data of a VCPU.

SPACE_SYSTEM_IO
SPACE_PCI_CONFIG
SPACE_Embedded_Control
SPACE_SMBUS
SPACE_PLATFORM_COMM
SPACE_FFixedHW
PMCMD_VMID_MASK

Info PM command from DM/VHM.

The command would specify request type(e.g. get px count or data) for specific VM and specific VCPU with specific state number. For Px, PMCMD_STATE_NUM means Px number from 0 to (MAX_PSTATE - 1), For Cx, PMCMD_STATE_NUM means Cx entry index from 1 to MAX_CX_ENTRY.

PMCMD_VCPUID_MASK
PMCMD_STATE_NUM_MASK
PMCMD_TYPE_MASK
PMCMD_VMID_SHIFT
PMCMD_VCPUID_SHIFT
PMCMD_STATE_NUM_SHIFT

Enums

enum pm_cmd_type

Values:

PMCMD_GET_PX_CNT
PMCMD_GET_PX_DATA
PMCMD_GET_CX_CNT
PMCMD_GET_CX_DATA

Functions

int32_t hcall_sos_offline_cpu(struct vm *vm, uint64_t lapicid)

offline vcpu from SOS

The function offline specific vcpu from SOS.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • lapicid: lapic id of the vcpu which wants to offline

int32_t hcall_get_api_version(struct vm *vm, uint64_t param)

Get hypervisor api version.

The function only return api version information when VM is VM0.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • param: guest physical memory address. The api version returned will be copied to this gpa

int32_t hcall_create_vm(struct vm *vm, uint64_t param)

create virtual machine

Create a virtual machine based on parameter, currently there is no limitation for calling times of this function, will add MAX_VM_NUM support later.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • param: guest physical memory address. This gpa points to struct acrn_create_vm

int32_t hcall_destroy_vm(uint16_t vmid)

destroy virtual machine

Destroy a virtual machine, it will pause target VM then shutdown it. The function will return -1 if the target VM does not exist.

Return
0 on success, non-zero on error.
Parameters
  • vmid: ID of the VM

int32_t hcall_reset_vm(uint16_t vmid)

reset virtual machine

Reset a virtual machine, it will make target VM rerun from pre-defined entry. Comparing to start vm, this function reset each vcpu state and do some initialization for guest. The function will return -1 if the target VM does not exist.

Return
0 on success, non-zero on error.
Parameters
  • vmid: ID of the VM

int32_t hcall_start_vm(uint16_t vmid)

start virtual machine

Start a virtual machine, it will schedule target VM’s vcpu to run. The function will return -1 if the target VM does not exist or the IOReq buffer page for the VM is not ready.

Return
0 on success, non-zero on error.
Parameters
  • vmid: ID of the VM

int32_t hcall_pause_vm(uint16_t vmid)

pause virtual machine

Pause a virtual machine, if the VM is already paused, the function will return 0 directly for success. The function will return -1 if the target VM does not exist.

Return
0 on success, non-zero on error.
Parameters
  • vmid: ID of the VM

int32_t hcall_create_vcpu(struct vm *vm, uint16_t vmid, uint64_t param)

create vcpu

Create a vcpu based on parameter for a VM, it will allocate vcpu from freed physical cpus, if there is no available pcpu, the function will return -1.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • vmid: ID of the VM
  • param: guest physical address. This gpa points to struct acrn_create_vcpu

int32_t hcall_assert_irqline(struct vm *vm, uint16_t vmid, uint64_t param)

assert IRQ line

Assert a virtual IRQ line for a VM, which could be from ISA or IOAPIC, normally it will active a level IRQ. The function will return -1 if the target VM does not exist.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • vmid: ID of the VM
  • param: guest physical address. This gpa points to struct acrn_irqline

int32_t hcall_deassert_irqline(struct vm *vm, uint16_t vmid, uint64_t param)

deassert IRQ line

Deassert a virtual IRQ line for a VM, which could be from ISA or IOAPIC, normally it will deactive a level IRQ. The function will return -1 if the target VM does not exist.

Pre
Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • vmid: ID of the VM
  • param: guest physical address. This gpa points to struct acrn_irqline

int32_t hcall_pulse_irqline(struct vm *vm, uint16_t vmid, uint64_t param)

trigger a pulse on IRQ line

Trigger a pulse on a virtual IRQ line for a VM, which could be from ISA or IOAPIC, normally it triggers an edge IRQ. The function will return -1 if the target VM does not exist.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • vmid: ID of the VM
  • param: guest physical address. This gpa points to struct acrn_irqline

int32_t hcall_inject_msi(struct vm *vm, uint16_t vmid, uint64_t param)

inject MSI interrupt

Inject a MSI interrupt for a VM. The function will return -1 if the target VM does not exist.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • vmid: ID of the VM
  • param: guest physical address. This gpa points to struct acrn_msi_entry

int32_t hcall_set_ioreq_buffer(struct vm *vm, uint16_t vmid, uint64_t param)

set ioreq shared buffer

Set the ioreq share buffer for a VM. The function will return -1 if the target VM does not exist.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • vmid: ID of the VM
  • param: guest physical address. This gpa points to struct acrn_set_ioreq_buffer

int32_t hcall_notify_ioreq_finish(uint16_t vmid, uint16_t vcpu_id)

notify request done

Notify the requestor VCPU for the completion of an ioreq. The function will return -1 if the target VM does not exist.

Return
0 on success, non-zero on error.
Parameters
  • vmid: ID of the VM
  • vcpu_id: vcpu ID of the requestor

int32_t hcall_set_vm_memory_region(struct vm *vm, uint16_t vmid, uint64_t param)

setup ept memory mapping

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • vmid: ID of the VM
  • param: guest physical address. This gpa points to struct vm_set_memmap

int32_t hcall_set_vm_memory_regions(struct vm *vm, uint64_t param)

setup ept memory mapping for multi regions

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • param: guest physical address. This gpa points to struct set_memmaps

int32_t hcall_write_protect_page(struct vm *vm, uint16_t vmid, uint64_t wp_gpa)

change guest memory page write permission

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • vmid: ID of the VM
  • wp_gpa: guest physical address. This gpa points to struct wp_data

int32_t hcall_remap_pci_msix(struct vm *vm, uint16_t vmid, uint64_t param)

remap PCI MSI interrupt

Remap a PCI MSI interrupt from a VM’s virtual vector to native vector. The function will return -1 if the target VM does not exist.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • vmid: ID of the VM
  • param: guest physical address. This gpa points to struct acrn_vm_pci_msix_remap

int32_t hcall_gpa_to_hpa(struct vm *vm, uint16_t vmid, uint64_t param)

translate guest physical address to host physical address

Translate guest physical address to host physical address for a VM. The function will return -1 if the target VM does not exist.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • vmid: ID of the VM
  • param: guest physical address. This gpa points to struct vm_gpa2hpa

int32_t hcall_assign_ptdev(struct vm *vm, uint16_t vmid, uint64_t param)

Assign one passthrough dev to VM.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • vmid: ID of the VM
  • param: guest physical address. This gpa points to physical BDF of the assigning ptdev

int32_t hcall_deassign_ptdev(struct vm *vm, uint16_t vmid, uint64_t param)

Deassign one passthrough dev from VM.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • vmid: ID of the VM
  • param: guest physical address. This gpa points to physical BDF of the deassigning ptdev

int32_t hcall_set_ptdev_intr_info(struct vm *vm, uint16_t vmid, uint64_t param)

Set interrupt mapping info of ptdev.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • vmid: ID of the VM
  • param: guest physical address. This gpa points to data structure of hc_ptdev_irq including intr remapping info

int32_t hcall_reset_ptdev_intr_info(struct vm *vm, uint16_t vmid, uint64_t param)

Clear interrupt mapping info of ptdev.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • vmid: ID of the VM
  • param: guest physical address. This gpa points to data structure of hc_ptdev_irq including intr remapping info

int32_t hcall_setup_sbuf(struct vm *vm, uint64_t param)

Setup a share buffer for a VM.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • param: guest physical address. This gpa points to struct sbuf_setup_param

int32_t hcall_setup_hv_npk_log(struct vm *vm, uint64_t param)

Setup the hypervisor NPK log.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: Pointer to VM data structure
  • param: guest physical address. This gpa points to struct hv_npk_log_param

int32_t hcall_get_cpu_pm_state(struct vm *vm, uint64_t cmd, uint64_t param)

Get VCPU Power state.

Pre
Pointer vm shall point to VM0
Return
0 on success, non-zero on error.
Parameters
  • vm: pointer to VM data structure
  • cmd: cmd to show get which VCPU power state data
  • param: VCPU power state data

struct mmio_request
#include <acrn_common.h>

Public Members

uint32_t direction
uint32_t reserved
uint64_t address
uint64_t size
uint64_t value
struct pio_request
#include <acrn_common.h>

Public Members

uint32_t direction
uint32_t reserved
uint64_t address
uint64_t size
uint32_t value
struct pci_request
#include <acrn_common.h>

Public Members

uint32_t direction
uint32_t reserved[3]
int64_t size
int32_t value
int32_t bus
int32_t dev
int32_t func
int32_t reg
union vhm_io_request
#include <acrn_common.h>

Public Members

struct pio_request pio
struct pci_request pci
struct mmio_request mmio
int64_t reserved1[8]
struct vhm_request
#include <acrn_common.h>

256-byte VHM requests

The state transitions of a VHM request are:

FREE -> PENDING -> PROCESSING -> COMPLETE -> FREE -> …

When a request is in COMPLETE or FREE state, the request is owned by the hypervisor. SOS (VHM or DM) shall not read or write the internals of the request except the state.

When a request is in PENDING or PROCESSING state, the request is owned by SOS. The hypervisor shall not read or write the request other than the state.

Based on the rules above, a typical VHM request lifecycle should looks like the following.

                (assume the initial state is FREE)

  SOS vCPU 0                SOS vCPU x                    UOS vCPU y

                                            hypervisor:
                                                fill in type, addr, etc.
                                                pause UOS vcpu y
                                                set state to PENDING (a)
                                                fire upcall to SOS vCPU 0

VHM: scan for pending requests set state to PROCESSING (b) assign requests to clients (c)

                  client:
                      scan for assigned requests
                      handle the requests (d)
                      set state to COMPLETE
                      notify the hypervisor

                  hypervisor:
                      resume UOS vcpu y (e)

                                       hypervisor:
                                           post-work (f)
                                           set state to FREE

Note that the following shall hold.

  1. (a) happens before (b)
  2. (c) happens before (d)
  3. (e) happens before (f)
  4. One vCPU cannot trigger another I/O request before the previous one has completed (i.e. the state switched to FREE)

Accesses to the state of a vhm_request shall be atomic and proper barriers are needed to ensure that:

  1. Setting state to PENDING is the last operation when issuing a request in the hypervisor, as the hypervisor shall not access the request any more.
  2. Due to similar reasons, setting state to COMPLETE is the last operation of request handling in VHM or clients in SOS.

Public Members

uint32_t type

Type of this request.

Byte offset: 0.

uint32_t reserved0[15]

Reserved.

Byte offset: 4.

union vhm_io_request reqs

Details about this request. For REQ_PORTIO, this has type pio_request. For REQ_MMIO and REQ_WP, this has type mmio_request. For REQ_PCICFG, this has type pci_request.

Byte offset: 64.

int32_t valid

Whether this request is valid for processing. ACRN write, VHM read only.

Warning; this field is obsolete and will be removed soon.

Byte offset: 128.

int32_t client

The client which is distributed to handle this request. Accessed by VHM only.

Byte offset: 132.

uint32_t processed

The status of this request, taking REQ_STATE_xxx as values.

Byte offset: 136.

union vhm_request_buffer
#include <acrn_common.h>

Public Members

struct vhm_request req_queue[VHM_REQUEST_MAX]
int8_t reserved[4096]
struct acrn_create_vm
#include <acrn_common.h>

Info to create a VM, the parameter for HC_CREATE_VM hypercall.

Public Members

uint16_t vmid

created vmid return to VHM. Keep it first field

uint16_t reserved0

Reserved

uint16_t vcpu_num

VCPU numbers this VM want to create

uint16_t reserved1

Reserved

uint8_t GUID[16]

the GUID of this VM

uint64_t vm_flag
uint8_t reserved2[24]

Reserved for future use

struct acrn_create_vcpu
#include <acrn_common.h>

Info to create a VCPU.

the parameter for HC_CREATE_VCPU hypercall

Public Members

uint16_t vcpu_id

the virtual CPU ID for the VCPU created

uint16_t pcpu_id

the physical CPU ID for the VCPU created

struct acrn_set_ioreq_buffer
#include <acrn_common.h>

Info to set ioreq buffer for a created VM.

the parameter for HC_SET_IOREQ_BUFFER hypercall

Public Members

uint64_t req_buf

guest physical address of VM request_buffer

struct acrn_irqline
#include <acrn_common.h>

Info to assert/deassert/pulse a virtual IRQ line for a VM.

the parameter for HC_ASSERT_IRQLINE/HC_DEASSERT_IRQLINE/HC_PULSE_IRQLINE hypercall

Public Members

uint32_t intr_type

interrupt type which could be IOAPIC or ISA

uint32_t reserved

reserved for alignment padding

uint32_t pic_irq

pic IRQ for ISA type

uint32_t reserved0

Reserved

uint32_t ioapic_irq

ioapic IRQ for IOAPIC & ISA TYPE, if ~0U then this IRQ will not be injected

uint32_t reserved1

Reserved

struct acrn_msi_entry
#include <acrn_common.h>

Info to inject a MSI interrupt to VM.

the parameter for HC_INJECT_MSI hypercall

Public Members

uint64_t msi_addr

MSI addr[19:12] with dest VCPU ID

uint64_t msi_data

MSI data[7:0] with vector

struct acrn_nmi_entry
#include <acrn_common.h>

Info to inject a NMI interrupt for a VM.

Public Members

uint16_t vcpu_id

virtual CPU ID to inject

uint16_t reserved0

Reserved

uint32_t reserved1

Reserved

struct acrn_vm_pci_msix_remap
#include <acrn_common.h>

Info to remap pass-through PCI MSI for a VM.

the parameter for HC_VM_PCI_MSIX_REMAP hypercall

Public Members

uint16_t virt_bdf

pass-through PCI device virtual BDF#

uint16_t phys_bdf

pass-through PCI device physical BDF#

uint16_t msi_ctl

pass-through PCI device MSI/MSI-X cap control data

uint16_t reserved

reserved for alignment padding

uint64_t msi_addr

pass-through PCI device MSI address to remap, which will return the caller after remapping

uint32_t msi_data

pass-through PCI device MSI data to remap, which will return the caller after remapping

int32_t msix

pass-through PCI device is MSI or MSI-X 0 - MSI, 1 - MSI-X

uint32_t msix_entry_index

if the pass-through PCI device is MSI-X, this field contains the MSI-X entry table index

uint32_t vector_ctl

if the pass-through PCI device is MSI-X, this field contains Vector Control for MSI-X Entry, field defined in MSI-X spec

struct acpi_generic_address
#include <acrn_common.h>

Public Members

uint8_t space_id
uint8_t bit_width
uint8_t bit_offset
uint8_t access_size
uint64_t address
struct cpu_cx_data
#include <acrn_common.h>

Public Members

struct acpi_generic_address cx_reg
uint8_t type
uint32_t latency
uint64_t power
struct cpu_px_data
#include <acrn_common.h>

Public Members

uint64_t core_frequency
uint64_t power
uint64_t transition_latency
uint64_t bus_master_latency
uint64_t control
uint64_t status
struct acpi_sx_pkg
#include <acrn_common.h>

Public Members

uint8_t val_pm1a
uint8_t val_pm1b
uint16_t reserved
struct pm_s_state_data
#include <acrn_common.h>

Public Members

struct acpi_generic_address pm1a_evt
struct acpi_generic_address pm1b_evt
struct acpi_generic_address pm1a_cnt
struct acpi_generic_address pm1b_cnt
struct acpi_sx_pkg s3_pkg
struct acpi_sx_pkg s5_pkg
uint32_t *wake_vector_32
uint64_t *wake_vector_64
struct vm_memory_region
#include <acrn_hv_defs.h>

Info to set guest memory region mapping.

the parameter for HC_VM_SET_MEMORY_REGION hypercall

Public Members

uint32_t type

set memory region type: MR_ADD or MAP_DEL

uint32_t prot

memory attributes: memory type + RWX access right

uint64_t gpa

the beginning guest physical address of the memory reion

uint64_t vm0_gpa

VM0’s guest physcial address which gpa will be mapped to

uint64_t size

size of the memory region

struct set_regions
#include <acrn_hv_defs.h>

set multi memory regions, used for HC_VM_SET_MEMORY_REGIONS

Public Members

uint16_t vmid

vmid for this hypercall

uint16_t reserved0

Reserved

uint32_t reserved1

Reserved

uint32_t mr_num

memory region numbers

uint64_t regions_gpa

the gpa of regions buffer, point to the regions array: struct vm_memory_region regions[mr_num] the max buffer size is one page.

struct wp_data
#include <acrn_hv_defs.h>

Info to change guest one page write protect permission.

the parameter for HC_VM_WRITE_PROTECT_PAGE hypercall

Public Members

uint8_t set

set page write protect permission. ture: set the wp; flase: clear the wp

uint64_t pad

Reserved

uint64_t gpa

the guest physical address of the page to change

struct sbuf_setup_param
#include <acrn_hv_defs.h>

Setup parameter for share buffer, used for HC_SETUP_SBUF hypercall

Public Members

uint16_t pcpu_id

sbuf physical cpu id

uint16_t reserved

Reserved

uint32_t sbuf_id

sbuf id

uint64_t gpa

sbuf’s guest physical address

struct hv_npk_log_param
#include <acrn_hv_defs.h>

Info to setup the hypervisor NPK log.

the parameter for HC_SETUP_HV_NPK_LOG hypercall

Public Members

uint16_t cmd

the setup command for the hypervisor NPK log

uint16_t res

the setup result for the hypervisor NPK log

uint16_t loglevel

the loglevel for the hypervisor NPK log

uint16_t reserved

Reserved

uint64_t mmio_addr

the MMIO address for the hypervisor NPK log

struct vm_gpa2hpa
#include <acrn_hv_defs.h>

Gpa to hpa translation parameter, used for HC_VM_GPA2HPA hypercall

Public Members

uint64_t gpa

gpa to do translation

uint64_t hpa

hpa to return after translation

struct hc_ptdev_irq
#include <acrn_hv_defs.h>

Intr mapping info per ptdev, the parameter for HC_SET_PTDEV_INTR_INFO hypercall

Public Members

uint32_t type

irq mapping type: INTX or MSI

uint16_t virt_bdf

virtual BDF of the ptdev

uint16_t phys_bdf

physical BDF of the ptdev

union hc_ptdev_irq::@0 hc_ptdev_irq::is
union

Public Members

INTX remapping info

MSIx remapping info

struct

INTX remapping info

Public Members

virtual IOAPIC/PIC pin

Reserved

physical IOAPIC pin

Reserved

is virtual pin from PIC

Reserved

struct

MSIx remapping info

Public Members

vector count of MSI/MSIX

struct hc_api_version
#include <acrn_hv_defs.h>

Hypervisor api version info, return it for HC_GET_API_VERSION hypercall

Public Members

uint32_t major_version

hypervisor api major version

uint32_t minor_version

hypervisor api minor version

struct trusty_boot_param
#include <acrn_hv_defs.h>

Trusty boot params, used for HC_INITIALIZE_TRUSTY

Public Members

uint32_t size_of_this_struct

sizeof this structure

uint32_t version

version of this structure

uint32_t base_addr

trusty runtime memory base address

uint32_t entry_point

trusty entry point

uint32_t mem_size

trusty runtime memory size

uint32_t padding

padding

uint32_t base_addr_high

trusty runtime memory base address (high 32bit)

uint32_t entry_point_high

trusty entry point (high 32bit)

uint8_t rpmb_key[64]

rpmb key