[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v1] x86/hvm: Generic instruction re-execution mechanism for execute faults
>> + /* Now transform our RWX values in a XENMEM_access_* constant. */ >> + if ( r == 0 && w == 0 && x == 0 ) >> + new_access = XENMEM_access_n; >> + else if ( r == 0 && w == 0 && x == 1 ) >> + new_access = XENMEM_access_x; >> + else if ( r == 0 && w == 1 && x == 0 ) >> + new_access = XENMEM_access_w; >> + else if ( r == 0 && w == 1 && x == 1 ) >> + new_access = XENMEM_access_wx; >> + else if ( r == 1 && w == 0 && x == 0 ) >> + new_access = XENMEM_access_r; >> + else if ( r == 1 && w == 0 && x == 1 ) >> + new_access = XENMEM_access_rx; >> + else if ( r == 1 && w == 1 && x == 0 ) >> + new_access = XENMEM_access_rw; >> + else if ( r == 1 && w == 1 && x == 1 ) >> + new_access = XENMEM_access_rwx; >> + else >> + new_access = required_access; /* Should never get here. */ > > There seems to be a lot of translation from xenmem_access_t to bool > fields and then to xenmem_access_t again. Can't you just avoid the > booleans? The translation is done because the rights are cumulative and I think this is the clear way to do this. >> if ( vm_event_check_ring(d->vm_event_monitor) && >> d->arch.monitor.inguest_pagefault_disabled && >> - npfec.kind != npfec_kind_with_gla ) /* don't send a mem_event */ >> + npfec.kind != npfec_kind_with_gla && >> + hvm_funcs.start_reexecute_instruction ) /* don't send a mem_event >> */ >> { >> - hvm_emulate_one_vm_event(EMUL_KIND_NORMAL, TRAP_invalid_op, >> X86_EVENT_NO_EC); >> - >> + v->arch.vm_event->emulate_flags = 0; >> + hvm_funcs.start_reexecute_instruction(v, gpa, XENMEM_access_rw); >> return true; >> } > > Don't you need to fallback to using hvm_emulate_one_vm_event if > start_reexecute_instruction is not available? Fallback with hvm_emulate_one_vm_event can result in loosing events. >> + for_each_vcpu(d, v) >> + { >> + if ( !v->arch.rexec_level ) >> + continue; >> + >> + for ( i = v->arch.rexec_level - 1; i >= 0; i-- ) > > Is there any reason this has to be done backwards? > > If you do it from 0 to v->arch.rexec_level you could use an unsigned > int as the index. This is done backwards because of the corresponding code in vmx_stop_reexecute_instruction() but here it can be turned the other way if you insist on i to be unsigned. >> +#define REEXECUTION_MAX_DEPTH 8 >> + struct rexec_context_t { >> + unsigned long gpa; >> + xenmem_access_t old_access; >> + xenmem_access_t cur_access; >> + bool_t old_single_step; > > bool please > >> + } rexec_context[REEXECUTION_MAX_DEPTH]; > > This is fairly big amount of data that's only used if vm events are > enabled, could this be allocated on a per-guest basis? Yes, this can be moved to d->arch.monitor in the next version. > >> + >> + int rexec_level; >> + >> + /* >> + * Will be true when the vcpu is in VMX root, >> + * false when it is not. >> + */ >> + bool_t in_host; > > bool. > >> + >> struct arch_vm_event *vm_event; >> >> struct vcpu_msrs *msrs; >> diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h >> index 3d3250dff0..1f5d43a98d 100644 >> --- a/xen/include/asm-x86/hvm/hvm.h >> +++ b/xen/include/asm-x86/hvm/hvm.h >> @@ -167,6 +167,8 @@ struct hvm_function_table { >> >> int (*cpu_up)(void); >> void (*cpu_down)(void); >> + int (*start_reexecute_instruction)(struct vcpu *v, unsigned long gpa, >> + xenmem_access_t required_access); > > I would name this reexecute_instruction, I don't think the start_ > prefix adds any value to the handler. Sure, I will drop the start on the next version Regards, Alex _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |