* grub-core/bus/usb/ehci.c (grub_ehci_ehcc_read32): Restructure to

conserve alignment invariants.
	(grub_ehci_ehcc_read16): Likewise.
	(grub_ehci_oper_read32): Likewise.
	(grub_ehci_oper_write32): Likewise.
	(grub_ehci_pci_iter) [!GRUB_HAVE_UNALIGNED_ACCESS]: Check alignment.
	Conserve alignment invariants.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2012-02-09 23:18:53 +01:00
parent ccc3b1b898
commit a9cdb3cf18
2 changed files with 28 additions and 10 deletions

View file

@ -1,3 +1,13 @@
2012-02-09 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/bus/usb/ehci.c (grub_ehci_ehcc_read32): Restructure to
conserve alignment invariants.
(grub_ehci_ehcc_read16): Likewise.
(grub_ehci_oper_read32): Likewise.
(grub_ehci_oper_write32): Likewise.
(grub_ehci_pci_iter) [!GRUB_HAVE_UNALIGNED_ACCESS]: Check alignment.
Conserve alignment invariants.
2012-02-09 Vladimir Serbinenko <phcoder@gmail.com> 2012-02-09 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/kern/emu/full.c (grub_emu_post_init): Remove raid reinit. * grub-core/kern/emu/full.c (grub_emu_post_init): Remove raid reinit.

View file

@ -337,24 +337,22 @@ static inline grub_uint32_t
grub_ehci_ehcc_read32 (struct grub_ehci *e, grub_uint32_t addr) grub_ehci_ehcc_read32 (struct grub_ehci *e, grub_uint32_t addr)
{ {
return return
grub_le_to_cpu32 (* grub_le_to_cpu32 (*((volatile grub_uint32_t *) e->iobase_ehcc +
((volatile grub_uint32_t *) ((char *) e->iobase_ehcc + (addr / sizeof (grub_uint32_t))));
addr)));
} }
static inline grub_uint16_t static inline grub_uint16_t
grub_ehci_ehcc_read16 (struct grub_ehci *e, grub_uint32_t addr) grub_ehci_ehcc_read16 (struct grub_ehci *e, grub_uint32_t addr)
{ {
return return
grub_le_to_cpu16 (* grub_le_to_cpu16 (*((volatile grub_uint16_t *) e->iobase_ehcc +
((volatile grub_uint16_t *) ((char *) e->iobase_ehcc + (addr / sizeof (grub_uint16_t))));
addr)));
} }
static inline grub_uint8_t static inline grub_uint8_t
grub_ehci_ehcc_read8 (struct grub_ehci *e, grub_uint32_t addr) grub_ehci_ehcc_read8 (struct grub_ehci *e, grub_uint32_t addr)
{ {
return *((volatile grub_uint8_t *) ((char *) e->iobase_ehcc + addr)); return *((volatile grub_uint8_t *) e->iobase_ehcc + addr);
} }
/* Operational registers access functions */ /* Operational registers access functions */
@ -363,15 +361,15 @@ grub_ehci_oper_read32 (struct grub_ehci *e, grub_uint32_t addr)
{ {
return return
grub_le_to_cpu32 (* grub_le_to_cpu32 (*
((volatile grub_uint32_t *) ((char *) e->iobase + ((volatile grub_uint32_t *) e->iobase +
addr))); (addr / sizeof (grub_uint32_t))));
} }
static inline void static inline void
grub_ehci_oper_write32 (struct grub_ehci *e, grub_uint32_t addr, grub_ehci_oper_write32 (struct grub_ehci *e, grub_uint32_t addr,
grub_uint32_t value) grub_uint32_t value)
{ {
*((volatile grub_uint32_t *) ((char *) e->iobase + addr)) = *((volatile grub_uint32_t *) e->iobase + (addr / sizeof (grub_uint32_t))) =
grub_cpu_to_le32 (value); grub_cpu_to_le32 (value);
} }
@ -559,8 +557,18 @@ grub_ehci_pci_iter (grub_pci_device_t dev,
/* Determine base address of EHCI operational registers */ /* Determine base address of EHCI operational registers */
caplen = grub_ehci_ehcc_read8 (e, GRUB_EHCI_EHCC_CAPLEN); caplen = grub_ehci_ehcc_read8 (e, GRUB_EHCI_EHCC_CAPLEN);
#ifndef GRUB_HAVE_UNALIGNED_ACCESS
if (caplen & (sizeof (grub_uint32_t) - 1))
{
grub_dprintf ("ehci", "Unaligned caplen\n");
return 0;
}
e->iobase = ((volatile grub_uint32_t *) e->iobase_ehcc
+ (caplen / sizeof (grub_uint32_t)));
#else
e->iobase = (volatile grub_uint32_t *) e->iobase = (volatile grub_uint32_t *)
((grub_uint8_t *) e->iobase_ehcc + caplen); ((grub_uint8_t *) e->iobase_ehcc + caplen);
#endif
grub_dprintf ("ehci", grub_dprintf ("ehci",
"EHCI grub_ehci_pci_iter: iobase of oper. regs: %08x\n", "EHCI grub_ehci_pci_iter: iobase of oper. regs: %08x\n",