Mickael Sergent wrote:
> Hello,
>
> I'm trying to port uclinux 2.6.x on dev. board based on ARM946-E-S. (I
> use uClinux-dist 20070130)
>
> I would like to have kernel and ROMfs entirely in RAM but it seems to
> be impossible on ARM architecture.
>
> On uclinux 2.4 version a switch (CONFIG_RAM_ATTACHED_ROMFS) can be
> used to do this.
>
> Does an equivalent exist in 2.6 version ?
>
>
> I tried to use CONFIG_MTD_UCLINUX_EBSS (after having defined _ebss
> symbol in the end of kernel) but it doesn't solve problem (because RAM
> where is stored ROMfs is used by uclinux), so a patch is needed to
> reserve ROMfs memory
>
> Do you know another solution to put ROMfs at the end of kernel ?
>
> Thanks a lot !
>
> Best regards,
>
> Mickael.
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> uClinux-dev mailing list
> uClinux-dev@uclinux.org
> http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
> This message was resent by uclinux-dev@uclinux.org
> To unsubscribe see:
> http://mailman.uclinux.org/mailman/options/uclinux-dev
Hi Mickael,

We use a ram based rom filesystem on our ARM products (including ones
using an arm946).  I've attached a small patch of the changes I made to
get this to work.  Note that we use little-endian exclusively so if you
are using big-endian you will need to change the code slightly. 

Thanks,
Lance
diff -Naur uClinux-dist.orig/linux-2.6.x/arch/arm/kernel/head-common.S uClinux-dist/linux-2.6.x/arch/arm/kernel/head-common.S
--- uClinux-dist.orig/linux-2.6.x/arch/arm/kernel/head-common.S	2006-06-28 01:22:16.000000000 -0600
+++ uClinux-dist/linux-2.6.x/arch/arm/kernel/head-common.S	2007-04-18 17:57:48.000000000 -0600
@@ -10,7 +10,6 @@
  * published by the Free Software Foundation.
  *
  */
-
 	.type	__switch_data, %object
 __switch_data:
 	.long	__mmap_switched
@@ -41,7 +40,6 @@
 	ldrne	fp, [r4], #4
 	strne	fp, [r5], #4
 	bne	1b
-
 	mov	fp, #0				@ Clear BSS (and zero fp)
 1:	cmp	r6, r7
 	strcc	fp, [r6],#4
@@ -215,3 +213,41 @@
 	bl	__lookup_machine_type
 	mov	r0, r5
 	ldmfd	sp!, {r4 - r6, pc}
+
+#ifdef CONFIG_MTD_UCLINUX
+	.type	__relocate_romfs, %function
+__relocate_romfs:
+   adr r4, romfsinfo
+	ldmia	r4!, {r6, r7}
+   bic r6, r6, #0xc0000000
+   bic r7, r7, #0xc0000000
+   
+   /* move the ram based rom filesystem to its correct final location...      */
+   /* the value is stored big-endian                                          */
+   mov fp, #0
+   add r4,r6,#8
+   ldrb r4,[r4]
+   orr fp, fp, r4, LSL #24
+   add r4,r6,#9
+   ldrb r4,[r4]
+   orr fp, fp, r4, LSL #16
+   add r4,r6,#10
+   ldrb r4,[r4]
+   orr fp, fp, r4, LSL #8
+   add r4,r6,#11
+   ldrb r4,[r4]
+   orr fp, fp, r4, LSL #0
+   add r4, r6, fp
+   add fp, r7, fp
+   sub r6, r6, #4
+1: ldr r5, [r4]
+   str r5, [fp]
+   sub r4, r4, #4
+   sub fp, fp, #4
+   cmp r4, r6
+   bne 1b
+   mov pc, lr
+romfsinfo:
+	.long	__bss_start			@ r6
+	.long	_end				@ r7
+#endif
diff -Naur uClinux-dist.orig/linux-2.6.x/arch/arm/kernel/head-nommu.S uClinux-dist/linux-2.6.x/arch/arm/kernel/head-nommu.S
--- uClinux-dist.orig/linux-2.6.x/arch/arm/kernel/head-nommu.S	2007-01-29 18:55:08.000000000 -0700
+++ uClinux-dist/linux-2.6.x/arch/arm/kernel/head-nommu.S	2007-04-19 08:25:58.000000000 -0600
@@ -16,7 +16,6 @@
 
 #include <asm/assembler.h>
 #include <asm/mach-types.h>
