HV: trusty: new hypercall to save/restore context of secure world

New field in VM's structure:
    sworld_snapshot: save cpu_context of secure world.

New hypercall: HC_SAVE_RESTORE_SWORLD_CTX
    In UOS S3 suspend path: trusty kernel driver will call this hypercall
    to require Hypervisor save context of secure world.
    In UOS S3 resume path: virtual firmware will call this hypercall to
    require Hypervisor restore context of secure world.

New bit in secure_world_control.flag:
    ctx_saved: indicate whether cpu_context of secure world is saved.

Signed-off-by: Qi Yadong <yadong.qi@intel.com>
Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
Qi Yadong
2018-05-25 13:08:04 +08:00
committed by lijinxia
parent 3225b16e5f
commit 2fc3bdec40
7 changed files with 85 additions and 5 deletions

View File

@@ -153,6 +153,13 @@ struct vm {
unsigned char GUID[16];
struct secure_world_control sworld_control;
/* Secure World's snapshot
* Currently, Secure World is only running on vcpu[0],
* so the snapshot only stores the vcpu0's run_context
* of secure world.
*/
struct cpu_context sworld_snapshot;
uint32_t vcpuid_entry_nr, vcpuid_level, vcpuid_xlevel;
struct vcpuid_entry vcpuid_entries[MAX_VM_VCPUID_ENTRIES];
#ifdef CONFIG_PARTITION_MODE

View File

@@ -104,11 +104,13 @@ struct secure_world_memory {
struct secure_world_control {
/* Flag indicates Secure World's state */
struct {
/* secure world supporting: 0(unsupported), 1(supported) */
/* sworld supporting: 0(unsupported), 1(supported) */
uint64_t supported : 1;
/* secure world running status: 0(inactive), 1(active) */
/* sworld running status: 0(inactive), 1(active) */
uint64_t active : 1;
uint64_t reserved : 62;
/* sworld context saving status: 0(unsaved), 1(saved) */
uint64_t ctx_saved : 1;
uint64_t reserved : 61;
} flag;
/* Secure world memory structure */
struct secure_world_memory sworld_memory;
@@ -126,7 +128,8 @@ struct trusty_startup_param {
void switch_world(struct vcpu *vcpu, int next_world);
bool initialize_trusty(struct vcpu *vcpu, uint64_t param);
void destroy_secure_world(struct vm *vm);
void save_sworld_context(struct vcpu *vcpu);
void restore_sworld_context(struct vcpu *vcpu);
void trusty_set_dseed(void *dseed, uint8_t dseed_num);
#endif /* TRUSTY_H_ */