| When used with the "pseries" machine type, QEMU-system-ppc64 implements |
| a set of hypervisor calls using a subset of the server "PAPR" specification |
| (IBM internal at this point), which is also what IBM's proprietary hypervisor |
| adheres too. |
| |
| The subset is selected based on the requirements of Linux as a guest. |
| |
| In addition to those calls, we have added our own private hypervisor |
| calls which are mostly used as a private interface between the firmware |
| running in the guest and QEMU. |
| |
| All those hypercalls start at hcall number 0xf000 which correspond |
| to an implementation specific range in PAPR. |
| |
| - H_RTAS (0xf000) |
| |
| RTAS is a set of runtime services generally provided by the firmware |
| inside the guest to the operating system. It predates the existence |
| of hypervisors (it was originally an extension to Open Firmware) and |
| is still used by PAPR to provide various services that aren't performance |
| sensitive. |
| |
| We currently implement the RTAS services in QEMU itself. The actual RTAS |
| "firmware" blob in the guest is a small stub of a few instructions which |
| calls our private H_RTAS hypervisor call to pass the RTAS calls to QEMU. |
| |
| Arguments: |
| |
| r3 : H_RTAS (0xf000) |
| r4 : Guest physical address of RTAS parameter block |
| |
| Returns: |
| |
| H_SUCCESS : Successfully called the RTAS function (RTAS result |
| will have been stored in the parameter block) |
| H_PARAMETER : Unknown token |
| |
| - H_LOGICAL_MEMOP (0xf001) |
| |
| When the guest runs in "real mode" (in powerpc lingua this means |
| with MMU disabled, ie guest effective == guest physical), it only |
| has access to a subset of memory and no IOs. |
| |
| PAPR provides a set of hypervisor calls to perform cacheable or |
| non-cacheable accesses to any guest physical addresses that the |
| guest can use in order to access IO devices while in real mode. |
| |
| This is typically used by the firmware running in the guest. |
| |
| However, doing a hypercall for each access is extremely inefficient |
| (even more so when running KVM) when accessing the frame buffer. In |
| that case, things like scrolling become unusably slow. |
| |
| This hypercall allows the guest to request a "memory op" to be applied |
| to memory. The supported memory ops at this point are to copy a range |
| of memory (supports overlap of source and destination) and XOR which |
| is used by our SLOF firmware to invert the screen. |
| |
| Arguments: |
| |
| r3: H_LOGICAL_MEMOP (0xf001) |
| r4: Guest physical address of destination |
| r5: Guest physical address of source |
| r6: Individual element size |
| 0 = 1 byte |
| 1 = 2 bytes |
| 2 = 4 bytes |
| 3 = 8 bytes |
| r7: Number of elements |
| r8: Operation |
| 0 = copy |
| 1 = xor |
| |
| Returns: |
| |
| H_SUCCESS : Success |
| H_PARAMETER : Invalid argument |
| |