18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/arch/sh/boot/romimage/head.S 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Board specific setup code, executed before zImage loader 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci.text 98c2ecf20Sopenharmony_ci #include <asm/page.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci .global romstart 128c2ecf20Sopenharmony_ciromstart: 138c2ecf20Sopenharmony_ci /* include board specific setup code */ 148c2ecf20Sopenharmony_ci#include <mach/romimage.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#ifdef CONFIG_ROMIMAGE_MMCIF 178c2ecf20Sopenharmony_ci /* load the romImage to above the empty zero page */ 188c2ecf20Sopenharmony_ci mov.l empty_zero_page_dst, r4 198c2ecf20Sopenharmony_ci mov.l empty_zero_page_dst_adj, r5 208c2ecf20Sopenharmony_ci add r5, r4 218c2ecf20Sopenharmony_ci mov.l bytes_to_load, r5 228c2ecf20Sopenharmony_ci mov.l loader_function, r7 238c2ecf20Sopenharmony_ci jsr @r7 248c2ecf20Sopenharmony_ci mov r4, r15 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci mov.l empty_zero_page_dst, r4 278c2ecf20Sopenharmony_ci mov.l empty_zero_page_dst_adj, r5 288c2ecf20Sopenharmony_ci add r5, r4 298c2ecf20Sopenharmony_ci mov.l loaded_code_offs, r5 308c2ecf20Sopenharmony_ci add r5, r4 318c2ecf20Sopenharmony_ci jmp @r4 328c2ecf20Sopenharmony_ci nop 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci .balign 4 358c2ecf20Sopenharmony_ciempty_zero_page_dst_adj: 368c2ecf20Sopenharmony_ci .long PAGE_SIZE 378c2ecf20Sopenharmony_cibytes_to_load: 388c2ecf20Sopenharmony_ci .long end_data - romstart 398c2ecf20Sopenharmony_ciloader_function: 408c2ecf20Sopenharmony_ci .long mmcif_loader 418c2ecf20Sopenharmony_ciloaded_code_offs: 428c2ecf20Sopenharmony_ci .long loaded_code - romstart 438c2ecf20Sopenharmony_ciloaded_code: 448c2ecf20Sopenharmony_ci#endif /* CONFIG_ROMIMAGE_MMCIF */ 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci /* copy the empty_zero_page contents to where vmlinux expects it */ 478c2ecf20Sopenharmony_ci mova extra_data_pos, r0 488c2ecf20Sopenharmony_ci mov.l extra_data_size, r1 498c2ecf20Sopenharmony_ci add r1, r0 508c2ecf20Sopenharmony_ci mov.l empty_zero_page_dst, r1 518c2ecf20Sopenharmony_ci mov #(PAGE_SHIFT - 4), r4 528c2ecf20Sopenharmony_ci mov #1, r3 538c2ecf20Sopenharmony_ci shld r4, r3 /* r3 = PAGE_SIZE / 16 */ 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci1: 568c2ecf20Sopenharmony_ci mov.l @r0, r4 578c2ecf20Sopenharmony_ci mov.l @(4, r0), r5 588c2ecf20Sopenharmony_ci mov.l @(8, r0), r6 598c2ecf20Sopenharmony_ci mov.l @(12, r0), r7 608c2ecf20Sopenharmony_ci add #16,r0 618c2ecf20Sopenharmony_ci mov.l r4, @r1 628c2ecf20Sopenharmony_ci mov.l r5, @(4, r1) 638c2ecf20Sopenharmony_ci mov.l r6, @(8, r1) 648c2ecf20Sopenharmony_ci mov.l r7, @(12, r1) 658c2ecf20Sopenharmony_ci dt r3 668c2ecf20Sopenharmony_ci add #16,r1 678c2ecf20Sopenharmony_ci bf 1b 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci /* jump to the zImage entry point located after the zero page data */ 708c2ecf20Sopenharmony_ci mov #PAGE_SHIFT, r4 718c2ecf20Sopenharmony_ci mov #1, r1 728c2ecf20Sopenharmony_ci shld r4, r1 738c2ecf20Sopenharmony_ci mova extra_data_pos, r0 748c2ecf20Sopenharmony_ci add r1, r0 758c2ecf20Sopenharmony_ci mov.l extra_data_size, r1 768c2ecf20Sopenharmony_ci add r1, r0 778c2ecf20Sopenharmony_ci jmp @r0 788c2ecf20Sopenharmony_ci nop 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci .align 2 818c2ecf20Sopenharmony_ciempty_zero_page_dst: 828c2ecf20Sopenharmony_ci .long _text 838c2ecf20Sopenharmony_ciextra_data_pos: 848c2ecf20Sopenharmony_ciextra_data_size: 858c2ecf20Sopenharmony_ci .long zero_page_pos - extra_data_pos 86