1cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens/* 2a53c8fab3f87c995c30ac226a03af95361243144Heiko Carstens * Copyright IBM Corp. 2005 3cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens * 425d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens * Author(s): Rolf Adelsberger, 55d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens * Heiko Carstens <heiko.carstens@de.ibm.com> 6cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens * 7cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens */ 8cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens 9144d634a21caff1d54cb4bb0d073774e88130045Jan Glauber#include <linux/linkage.h> 10eb546195a7d8bc492ec6865980bf767474e74d87Heiko Carstens#include <asm/sigp.h> 11144d634a21caff1d54cb4bb0d073774e88130045Jan Glauber 12cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens/* 13cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens * moves the new kernel to its destination... 14cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens * %r2 = pointer to first kimage_entry_t 15cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens * %r3 = start address - where to jump to after the job is done... 16cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens * 17cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens * %r5 will be used as temp. storage 18cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens * %r6 holds the destination address 19cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens * %r7 = PAGE_SIZE 20cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens * %r8 holds the source address 21cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens * %r9 = PAGE_SIZE 22cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens * %r10 is a page mask 23cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens */ 24cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens 25cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens .text 26144d634a21caff1d54cb4bb0d073774e88130045Jan GlauberENTRY(relocate_kernel) 2725d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens basr %r13,0 # base address 28cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens .base: 2915e9b586e0bd3692e2a21c5be178810d9d32214eHeiko Carstens stnsm sys_msk-.base(%r13),0xfb # disable DAT 305d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens stctl %c0,%c15,ctlregs-.base(%r13) 315d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens stm %r0,%r15,gprregs-.base(%r13) 325d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens la %r1,load_psw-.base(%r13) 3325d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens mvc 0(8,%r0),0(%r1) 345d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens la %r0,.back-.base(%r13) 355d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens st %r0,4(%r0) 365d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens oi 4(%r0),0x80 375d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens mvc 0x68(8,%r0),0(%r1) 385d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens la %r0,.back_pgm-.base(%r13) 395d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens st %r0,0x6c(%r0) 405d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens oi 0x6c(%r0),0x80 415d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens lhi %r0,0 425d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens diag %r0,%r0,0x308 435d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens .back: 445d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens basr %r13,0 455d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens .back_base: 465d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens oi have_diag308-.back_base(%r13),0x01 475d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens lctl %c0,%c15,ctlregs-.back_base(%r13) 485d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens lm %r0,%r15,gprregs-.back_base(%r13) 495d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens j .start_reloc 505d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens .back_pgm: 515d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens lm %r0,%r15,gprregs-.base(%r13) 525d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens .start_reloc: 5325d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens lhi %r10,-1 # preparing the mask 5425d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens sll %r10,12 # shift it such that it becomes 0xf000 55cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens .top: 5625d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens lhi %r7,4096 # load PAGE_SIZE in r7 5725d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens lhi %r9,4096 # load PAGE_SIZE in r9 5825d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens l %r5,0(%r2) # read another word for indirection page 5925d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens ahi %r2,4 # increment pointer 6025d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens tml %r5,0x1 # is it a destination page? 6125d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens je .indir_check # NO, goto "indir_check" 6225d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens lr %r6,%r5 # r6 = r5 6325d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens nr %r6,%r10 # mask it out and... 6425d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens j .top # ...next iteration 65cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens .indir_check: 6625d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens tml %r5,0x2 # is it a indirection page? 6725d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens je .done_test # NO, goto "done_test" 6825d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens nr %r5,%r10 # YES, mask out, 6925d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens lr %r2,%r5 # move it into the right register, 7025d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens j .top # and read next... 71cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens .done_test: 7225d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens tml %r5,0x4 # is it the done indicator? 7325d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens je .source_test # NO! Well, then it should be the source indicator... 7425d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens j .done # ok, lets finish it here... 75cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens .source_test: 7625d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens tml %r5,0x8 # it should be a source indicator... 7725d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens je .top # NO, ignore it... 7825d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens lr %r8,%r5 # r8 = r5 7925d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens nr %r8,%r10 # masking 8025d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens 0: mvcle %r6,%r8,0x0 # copy PAGE_SIZE bytes from r8 to r6 - pad with 0 81cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens jo 0b 82cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens j .top 83cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens .done: 8425d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens sr %r0,%r0 # clear register r0 8525d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens la %r4,load_psw-.base(%r13) # load psw-address into the register 8625d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens o %r3,4(%r4) # or load address into psw 87cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens st %r3,4(%r4) 8825d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens mvc 0(8,%r0),0(%r4) # copy psw to absolute address 0 895d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens tm have_diag308-.base(%r13),0x01 905d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens jno .no_diag308 915d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens diag %r0,%r0,0x308 925d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens .no_diag308: 9325d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens sr %r1,%r1 # clear %r1 9425d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens sr %r2,%r2 # clear %r2 95eb546195a7d8bc492ec6865980bf767474e74d87Heiko Carstens sigp %r1,%r2,SIGP_SET_ARCHITECTURE # set cpuid to zero 9625d83cbfaa44e1b9170c0941c3ef52ca39f54cccHeiko Carstens lpsw 0 # hopefully start new kernel... 97cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens 98cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens .align 8 99cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens load_psw: 100cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens .long 0x00080000,0x80000000 101cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens sys_msk: 102cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens .quad 0 1035d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens ctlregs: 1045d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens .rept 16 1055d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens .long 0 1065d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens .endr 1075d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens gprregs: 1085d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens .rept 16 1095d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens .long 0 1105d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens .endr 1115d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens have_diag308: 1125d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens .byte 0 1135d3f229fcd4409d3e182b204defc122eb7833535Heiko Carstens .align 8 114cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens relocate_kernel_end: 115144d634a21caff1d54cb4bb0d073774e88130045Jan Glauber .align 8 116cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens .globl relocate_kernel_len 117cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens relocate_kernel_len: 118cf13f0eaffa31bf6a145c53c589654b11c72ddc7Heiko Carstens .quad relocate_kernel_end - relocate_kernel 119