mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/hvm: Rework HVM_HCALL_invalidate handling
Sending an invalidation to the device model is an internal detail of
completing the hypercall; callers should not need to be responsible for it.
Drop HVM_HCALL_invalidate entirely and call send_invalidate_req() when
appropriate.
This makes the function boolean in nature, although the existing
HVM_HCALL_{completed,preempted} constants are kept to aid code clarity. While
updating the return type, drop _do from the name, as it is redundant.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Reviewed-by: Wei Liu <wei.liu2@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
This commit is contained in:
1 parent
62c7b99a10
commit
55fa23d907
4 files changed
+10
-21
No files matched your search
@@ -3874,7 +3874,7 @@ static const hypercall_table_t hvm_hypercall_table[] = {
|
||||
#undef HYPERCALL
|
||||
#undef COMPAT_CALL
|
||||
|
||||
int hvm_do_hypercall(struct cpu_user_regs *regs)
|
||||
int hvm_hypercall(struct cpu_user_regs *regs)
|
||||
{
|
||||
struct vcpu *curr = current;
|
||||
struct domain *currd = curr->domain;
|
||||
@@ -4011,9 +4011,8 @@ int hvm_do_hypercall(struct cpu_user_regs *regs)
|
||||
return HVM_HCALL_preempted;
|
||||
|
||||
if ( unlikely(currd->arch.hvm_domain.qemu_mapcache_invalidate) &&
|
||||
test_and_clear_bool(currd->arch.hvm_domain.
|
||||
qemu_mapcache_invalidate) )
|
||||
return HVM_HCALL_invalidate;
|
||||
test_and_clear_bool(currd->arch.hvm_domain.qemu_mapcache_invalidate) )
|
||||
send_invalidate_req();
|
||||
|
||||
return HVM_HCALL_completed;
|
||||
}
|
||||
|
||||
@@ -2542,13 +2542,9 @@ void svm_vmexit_handler(struct cpu_user_regs *regs)
|
||||
break;
|
||||
BUG_ON(vcpu_guestmode);
|
||||
HVMTRACE_1D(VMMCALL, regs->_eax);
|
||||
rc = hvm_do_hypercall(regs);
|
||||
if ( rc != HVM_HCALL_preempted )
|
||||
{
|
||||
|
||||
if ( hvm_hypercall(regs) == HVM_HCALL_completed )
|
||||
__update_guest_eip(regs, inst_len);
|
||||
if ( rc == HVM_HCALL_invalidate )
|
||||
send_invalidate_req();
|
||||
}
|
||||
break;
|
||||
|
||||
case VMEXIT_DR0_READ ... VMEXIT_DR7_READ:
|
||||
|
||||
@@ -3629,19 +3629,14 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
|
||||
update_guest_eip(); /* Safe: RDTSC, RDTSCP */
|
||||
hvm_rdtsc_intercept(regs);
|
||||
break;
|
||||
|
||||
case EXIT_REASON_VMCALL:
|
||||
{
|
||||
int rc;
|
||||
HVMTRACE_1D(VMMCALL, regs->_eax);
|
||||
rc = hvm_do_hypercall(regs);
|
||||
if ( rc != HVM_HCALL_preempted )
|
||||
{
|
||||
|
||||
if ( hvm_hypercall(regs) == HVM_HCALL_completed )
|
||||
update_guest_eip(); /* Safe: VMCALL */
|
||||
if ( rc == HVM_HCALL_invalidate )
|
||||
send_invalidate_req();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case EXIT_REASON_CR_ACCESS:
|
||||
{
|
||||
__vmread(EXIT_QUALIFICATION, &exit_qualification);
|
||||
|
||||
@@ -105,8 +105,7 @@ enum hvm_copy_result hvm_fetch_from_guest_linear(
|
||||
|
||||
#define HVM_HCALL_completed 0 /* hypercall completed - no further action */
|
||||
#define HVM_HCALL_preempted 1 /* hypercall preempted - re-execute VMCALL */
|
||||
#define HVM_HCALL_invalidate 2 /* invalidate ioemu-dm memory cache */
|
||||
int hvm_do_hypercall(struct cpu_user_regs *pregs);
|
||||
int hvm_hypercall(struct cpu_user_regs *regs);
|
||||
|
||||
void hvm_hlt(unsigned int eflags);
|
||||
void hvm_triple_fault(void);
|
||||
|
||||