[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: |
Le Tan |
Subject: |
Re: [Qemu-devel] [PATCH 1/3] intel-iommu: introduce Intel IOMMU (VT-d) emulation |
Date: |
Thu, 24 Jul 2014 07:21:54 +0800 |
Hi Paolo,
2014-07-23 15:58 GMT+08:00 Paolo Bonzini <address@hidden>:
> 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.
Thanks very much. Finally I got the idea here.:) Also thanks for your
renaming suggestions.
>> + *((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;
>> +}
>> +
>> +
>
Regards,
Le