sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget0/translations/zh_CN/virt/kvm/devices/arm-vgic-v3modnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/zh_TW/virt/kvm/devices/arm-vgic-v3modnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/it_IT/virt/kvm/devices/arm-vgic-v3modnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/ja_JP/virt/kvm/devices/arm-vgic-v3modnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/ko_KR/virt/kvm/devices/arm-vgic-v3modnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/sp_SP/virt/kvm/devices/arm-vgic-v3modnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhJ/var/lib/git/docbuild/linux/Documentation/virt/kvm/devices/arm-vgic-v3.rsthKubhsection)}(hhh](htitle)}(h>ARM Virtual Generic Interrupt Controller v3 and later (VGICv3)h]h>ARM Virtual Generic Interrupt Controller v3 and later (VGICv3)}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhdefinition_list)}(hhh]hdefinition_list_item)}(h]Device types supported: - KVM_DEV_TYPE_ARM_VGIC_V3 ARM Generic Interrupt Controller v3.0 h](hterm)}(hDevice types supported:h]hDevice types supported:}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhubh definition)}(hhh]h bullet_list)}(hhh]h list_item)}(hCKVM_DEV_TYPE_ARM_VGIC_V3 ARM Generic Interrupt Controller v3.0 h]h paragraph)}(hBKVM_DEV_TYPE_ARM_VGIC_V3 ARM Generic Interrupt Controller v3.0h]hBKVM_DEV_TYPE_ARM_VGIC_V3 ARM Generic Interrupt Controller v3.0}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhubah}(h]h ]h"]h$]h&]uh1hhhubah}(h]h ]h"]h$]h&]bullet-uh1hhhhK hhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhK hhubah}(h]h ]h"]h$]h&]uh1hhhhhhNhNubh)}(hX Only one VGIC instance may be instantiated through this API. The created VGIC will act as the VM interrupt controller, requiring emulated user-space devices to inject interrupts to the VGIC instead of directly to CPUs. It is not possible to create both a GICv3 and GICv2 on the same VM.h]hX Only one VGIC instance may be instantiated through this API. The created VGIC will act as the VM interrupt controller, requiring emulated user-space devices to inject interrupts to the VGIC instead of directly to CPUs. It is not possible to create both a GICv3 and GICv2 on the same VM.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(haddr. ======= ============================================================= KVM_DEV_ARM_VGIC_GRP_DIST_REGS, KVM_DEV_ARM_VGIC_GRP_REDIST_REGS Attributes: The attr field of kvm_device_attr encodes two values:: bits: | 63 .... 32 | 31 .... 0 | values: | mpidr | offset | All distributor regs are (rw, 32-bit) and kvm_device_attr.addr points to a __u32 value. 64-bit registers must be accessed by separately accessing the lower and higher word. Writes to read-only registers are ignored by the kernel. KVM_DEV_ARM_VGIC_GRP_DIST_REGS accesses the main distributor registers. KVM_DEV_ARM_VGIC_GRP_REDIST_REGS accesses the redistributor of the CPU specified by the mpidr. The offset is relative to the "[Re]Distributor base address" as defined in the GICv3/4 specs. Getting or setting such a register has the same effect as reading or writing the register on real hardware, except for the following registers: GICD_STATUSR, GICR_STATUSR, GICD_ISPENDR, GICR_ISPENDR0, GICD_ICPENDR, and GICR_ICPENDR0. These registers behave differently when accessed via this interface compared to their architecturally defined behavior to allow software a full view of the VGIC's internal state. The mpidr field is used to specify which redistributor is accessed. The mpidr is ignored for the distributor. The mpidr encoding is based on the affinity information in the architecture defined MPIDR, and the field is encoded as follows:: | 63 .... 56 | 55 .... 48 | 47 .... 40 | 39 .... 32 | | Aff3 | Aff2 | Aff1 | Aff0 | Note that distributor fields are not banked, but return the same value regardless of the mpidr used to access the register. GICD_IIDR.Revision is updated when the KVM implementation is changed in a way directly observable by the guest or userspace. Userspace should read GICD_IIDR from KVM and write back the read value to confirm its expected behavior is aligned with the KVM implementation. Userspace should set GICD_IIDR before setting any other registers to ensure the expected behavior. The GICD_STATUSR and GICR_STATUSR registers are architecturally defined such that a write of a clear bit has no effect, whereas a write with a set bit clears that value. To allow userspace to freely set the values of these two registers, setting the attributes with the register offsets for these two registers simply sets the non-reserved bits to the value written. Accesses (reads and writes) to the GICD_ISPENDR register region and GICR_ISPENDR0 registers get/set the value of the latched pending state for the interrupts. This is identical to the value returned by a guest read from ISPENDR for an edge triggered interrupt, but may differ for level triggered interrupts. For edge triggered interrupts, once an interrupt becomes pending (whether because of an edge detected on the input line or because of a guest write to ISPENDR) this state is "latched", and only cleared when either the interrupt is activated or when the guest writes to ICPENDR. A level triggered interrupt may be pending either because the level input is held high by a device, or because of a guest write to the ISPENDR register. Only ISPENDR writes are latched; if the device lowers the line level then the interrupt is no longer pending unless the guest also wrote to ISPENDR, and conversely writes to ICPENDR or activations of the interrupt do not clear the pending status if the line level is still being held high. (These rules are documented in the GICv3 specification descriptions of the ICPENDR and ISPENDR registers.) For a level triggered interrupt the value accessed here is that of the latch which is set by ISPENDR and cleared by ICPENDR or interrupt activation, whereas the value returned by a guest read from ISPENDR is the logical OR of the latch value and the input line level. Raw access to the latch state is provided to userspace so that it can save and restore the entire GIC internal state (which is defined by the combination of the current input line level and the latch state, and cannot be deduced from purely the line level and the value of the ISPENDR registers). Accesses to GICD_ICPENDR register region and GICR_ICPENDR0 registers have RAZ/WI semantics, meaning that reads always return 0 and writes are always ignored. Errors: ====== ===================================================== -ENXIO Getting or setting this register is not yet supported -EBUSY One or more VCPUs are running ====== ===================================================== KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS Attributes: The attr field of kvm_device_attr encodes two values:: bits: | 63 .... 32 | 31 .... 16 | 15 .... 0 | values: | mpidr | RES | instr | The mpidr field encodes the CPU ID based on the affinity information in the architecture defined MPIDR, and the field is encoded as follows:: | 63 .... 56 | 55 .... 48 | 47 .... 40 | 39 .... 32 | | Aff3 | Aff2 | Aff1 | Aff0 | The instr field encodes the system register to access based on the fields defined in the A64 instruction set encoding for system register access (RES means the bits are reserved for future use and should be zero):: | 15 ... 14 | 13 ... 11 | 10 ... 7 | 6 ... 3 | 2 ... 0 | | Op 0 | Op1 | CRn | CRm | Op2 | All system regs accessed through this API are (rw, 64-bit) and kvm_device_attr.addr points to a __u64 value. KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS accesses the CPU interface registers for the CPU specified by the mpidr field. CPU interface registers access is not implemented for AArch32 mode. Error -ENXIO is returned when accessed in AArch32 mode. Errors: ======= ===================================================== -ENXIO Getting or setting this register is not yet supported -EBUSY VCPU is running -EINVAL Invalid mpidr or register value supplied ======= ===================================================== KVM_DEV_ARM_VGIC_GRP_NR_IRQS Attributes: A value describing the number of interrupts (SGI, PPI and SPI) for this GIC instance, ranging from 64 to 1024, in increments of 32. kvm_device_attr.addr points to a __u32 value. Errors: ======= ====================================== -EINVAL Value set is out of the expected range -EBUSY Value has already be set. ======= ====================================== KVM_DEV_ARM_VGIC_GRP_CTRL Attributes: KVM_DEV_ARM_VGIC_CTRL_INIT request the initialization of the VGIC, no additional parameter in kvm_device_attr.addr. Must be called after all VCPUs have been created. KVM_DEV_ARM_VGIC_SAVE_PENDING_TABLES save all LPI pending bits into guest RAM pending tables. The first kB of the pending table is not altered by this operation. Errors: ======= ======================================================== -ENXIO VGIC not properly configured as required prior to calling this attribute -ENODEV no online VCPU -ENOMEM memory shortage when allocating vgic internal data -EFAULT Invalid guest ram access -EBUSY One or more VCPUS are running ======= ======================================================== KVM_DEV_ARM_VGIC_GRP_LEVEL_INFO Attributes: The attr field of kvm_device_attr encodes the following values:: bits: | 63 .... 32 | 31 .... 10 | 9 .... 0 | values: | mpidr | info | vINTID | The vINTID specifies which set of IRQs is reported on. The info field specifies which information userspace wants to get or set using this interface. Currently we support the following info values: VGIC_LEVEL_INFO_LINE_LEVEL: Get/Set the input level of the IRQ line for a set of 32 contiguously numbered interrupts. vINTID must be a multiple of 32. kvm_device_attr.addr points to a __u32 value which will contain a bitmap where a set bit means the interrupt level is asserted. Bit[n] indicates the status for interrupt vINTID + n. SGIs and any interrupt with a higher ID than the number of interrupts supported, will be RAZ/WI. LPIs are always edge-triggered and are therefore not supported by this interface. PPIs are reported per VCPU as specified in the mpidr field, and SPIs are reported with the same value regardless of the mpidr specified. The mpidr field encodes the CPU ID based on the affinity information in the architecture defined MPIDR, and the field is encoded as follows:: | 63 .... 56 | 55 .... 48 | 47 .... 40 | 39 .... 32 | | Aff3 | Aff2 | Aff1 | Aff0 | Errors: ======= ============================================= -EINVAL vINTID is not multiple of 32 or info field is not VGIC_LEVEL_INFO_LINE_LEVEL ======= ============================================= KVM_DEV_ARM_VGIC_GRP_MAINT_IRQ Attributes: The attr field of kvm_device_attr encodes the following values: bits: | 31 .... 5 | 4 .... 0 | values: | RES0 | vINTID | The vINTID specifies which interrupt is generated when the vGIC must generate a maintenance interrupt. This must be a PPI.h](h)}(hGroups:h]hGroups:}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM3hjCubh)}(hhh](h)}(hhh]h)}(hXKVM_DEV_ARM_VGIC_GRP_ADDR Attributes: KVM_VGIC_V3_ADDR_TYPE_DIST (rw, 64-bit) Base address in the guest physical address space of the GICv3 distributor register mappings. Only valid for KVM_DEV_TYPE_ARM_VGIC_V3. This address needs to be 64K aligned and the region covers 64 KByte. KVM_VGIC_V3_ADDR_TYPE_REDIST (rw, 64-bit) Base address in the guest physical address space of the GICv3 redistributor register mappings. There are two 64K pages for each VCPU and all of the redistributor pages are contiguous. Only valid for KVM_DEV_TYPE_ARM_VGIC_V3. This address needs to be 64K aligned. KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION (rw, 64-bit) The attribute data pointed to by kvm_device_attr.addr is a __u64 value:: bits: | 63 .... 52 | 51 .... 16 | 15 - 12 |11 - 0 values: | count | base | flags | index - index encodes the unique redistributor region index - flags: reserved for future use, currently 0 - base field encodes bits [51:16] of the guest physical base address of the first redistributor in the region. - count encodes the number of redistributors in the region. Must be greater than 0. There are two 64K pages for each redistributor in the region and redistributors are laid out contiguously within the region. Regions are filled with redistributors in the index order. The sum of all region count fields must be greater than or equal to the number of VCPUs. Redistributor regions must be registered in the incremental index order, starting from index 0. The characteristics of a specific redistributor region can be read by presetting the index field in the attr data. Only valid for KVM_DEV_TYPE_ARM_VGIC_V3. h](h)}(hKVM_DEV_ARM_VGIC_GRP_ADDRh]hKVM_DEV_ARM_VGIC_GRP_ADDR}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK9hj[ubh)}(hhh](h)}(h Attributes:h]h Attributes:}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjmubh block_quote)}(hXKVM_VGIC_V3_ADDR_TYPE_DIST (rw, 64-bit) Base address in the guest physical address space of the GICv3 distributor register mappings. Only valid for KVM_DEV_TYPE_ARM_VGIC_V3. This address needs to be 64K aligned and the region covers 64 KByte. KVM_VGIC_V3_ADDR_TYPE_REDIST (rw, 64-bit) Base address in the guest physical address space of the GICv3 redistributor register mappings. There are two 64K pages for each VCPU and all of the redistributor pages are contiguous. Only valid for KVM_DEV_TYPE_ARM_VGIC_V3. This address needs to be 64K aligned. KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION (rw, 64-bit) The attribute data pointed to by kvm_device_attr.addr is a __u64 value:: bits: | 63 .... 52 | 51 .... 16 | 15 - 12 |11 - 0 values: | count | base | flags | index - index encodes the unique redistributor region index - flags: reserved for future use, currently 0 - base field encodes bits [51:16] of the guest physical base address of the first redistributor in the region. - count encodes the number of redistributors in the region. Must be greater than 0. There are two 64K pages for each redistributor in the region and redistributors are laid out contiguously within the region. Regions are filled with redistributors in the index order. The sum of all region count fields must be greater than or equal to the number of VCPUs. Redistributor regions must be registered in the incremental index order, starting from index 0. The characteristics of a specific redistributor region can be read by presetting the index field in the attr data. Only valid for KVM_DEV_TYPE_ARM_VGIC_V3. h]h)}(hhh](h)}(hKVM_VGIC_V3_ADDR_TYPE_DIST (rw, 64-bit) Base address in the guest physical address space of the GICv3 distributor register mappings. Only valid for KVM_DEV_TYPE_ARM_VGIC_V3. This address needs to be 64K aligned and the region covers 64 KByte. h](h)}(h'KVM_VGIC_V3_ADDR_TYPE_DIST (rw, 64-bit)h]h'KVM_VGIC_V3_ADDR_TYPE_DIST (rw, 64-bit)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(hhh]h)}(hBase address in the guest physical address space of the GICv3 distributor register mappings. Only valid for KVM_DEV_TYPE_ARM_VGIC_V3. This address needs to be 64K aligned and the region covers 64 KByte.h]hBase address in the guest physical address space of the GICv3 distributor register mappings. Only valid for KVM_DEV_TYPE_ARM_VGIC_V3. This address needs to be 64K aligned and the region covers 64 KByte.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(hX1KVM_VGIC_V3_ADDR_TYPE_REDIST (rw, 64-bit) Base address in the guest physical address space of the GICv3 redistributor register mappings. There are two 64K pages for each VCPU and all of the redistributor pages are contiguous. Only valid for KVM_DEV_TYPE_ARM_VGIC_V3. This address needs to be 64K aligned. h](h)}(h)KVM_VGIC_V3_ADDR_TYPE_REDIST (rw, 64-bit)h]h)KVM_VGIC_V3_ADDR_TYPE_REDIST (rw, 64-bit)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK!hjubh)}(hhh]h)}(hXBase address in the guest physical address space of the GICv3 redistributor register mappings. There are two 64K pages for each VCPU and all of the redistributor pages are contiguous. Only valid for KVM_DEV_TYPE_ARM_VGIC_V3. This address needs to be 64K aligned.h]hXBase address in the guest physical address space of the GICv3 redistributor register mappings. There are two 64K pages for each VCPU and all of the redistributor pages are contiguous. Only valid for KVM_DEV_TYPE_ARM_VGIC_V3. This address needs to be 64K aligned.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhK!hjubh)}(hX:KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION (rw, 64-bit) The attribute data pointed to by kvm_device_attr.addr is a __u64 value:: bits: | 63 .... 52 | 51 .... 16 | 15 - 12 |11 - 0 values: | count | base | flags | index - index encodes the unique redistributor region index - flags: reserved for future use, currently 0 - base field encodes bits [51:16] of the guest physical base address of the first redistributor in the region. - count encodes the number of redistributors in the region. Must be greater than 0. There are two 64K pages for each redistributor in the region and redistributors are laid out contiguously within the region. Regions are filled with redistributors in the index order. The sum of all region count fields must be greater than or equal to the number of VCPUs. Redistributor regions must be registered in the incremental index order, starting from index 0. The characteristics of a specific redistributor region can be read by presetting the index field in the attr data. Only valid for KVM_DEV_TYPE_ARM_VGIC_V3. h](h)}(h0KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION (rw, 64-bit)h]h0KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION (rw, 64-bit)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK9hjubh)}(hhh](h)}(hHThe attribute data pointed to by kvm_device_attr.addr is a __u64 value::h]hGThe attribute data pointed to by kvm_device_attr.addr is a __u64 value:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK$hjubh literal_block)}(hbits: | 63 .... 52 | 51 .... 16 | 15 - 12 |11 - 0 values: | count | base | flags | indexh]hbits: | 63 .... 52 | 51 .... 16 | 15 - 12 |11 - 0 values: | count | base | flags | index}hj sbah}(h]h ]h"]h$]h&]hhuh1jhhhK&hjubh)}(hhh](h)}(h3index encodes the unique redistributor region indexh]h)}(hjh]h3index encodes the unique redistributor region index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hjubah}(h]h ]h"]h$]h&]uh1hhjubh)}(h+flags: reserved for future use, currently 0h]h)}(hj4h]h+flags: reserved for future use, currently 0}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hj2ubah}(h]h ]h"]h$]h&]uh1hhjubh)}(hlbase field encodes bits [51:16] of the guest physical base address of the first redistributor in the region.h]h)}(hlbase field encodes bits [51:16] of the guest physical base address of the first redistributor in the region.h]hlbase field encodes bits [51:16] of the guest physical base address of the first redistributor in the region.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK+hjIubah}(h]h ]h"]h$]h&]uh1hhjubh)}(hRcount encodes the number of redistributors in the region. Must be greater than 0. h]h)}(hQcount encodes the number of redistributors in the region. Must be greater than 0.h]hQcount encodes the number of redistributors in the region. Must be greater than 0.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hjaubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]jjuh1hhhhK)hjubh)}(hXpThere are two 64K pages for each redistributor in the region and redistributors are laid out contiguously within the region. Regions are filled with redistributors in the index order. The sum of all region count fields must be greater than or equal to the number of VCPUs. Redistributor regions must be registered in the incremental index order, starting from index 0.h]hXpThere are two 64K pages for each redistributor in the region and redistributors are laid out contiguously within the region. Regions are filled with redistributors in the index order. The sum of all region count fields must be greater than or equal to the number of VCPUs. Redistributor regions must be registered in the incremental index order, starting from index 0.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjubh)}(hThe characteristics of a specific redistributor region can be read by presetting the index field in the attr data. Only valid for KVM_DEV_TYPE_ARM_VGIC_V3.h]hThe characteristics of a specific redistributor region can be read by presetting the index field in the attr data. Only valid for KVM_DEV_TYPE_ARM_VGIC_V3.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hjubeh}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhK9hjubeh}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j~hhhKhjmubeh}(h]h ]h"]h$]h&]uh1hhj[ubeh}(h]h ]h"]h$]h&]uh1hhhhK9hjXubah}(h]h ]h"]h$]h&]uh1hhjUubh)}(hpIt is invalid to mix calls with KVM_VGIC_V3_ADDR_TYPE_REDIST and KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION attributes.h]hpIt is invalid to mix calls with KVM_VGIC_V3_ADDR_TYPE_REDIST and KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION attributes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hjUubh)}(hXNote that to obtain reproducible results (the same VCPU being associated with the same redistributor across a save/restore operation), VCPU creation order, redistributor region creation order as well as the respective interleaves of VCPU and region creation MUST be preserved. Any change in either ordering may result in a different vcpu_id/redistributor association, resulting in a VM that will fail to run at restore time.h]hXNote that to obtain reproducible results (the same VCPU being associated with the same redistributor across a save/restore operation), VCPU creation order, redistributor region creation order as well as the respective interleaves of VCPU and region creation MUST be preserved. Any change in either ordering may result in a different vcpu_id/redistributor association, resulting in a VM that will fail to run at restore time.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK>hjUubh)}(hErrors:h]hErrors:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhjUubj)}(hX`======= ============================================================= -E2BIG Address outside of addressable IPA range -EINVAL Incorrectly aligned address, bad redistributor region count/index, mixed redistributor region attribute usage -EEXIST Address already configured -ENOENT Attempt to read the characteristics of a non existing redistributor region -ENXIO The group or attribute is unknown/unsupported for this device or hardware support is missing. -EFAULT Invalid user pointer for attr->addr. ======= ============================================================= h]htable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK=uh1jhjubhtbody)}(hhh](hrow)}(hhh](hentry)}(hhh]h)}(h-E2BIGh]h-E2BIG}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKHhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h(Address outside of addressable IPA rangeh]h(Address outside of addressable IPA range}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKHhj6ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h-EINVALh]h-EINVAL}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhjVubah}(h]h ]h"]h$]h&]uh1jhjSubj)}(hhh]h)}(hmIncorrectly aligned address, bad redistributor region count/index, mixed redistributor region attribute usageh]hmIncorrectly aligned address, bad redistributor region count/index, mixed redistributor region attribute usage}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhjmubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h-EEXISTh]h-EEXIST}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hAddress already configuredh]hAddress already configured}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h-ENOENTh]h-ENOENT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKLhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hJAttempt to read the characteristics of a non existing redistributor regionh]hJAttempt to read the characteristics of a non existing redistributor region}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKLhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h-ENXIOh]h-ENXIO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKNhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h]The group or attribute is unknown/unsupported for this device or hardware support is missing.h]h]The group or attribute is unknown/unsupported for this device or hardware support is missing.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKNhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h-EFAULTh]h-EFAULT}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhj2ubah}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh]h)}(h$Invalid user pointer for attr->addr.h]h$Invalid user pointer for attr->addr.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhjIubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j~hhhKGhjUubh)}(hhh]h)}(hXKVM_DEV_ARM_VGIC_GRP_DIST_REGS, KVM_DEV_ARM_VGIC_GRP_REDIST_REGS Attributes: The attr field of kvm_device_attr encodes two values:: bits: | 63 .... 32 | 31 .... 0 | values: | mpidr | offset | All distributor regs are (rw, 32-bit) and kvm_device_attr.addr points to a __u32 value. 64-bit registers must be accessed by separately accessing the lower and higher word. Writes to read-only registers are ignored by the kernel. KVM_DEV_ARM_VGIC_GRP_DIST_REGS accesses the main distributor registers. KVM_DEV_ARM_VGIC_GRP_REDIST_REGS accesses the redistributor of the CPU specified by the mpidr. The offset is relative to the "[Re]Distributor base address" as defined in the GICv3/4 specs. Getting or setting such a register has the same effect as reading or writing the register on real hardware, except for the following registers: GICD_STATUSR, GICR_STATUSR, GICD_ISPENDR, GICR_ISPENDR0, GICD_ICPENDR, and GICR_ICPENDR0. These registers behave differently when accessed via this interface compared to their architecturally defined behavior to allow software a full view of the VGIC's internal state. The mpidr field is used to specify which redistributor is accessed. The mpidr is ignored for the distributor. The mpidr encoding is based on the affinity information in the architecture defined MPIDR, and the field is encoded as follows:: | 63 .... 56 | 55 .... 48 | 47 .... 40 | 39 .... 32 | | Aff3 | Aff2 | Aff1 | Aff0 | Note that distributor fields are not banked, but return the same value regardless of the mpidr used to access the register. GICD_IIDR.Revision is updated when the KVM implementation is changed in a way directly observable by the guest or userspace. Userspace should read GICD_IIDR from KVM and write back the read value to confirm its expected behavior is aligned with the KVM implementation. Userspace should set GICD_IIDR before setting any other registers to ensure the expected behavior. The GICD_STATUSR and GICR_STATUSR registers are architecturally defined such that a write of a clear bit has no effect, whereas a write with a set bit clears that value. To allow userspace to freely set the values of these two registers, setting the attributes with the register offsets for these two registers simply sets the non-reserved bits to the value written. Accesses (reads and writes) to the GICD_ISPENDR register region and GICR_ISPENDR0 registers get/set the value of the latched pending state for the interrupts. This is identical to the value returned by a guest read from ISPENDR for an edge triggered interrupt, but may differ for level triggered interrupts. For edge triggered interrupts, once an interrupt becomes pending (whether because of an edge detected on the input line or because of a guest write to ISPENDR) this state is "latched", and only cleared when either the interrupt is activated or when the guest writes to ICPENDR. A level triggered interrupt may be pending either because the level input is held high by a device, or because of a guest write to the ISPENDR register. Only ISPENDR writes are latched; if the device lowers the line level then the interrupt is no longer pending unless the guest also wrote to ISPENDR, and conversely writes to ICPENDR or activations of the interrupt do not clear the pending status if the line level is still being held high. (These rules are documented in the GICv3 specification descriptions of the ICPENDR and ISPENDR registers.) For a level triggered interrupt the value accessed here is that of the latch which is set by ISPENDR and cleared by ICPENDR or interrupt activation, whereas the value returned by a guest read from ISPENDR is the logical OR of the latch value and the input line level. Raw access to the latch state is provided to userspace so that it can save and restore the entire GIC internal state (which is defined by the combination of the current input line level and the latch state, and cannot be deduced from purely the line level and the value of the ISPENDR registers). Accesses to GICD_ICPENDR register region and GICR_ICPENDR0 registers have RAZ/WI semantics, meaning that reads always return 0 and writes are always ignored. h](h)}(h@KVM_DEV_ARM_VGIC_GRP_DIST_REGS, KVM_DEV_ARM_VGIC_GRP_REDIST_REGSh]h@KVM_DEV_ARM_VGIC_GRP_DIST_REGS, KVM_DEV_ARM_VGIC_GRP_REDIST_REGS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(hhh](h)}(h Attributes:h]h Attributes:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKUhjubj)}(hX7The attr field of kvm_device_attr encodes two values:: bits: | 63 .... 32 | 31 .... 0 | values: | mpidr | offset | All distributor regs are (rw, 32-bit) and kvm_device_attr.addr points to a __u32 value. 64-bit registers must be accessed by separately accessing the lower and higher word. Writes to read-only registers are ignored by the kernel. KVM_DEV_ARM_VGIC_GRP_DIST_REGS accesses the main distributor registers. KVM_DEV_ARM_VGIC_GRP_REDIST_REGS accesses the redistributor of the CPU specified by the mpidr. The offset is relative to the "[Re]Distributor base address" as defined in the GICv3/4 specs. Getting or setting such a register has the same effect as reading or writing the register on real hardware, except for the following registers: GICD_STATUSR, GICR_STATUSR, GICD_ISPENDR, GICR_ISPENDR0, GICD_ICPENDR, and GICR_ICPENDR0. These registers behave differently when accessed via this interface compared to their architecturally defined behavior to allow software a full view of the VGIC's internal state. The mpidr field is used to specify which redistributor is accessed. The mpidr is ignored for the distributor. The mpidr encoding is based on the affinity information in the architecture defined MPIDR, and the field is encoded as follows:: | 63 .... 56 | 55 .... 48 | 47 .... 40 | 39 .... 32 | | Aff3 | Aff2 | Aff1 | Aff0 | Note that distributor fields are not banked, but return the same value regardless of the mpidr used to access the register. GICD_IIDR.Revision is updated when the KVM implementation is changed in a way directly observable by the guest or userspace. Userspace should read GICD_IIDR from KVM and write back the read value to confirm its expected behavior is aligned with the KVM implementation. Userspace should set GICD_IIDR before setting any other registers to ensure the expected behavior. The GICD_STATUSR and GICR_STATUSR registers are architecturally defined such that a write of a clear bit has no effect, whereas a write with a set bit clears that value. To allow userspace to freely set the values of these two registers, setting the attributes with the register offsets for these two registers simply sets the non-reserved bits to the value written. Accesses (reads and writes) to the GICD_ISPENDR register region and GICR_ISPENDR0 registers get/set the value of the latched pending state for the interrupts. This is identical to the value returned by a guest read from ISPENDR for an edge triggered interrupt, but may differ for level triggered interrupts. For edge triggered interrupts, once an interrupt becomes pending (whether because of an edge detected on the input line or because of a guest write to ISPENDR) this state is "latched", and only cleared when either the interrupt is activated or when the guest writes to ICPENDR. A level triggered interrupt may be pending either because the level input is held high by a device, or because of a guest write to the ISPENDR register. Only ISPENDR writes are latched; if the device lowers the line level then the interrupt is no longer pending unless the guest also wrote to ISPENDR, and conversely writes to ICPENDR or activations of the interrupt do not clear the pending status if the line level is still being held high. (These rules are documented in the GICv3 specification descriptions of the ICPENDR and ISPENDR registers.) For a level triggered interrupt the value accessed here is that of the latch which is set by ISPENDR and cleared by ICPENDR or interrupt activation, whereas the value returned by a guest read from ISPENDR is the logical OR of the latch value and the input line level. Raw access to the latch state is provided to userspace so that it can save and restore the entire GIC internal state (which is defined by the combination of the current input line level and the latch state, and cannot be deduced from purely the line level and the value of the ISPENDR registers). Accesses to GICD_ICPENDR register region and GICR_ICPENDR0 registers have RAZ/WI semantics, meaning that reads always return 0 and writes are always ignored. h](h)}(h6The attr field of kvm_device_attr encodes two values::h]h5The attr field of kvm_device_attr encodes two values:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKWhjubj )}(h]bits: | 63 .... 32 | 31 .... 0 | values: | mpidr | offset |h]h]bits: | 63 .... 32 | 31 .... 0 | values: | mpidr | offset |}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKYhjubh)}(hAll distributor regs are (rw, 32-bit) and kvm_device_attr.addr points to a __u32 value. 64-bit registers must be accessed by separately accessing the lower and higher word.h]hAll distributor regs are (rw, 32-bit) and kvm_device_attr.addr points to a __u32 value. 64-bit registers must be accessed by separately accessing the lower and higher word.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK\hjubh)}(h8Writes to read-only registers are ignored by the kernel.h]h8Writes to read-only registers are ignored by the kernel.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK`hjubh)}(hKVM_DEV_ARM_VGIC_GRP_DIST_REGS accesses the main distributor registers. KVM_DEV_ARM_VGIC_GRP_REDIST_REGS accesses the redistributor of the CPU specified by the mpidr.h]hKVM_DEV_ARM_VGIC_GRP_DIST_REGS accesses the main distributor registers. KVM_DEV_ARM_VGIC_GRP_REDIST_REGS accesses the redistributor of the CPU specified by the mpidr.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhjubh)}(hXThe offset is relative to the "[Re]Distributor base address" as defined in the GICv3/4 specs. Getting or setting such a register has the same effect as reading or writing the register on real hardware, except for the following registers: GICD_STATUSR, GICR_STATUSR, GICD_ISPENDR, GICR_ISPENDR0, GICD_ICPENDR, and GICR_ICPENDR0. These registers behave differently when accessed via this interface compared to their architecturally defined behavior to allow software a full view of the VGIC's internal state.h]hXThe offset is relative to the “[Re]Distributor base address” as defined in the GICv3/4 specs. Getting or setting such a register has the same effect as reading or writing the register on real hardware, except for the following registers: GICD_STATUSR, GICR_STATUSR, GICD_ISPENDR, GICR_ISPENDR0, GICD_ICPENDR, and GICR_ICPENDR0. These registers behave differently when accessed via this interface compared to their architecturally defined behavior to allow software a full view of the VGIC’s internal state.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKfhjubh)}(hnThe mpidr field is used to specify which redistributor is accessed. The mpidr is ignored for the distributor.h]hnThe mpidr field is used to specify which redistributor is accessed. The mpidr is ignored for the distributor.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKohjubh)}(hThe mpidr encoding is based on the affinity information in the architecture defined MPIDR, and the field is encoded as follows::h]hThe mpidr encoding is based on the affinity information in the architecture defined MPIDR, and the field is encoded as follows:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKrhjubj )}(hk| 63 .... 56 | 55 .... 48 | 47 .... 40 | 39 .... 32 | | Aff3 | Aff2 | Aff1 | Aff0 |h]hk| 63 .... 56 | 55 .... 48 | 47 .... 40 | 39 .... 32 | | Aff3 | Aff2 | Aff1 | Aff0 |}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKuhjubh)}(h{Note that distributor fields are not banked, but return the same value regardless of the mpidr used to access the register.h]h{Note that distributor fields are not banked, but return the same value regardless of the mpidr used to access the register.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKxhjubh)}(hXqGICD_IIDR.Revision is updated when the KVM implementation is changed in a way directly observable by the guest or userspace. Userspace should read GICD_IIDR from KVM and write back the read value to confirm its expected behavior is aligned with the KVM implementation. Userspace should set GICD_IIDR before setting any other registers to ensure the expected behavior.h]hXqGICD_IIDR.Revision is updated when the KVM implementation is changed in a way directly observable by the guest or userspace. Userspace should read GICD_IIDR from KVM and write back the read value to confirm its expected behavior is aligned with the KVM implementation. Userspace should set GICD_IIDR before setting any other registers to ensure the expected behavior.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK{hjubh)}(hXoThe GICD_STATUSR and GICR_STATUSR registers are architecturally defined such that a write of a clear bit has no effect, whereas a write with a set bit clears that value. To allow userspace to freely set the values of these two registers, setting the attributes with the register offsets for these two registers simply sets the non-reserved bits to the value written.h]hXoThe GICD_STATUSR and GICR_STATUSR registers are architecturally defined such that a write of a clear bit has no effect, whereas a write with a set bit clears that value. To allow userspace to freely set the values of these two registers, setting the attributes with the register offsets for these two registers simply sets the non-reserved bits to the value written.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(hAccesses (reads and writes) to the GICD_ISPENDR register region and GICR_ISPENDR0 registers get/set the value of the latched pending state for the interrupts.h]hAccesses (reads and writes) to the GICD_ISPENDR register region and GICR_ISPENDR0 registers get/set the value of the latched pending state for the interrupts.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(hXThis is identical to the value returned by a guest read from ISPENDR for an edge triggered interrupt, but may differ for level triggered interrupts. For edge triggered interrupts, once an interrupt becomes pending (whether because of an edge detected on the input line or because of a guest write to ISPENDR) this state is "latched", and only cleared when either the interrupt is activated or when the guest writes to ICPENDR. A level triggered interrupt may be pending either because the level input is held high by a device, or because of a guest write to the ISPENDR register. Only ISPENDR writes are latched; if the device lowers the line level then the interrupt is no longer pending unless the guest also wrote to ISPENDR, and conversely writes to ICPENDR or activations of the interrupt do not clear the pending status if the line level is still being held high. (These rules are documented in the GICv3 specification descriptions of the ICPENDR and ISPENDR registers.) For a level triggered interrupt the value accessed here is that of the latch which is set by ISPENDR and cleared by ICPENDR or interrupt activation, whereas the value returned by a guest read from ISPENDR is the logical OR of the latch value and the input line level.h]hXThis is identical to the value returned by a guest read from ISPENDR for an edge triggered interrupt, but may differ for level triggered interrupts. For edge triggered interrupts, once an interrupt becomes pending (whether because of an edge detected on the input line or because of a guest write to ISPENDR) this state is “latched”, and only cleared when either the interrupt is activated or when the guest writes to ICPENDR. A level triggered interrupt may be pending either because the level input is held high by a device, or because of a guest write to the ISPENDR register. Only ISPENDR writes are latched; if the device lowers the line level then the interrupt is no longer pending unless the guest also wrote to ISPENDR, and conversely writes to ICPENDR or activations of the interrupt do not clear the pending status if the line level is still being held high. (These rules are documented in the GICv3 specification descriptions of the ICPENDR and ISPENDR registers.) For a level triggered interrupt the value accessed here is that of the latch which is set by ISPENDR and cleared by ICPENDR or interrupt activation, whereas the value returned by a guest read from ISPENDR is the logical OR of the latch value and the input line level.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(hX(Raw access to the latch state is provided to userspace so that it can save and restore the entire GIC internal state (which is defined by the combination of the current input line level and the latch state, and cannot be deduced from purely the line level and the value of the ISPENDR registers).h]hX(Raw access to the latch state is provided to userspace so that it can save and restore the entire GIC internal state (which is defined by the combination of the current input line level and the latch state, and cannot be deduced from purely the line level and the value of the ISPENDR registers).}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(hAccesses to GICD_ICPENDR register region and GICR_ICPENDR0 registers have RAZ/WI semantics, meaning that reads always return 0 and writes are always ignored.h]hAccesses to GICD_ICPENDR register region and GICR_ICPENDR0 registers have RAZ/WI semantics, meaning that reads always return 0 and writes are always ignored.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1j~hhhKWhjubeh}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjUubh)}(hErrors:h]hErrors:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjUubj)}(h====== ===================================================== -ENXIO Getting or setting this register is not yet supported -EBUSY One or more VCPUs are running ====== ===================================================== h]j)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK5uh1jhjubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h-ENXIOh]h-ENXIO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h5Getting or setting this register is not yet supportedh]h5Getting or setting this register is not yet supported}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h-EBUSYh]h-EBUSY}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hOne or more VCPUs are runningh]hOne or more VCPUs are running}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj!ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j~hhhKhjUubh)}(hhh]h)}(hXKVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS Attributes: The attr field of kvm_device_attr encodes two values:: bits: | 63 .... 32 | 31 .... 16 | 15 .... 0 | values: | mpidr | RES | instr | The mpidr field encodes the CPU ID based on the affinity information in the architecture defined MPIDR, and the field is encoded as follows:: | 63 .... 56 | 55 .... 48 | 47 .... 40 | 39 .... 32 | | Aff3 | Aff2 | Aff1 | Aff0 | The instr field encodes the system register to access based on the fields defined in the A64 instruction set encoding for system register access (RES means the bits are reserved for future use and should be zero):: | 15 ... 14 | 13 ... 11 | 10 ... 7 | 6 ... 3 | 2 ... 0 | | Op 0 | Op1 | CRn | CRm | Op2 | All system regs accessed through this API are (rw, 64-bit) and kvm_device_attr.addr points to a __u64 value. KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS accesses the CPU interface registers for the CPU specified by the mpidr field. CPU interface registers access is not implemented for AArch32 mode. Error -ENXIO is returned when accessed in AArch32 mode. h](h)}(h KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGSh]h KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjZubh)}(hhh](h)}(h Attributes:h]h Attributes:}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjlubj)}(hXiThe attr field of kvm_device_attr encodes two values:: bits: | 63 .... 32 | 31 .... 16 | 15 .... 0 | values: | mpidr | RES | instr | The mpidr field encodes the CPU ID based on the affinity information in the architecture defined MPIDR, and the field is encoded as follows:: | 63 .... 56 | 55 .... 48 | 47 .... 40 | 39 .... 32 | | Aff3 | Aff2 | Aff1 | Aff0 | The instr field encodes the system register to access based on the fields defined in the A64 instruction set encoding for system register access (RES means the bits are reserved for future use and should be zero):: | 15 ... 14 | 13 ... 11 | 10 ... 7 | 6 ... 3 | 2 ... 0 | | Op 0 | Op1 | CRn | CRm | Op2 | All system regs accessed through this API are (rw, 64-bit) and kvm_device_attr.addr points to a __u64 value. KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS accesses the CPU interface registers for the CPU specified by the mpidr field. CPU interface registers access is not implemented for AArch32 mode. Error -ENXIO is returned when accessed in AArch32 mode. h](h)}(h6The attr field of kvm_device_attr encodes two values::h]h5The attr field of kvm_device_attr encodes two values:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj}ubj )}(hbits: | 63 .... 32 | 31 .... 16 | 15 .... 0 | values: | mpidr | RES | instr |h]hbits: | 63 .... 32 | 31 .... 16 | 15 .... 0 | values: | mpidr | RES | instr |}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKhj}ubh)}(hThe mpidr field encodes the CPU ID based on the affinity information in the architecture defined MPIDR, and the field is encoded as follows::h]hThe mpidr field encodes the CPU ID based on the affinity information in the architecture defined MPIDR, and the field is encoded as follows:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj}ubj )}(hk| 63 .... 56 | 55 .... 48 | 47 .... 40 | 39 .... 32 | | Aff3 | Aff2 | Aff1 | Aff0 |h]hk| 63 .... 56 | 55 .... 48 | 47 .... 40 | 39 .... 32 | | Aff3 | Aff2 | Aff1 | Aff0 |}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKhj}ubh)}(hThe instr field encodes the system register to access based on the fields defined in the A64 instruction set encoding for system register access (RES means the bits are reserved for future use and should be zero)::h]hThe instr field encodes the system register to access based on the fields defined in the A64 instruction set encoding for system register access (RES means the bits are reserved for future use and should be zero):}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj}ubj )}(hq| 15 ... 14 | 13 ... 11 | 10 ... 7 | 6 ... 3 | 2 ... 0 | | Op 0 | Op1 | CRn | CRm | Op2 |h]hq| 15 ... 14 | 13 ... 11 | 10 ... 7 | 6 ... 3 | 2 ... 0 | | Op 0 | Op1 | CRn | CRm | Op2 |}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKhj}ubh)}(hlAll system regs accessed through this API are (rw, 64-bit) and kvm_device_attr.addr points to a __u64 value.h]hlAll system regs accessed through this API are (rw, 64-bit) and kvm_device_attr.addr points to a __u64 value.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj}ubh)}(hoKVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS accesses the CPU interface registers for the CPU specified by the mpidr field.h]hoKVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS accesses the CPU interface registers for the CPU specified by the mpidr field.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj}ubh)}(h{CPU interface registers access is not implemented for AArch32 mode. Error -ENXIO is returned when accessed in AArch32 mode.h]h{CPU interface registers access is not implemented for AArch32 mode. Error -ENXIO is returned when accessed in AArch32 mode.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj}ubeh}(h]h ]h"]h$]h&]uh1j~hhhKhjlubeh}(h]h ]h"]h$]h&]uh1hhjZubeh}(h]h ]h"]h$]h&]uh1hhhhKhjWubah}(h]h ]h"]h$]h&]uh1hhjUubh)}(hErrors:h]hErrors:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjUubj)}(hX ======= ===================================================== -ENXIO Getting or setting this register is not yet supported -EBUSY VCPU is running -EINVAL Invalid mpidr or register value supplied ======= ===================================================== h]j)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhj,ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK5uh1jhj,ubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h-ENXIOh]h-ENXIO}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjIubah}(h]h ]h"]h$]h&]uh1jhjFubj)}(hhh]h)}(h5Getting or setting this register is not yet supportedh]h5Getting or setting this register is not yet supported}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj`ubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhjCubj)}(hhh](j)}(hhh]h)}(h-EBUSYh]h-EBUSY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhj}ubj)}(hhh]h)}(hVCPU is runningh]hVCPU is running}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhjCubj)}(hhh](j)}(hhh]h)}(h-EINVALh]h-EINVAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h(Invalid mpidr or register value suppliedh]h(Invalid mpidr or register value supplied}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]colsKuh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1j~hhhKhjUubh)}(hhh]h)}(hKVM_DEV_ARM_VGIC_GRP_NR_IRQS Attributes: A value describing the number of interrupts (SGI, PPI and SPI) for this GIC instance, ranging from 64 to 1024, in increments of 32. kvm_device_attr.addr points to a __u32 value. h](h)}(hKVM_DEV_ARM_VGIC_GRP_NR_IRQSh]hKVM_DEV_ARM_VGIC_GRP_NR_IRQS}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(hhh](h)}(h Attributes:h]h Attributes:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj)}(hA value describing the number of interrupts (SGI, PPI and SPI) for this GIC instance, ranging from 64 to 1024, in increments of 32. kvm_device_attr.addr points to a __u32 value. h](h)}(hA value describing the number of interrupts (SGI, PPI and SPI) for this GIC instance, ranging from 64 to 1024, in increments of 32.h]hA value describing the number of interrupts (SGI, PPI and SPI) for this GIC instance, ranging from 64 to 1024, in increments of 32.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj*ubh)}(h-kvm_device_attr.addr points to a __u32 value.h]h-kvm_device_attr.addr points to a __u32 value.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj*ubeh}(h]h ]h"]h$]h&]uh1j~hhhKhjubeh}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjUubh)}(hErrors:h]hErrors:}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjUubj)}(h======= ====================================== -EINVAL Value set is out of the expected range -EBUSY Value has already be set. ======= ====================================== h]j)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjwubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK&uh1jhjwubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h-EINVALh]h-EINVAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h&Value set is out of the expected rangeh]h&Value set is out of the expected range}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h-EBUSYh]h-EBUSY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hValue has already be set.h]hValue has already be set.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]colsKuh1jhjtubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1j~hhhKhjUubh)}(hhh]h)}(hX~KVM_DEV_ARM_VGIC_GRP_CTRL Attributes: KVM_DEV_ARM_VGIC_CTRL_INIT request the initialization of the VGIC, no additional parameter in kvm_device_attr.addr. Must be called after all VCPUs have been created. KVM_DEV_ARM_VGIC_SAVE_PENDING_TABLES save all LPI pending bits into guest RAM pending tables. The first kB of the pending table is not altered by this operation. h](h)}(hKVM_DEV_ARM_VGIC_GRP_CTRLh]hKVM_DEV_ARM_VGIC_GRP_CTRL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubh)}(hhh](h)}(h Attributes:h]h Attributes:}(hj0 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj- ubj)}(hXQKVM_DEV_ARM_VGIC_CTRL_INIT request the initialization of the VGIC, no additional parameter in kvm_device_attr.addr. Must be called after all VCPUs have been created. KVM_DEV_ARM_VGIC_SAVE_PENDING_TABLES save all LPI pending bits into guest RAM pending tables. The first kB of the pending table is not altered by this operation. Ih]h)}(hhh](h)}(hKVM_DEV_ARM_VGIC_CTRL_INIT request the initialization of the VGIC, no additional parameter in kvm_device_attr.addr. Must be called after all VCPUs have been created.h](h)}(hKVM_DEV_ARM_VGIC_CTRL_INITh]hKVM_DEV_ARM_VGIC_CTRL_INIT}(hjI hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjE ubh)}(hhh]h)}(hrequest the initialization of the VGIC, no additional parameter in kvm_device_attr.addr. Must be called after all VCPUs have been created.h]hrequest the initialization of the VGIC, no additional parameter in kvm_device_attr.addr. Must be called after all VCPUs have been created.}(hjZ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjW ubah}(h]h ]h"]h$]h&]uh1hhjE ubeh}(h]h ]h"]h$]h&]uh1hhhhKhjB ubh)}(hKVM_DEV_ARM_VGIC_SAVE_PENDING_TABLES save all LPI pending bits into guest RAM pending tables. The first kB of the pending table is not altered by this operation. h](h)}(h$KVM_DEV_ARM_VGIC_SAVE_PENDING_TABLESh]h$KVM_DEV_ARM_VGIC_SAVE_PENDING_TABLES}(hjx hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjt ubh)}(hhh](h)}(h8save all LPI pending bits into guest RAM pending tables.h]h8save all LPI pending bits into guest RAM pending tables.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubh)}(hCThe first kB of the pending table is not altered by this operation.h]hCThe first kB of the pending table is not altered by this operation.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubeh}(h]h ]h"]h$]h&]uh1hhjt ubeh}(h]h ]h"]h$]h&]uh1hhhhKhjB ubeh}(h]h ]h"]h$]h&]uh1hhj> ubah}(h]h ]h"]h$]h&]uh1j~hhhKhj- ubeh}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1hhjUubh)}(hErrors:h]hErrors:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjUubj)}(hX}======= ======================================================== -ENXIO VGIC not properly configured as required prior to calling this attribute -ENODEV no online VCPU -ENOMEM memory shortage when allocating vgic internal data -EFAULT Invalid guest ram access -EBUSY One or more VCPUS are running ======= ======================================================== h]j)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhj ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK9uh1jhj ubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h-ENXIOh]h-ENXIO}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hHVGIC not properly configured as required prior to calling this attributeh]hHVGIC not properly configured as required prior to calling this attribute}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(h-ENODEVh]h-ENODEV}(hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj8 ubah}(h]h ]h"]h$]h&]uh1jhj5 ubj)}(hhh]h)}(hno online VCPUh]hno online VCPU}(hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjO ubah}(h]h ]h"]h$]h&]uh1jhj5 ubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(h-ENOMEMh]h-ENOMEM}(hjr hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjo ubah}(h]h ]h"]h$]h&]uh1jhjl ubj)}(hhh]h)}(h2memory shortage when allocating vgic internal datah]h2memory shortage when allocating vgic internal data}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjl ubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(h-EFAULTh]h-EFAULT}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hInvalid guest ram accessh]hInvalid guest ram access}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(h-EBUSYh]h-EBUSY}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hOne or more VCPUS are runningh]hOne or more VCPUS are running}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]colsKuh1jhj ubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j~hhhKhjUubh)}(hhh](h)}(hXKVM_DEV_ARM_VGIC_GRP_LEVEL_INFO Attributes: The attr field of kvm_device_attr encodes the following values:: bits: | 63 .... 32 | 31 .... 10 | 9 .... 0 | values: | mpidr | info | vINTID | The vINTID specifies which set of IRQs is reported on. The info field specifies which information userspace wants to get or set using this interface. Currently we support the following info values: VGIC_LEVEL_INFO_LINE_LEVEL: Get/Set the input level of the IRQ line for a set of 32 contiguously numbered interrupts. vINTID must be a multiple of 32. kvm_device_attr.addr points to a __u32 value which will contain a bitmap where a set bit means the interrupt level is asserted. Bit[n] indicates the status for interrupt vINTID + n. SGIs and any interrupt with a higher ID than the number of interrupts supported, will be RAZ/WI. LPIs are always edge-triggered and are therefore not supported by this interface. PPIs are reported per VCPU as specified in the mpidr field, and SPIs are reported with the same value regardless of the mpidr specified. The mpidr field encodes the CPU ID based on the affinity information in the architecture defined MPIDR, and the field is encoded as follows:: | 63 .... 56 | 55 .... 48 | 47 .... 40 | 39 .... 32 | | Aff3 | Aff2 | Aff1 | Aff0 | h](h)}(hKVM_DEV_ARM_VGIC_GRP_LEVEL_INFOh]hKVM_DEV_ARM_VGIC_GRP_LEVEL_INFO}(hj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM#hj- ubh)}(hhh](h)}(h Attributes:h]h Attributes:}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj? ubj)}(hX?The attr field of kvm_device_attr encodes the following values:: bits: | 63 .... 32 | 31 .... 10 | 9 .... 0 | values: | mpidr | info | vINTID | The vINTID specifies which set of IRQs is reported on. The info field specifies which information userspace wants to get or set using this interface. Currently we support the following info values: VGIC_LEVEL_INFO_LINE_LEVEL: Get/Set the input level of the IRQ line for a set of 32 contiguously numbered interrupts. vINTID must be a multiple of 32. kvm_device_attr.addr points to a __u32 value which will contain a bitmap where a set bit means the interrupt level is asserted. Bit[n] indicates the status for interrupt vINTID + n. SGIs and any interrupt with a higher ID than the number of interrupts supported, will be RAZ/WI. LPIs are always edge-triggered and are therefore not supported by this interface. PPIs are reported per VCPU as specified in the mpidr field, and SPIs are reported with the same value regardless of the mpidr specified. The mpidr field encodes the CPU ID based on the affinity information in the architecture defined MPIDR, and the field is encoded as follows:: | 63 .... 56 | 55 .... 48 | 47 .... 40 | 39 .... 32 | | Aff3 | Aff2 | Aff1 | Aff0 | h](h)}(h@The attr field of kvm_device_attr encodes the following values::h]h?The attr field of kvm_device_attr encodes the following values:}(hjT hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjP ubj )}(hbits: | 63 .... 32 | 31 .... 10 | 9 .... 0 | values: | mpidr | info | vINTID |h]hbits: | 63 .... 32 | 31 .... 10 | 9 .... 0 | values: | mpidr | info | vINTID |}hjb sbah}(h]h ]h"]h$]h&]hhuh1jhhhMhjP ubh)}(h6The vINTID specifies which set of IRQs is reported on.h]h6The vINTID specifies which set of IRQs is reported on.}(hjp hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjP ubh)}(hThe info field specifies which information userspace wants to get or set using this interface. Currently we support the following info values:h]hThe info field specifies which information userspace wants to get or set using this interface. Currently we support the following info values:}(hj~ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjP ubj)}(hX\VGIC_LEVEL_INFO_LINE_LEVEL: Get/Set the input level of the IRQ line for a set of 32 contiguously numbered interrupts. vINTID must be a multiple of 32. kvm_device_attr.addr points to a __u32 value which will contain a bitmap where a set bit means the interrupt level is asserted. Bit[n] indicates the status for interrupt vINTID + n. h]h)}(hhh]h)}(hXPVGIC_LEVEL_INFO_LINE_LEVEL: Get/Set the input level of the IRQ line for a set of 32 contiguously numbered interrupts. vINTID must be a multiple of 32. kvm_device_attr.addr points to a __u32 value which will contain a bitmap where a set bit means the interrupt level is asserted. Bit[n] indicates the status for interrupt vINTID + n. h](h)}(hVGIC_LEVEL_INFO_LINE_LEVEL:h]hVGIC_LEVEL_INFO_LINE_LEVEL:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubh)}(hhh](h)}(hYGet/Set the input level of the IRQ line for a set of 32 contiguously numbered interrupts.h]hYGet/Set the input level of the IRQ line for a set of 32 contiguously numbered interrupts.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubh)}(h vINTID must be a multiple of 32.h]h vINTID must be a multiple of 32.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubh)}(hkvm_device_attr.addr points to a __u32 value which will contain a bitmap where a set bit means the interrupt level is asserted.h]hkvm_device_attr.addr points to a __u32 value which will contain a bitmap where a set bit means the interrupt level is asserted.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubh)}(h5Bit[n] indicates the status for interrupt vINTID + n.h]h5Bit[n] indicates the status for interrupt vINTID + n.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubeh}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1hhj ubah}(h]h ]h"]h$]h&]uh1j~hhhM hjP ubh)}(hSGIs and any interrupt with a higher ID than the number of interrupts supported, will be RAZ/WI. LPIs are always edge-triggered and are therefore not supported by this interface.h]hSGIs and any interrupt with a higher ID than the number of interrupts supported, will be RAZ/WI. LPIs are always edge-triggered and are therefore not supported by this interface.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjP ubh)}(hPPIs are reported per VCPU as specified in the mpidr field, and SPIs are reported with the same value regardless of the mpidr specified.h]hPPIs are reported per VCPU as specified in the mpidr field, and SPIs are reported with the same value regardless of the mpidr specified.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjP ubh)}(hThe mpidr field encodes the CPU ID based on the affinity information in the architecture defined MPIDR, and the field is encoded as follows::h]hThe mpidr field encodes the CPU ID based on the affinity information in the architecture defined MPIDR, and the field is encoded as follows:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjP ubj )}(hk| 63 .... 56 | 55 .... 48 | 47 .... 40 | 39 .... 32 | | Aff3 | Aff2 | Aff1 | Aff0 |h]hk| 63 .... 56 | 55 .... 48 | 47 .... 40 | 39 .... 32 | | Aff3 | Aff2 | Aff1 | Aff0 |}hj" sbah}(h]h ]h"]h$]h&]hhuh1jhhhM"hjP ubeh}(h]h ]h"]h$]h&]uh1j~hhhMhj? ubeh}(h]h ]h"]h$]h&]uh1hhj- ubeh}(h]h ]h"]h$]h&]uh1hhhhM#hj* ubh)}(hErrors: ======= ============================================= -EINVAL vINTID is not multiple of 32 or info field is not VGIC_LEVEL_INFO_LINE_LEVEL ======= ============================================= h](h)}(hErrors:h]hErrors:}(hjF hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM)hjB ubh)}(hhh]j)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjZ ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK-uh1jhjZ ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(h-EINVALh]h-EINVAL}(hjz hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM'hjw ubah}(h]h ]h"]h$]h&]uh1jhjt ubj)}(hhh]h)}(hLvINTID is not multiple of 32 or info field is not VGIC_LEVEL_INFO_LINE_LEVELh]hLvINTID is not multiple of 32 or info field is not VGIC_LEVEL_INFO_LINE_LEVEL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM'hj ubah}(h]h ]h"]h$]h&]uh1jhjt ubeh}(h]h ]h"]h$]h&]uh1jhjq ubah}(h]h ]h"]h$]h&]uh1jhjZ ubeh}(h]h ]h"]h$]h&]colsKuh1jhjW ubah}(h]h ]h"]h$]h&]uh1jhjT ubah}(h]h ]h"]h$]h&]uh1hhjB ubeh}(h]h ]h"]h$]h&]uh1hhhhM)hj* ubh)}(hXEKVM_DEV_ARM_VGIC_GRP_MAINT_IRQ Attributes: The attr field of kvm_device_attr encodes the following values: bits: | 31 .... 5 | 4 .... 0 | values: | RES0 | vINTID | The vINTID specifies which interrupt is generated when the vGIC must generate a maintenance interrupt. This must be a PPI.h](h)}(hKVM_DEV_ARM_VGIC_GRP_MAINT_IRQh]hKVM_DEV_ARM_VGIC_GRP_MAINT_IRQ}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM3hj ubh)}(hhh](h)}(h Attributes:h]h Attributes:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM,hj ubj)}(hXThe attr field of kvm_device_attr encodes the following values: bits: | 31 .... 5 | 4 .... 0 | values: | RES0 | vINTID | The vINTID specifies which interrupt is generated when the vGIC must generate a maintenance interrupt. This must be a PPI.h](h)}(h?The attr field of kvm_device_attr encodes the following values:h]h?The attr field of kvm_device_attr encodes the following values:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM.hj ubj)}(hTbits: | 31 .... 5 | 4 .... 0 | values: | RES0 | vINTID | h]h)}(hSbits: | 31 .... 5 | 4 .... 0 | values: | RES0 | vINTID |h]hSbits: | 31 .... 5 | 4 .... 0 | values: | RES0 | vINTID |}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM0hj ubah}(h]h ]h"]h$]h&]uh1j~hhhM0hj ubh)}(hzThe vINTID specifies which interrupt is generated when the vGIC must generate a maintenance interrupt. This must be a PPI.h]hzThe vINTID specifies which interrupt is generated when the vGIC must generate a maintenance interrupt. This must be a PPI.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM3hj ubeh}(h]h ]h"]h$]h&]uh1j~hhhM.hj ubeh}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhhM3hj* ubeh}(h]h ]h"]h$]h&]uh1hhjUubeh}(h]h ]h"]h$]h&]uh1hhjCubeh}(h]h ]h"]h$]h&]uh1hhhhM3hj@ubah}(h]h ]h"]h$]h&]uh1hhhhhhNhNubeh}(h]arm virtual generic interrupt controller v3 and later (vgicv3)ah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksjfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjy error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}jT jQ s nametypes}jT sh}jQ hs footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.