Hi Paolo, 2014-07-23 15:58 GMT+08:00 Paolo Bonzini <pbonz...@redhat.com>: > 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