summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcognet <cognet@FreeBSD.org>2006-05-30 21:13:47 +0000
committercognet <cognet@FreeBSD.org>2006-05-30 21:13:47 +0000
commiteb54945e83112d3d390676773deb7254b2129471 (patch)
tree9ddf0fea5258908471f0e0d7e905160b0e693ee8
parenta19ad9c9f013ef73b93d1dff61685c7563948ab1 (diff)
downloadFreeBSD-src-eb54945e83112d3d390676773deb7254b2129471.zip
FreeBSD-src-eb54945e83112d3d390676773deb7254b2129471.tar.gz
To avoid problems, invalidate the data cache and disable the MMU once
we're done uncompressing the kernel.
-rw-r--r--sys/arm/arm/elf_trampoline.c34
-rw-r--r--sys/conf/Makefile.arm8
2 files changed, 38 insertions, 4 deletions
diff --git a/sys/arm/arm/elf_trampoline.c b/sys/arm/arm/elf_trampoline.c
index 2f6d7d7..e250a47 100644
--- a/sys/arm/arm/elf_trampoline.c
+++ b/sys/arm/arm/elf_trampoline.c
@@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$");
#include <sys/inflate.h>
#include <machine/elf.h>
#include <machine/pte.h>
+#include <machine/cpufunc.h>
#include <stdlib.h>
@@ -44,6 +45,24 @@ void __start(void);
#define GZ_HEAD 0xa
+#ifdef CPU_ARM7TDMI
+#define cpu_idcache_wbinv_all arm7tdmi_cache_flushID
+#elif defined(CPU_ARM8)
+#define cpu_idcache_wbinv_all arm8_cache_purgeID
+#elif defined(CPU_ARM9)
+#define cpu_idcache_wbinv_all arm9_dcache_wbinv_all
+#elif defined(CPU_ARM10)
+#define cpu_idcache_wbinv_all arm10_idcache_wbinv_all
+#elif defined(CPU_SA110) || defined(CPU_SA1110) || defined(CPU_SA1100) || \
+ defined(CPU_IXP12X0)
+#define cpu_idcache_wbinv_all sa1_cache_purgeID
+#elif defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
+ defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425)
+#define cpu_idcache_wbinv_all xscale_cache_purgeID
+#endif
+int arm_pdcache_line_size = 32;
+int block_userspace_access = 0;
+
static __inline void *
memcpy(void *dst, const void *src, int len)
{
@@ -160,7 +179,7 @@ putstr(char *dummy)
static int
input(void *dummy)
{
- if ((size_t)(i_input - orig_input) >= KERNSIZE) {
+ if ((size_t)(i_input - orig_input) >= KERNCOMPSIZE) {
return (GZ_EOF);
}
return *i_input++;
@@ -383,7 +402,7 @@ void
__start(void)
{
void *curaddr;
- void *dst;
+ void *dst, *altdst;
char *kernel = (char *)&kernel_start;
__asm __volatile("mov %0, pc" :
@@ -393,11 +412,22 @@ __start(void)
if (*kernel == 0x1f && kernel[1] == 0x8b) {
int pt_addr = (((int)&_end + KERNSIZE + 0x100) &
~(L1_TABLE_SIZE - 1)) + L1_TABLE_SIZE;
+
setup_pagetables(pt_addr, (vm_paddr_t)curaddr,
(vm_paddr_t)curaddr + 0x10000000);
/* Gzipped kernel */
dst = inflate_kernel(kernel, &_end);
kernel = (char *)&_end;
+ altdst = 4 + load_kernel((unsigned int)kernel,
+ (unsigned int)curaddr,
+ (unsigned int)&func_end , 0);
+ if (altdst > dst)
+ dst = altdst;
+ cpu_idcache_wbinv_all();
+ __asm __volatile("mrc p15, 0, %0, c1, c0, 0\n"
+ "bic %0, %0, #1\n" /* MMU_ENABLE */
+ "mcr p15, 0, %0, c1, c0, 0\n"
+ : "=r" (pt_addr));
} else
#endif
dst = 4 + load_kernel((unsigned int)&kernel_start,
diff --git a/sys/conf/Makefile.arm b/sys/conf/Makefile.arm
index 73d0e55..9a8ea46 100644
--- a/sys/conf/Makefile.arm
+++ b/sys/conf/Makefile.arm
@@ -59,6 +59,10 @@ SYSTEM_LD_TAIL +=;sed s/" + SIZEOF_HEADERS"// ldscript.$M\
${KERNEL_KO}.bin; \
rm ${FULLKERNEL}.noheader
+FILES_CPU_FUNC = $S/$M/$M/cpufunc_asm_arm7tdmi.S \
+ $S/$M/$M/cpufunc_asm_arm8.S $S/$M/$M/cpufunc_asm_arm9.S \
+ $S/$M/$M/cpufunc_asm_sa1.S $S/$M/$M/cpufunc_asm_arm10.S \
+ $S/$M/$M/cpufunc_asm_xscale.S
trampoline: ${KERNEL_KO}.tramp
${KERNEL_KO}.tramp: ${KERNEL_KO}
echo "#define KERNNAME \"${KERNEL_KO}.tmp\"" >opt_kernname.h
@@ -85,10 +89,10 @@ ${KERNEL_KO}.tramp: ${KERNEL_KO}
${CC} -O2 -DKZIP -I. -c $S/kern/inflate.c -o inflate-tramp.o
${CC} -O -nostdlib -I. -Xlinker -T -Xlinker ldscript.$M.tramp \
-DKZIP $S/$M/$M/elf_trampoline.c inflate-tramp.o $S/$M/$M/inckern.S \
- -o ${KERNEL_KO}.gz.tramp
+ ${FILES_CPU_FUNC} -o ${KERNEL_KO}.gz.tramp
${CC} -O -nostdlib -I. -Xlinker -T -Xlinker ldscript.$M.tramp.noheader \
-DKZIP $S/$M/$M/elf_trampoline.c inflate-tramp.o $S/$M/$M/inckern.S \
- -o ${KERNEL_KO}.tramp.noheader
+ ${FILES_CPU_FUNC} -o ${KERNEL_KO}.tramp.noheader
${OBJCOPY} -S -O binary ${KERNEL_KO}.tramp.noheader \
${KERNEL_KO}.gz.tramp.bin
rm ${KERNEL_KO}.tmp.gz ${KERNEL_KO}.tramp.noheader opt_kernname.h \
OpenPOWER on IntegriCloud