diff -uNrp --exclude CVS linux-stage2-cramfs/arch/arm/Makefile linux-stage3-pxaxip/arch/arm/Makefile --- linux-stage2-cramfs/arch/arm/Makefile Thu May 15 16:58:44 2003 +++ linux-stage3-pxaxip/arch/arm/Makefile Fri May 16 22:50:01 2003 @@ -19,7 +19,7 @@ endif #CFLAGS :=$(CFLAGS:-O2=-Os) ifeq ($(CONFIG_DEBUG_INFO),y) -CFLAGS +=-g +CFLAGS +=-g -mapcs-frame endif # Select CPU dependent flags. Note that order of declaration is important; @@ -278,7 +278,8 @@ vmlinux: arch/arm/vmlinux.lds arch/arm/vmlinux.lds: arch/arm/Makefile $(LDSCRIPT) \ $(wildcard include/config/cpu/32.h) \ $(wildcard include/config/cpu/26.h) \ - $(wildcard include/config/arch/*.h) + $(wildcard include/config/arch/*.h) \ + $(wildcard include/config/xip/kernel.h) @echo ' Generating $@' @sed 's/TEXTADDR/$(TEXTADDR)/;s/DATAADDR/$(DATAADDR)/' $(LDSCRIPT) >$@ diff -uNrp --exclude CVS linux-stage2-cramfs/arch/arm/boot/Makefile linux-stage3-pxaxip/arch/arm/boot/Makefile --- linux-stage2-cramfs/arch/arm/boot/Makefile Thu May 15 16:58:44 2003 +++ linux-stage3-pxaxip/arch/arm/boot/Makefile Fri May 16 22:50:01 2003 @@ -146,10 +146,11 @@ zImage: compressed/vmlinux ifeq ($(CONFIG_XIP_KERNEL),y) xipImage: $(CONFIGURE) $(SYSTEM) - $(OBJCOPY) -S -O binary -R .data $(SYSTEM) vmlinux-text.bin - $(OBJCOPY) -S -O binary -R .init -R .text -R __ex_table -R __ksymtab $(SYSTEM) vmlinux-data.bin - cat vmlinux-text.bin vmlinux-data.bin > $@ - $(RM) -f vmlinux-text.bin vmlinux-data.bin + $(OBJCOPY) -S -O binary -R .data -R .xipram $(SYSTEM) vmlinux-text.bin + $(OBJCOPY) -S -O binary -j .xipram $(SYSTEM) vmlinux-xipram.bin + $(OBJCOPY) -S -O binary -j .data $(SYSTEM) vmlinux-data.bin + cat vmlinux-text.bin vmlinux-xipram.bin vmlinux-data.bin > $@ + $(RM) -f vmlinux-text.bin vmlinux-xipram.bin vmlinux-data.bin endif bootpImage: bootp/bootp diff -uNrp --exclude CVS linux-stage2-cramfs/arch/arm/kernel/head-armv.S linux-stage3-pxaxip/arch/arm/kernel/head-armv.S --- linux-stage2-cramfs/arch/arm/kernel/head-armv.S Thu May 15 16:58:44 2003 +++ linux-stage3-pxaxip/arch/arm/kernel/head-armv.S Fri May 16 22:50:01 2003 @@ -227,7 +227,7 @@ __ret: ldr lr, __switch_data .align 5 __mmap_switched: #ifdef CONFIG_XIP_KERNEL - ldr r3, ETEXT @ data section copy + ldr r3, EXIP @ data section copy ldr r4, SDATA ldr r5, EDATA 1: @@ -337,15 +337,29 @@ __create_page_tables: mov r0, #TEXTADDR & 0xff000000 add r0, r0, #TEXTADDR & 0x00f00000 @ virt kernel start - add r0, r4, r0, lsr #18 - add r2, r3, #4 << 20 @ kernel + 4MB + ldr r2, SXIP + sub r2, r2, #1 + mov r2, r2, lsr #20 + mov r2, r2, lsl #20 + sub r2, r2, r0 @ length of XIP text + + add r2, r2, r3 + add r0, r4, r0, lsr #18 1: str r3, [r0], #4 add r3, r3, #1 << 20 cmp r3, r2 bne 1b + add r2, r2, #0x300000 @ xipram and .data + sub r3, r3, #1 << 20 @ one overlapping pgdir +1: + str r3, [r0], #4 + add r3, r3, #1 << 20 + cmp r3, r2 + bne 1b + bic r3, r4, #0x000ff000 @ ram start add r0, r4, r3, lsr #18 orr r3, r3, r8 @@ -530,8 +544,8 @@ __lookup_architecture_type: PGTBL: .long SYMBOL_NAME(swapper_pg_dir) -ETEXT: .long SYMBOL_NAME(_endtext) SDATA: .long SYMBOL_NAME(_sdata) EDATA: .long SYMBOL_NAME(__bss_start) - +SXIP: .long SYMBOL_NAME(_xipram_start) +EXIP: .long SYMBOL_NAME(_xipram_end) #endif diff -uNrp --exclude CVS linux-stage2-cramfs/arch/arm/kernel/setup.c linux-stage3-pxaxip/arch/arm/kernel/setup.c --- linux-stage2-cramfs/arch/arm/kernel/setup.c Thu May 15 16:58:44 2003 +++ linux-stage3-pxaxip/arch/arm/kernel/setup.c Fri May 16 22:50:01 2003 @@ -56,7 +56,8 @@ extern void reboot_setup(char *str); extern int root_mountflags; extern int _stext, _text, _etext, _edata, _end; #ifdef CONFIG_XIP_KERNEL -extern int _endtext, _sdata; +extern int _sdata; +extern char _xipram_start, _xipram_end, _romend; #endif @@ -371,6 +372,24 @@ void __init setup_initrd(unsigned int st #endif } +#ifdef CONFIG_XIP_KERNEL +extern char _xipram_start, xipram_end; +char *xipram_copy; + +static void __init setup_xipram(void) +{ + unsigned long xipram_len = &_xipram_end-&_xipram_start; + xipram_copy = alloc_bootmem_pages(xipram_len); + + memcpy(xipram_copy, &_romend, &_xipram_end-&_xipram_start); + + init_mm.start_code = (unsigned long) xipram_copy; + init_mm.end_code = (unsigned long) xipram_copy + xipram_len; + init_mm.start_data = (unsigned long) &_sdata; + +} +#endif + static void __init request_standard_resources(struct meminfo *mi, struct machine_desc *mdesc) { @@ -379,11 +398,7 @@ request_standard_resources(struct meminf kernel_code.start = __virt_to_phys(init_mm.start_code); kernel_code.end = __virt_to_phys(init_mm.end_code - 1); -#ifndef CONFIG_XIP_KERNEL - kernel_data.start = __virt_to_phys(init_mm.end_code); -#else kernel_data.start = __virt_to_phys(init_mm.start_data); -#endif kernel_data.end = __virt_to_phys(init_mm.brk - 1); for (i = 0; i < mi->nr_banks; i++) { @@ -641,13 +656,11 @@ void __init setup_arch(char **cmdline_p) meminfo.bank[0].size = MEM_SIZE; } + /* These three get overwritten by setup_xipram() if appropriate */ init_mm.start_code = (unsigned long) &_text; -#ifndef CONFIG_XIP_KERNEL init_mm.end_code = (unsigned long) &_etext; -#else - init_mm.end_code = (unsigned long) &_endtext; - init_mm.start_data = (unsigned long) &_sdata; -#endif + init_mm.start_data = (unsigned long) &_etext; + init_mm.end_data = (unsigned long) &_edata; init_mm.brk = (unsigned long) &_end; @@ -655,6 +668,9 @@ void __init setup_arch(char **cmdline_p) saved_command_line[COMMAND_LINE_SIZE-1] = '\0'; parse_cmdline(&meminfo, cmdline_p, from); bootmem_init(&meminfo); +#ifdef CONFIG_XIP_KERNEL + setup_xipram(); +#endif paging_init(&meminfo, mdesc); request_standard_resources(&meminfo, mdesc); diff -uNrp --exclude CVS linux-stage2-cramfs/arch/arm/lib/delay.S linux-stage3-pxaxip/arch/arm/lib/delay.S --- linux-stage2-cramfs/arch/arm/lib/delay.S Mon May 5 21:39:59 2003 +++ linux-stage3-pxaxip/arch/arm/lib/delay.S Fri May 16 22:50:01 2003 @@ -9,7 +9,13 @@ */ #include #include +#include + +#ifndef CONFIG_XIP_KERNEL .text +#else + .section ".text.xipram","ax",%progbits +#endif LC0: .word SYMBOL_NAME(loops_per_jiffy) diff -uNrp --exclude CVS linux-stage2-cramfs/arch/arm/mm/init.c linux-stage3-pxaxip/arch/arm/mm/init.c --- linux-stage2-cramfs/arch/arm/mm/init.c Thu May 15 16:58:44 2003 +++ linux-stage3-pxaxip/arch/arm/mm/init.c Fri May 16 22:50:01 2003 @@ -52,7 +52,7 @@ static unsigned long totalram_pages; extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; extern char _stext, _text, _etext, _end, __init_begin, __init_end; #ifdef CONFIG_XIP_KERNEL -extern char _endtext, _sdata; +extern char _endtext, _sdata, _xipram_start, _xipram_end; #endif extern unsigned long phys_initrd_start; extern unsigned long phys_initrd_size; @@ -612,11 +612,12 @@ void __init mem_init(void) #ifndef CONFIG_XIP_KERNEL codepages = &_etext - &_text; datapages = &_end - &_etext; + initpages = &__init_end - &__init_begin; #else - codepages = &_endtext - &_text; + codepages = &_xipram_end - &_xipram_start; datapages = &_end - &_sdata; + initpages = &_xipram_start - 0x100000 - &_stext; #endif - initpages = &__init_end - &__init_begin; high_memory = (void *)__va(meminfo.end); max_mapnr = virt_to_page(high_memory) - mem_map; @@ -653,11 +654,17 @@ void __init mem_init(void) } printk(" = %luMB total\n", num_physpages >> (20 - PAGE_SHIFT)); +#ifndef CONFIG_XIP_KERNEL printk(KERN_NOTICE "Memory: %luKB available (%dK code, " "%dK data, %dK init)\n", (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), codepages >> 10, datapages >> 10, initpages >> 10); - +#else + printk(KERN_NOTICE "Memory: %luKB available (%dK code, " + "%dK data, %dK ROM)\n", + (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), + codepages >> 10, datapages >> 10, initpages >> 10); +#endif if (PAGE_SIZE >= 16384 && num_physpages <= 128) { extern int sysctl_overcommit_memory; /* diff -uNrp --exclude CVS linux-stage2-cramfs/arch/arm/mm/mm-armv.c linux-stage3-pxaxip/arch/arm/mm/mm-armv.c --- linux-stage2-cramfs/arch/arm/mm/mm-armv.c Thu May 15 16:58:44 2003 +++ linux-stage3-pxaxip/arch/arm/mm/mm-armv.c Fri May 16 22:50:01 2003 @@ -62,8 +62,9 @@ __setup("nowb", nowrite_setup); #define clean_cache_area(start,size) \ cpu_cache_clean_invalidate_range((unsigned long)start, ((unsigned long)start) + size, 0); - - +#ifdef CONFIG_XIP_KERNEL +extern char _xipram_start, _xipram_end; +#endif /* * need to get a 16k page for level 1 */ @@ -358,7 +359,7 @@ void __init memtable_init(struct meminfo #ifdef CONFIG_XIP_KERNEL p->physical = KERNEL_XIP_BASE_PHYS; p->virtual = KERNEL_XIP_BASE_VIRT; - p->length = PGDIR_SIZE * 8; + p->length = (((unsigned long)(&_xipram_end)) & ~(PGDIR_SIZE-1)) - KERNEL_XIP_BASE_VIRT; p->domain = DOMAIN_KERNEL; p->prot_read = 0; /* r=0, b=0 --> read-only for kernel mode */ p->prot_write = 0; @@ -366,7 +367,22 @@ void __init memtable_init(struct meminfo p->bufferable = 1; p ++; -#endif + + if (&_xipram_start != (&_xipram_end)) { + extern char *xipram_copy; + + p->physical = virt_to_phys(xipram_copy); + p->virtual = &_xipram_start; + p->length = ((&_xipram_end-&_xipram_start) +PAGE_SIZE-1) & PAGE_MASK; + p->domain = DOMAIN_KERNEL; + p->prot_read = 0; /* r=0, b=0 --> read-only for kernel mode */ + p->prot_write = 0; + p->cacheable = 1; + p->bufferable = 1; + + p ++; + } +#endif /* CONFIG_XIP_KERNEL */ /* * Go through the initial mappings, but clear out any diff -uNrp --exclude CVS linux-stage2-cramfs/arch/arm/vmlinux-armv-xip.lds.in linux-stage3-pxaxip/arch/arm/vmlinux-armv-xip.lds.in --- linux-stage2-cramfs/arch/arm/vmlinux-armv-xip.lds.in Thu May 15 16:58:44 2003 +++ linux-stage3-pxaxip/arch/arm/vmlinux-armv-xip.lds.in Fri May 16 22:50:01 2003 @@ -74,9 +74,23 @@ SECTIONS __start___ksymtab = .; *(__ksymtab) __stop___ksymtab = .; + + . = ALIGN(4096); } - _endtext = .; + _romend = .; + + /* Add 1MiB so that the .xipram functions can be accessed + through a section mapping to start with. */ + . = . + 0x100000; + + .xipram : { + _xipram_start = .; + + *(.text.xipram) + + _xipram_end = .; + } . = DATAADDR;