diff --git a/hypervisor/arch/x86/ept.c b/hypervisor/arch/x86/ept.c index d2030017f..a8da5e77d 100644 --- a/hypervisor/arch/x86/ept.c +++ b/hypervisor/arch/x86/ept.c @@ -104,9 +104,16 @@ uint64_t local_gpa2hpa(const struct vm *vm, uint64_t gpa, uint32_t *size) { uint64_t hpa = 0UL; uint64_t *pgentry, pg_size = 0UL; + void *eptp; + struct vcpu *vcpu = vcpu_from_pid(vm, get_cpu_id()); - pgentry = lookup_address((uint64_t *)vm->arch_vm.nworld_eptp, - gpa, &pg_size, PTT_EPT); + if (vcpu && (vcpu->arch_vcpu.cur_context == SECURE_WORLD)) { + eptp = vm->arch_vm.sworld_eptp; + } else { + eptp = vm->arch_vm.nworld_eptp; + } + + pgentry = lookup_address((uint64_t *)eptp, gpa, &pg_size, PTT_EPT); if (pgentry != NULL) { hpa = ((*pgentry & (~(pg_size - 1UL))) | (gpa & (pg_size - 1UL))); diff --git a/hypervisor/include/arch/x86/guest/vm.h b/hypervisor/include/arch/x86/guest/vm.h index 6822c1f41..b2355eb86 100644 --- a/hypervisor/include/arch/x86/guest/vm.h +++ b/hypervisor/include/arch/x86/guest/vm.h @@ -216,7 +216,7 @@ static inline struct vcpu *vcpu_from_vid(struct vm *vm, uint16_t vcpu_id) return NULL; } -static inline struct vcpu *vcpu_from_pid(struct vm *vm, uint16_t pcpu_id) +static inline struct vcpu *vcpu_from_pid(const struct vm *vm, uint16_t pcpu_id) { uint16_t i; struct vcpu *vcpu;