Commit e918ee04e96dd2d8809cf9d78c14a4d900001211

Authored by ths
1 parent afcc3cdf

Big endian byte swap for serial mmapped interface.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2946 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 18 additions and 4 deletions
hw/serial.c
... ... @@ -384,30 +384,44 @@ void serial_mm_writeb (void *opaque,
384 384 uint32_t serial_mm_readw (void *opaque, target_phys_addr_t addr)
385 385 {
386 386 SerialState *s = opaque;
  387 + uint32_t val;
387 388  
388   - return serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFFFF;
  389 + val = serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFFFF;
  390 +#ifdef TARGET_WORDS_BIGENDIAN
  391 + val = bswap16(val);
  392 +#endif
  393 + return val;
389 394 }
390 395  
391 396 void serial_mm_writew (void *opaque,
392 397 target_phys_addr_t addr, uint32_t value)
393 398 {
394 399 SerialState *s = opaque;
395   -
  400 +#ifdef TARGET_WORDS_BIGENDIAN
  401 + value = bswap16(value);
  402 +#endif
396 403 serial_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFFFF);
397 404 }
398 405  
399 406 uint32_t serial_mm_readl (void *opaque, target_phys_addr_t addr)
400 407 {
401 408 SerialState *s = opaque;
  409 + uint32_t val;
402 410  
403   - return serial_ioport_read(s, (addr - s->base) >> s->it_shift);
  411 + val = serial_ioport_read(s, (addr - s->base) >> s->it_shift);
  412 +#ifdef TARGET_WORDS_BIGENDIAN
  413 + val = bswap32(val);
  414 +#endif
  415 + return val;
404 416 }
405 417  
406 418 void serial_mm_writel (void *opaque,
407 419 target_phys_addr_t addr, uint32_t value)
408 420 {
409 421 SerialState *s = opaque;
410   -
  422 +#ifdef TARGET_WORDS_BIGENDIAN
  423 + value = bswap32(value);
  424 +#endif
411 425 serial_ioport_write(s, (addr - s->base) >> s->it_shift, value);
412 426 }
413 427  
... ...