[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V4 1/3] xen/mem_access: Support for memory-content hiding
>>> On 08.07.15 at 12:22, <rcojocaru@xxxxxxxxxxxxxxx> wrote: > --- a/xen/arch/x86/hvm/emulate.c > +++ b/xen/arch/x86/hvm/emulate.c > @@ -653,6 +653,31 @@ static int hvmemul_read( > unsigned int bytes, > struct x86_emulate_ctxt *ctxt) > { > + struct hvm_emulate_ctxt *hvmemul_ctxt = > + container_of(ctxt, struct hvm_emulate_ctxt, ctxt); > + > + if ( unlikely(hvmemul_ctxt->set_context) ) > + { > + struct vcpu *curr = current; > + unsigned int safe_bytes; > + > + if ( !curr->arch.vm_event.emul_read_data ) > + return X86EMUL_UNHANDLEABLE; > + > + safe_bytes = min_t(unsigned int, > + bytes, curr->arch.vm_event.emul_read_data->size); Afaict min() would work here. > + if ( safe_bytes ) > + { > + memcpy(p_data, curr->arch.vm_event.emul_read_data->data, > safe_bytes); Why is this conditional? Doesn't ->size being zero mean all data should be zeroed? Otherwise this isn't really consistent behavior... Also - long line. > + > + if ( bytes > safe_bytes ) > + memset(p_data + safe_bytes, 0, bytes - safe_bytes); No need for the conditional here. > @@ -893,6 +918,28 @@ static int hvmemul_cmpxchg( > unsigned int bytes, > struct x86_emulate_ctxt *ctxt) > { > + struct hvm_emulate_ctxt *hvmemul_ctxt = > + container_of(ctxt, struct hvm_emulate_ctxt, ctxt); > + > + if ( unlikely(hvmemul_ctxt->set_context) ) > + { > + struct vcpu *curr = current; > + > + if ( curr->arch.vm_event.emul_read_data ) > + { > + unsigned int safe_bytes = min_t(unsigned int, bytes, > + curr->arch.vm_event.emul_read_data->size); > + > + memcpy(p_new, curr->arch.vm_event.emul_read_data->data, > + safe_bytes); > + > + if ( bytes > safe_bytes ) > + memset(p_new + safe_bytes, 0, bytes - safe_bytes); > + } > + else > + return X86EMUL_UNHANDLEABLE; Please make this look as similar to hvmemul_read() as possible (invert the if() condition etc). Once done, you'll be seeing that this would better be factored out... > @@ -935,6 +982,43 @@ static int hvmemul_rep_ins( > !!(ctxt->regs->eflags & X86_EFLAGS_DF), gpa); > } > > +static int hvmemul_rep_outs_set_context( > + enum x86_segment src_seg, > + unsigned long src_offset, > + uint16_t dst_port, > + unsigned int bytes_per_rep, > + unsigned long *reps, > + struct x86_emulate_ctxt *ctxt) > +{ > + unsigned int bytes = *reps * bytes_per_rep; > + struct vcpu *curr = current; > + unsigned int safe_bytes; > + char *buf = NULL; Pointless initializer. > @@ -1063,7 +1151,23 @@ static int hvmemul_rep_movs( > */ > rc = hvm_copy_from_guest_phys(buf, sgpa, bytes); > if ( rc == HVMCOPY_okay ) > + { > + struct vcpu *curr = current; > + > + if ( unlikely(hvmemul_ctxt->set_context) && > + curr->arch.vm_event.emul_read_data ) Factoring out will also make obvious that here you're _still_ not handling things consistently with the other cases. > @@ -1466,6 +1466,10 @@ void p2m_mem_access_emulate_check(struct vcpu *v, > } > > v->arch.vm_event.emulate_flags = violation ? rsp->flags : 0; > + > + if ( rsp->flags & VM_EVENT_FLAG_SET_EMUL_READ_DATA && Please parenthesize the &. > --- a/xen/common/domain.c > +++ b/xen/common/domain.c > @@ -166,6 +166,7 @@ struct vcpu *alloc_vcpu( > free_cpumask_var(v->cpu_hard_affinity_saved); > free_cpumask_var(v->cpu_soft_affinity); > free_cpumask_var(v->vcpu_dirty_cpumask); > + xfree(v->arch.vm_event.emul_read_data); > free_vcpu_struct(v); > return NULL; > } > @@ -821,6 +822,7 @@ static void complete_domain_destroy(struct rcu_head *head) > free_cpumask_var(v->cpu_hard_affinity_saved); > free_cpumask_var(v->cpu_soft_affinity); > free_cpumask_var(v->vcpu_dirty_cpumask); > + xfree(v->arch.vm_event.emul_read_data); Common code fiddling with arch-specific bits. I can't see how this would build on ARM. > @@ -63,6 +64,21 @@ static int vm_event_enable( > vm_event_ring_lock_init(ved); > vm_event_ring_lock(ved); > > + for_each_vcpu( d, v ) > + { > + if ( v->arch.vm_event.emul_read_data ) > + continue; > + > + v->arch.vm_event.emul_read_data = > + xmalloc(struct vm_event_emul_read_data); > + > + if ( !v->arch.vm_event.emul_read_data ) > + { > + rc = -ENOMEM; > + goto err; > + } > + } Same here. You need to decide whether this is to be a generic feature (then the pointer needs to move to struct vcpu) or x86 specific (then the code needs to move to x86-specific files). > @@ -189,6 +198,12 @@ struct vm_event_sharing { > uint32_t _pad; > }; > > +struct vm_event_emul_read_data { > + uint32_t size; > + /* The struct is used in a union with vm_event_regs_x86. */ > + uint8_t data[sizeof(struct vm_event_regs_x86) - sizeof(uint32_t)]; Again, albeit here I can see no good alternative at this point. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |