From: guiming zhuo <gmzhuo@gbsoft.localdomain>
Subject: [PATCH] local/debug

for local debug
Signed-off-by: guiming zhuo <gmzhuo@gbsoft.localdomain>

---
 Makefile                      |    3 +-
 arch/arm/mach-pxa/ezx.c       |    2 +-
 arch/arm/mm/init.c            |    9 ++++++++
 drivers/char/ezx-bp.c         |    2 +-
 drivers/char/ts0710_mux.c     |    4 +-
 drivers/char/ts0710_mux_usb.c |    1 +
 drivers/misc/Kconfig          |    4 +++
 drivers/misc/Makefile         |    2 +
 drivers/misc/memdebug.c       |   45 +++++++++++++++++++++++++++++++++++++++++
 include/linux/memdebug.h      |    8 +++++++
 kernel/printk.c               |    6 ++++-
 11 files changed, 80 insertions(+), 6 deletions(-)

diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index 80fd3b6..4ab0c81 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -24,6 +24,7 @@
 
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
+#include <linux/memdebug.h>
 
 #include "mm.h"
 
@@ -268,6 +269,14 @@ static unsigned long __init bootmem_init_node(int node, struct meminfo *mi)
 	 */
 	reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT,
 			     boot_pages << PAGE_SHIFT, BOOTMEM_DEFAULT);
+#ifdef CONFIG_MEMDEBUG
+	/* reserve memory memory for  sleep and user off */
+	reserve_bootmem_node(pgdat, 0xac000000, 1024*1024*16, BOOTMEM_DEFAULT);
+	mdbg.startAddr = phys_to_virt(0xac000000);
+	mdbg.cur = mdbg.startAddr;
+	unsigned int *len = &mdbg.totalSize;
+	*len = 1024*1024*16;
+#endif
 
 	return end_pfn;
 }
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index bc11998..de4072f 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -19,4 +19,6 @@ obj-$(CONFIG_SGI_XP)		+= sgi-xp/
 obj-$(CONFIG_SGI_GRU)		+= sgi-gru/
 obj-$(CONFIG_HP_ILO)		+= hpilo.o
 obj-$(CONFIG_C2PORT)		+= c2port/
+obj-$(CONFIG_MEMDEBUG)		+= memdebug.o
 obj-y				+= eeprom/
+
diff --git a/drivers/misc/memdebug.c b/drivers/misc/memdebug.c
new file mode 100644
index 0000000..d550e7c
--- /dev/null
+++ b/drivers/misc/memdebug.c
@@ -0,0 +1,45 @@
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/ioport.h>
+#include <linux/platform_device.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/dma-mapping.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/mmc/host.h>
+#include <linux/io.h>
+#include <asm/sizes.h>
+
+#include <linux/memdebug.h>
+
+struct mem_debug_info mdbg = {
+	.cur = 0,
+	.startAddr = 0,
+	.totalSize = 0,
+};
+
+void memdebug(const char *fmt, ...)
+{
+	unsigned leng = mdbg.totalSize - (mdbg.cur - mdbg.startAddr);
+	int curlen;
+	va_list ap;
+	if (mdbg.startAddr == 0)
+		return;
+	va_start(ap, fmt);
+	curlen = vsnprintf(mdbg.cur, leng, fmt, ap);
+	if(curlen > 0)
+		mdbg.cur += curlen;
+	va_end(ap);
+}
+void vmemdebug(const char *fmt, va_list ap)
+{
+	unsigned leng = mdbg.totalSize - (mdbg.cur - mdbg.startAddr);
+	int curlen;
+	if (mdbg.startAddr == 0)
+		return;
+	curlen = vsnprintf(mdbg.cur, leng, fmt, ap);
+	if(curlen > 0)
+		mdbg.cur += curlen;
+}
+
diff --git a/include/linux/memdebug.h b/include/linux/memdebug.h
new file mode 100644
index 0000000..76f1196
--- /dev/null
+++ b/include/linux/memdebug.h
@@ -0,0 +1,8 @@
+struct mem_debug_info{
+    char const* startAddr;
+    const unsigned int totalSize;
+    char *cur;
+};
+extern struct mem_debug_info mdbg;
+void memdebug(const char *fmt, ...);
+void vmemdebug(const char *fmt, va_list ap);
diff --git a/kernel/printk.c b/kernel/printk.c
index e3602d0..0a5b4b7 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -34,7 +34,7 @@
 #include <linux/syscalls.h>
 
 #include <asm/uaccess.h>
-
+#include <linux/memdebug.h>
 /*
  * Architectures can override it:
  */
@@ -562,6 +562,10 @@ asmlinkage int printk(const char *fmt, ...)
 	va_start(args, fmt);
 	r = vprintk(fmt, args);
 	va_end(args);
+	
+	va_start(args, fmt);
+	vmemdebug(fmt, args);
+	va_end(args);
 
 	return r;
 }
-- 
tg: (bc2b6d4..) local/debug (depends on: ezx/current)

