Path: blob/master/arch/sh/kernel/relocate_kernel.S
10817 views
/*1* relocate_kernel.S - put the kernel image in place to boot2* 2005.9.17 [email protected]3*4* LANDISK/sh4 is supported. Maybe, SH archtecture works well.5*6* 2009-03-18 Magnus Damm - Added Kexec Jump support7*8* This source code is licensed under the GNU General Public License,9* Version 2. See the file COPYING for more details.10*/11#include <linux/linkage.h>12#include <asm/addrspace.h>13#include <asm/page.h>1415.globl relocate_new_kernel16relocate_new_kernel:17/* r4 = indirection_page */18/* r5 = reboot_code_buffer */19/* r6 = start_address */2021mov.l 10f, r0 /* PAGE_SIZE */22add r5, r0 /* setup new stack at end of control page */2324/* save r15->r8 to new stack */25mov.l r15, @-r026mov r0, r1527mov.l r14, @-r1528mov.l r13, @-r1529mov.l r12, @-r1530mov.l r11, @-r1531mov.l r10, @-r1532mov.l r9, @-r1533mov.l r8, @-r153435/* save other random registers */36sts.l macl, @-r1537sts.l mach, @-r1538stc.l gbr, @-r1539stc.l ssr, @-r1540stc.l sr, @-r1541sts.l pr, @-r1542stc.l spc, @-r154344/* switch to bank1 and save r7->r0 */45mov.l 12f, r946stc sr, r847or r9, r848ldc r8, sr49mov.l r7, @-r1550mov.l r6, @-r1551mov.l r5, @-r1552mov.l r4, @-r1553mov.l r3, @-r1554mov.l r2, @-r1555mov.l r1, @-r1556mov.l r0, @-r155758/* switch to bank0 and save r7->r0 */59mov.l 12f, r960not r9, r961stc sr, r862and r9, r863ldc r8, sr64mov.l r7, @-r1565mov.l r6, @-r1566mov.l r5, @-r1567mov.l r4, @-r1568mov.l r3, @-r1569mov.l r2, @-r1570mov.l r1, @-r1571mov.l r0, @-r157273mov.l r4, @-r15 /* save indirection page again */7475bsr swap_pages /* swap pages before jumping to new kernel */76nop7778mova 11f, r079mov.l r15, @r0 /* save pointer to stack */8081jsr @r6 /* hand over control to new kernel */82nop8384mov.l 11f, r15 /* get pointer to stack */85mov.l @r15+, r4 /* restore r4 to get indirection page */8687bsr swap_pages /* swap pages back to previous state */88nop8990/* make sure bank0 is active and restore r0->r7 */91mov.l 12f, r992not r9, r993stc sr, r894and r9, r895ldc r8, sr96mov.l @r15+, r097mov.l @r15+, r198mov.l @r15+, r299mov.l @r15+, r3100mov.l @r15+, r4101mov.l @r15+, r5102mov.l @r15+, r6103mov.l @r15+, r7104105/* switch to bank1 and restore r0->r7 */106mov.l 12f, r9107stc sr, r8108or r9, r8109ldc r8, sr110mov.l @r15+, r0111mov.l @r15+, r1112mov.l @r15+, r2113mov.l @r15+, r3114mov.l @r15+, r4115mov.l @r15+, r5116mov.l @r15+, r6117mov.l @r15+, r7118119/* switch back to bank0 */120mov.l 12f, r9121not r9, r9122stc sr, r8123and r9, r8124ldc r8, sr125126/* restore other random registers */127ldc.l @r15+, spc128lds.l @r15+, pr129ldc.l @r15+, sr130ldc.l @r15+, ssr131ldc.l @r15+, gbr132lds.l @r15+, mach133lds.l @r15+, macl134135/* restore r8->r15 */136mov.l @r15+, r8137mov.l @r15+, r9138mov.l @r15+, r10139mov.l @r15+, r11140mov.l @r15+, r12141mov.l @r15+, r13142mov.l @r15+, r14143mov.l @r15+, r15144rts145nop146147swap_pages:148bra 1f149mov r4,r0 /* cmd = indirection_page */1500:151mov.l @r4+,r0 /* cmd = *ind++ */1521531: /* addr = cmd & 0xfffffff0 */154mov r0,r2155mov #-16,r1156and r1,r2157158/* if(cmd & IND_DESTINATION) dst = addr */159tst #1,r0160bt 2f161bra 0b162mov r2,r51631642: /* else if(cmd & IND_INDIRECTION) ind = addr */165tst #2,r0166bt 3f167bra 0b168mov r2,r41691703: /* else if(cmd & IND_DONE) return */171tst #4,r0172bt 4f173rts174nop1751764: /* else if(cmd & IND_SOURCE) memcpy(dst,addr,PAGE_SIZE) */177tst #8,r0178bt 0b179180mov.l 10f,r3 /* PAGE_SIZE */181shlr2 r3182shlr2 r31835:184dt r3185186/* regular kexec just overwrites the destination page187* with the contents of the source page.188* for the kexec jump case we need to swap the contents189* of the pages.190* to keep it simple swap the contents for both cases.191*/192mov.l @(0, r2), r8193mov.l @(0, r5), r1194mov.l r8, @(0, r5)195mov.l r1, @(0, r2)196197mov.l @(4, r2), r8198mov.l @(4, r5), r1199mov.l r8, @(4, r5)200mov.l r1, @(4, r2)201202mov.l @(8, r2), r8203mov.l @(8, r5), r1204mov.l r8, @(8, r5)205mov.l r1, @(8, r2)206207mov.l @(12, r2), r8208mov.l @(12, r5), r1209mov.l r8, @(12, r5)210mov.l r1, @(12, r2)211212add #16,r5213add #16,r2214bf 5b215216bra 0b217nop218219.align 222010:221.long PAGE_SIZE22211:223.long 022412:225.long 0x20000000 ! RB=1226227relocate_new_kernel_end:228229.globl relocate_new_kernel_size230relocate_new_kernel_size:231.long relocate_new_kernel_end - relocate_new_kernel232233234