Merge branch kvm-arm64/misc-5.18 into kvmarm-master/next

* kvm-arm64/misc-5.18:
  : .
  : Misc fixes for KVM/arm64 5.18:
  :
  : - Drop unused kvm parameter to kvm_psci_version()
  :
  : - Implement CONFIG_DEBUG_LIST at EL2
  :
  : - Make CONFIG_ARM64_ERRATUM_2077057 default y
  :
  : - Only do the interrupt dance if we have exited because of an interrupt
  :
  : - Remove traces of 32bit ARM host support from the documentation
  : .
  Documentation: KVM: Update documentation to indicate KVM is arm64-only
  KVM: arm64: Only open the interrupt window on exit due to an interrupt
  KVM: arm64: Enable Cortex-A510 erratum 2077057 by default

Signed-off-by: Marc Zyngier <maz@kernel.org>
This commit is contained in:
Marc Zyngier 2022-03-09 11:16:48 +00:00
commit 7297a8bcc0
4 changed files with 50 additions and 48 deletions

View File

@ -417,7 +417,7 @@ kvm_run' (see below).
----------------- -----------------
:Capability: basic :Capability: basic
:Architectures: all except ARM, arm64 :Architectures: all except arm64
:Type: vcpu ioctl :Type: vcpu ioctl
:Parameters: struct kvm_regs (out) :Parameters: struct kvm_regs (out)
:Returns: 0 on success, -1 on error :Returns: 0 on success, -1 on error
@ -450,7 +450,7 @@ Reads the general purpose registers from the vcpu.
----------------- -----------------
:Capability: basic :Capability: basic
:Architectures: all except ARM, arm64 :Architectures: all except arm64
:Type: vcpu ioctl :Type: vcpu ioctl
:Parameters: struct kvm_regs (in) :Parameters: struct kvm_regs (in)
:Returns: 0 on success, -1 on error :Returns: 0 on success, -1 on error
@ -824,7 +824,7 @@ Writes the floating point state to the vcpu.
----------------------- -----------------------
:Capability: KVM_CAP_IRQCHIP, KVM_CAP_S390_IRQCHIP (s390) :Capability: KVM_CAP_IRQCHIP, KVM_CAP_S390_IRQCHIP (s390)
:Architectures: x86, ARM, arm64, s390 :Architectures: x86, arm64, s390
:Type: vm ioctl :Type: vm ioctl
:Parameters: none :Parameters: none
:Returns: 0 on success, -1 on error :Returns: 0 on success, -1 on error
@ -833,7 +833,7 @@ Creates an interrupt controller model in the kernel.
On x86, creates a virtual ioapic, a virtual PIC (two PICs, nested), and sets up On x86, creates a virtual ioapic, a virtual PIC (two PICs, nested), and sets up
future vcpus to have a local APIC. IRQ routing for GSIs 0-15 is set to both future vcpus to have a local APIC. IRQ routing for GSIs 0-15 is set to both
PIC and IOAPIC; GSI 16-23 only go to the IOAPIC. PIC and IOAPIC; GSI 16-23 only go to the IOAPIC.
On ARM/arm64, a GICv2 is created. Any other GIC versions require the usage of On arm64, a GICv2 is created. Any other GIC versions require the usage of
KVM_CREATE_DEVICE, which also supports creating a GICv2. Using KVM_CREATE_DEVICE, which also supports creating a GICv2. Using
KVM_CREATE_DEVICE is preferred over KVM_CREATE_IRQCHIP for GICv2. KVM_CREATE_DEVICE is preferred over KVM_CREATE_IRQCHIP for GICv2.
On s390, a dummy irq routing table is created. On s390, a dummy irq routing table is created.
@ -846,7 +846,7 @@ before KVM_CREATE_IRQCHIP can be used.
----------------- -----------------
:Capability: KVM_CAP_IRQCHIP :Capability: KVM_CAP_IRQCHIP
:Architectures: x86, arm, arm64 :Architectures: x86, arm64
:Type: vm ioctl :Type: vm ioctl
:Parameters: struct kvm_irq_level :Parameters: struct kvm_irq_level
:Returns: 0 on success, -1 on error :Returns: 0 on success, -1 on error
@ -870,7 +870,7 @@ capability is present (or unless it is not using the in-kernel irqchip,
of course). of course).
ARM/arm64 can signal an interrupt either at the CPU level, or at the arm64 can signal an interrupt either at the CPU level, or at the
in-kernel irqchip (GIC), and for in-kernel irqchip can tell the GIC to in-kernel irqchip (GIC), and for in-kernel irqchip can tell the GIC to
use PPIs designated for specific cpus. The irq field is interpreted use PPIs designated for specific cpus. The irq field is interpreted
like this:: like this::
@ -896,7 +896,7 @@ When KVM_CAP_ARM_IRQ_LINE_LAYOUT_2 is supported, the target vcpu is
identified as (256 * vcpu2_index + vcpu_index). Otherwise, vcpu2_index identified as (256 * vcpu2_index + vcpu_index). Otherwise, vcpu2_index
must be zero. must be zero.
Note that on arm/arm64, the KVM_CAP_IRQCHIP capability only conditions Note that on arm64, the KVM_CAP_IRQCHIP capability only conditions
injection of interrupts for the in-kernel irqchip. KVM_IRQ_LINE can always injection of interrupts for the in-kernel irqchip. KVM_IRQ_LINE can always
be used for a userspace interrupt controller. be used for a userspace interrupt controller.
@ -1087,7 +1087,7 @@ Other flags returned by ``KVM_GET_CLOCK`` are accepted but ignored.
:Capability: KVM_CAP_VCPU_EVENTS :Capability: KVM_CAP_VCPU_EVENTS
:Extended by: KVM_CAP_INTR_SHADOW :Extended by: KVM_CAP_INTR_SHADOW
:Architectures: x86, arm, arm64 :Architectures: x86, arm64
:Type: vcpu ioctl :Type: vcpu ioctl
:Parameters: struct kvm_vcpu_event (out) :Parameters: struct kvm_vcpu_event (out)
:Returns: 0 on success, -1 on error :Returns: 0 on success, -1 on error
@ -1146,8 +1146,8 @@ The following bits are defined in the flags field:
fields contain a valid state. This bit will be set whenever fields contain a valid state. This bit will be set whenever
KVM_CAP_EXCEPTION_PAYLOAD is enabled. KVM_CAP_EXCEPTION_PAYLOAD is enabled.
ARM/ARM64: ARM64:
^^^^^^^^^^ ^^^^^^
If the guest accesses a device that is being emulated by the host kernel in If the guest accesses a device that is being emulated by the host kernel in
such a way that a real device would generate a physical SError, KVM may make such a way that a real device would generate a physical SError, KVM may make
@ -1206,7 +1206,7 @@ directly to the virtual CPU).
:Capability: KVM_CAP_VCPU_EVENTS :Capability: KVM_CAP_VCPU_EVENTS
:Extended by: KVM_CAP_INTR_SHADOW :Extended by: KVM_CAP_INTR_SHADOW
:Architectures: x86, arm, arm64 :Architectures: x86, arm64
:Type: vcpu ioctl :Type: vcpu ioctl
:Parameters: struct kvm_vcpu_event (in) :Parameters: struct kvm_vcpu_event (in)
:Returns: 0 on success, -1 on error :Returns: 0 on success, -1 on error
@ -1241,8 +1241,8 @@ can be set in the flags field to signal that the
exception_has_payload, exception_payload, and exception.pending fields exception_has_payload, exception_payload, and exception.pending fields
contain a valid state and shall be written into the VCPU. contain a valid state and shall be written into the VCPU.
ARM/ARM64: ARM64:
^^^^^^^^^^ ^^^^^^
User space may need to inject several types of events to the guest. User space may need to inject several types of events to the guest.
@ -1449,7 +1449,7 @@ for vm-wide capabilities.
--------------------- ---------------------
:Capability: KVM_CAP_MP_STATE :Capability: KVM_CAP_MP_STATE
:Architectures: x86, s390, arm, arm64, riscv :Architectures: x86, s390, arm64, riscv
:Type: vcpu ioctl :Type: vcpu ioctl
:Parameters: struct kvm_mp_state (out) :Parameters: struct kvm_mp_state (out)
:Returns: 0 on success; -1 on error :Returns: 0 on success; -1 on error
@ -1467,7 +1467,7 @@ Possible values are:
========================== =============================================== ========================== ===============================================
KVM_MP_STATE_RUNNABLE the vcpu is currently running KVM_MP_STATE_RUNNABLE the vcpu is currently running
[x86,arm/arm64,riscv] [x86,arm64,riscv]
KVM_MP_STATE_UNINITIALIZED the vcpu is an application processor (AP) KVM_MP_STATE_UNINITIALIZED the vcpu is an application processor (AP)
which has not yet received an INIT signal [x86] which has not yet received an INIT signal [x86]
KVM_MP_STATE_INIT_RECEIVED the vcpu has received an INIT signal, and is KVM_MP_STATE_INIT_RECEIVED the vcpu has received an INIT signal, and is
@ -1476,7 +1476,7 @@ Possible values are:
is waiting for an interrupt [x86] is waiting for an interrupt [x86]
KVM_MP_STATE_SIPI_RECEIVED the vcpu has just received a SIPI (vector KVM_MP_STATE_SIPI_RECEIVED the vcpu has just received a SIPI (vector
accessible via KVM_GET_VCPU_EVENTS) [x86] accessible via KVM_GET_VCPU_EVENTS) [x86]
KVM_MP_STATE_STOPPED the vcpu is stopped [s390,arm/arm64,riscv] KVM_MP_STATE_STOPPED the vcpu is stopped [s390,arm64,riscv]
KVM_MP_STATE_CHECK_STOP the vcpu is in a special error state [s390] KVM_MP_STATE_CHECK_STOP the vcpu is in a special error state [s390]
KVM_MP_STATE_OPERATING the vcpu is operating (running or halted) KVM_MP_STATE_OPERATING the vcpu is operating (running or halted)
[s390] [s390]
@ -1488,8 +1488,8 @@ On x86, this ioctl is only useful after KVM_CREATE_IRQCHIP. Without an
in-kernel irqchip, the multiprocessing state must be maintained by userspace on in-kernel irqchip, the multiprocessing state must be maintained by userspace on
these architectures. these architectures.
For arm/arm64/riscv: For arm64/riscv:
^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
The only states that are valid are KVM_MP_STATE_STOPPED and The only states that are valid are KVM_MP_STATE_STOPPED and
KVM_MP_STATE_RUNNABLE which reflect if the vcpu is paused or not. KVM_MP_STATE_RUNNABLE which reflect if the vcpu is paused or not.
@ -1498,7 +1498,7 @@ KVM_MP_STATE_RUNNABLE which reflect if the vcpu is paused or not.
--------------------- ---------------------
:Capability: KVM_CAP_MP_STATE :Capability: KVM_CAP_MP_STATE
:Architectures: x86, s390, arm, arm64, riscv :Architectures: x86, s390, arm64, riscv
:Type: vcpu ioctl :Type: vcpu ioctl
:Parameters: struct kvm_mp_state (in) :Parameters: struct kvm_mp_state (in)
:Returns: 0 on success; -1 on error :Returns: 0 on success; -1 on error
@ -1510,8 +1510,8 @@ On x86, this ioctl is only useful after KVM_CREATE_IRQCHIP. Without an
in-kernel irqchip, the multiprocessing state must be maintained by userspace on in-kernel irqchip, the multiprocessing state must be maintained by userspace on
these architectures. these architectures.
For arm/arm64/riscv: For arm64/riscv:
^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
The only states that are valid are KVM_MP_STATE_STOPPED and The only states that are valid are KVM_MP_STATE_STOPPED and
KVM_MP_STATE_RUNNABLE which reflect if the vcpu should be paused or not. KVM_MP_STATE_RUNNABLE which reflect if the vcpu should be paused or not.
@ -1780,14 +1780,14 @@ The flags bitmap is defined as::
------------------------ ------------------------
:Capability: KVM_CAP_IRQ_ROUTING :Capability: KVM_CAP_IRQ_ROUTING
:Architectures: x86 s390 arm arm64 :Architectures: x86 s390 arm64
:Type: vm ioctl :Type: vm ioctl
:Parameters: struct kvm_irq_routing (in) :Parameters: struct kvm_irq_routing (in)
:Returns: 0 on success, -1 on error :Returns: 0 on success, -1 on error
Sets the GSI routing table entries, overwriting any previously set entries. Sets the GSI routing table entries, overwriting any previously set entries.
On arm/arm64, GSI routing has the following limitation: On arm64, GSI routing has the following limitation:
- GSI routing does not apply to KVM_IRQ_LINE but only to KVM_IRQFD. - GSI routing does not apply to KVM_IRQ_LINE but only to KVM_IRQFD.
@ -2855,7 +2855,7 @@ after pausing the vcpu, but before it is resumed.
------------------- -------------------
:Capability: KVM_CAP_SIGNAL_MSI :Capability: KVM_CAP_SIGNAL_MSI
:Architectures: x86 arm arm64 :Architectures: x86 arm64
:Type: vm ioctl :Type: vm ioctl
:Parameters: struct kvm_msi (in) :Parameters: struct kvm_msi (in)
:Returns: >0 on delivery, 0 if guest blocked the MSI, and -1 on error :Returns: >0 on delivery, 0 if guest blocked the MSI, and -1 on error
@ -3043,7 +3043,7 @@ into the hash PTE second double word).
-------------- --------------
:Capability: KVM_CAP_IRQFD :Capability: KVM_CAP_IRQFD
:Architectures: x86 s390 arm arm64 :Architectures: x86 s390 arm64
:Type: vm ioctl :Type: vm ioctl
:Parameters: struct kvm_irqfd (in) :Parameters: struct kvm_irqfd (in)
:Returns: 0 on success, -1 on error :Returns: 0 on success, -1 on error
@ -3069,7 +3069,7 @@ Note that closing the resamplefd is not sufficient to disable the
irqfd. The KVM_IRQFD_FLAG_RESAMPLE is only necessary on assignment irqfd. The KVM_IRQFD_FLAG_RESAMPLE is only necessary on assignment
and need not be specified with KVM_IRQFD_FLAG_DEASSIGN. and need not be specified with KVM_IRQFD_FLAG_DEASSIGN.
On arm/arm64, gsi routing being supported, the following can happen: On arm64, gsi routing being supported, the following can happen:
- in case no routing entry is associated to this gsi, injection fails - in case no routing entry is associated to this gsi, injection fails
- in case the gsi is associated to an irqchip routing entry, - in case the gsi is associated to an irqchip routing entry,
@ -3325,7 +3325,7 @@ current state. "addr" is ignored.
---------------------- ----------------------
:Capability: basic :Capability: basic
:Architectures: arm, arm64 :Architectures: arm64
:Type: vcpu ioctl :Type: vcpu ioctl
:Parameters: struct kvm_vcpu_init (in) :Parameters: struct kvm_vcpu_init (in)
:Returns: 0 on success; -1 on error :Returns: 0 on success; -1 on error
@ -3423,7 +3423,7 @@ Possible features:
----------------------------- -----------------------------
:Capability: basic :Capability: basic
:Architectures: arm, arm64 :Architectures: arm64
:Type: vm ioctl :Type: vm ioctl
:Parameters: struct kvm_vcpu_init (out) :Parameters: struct kvm_vcpu_init (out)
:Returns: 0 on success; -1 on error :Returns: 0 on success; -1 on error
@ -3452,7 +3452,7 @@ VCPU matching underlying host.
--------------------- ---------------------
:Capability: basic :Capability: basic
:Architectures: arm, arm64, mips :Architectures: arm64, mips
:Type: vcpu ioctl :Type: vcpu ioctl
:Parameters: struct kvm_reg_list (in/out) :Parameters: struct kvm_reg_list (in/out)
:Returns: 0 on success; -1 on error :Returns: 0 on success; -1 on error
@ -3479,7 +3479,7 @@ KVM_GET_ONE_REG/KVM_SET_ONE_REG calls.
----------------------------------------- -----------------------------------------
:Capability: KVM_CAP_ARM_SET_DEVICE_ADDR :Capability: KVM_CAP_ARM_SET_DEVICE_ADDR
:Architectures: arm, arm64 :Architectures: arm64
:Type: vm ioctl :Type: vm ioctl
:Parameters: struct kvm_arm_device_address (in) :Parameters: struct kvm_arm_device_address (in)
:Returns: 0 on success, -1 on error :Returns: 0 on success, -1 on error
@ -3506,13 +3506,13 @@ can access emulated or directly exposed devices, which the host kernel needs
to know about. The id field is an architecture specific identifier for a to know about. The id field is an architecture specific identifier for a
specific device. specific device.
ARM/arm64 divides the id field into two parts, a device id and an arm64 divides the id field into two parts, a device id and an
address type id specific to the individual device:: address type id specific to the individual device::
bits: | 63 ... 32 | 31 ... 16 | 15 ... 0 | bits: | 63 ... 32 | 31 ... 16 | 15 ... 0 |
field: | 0x00000000 | device id | addr type id | field: | 0x00000000 | device id | addr type id |
ARM/arm64 currently only require this when using the in-kernel GIC arm64 currently only require this when using the in-kernel GIC
support for the hardware VGIC features, using KVM_ARM_DEVICE_VGIC_V2 support for the hardware VGIC features, using KVM_ARM_DEVICE_VGIC_V2
as the device id. When setting the base address for the guest's as the device id. When setting the base address for the guest's
mapping of the VGIC virtual CPU and distributor interface, the ioctl mapping of the VGIC virtual CPU and distributor interface, the ioctl
@ -4726,7 +4726,7 @@ to I/O ports.
------------------------------------ ------------------------------------
:Capability: KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 :Capability: KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2
:Architectures: x86, arm, arm64, mips :Architectures: x86, arm64, mips
:Type: vm ioctl :Type: vm ioctl
:Parameters: struct kvm_clear_dirty_log (in) :Parameters: struct kvm_clear_dirty_log (in)
:Returns: 0 on success, -1 on error :Returns: 0 on success, -1 on error
@ -4838,7 +4838,7 @@ version has the following quirks:
4.119 KVM_ARM_VCPU_FINALIZE 4.119 KVM_ARM_VCPU_FINALIZE
--------------------------- ---------------------------
:Architectures: arm, arm64 :Architectures: arm64
:Type: vcpu ioctl :Type: vcpu ioctl
:Parameters: int feature (in) :Parameters: int feature (in)
:Returns: 0 on success, -1 on error :Returns: 0 on success, -1 on error
@ -5920,7 +5920,7 @@ should put the acknowledged interrupt vector into the 'epr' field.
If exit_reason is KVM_EXIT_SYSTEM_EVENT then the vcpu has triggered If exit_reason is KVM_EXIT_SYSTEM_EVENT then the vcpu has triggered
a system-level event using some architecture specific mechanism (hypercall a system-level event using some architecture specific mechanism (hypercall
or some special instruction). In case of ARM/ARM64, this is triggered using or some special instruction). In case of ARM64, this is triggered using
HVC instruction based PSCI call from the vcpu. The 'type' field describes HVC instruction based PSCI call from the vcpu. The 'type' field describes
the system-level event type. The 'flags' field describes architecture the system-level event type. The 'flags' field describes architecture
specific flags for the system-level event. specific flags for the system-level event.
@ -6018,7 +6018,7 @@ in send_page or recv a buffer to recv_page).
__u64 fault_ipa; __u64 fault_ipa;
} arm_nisv; } arm_nisv;
Used on arm and arm64 systems. If a guest accesses memory not in a memslot, Used on arm64 systems. If a guest accesses memory not in a memslot,
KVM will typically return to userspace and ask it to do MMIO emulation on its KVM will typically return to userspace and ask it to do MMIO emulation on its
behalf. However, for certain classes of instructions, no instruction decode behalf. However, for certain classes of instructions, no instruction decode
(direction, length of memory access) is provided, and fetching and decoding (direction, length of memory access) is provided, and fetching and decoding
@ -6035,11 +6035,10 @@ did not fall within an I/O window.
Userspace implementations can query for KVM_CAP_ARM_NISV_TO_USER, and enable Userspace implementations can query for KVM_CAP_ARM_NISV_TO_USER, and enable
this capability at VM creation. Once this is done, these types of errors will this capability at VM creation. Once this is done, these types of errors will
instead return to userspace with KVM_EXIT_ARM_NISV, with the valid bits from instead return to userspace with KVM_EXIT_ARM_NISV, with the valid bits from
the HSR (arm) and ESR_EL2 (arm64) in the esr_iss field, and the faulting IPA the ESR_EL2 in the esr_iss field, and the faulting IPA in the fault_ipa field.
in the fault_ipa field. Userspace can either fix up the access if it's Userspace can either fix up the access if it's actually an I/O access by
actually an I/O access by decoding the instruction from guest memory (if it's decoding the instruction from guest memory (if it's very brave) and continue
very brave) and continue executing the guest, or it can decide to suspend, executing the guest, or it can decide to suspend, dump, or restart the guest.
dump, or restart the guest.
Note that KVM does not skip the faulting instruction as it does for Note that KVM does not skip the faulting instruction as it does for
KVM_EXIT_MMIO, but userspace has to emulate any change to the processing state KVM_EXIT_MMIO, but userspace has to emulate any change to the processing state
@ -6746,7 +6745,7 @@ and injected exceptions.
7.18 KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 7.18 KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2
:Architectures: x86, arm, arm64, mips :Architectures: x86, arm64, mips
:Parameters: args[0] whether feature should be enabled or not :Parameters: args[0] whether feature should be enabled or not
Valid flags are:: Valid flags are::
@ -7129,7 +7128,7 @@ reserved.
8.9 KVM_CAP_ARM_USER_IRQ 8.9 KVM_CAP_ARM_USER_IRQ
------------------------ ------------------------
:Architectures: arm, arm64 :Architectures: arm64
This capability, if KVM_CHECK_EXTENSION indicates that it is available, means This capability, if KVM_CHECK_EXTENSION indicates that it is available, means
that if userspace creates a VM without an in-kernel interrupt controller, it that if userspace creates a VM without an in-kernel interrupt controller, it
@ -7256,7 +7255,7 @@ HvFlushVirtualAddressList, HvFlushVirtualAddressListEx.
8.19 KVM_CAP_ARM_INJECT_SERROR_ESR 8.19 KVM_CAP_ARM_INJECT_SERROR_ESR
---------------------------------- ----------------------------------
:Architectures: arm, arm64 :Architectures: arm64
This capability indicates that userspace can specify (via the This capability indicates that userspace can specify (via the
KVM_SET_VCPU_EVENTS ioctl) the syndrome value reported to the guest when it KVM_SET_VCPU_EVENTS ioctl) the syndrome value reported to the guest when it

