diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-07 21:20:57 +0900 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-07 21:20:57 +0900 | 
| commit | 0e51793e162ca432fc5f04178cf82b80a92c2659 (patch) | |
| tree | cf7ffdb5064e2f7b6647a63e7323d1c4e99b7739 /arch/arm/kernel/machine_kexec.c | |
| parent | 5cad3598ea0cdb817681f74518d3213583a04f7a (diff) | |
| parent | b4874a3d298606c20118d1ead73235439bbc2823 (diff) | |
| download | olio-linux-3.10-0e51793e162ca432fc5f04178cf82b80a92c2659.tar.xz olio-linux-3.10-0e51793e162ca432fc5f04178cf82b80a92c2659.zip  | |
Merge branch 'for-linus' of git://git.linaro.org/people/rmk/linux-arm
Pull ARM updates from Russell King:
 "This is the first chunk of ARM updates for this merge window.
  Conflicts are expected in two files - asm/timex.h and
  mach-integrator/integrator_cp.c.  Nothing particularly stands out more
  than anything else.
  Most of the growth is down to the opcodes stuff from Dave Martin,
  which is countered by Rob's patches to use more of the asm-generic
  headers on ARM."
(A few more conflicts grew since then, but it all looked fairly trivial)
* 'for-linus' of git://git.linaro.org/people/rmk/linux-arm: (44 commits)
  ARM: 7548/1: include linux/sched.h in syscall.h
  ARM: 7541/1: Add ARM ERRATA 775420 workaround
  ARM: ensure vm_struct has its phys_addr member filled in
  ARM: 7540/1: kexec: Check segment memory addresses
  ARM: 7539/1: kexec: scan for dtb magic in segments
  ARM: 7538/1: delay: add registration mechanism for delay timer sources
  ARM: 7536/1: smp: Formalize an IPI for wakeup
  ARM: 7525/1: ptrace: use updated syscall number for syscall auditing
  ARM: 7524/1: support syscall tracing
  ARM: 7519/1: integrator: convert platform devices to Device Tree
  ARM: 7518/1: integrator: convert AMBA devices to device tree
  ARM: 7517/1: integrator: initial device tree support
  ARM: 7516/1: plat-versatile: add DT support to FPGA IRQ
  ARM: 7515/1: integrator: check PL010 base address from resource
  ARM: 7514/1: integrator: call common init function from machine
  ARM: 7522/1: arch_timers: register a time/cycle counter
  ARM: 7523/1: arch_timers: enable the use of the virtual timer
  ARM: 7531/1: mark kernelmode mem{cpy,set} non-experimental
  ARM: 7520/1: Build dtb files in all target
  ARM: Fix build warning in arch/arm/mm/alignment.c
  ...
Diffstat (limited to 'arch/arm/kernel/machine_kexec.c')
| -rw-r--r-- | arch/arm/kernel/machine_kexec.c | 29 | 
1 files changed, 28 insertions, 1 deletions
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index dfcdb9f7c12..e29c3337ca8 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c @@ -8,7 +8,9 @@  #include <linux/reboot.h>  #include <linux/io.h>  #include <linux/irq.h> +#include <linux/memblock.h>  #include <asm/pgtable.h> +#include <linux/of_fdt.h>  #include <asm/pgalloc.h>  #include <asm/mmu_context.h>  #include <asm/cacheflush.h> @@ -32,6 +34,29 @@ static atomic_t waiting_for_crash_ipi;  int machine_kexec_prepare(struct kimage *image)  { +	struct kexec_segment *current_segment; +	__be32 header; +	int i, err; + +	/* +	 * No segment at default ATAGs address. try to locate +	 * a dtb using magic. +	 */ +	for (i = 0; i < image->nr_segments; i++) { +		current_segment = &image->segment[i]; + +		err = memblock_is_region_memory(current_segment->mem, +						current_segment->memsz); +		if (err) +			return - EINVAL; + +		err = get_user(header, (__be32*)current_segment->buf); +		if (err) +			return err; + +		if (be32_to_cpu(header) == OF_DT_HEADER) +			kexec_boot_atags = current_segment->mem; +	}  	return 0;  } @@ -122,7 +147,9 @@ void machine_kexec(struct kimage *image)  	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; +	if (!kexec_boot_atags) +		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,  |