|  | 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 a 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 cachable or | 
|  | non-cachable 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 | 
|  |  |