sun3-head.S 2.37 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include <linux/linkage.h>

#include <asm/page.h>
#include <asm/contregs.h>
#include <asm/sun3-head.h>

PSL_HIGHIPL     = 0x2700
NBSG            = 0x20000
ICACHE_ONLY	= 0x00000009
CACHES_OFF	= 0x00000008	| actually a clear and disable --m
#define MAS_STACK INT_STACK 
ROOT_TABLE_SIZE = 128
PAGESIZE	= 8192
SUN3_INVALID_PMEG = 255
15 16 17 18 19 20 21 22 23 24 25
.globl bootup_user_stack
.globl bootup_kernel_stack
.globl pg0
.globl empty_bad_page
.globl empty_bad_page_table
.globl empty_zero_page
.globl swapper_pg_dir
.globl kernel_pmd_table
.globl availmem
.global m68k_pgtable_cachemode
.global kpt
Linus Torvalds's avatar
Linus Torvalds committed
26
| todo: all these should be in bss!
27 28 29 30 31 32
swapper_pg_dir:                .skip 0x2000
pg0:                           .skip 0x2000
empty_bad_page:                .skip 0x2000
empty_bad_page_table:          .skip 0x2000
kernel_pmd_table:              .skip 0x2000
empty_zero_page:               .skip 0x2000
Linus Torvalds's avatar
Linus Torvalds committed
33

34 35
.globl kernel_pg_dir
.equ    kernel_pg_dir,kernel_pmd_table
Linus Torvalds's avatar
Linus Torvalds committed
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

	.section .head
ENTRY(_stext)
ENTRY(_start)

/* Firstly, disable interrupts and set up function codes. */
	movew	#PSL_HIGHIPL, %sr
	moveq	#FC_CONTROL, %d0	
	movec	%d0, %sfc	
	movec	%d0, %dfc	

/* Make sure we're in context zero. */
	moveq	#0, %d0
	movsb	%d0, AC_CONTEXT

/* map everything the bootloader left us into high memory, clean up the
   excess later */
	lea	(AC_SEGMAP+0),%a0 
	lea	(AC_SEGMAP+KERNBASE),%a1	
1:	
	movsb	%a0@, %d1
	movsb	%d1, %a1@
	cmpib	#SUN3_INVALID_PMEG, %d1
	beq	2f
	addl	#NBSG,%a0
	addl	#NBSG,%a1
	jmp	1b
	
2:				
	
/* Disable caches and jump to high code. */
	moveq	#ICACHE_ONLY,%d0	| Cache disabled until we're ready to enable it
	movc	%d0, %cacr	|   is this the right value? (yes --m)
	jmp	1f:l		

/* Following code executes at high addresses (0xE000xxx). */
72
1:	lea	init_task_union,%a2			| get initial thread...
Linus Torvalds's avatar
Linus Torvalds committed
73 74 75
	lea	%a2@(KTHREAD_SIZE),%sp			| ...and its stack.

/* copy bootinfo records from the loader to _end */
76
	lea	_end, %a1
Linus Torvalds's avatar
Linus Torvalds committed
77 78 79 80 81 82 83 84 85 86 87 88 89 90
	lea	BI_START, %a0
	/* number of longs to copy */
	movel	%a0@, %d0
1:	addl	#4, %a0
	movel   %a0@, %a1@
	addl	#4, %a1
	dbf	%d0, 1b
	
/* Point MSP at an invalid page to trap if it's used. --m */
	movl	#(PAGESIZE),%d0
	movc	%d0,%msp
	moveq	#-1,%d0
	movsb	%d0,(AC_SEGMAP+0x0)

91
	jbsr	sun3_init
Linus Torvalds's avatar
Linus Torvalds committed
92

93
	jbsr	base_trap_init
Linus Torvalds's avatar
Linus Torvalds committed
94
			
95
        jbsr    start_kernel
Linus Torvalds's avatar
Linus Torvalds committed
96 97 98 99
	trap	#15			

        .data
        .even
100
kpt:
Linus Torvalds's avatar
Linus Torvalds committed
101
        .long 0
102
availmem:
Linus Torvalds's avatar
Linus Torvalds committed
103 104
        .long 0
| todo: remove next two. --m
105
is_medusa:
Linus Torvalds's avatar
Linus Torvalds committed
106
        .long 0
107
m68k_pgtable_cachemode:
Linus Torvalds's avatar
Linus Torvalds committed
108 109
        .long 0