| /* | |
| * linux/arch/sh/boot/romimage/head.S | |
| * | |
| * Board specific setup code, executed before zImage loader | |
| */ | |
| .text | |
| #include <asm/page.h> | |
| .global romstart | |
| romstart: | |
| /* include board specific setup code */ | |
| #include <mach/romimage.h> | |
| #ifdef CONFIG_ROMIMAGE_MMCIF | |
| /* load the romImage to above the empty zero page */ | |
| mov.l empty_zero_page_dst, r4 | |
| mov.l empty_zero_page_dst_adj, r5 | |
| add r5, r4 | |
| mov.l bytes_to_load, r5 | |
| mov.l loader_function, r7 | |
| jsr @r7 | |
| mov r4, r15 | |
| mov.l empty_zero_page_dst, r4 | |
| mov.l empty_zero_page_dst_adj, r5 | |
| add r5, r4 | |
| mov.l loaded_code_offs, r5 | |
| add r5, r4 | |
| jmp @r4 | |
| nop | |
| .balign 4 | |
| empty_zero_page_dst_adj: | |
| .long PAGE_SIZE | |
| bytes_to_load: | |
| .long end_data - romstart | |
| loader_function: | |
| .long mmcif_loader | |
| loaded_code_offs: | |
| .long loaded_code - romstart | |
| loaded_code: | |
| #endif /* CONFIG_ROMIMAGE_MMCIF */ | |
| /* copy the empty_zero_page contents to where vmlinux expects it */ | |
| mova extra_data_pos, r0 | |
| mov.l extra_data_size, r1 | |
| add r1, r0 | |
| mov.l empty_zero_page_dst, r1 | |
| mov #(PAGE_SHIFT - 4), r4 | |
| mov #1, r3 | |
| shld r4, r3 /* r3 = PAGE_SIZE / 16 */ | |
| 1: | |
| mov.l @r0, r4 | |
| mov.l @(4, r0), r5 | |
| mov.l @(8, r0), r6 | |
| mov.l @(12, r0), r7 | |
| add #16,r0 | |
| mov.l r4, @r1 | |
| mov.l r5, @(4, r1) | |
| mov.l r6, @(8, r1) | |
| mov.l r7, @(12, r1) | |
| dt r3 | |
| add #16,r1 | |
| bf 1b | |
| /* jump to the zImage entry point located after the zero page data */ | |
| mov #PAGE_SHIFT, r4 | |
| mov #1, r1 | |
| shld r4, r1 | |
| mova extra_data_pos, r0 | |
| add r1, r0 | |
| mov.l extra_data_size, r1 | |
| add r1, r0 | |
| jmp @r0 | |
| nop | |
| .align 2 | |
| empty_zero_page_dst: | |
| .long _text | |
| extra_data_pos: | |
| extra_data_size: | |
| .long zero_page_pos - extra_data_pos |