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