hdlg_start.S revision 1.1
11.1Snonaka/*	$NetBSD: hdlg_start.S,v 1.1 2006/04/16 02:22:33 nonaka Exp $	*/
21.1Snonaka
31.1Snonaka/*
41.1Snonaka * Copyright (c) 2002 Wasabi Systems, Inc.
51.1Snonaka * All rights reserved.
61.1Snonaka *
71.1Snonaka * Written by Jason R. Thorpe for Wasabi Systems, Inc.
81.1Snonaka *
91.1Snonaka * Redistribution and use in source and binary forms, with or without
101.1Snonaka * modification, are permitted provided that the following conditions
111.1Snonaka * are met:
121.1Snonaka * 1. Redistributions of source code must retain the above copyright
131.1Snonaka *    notice, this list of conditions and the following disclaimer.
141.1Snonaka * 2. Redistributions in binary form must reproduce the above copyright
151.1Snonaka *    notice, this list of conditions and the following disclaimer in the
161.1Snonaka *    documentation and/or other materials provided with the distribution.
171.1Snonaka * 3. All advertising materials mentioning features or use of this software
181.1Snonaka *    must display the following acknowledgement:
191.1Snonaka *	This product includes software developed for the NetBSD Project by
201.1Snonaka *	Wasabi Systems, Inc.
211.1Snonaka * 4. The name of Wasabi Systems, Inc. may not be used to endorse
221.1Snonaka *    or promote products derived from this software without specific prior
231.1Snonaka *    written permission.
241.1Snonaka *
251.1Snonaka * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
261.1Snonaka * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
271.1Snonaka * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
281.1Snonaka * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
291.1Snonaka * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
301.1Snonaka * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
311.1Snonaka * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
321.1Snonaka * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
331.1Snonaka * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
341.1Snonaka * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
351.1Snonaka * POSSIBILITY OF SUCH DAMAGE.
361.1Snonaka */
371.1Snonaka
381.1Snonaka#include <machine/asm.h>
391.1Snonaka#include <arm/armreg.h>
401.1Snonaka#include <arm/arm32/pte.h>
411.1Snonaka
421.1Snonaka	.section .start,"ax",%progbits
431.1Snonaka
441.1Snonaka	.global	_C_LABEL(hdlg_start)
451.1Snonaka_C_LABEL(hdlg_start):
461.1Snonaka	/*
471.1Snonaka	 * We will go ahead and disable the MMU here so that we don't
481.1Snonaka	 * have to worry about flushing caches, etc.
491.1Snonaka	 *
501.1Snonaka	 * Note that we may not currently be running VA==PA, which means
511.1Snonaka	 * we'll need to leap to the next insn after disabing the MMU.
521.1Snonaka	 */
531.1Snonaka	adr	r8, Lunmapped
541.1Snonaka	bic	r8, r8, #0xff000000	/* clear upper 8 bits */
551.1Snonaka	orr	r8, r8, #0xa0000000	/* OR in physical base address */
561.1Snonaka
571.1Snonaka	mrc	p15, 0, r2, c1, c0, 0
581.1Snonaka	bic	r2, r2, #CPU_CONTROL_MMU_ENABLE
591.1Snonaka	mcr	p15, 0, r2, c1, c0, 0
601.1Snonaka
611.1Snonaka	nop
621.1Snonaka	nop
631.1Snonaka	nop
641.1Snonaka
651.1Snonaka	mov	pc, r8			/* Heave-ho! */
661.1Snonaka
671.1SnonakaLunmapped:
681.1Snonaka	/* reloc */
691.1Snonaka	adr	r1, _C_LABEL(hdlg_start)
701.1Snonaka	adr	r0, .Lstart
711.1Snonaka	ldmia	r0, {r0, r2}
721.1Snonaka	bic	r0, r0, #0xff000000
731.1Snonaka	orr	r0, r0, #0xa0000000
741.1Snonaka	bic	r2, r2, #0xff000000
751.1Snonaka	orr	r2, r2, #0xa0000000
761.1Snonaka	sub	r2, r2, r0	/* size = _edata - start */
771.1Snonaka	cmp	r1, r0
781.1Snonaka	beq	.Lreloc_done	/* if (dst == src) */
791.1Snonaka	bcc	.Lreloc_backwards
801.1Snonaka
811.1Snonaka1:	ldrb	r3, [r1], #1
821.1Snonaka	strb	r3, [r0], #1
831.1Snonaka	subs	r2, r2, #1
841.1Snonaka	bne	1b
851.1Snonaka	b	.Lreloc
861.1Snonaka
871.1Snonaka.Lreloc_backwards:
881.1Snonaka	add	r0, r0, r2
891.1Snonaka	add	r1, r1, r2
901.1Snonaka	sub	r0, r0, #1
911.1Snonaka	sub	r1, r1, #1
921.1Snonaka1:	ldrb	r3, [r1], #-1
931.1Snonaka	strb	r3, [r0], #-1
941.1Snonaka	subs	r2, r2, #1
951.1Snonaka	bne	1b
961.1Snonaka
971.1Snonaka.Lreloc:
981.1Snonaka	ldr	r0, .Lreloc_done
991.1Snonaka	bic	r0, r0, #0xff000000
1001.1Snonaka	orr	r0, r0, #0xa0000000
1011.1Snonaka	mov	pc, r0
1021.1Snonaka
1031.1Snonaka.Lstart:
1041.1Snonaka	.word	_C_LABEL(hdlg_start)
1051.1Snonaka	.word	_edata
1061.1Snonaka
1071.1Snonaka.Lreloc_done:
1081.1Snonaka	.word	Lreloc_done
1091.1Snonaka
1101.1SnonakaLreloc_done:
1111.1Snonaka	/*
1121.1Snonaka	 * We want to construct a memory map that maps us
1131.1Snonaka	 * VA==PA (SDRAM at 0xa0000000) and also double-maps
1141.1Snonaka	 * that space at 0xc0000000 (where the kernel address
1151.1Snonaka	 * space starts).  We create these mappings uncached
1161.1Snonaka	 * and unbuffered to be safe.
1171.1Snonaka	 *
1181.1Snonaka	 * We also want to map the various devices we want to
1191.1Snonaka	 * talk to VA==PA during bootstrap.
1201.1Snonaka	 *
1211.1Snonaka	 * We just use section mappings for all of this to make it easy.
1221.1Snonaka	 *
1231.1Snonaka	 * We will put the L1 table to do all this at 0xa0004000, which
1241.1Snonaka	 * is also where RedBoot puts it.
1251.1Snonaka	 */
1261.1Snonaka
1271.1Snonaka	/*
1281.1Snonaka	 * Step 1: Map the entire address space VA==PA.
1291.1Snonaka	 */
1301.1Snonaka	adr	r0, Ltable
1311.1Snonaka	ldr	r0, [r0]			/* r0 = &l1table */
1321.1Snonaka
1331.1Snonaka	mov	r3, #(L1_S_AP(AP_KRW))
1341.1Snonaka	orr	r3, r3, #(L1_TYPE_S)
1351.1Snonaka	mov	r2, #0x100000			/* advance by 1MB */
1361.1Snonaka	mov	r1, #0x1000			/* 4096MB */
1371.1Snonaka1:
1381.1Snonaka	str	r3, [r0], #0x04
1391.1Snonaka	add	r3, r3, r2
1401.1Snonaka	subs	r1, r1, #1
1411.1Snonaka	bgt	1b
1421.1Snonaka
1431.1Snonaka	/*
1441.1Snonaka	 * Step 2: Map VA 0xc0000000->0xc7ffffff to PA 0xa0000000->0xa7ffffff.
1451.1Snonaka	 */
1461.1Snonaka	adr	r0, Ltable			/* r0 = &l1table */
1471.1Snonaka	ldr	r0, [r0]
1481.1Snonaka
1491.1Snonaka	mov	r3, #(L1_S_AP(AP_KRW))
1501.1Snonaka	orr	r3, r3, #(L1_TYPE_S)
1511.1Snonaka	orr	r3, r3, #0xa0000000
1521.1Snonaka	add	r0, r0, #(0xc00 * 4)		/* offset to 0xc00xxxxx */
1531.1Snonaka	mov	r1, #0x80			/* 128MB */
1541.1Snonaka1:
1551.1Snonaka	str	r3, [r0], #0x04
1561.1Snonaka	add	r3, r3, r2
1571.1Snonaka	subs	r1, r1, #1
1581.1Snonaka	bgt	1b
1591.1Snonaka
1601.1Snonaka	/* OK!  Page table is set up.  Give it to the CPU. */
1611.1Snonaka	adr	r0, Ltable			/* r0 = &l1table */
1621.1Snonaka	ldr	r0, [r0]
1631.1Snonaka	mcr	p15, 0, r0, c2, c0, 0
1641.1Snonaka
1651.1Snonaka	/* Flush the old TLBs, just in case. */
1661.1Snonaka	mcr	p15, 0, r0, c8, c7, 0
1671.1Snonaka
1681.1Snonaka	/* Set the Domain Access register.  Very important! */
1691.1Snonaka	mov	r0, #1
1701.1Snonaka	mcr	p15, 0, r0, c3, c0, 0
1711.1Snonaka
1721.1Snonaka	/* Get ready to jump to the "real" kernel entry point... */
1731.1Snonaka	ldr	r0, Lstart
1741.1Snonaka
1751.1Snonaka	/* OK, let's enable the MMU. */
1761.1Snonaka	mrc	p15, 0, r2, c1, c0, 0
1771.1Snonaka	orr	r2, r2, #CPU_CONTROL_MMU_ENABLE
1781.1Snonaka	mcr	p15, 0, r2, c1, c0, 0
1791.1Snonaka
1801.1Snonaka	nop
1811.1Snonaka	nop
1821.1Snonaka	nop
1831.1Snonaka
1841.1Snonaka	/* CPWAIT sequence to make sure the MMU is on... */
1851.1Snonaka	mrc	p15, 0, r2, c2, c0, 0	/* arbitrary read of CP15 */
1861.1Snonaka	mov	r2, r2			/* force it to complete */
1871.1Snonaka	mov	pc, r0			/* leap to kernel entry point! */
1881.1Snonaka
1891.1SnonakaLtable:
1901.1Snonaka	.word	0xa0004000
1911.1Snonaka
1921.1SnonakaLstart:
1931.1Snonaka	.word	start
194