View File

@ -140,7 +140,7 @@ the cpu field to the processor id.
2. GROUP: KVM_ARM_VCPU_TIMER_CTRL 2. GROUP: KVM_ARM_VCPU_TIMER_CTRL
================================= =================================
:Architectures: ARM, ARM64 :Architectures: ARM64
2.1. ATTRIBUTES: KVM_ARM_VCPU_TIMER_IRQ_VTIMER, KVM_ARM_VCPU_TIMER_IRQ_PTIMER 2.1. ATTRIBUTES: KVM_ARM_VCPU_TIMER_IRQ_VTIMER, KVM_ARM_VCPU_TIMER_IRQ_PTIMER
----------------------------------------------------------------------------- -----------------------------------------------------------------------------

View File

@ -682,6 +682,7 @@ config ARM64_ERRATUM_2051678
config ARM64_ERRATUM_2077057 config ARM64_ERRATUM_2077057
bool "Cortex-A510: 2077057: workaround software-step corrupting SPSR_EL2" bool "Cortex-A510: 2077057: workaround software-step corrupting SPSR_EL2"
default y
help help
This option adds the workaround for ARM Cortex-A510 erratum 2077057. This option adds the workaround for ARM Cortex-A510 erratum 2077057.
Affected Cortex-A510 may corrupt SPSR_EL2 when the a step exception is Affected Cortex-A510 may corrupt SPSR_EL2 when the a step exception is

View File

@ -887,9 +887,11 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
* context synchronization event) is necessary to ensure that * context synchronization event) is necessary to ensure that
* pending interrupts are taken. * pending interrupts are taken.
*/ */
local_irq_enable(); if (ARM_EXCEPTION_CODE(ret) == ARM_EXCEPTION_IRQ) {
isb(); local_irq_enable();
local_irq_disable(); isb();
local_irq_disable();
}
guest_timing_exit_irqoff(); guest_timing_exit_irqoff();