[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 1/3] intel-iommu: introduce Intel IOMMU (VT-d) e
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH 1/3] intel-iommu: introduce Intel IOMMU (VT-d) emulation |
Date: |
Wed, 23 Jul 2014 09:58:10 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 |
Il 22/07/2014 17:47, Le Tan ha scritto:
> +static inline void define_quad(IntelIOMMUState *s, hwaddr addr, uint64_t val,
> + uint64_t wmask, uint64_t w1cmask)
> +{
> + *((uint64_t *)&s->csr[addr]) = val;
All these casts are not endian-safe. Please use ldl_le_p, ldq_le_p,
stl_le_p, stq_le_p.
> + *((uint64_t *)&s->wmask[addr]) = wmask;
> + *((uint64_t *)&s->w1cmask[addr]) = w1cmask;
> +}
> +
> +static inline void define_quad_wo(IntelIOMMUState *s, hwaddr addr,
> + uint64_t mask)
> +{
> + *((uint64_t *)&s->womask[addr]) = mask;
> +}
> +
> +static inline void define_long(IntelIOMMUState *s, hwaddr addr, uint32_t val,
> + uint32_t wmask, uint32_t w1cmask)
> +{
> + *((uint32_t *)&s->csr[addr]) = val;
> + *((uint32_t *)&s->wmask[addr]) = wmask;
> + *((uint32_t *)&s->w1cmask[addr]) = w1cmask;
> +}
> +
> +static inline void define_long_wo(IntelIOMMUState *s, hwaddr addr,
> + uint32_t mask)
> +{
> + *((uint32_t *)&s->womask[addr]) = mask;
> +}
> +
> +/* "External" get/set operations */
> +static inline void set_quad(IntelIOMMUState *s, hwaddr addr, uint64_t val)
> +{
> + uint64_t oldval = *((uint64_t *)&s->csr[addr]);
> + uint64_t wmask = *((uint64_t *)&s->wmask[addr]);
> + uint64_t w1cmask = *((uint64_t *)&s->w1cmask[addr]);
> + *((uint64_t *)&s->csr[addr]) =
> + ((oldval & ~wmask) | (val & wmask)) & ~(w1cmask & val);
> +}
> +
> +static inline void set_long(IntelIOMMUState *s, hwaddr addr, uint32_t val)
> +{
> + uint32_t oldval = *((uint32_t *)&s->csr[addr]);
> + uint32_t wmask = *((uint32_t *)&s->wmask[addr]);
> + uint32_t w1cmask = *((uint32_t *)&s->w1cmask[addr]);
> + *((uint32_t *)&s->csr[addr]) =
> + ((oldval & ~wmask) | (val & wmask)) & ~(w1cmask & val);
> +}
> +
> +static inline uint64_t get_quad(IntelIOMMUState *s, hwaddr addr)
> +{
> + uint64_t val = *((uint64_t *)&s->csr[addr]);
> + uint64_t womask = *((uint64_t *)&s->womask[addr]);
> + return val & ~womask;
> +}
> +
> +
> +static inline uint32_t get_long(IntelIOMMUState *s, hwaddr addr)
> +{
> + uint32_t val = *((uint32_t *)&s->csr[addr]);
> + uint32_t womask = *((uint32_t *)&s->womask[addr]);
> + return val & ~womask;
> +}
> +
> +
> +
> +/* "Internal" get/set operations */
> +static inline uint64_t __get_quad(IntelIOMMUState *s, hwaddr addr)
get_quad_raw?
> +{
> + return *((uint64_t *)&s->csr[addr]);
> +}
> +
> +static inline uint32_t __get_long(IntelIOMMUState *s, hwaddr addr)
get_long_raw?
> +{
> + return *((uint32_t *)&s->csr[addr]);
> +}
> +
> +
> +/* val = (val & ~clear) | mask */
> +static inline uint32_t set_mask_long(IntelIOMMUState *s, hwaddr addr,
set_clear_long?
> + uint32_t clear, uint32_t mask)
> +{
> + uint32_t *ptr = (uint32_t *)&s->csr[addr];
> + uint32_t val = (*ptr & ~clear) | mask;
> + *ptr = val;
> + return val;
> +}
> +
> +/* val = (val & ~clear) | mask */
> +static inline uint64_t set_mask_quad(IntelIOMMUState *s, hwaddr addr,
set_clear_quad?
> + uint64_t clear, uint64_t mask)
> +{
> + uint64_t *ptr = (uint64_t *)&s->csr[addr];
> + uint64_t val = (*ptr & ~clear) | mask;
> + *ptr = val;
> + return val;
> +}
> +
> +