qemu-devel
[Top][All Lists]
Advanced

[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;
> +}
> +
> +




reply via email to

[Prev in Thread] Current Thread [Next in Thread]