| /* SPDX-License-Identifier: GPL-2.0 */ | |
| #include <linux/init.h> | |
| #include <asm/thread_info.h> | |
| #if defined(CONFIG_CPU_H8300H) | |
| .h8300h | |
| #define SYSCR 0xfee012 | |
| #define IRAMTOP 0xffff20 | |
| #define NR_INT 64 | |
| #endif | |
| #if defined(CONFIG_CPU_H8S) | |
| .h8300s | |
| #define INTCR 0xffff31 | |
| #define IRAMTOP 0xffc000 | |
| #define NR_INT 128 | |
| #endif | |
| __HEAD | |
| .global _start | |
| _start: | |
| mov.l #IRAMTOP,sp | |
| #if !defined(CONFIG_H8300H_SIM) && \ | |
| !defined(CONFIG_H8S_SIM) | |
| jsr @lowlevel_init | |
| /* copy .data */ | |
| mov.l #_begin_data,er5 | |
| mov.l #_sdata,er6 | |
| mov.l #_edata,er4 | |
| sub.l er6,er4 | |
| shlr.l er4 | |
| shlr.l er4 | |
| 1: | |
| mov.l @er5+,er0 | |
| mov.l er0,@er6 | |
| adds #4,er6 | |
| dec.l #1,er4 | |
| bne 1b | |
| /* .bss clear */ | |
| mov.l #_sbss,er5 | |
| mov.l #_ebss,er4 | |
| sub.l er5,er4 | |
| shlr er4 | |
| shlr er4 | |
| sub.l er0,er0 | |
| 1: | |
| mov.l er0,@er5 | |
| adds #4,er5 | |
| dec.l #1,er4 | |
| bne 1b | |
| #else | |
| /* get cmdline from gdb */ | |
| jsr @0xcc | |
| ;; er0 - argc | |
| ;; er1 - argv | |
| mov.l #command_line,er3 | |
| adds #4,er1 | |
| dec.l #1,er0 | |
| beq 4f | |
| 1: | |
| mov.l @er1+,er2 | |
| 2: | |
| mov.b @er2+,r4l | |
| beq 3f | |
| mov.b r4l,@er3 | |
| adds #1,er3 | |
| bra 2b | |
| 3: | |
| mov.b #' ',r4l | |
| mov.b r4l,@er3 | |
| adds #1,er3 | |
| dec.l #1,er0 | |
| bne 1b | |
| subs #1,er3 | |
| mov.b #0,r4l | |
| mov.b r4l,@er3 | |
| 4: | |
| #endif | |
| sub.l er0,er0 | |
| jsr @h8300_fdt_init | |
| /* linux kernel start */ | |
| #if defined(CONFIG_CPU_H8300H) | |
| ldc #0xd0,ccr /* running kernel */ | |
| mov.l #SYSCR,er0 | |
| bclr #3,@er0 | |
| #endif | |
| #if defined(CONFIG_CPU_H8S) | |
| ldc #0x07,exr | |
| bclr #4,@INTCR:8 | |
| bset #5,@INTCR:8 /* Interrupt mode 2 */ | |
| ldc #0x90,ccr /* running kernel */ | |
| #endif | |
| mov.l #init_thread_union,sp | |
| add.l #0x2000,sp | |
| jsr @start_kernel | |
| 1: | |
| bra 1b | |
| #if defined(CONFIG_ROMKERNEL) | |
| /* interrupt vector */ | |
| .section .vectors,"ax" | |
| .long _start | |
| .long _start | |
| vector = 2 | |
| .rept NR_INT - 2 | |
| .long _interrupt_redirect_table+vector*4 | |
| vector = vector + 1 | |
| .endr | |
| #endif | |
| .end |