summaryrefslogtreecommitdiffstats
path: root/arch/m68k/platform/68328/head-de2.S
blob: f632fdcb93e913b218b7e5a7743d089ac0f8172f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#define	MEM_END	0x00800000	/* Memory size 8Mb */

#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