Paravirtualized sched support for arm64
=======================================

KVM/arm64 provides some hypervisor service calls to support a paravirtualized
sched.

Some SMCCC compatible hypercalls are defined:

* PV_SCHED_FEATURES:          0xC5000090
* PV_SCHED_IPA_INIT:          0xC5000091
* PV_SCHED_IPA_RELEASE:       0xC5000092
* PV_SCHED_KICK_CPU:          0xC5000093

The existence of the PV_SCHED hypercall should be probed using the SMCCC 1.1
ARCH_FEATURES mechanism before calling it.

PV_SCHED_FEATURES
    ============= ========    ==========
    Function ID:  (uint32)    0xC5000090
    PV_call_id:   (uint32)    The function to query for support.
    Return value: (int64)     NOT_SUPPORTED (-1) or SUCCESS (0) if the relevant
                              PV-sched feature is supported by the hypervisor.
    ============= ========    ==========

PV_SCHED_IPA_INIT
    ============= ========    ==========
    Function ID:  (uint32)    0xC5000091
    Return value: (int64)     NOT_SUPPORTED (-1) or SUCCESS (0) if the IPA of
                              this vCPU's PV data structure is shared to the
                              hypervisor.
    ============= ========    ==========

PV_SCHED_IPA_RELEASE
    ============= ========    ==========
    Function ID:  (uint32)    0xC5000092
    Return value: (int64)     NOT_SUPPORTED (-1) or SUCCESS (0) if the IPA of
                              this vCPU's PV data structure is released.
    ============= ========    ==========

PV_SCHED_KICK_CPU
    ============= ========    ==========
    Function ID:  (uint32)    0xC5000093
    Return value: (int64)     NOT_SUPPORTED (-1) or SUCCESS (0) if the vCPU is
                              kicked by the hypervisor.
    ============= ========    ==========

PV sched state
--------------

The structure pointed to by the PV_SCHED_IPA hypercall is as follows:

+-----------+-------------+-------------+-----------------------------------+
| Field     | Byte Length | Byte Offset | Description                       |
+===========+=============+=============+===================================+
| preempted |      4      |      0      | Indicates that the vCPU that owns |
|           |             |             | this struct is running or not.    |
|           |             |             | Non-zero values mean the vCPU has |
|           |             |             | been preempted. Zero means the    |
|           |             |             | vCPU is not preempted.            |
+-----------+-------------+-------------+-----------------------------------+

The preempted field will be updated to 0 by the hypervisor prior to scheduling
a vCPU. When the vCPU is scheduled out, the preempted field will be updated
to 1 by the hypervisor.

A vCPU of a paravirtualized guest that is busywaiting in guest kernel mode for
an event to occur (ex: a spinlock to become available) can execute WFI
instruction once it has busy-waited for more than a threshold time-interval.
Execution of WFI instruction would cause the hypervisor to put the vCPU to sleep
until occurrence of an appropriate event. Another vCPU of the same guest can
wakeup the sleeping vCPU by issuing PV_SCHED_KICK_CPU hypercall, specifying CPU
id (reg1) of the vCPU to be woken up.
