diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-05-07 10:14:55 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-05-10 12:10:14 +0200 |
commit | 39993d6d7693b9fd26d729efd199cc605cd2ae65 (patch) | |
tree | d06b29ef4cd1d68223c25e9de9069b445bf4aed1 /cpukit/score/cpu/nios2 | |
parent | arm: Add FUNCTION_THUMB_ENTRY(), etc. (diff) | |
download | rtems-39993d6d7693b9fd26d729efd199cc605cd2ae65.tar.bz2 |
score: Add CPU context validation
Diffstat (limited to 'cpukit/score/cpu/nios2')
-rw-r--r-- | cpukit/score/cpu/nios2/Makefile.am | 2 | ||||
-rw-r--r-- | cpukit/score/cpu/nios2/nios2-context-validate.S | 146 | ||||
-rw-r--r-- | cpukit/score/cpu/nios2/nios2-context-volatile-clobber.S | 42 | ||||
-rw-r--r-- | cpukit/score/cpu/nios2/rtems/score/cpu.h | 4 |
4 files changed, 194 insertions, 0 deletions
diff --git a/cpukit/score/cpu/nios2/Makefile.am b/cpukit/score/cpu/nios2/Makefile.am index 27bfb3065e..6fdc786a2c 100644 --- a/cpukit/score/cpu/nios2/Makefile.am +++ b/cpukit/score/cpu/nios2/Makefile.am @@ -23,6 +23,8 @@ noinst_LIBRARIES = libscorecpu.a libscorecpu_a_SOURCES = libscorecpu_a_SOURCES += nios2-context-initialize.c libscorecpu_a_SOURCES += nios2-context-switch.S +libscorecpu_a_SOURCES += nios2-context-validate.S +libscorecpu_a_SOURCES += nios2-context-volatile-clobber.S libscorecpu_a_SOURCES += nios2-eic-il-low-level.S libscorecpu_a_SOURCES += nios2-eic-rsie-low-level.S libscorecpu_a_SOURCES += nios2-exception-frame-print.c diff --git a/cpukit/score/cpu/nios2/nios2-context-validate.S b/cpukit/score/cpu/nios2/nios2-context-validate.S new file mode 100644 index 0000000000..9a5f5e177e --- /dev/null +++ b/cpukit/score/cpu/nios2/nios2-context-validate.S @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2013 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * <rtems@embedded-brains.de> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include <rtems/asm.h> + +#define FRAME_OFFSET_R16 0 +#define FRAME_OFFSET_R17 4 +#define FRAME_OFFSET_R18 8 +#define FRAME_OFFSET_R19 12 +#define FRAME_OFFSET_R20 16 +#define FRAME_OFFSET_R21 20 +#define FRAME_OFFSET_R22 24 +#define FRAME_OFFSET_R23 28 +#define FRAME_OFFSET_FP 32 +#define FRAME_OFFSET_RA 36 + +#define FRAME_SIZE (FRAME_OFFSET_RA + 4) + + .set noat + .section .text + + .global _CPU_Context_validate + +_CPU_Context_validate: + + /* Save */ + subi sp, sp, FRAME_SIZE + stw r16, FRAME_OFFSET_R16(sp) + stw r17, FRAME_OFFSET_R17(sp) + stw r18, FRAME_OFFSET_R18(sp) + stw r19, FRAME_OFFSET_R19(sp) + stw r20, FRAME_OFFSET_R20(sp) + stw r21, FRAME_OFFSET_R21(sp) + stw r22, FRAME_OFFSET_R22(sp) + stw r23, FRAME_OFFSET_R23(sp) + stw fp, FRAME_OFFSET_FP(sp) + stw ra, FRAME_OFFSET_RA(sp) + + /* Fill */ + + /* AT contains the stack pointer */ + mov at, sp + + /* R2 is used for temporary values */ + + subi r3, r4, 1 + addi r5, r4, 1 + addi r6, r4, 2 + addi r7, r4, 3 + addi r8, r4, 4 + addi r9, r4, 5 + addi r10, r4, 6 + addi r11, r4, 7 + addi r12, r4, 8 + addi r13, r4, 9 + addi r14, r4, 10 + addi r15, r4, 11 + addi r16, r4, 12 + addi r17, r4, 13 + addi r18, r4, 14 + addi r19, r4, 15 + addi r20, r4, 16 + addi r21, r4, 17 + addi r22, r4, 18 + addi r23, r4, 19 + addi fp, r4, 20 + addi ra, r4, 21 + + /* Check */ +check: + bne sp, at, restore + subi r2, r4, 1 + bne r2, r3, restore + addi r2, r4, 1 + bne r2, r5, restore + addi r2, r4, 2 + bne r2, r6, restore + addi r2, r4, 3 + bne r2, r7, restore + addi r2, r4, 4 + bne r2, r8, restore + addi r2, r4, 5 + bne r2, r9, restore + addi r2, r4, 6 + bne r2, r10, restore + addi r2, r4, 7 + bne r2, r11, restore + addi r2, r4, 8 + bne r2, r12, restore + addi r2, r4, 9 + bne r2, r13, restore + addi r2, r4, 10 + bne r2, r14, restore + addi r2, r4, 11 + bne r2, r15, restore + addi r2, r4, 12 + bne r2, r16, restore + addi r2, r4, 13 + bne r2, r17, restore + addi r2, r4, 14 + bne r2, r18, restore + addi r2, r4, 15 + bne r2, r19, restore + addi r2, r4, 16 + bne r2, r20, restore + addi r2, r4, 17 + bne r2, r21, restore + addi r2, r4, 18 + bne r2, r22, restore + addi r2, r4, 19 + bne r2, r23, restore + addi r2, r4, 20 + bne r2, fp, restore + addi r2, r4, 21 + bne r2, ra, restore + br check + + /* Restore */ +restore: + ldw ra, FRAME_OFFSET_RA(sp) + ldw fp, FRAME_OFFSET_FP(sp) + ldw r23, FRAME_OFFSET_R23(sp) + ldw r22, FRAME_OFFSET_R22(sp) + ldw r21, FRAME_OFFSET_R21(sp) + ldw r20, FRAME_OFFSET_R20(sp) + ldw r19, FRAME_OFFSET_R19(sp) + ldw r18, FRAME_OFFSET_R18(sp) + ldw r17, FRAME_OFFSET_R17(sp) + ldw r16, FRAME_OFFSET_R16(sp) + addi sp, sp, FRAME_SIZE + ret diff --git a/cpukit/score/cpu/nios2/nios2-context-volatile-clobber.S b/cpukit/score/cpu/nios2/nios2-context-volatile-clobber.S new file mode 100644 index 0000000000..7b484e7cd4 --- /dev/null +++ b/cpukit/score/cpu/nios2/nios2-context-volatile-clobber.S @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2013 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * <rtems@embedded-brains.de> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include <rtems/asm.h> + + .set noat + .section .text + + .global _CPU_Context_volatile_clobber + +_CPU_Context_volatile_clobber: + + subi at, r4, 11 + subi r2, r4, 12 + subi r3, r4, 13 + subi r5, r4, 1 + subi r6, r4, 2 + subi r7, r4, 3 + subi r8, r4, 4 + subi r9, r4, 5 + subi r10, r4, 6 + subi r11, r4, 7 + subi r12, r4, 8 + subi r13, r4, 9 + subi r14, r4, 10 + subi r15, r4, 11 + ret diff --git a/cpukit/score/cpu/nios2/rtems/score/cpu.h b/cpukit/score/cpu/nios2/rtems/score/cpu.h index b0e94c5a31..d3b50463dc 100644 --- a/cpukit/score/cpu/nios2/rtems/score/cpu.h +++ b/cpukit/score/cpu/nios2/rtems/score/cpu.h @@ -333,6 +333,10 @@ void _CPU_Context_restore( Context_Control *new_context ) RTEMS_COMPILER_NO_RETURN_ATTRIBUTE; +void _CPU_Context_volatile_clobber( uintptr_t pattern ); + +void _CPU_Context_validate( uintptr_t pattern ); + void _CPU_Exception_frame_print( const CPU_Exception_frame *frame ); static inline uint32_t CPU_swap_u32( uint32_t value ) |