Home | History | Annotate | Line # | Download | only in altboot
entry.S revision 1.3
      1  1.3       phx /* $NetBSD: entry.S,v 1.3 2011/03/13 15:23:43 phx Exp $ */
      2  1.1  nisimura 
      3  1.1  nisimura #include <powerpc/psl.h>
      4  1.1  nisimura #include <powerpc/spr.h>
      5  1.1  nisimura #include <powerpc/oea/spr.h>
      6  1.1  nisimura #include <powerpc/oea/bat.h>
      7  1.1  nisimura #include <powerpc/oea/hid.h>
      8  1.1  nisimura 
      9  1.1  nisimura 	.text
     10  1.1  nisimura 	.globl _start
     11  1.1  nisimura _start:
     12  1.2       phx 	/*
     13  1.2       phx 	 * Save possible argc and argv values from the firmware, usually
     14  1.2       phx 	 * passed in r3 and r4.
     15  1.2       phx 	 * When started with "bootm", as a Linux kernel module, r6 and r7
     16  1.2       phx 	 * point to the start and end address of the bootargs.
     17  1.2       phx 	 */
     18  1.1  nisimura 	mr	30,3
     19  1.1  nisimura 	mr	31,4
     20  1.2       phx 	mr	28,6
     21  1.2       phx 	mr	29,7
     22  1.2       phx 
     23  1.2       phx 	/*
     24  1.2       phx 	 * U-Boot/PPCBoot forgets to flush the cache when using the "bootm"
     25  1.2       phx 	 * command, so we have to do that now.
     26  1.2       phx 	 */
     27  1.3       phx 	lis	11,_start@ha
     28  1.3       phx 	addi	11,11,_start@l
     29  1.3       phx 	andi.	11,11,~31@l
     30  1.3       phx 	lis	12,(_edata+31)@ha
     31  1.3       phx 	addi	12,12,(_edata+31)@l
     32  1.3       phx 	bl	syncicache
     33  1.2       phx 
     34  1.1  nisimura 	mfspr	11,SPR_HID0
     35  1.1  nisimura 	andi.	0,11,HID0_DCE
     36  1.1  nisimura 	ori	11,11,HID0_ICE
     37  1.1  nisimura 	ori	8,11,HID0_ICFI
     38  1.1  nisimura 	bne	1f			/* don't invalidate the D-cache */
     39  1.1  nisimura 	ori	8,8,HID0_DCFI		/* unless it wasn't enabled */
     40  1.1  nisimura 1:
     41  1.1  nisimura 	mfmsr	0
     42  1.1  nisimura 	andi.	0,0,PSL_DR
     43  1.1  nisimura 	beq	2f
     44  1.1  nisimura 	lis	5, 0xfec00000@ha	/* CONFIG_ADDR of PCI */
     45  1.1  nisimura 	lis	6, 0xfee00000@ha	/* CONFIG_DATA of PCI */
     46  1.1  nisimura 	mfspr	3,SPR_DBAT0U
     47  1.1  nisimura 	mfspr	4,SPR_DBAT0L
     48  1.1  nisimura 	bl	dbat_sanity_check
     49  1.1  nisimura 	beq	3f
     50  1.1  nisimura 	mfspr	3,SPR_DBAT1U
     51  1.1  nisimura 	mfspr	4,SPR_DBAT1L
     52  1.1  nisimura 	bl	dbat_sanity_check
     53  1.1  nisimura 	beq	3f
     54  1.1  nisimura 	mfspr	3,SPR_DBAT2U
     55  1.1  nisimura 	mfspr	4,SPR_DBAT2L
     56  1.1  nisimura 	bl	dbat_sanity_check
     57  1.1  nisimura 	beq	3f
     58  1.1  nisimura 	mfspr	3,SPR_DBAT3U
     59  1.1  nisimura 	mfspr	4,SPR_DBAT3L
     60  1.1  nisimura 	bl	dbat_sanity_check
     61  1.1  nisimura 	beq	3f
     62  1.1  nisimura 
     63  1.1  nisimura 2:	/* Disable D-cache */
     64  1.1  nisimura 	li	0,HID0_DCE
     65  1.1  nisimura 	andc	11,11,0
     66  1.1  nisimura 	b	4f
     67  1.1  nisimura 
     68  1.1  nisimura 3:	/* Enable D-cache */
     69  1.1  nisimura 	ori	11,11,HID0_DCE
     70  1.1  nisimura 
     71  1.1  nisimura 4:
     72  1.1  nisimura 	lis	1,BAT123@ha
     73  1.1  nisimura 	addi	1,1,BAT123@l
     74  1.1  nisimura 	lwz	3,0(1)
     75  1.1  nisimura 	lwz	4,4(1)
     76  1.1  nisimura 	mtdbatl	1,3
     77  1.1  nisimura 	mtdbatu	1,4
     78  1.1  nisimura 	lwz	3,8(1)
     79  1.1  nisimura 	lwz	4,12(1)
     80  1.1  nisimura 	mtdbatl	2,3
     81  1.1  nisimura 	mtdbatu	2,4
     82  1.1  nisimura 	lwz	3,16(1)
     83  1.1  nisimura 	lwz	4,20(1)
     84  1.1  nisimura 	mtdbatl	3,3
     85  1.1  nisimura 	mtdbatu	3,4
     86  1.1  nisimura 
     87  1.1  nisimura 	sync
     88  1.1  nisimura 	mtspr	SPR_HID0,8		/* enable and invalidate caches */
     89  1.1  nisimura 	sync
     90  1.1  nisimura 	mtspr	SPR_HID0,11		/* enable caches */
     91  1.1  nisimura 	sync
     92  1.1  nisimura 	isync
     93  1.1  nisimura 
     94  1.1  nisimura 	/* make sure .bss gets zeroed. */
     95  1.1  nisimura 	li	0,0
     96  1.1  nisimura 	lis	8,edata@ha
     97  1.1  nisimura 	addi	8,8,edata@l
     98  1.1  nisimura 	lis	9,end@ha
     99  1.1  nisimura 	addi	9,9,end@l
    100  1.1  nisimura 5:	cmpw	0,8,9			/* edata & end are >= word aligned */
    101  1.1  nisimura 	bge	6f
    102  1.1  nisimura 	stw	0,0(8)
    103  1.1  nisimura 	addi	8,8,4
    104  1.1  nisimura 	b	5b
    105  1.1  nisimura 
    106  1.1  nisimura 6:
    107  1.1  nisimura 	/* prepare stack at +1MB from _start. */
    108  1.1  nisimura 	lis	1,_start@h
    109  1.1  nisimura 	ori	1,1,_start@l
    110  1.1  nisimura 	addis	1,1,0x10
    111  1.1  nisimura 	addi	1,1,-4
    112  1.1  nisimura 
    113  1.1  nisimura 	bl	brdsetup
    114  1.1  nisimura 	mr	3,30
    115  1.1  nisimura 	mr	4,31
    116  1.2       phx 	mr	5,28
    117  1.2       phx 	mr	6,29
    118  1.1  nisimura 	bl	main
    119  1.1  nisimura 
    120  1.1  nisimura hang:	b	hang
    121  1.1  nisimura 	/* NOTREACHED */
    122  1.1  nisimura 
    123  1.1  nisimura dbat_sanity_check:
    124  1.1  nisimura 	andi.	0,3,BAT_Vs
    125  1.1  nisimura 	beq	2f
    126  1.1  nisimura 	andi.	0,4,BAT_I|BAT_PP_RW
    127  1.1  nisimura 	cmpwi	0,0,BAT_I|BAT_PP_RW
    128  1.1  nisimura 	bnelr
    129  1.1  nisimura 	rlwinm	0,3,15,4,14
    130  1.1  nisimura 	andis.	3,3,0xfffe0000@ha	/* BAT_EPI */
    131  1.1  nisimura 	andis.	4,4,BAT_RPN@ha
    132  1.1  nisimura 	cmplw	0,3,4
    133  1.1  nisimura 	bnelr
    134  1.1  nisimura 	add	4,4,0
    135  1.1  nisimura 	oris	4,4,0x0001ffff@ha
    136  1.1  nisimura 	ori	4,4,0x0001ffff@l
    137  1.1  nisimura 	cmplw	0,3,5
    138  1.1  nisimura 	bgt	1f
    139  1.1  nisimura 	cmplw	0,5,4
    140  1.1  nisimura 	bgt	1f
    141  1.1  nisimura 	li	5,0
    142  1.1  nisimura 1:	cmplw	0,3,6
    143  1.1  nisimura 	bgt	2f
    144  1.1  nisimura 	cmplw	0,6,4
    145  1.1  nisimura 	bgt	2f
    146  1.1  nisimura 	li	6,0
    147  1.1  nisimura 2:	cmplw	0,5,6
    148  1.1  nisimura 	blr
    149  1.1  nisimura 
    150  1.1  nisimura /*
    151  1.1  nisimura  * run(startsym, endsym, howto, bootinfo, entry)
    152  1.1  nisimura  */
    153  1.1  nisimura 	.globl	run
    154  1.1  nisimura run:
    155  1.1  nisimura 	mtctr	7 	/* hat trick jump to entry point */
    156  1.1  nisimura 	bctr
    157  1.1  nisimura 
    158  1.1  nisimura /*
    159  1.3       phx  * newaltboot(argc, argv, altboot_base, altboot_len)
    160  1.3       phx  * To be executed in a safe memory region. Copies the new altboot from
    161  1.3       phx  * altboot_base to 0x1000000 and starts it there.
    162  1.3       phx  */
    163  1.3       phx 	.globl	newaltboot
    164  1.3       phx newaltboot:
    165  1.3       phx 	lis	7,0x1000000@h
    166  1.3       phx 	mr	11,7
    167  1.3       phx 	subi	7,7,4
    168  1.3       phx 	subi	5,5,4
    169  1.3       phx 	add	12,11,6
    170  1.3       phx 	addi	6,6,3
    171  1.3       phx 	srawi	6,6,2
    172  1.3       phx 	mtctr	6
    173  1.3       phx 1:	lwzu	8,4(5)
    174  1.3       phx 	stwu	8,4(7)
    175  1.3       phx 	bdnz+	1b
    176  1.3       phx 	mtctr	11
    177  1.3       phx 	addi	12,12,31
    178  1.3       phx 	bl	syncicache
    179  1.3       phx 	bctr
    180  1.3       phx syncicache:
    181  1.3       phx /* r11=start, r12=end, r10=scratch */
    182  1.3       phx 	mr	10,11
    183  1.3       phx 2:	dcbst	0,10
    184  1.3       phx 	addi	10,10,32
    185  1.3       phx 	cmplw	10,12
    186  1.3       phx 	ble	2b
    187  1.3       phx 	sync
    188  1.3       phx 3:	icbi	0,11
    189  1.3       phx 	addi	11,11,32
    190  1.3       phx 	cmplw	11,12
    191  1.3       phx 	ble	3b
    192  1.3       phx 	sync
    193  1.3       phx 	isync
    194  1.3       phx 	blr
    195  1.3       phx 	.globl	newaltboot_end
    196  1.3       phx newaltboot_end:
    197  1.3       phx 
    198  1.3       phx /*
    199  1.1  nisimura  * reverse endian access to mimic outw/outl/inw/inl
    200  1.1  nisimura  */
    201  1.1  nisimura 	.globl out16rb
    202  1.1  nisimura 	.globl iohtole16
    203  1.1  nisimura out16rb:
    204  1.1  nisimura iohtole16:
    205  1.1  nisimura 	sthbrx	4,0,3
    206  1.1  nisimura 	eieio
    207  1.1  nisimura 	blr
    208  1.1  nisimura 
    209  1.1  nisimura 	.globl out32rb
    210  1.1  nisimura 	.globl iohtole32
    211  1.1  nisimura out32rb:
    212  1.1  nisimura iohtole32:
    213  1.1  nisimura 	stwbrx	4,0,3
    214  1.1  nisimura 	eieio
    215  1.1  nisimura 	blr
    216  1.1  nisimura 
    217  1.1  nisimura 	.global in16rb
    218  1.1  nisimura 	.global iole16toh
    219  1.1  nisimura in16rb:
    220  1.1  nisimura iole16toh:
    221  1.1  nisimura 	lhbrx	3,0,3
    222  1.1  nisimura 	eieio
    223  1.1  nisimura 	blr
    224  1.1  nisimura 
    225  1.1  nisimura 	.global in32rb
    226  1.1  nisimura 	.global iole32toh
    227  1.1  nisimura in32rb:
    228  1.1  nisimura iole32toh:
    229  1.1  nisimura 	lwbrx	3,0,3
    230  1.1  nisimura 	eieio
    231  1.1  nisimura 	blr
    232  1.1  nisimura 
    233  1.1  nisimura 	.data
    234  1.1  nisimura #define	xBATL(pa, wimg, pp)						\
    235  1.1  nisimura 	((pa) | (wimg) | (pp))
    236  1.1  nisimura #define	xBATU(va, len, v)						\
    237  1.1  nisimura 	((va) | ((len) & BAT_BL) | ((v) & BAT_V))
    238  1.1  nisimura BAT123:
    239  1.1  nisimura 	.long xBATL(0x80000000, BAT_I|BAT_G, BAT_PP_RW)
    240  1.1  nisimura 	.long xBATU(0x80000000, BAT_BL_256M, BAT_Vs)
    241  1.1  nisimura 	.long xBATL(0xfc000000, BAT_I|BAT_G, BAT_PP_RW)
    242  1.1  nisimura 	.long xBATU(0xfc000000, BAT_BL_64M, BAT_Vs)
    243  1.1  nisimura 	.long 0
    244  1.1  nisimura 	.long 0
    245