| /* |
| * 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 |