Fixed some problems with libnvram

- On board-qemu, the logging partitions were too big (bigger than the total
  NVRAM size).
- Fixed a compiler warning about type-punned pointers in nvram.c
- When DISABLE_NVRAM is set, the fake buffer should not be accessed with
  cache-inhibited functions
- Makefile did not generate proper dependencies

Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
diff --git a/board-qemu/include/nvramlog.h b/board-qemu/include/nvramlog.h
index fef7661..d130255 100644
--- a/board-qemu/include/nvramlog.h
+++ b/board-qemu/include/nvramlog.h
@@ -39,14 +39,14 @@
 	#define LLFW_LOG_BE0_SIGNATURE		0x51			// signature for general firmware usage
 	#define LLFW_LOG_BE0_NAME_PREFIX	0x69626D2C		// first 4 bytes of name: "ibm,"
 	#define LLFW_LOG_BE0_NAME		0x435055306C6F6700	// remaining 8 bytes	: "CPU0log\0"
-	#define LLFW_LOG_BE0_LENGTH		0x2000			// Partition length in block of 16 bytes
+	#define LLFW_LOG_BE0_LENGTH		0x200			// Partition length in block of 16 bytes
 	#define LLFW_LOG_BE0_DATA_OFFSET	0x40			// offset in bytes between header and data
 	#define LLFW_LOG_BE0_FLAGS		0			// unused
 
 	#define LLFW_LOG_BE1_SIGNATURE		0x51			// signature for general firmware usage
 	#define LLFW_LOG_BE1_NAME_PREFIX	0x69626D2C		// first 4 bytes of name: "ibm,"
 	#define LLFW_LOG_BE1_NAME		0x435055316C6F6700	// remaining 8 bytes	: "CPU1log\0\0"
-	#define LLFW_LOG_BE1_LENGTH		0x500			// Partition length in block of 16 bytes
+	#define LLFW_LOG_BE1_LENGTH		0x80			// Partition length in block of 16 bytes
 	#define LLFW_LOG_BE1_DATA_OFFSET	0x40			// offset in bytes between header and data
 	#define LLFW_LOG_BE1_FLAGS		0x0			// unused
 
@@ -59,7 +59,6 @@
 	#define LLFW_LOG_POS_POINTER	0x14			// 20
 
 	// NVRAM info
-	#define MAMBO_NVRAM_BASE	0x100000		// NVRAM Base for MAMBO
 	#define NVRAM_EMPTY_PATTERN	0x0000000000000000	// Pattern (64-bit) used to overwrite NVRAM
 
 #endif
diff --git a/lib/libnvram/Makefile b/lib/libnvram/Makefile
index afd536f..d4e9a61 100644
--- a/lib/libnvram/Makefile
+++ b/lib/libnvram/Makefile
@@ -14,6 +14,8 @@
 
 TOPCMNDIR ?= ../..
 
+include $(TOPCMNDIR)/make.rules
+
 ASFLAGS = $(FLAG) $(RELEASE) $(CPUARCHDEF) -Wa,-mregnames
 CPPFLAGS = -I../libc/include $(CPUARCHDEF) $(FLAG) \
 	   -I$(INCLBRDDIR) -I$(INCLCMNDIR)/$(CPUARCH) -I. -I../../include
@@ -43,7 +45,8 @@
 	$(MAKE) Makefile.dep
 
 Makefile.dep: Makefile
-	
+	$(CC) -MM $(CPPFLAGS) $(CFLAGS) $(SRCS) > Makefile.dep
+
 
 # Include dependency file if available:
 -include Makefile.dep
diff --git a/lib/libnvram/nvram.c b/lib/libnvram/nvram.c
index e9500ec..7ec12d2 100644
--- a/lib/libnvram/nvram.c
+++ b/lib/libnvram/nvram.c
@@ -30,22 +30,30 @@
 void asm_cout(long Character,long UART,long NVRAM);
 
 #if defined(DISABLE_NVRAM)
+
 static volatile uint8_t nvram[NVRAM_LENGTH]; /* FAKE */
-#else
+
+#define nvram_access(type,size,name) 				\
+	type nvram_read_##name(unsigned int offset)		\
+	{							\
+		type *pos;					\
+		if (offset > (NVRAM_LENGTH - sizeof(type)))	\
+			return 0;				\
+		pos = (type *)(nvram+offset);			\
+		return *pos;					\
+	}							\
+	void nvram_write_##name(unsigned int offset, type data)	\
+	{							\
+		type *pos;					\
+		if (offset > (NVRAM_LENGTH - sizeof(type)))	\
+			return;					\
+		pos = (type *)(nvram+offset);			\
+		*pos = data;					\
+	}
+
+#else	/* DISABLE_NVRAM */
+
 static volatile uint8_t *nvram = (volatile uint8_t *)SB_NVRAM_adr;
