diff options
author | Joel Sherrill <joel.sherrill@oarcorp.com> | 2015-05-26 10:17:03 -0500 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@oarcorp.com> | 2015-05-26 10:17:03 -0500 |
commit | 7c5f37d1af6df26b5c829c5f0a15aeb0dc811213 (patch) | |
tree | a5fc1ff23a618a9d0499e0314781e01f02bbdc74 | |
parent | Merge branch 'master' of ssh://dispatch.rtems.org/data/git/rtems (diff) | |
parent | sparc: Add static assertion (diff) | |
download | rtems-7c5f37d1af6df26b5c829c5f0a15aeb0dc811213.tar.bz2 |
Merge branch 'master' of ssh://dispatch.rtems.org/data/git/rtems
-rw-r--r-- | c/src/lib/libbsp/sparc/shared/irq_asm.S | 14 | ||||
-rw-r--r-- | cpukit/include/rtems/endian.h | 26 | ||||
-rw-r--r-- | cpukit/score/cpu/sparc/cpu.c | 37 | ||||
-rw-r--r-- | cpukit/score/cpu/sparc/rtems/score/cpu.h | 5 | ||||
-rw-r--r-- | cpukit/score/cpu/sparc64/rtems/score/cpu.h | 3 | ||||
-rw-r--r-- | testsuites/sptests/spcontext01/init.c | 56 | ||||
-rw-r--r-- | testsuites/sptests/spcontext01/spcontext01.scn | 11 |
7 files changed, 102 insertions, 50 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/irq_asm.S b/c/src/lib/libbsp/sparc/shared/irq_asm.S index 3e08795a2b..eef144fcab 100644 --- a/c/src/lib/libbsp/sparc/shared/irq_asm.S +++ b/c/src/lib/libbsp/sparc/shared/irq_asm.S @@ -259,8 +259,8 @@ SYM(_CPU_Context_restore): save %sp, -CPU_MINIMUM_STACK_FRAME_SIZE, %sp rd %psr, %o2 #if defined(RTEMS_SMP) - ! On SPARC the restore path needs also a valid executing context on SMP - ! to update the is executing indicator. + ! On SPARC the restore path needs also a valid executing context on SMP + ! to update the is executing indicator. mov %i0, %o0 #endif ba SYM(_CPU_Context_restore_heir) @@ -372,8 +372,6 @@ dont_do_the_window: * %l5 directly into the ISF below. */ -save_isf: - /* * Save the state of the interrupted task -- especially the global * registers -- in the Interrupt Stack Frame. Note that the ISF @@ -441,7 +439,7 @@ save_isf: nop #endif - ld [%g6 + PER_CPU_INTERRUPT_STACK_HIGH], %sp + ld [%g6 + PER_CPU_INTERRUPT_STACK_HIGH], %sp dont_switch_stacks: /* @@ -460,7 +458,7 @@ dont_switch_stacks: */ mov %l0, %g5 - and %l3, 0x0ff, %g4 + and %l3, 0x0ff, %g4 subcc %g4, 0x11, %g0 bl dont_fix_pil subcc %g4, 0x1f, %g0 @@ -474,7 +472,6 @@ dont_fix_pil: or %g5, SPARC_PSR_PIL_MASK, %g5 pil_fixed: wr %g5, SPARC_PSR_ET_MASK, %psr ! **** ENABLE TRAPS **** -dont_fix_pil2: /* * Vector to user's handler. @@ -609,7 +606,6 @@ isr_dispatch: ta SPARC_SWTRAP_IRQEN ! syscall (enable interrupts to same level) ! No, then clear out and return -allow_nest_again: ! Zero out ISR stack nesting prevention flag st %g0, [%g6 + SPARC_PER_CPU_ISR_DISPATCH_DISABLE] @@ -717,7 +713,7 @@ simple_return: good_task_window: mov %l0, %psr ! **** DISABLE TRAPS **** - nop; nop; nop + nop; nop; nop ! and restore condition codes. ld [%g1 + ISF_G1_OFFSET], %g1 ! restore g1 jmp %l1 ! transfer control and diff --git a/cpukit/include/rtems/endian.h b/cpukit/include/rtems/endian.h index 74ef1c4172..e6704779ac 100644 --- a/cpukit/include/rtems/endian.h +++ b/cpukit/include/rtems/endian.h @@ -8,7 +8,7 @@ #ifndef _RTEMS_ENDIAN_H #define _RTEMS_ENDIAN_H -#include <rtems.h> +#include <rtems/score/cpu.h> /* * BSD-style endian declaration @@ -95,7 +95,7 @@ static inline uint16_t htons( uint16_t _x ) static inline uint16_t rtems_uint16_from_little_endian( const uint8_t *data) { uint16_t value = 0; - ssize_t i = 0; + int i; for (i = 1; i >= 0; --i) { value = (uint16_t) ((value << 8) + data [i]); @@ -107,7 +107,7 @@ static inline uint16_t rtems_uint16_from_little_endian( const uint8_t *data) static inline uint32_t rtems_uint32_from_little_endian( const uint8_t *data) { uint32_t value = 0; - ssize_t i = 0; + int i; for (i = 3; i >= 0; --i) { value = (value << 8) + data [i]; @@ -119,7 +119,7 @@ static inline uint32_t rtems_uint32_from_little_endian( const uint8_t *data) static inline uint64_t rtems_uint64_from_little_endian( const uint8_t *data) { uint64_t value = 0; - ssize_t i = 0; + int i; for (i = 7; i >= 0; --i) { value = (value << 8) + (uint64_t) data [i]; @@ -131,7 +131,7 @@ static inline uint64_t rtems_uint64_from_little_endian( const uint8_t *data) static inline uint16_t rtems_uint16_from_big_endian( const uint8_t *data) { uint16_t value = 0; - size_t i = 0; + int i; for (i = 0; i < 2; ++i) { value = (uint16_t) ((value << 8) + data [i]); @@ -143,7 +143,7 @@ static inline uint16_t rtems_uint16_from_big_endian( const uint8_t *data) static inline uint32_t rtems_uint32_from_big_endian( const uint8_t *data) { uint32_t value = 0; - size_t i = 0; + int i; for (i = 0; i < 4; ++i) { value = (value << 8) + (uint32_t) data [i]; @@ -155,7 +155,7 @@ static inline uint32_t rtems_uint32_from_big_endian( const uint8_t *data) static inline uint64_t rtems_uint64_from_big_endian( const uint8_t *data) { uint64_t value = 0; - size_t i = 0; + int i; for (i = 0; i < 8; ++i) { value = (value << 8) + (uint64_t) data [i]; @@ -166,7 +166,7 @@ static inline uint64_t rtems_uint64_from_big_endian( const uint8_t *data) static inline void rtems_uint16_to_little_endian( uint16_t value, uint8_t *data) { - size_t i = 0; + int i; for (i = 0; i < 2; ++i) { data [i] = (uint8_t) value; @@ -176,7 +176,7 @@ static inline void rtems_uint16_to_little_endian( uint16_t value, uint8_t *data) static inline void rtems_uint32_to_little_endian( uint32_t value, uint8_t *data) { - size_t i = 0; + int i; for (i = 0; i < 4; ++i) { data [i] = (uint8_t) value; @@ -186,7 +186,7 @@ static inline void rtems_uint32_to_little_endian( uint32_t value, uint8_t *data) static inline void rtems_uint64_to_little_endian( uint64_t value, uint8_t *data) { - size_t i = 0; + int i; for (i = 0; i < 8; ++i) { data [i] = (uint8_t) value; @@ -196,7 +196,7 @@ static inline void rtems_uint64_to_little_endian( uint64_t value, uint8_t *data) static inline void rtems_uint16_to_big_endian( uint16_t value, uint8_t *data) { - ssize_t i = 0; + int i; for (i = 1; i >= 0; --i) { data [i] = (uint8_t) value; @@ -206,7 +206,7 @@ static inline void rtems_uint16_to_big_endian( uint16_t value, uint8_t *data) static inline void rtems_uint32_to_big_endian( uint32_t value, uint8_t *data) { - ssize_t i = 0; + int i; for (i = 3; i >= 0; --i) { data [i] = (uint8_t) value; @@ -216,7 +216,7 @@ static inline void rtems_uint32_to_big_endian( uint32_t value, uint8_t *data) static inline void rtems_uint64_to_big_endian( uint64_t value, uint8_t *data) { - ssize_t i = 0; + int i; for (i = 7; i >= 0; --i) { data [i] = (uint8_t) value; diff --git a/cpukit/score/cpu/sparc/cpu.c b/cpukit/score/cpu/sparc/cpu.c index 8941bca940..f96d1ea786 100644 --- a/cpukit/score/cpu/sparc/cpu.c +++ b/cpukit/score/cpu/sparc/cpu.c @@ -71,6 +71,43 @@ SPARC_ASSERT_OFFSET(isr_dispatch_disable, ISR_DISPATCH_DISABLE_STACK); SPARC_ASSERT_OFFSET(is_executing, SPARC_CONTEXT_CONTROL_IS_EXECUTING); #endif +#define SPARC_ASSERT_ISF_OFFSET(field, off) \ + RTEMS_STATIC_ASSERT( \ + offsetof(CPU_Interrupt_frame, field) == ISF_ ## off ## _OFFSET, \ + CPU_Interrupt_frame_offset_ ## field \ + ) + +SPARC_ASSERT_ISF_OFFSET(psr, PSR); +SPARC_ASSERT_ISF_OFFSET(pc, PC); +SPARC_ASSERT_ISF_OFFSET(npc, NPC); +SPARC_ASSERT_ISF_OFFSET(g1, G1); +SPARC_ASSERT_ISF_OFFSET(g2, G2); +SPARC_ASSERT_ISF_OFFSET(g3, G3); +SPARC_ASSERT_ISF_OFFSET(g4, G4); +SPARC_ASSERT_ISF_OFFSET(g5, G5); +SPARC_ASSERT_ISF_OFFSET(g7, G7); +SPARC_ASSERT_ISF_OFFSET(i0, I0); +SPARC_ASSERT_ISF_OFFSET(i1, I1); +SPARC_ASSERT_ISF_OFFSET(i2, I2); +SPARC_ASSERT_ISF_OFFSET(i3, I3); +SPARC_ASSERT_ISF_OFFSET(i4, I4); +SPARC_ASSERT_ISF_OFFSET(i5, I5); +SPARC_ASSERT_ISF_OFFSET(i6_fp, I6_FP); +SPARC_ASSERT_ISF_OFFSET(i7, I7); +SPARC_ASSERT_ISF_OFFSET(y, Y); +SPARC_ASSERT_ISF_OFFSET(tpc, TPC); + +RTEMS_STATIC_ASSERT( + sizeof(CPU_Interrupt_frame) == CONTEXT_CONTROL_INTERRUPT_FRAME_SIZE, + CPU_Interrupt_frame_size +); + +/* https://devel.rtems.org/ticket/2352 */ +RTEMS_STATIC_ASSERT( + sizeof(CPU_Interrupt_frame) % CPU_ALIGNMENT == 0, + CPU_Interrupt_frame_alignment +); + /* * _CPU_Initialize * diff --git a/cpukit/score/cpu/sparc/rtems/score/cpu.h b/cpukit/score/cpu/sparc/rtems/score/cpu.h index 64e87509b4..5d5f1e4aac 100644 --- a/cpukit/score/cpu/sparc/rtems/score/cpu.h +++ b/cpukit/score/cpu/sparc/rtems/score/cpu.h @@ -547,9 +547,6 @@ typedef struct { #define SPARC_CONTEXT_CONTROL_IS_EXECUTING_OFFSET 0x58 #endif -/** This defines the size of the context area for use in assembly. */ -#define CONTEXT_CONTROL_SIZE 0x68 - #ifndef ASM /** * @brief SPARC basic context. @@ -701,8 +698,6 @@ typedef struct { */ /** This macro defines an offset into the ISF for use in assembly. */ -#define ISF_STACK_FRAME_OFFSET 0x00 -/** This macro defines an offset into the ISF for use in assembly. */ #define ISF_PSR_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x00 /** This macro defines an offset into the ISF for use in assembly. */ #define ISF_PC_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x04 diff --git a/cpukit/score/cpu/sparc64/rtems/score/cpu.h b/cpukit/score/cpu/sparc64/rtems/score/cpu.h index a222c0b10a..baea12b948 100644 --- a/cpukit/score/cpu/sparc64/rtems/score/cpu.h +++ b/cpukit/score/cpu/sparc64/rtems/score/cpu.h @@ -388,8 +388,6 @@ typedef struct { #define ISR_DISPATCH_DISABLE_STACK_OFFSET 0xF8 #define ISR_PAD_OFFSET 0xFC -#define CONTEXT_CONTROL_SIZE 0x100 - /* * The floating point context area. */ @@ -518,7 +516,6 @@ typedef struct { * Offsets of fields with CPU_Interrupt_frame for assembly routines. */ -#define ISF_STACK_FRAME_OFFSET 0x00 #define ISF_TSTATE_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x00 #define ISF_TPC_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x08 #define ISF_TNPC_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x10 diff --git a/testsuites/sptests/spcontext01/init.c b/testsuites/sptests/spcontext01/init.c index d4bb4067ac..b0691ecaba 100644 --- a/testsuites/sptests/spcontext01/init.c +++ b/testsuites/sptests/spcontext01/init.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 embedded brains GmbH. All rights reserved. + * Copyright (c) 2013-2015 embedded brains GmbH. All rights reserved. * * embedded brains GmbH * Dornierstr. 4 @@ -30,7 +30,7 @@ const char rtems_test_name[] = "SPCONTEXT 1"; typedef struct { rtems_id control_task; - rtems_id validate_tasks[2]; + rtems_id validate_tasks[3]; rtems_id timer; size_t task_index; int iteration_counter; @@ -90,22 +90,22 @@ static void switch_priorities(test_context *self) { rtems_status_code sc; size_t index = self->task_index; - size_t next = (index + 1) & 0x1; - size_t task_high = index; - size_t task_low = next; + size_t next = (index + 1) % RTEMS_ARRAY_SIZE(self->validate_tasks); + size_t task_current_high = index; + size_t task_next_high = next; rtems_task_priority priority; self->task_index = next; sc = rtems_task_set_priority( - self->validate_tasks[task_high], + self->validate_tasks[task_next_high], PRIORITY_HIGH, &priority ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_priority( - self->validate_tasks[task_low], + self->validate_tasks[task_current_high], PRIORITY_LOW, &priority ); @@ -149,11 +149,17 @@ static void wait_for_finish(void) rtems_test_assert(out == FINISH_EVENT); } -static void test(test_context *self, bool task_0_fpu, bool task_1_fpu) +static void test( + test_context *self, + bool task_0_fpu, + bool task_1_fpu, + bool task_2_fpu +) { rtems_status_code sc; uintptr_t pattern_0 = (uintptr_t) 0xaaaaaaaaaaaaaaaaU; uintptr_t pattern_1 = (uintptr_t) 0x5555555555555555U; + uintptr_t pattern_2 = (uintptr_t) 0x0000000000000000U; memset(self, 0, sizeof(*self)); @@ -161,15 +167,21 @@ static void test(test_context *self, bool task_0_fpu, bool task_1_fpu) start_validate_task( &self->validate_tasks[0], pattern_0, - PRIORITY_LOW, + PRIORITY_HIGH, task_0_fpu ); start_validate_task( &self->validate_tasks[1], pattern_1, - PRIORITY_HIGH, + PRIORITY_LOW, task_1_fpu ); + start_validate_task( + &self->validate_tasks[2], + pattern_2, + PRIORITY_LOW, + task_2_fpu + ); start_timer(self); wait_for_finish(); @@ -179,6 +191,9 @@ static void test(test_context *self, bool task_0_fpu, bool task_1_fpu) sc = rtems_task_delete(self->validate_tasks[1]); rtems_test_assert(sc == RTEMS_SUCCESSFUL); + sc = rtems_task_delete(self->validate_tasks[2]); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + sc = rtems_timer_delete(self->timer); rtems_test_assert(sc == RTEMS_SUCCESSFUL); } @@ -226,16 +241,23 @@ static void test_context_is_executing(void) static void Init(rtems_task_argument arg) { test_context *self = &test_instance; + int i; + int j; + int k; TEST_BEGIN(); test_context_is_executing(); - test(self, false, false); - printf("Both tasks did not use FPU: done\n"); - test(self, false, true); - printf("One task used the FPU: done\n"); - test(self, true, true); - printf("Both tasks used the FPU: done\n"); + + for (i = 0; i < 2; ++i) { + for (j = 0; j < 2; ++j) { + for (k = 0; k < 2; ++k) { + printf("Test configuration %d %d %d... ", i, j, k); + test(self, i == 0, j == 0, k == 0); + printf("done\n"); + } + } + } TEST_END(); @@ -247,7 +269,7 @@ static void Init(rtems_task_argument arg) #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER -#define CONFIGURE_MAXIMUM_TASKS 3 +#define CONFIGURE_MAXIMUM_TASKS 4 #define CONFIGURE_MAXIMUM_TIMERS 1 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION diff --git a/testsuites/sptests/spcontext01/spcontext01.scn b/testsuites/sptests/spcontext01/spcontext01.scn index a76e00bb01..ceb2774da3 100644 --- a/testsuites/sptests/spcontext01/spcontext01.scn +++ b/testsuites/sptests/spcontext01/spcontext01.scn @@ -1,5 +1,10 @@ *** BEGIN OF TEST SPCONTEXT 1 *** -Both tasks did not use FPU: done -One task used the FPU: done -Both tasks used the FPU: done +Test configuration 0 0 0... done +Test configuration 0 0 1... done +Test configuration 0 1 0... done +Test configuration 0 1 1... done +Test configuration 1 0 0... done +Test configuration 1 0 1... done +Test configuration 1 1 0... done +Test configuration 1 1 1... done *** END OF TEST SPCONTEXT 1 *** |