entry.S revision 1.1
11.1Snisimura/*- 21.1Snisimura * Copyright (c) 2012 The NetBSD Foundation, Inc. 31.1Snisimura * All rights reserved. 41.1Snisimura * 51.1Snisimura * This code is derived from software contributed to The NetBSD Foundation 61.1Snisimura * by Paul Fleischer <paul@xpg.dk> 71.1Snisimura * 81.1Snisimura * Redistribution and use in source and binary forms, with or without 91.1Snisimura * modification, are permitted provided that the following conditions 101.1Snisimura * are met: 111.1Snisimura * 1. Redistributions of source code must retain the above copyright 121.1Snisimura * notice, this list of conditions and the following disclaimer. 131.1Snisimura * 2. Redistributions in binary form must reproduce the above copyright 141.1Snisimura * notice, this list of conditions and the following disclaimer in the 151.1Snisimura * documentation and/or other materials provided with the distribution. 161.1Snisimura * 171.1Snisimura * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 181.1Snisimura * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 191.1Snisimura * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 201.1Snisimura * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 211.1Snisimura * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 221.1Snisimura * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 231.1Snisimura * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 241.1Snisimura * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 251.1Snisimura * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 261.1Snisimura * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 271.1Snisimura * POSSIBILITY OF SUCH DAMAGE. 281.1Snisimura */ 291.1Snisimura 301.1Snisimura#define _LOCORE 311.1Snisimura#define _KERNEL 321.1Snisimura 331.1Snisimura#include <machine/asm.h> 341.1Snisimura#include <arm/armreg.h> 351.1Snisimura#include <arm/arm32/pte.h> 361.1Snisimura#include <arm/arm32/pmap.h> /* for PMAP_DOMAIN_KERNEL */ 371.1Snisimura 381.1Snisimura#include <arm/s3c2xx0/s3c2440reg.h> /* for S3C2440_SDRAM_START */ 391.1Snisimura 401.1Snisimura#ifndef SDRAM_START 411.1Snisimura#define SDRAM_START S3C2440_SDRAM_START 421.1Snisimura#endif 431.1Snisimura 441.1Snisimura#define LED1 (1<<5) 451.1Snisimura#define LED2 (1<<6) 461.1Snisimura#define LED3 (1<<7) 471.1Snisimura#define LED4 (1<<8) 481.1Snisimura 491.1Snisimura .text 501.1Snisimura .global _start 511.1Snisimura_start: 521.1Snisimura /* Get arguments from boot-loader (stored in r0 and r1) */ 531.1Snisimura adr r2, bootloader_args 541.1Snisimura stmia r2, {r0, r1} 551.1Snisimura 561.1Snisimura /* Disable interrupt */ 571.1Snisimura mrs r0, cpsr 581.1Snisimura orr r0, r0, #I32_bit 591.1Snisimura msr cpsr, r0 601.1Snisimura 611.1Snisimura /* Turn off all LEDS except LED2 */ 621.1Snisimura mov r1, #S3C2440_GPIO_BASE 631.1Snisimura add r1, r1, #0x14 641.1Snisimura ldr r3, [r1] 651.1Snisimura orr r3, r3, #LED1 /* LEDS are active-low, so we set their bit to turn them off */ 661.1Snisimura bic r3, r3, #LED2 671.1Snisimura orr r3, r3, #LED3 681.1Snisimura orr r3, r3, #LED4 691.1Snisimura str r3, [r1] 701.1Snisimura 711.1Snisimura /* Setup BANK6/7 memory map */ 721.1Snisimura mov r1, #S3C2440_MEMCTL_BASE 731.1Snisimura ldr r2, [r1, #MEMCTL_BANKSIZE] 741.1Snisimura bic r2, r2, #0x7 /* Clear the three lowest bits (BK67MAP) */ 751.1Snisimura add r2, r2, #0x1 /* Set BK67MAP to b001 = 64MB/64MB */ 761.1Snisimura str r2, [r1, #MEMCTL_BANKSIZE] 771.1Snisimura 781.1Snisimura /* Disable MMU for a while */ 791.1Snisimura mrc p15, 0, r2, c1, c0, 0 801.1Snisimura bic r2, r2, #CPU_CONTROL_MMU_ENABLE 811.1Snisimura mcr p15, 0, r2, c1, c0, 0 821.1Snisimura 831.1Snisimura nop 841.1Snisimura nop 851.1Snisimura nop 861.1Snisimura 871.1Snisimura ldr r0, LpageTable /* pagetable */ 881.1Snisimura adr r4, mmu_init_table 891.1Snisimura b 2f 901.1Snisimura1: 911.1Snisimura str r3, [r0, r2] 921.1Snisimura add r2, r2, #4 931.1Snisimura add r3, r3, #(L1_S_SIZE) 941.1Snisimura adds r1, r1, #-1 951.1Snisimura bhi 1b 961.1Snisimura2: 971.1Snisimura ldmia r4!, {r1,r2,r3} /* # of sections, PA|attr, VA */ 981.1Snisimura cmp r1, #0 991.1Snisimura bne 1b 1001.1Snisimura 1011.1Snisimura mcr p15, 0, r0, c2, c0, 0 /* Set TTB */ 1021.1Snisimura mcr p15, 0, r0, c8, c7, 0 /* Flush TLB */ 1031.1Snisimura 1041.1Snisimura /* Set the Domain Access register. Very important! */ 1051.1Snisimura mov r0, #((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT) 1061.1Snisimura mcr p15, 0, r0, c3, c0, 0 1071.1Snisimura 1081.1Snisimura /* Enable MMU */ 1091.1Snisimura mrc p15, 0, r0, c1, c0, 0 1101.1Snisimura orr r0, r0, #CPU_CONTROL_MMU_ENABLE 1111.1Snisimura mcr p15, 0, r0, c1, c0, 0 1121.1Snisimura 1131.1Snisimura nop 1141.1Snisimura nop 1151.1Snisimura nop 1161.1Snisimura 1171.1Snisimura /* Prepare stack */ 1181.1Snisimura adr r1, Lcrtsetup 1191.1Snisimura ldmia r1, {r1, r2, sp} 1201.1Snisimura sub r2, r2, r1 /* get zero init data */ 1211.1Snisimura mov r3, #0 1221.1Snisimura.L1: 1231.1Snisimura str r3, [r1], #0x0004 /* zero the bss */ 1241.1Snisimura subs r2, r2, #4 1251.1Snisimura bgt .L1 1261.1Snisimura 1271.1Snisimura 1281.1Snisimura adr r2, bootloader_args 1291.1Snisimura ldmia r2, {r0, r1} 1301.1Snisimura 1311.1Snisimura /* Jump to kernel code in TRUE VA */ 1321.1Snisimura ldr pc, Lstart 1331.1Snisimura 1341.1SnisimuraLstart: 1351.1Snisimura .word main 1361.1Snisimura 1371.1Snisimura .macro clock_data hdivn, pdivn, mdiv, pdiv, sdiv 1381.1Snisimura .word (\hdivn)<<1 | \pdivn 1391.1Snisimura .word (\mdiv)<<PLLCON_MDIV_SHIFT | (\pdiv)<<PLLCON_PDIV_SHIFT | (\sdiv)<<PLLCON_SDIV_SHIFT 1401.1Snisimura .endm 1411.1Snisimura 1421.1Snisimura#define MMU_INIT(va,pa,n_sec,attr) \ 1431.1Snisimura .word n_sec ; \ 1441.1Snisimura .word 4*((va)>>L1_S_SHIFT) ; \ 1451.1Snisimura .word (pa)|(attr) ; 1461.1Snisimura 1471.1Snisimurammu_init_table: 1481.1Snisimura /* fill all table VA==PA */ 1491.1Snisimura MMU_INIT(0x00000000, 0x00000000, 1<<(32-L1_S_SHIFT), L1_TYPE_S|L1_S_AP(AP_KRW)) 1501.1Snisimura /* map SDRAM VA==PA, WT cacheable */ 1511.1Snisimura MMU_INIT(SDRAM_START, SDRAM_START, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW)) 1521.1Snisimura /* map VA 0xc0000000..0xc3ffffff to PA 0x30000000..0x33ffffff */ 1531.1Snisimura MMU_INIT(0xc0000000, SDRAM_START, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW)) 1541.1Snisimura 1551.1Snisimura .word 0 /* end of table */ 1561.1Snisimura 1571.1SnisimuraLpageTable: 1581.1Snisimura .word 0x30000000 1591.1SnisimuraLcrtsetup: 1601.1Snisimura .word _edata /* Start of BSS */ 1611.1Snisimura .word _end /* End of BSS */ 1621.1Snisimura .word 0x30A00000 /* Place stack-bottom at load-point of libsa bootloader */ 1631.1Snisimura 1641.1Snisimura .global _C_LABEL(bootloader_args) 1651.1Snisimura_C_LABEL(bootloader_args): 1661.1Snisimura .space 8 /* Two registers */ 167