| On PPC64 systems supporting Protected Execution Facility (PEF), system |
| memory can be placed in a secured region where only an "ultravisor" |
| running in firmware can provide to access it. pseries guests on such |
| systems can communicate with the ultravisor (via ultracalls) to switch to a |
| secure VM mode (SVM) where the guest's memory is relocated to this secured |
| region, making its memory inaccessible to normal processes/guests running on |
| the host. |
| |
| The various ultracalls/hypercalls relating to SVM mode are currently |
| only documented internally, but are planned for direct inclusion into the |
| public OpenPOWER version of the PAPR specification (LoPAPR/LoPAR). An internal |
| ACR has been filed to reserve a hypercall number range specific to this |
| use-case to avoid any future conflicts with the internally-maintained PAPR |
| specification. This document summarizes some of these details as they relate |
| to QEMU. |
| |
| == hypercalls needed by the ultravisor == |
| |
| Switching to SVM mode involves a number of hcalls issued by the ultravisor |
| to the hypervisor to orchestrate the movement of guest memory to secure |
| memory and various other aspects SVM mode. Numbers are assigned for these |
| hcalls within the reserved range 0xEF00-0xEF80. The below documents the |
| hcalls relevant to QEMU. |
| |
| - H_TPM_COMM (0xef10) |
| |
| For TPM_COMM_OP_EXECUTE operation: |
| Send a request to a TPM and receive a response, opening a new TPM session |
| if one has not already been opened. |
| |
| For TPM_COMM_OP_CLOSE_SESSION operation: |
| Close the existing TPM session, if any. |
| |
| Arguments: |
| |
| r3 : H_TPM_COMM (0xef10) |
| r4 : TPM operation, one of: |
| TPM_COMM_OP_EXECUTE (0x1) |
| TPM_COMM_OP_CLOSE_SESSION (0x2) |
| r5 : in_buffer, guest physical address of buffer containing the request |
| - Caller may use the same address for both request and response |
| r6 : in_size, size of the in buffer |
| - Must be less than or equal to 4KB |
| r7 : out_buffer, guest physical address of buffer to store the response |
| - Caller may use the same address for both request and response |
| r8 : out_size, size of the out buffer |
| - Must be at least 4KB, as this is the maximum request/response size |
| supported by most TPM implementations, including the TPM Resource |
| Manager in the linux kernel. |
| |
| Return values: |
| |
| r3 : H_Success request processed successfully |
| H_PARAMETER invalid TPM operation |
| H_P2 in_buffer is invalid |
| H_P3 in_size is invalid |
| H_P4 out_buffer is invalid |
| H_P5 out_size is invalid |
| H_RESOURCE problem communicating with TPM |
| H_FUNCTION TPM access is not currently allowed/configured |
| r4 : For TPM_COMM_OP_EXECUTE, the size of the response will be stored here |
| upon success. |
| |
| Use-case/notes: |
| |
| SVM filesystems are encrypted using a symmetric key. This key is then |
| wrapped/encrypted using the public key of a trusted system which has the |
| private key stored in the system's TPM. An Ultravisor will use this |
| hcall to unwrap/unseal the symmetric key using the system's TPM device |
| or a TPM Resource Manager associated with the device. |
| |
| The Ultravisor sets up a separate session key with the TPM in advance |
| during host system boot. All sensitive in and out values will be |
| encrypted using the session key. Though the hypervisor will see the 'in' |
| and 'out' buffers in raw form, any sensitive contents will generally be |
| encrypted using this session key. |