136 lines
1.8 KiB
ArmAsm
136 lines
1.8 KiB
ArmAsm
|
#include <linux/config.h>
|
||
|
|
||
|
#if defined(CONFIG_RAM32MB)
|
||
|
#define MEM_END 0x02000000 /* Memory size 32Mb */
|
||
|
#elif defined(CONFIG_RAM16MB)
|
||
|
#define MEM_END 0x01000000 /* Memory size 16Mb */
|
||
|
#else
|
||
|
#define MEM_END 0x00800000 /* Memory size 8Mb */
|
||
|
#endif
|
||
|
|
||
|
#undef CRT_DEBUG
|
||
|
|
||
|
.macro PUTC CHAR
|
||
|
#ifdef CRT_DEBUG
|
||
|
moveq #\CHAR, %d7
|
||
|
jsr putc
|
||
|
#endif
|
||
|
.endm
|
||
|
|
||
|
.global _start
|
||
|
.global _rambase
|
||
|
.global _ramvec
|
||
|
.global _ramstart
|
||
|
.global _ramend
|
||
|
|
||
|
.data
|
||
|
|
||
|
/*
|
||
|
* Set up the usable of RAM stuff
|
||
|
*/
|
||
|
_rambase:
|
||
|
.long 0
|
||
|
_ramvec:
|
||
|
.long 0
|
||
|
_ramstart:
|
||
|
.long 0
|
||
|
_ramend:
|
||
|
.long 0
|
||
|
|
||
|
.text
|
||
|
|
||
|
_start:
|
||
|
|
||
|
/*
|
||
|
* Setup initial stack
|
||
|
*/
|
||
|
/* disable all interrupts */
|
||
|
movew #0x2700, %sr
|
||
|
movel #-1, 0xfffff304
|
||
|
movel #MEM_END-4, %sp
|
||
|
|
||
|
PUTC '\r'
|
||
|
PUTC '\n'
|
||
|
PUTC 'A'
|
||
|
PUTC 'B'
|
||
|
|
||
|
/*
|
||
|
* Determine end of RAM
|
||
|
*/
|
||
|
|
||
|
movel #MEM_END, %a0
|
||
|
movel %a0, _ramend
|
||
|
|
||
|
PUTC 'C'
|
||
|
|
||
|
/*
|
||
|
* Move ROM filesystem above bss :-)
|
||
|
*/
|
||
|
|
||
|
moveal #_sbss, %a0 /* romfs at the start of bss */
|
||
|
moveal #_ebss, %a1 /* Set up destination */
|
||
|
movel %a0, %a2 /* Copy of bss start */
|
||
|
|
||
|
movel 8(%a0), %d1 /* Get size of ROMFS */
|
||
|
addql #8, %d1 /* Allow for rounding */
|
||
|
andl #0xfffffffc, %d1 /* Whole words */
|
||
|
|
||
|
addl %d1, %a0 /* Copy from end */
|
||
|
addl %d1, %a1 /* Copy from end */
|
||
|
movel %a1, _ramstart /* Set start of ram */
|
||
|
|
||
|
1:
|
||
|
movel -(%a0), %d0 /* Copy dword */
|
||
|
movel %d0, -(%a1)
|
||
|
cmpl %a0, %a2 /* Check if at end */
|
||
|
bne 1b
|
||
|
|
||
|
PUTC 'D'
|
||
|
|
||
|
/*
|
||
|
* Initialize BSS segment to 0
|
||
|
*/
|
||
|
|
||
|
lea _sbss, %a0
|
||
|
lea _ebss, %a1
|
||
|
|
||
|
/* Copy 0 to %a0 until %a0 == %a1 */
|
||
|
2: cmpal %a0, %a1
|
||
|
beq 1f
|
||
|
clrl (%a0)+
|
||
|
bra 2b
|
||
|
1:
|
||
|
|
||
|
PUTC 'E'
|
||
|
|
||
|
/*
|
||
|
* Load the current task pointer and stack
|
||
|
*/
|
||
|
|
||
|
lea init_thread_union, %a0
|
||
|
lea 0x2000(%a0), %sp
|
||
|
|
||
|
PUTC 'F'
|
||
|
PUTC '\r'
|
||
|
PUTC '\n'
|
||
|
|
||
|
/*
|
||
|
* Go
|
||
|
*/
|
||
|
|
||
|
jmp start_kernel
|
||
|
|
||
|
/*
|
||
|
* Local functions
|
||
|
*/
|
||
|
|
||
|
#ifdef CRT_DEBUG
|
||
|
putc:
|
||
|
moveb %d7, 0xfffff907
|
||
|
1:
|
||
|
movew 0xfffff906, %d7
|
||
|
andw #0x2000, %d7
|
||
|
beq 1b
|
||
|
rts
|
||
|
#endif
|