From ff8076d75ace8da247b927f7de37f3ed5081b55e Mon Sep 17 00:00:00 2001
From: Patrick Georgi <patrick@georgi-clan.de>
Date: Wed, 27 Jan 2016 08:18:16 +0100
Subject: Provide a gcc-safe zero pointer

zeroptr is a linker object pointing at 0 that can be used to thwart
GCC's (and other compilers') "dereferencing NULL is undefined"
optimization strategy when it gets in the way.

Change-Id: I6aa6f28283281ebae73d6349811e290bf1b99483
Signed-off-by: Patrick Georgi <patrick@georgi-clan.de>
Reviewed-on: https://review.coreboot.org/12294
Tested-by: Raptor Engineering Automated Test Stand <noreply@raptorengineeringinc.com>
Tested-by: build bot (Jenkins)
Reviewed-by: Martin Roth <martinroth@google.com>
---
 src/include/stddef.h | 8 ++++++++
 src/lib/program.ld   | 4 ++++
 2 files changed, 12 insertions(+)

(limited to 'src')

diff --git a/src/include/stddef.h b/src/include/stddef.h
index b58f645a3b..35326ed6c6 100644
--- a/src/include/stddef.h
+++ b/src/include/stddef.h
@@ -34,4 +34,12 @@ typedef unsigned int wint_t;
 #define MAYBE_STATIC static
 #endif
 
+#ifndef __ROMCC__
+/* Provide a pointer to address 0 that thwarts any "accessing this is
+ * undefined behaviour and do whatever" trickery in compilers.
+ * Use when you _really_ need to read32(zeroptr) (ie. read address 0).
+ */
+extern void *zeroptr;
+#endif
+
 #endif /* STDDEF_H */
diff --git a/src/lib/program.ld b/src/lib/program.ld
index 865b5f6aa7..9b8c7c9ec1 100644
--- a/src/lib/program.ld
+++ b/src/lib/program.ld
@@ -133,6 +133,10 @@ _eprogram = .;
 
 /* Discard the sections we don't need/want */
 
+.zeroptr 0 (NOLOAD) : {
+	zeroptr = .;
+}
+
 /DISCARD/ : {
 	*(.comment)
 	*(.comment.*)
-- 
cgit v1.2.3