r4013 - in branches/src/target/kernel/2.6.24.x: config patches
werner at sita.openmoko.org
werner at sita.openmoko.org
Sat Feb 2 19:20:28 CET 2008
Author: werner
Date: 2008-02-02 19:20:21 +0100 (Sat, 02 Feb 2008)
New Revision: 4013
Added:
branches/src/target/kernel/2.6.24.x/patches/kexec-atags.patch
Modified:
branches/src/target/kernel/2.6.24.x/config/defconfig-2.6.24
branches/src/target/kernel/2.6.24.x/patches/series
Log:
This gives user space the ability to modify atags (boot parameters, etc.)
before kexec'ing.
patches/series:
- added kexec-atags.patch
patches/kexec-atags.patch:
- leapfrogged from upstream,
http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=4736/1
config/defconfig-2.6.24:
- added CONFIG_ATAGS_PROC (for kexec-atags.patch)
- added CONFIG_FIQ and CONFIG_S3C2440_C_FIQ, which are set implicitly
Modified: branches/src/target/kernel/2.6.24.x/config/defconfig-2.6.24
===================================================================
--- branches/src/target/kernel/2.6.24.x/config/defconfig-2.6.24 2008-02-02 00:23:08 UTC (rev 4012)
+++ branches/src/target/kernel/2.6.24.x/config/defconfig-2.6.24 2008-02-02 18:20:21 UTC (rev 4013)
@@ -1,7 +1,7 @@
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.24
-# Fri Jan 25 02:10:53 2008
+# Sat Feb 2 15:15:40 2008
#
CONFIG_ARM=y
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
@@ -22,6 +22,7 @@
CONFIG_GENERIC_HWEIGHT=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_ZONE_DMA=y
+CONFIG_FIQ=y
CONFIG_VECTORS_BASE=0xffff0000
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
@@ -193,6 +194,7 @@
# CONFIG_MACH_VSTMS is not set
CONFIG_CPU_S3C2440=y
CONFIG_S3C2440_DMA=y
+CONFIG_S3C2440_C_FIQ=y
#
# S3C2440 Machines
@@ -281,6 +283,7 @@
CONFIG_CMDLINE="unused -- bootloader passes ATAG list"
# CONFIG_XIP_KERNEL is not set
CONFIG_KEXEC=y
+CONFIG_ATAGS_PROC=y
#
# Floating point emulation
Added: branches/src/target/kernel/2.6.24.x/patches/kexec-atags.patch
===================================================================
--- branches/src/target/kernel/2.6.24.x/patches/kexec-atags.patch 2008-02-02 00:23:08 UTC (rev 4012)
+++ branches/src/target/kernel/2.6.24.x/patches/kexec-atags.patch 2008-02-02 18:20:21 UTC (rev 4013)
@@ -0,0 +1,294 @@
+Leapfrogged from upstream (ARM Linux)
+http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=4736/1
+
+Index: linux-2.6.24/arch/arm/Kconfig
+===================================================================
+--- linux-2.6.24.orig/arch/arm/Kconfig
++++ linux-2.6.24/arch/arm/Kconfig
+@@ -865,6 +865,13 @@
+ initially work for you. It may help to enable device hotplugging
+ support.
+
++config ATAGS_PROC
++ bool "Export atags in procfs"
++ default n
++ help
++ Should the atags used to boot the kernel be exported in an "atags"
++ file in procfs. Useful with kexec.
++
+ endmenu
+
+ if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_IMX )
+Index: linux-2.6.24/arch/arm/kernel/Makefile
+===================================================================
+--- linux-2.6.24.orig/arch/arm/kernel/Makefile
++++ linux-2.6.24/arch/arm/kernel/Makefile
+@@ -19,6 +19,7 @@
+ obj-$(CONFIG_PCI) += bios32.o isa.o
+ obj-$(CONFIG_SMP) += smp.o
+ obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
++obj-$(CONFIG_ATAGS_PROC) += atags.o
+ obj-$(CONFIG_OABI_COMPAT) += sys_oabi-compat.o
+
+ obj-$(CONFIG_CRUNCH) += crunch.o crunch-bits.o
+Index: linux-2.6.24/arch/arm/kernel/atags.c
+===================================================================
+--- /dev/null
++++ linux-2.6.24/arch/arm/kernel/atags.c
+@@ -0,0 +1,86 @@
++#include <linux/slab.h>
++#include <linux/kexec.h>
++#include <linux/proc_fs.h>
++#include <asm/setup.h>
++#include <asm/types.h>
++#include <asm/page.h>
++
++struct buffer {
++ size_t size;
++ char *data;
++};
++static struct buffer tags_buffer;
++
++static int
++read_buffer(char* page, char** start, off_t off, int count,
++ int* eof, void* data)
++{
++ struct buffer *buffer = (struct buffer *)data;
++
++ if (off >= buffer->size) {
++ *eof = 1;
++ return 0;
++ }
++
++ count = min((int) (buffer->size - off), count);
++
++ memcpy(page, &buffer->data[off], count);
++
++ return count;
++}
++
++
++static int
++create_proc_entries(void)
++{
++ struct proc_dir_entry* tags_entry;
++
++ tags_entry = create_proc_read_entry("atags", 0400, &proc_root, read_buffer, &tags_buffer);
++ if (!tags_entry)
++ return -ENOMEM;
++
++ return 0;
++}
++
++
++static char __initdata atags_copy_buf[KEXEC_BOOT_PARAMS_SIZE];
++static char __initdata *atags_copy;
++
++void __init save_atags(const struct tag *tags)
++{
++ atags_copy = atags_copy_buf;
++ memcpy(atags_copy, tags, KEXEC_BOOT_PARAMS_SIZE);
++}
++
++
++static int __init init_atags_procfs(void)
++{
++ struct tag *tag;
++ int error;
++
++ if (!atags_copy) {
++ printk(KERN_WARNING "Exporting ATAGs: No saved tags found\n");
++ return -EIO;
++ }
++
++ for (tag = (struct tag *) atags_copy; tag->hdr.size; tag = tag_next(tag))
++ ;
++
++ tags_buffer.size = ((char *) tag - atags_copy) + sizeof(tag->hdr);
++ tags_buffer.data = kmalloc(tags_buffer.size, GFP_KERNEL);
++ if (tags_buffer.data == NULL)
++ return -ENOMEM;
++ memcpy(tags_buffer.data, atags_copy, tags_buffer.size);
++
++ error = create_proc_entries();
++ if (error) {
++ printk(KERN_ERR "Exporting ATAGs: not enough memory\n");
++ kfree(tags_buffer.data);
++ tags_buffer.size = 0;
++ tags_buffer.data = NULL;
++ }
++
++ return error;
++}
++
++arch_initcall(init_atags_procfs);
+Index: linux-2.6.24/arch/arm/kernel/atags.h
+===================================================================
+--- /dev/null
++++ linux-2.6.24/arch/arm/kernel/atags.h
+@@ -0,0 +1,5 @@
++#ifdef CONFIG_ATAGS_PROC
++extern void save_atags(struct tag *tags);
++#else
++static inline void save_atags(struct tag *tags) { }
++#endif
+Index: linux-2.6.24/arch/arm/kernel/machine_kexec.c
+===================================================================
+--- linux-2.6.24.orig/arch/arm/kernel/machine_kexec.c
++++ linux-2.6.24/arch/arm/kernel/machine_kexec.c
+@@ -21,6 +21,7 @@
+ extern unsigned long kexec_start_address;
+ extern unsigned long kexec_indirection_page;
+ extern unsigned long kexec_mach_type;
++extern unsigned long kexec_boot_atags;
+
+ /*
+ * Provide a dummy crash_notes definition while crash dump arrives to arm.
+@@ -62,6 +63,7 @@
+ kexec_start_address = image->start;
+ kexec_indirection_page = page_list;
+ kexec_mach_type = machine_arch_type;
++ kexec_boot_atags = image->start - KEXEC_ARM_ZIMAGE_OFFSET + KEXEC_ARM_ATAGS_OFFSET;
+
+ /* copy our kernel relocation code to the control code page */
+ memcpy(reboot_code_buffer,
+Index: linux-2.6.24/arch/arm/kernel/relocate_kernel.S
+===================================================================
+--- linux-2.6.24.orig/arch/arm/kernel/relocate_kernel.S
++++ linux-2.6.24/arch/arm/kernel/relocate_kernel.S
+@@ -7,23 +7,6 @@
+ .globl relocate_new_kernel
+ relocate_new_kernel:
+
+- /* Move boot params back to where the kernel expects them */
+-
+- ldr r0,kexec_boot_params_address
+- teq r0,#0
+- beq 8f
+-
+- ldr r1,kexec_boot_params_copy
+- mov r6,#KEXEC_BOOT_PARAMS_SIZE/4
+-7:
+- ldr r5,[r1],#4
+- str r5,[r0],#4
+- subs r6,r6,#1
+- bne 7b
+-
+-8:
+- /* Boot params moved, now go on with the kernel */
+-
+ ldr r0,kexec_indirection_page
+ ldr r1,kexec_start_address
+
+@@ -67,7 +50,7 @@
+ mov lr,r1
+ mov r0,#0
+ ldr r1,kexec_mach_type
+- ldr r2,kexec_boot_params_address
++ ldr r2,kexec_boot_atags
+ mov pc,lr
+
+ .globl kexec_start_address
+@@ -82,14 +65,9 @@
+ kexec_mach_type:
+ .long 0x0
+
+- /* phy addr where new kernel will expect to find boot params */
+- .globl kexec_boot_params_address
+-kexec_boot_params_address:
+- .long 0x0
+-
+- /* phy addr where old kernel put a copy of orig boot params */
+- .globl kexec_boot_params_copy
+-kexec_boot_params_copy:
++ /* phy addr of the atags for the new kernel */
++ .globl kexec_boot_atags
++kexec_boot_atags:
+ .long 0x0
+
+ relocate_new_kernel_end:
+Index: linux-2.6.24/arch/arm/kernel/setup.c
+===================================================================
+--- linux-2.6.24.orig/arch/arm/kernel/setup.c
++++ linux-2.6.24/arch/arm/kernel/setup.c
+@@ -24,7 +24,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/smp.h>
+ #include <linux/fs.h>
+-#include <linux/kexec.h>
+
+ #include <asm/cpu.h>
+ #include <asm/elf.h>
+@@ -39,6 +38,7 @@
+ #include <asm/mach/time.h>
+
+ #include "compat.h"
++#include "atags.h"
+
+ #ifndef MEM_SIZE
+ #define MEM_SIZE (16*1024*1024)
+@@ -784,23 +784,6 @@
+ }
+ arch_initcall(customize_machine);
+
+-#ifdef CONFIG_KEXEC
+-
+-/* Physical addr of where the boot params should be for this machine */
+-extern unsigned long kexec_boot_params_address;
+-
+-/* Physical addr of the buffer into which the boot params are copied */
+-extern unsigned long kexec_boot_params_copy;
+-
+-/* Pointer to the boot params buffer, for manipulation and display */
+-unsigned long kexec_boot_params;
+-EXPORT_SYMBOL(kexec_boot_params);
+-
+-/* The buffer itself - make sure it is sized correctly */
+-static unsigned long kexec_boot_params_buf[(KEXEC_BOOT_PARAMS_SIZE + 3) / 4];
+-
+-#endif
+-
+ void __init setup_arch(char **cmdline_p)
+ {
+ struct tag *tags = (struct tag *)&init_tags;
+@@ -819,18 +802,6 @@
+ else if (mdesc->boot_params)
+ tags = phys_to_virt(mdesc->boot_params);
+
+-#ifdef CONFIG_KEXEC
+- kexec_boot_params_copy = virt_to_phys(kexec_boot_params_buf);
+- kexec_boot_params = (unsigned long)kexec_boot_params_buf;
+- if (__atags_pointer) {
+- kexec_boot_params_address = __atags_pointer;
+- memcpy((void *)kexec_boot_params, tags, KEXEC_BOOT_PARAMS_SIZE);
+- } else if (mdesc->boot_params) {
+- kexec_boot_params_address = mdesc->boot_params;
+- memcpy((void *)kexec_boot_params, tags, KEXEC_BOOT_PARAMS_SIZE);
+- }
+-#endif
+-
+ /*
+ * If we have the old style parameters, convert them to
+ * a tag list.
+@@ -846,6 +817,7 @@
+ if (tags->hdr.tag == ATAG_CORE) {
+ if (meminfo.nr_banks != 0)
+ squash_mem_tags(tags);
++ save_atags(tags);
+ parse_tags(tags);
+ }
+
+Index: linux-2.6.24/include/asm-arm/kexec.h
+===================================================================
+--- linux-2.6.24.orig/include/asm-arm/kexec.h
++++ linux-2.6.24/include/asm-arm/kexec.h
+@@ -16,6 +16,9 @@
+
+ #define KEXEC_BOOT_PARAMS_SIZE 1536
+
++#define KEXEC_ARM_ATAGS_OFFSET 0x1000
++#define KEXEC_ARM_ZIMAGE_OFFSET 0x8000
++
+ #ifndef __ASSEMBLY__
+
+ struct kimage;
Modified: branches/src/target/kernel/2.6.24.x/patches/series
===================================================================
--- branches/src/target/kernel/2.6.24.x/patches/series 2008-02-02 00:23:08 UTC (rev 4012)
+++ branches/src/target/kernel/2.6.24.x/patches/series 2008-02-02 18:20:21 UTC (rev 4013)
@@ -92,5 +92,8 @@
# bad bug
fix-hwecc-2410.patch
+# leapfrogged from upstream
+kexec-atags.patch
+
# Preliminary suspend/resume power saving improvements
suspend-prelim1.patch
More information about the commitlog
mailing list