-#include <asm/procinfo.h>
 #include <asm/ptrace.h>
 #include <asm/asm-offsets.h>
 #include <asm/thread_info.h>
@@ -41,6 +40,9 @@
 	ldr	r1, =machine_arch_type		@ find the machine type
 	msr	cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
 						@ and irqs disabled
+#ifdef CONFIG_MTD_UCLINUX
+	bl __relocate_romfs
+#endif   
 #ifndef CONFIG_CPU_CP15
 	ldr	r9, =CONFIG_PROCESSOR_ID
 #else
diff -Naur uClinux-dist.orig/linux-2.6.x/arch/arm/kernel/head.S uClinux-dist/linux-2.6.x/arch/arm/kernel/head.S
--- uClinux-dist.orig/linux-2.6.x/arch/arm/kernel/head.S	2006-11-29 19:03:00.000000000 -0700
+++ uClinux-dist/linux-2.6.x/arch/arm/kernel/head.S	2007-04-19 08:27:23.000000000 -0600
@@ -16,7 +16,6 @@
 
 #include <asm/assembler.h>
 #include <asm/domain.h>
-#include <asm/procinfo.h>
 #include <asm/ptrace.h>
 #include <asm/asm-offsets.h>
 #include <asm/memory.h>
@@ -73,6 +72,9 @@
 	msr	cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
 						@ and irqs disabled
 	mrc	p15, 0, r9, c0, c0		@ get processor id
+#ifdef CONFIG_MTD_UCLINUX
+	bl __relocate_romfs
+#endif   
 	bl	__lookup_processor_type		@ r5=procinfo r9=cpuid
 	movs	r10, r5				@ invalid processor (r5=0)?
 	beq	__error_p			@ yes, error 'p'
diff -Naur uClinux-dist.orig/linux-2.6.x/arch/arm/mm/init.c uClinux-dist/linux-2.6.x/arch/arm/mm/init.c
--- uClinux-dist.orig/linux-2.6.x/arch/arm/mm/init.c	2006-11-29 19:03:01.000000000 -0700
+++ uClinux-dist/linux-2.6.x/arch/arm/mm/init.c	2007-04-19 08:28:11.000000000 -0600
@@ -99,6 +99,23 @@
 	unsigned int start_pfn, bank, bootmap_pfn;
 
 	start_pfn   = PAGE_ALIGN(__pa(&_end)) >> PAGE_SHIFT;
