15f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/* 25f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Startup code for use with the u-boot bootloader. 35f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * 45f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Copyright (C) 2004-2006 Atmel Corporation 55f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * 65f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * This program is free software; you can redistribute it and/or modify 75f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * it under the terms of the GNU General Public License version 2 as 85f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * published by the Free Software Foundation. 95f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */ 105f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <asm/setup.h> 117a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann#include <asm/thread_info.h> 127a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann#include <asm/sysreg.h> 135f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 145f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen /* 155f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * The kernel is loaded where we want it to be and all caches 165f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * have just been flushed. We get two parameters from u-boot: 175f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * 185f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * r12 contains a magic number (ATAG_MAGIC) 195f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * r11 points to a tag table providing information about 205f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * the system. 215f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */ 225f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen .section .init.text,"ax" 235f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen .global _start 245f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen_start: 255f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen /* Initialize .bss */ 265f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen lddpc r2, bss_start_addr 275f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen lddpc r3, end_addr 285f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen mov r0, 0 295f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen mov r1, 0 305f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen1: st.d r2++, r0 315f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen cp r2, r3 325f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen brlo 1b 335f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 347a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann /* Initialize status register */ 357a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann lddpc r0, init_sr 367a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann mtsr SYSREG_SR, r0 377a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann 387a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann /* Set initial stack pointer */ 397a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann lddpc sp, stack_addr 407a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann sub sp, -THREAD_SIZE 417a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann 427a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann#ifdef CONFIG_FRAME_POINTER 437a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann /* Mark last stack frame */ 447a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann mov lr, 0 457a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann mov r7, 0 467a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann#endif 477a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann 487a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann /* Check if the boot loader actually provided a tag table */ 497a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann lddpc r0, magic_number 507a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann cp.w r12, r0 517a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann brne no_tag_table 527a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann 535f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen /* 545f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Save the tag table address for later use. This must be done 555f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * _after_ .bss has been initialized... 565f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */ 575f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen lddpc r0, tag_table_addr 585f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen st.w r0[0], r11 595f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 605f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen /* Jump to loader-independent setup code */ 615f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen rjmp kernel_entry 625f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 635f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen .align 2 645f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenmagic_number: 655f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen .long ATAG_MAGIC 665f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoentag_table_addr: 675f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen .long bootloader_tags 685f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenbss_start_addr: 695f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen .long __bss_start 705f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenend_addr: 715f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen .long _end 727a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmanninit_sr: 737a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann .long 0x007f0000 /* Supervisor mode, everything masked */ 747a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmannstack_addr: 757a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann .long init_thread_union 76d617b338bbfdd77e9cbd8e7dc949cee3dd73d575Andreas Bießmannpanic_addr: 77d617b338bbfdd77e9cbd8e7dc949cee3dd73d575Andreas Bießmann .long panic 785f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 795f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenno_tag_table: 805f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen sub r12, pc, (. - 2f) 81d617b338bbfdd77e9cbd8e7dc949cee3dd73d575Andreas Bießmann /* branch to panic() which can be far away with that construct */ 82d617b338bbfdd77e9cbd8e7dc949cee3dd73d575Andreas Bießmann lddpc pc, panic_addr 835f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen2: .asciz "Boot loader didn't provide correct magic number\n" 84