mirror of
https://github.com/yuzu-emu/unicorn
synced 2024-11-24 20:38:28 +00:00
79 lines
2.6 KiB
Text
79 lines
2.6 KiB
Text
|
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
|
||
|
|