[coreboot-gerrit] New patch to review for coreboot: Avoid crashing on access to 0
Patrick Georgi (pgeorgi@google.com)
gerrit at coreboot.org
Mon Nov 2 10:21:38 CET 2015
Patrick Georgi (pgeorgi at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/12294
-gerrit
commit 23d76695537027249bd4458a86a50b3bdfa1cfe6
Author: Patrick Georgi <patrick at georgi-clan.de>
Date: Fri Oct 30 15:40:20 2015 +0100
Avoid crashing on access to 0
Some compilers add a crash (eg. ud2 on x86) when predictably accessing 0
(because it's undefined behaviour), so do the actual accesses in
assembler to shut up the language lawyerly compiler.
Change-Id: I6aa6f28283281ebae73d6349811e290bf1b99483
Signed-off-by: Patrick Georgi <patrick at georgi-clan.de>
---
src/arch/x86/include/arch/io.h | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/src/arch/x86/include/arch/io.h b/src/arch/x86/include/arch/io.h
index 5c85019..01533d5 100644
--- a/src/arch/x86/include/arch/io.h
+++ b/src/arch/x86/include/arch/io.h
@@ -145,32 +145,38 @@ static inline void insl(uint16_t port, void *addr, unsigned long count)
static inline __attribute__((always_inline)) uint8_t read8(const volatile void *addr)
{
- return *((volatile uint8_t *)(addr));
+ uint8_t res;
+ asm ("mov (%1), %0" : "=r" (res) : "r" (addr));
+ return res;
}
static inline __attribute__((always_inline)) uint16_t read16(const volatile void *addr)
{
- return *((volatile uint16_t *)(addr));
+ uint16_t res;
+ asm ("mov (%1), %0" : "=r" (res) : "r" (addr));
+ return res;
}
static inline __attribute__((always_inline)) uint32_t read32(const volatile void *addr)
{
- return *((volatile uint32_t *)(addr));
+ uint32_t res;
+ asm ("mov (%1), %0" : "=r" (res) : "r" (addr));
+ return res;
}
static inline __attribute__((always_inline)) void write8(volatile void *addr, uint8_t value)
{
- *((volatile uint8_t *)(addr)) = value;
+ asm ("mov %0, (%1)" :: "r" (value), "r" (addr) : "memory");
}
static inline __attribute__((always_inline)) void write16(volatile void *addr, uint16_t value)
{
- *((volatile uint16_t *)(addr)) = value;
+ asm ("mov %0, (%1)" :: "r" (value), "r" (addr) : "memory");
}
static inline __attribute__((always_inline)) void write32(volatile void *addr, uint32_t value)
{
- *((volatile uint32_t *)(addr)) = value;
+ asm ("mov %0, (%1)" :: "r" (value), "r" (addr) : "memory");
}
/* Conflicts with definition in lib.h */
More information about the coreboot-gerrit
mailing list