diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2005-07-06 18:46:04 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2005-07-06 18:46:04 +0000 |
commit | 3c7ed6b8cd505f696c9c2b6d90723094f334b348 (patch) | |
tree | 30da596d32865c2d042ece5735d16baeade7d17d /c/src/lib/libbsp/arm/gba/startup/cpu.c | |
parent | Add PR. (diff) | |
download | rtems-3c7ed6b8cd505f696c9c2b6d90723094f334b348.tar.bz2 |
2005-07-06 Markku Puro <markku.puro@kopteri.net>
* .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.
Diffstat (limited to 'c/src/lib/libbsp/arm/gba/startup/cpu.c')
-rw-r--r-- | c/src/lib/libbsp/arm/gba/startup/cpu.c | 170 |
1 files changed, 170 insertions, 0 deletions
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 <jmonkman@adventnetworks.com> + * + * Copyright (c) 2004 + * Markku Puro <markku.puro@kopteri.net> + * + * 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 <stdint.h> +#include <rtems/system.h> +#include <rtems.h> +#include <rtems/bspIo.h> +#include <rtems/score/isr.h> +#include <rtems/score/wkspace.h> +#include <rtems/score/thread.h> +#include <rtems/score/cpu.h> +#include <arm_mode_bits.h> + +/** + * @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 */ + |