WSL2-Linux-Kernel/arch/m68knommu/platform/68328/head-de2.S

135 строки
1.8 KiB
ArmAsm

#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