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