From 3c7ed6b8cd505f696c9c2b6d90723094f334b348 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Wed, 6 Jul 2005 18:46:04 +0000 Subject: 2005-07-06 Markku Puro * .cvsignore, ChangeLog, Makefile.am, README, bsp_specs, configure.ac, clock/clockdrv.c, console/conio.c, console/console.c, console/defaultfont.c, include/arm_mode_bits.h, include/asm_macros.h, include/bsp.h, include/bspopts.h.in, include/conio.h, include/gba.h, include/gba_registers.h, include/tm27.h, irq/bsp_irq_asm.S, irq/bsp_irq_init.c, irq/irq.c, irq/irq.h, irq/irq_asm.S, irq/irq_init.c, start/logo.S, start/start.S, startup/bspstart.c, startup/cpu.c, startup/cpu_asm.S, startup/exit.c, startup/linkcmds, timer/timer.c: New files. --- c/src/lib/libbsp/arm/gba/startup/cpu.c | 170 +++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 c/src/lib/libbsp/arm/gba/startup/cpu.c (limited to 'c/src/lib/libbsp/arm/gba/startup/cpu.c') diff --git a/c/src/lib/libbsp/arm/gba/startup/cpu.c b/c/src/lib/libbsp/arm/gba/startup/cpu.c new file mode 100644 index 0000000000..3ce8e5de42 --- /dev/null +++ b/c/src/lib/libbsp/arm/gba/startup/cpu.c @@ -0,0 +1,170 @@ +/** + * @file cpu.c + * + * ARM CPU Dependent Source. + */ +/* + * RTEMS GBA BSP + * + * COPYRIGHT (c) 2000 Canon Research Centre France SA. + * Emmanuel Raguet, mailto:raguet@crf.canon.fr + * + * Copyright (c) 2002 Advent Networks, Inc + * Jay Monkman + * + * Copyright (c) 2004 + * Markku Puro + * + * The license and distribution terms for this file may be + * found in found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * @brief _CPU_Initialize routine performs processor dependent initialization + * + * @param cpu_table CPU table to initialize + * @param thread_dispatch address of ISR disptaching routine (unused) + * @return None + */ +void _CPU_Initialize( + rtems_cpu_table *cpu_table, + void (*thread_dispatch) /* ignored on this CPU */ +) +{ + _CPU_Table = *cpu_table; +} + +/** + * @brief _CPU_ISR_Get_level returns the current interrupt level + * + * @param None + * @return int level + */ +uint32_t _CPU_ISR_Get_level( void ) +{ + uint32_t reg = 0; /* to avoid warning */ + + asm volatile ("mrs %0, cpsr \n" \ + "and %0, %0, #0xc0 \n" \ + : "=r" (reg) \ + : "0" (reg) ); + return reg; +} + + +/** + * @brief _CPU_ISR_install_vector kernel routine installs the RTEMS handler for the + * specified vector + * + * @param vector interrupt vector number + * @param new_handler replacement ISR for this vector number + * @param old_handler pointer to store former ISR for this vector number + * @return None + * + * @todo Can't use exception vectors in GBA because they are already in GBA ROM BIOS!! + */ +extern __inline__ void _CPU_ISR_install_vector(uint32_t vector, proc_ptr new_handler, proc_ptr *old_handler); + +/** + * @brief _CPU_Context_Initialize kernel routine initialize the specified context + * + * @param the_context + * @param stack_base + * @param size + * @param new_level + * @param entry_point + * @param is_fp + * @return None + */ +void _CPU_Context_Initialize( + Context_Control *the_context, + uint32_t *stack_base, + uint32_t size, + uint32_t new_level, + void *entry_point, + boolean is_fp +) +{ + the_context->register_sp = (uint32_t)stack_base + size ; + the_context->register_lr = (uint32_t)entry_point; + the_context->register_cpsr = new_level | ModePriv; +} + + +/** + * @brief _CPU_Install_interrupt_stack function is empty since the BSP must set up the interrupt stacks. + * + * @todo Can't use exception vectors in GBA because they are already in GBA ROM BIOS!! + */ +extern __inline__ void _CPU_Install_interrupt_stack( void ); + +/** + * @brief _defaultExcHandler function is empty + * + * @todo Can't use exception vectors in GBA because they are already in GBA ROM BIOS!! + */ +extern void _defaultExcHandler (CPU_Exception_frame *ctx); + +/** + * @brief _currentExcHandler function is empty (_defaultExcHandler) + * + * @todo Can't use exception vectors in GBA because they are already in GBA ROM BIOS!! + */ +cpuExcHandlerType _currentExcHandler = _defaultExcHandler; +/* +extern void _Exception_Handler_Undef_Swi(); +extern void _Exception_Handler_Abort(); +extern void _exc_data_abort(); +*/ + +/** + * @brief rtems_exception_init_mngt function is empty since the BSP must set up the interrupt stacks. + * + * @todo Can't use exception vectors in GBA because they are already in GBA ROM BIOS!! + */ +extern __inline__ void rtems_exception_init_mngt(); + + +/** + * @brief do_data_abort function is empty + * + * This function figure out what caused the data abort + * + * @todo Can't use exception vectors in GBA because they are already in GBA ROM BIOS!! + * This function is supposed to figure out what caused the data abort, do that, then return. + * All unhandled instructions cause the system to hang. + */ +extern __inline__ void do_data_abort(uint32_t insn, uint32_t spsr, CPU_Exception_frame *ctx); + + +/* @todo Can't use exception vectors in GBA because they are already in GBA ROM BIOS!! */ +/* @todo Remove dummy functions needed by linker + ****************************************************************************************/ +/* @cond INCLUDE_ASM */ +asm (" .text"); +asm (" .arm"); +asm (" .global _CPU_ISR_install_vector"); +asm ("_CPU_ISR_install_vector:"); +asm (" .global _CPU_Install_interrupt_stack"); +asm ("_CPU_Install_interrupt_stack:"); +asm (" .global _defaultExcHandler"); +asm ("_defaultExcHandler:"); +asm (" .global rtems_exception_init_mngt"); +asm ("rtems_exception_init_mngt:"); +asm (" .global do_data_abort"); +asm ("do_data_abort:"); +asm (" mov pc, lr"); +/* @endcond */ + -- cgit v1.2.3