Module Name: src
Committed By: nonaka
Date: Fri Dec 16 14:17:41 UTC 2011
Modified Files:
src/sys/arch/zaurus/stand/zbsdmod: zbsdmod.c
Log Message:
more clean D-cache.
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/zaurus/stand/zbsdmod/zbsdmod.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/zaurus/stand/zbsdmod/zbsdmod.c
diff -u src/sys/arch/zaurus/stand/zbsdmod/zbsdmod.c:1.7 src/sys/arch/zaurus/stand/zbsdmod/zbsdmod.c:1.8
--- src/sys/arch/zaurus/stand/zbsdmod/zbsdmod.c:1.7 Sun Dec 11 14:05:39 2011
+++ src/sys/arch/zaurus/stand/zbsdmod/zbsdmod.c Fri Dec 16 14:17:41 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: zbsdmod.c,v 1.7 2011/12/11 14:05:39 nonaka Exp $ */
+/* $NetBSD: zbsdmod.c,v 1.8 2011/12/16 14:17:41 nonaka Exp $ */
/* $OpenBSD: zbsdmod.c,v 1.7 2005/05/02 02:45:29 uwe Exp $ */
/*
@@ -94,6 +94,7 @@ static int havesyms;
/* The maximum size of a kernel image is restricted to 5MB. */
static u_int bsdimage[5242880/sizeof(u_int)]; /* XXX use kmalloc() */
static char bootargs[BOOTARGS_BUFSIZ];
+static u_int datacacheclean[65536/sizeof(u_int)] __attribute__((aligned(32)));
/*
* Boot the loaded BSD kernel image, or return if an error is found.
@@ -265,17 +266,31 @@ elf32bsdboot(void)
addr = (int *)(elf->e_entry);
__asm volatile (
+ /* Clean D-cache */
+ "mov r0, %1;"
+ "mov r1, #65536;"
+ "1:"
+ "ldr r2, [r0], #32;"
+ "subs r1, r1, #32;"
+ "bne 1b;"
+ "mcr p15, 0, r1, c7, c10, 4;" /*drain write and fill buffer*/
+ "mrc p15, 0, r1, c2, c0, 0;" /* CPWAIT */
+ "mov r1, r1;"
+ "sub pc, pc, #4;"
+ /* Disable MMU and jump to kernel entry address */
"mov r0, %0;"
- "mcr p15, 0, r1, c7, c7, 0;"
- "mrc p15, 0, r1, c2, c0, 0;"
+ "mcr p15, 0, r1, c7, c7, 0;" /* flush I+D cache */
+ "mrc p15, 0, r1, c2, c0, 0;" /* CPWAIT */
"mov r1, r1;"
"sub pc, pc, #4;"
"mov r1, #(0x00000010 | 0x00000020);"
- "mcr p15, 0, r1, c1, c0, 0;"
- "mcr p15, 0, r1, c8, c7, 0;"
- "mrc p15, 0, r1, c2, c0, 0;"
+ "mcr p15, 0, r1, c1, c0, 0;" /* Write new control register */
+ "mcr p15, 0, r1, c8, c7, 0;" /* invalidate I+D TLB */
+ "mcr p15, 0, r1, c7, c5, 0;" /* invalidate I$ and BTB */
+ "mcr p15, 0, r1, c7, c10, 4;" /*drain write and fill buffer*/
+ "mrc p15, 0, r1, c2, c0, 0;" /* CPWAIT_AND_RETURN */
"sub pc, r0, r1, lsr #32;"
- :: "r" (addr) : "r0", "r1");
+ :: "r" (addr), "r" (datacacheclean) : "r0", "r1", "r2");
}
/*
@@ -329,7 +344,7 @@ zbsdmod_write(struct file *f, const char
return 0;
if (*offp + len >= sizeof(bsdimage))
- return EFBIG;
+ return -EFBIG;
memcpy(((char *)bsdimage) + *offp, buf, len);