diff options
author | Magnus Damm <damm@igel.co.jp> | 2009-03-18 04:47:31 -0400 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2009-03-18 05:44:22 -0400 |
commit | 7be5c55af0cc58e54e42e1702d837527e15b8414 (patch) | |
tree | 87d6ecab0ff11b0b75053bf57ee462a99828f981 /arch/sh | |
parent | c20351846efcb755ba849d9fb701fbd9a1ffb7c2 (diff) |
sh: simplify kexec vbr code
Setup the vbr register in machine_kexec(). This
instead of passing values to the assembly snippet.
Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh')
-rw-r--r-- | arch/sh/kernel/machine_kexec.c | 17 | ||||
-rw-r--r-- | arch/sh/kernel/relocate_kernel.S | 4 |
2 files changed, 8 insertions, 13 deletions
diff --git a/arch/sh/kernel/machine_kexec.c b/arch/sh/kernel/machine_kexec.c index 94df56b0d1f6..d3318f99256b 100644 --- a/arch/sh/kernel/machine_kexec.c +++ b/arch/sh/kernel/machine_kexec.c | |||
@@ -23,8 +23,7 @@ | |||
23 | typedef NORET_TYPE void (*relocate_new_kernel_t)( | 23 | typedef NORET_TYPE void (*relocate_new_kernel_t)( |
24 | unsigned long indirection_page, | 24 | unsigned long indirection_page, |
25 | unsigned long reboot_code_buffer, | 25 | unsigned long reboot_code_buffer, |
26 | unsigned long start_address, | 26 | unsigned long start_address) ATTRIB_NORET; |
27 | unsigned long vbr_reg) ATTRIB_NORET; | ||
28 | 27 | ||
29 | extern const unsigned char relocate_new_kernel[]; | 28 | extern const unsigned char relocate_new_kernel[]; |
30 | extern const unsigned int relocate_new_kernel_size; | 29 | extern const unsigned int relocate_new_kernel_size; |
@@ -76,14 +75,8 @@ void machine_kexec(struct kimage *image) | |||
76 | 75 | ||
77 | unsigned long page_list; | 76 | unsigned long page_list; |
78 | unsigned long reboot_code_buffer; | 77 | unsigned long reboot_code_buffer; |
79 | unsigned long vbr_reg; | ||
80 | relocate_new_kernel_t rnk; | 78 | relocate_new_kernel_t rnk; |
81 | 79 | ||
82 | #if defined(CONFIG_SH_STANDARD_BIOS) | ||
83 | vbr_reg = ((unsigned long )gdb_vbr_vector) - 0x100; | ||
84 | #else | ||
85 | vbr_reg = 0x80000000; // dummy | ||
86 | #endif | ||
87 | /* Interrupts aren't acceptable while we reboot */ | 80 | /* Interrupts aren't acceptable while we reboot */ |
88 | local_irq_disable(); | 81 | local_irq_disable(); |
89 | 82 | ||
@@ -100,9 +93,15 @@ void machine_kexec(struct kimage *image) | |||
100 | kexec_info(image); | 93 | kexec_info(image); |
101 | flush_cache_all(); | 94 | flush_cache_all(); |
102 | 95 | ||
96 | set_bl_bit(); | ||
97 | #if defined(CONFIG_SH_STANDARD_BIOS) | ||
98 | asm volatile("ldc %0, vbr" : | ||
99 | : "r" (((unsigned long) gdb_vbr_vector) - 0x100) | ||
100 | : "memory"); | ||
101 | #endif | ||
103 | /* now call it */ | 102 | /* now call it */ |
104 | rnk = (relocate_new_kernel_t) reboot_code_buffer; | 103 | rnk = (relocate_new_kernel_t) reboot_code_buffer; |
105 | (*rnk)(page_list, reboot_code_buffer, P2SEGADDR(image->start), vbr_reg); | 104 | (*rnk)(page_list, reboot_code_buffer, P2SEGADDR(image->start)); |
106 | } | 105 | } |
107 | 106 | ||
108 | void arch_crash_save_vmcoreinfo(void) | 107 | void arch_crash_save_vmcoreinfo(void) |
diff --git a/arch/sh/kernel/relocate_kernel.S b/arch/sh/kernel/relocate_kernel.S index c66cb3209db5..8b50b2c873a4 100644 --- a/arch/sh/kernel/relocate_kernel.S +++ b/arch/sh/kernel/relocate_kernel.S | |||
@@ -16,7 +16,6 @@ relocate_new_kernel: | |||
16 | /* r4 = indirection_page */ | 16 | /* r4 = indirection_page */ |
17 | /* r5 = reboot_code_buffer */ | 17 | /* r5 = reboot_code_buffer */ |
18 | /* r6 = start_address */ | 18 | /* r6 = start_address */ |
19 | /* r7 = vbr_reg */ | ||
20 | 19 | ||
21 | mov.l 10f,r8 /* PAGE_SIZE */ | 20 | mov.l 10f,r8 /* PAGE_SIZE */ |
22 | mov.l 11f,r9 /* P2SEG */ | 21 | mov.l 11f,r9 /* P2SEG */ |
@@ -80,9 +79,6 @@ relocate_new_kernel: | |||
80 | bra 0b | 79 | bra 0b |
81 | nop | 80 | nop |
82 | 6: | 81 | 6: |
83 | #ifdef CONFIG_SH_STANDARD_BIOS | ||
84 | ldc r7, vbr | ||
85 | #endif | ||
86 | jmp @r6 | 82 | jmp @r6 |
87 | nop | 83 | nop |
88 | 84 | ||