Message ID | 1599769330-17656-4-git-send-email-olekstysh@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | IOREQ feature (+ virtio-mmio) on Arm | expand |
On 10.09.2020 22:21, Oleksandr Tyshchenko wrote: > --- a/xen/include/xen/ioreq.h > +++ b/xen/include/xen/ioreq.h > @@ -35,6 +35,13 @@ static inline struct hvm_ioreq_server *get_ioreq_server(const struct domain *d, > return GET_IOREQ_SERVER(d, id); > } > > +static inline bool hvm_ioreq_needs_completion(const ioreq_t *ioreq) > +{ > + return ioreq->state == STATE_IOREQ_READY && > + !ioreq->data_is_ptr && > + (ioreq->type != IOREQ_TYPE_PIO || ioreq->dir != IOREQ_WRITE); > +} While the PIO aspect has been discussed to some length, what about the data_is_ptr concept? I didn't think there were Arm insns fitting this? Instead I thought some other Arm-specific adjustments to the protocol might be needed. At which point the question of course would be in how far ioreq_t as a whole really fits Arm in its current shape. Jan
On 14.09.20 17:59, Jan Beulich wrote: Hi Jan > On 10.09.2020 22:21, Oleksandr Tyshchenko wrote: >> --- a/xen/include/xen/ioreq.h >> +++ b/xen/include/xen/ioreq.h >> @@ -35,6 +35,13 @@ static inline struct hvm_ioreq_server *get_ioreq_server(const struct domain *d, >> return GET_IOREQ_SERVER(d, id); >> } >> >> +static inline bool hvm_ioreq_needs_completion(const ioreq_t *ioreq) >> +{ >> + return ioreq->state == STATE_IOREQ_READY && >> + !ioreq->data_is_ptr && >> + (ioreq->type != IOREQ_TYPE_PIO || ioreq->dir != IOREQ_WRITE); >> +} > While the PIO aspect has been discussed to some length, what about > the data_is_ptr concept? I didn't think there were Arm insns fitting > this? Instead I thought some other Arm-specific adjustments to the > protocol might be needed. At which point the question of course would > be in how far ioreq_t as a whole really fits Arm in its current shape. I may mistake here but I don't think the "data_is_ptr" is supported. It worth mentioning that on Arm, all the accesses to MMIO region will do a single memory access. So we set "df" to 0 and "count" to 1. Other ioreq_t fields are in use.
Hi, On 14/09/2020 15:59, Jan Beulich wrote: > On 10.09.2020 22:21, Oleksandr Tyshchenko wrote: >> --- a/xen/include/xen/ioreq.h >> +++ b/xen/include/xen/ioreq.h >> @@ -35,6 +35,13 @@ static inline struct hvm_ioreq_server *get_ioreq_server(const struct domain *d, >> return GET_IOREQ_SERVER(d, id); >> } >> >> +static inline bool hvm_ioreq_needs_completion(const ioreq_t *ioreq) >> +{ >> + return ioreq->state == STATE_IOREQ_READY && >> + !ioreq->data_is_ptr && >> + (ioreq->type != IOREQ_TYPE_PIO || ioreq->dir != IOREQ_WRITE); >> +} > > While the PIO aspect has been discussed to some length, what about > the data_is_ptr concept? I didn't think there were Arm insns fitting > this? Instead I thought some other Arm-specific adjustments to the > protocol might be needed. At which point the question of course would > be in how far ioreq_t as a whole really fits Arm in its current shape. I would rather not try to re-invent ioreq_t for Arm if we don't need to. This is only going to increase the amount of arch specific code in a device emulator that really ought to be agnostic. At the moment, I think it is fine to have "unused" field on Arm as long as they contain the right value. So I would rather keep the check in common code as well. Cheers,
diff --git a/xen/arch/x86/hvm/vmx/realmode.c b/xen/arch/x86/hvm/vmx/realmode.c index bdbd9cb..292a7c3 100644 --- a/xen/arch/x86/hvm/vmx/realmode.c +++ b/xen/arch/x86/hvm/vmx/realmode.c @@ -10,6 +10,7 @@ */ #include <xen/init.h> +#include <xen/ioreq.h> #include <xen/lib.h> #include <xen/sched.h> #include <xen/paging.h> diff --git a/xen/include/asm-x86/hvm/vcpu.h b/xen/include/asm-x86/hvm/vcpu.h index 5ccd075..6c1feda 100644 --- a/xen/include/asm-x86/hvm/vcpu.h +++ b/xen/include/asm-x86/hvm/vcpu.h @@ -91,13 +91,6 @@ struct hvm_vcpu_io { const struct g2m_ioport *g2m_ioport; }; -static inline bool hvm_ioreq_needs_completion(const ioreq_t *ioreq) -{ - return ioreq->state == STATE_IOREQ_READY && - !ioreq->data_is_ptr && - (ioreq->type != IOREQ_TYPE_PIO || ioreq->dir != IOREQ_WRITE); -} - struct nestedvcpu { bool_t nv_guestmode; /* vcpu in guestmode? */ void *nv_vvmcx; /* l1 guest virtual VMCB/VMCS */ diff --git a/xen/include/xen/ioreq.h b/xen/include/xen/ioreq.h index f846034..2240a73 100644 --- a/xen/include/xen/ioreq.h +++ b/xen/include/xen/ioreq.h @@ -35,6 +35,13 @@ static inline struct hvm_ioreq_server *get_ioreq_server(const struct domain *d, return GET_IOREQ_SERVER(d, id); } +static inline bool hvm_ioreq_needs_completion(const ioreq_t *ioreq) +{ + return ioreq->state == STATE_IOREQ_READY && + !ioreq->data_is_ptr && + (ioreq->type != IOREQ_TYPE_PIO || ioreq->dir != IOREQ_WRITE); +} + bool hvm_io_pending(struct vcpu *v); bool handle_hvm_io_completion(struct vcpu *v); bool is_ioreq_server_page(struct domain *d, const struct page_info *page);