19d44190eSkogiidena/* 29d44190eSkogiidena * relocate_kernel.S - put the kernel image in place to boot 39d44190eSkogiidena * 2005.9.17 kogiidena@eggplant.ddo.jp 49d44190eSkogiidena * 59d44190eSkogiidena * LANDISK/sh4 is supported. Maybe, SH archtecture works well. 69d44190eSkogiidena * 79d44190eSkogiidena * This source code is licensed under the GNU General Public License, 89d44190eSkogiidena * Version 2. See the file COPYING for more details. 99d44190eSkogiidena */ 109d44190eSkogiidena#include <linux/linkage.h> 11510c72adSPaul Mundt#include <asm/addrspace.h> 12510c72adSPaul Mundt#include <asm/page.h> 139d44190eSkogiidena 149d44190eSkogiidena .globl relocate_new_kernel 159d44190eSkogiidenarelocate_new_kernel: 169d44190eSkogiidena /* r4 = indirection_page */ 179d44190eSkogiidena /* r5 = reboot_code_buffer */ 189d44190eSkogiidena /* r6 = start_address */ 199d44190eSkogiidena /* r7 = vbr_reg */ 209d44190eSkogiidena 21510c72adSPaul Mundt mov.l 10f,r8 /* PAGE_SIZE */ 22510c72adSPaul Mundt mov.l 11f,r9 /* P2SEG */ 239d44190eSkogiidena 249d44190eSkogiidena /* stack setting */ 259d44190eSkogiidena add r8,r5 269d44190eSkogiidena mov r5,r15 279d44190eSkogiidena 289d44190eSkogiidena bra 1f 299d44190eSkogiidena mov r4,r0 /* cmd = indirection_page */ 309d44190eSkogiidena0: 319d44190eSkogiidena mov.l @r4+,r0 /* cmd = *ind++ */ 329d44190eSkogiidena 33510c72adSPaul Mundt1: /* addr = (cmd | P2SEG) & 0xfffffff0 */ 349d44190eSkogiidena mov r0,r2 359d44190eSkogiidena or r9,r2 369d44190eSkogiidena mov #-16,r1 379d44190eSkogiidena and r1,r2 389d44190eSkogiidena 399d44190eSkogiidena /* if(cmd & IND_DESTINATION) dst = addr */ 409d44190eSkogiidena tst #1,r0 419d44190eSkogiidena bt 2f 429d44190eSkogiidena bra 0b 439d44190eSkogiidena mov r2,r5 449d44190eSkogiidena 459d44190eSkogiidena2: /* else if(cmd & IND_INDIRECTION) ind = addr */ 469d44190eSkogiidena tst #2,r0 479d44190eSkogiidena bt 3f 489d44190eSkogiidena bra 0b 499d44190eSkogiidena mov r2,r4 509d44190eSkogiidena 519d44190eSkogiidena3: /* else if(cmd & IND_DONE) goto 6 */ 529d44190eSkogiidena tst #4,r0 539d44190eSkogiidena bt 4f 549d44190eSkogiidena bra 6f 559d44190eSkogiidena nop 569d44190eSkogiidena 579d44190eSkogiidena4: /* else if(cmd & IND_SOURCE) memcpy(dst,addr,PAGE_SIZE) */ 589d44190eSkogiidena tst #8,r0 599d44190eSkogiidena bt 0b 609d44190eSkogiidena 619d44190eSkogiidena mov r8,r3 629d44190eSkogiidena shlr2 r3 639d44190eSkogiidena shlr2 r3 649d44190eSkogiidena5: 659d44190eSkogiidena dt r3 669d44190eSkogiidena mov.l @r2+,r1 /* 16n+0 */ 679d44190eSkogiidena mov.l r1,@r5 689d44190eSkogiidena add #4,r5 699d44190eSkogiidena mov.l @r2+,r1 /* 16n+4 */ 709d44190eSkogiidena mov.l r1,@r5 719d44190eSkogiidena add #4,r5 729d44190eSkogiidena mov.l @r2+,r1 /* 16n+8 */ 739d44190eSkogiidena mov.l r1,@r5 749d44190eSkogiidena add #4,r5 759d44190eSkogiidena mov.l @r2+,r1 /* 16n+12 */ 769d44190eSkogiidena mov.l r1,@r5 779d44190eSkogiidena add #4,r5 789d44190eSkogiidena bf 5b 799d44190eSkogiidena 809d44190eSkogiidena bra 0b 819d44190eSkogiidena nop 829d44190eSkogiidena6: 839d44190eSkogiidena#ifdef CONFIG_SH_STANDARD_BIOS 849d44190eSkogiidena ldc r7, vbr 859d44190eSkogiidena#endif 869d44190eSkogiidena jmp @r6 879d44190eSkogiidena nop 889d44190eSkogiidena 899d44190eSkogiidena .align 2 909d44190eSkogiidena10: 919d44190eSkogiidena .long PAGE_SIZE 929d44190eSkogiidena11: 93510c72adSPaul Mundt .long P2SEG 949d44190eSkogiidena 959d44190eSkogiidenarelocate_new_kernel_end: 969d44190eSkogiidena 979d44190eSkogiidena .globl relocate_new_kernel_size 989d44190eSkogiidenarelocate_new_kernel_size: 999d44190eSkogiidena .long relocate_new_kernel_end - relocate_new_kernel 100