-#endif
-
-/* This is extremely ugly, but still better than implementing 
- * another sbrk() around it.
- */
-static char nvram_buffer[NVRAM_LENGTH];
-static uint8_t nvram_buffer_locked=0x00;
-
-/**
- * producer for nvram access functions. Since these functions are
- * basically all the same except for the used data types, produce 
- * them via the following macro to keep the code from bloating.
- */
 
 #define nvram_access(type,size,name) 				\
 	type nvram_read_##name(unsigned int offset)		\
@@ -65,11 +73,26 @@
 		ci_write_##size(pos, data);			\
 	}
 
+#endif
+
+/*
+ * producer for nvram access functions. Since these functions are
+ * basically all the same except for the used data types, produce 
+ * them via the nvram_access macro to keep the code from bloating.
+ */
+
 nvram_access(uint8_t,   8, byte)
 nvram_access(uint16_t, 16, word)
 nvram_access(uint32_t, 32, dword)
 nvram_access(uint64_t, 64, qword)
 
+/*
+ * This is extremely ugly, but still better than implementing 
+ * another sbrk() around it.
+ */
+static char nvram_buffer[NVRAM_LENGTH];
+static uint8_t nvram_buffer_locked=0x00;
+
 /**
  * This function is a minimal abstraction for our temporary
  * buffer. It should have been malloced, but since there is no
@@ -111,11 +134,11 @@
 	char buff[256];
 	int count, i;
 	va_list ap;
-    
+
 	va_start(ap, fmt);
 	count = vsprintf(buff, fmt, ap);
 	va_end(ap);
- 
+
 	for (i=0; i<count; i++)
 		asm_cout(buff[i], 0, 1);
 
@@ -189,7 +212,8 @@
 	int walk, len;
 
 	for (walk=0; walk<NVRAM_LENGTH;) {
-		if(get_partition_header_checksum(walk) != 
+		if(nvram_read_byte(walk) == 0 
+		   || get_partition_header_checksum(walk) != 
 				calc_partition_header_checksum(walk)) {
 			/* If there's no valid entry, bail out */
 			break;
@@ -234,7 +258,9 @@
 {
 	partition_t ret={0,-1};
 	int walk, len;
-	
+
+	DEBUG("get_partition(%i, '%s')\n", type, name);
+
 	for (walk=0; walk<NVRAM_LENGTH;) {
 		// DEBUG("get_partition: walk=%x\n", walk);
 		if(get_partition_header_checksum(walk) != 
@@ -492,20 +518,23 @@
 void reset_nvram(void)
 {
 	partition_t cpulog0, cpulog1;
-	char header[12];
+	struct {
+		uint32_t prefix;
+		uint64_t name;
+	} __attribute__((packed)) header;
 
 	DEBUG("Erasing NVRAM\n");
 	erase_nvram(0, NVRAM_LENGTH);
 
 	DEBUG("Creating CPU log partitions\n");
-	*(uint32_t *)(char *)&(header[0]) = be32_to_cpu(LLFW_LOG_BE0_NAME_PREFIX);
-	*(uint64_t *)(char *)&(header[4]) = be64_to_cpu(LLFW_LOG_BE0_NAME);
-	cpulog0=create_nvram_partition(LLFW_LOG_BE0_SIGNATURE, header, 
+	header.prefix = be32_to_cpu(LLFW_LOG_BE0_NAME_PREFIX);
+	header.name   = be64_to_cpu(LLFW_LOG_BE0_NAME);
+	cpulog0=create_nvram_partition(LLFW_LOG_BE0_SIGNATURE, (char *)&header, 
 			(LLFW_LOG_BE0_LENGTH*16)-PARTITION_HEADER_SIZE);
 
-	*(uint32_t *)(char *)&(header[0]) = be32_to_cpu(LLFW_LOG_BE1_NAME_PREFIX);
-	*(uint64_t *)(char *)&(header[4]) = be64_to_cpu(LLFW_LOG_BE1_NAME);
-	cpulog1=create_nvram_partition(LLFW_LOG_BE1_SIGNATURE, header, 
+	header.prefix = be32_to_cpu(LLFW_LOG_BE1_NAME_PREFIX);
+	header.name   = be64_to_cpu(LLFW_LOG_BE1_NAME);
+	cpulog1=create_nvram_partition(LLFW_LOG_BE1_SIGNATURE, (char *)&header, 
 			(LLFW_LOG_BE1_LENGTH*16)-PARTITION_HEADER_SIZE);
 
 	DEBUG("Initializing CPU log partitions\n");