/******************************************************************************
 * @file     startup_ARMCA9.s
 * @brief    CMSIS Device System Source File for ARM Cortex-A9 Device Series
 * @version  V1.00
 * @date     01 Nov 2017
 *
 * @note
 *
 ******************************************************************************/
/*
 * Copyright (c) 2009-2017 ARM Limited. All rights reserved.
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the License); you may
 * not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

  MODULE  ?startup_ARMCA9

/*----------------------------------------------------------------------------
  Exception / Interrupt Handler
 *----------------------------------------------------------------------------*/
  PUBLIC  Reset_Handler
  PUBWEAK Undef_Handler
  PUBWEAK SVC_Handler
  PUBWEAK PAbt_Handler
  PUBWEAK DAbt_Handler
  PUBWEAK IRQ_Handler
  PUBWEAK FIQ_Handler

  SECTION SVC_STACK:DATA:NOROOT(3)
  SECTION IRQ_STACK:DATA:NOROOT(3)
  SECTION FIQ_STACK:DATA:NOROOT(3)
  SECTION ABT_STACK:DATA:NOROOT(3)
  SECTION UND_STACK:DATA:NOROOT(3)
  SECTION USR_STACK:DATA:NOROOT(3)

/*----------------------------------------------------------------------------
  Exception / Interrupt Vector Table
 *----------------------------------------------------------------------------*/

  section RESET:CODE:NOROOT(2)
  PUBLIC  Vectors

Vectors:
  LDR    PC, =Reset_Handler
  LDR    PC, =Undef_Handler
  LDR    PC, =SVC_Handler
  LDR    PC, =PAbt_Handler
  LDR    PC, =DAbt_Handler
  NOP
  LDR    PC, =IRQ_Handler
  LDR    PC, =FIQ_Handler


  section .text:CODE:NOROOT(2)

/*----------------------------------------------------------------------------
  Reset Handler called on controller reset
  *----------------------------------------------------------------------------*/
  EXTERN  SystemInit
  EXTERN  __iar_program_start

Reset_Handler:  

  // Mask interrupts
  CPSID   if

  // Put any cores other than 0 to sleep
  MRC     p15, 0, R0, c0, c0, 5
  ANDS    R0, R0, #3
goToSleep:
  WFINE
  BNE     goToSleep

  // Reset SCTLR Settings
  MRC     p15, 0, R0, c1, c0, 0 // Read CP15 System Control register
  BIC     R0, R0, #(0x1 << 12) // Clear I bit 12 to disable I Cache
  BIC     R0, R0, #(0x1 <<  2) // Clear C bit  2 to disable D Cache
  BIC     R0, R0, #0x1       // Clear M bit  0 to disable MMU
  BIC     R0, R0, #(0x1 << 11) // Clear Z bit 11 to disable branch prediction
  BIC     R0, R0, #(0x1 << 13) // Clear V bit 13 to disable hivecs
  MCR     p15, 0, R0, c1, c0, 0 // Write value back to CP15 System Control register
  ISB

  // Configure ACTLR
  MRC     p15, 0, r0, c1, c0, 1 // Read CP15 Auxiliary Control Register
  ORR     r0, r0, #(1 <<  1) // Enable L2 prefetch hint (UNK/WI since r4p1)
  MCR     p15, 0, r0, c1, c0, 1 // Write CP15 Auxiliary Control Register

  // Set Vector Base Address Register (VBAR) to point to this application's vector table
  LDR    R0, =Vectors
  MCR    p15, 0, R0, c12, c0, 0

  // Setup Stack for each exception mode
  CPS    #0x11
  LDR    SP, =SFE(FIQ_STACK)
  CPS    #0x12
  LDR    SP, =SFE(IRQ_STACK)
  CPS    #0x13
  LDR    SP, =SFE(SVC_STACK)
  CPS    #0x17
  LDR    SP, =SFE(ABT_STACK)
  CPS    #0x1B
  LDR    SP, =SFE(UND_STACK)
  CPS    #0x1F
  LDR    SP, =SFE(USR_STACK)

  // Call SystemInit
  BL     SystemInit

  // Unmask interrupts
  CPSIE  if

  // Call __iar_program_start
  BL     __iar_program_start

/*----------------------------------------------------------------------------
  Default Handler for Exceptions / Interrupts
 *----------------------------------------------------------------------------*/
Undef_Handler:
SVC_Handler:
PAbt_Handler:
DAbt_Handler:
IRQ_Handler:
FIQ_Handler:
Default_Handler:
  B .

  END
