Index: sys/dev/acpica/Osd/OsdMemory.c =================================================================== --- sys/dev/acpica/Osd/OsdMemory.c (revision 243380) +++ sys/dev/acpica/Osd/OsdMemory.c (working copy) @@ -40,6 +40,45 @@ __FBSDID("$FreeBSD$"); #include #include +#if defined(__amd64__) || defined(__i386__) +#define READ8(p, v) \ + __asm __volatile("movzbl %1, %%eax" : "=a" (v) : "m" (*(uint8_t *)(p))) +#define READ16(p, v) \ + __asm __volatile("movzwl %1, %%eax" : "=a" (v) : "m" (*(uint16_t *)(p))) +#define READ32(p, v) \ + __asm __volatile("movl %1, %%eax" : "=a" (v) : "m" (*(uint32_t *)(p))) +#define READ64(p, v) do { \ + uint32_t l, u; \ + \ + READ32(p, l); \ + READ32((uint32_t *)(p) + 1, u); \ + v = (uint64_t)l | ((uint64_t)u << 32); \ +} while (0) +#define WRITE8(p, v) \ + __asm __volatile("movb %%al, %0" : "=m" (*(uint8_t *)(p)) : "a" (v)) +#define WRITE16(p, v) \ + __asm __volatile("movw %%ax, %0" : "=m" (*(uint16_t *)(p)) : "a" (v)) +#define WRITE32(p, v) \ + __asm __volatile("movl %%eax, %0" : "=m" (*(uint32_t *)(p)) : "a" (v)) +#define WRITE64(p, v) do { \ + uint32_t l, u; \ + \ + l = (v) & 0xffffffff; \ + u = ((v) >> 32) & 0xffffffff; \ + WRITE32(p, l); \ + WRITE32((uint32_t *)(p) + 1, u); \ +} while (0) +#else +#define READ8(p, v) do { v = *(volatile uint8_t *)(p); } while (0) +#define READ16(p, v) do { v = *(volatile uint16_t *)(p); } while (0) +#define READ32(p, v) do { v = *(volatile uint32_t *)(p); } while (0) +#define READ64(p, v) do { v = *(volatile uint64_t *)(p); } while (0) +#define WRITE8(p, v) do { *(volatile uint8_t *)(p) = v; } while (0) +#define WRITE16(p, v) do { *(volatile uint16_t *)(p) = v; } while (0) +#define WRITE32(p, v) do { *(volatile uint32_t *)(p) = v; } while (0) +#define WRITE64(p, v) do { *(volatile uint64_t *)(p) = v; } while (0) +#endif + static MALLOC_DEFINE(M_ACPICA, "acpica", "ACPI CA memory pool"); void * @@ -97,16 +136,16 @@ AcpiOsReadMemory(ACPI_PHYSICAL_ADDRESS Address, UI switch (Width) { case 8: - *Value = *(volatile uint8_t *)LogicalAddress; + READ8(LogicalAddress, *Value); break; case 16: - *Value = *(volatile uint16_t *)LogicalAddress; + READ16(LogicalAddress, *Value); break; case 32: - *Value = *(volatile uint32_t *)LogicalAddress; + READ32(LogicalAddress, *Value); break; case 64: - *Value = *(volatile uint64_t *)LogicalAddress; + READ64(LogicalAddress, *Value); break; } @@ -126,16 +165,16 @@ AcpiOsWriteMemory(ACPI_PHYSICAL_ADDRESS Address, U switch (Width) { case 8: - *(volatile uint8_t *)LogicalAddress = Value; + WRITE8(LogicalAddress, Value); break; case 16: - *(volatile uint16_t *)LogicalAddress = Value; + WRITE16(LogicalAddress, Value); break; case 32: - *(volatile uint32_t *)LogicalAddress = Value; + WRITE32(LogicalAddress, Value); break; case 64: - *(volatile uint64_t *)LogicalAddress = Value; + WRITE64(LogicalAddress, Value); break; }