+#ifdef CONFIG_MTD_UCLINUX
+   {
+      /* If using a romfs in ram, move the bitmap                             */
+      extern char _ebss;
+      unsigned char *p;
+      unsigned romfslen;
+      unsigned ressiz;
+      p=(unsigned char *)&_ebss;
+      romfslen=p[8];
+      romfslen=(romfslen<<8)+p[9];
+      romfslen=(romfslen<<8)+p[10];
+      romfslen=(romfslen<<8)+p[11];
+      ressiz=((unsigned)p+romfslen);
+      start_pfn=PAGE_ALIGN(__pa(ressiz)) >> PAGE_SHIFT;
+   }
+   
+#endif
 	bootmap_pfn = 0;
 
 	for_each_nodebank(bank, mi, node) {
diff -Naur uClinux-dist.orig/linux-2.6.x/arch/arm/mm/mmu.c uClinux-dist/linux-2.6.x/arch/arm/mm/mmu.c
--- uClinux-dist.orig/linux-2.6.x/arch/arm/mm/mmu.c	2006-11-29 16:28:08.000000000 -0700
+++ uClinux-dist/linux-2.6.x/arch/arm/mm/mmu.c	2007-04-19 08:33:23.000000000 -0600
@@ -601,6 +601,24 @@
 	reserve_bootmem_node(pgdat, __pa(swapper_pg_dir),
 			     PTRS_PER_PGD * sizeof(pgd_t));
 
+#ifdef CONFIG_MTD_UCLINUX
+   {
+      /* If using a romfs in ram reserve this memory...                       */
+      extern char _ebss;
+      unsigned char *p;
+      unsigned romfslen;
+      unsigned ressiz;
+      p=(unsigned char *)&_ebss;
+      romfslen=p[8];
+      romfslen=(romfslen<<8)+p[9];
+      romfslen=(romfslen<<8)+p[10];
+      romfslen=(romfslen<<8)+p[11];
+      ressiz=((unsigned)p+romfslen);
+      ressiz=((ressiz+4095)&0xfffff000); /* align on page boundary            */
+      reserve_bootmem_node(pgdat, __pa(p), (ressiz-(unsigned)p)); \
+   }
+#endif
+
 	/*
 	 * Hmm... This should go elsewhere, but we really really need to
 	 * stop things allocating the low memory; ideally we need a better
diff -Naur uClinux-dist.orig/linux-2.6.x/arch/arm/mm/nommu.c uClinux-dist/linux-2.6.x/arch/arm/mm/nommu.c
--- uClinux-dist.orig/linux-2.6.x/arch/arm/mm/nommu.c	2006-12-12 07:16:47.000000000 -0700
+++ uClinux-dist/linux-2.6.x/arch/arm/mm/nommu.c	2007-04-18 18:03:16.000000000 -0600
@@ -6,11 +6,14 @@
 #include <linux/module.h>
 #include <linux/mm.h>
 #include <linux/pagemap.h>
+#include <linux/bootmem.h>
 
 #include <asm/cacheflush.h>
 #include <asm/io.h>
 #include <asm/page.h>
 
+#include <asm/mach/arch.h>
+
 #include "mm.h"
 
 extern void _stext, __data_start, _end;
@@ -36,6 +39,24 @@
 	 * alloc_page breaks with error, although it is not NULL, but "0."
 	 */
 	reserve_bootmem_node(pgdat, CONFIG_VECTORS_BASE, PAGE_SIZE);
+
+#ifdef CONFIG_MTD_UCLINUX
+   {
+      /* Lance: If using a romfs in ram reserve this memory...                */
+      extern char _ebss;
+      unsigned char *p;
+      unsigned romfslen;
+      unsigned ressiz;
+      p=(unsigned char *)&_ebss;
+      romfslen=p[8];
+      romfslen=(romfslen<<8)+p[9];
+      romfslen=(romfslen<<8)+p[10];
+      romfslen=(romfslen<<8)+p[11];
+      ressiz=((unsigned)p+romfslen);
+      ressiz=((ressiz+4095)&0xfffff000); /* align on page boundary            */
+      reserve_bootmem_node(pgdat, __pa(p), (ressiz-(unsigned)p)); \
+   }
+#endif
 }
 
 /*
diff -Naur uClinux-dist.orig/linux-2.6.x/drivers/mtd/maps/uclinux.c uClinux-dist/linux-2.6.x/drivers/mtd/maps/uclinux.c
--- uClinux-dist.orig/linux-2.6.x/drivers/mtd/maps/uclinux.c	2006-10-11 01:07:52.000000000 -0600
+++ uClinux-dist/linux-2.6.x/drivers/mtd/maps/uclinux.c	2007-04-19 08:01:09.000000000 -0600
@@ -23,6 +23,7 @@
 #include <asm/io.h>
 
 /****************************************************************************/
+#define CONFIG_MTD_UCLINUX_EBSS /* Lance: this isn't defined in the config system */
 
 #ifdef CONFIG_MTD_UCLINUX_EBSS
 	#define MAP_TYPE	"map_ram"
@@ -75,7 +76,7 @@
 	unsigned long addr = (unsigned long) CONFIG_MTD_UCLINUX_ADDRESS;
 
 	mapp = &uclinux_map;
-	mapp->phys = addr;
+	mapp->phys = __pa(addr); /* Lance: changed to get real phys addr           */
 	mapp->size = PAGE_ALIGN(ntohl(*((unsigned long *)(addr + 8))));
 	mapp->bankwidth = 4;
 
_______________________________________________
uClinux-dev mailing list
uClinux-dev@uclinux.org
http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
This message was resent by uclinux-dev@uclinux.org
To unsubscribe see:
http://mailman.uclinux.org/mailman/options/uclinux-dev

Reply via email to