OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [powerpc/] [kernel/] [machine_kexec_32.c] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/*
2
 * PPC32 code to handle Linux booting another kernel.
3
 *
4
 * Copyright (C) 2002-2003 Eric Biederman  <ebiederm@xmission.com>
5
 * GameCube/ppc32 port Copyright (C) 2004 Albert Herranz
6
 * Copyright (C) 2005 IBM Corporation.
7
 *
8
 * This source code is licensed under the GNU General Public License,
9
 * Version 2.  See the file COPYING for more details.
10
 */
11
 
12
#include <linux/kexec.h>
13
#include <linux/mm.h>
14
#include <linux/string.h>
15
#include <asm/cacheflush.h>
16
#include <asm/hw_irq.h>
17
#include <asm/io.h>
18
 
19
typedef NORET_TYPE void (*relocate_new_kernel_t)(
20
                                unsigned long indirection_page,
21
                                unsigned long reboot_code_buffer,
22
                                unsigned long start_address) ATTRIB_NORET;
23
 
24
/*
25
 * This is a generic machine_kexec function suitable at least for
26
 * non-OpenFirmware embedded platforms.
27
 * It merely copies the image relocation code to the control page and
28
 * jumps to it.
29
 * A platform specific function may just call this one.
30
 */
31
void default_machine_kexec(struct kimage *image)
32
{
33
        extern const unsigned char relocate_new_kernel[];
34
        extern const unsigned int relocate_new_kernel_size;
35
        unsigned long page_list;
36
        unsigned long reboot_code_buffer, reboot_code_buffer_phys;
37
        relocate_new_kernel_t rnk;
38
 
39
        /* Interrupts aren't acceptable while we reboot */
40
        local_irq_disable();
41
 
42
        page_list = image->head;
43
 
44
        /* we need both effective and real address here */
45
        reboot_code_buffer =
46
                        (unsigned long)page_address(image->control_code_page);
47
        reboot_code_buffer_phys = virt_to_phys((void *)reboot_code_buffer);
48
 
49
        /* copy our kernel relocation code to the control code page */
50
        memcpy((void *)reboot_code_buffer, relocate_new_kernel,
51
                                                relocate_new_kernel_size);
52
 
53
        flush_icache_range(reboot_code_buffer,
54
                                reboot_code_buffer + KEXEC_CONTROL_CODE_SIZE);
55
        printk(KERN_INFO "Bye!\n");
56
 
57
        /* now call it */
58
        rnk = (relocate_new_kernel_t) reboot_code_buffer;
59
        (*rnk)(page_list, reboot_code_buffer_phys, image->start);
60
}
61
 
62
int default_machine_kexec_prepare(struct kimage *image)
63
{
64
        return 0;
65
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.