Linux Audio

Check our new training course

Loading...
/*
 * Copyright (c) 2013-2014 Wind River Systems, Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Reset handler
 *
 * Reset handler that prepares the system for running C code.
 */

#include <toolchain.h>
#include <linker/sections.h>
#include <arch/cpu.h>
#include <offsets_short.h>
#include "vector_table.h"

_ASM_FILE_PROLOGUE

GTEXT(__reset)
GDATA(_interrupt_stack)
GDATA(_svc_stack)
GDATA(_sys_stack)
GDATA(_fiq_stack)
GDATA(_abort_stack)
GDATA(_undef_stack)

#define STACK_MARGIN	4


/**
 *
 * @brief Reset vector
 *
 * Ran when the system comes out of reset. The processor is in thread mode with
 * privileged level. At this point, the main stack pointer (MSP) is already
 * pointing to a valid area in SRAM.
 *
 * When these steps are completed, jump to _PrepC(), which will finish setting
 * up the system for running C code.
 *
 * @return N/A
 */
SECTION_SUBSEC_FUNC(TEXT, _reset_section, __reset)
SECTION_SUBSEC_FUNC(TEXT,_reset_section,__start)
	mov r0,  #0
	mov r1,  #0
	mov r2,  #0
	mov r3,  #0
	mov r4,  #0
	mov r5,  #0
	mov r6,  #0
	mov r7,  #0
	mov r8,  #0
	mov r9,  #0
	mov r10, #0
	mov r11, #0
	mov r12, #0
	mov r14, #0

	/* lock interrupts: will get unlocked when switch to main task */
	cpsid if

	/* Setup FIQ stack */
	msr CPSR_c, #(MODE_FIQ | I_BIT | F_BIT)
	ldr sp, =(_fiq_stack + CONFIG_ARMV7_FIQ_STACK_SIZE - STACK_MARGIN)

	/* Setup IRQ stack */
	msr CPSR_c, #(MODE_IRQ | I_BIT | F_BIT)
	ldr sp, =(_interrupt_stack + CONFIG_ISR_STACK_SIZE - STACK_MARGIN)

	/* Setup data abort stack */
	msr CPSR_c, #(MODE_ABT | I_BIT | F_BIT)
	ldr sp, =(_abort_stack + CONFIG_ARMV7_EXCEPTION_STACK_SIZE - \
				STACK_MARGIN)

	/* Setup undefined mode stack */
	msr CPSR_c, #(MODE_UDF | I_BIT | F_BIT)
	ldr sp, =(_undef_stack + CONFIG_ARMV7_EXCEPTION_STACK_SIZE - \
				STACK_MARGIN)

	/* Setup SVC mode stack */
	msr CPSR_c, #(MODE_SVC | I_BIT | F_BIT)
	ldr sp, =(_svc_stack + CONFIG_ARMV7_SVC_STACK_SIZE - STACK_MARGIN)

	/* Setup System mode stack */
	msr CPSR_c, #(MODE_SYS | I_BIT | F_BIT)
	ldr sp, =(_sys_stack + CONFIG_ARMV7_SYS_STACK_SIZE - STACK_MARGIN)

	/* Setup system control register */
	mrc p15, 0, r0, c1, c0, 0	/* SCTLR */
	bic r0, r0, #HIVECS		/* Exception vectors from 0-0x1c */
	mcr p15, 0, r0, c1, c0, 0

#if defined(CONFIG_WDOG_INIT)
	/* board-specific watchdog initialization is necessary */
	bl _WdogInit
#endif

	b _PrepC