From b04b76c6a0c87ffc9670d356e793108411ce355a Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 7 Jun 2016 21:36:48 +0200 Subject: score: Simplify priority bit map implementation The priority bit map can deal with a maximum of 256 priority values ranging from 0 to 255. Consistently use an unsigned int for computation, due to the usual integer promotion rules. Make Priority_bit_map_Word definition architecture-independent and define it to uint16_t. This was already the case for all architectures except PowerPC. Adjust the PowerPC bitmap support accordingly. --- cpukit/score/cpu/arm/rtems/score/types.h | 2 - cpukit/score/cpu/bfin/rtems/score/types.h | 3 -- cpukit/score/cpu/epiphany/rtems/score/cpu.h | 1 - cpukit/score/cpu/epiphany/rtems/score/types.h | 1 - cpukit/score/cpu/i386/rtems/score/types.h | 1 - cpukit/score/cpu/lm32/rtems/score/types.h | 3 -- cpukit/score/cpu/m32c/rtems/score/types.h | 3 -- cpukit/score/cpu/m68k/rtems/score/types.h | 2 - cpukit/score/cpu/mips/rtems/score/types.h | 1 - cpukit/score/cpu/moxie/rtems/score/types.h | 1 - cpukit/score/cpu/nios2/rtems/score/types.h | 1 - cpukit/score/cpu/no_cpu/rtems/score/types.h | 3 -- cpukit/score/cpu/or1k/rtems/score/cpu.h | 1 - cpukit/score/cpu/or1k/rtems/score/types.h | 1 - cpukit/score/cpu/powerpc/rtems/score/cpu.h | 3 +- cpukit/score/cpu/powerpc/rtems/score/types.h | 1 - cpukit/score/cpu/sh/rtems/score/types.h | 2 - cpukit/score/cpu/sparc/rtems/score/types.h | 9 ---- cpukit/score/cpu/sparc64/rtems/score/types.h | 1 - cpukit/score/cpu/v850/rtems/score/types.h | 3 -- cpukit/score/include/rtems/score/prioritybitmap.h | 5 +- .../score/include/rtems/score/prioritybitmapimpl.h | 54 ++++++++-------------- 22 files changed, 21 insertions(+), 81 deletions(-) (limited to 'cpukit') diff --git a/cpukit/score/cpu/arm/rtems/score/types.h b/cpukit/score/cpu/arm/rtems/score/types.h index deefd54996..37a56df029 100644 --- a/cpukit/score/cpu/arm/rtems/score/types.h +++ b/cpukit/score/cpu/arm/rtems/score/types.h @@ -40,8 +40,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -typedef uint16_t Priority_bit_map_Word; - /** @} */ #ifdef __cplusplus diff --git a/cpukit/score/cpu/bfin/rtems/score/types.h b/cpukit/score/cpu/bfin/rtems/score/types.h index eaa8de6bd9..9865357cdd 100644 --- a/cpukit/score/cpu/bfin/rtems/score/types.h +++ b/cpukit/score/cpu/bfin/rtems/score/types.h @@ -34,9 +34,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -/** This defines the type for a priority bit map entry. */ -typedef uint16_t Priority_bit_map_Word; - /** This defines the return type for an ISR entry point. */ typedef void blackfin_isr; diff --git a/cpukit/score/cpu/epiphany/rtems/score/cpu.h b/cpukit/score/cpu/epiphany/rtems/score/cpu.h index e1dae21e40..9a6428aab4 100644 --- a/cpukit/score/cpu/epiphany/rtems/score/cpu.h +++ b/cpukit/score/cpu/epiphany/rtems/score/cpu.h @@ -699,7 +699,6 @@ typedef struct { #define CPU_MAXIMUM_PROCESSORS 32 #ifndef ASM -typedef uint16_t Priority_bit_map_Word; typedef struct { uint32_t r[62]; diff --git a/cpukit/score/cpu/epiphany/rtems/score/types.h b/cpukit/score/cpu/epiphany/rtems/score/types.h index 5b6c503739..24c8955fd3 100644 --- a/cpukit/score/cpu/epiphany/rtems/score/types.h +++ b/cpukit/score/cpu/epiphany/rtems/score/types.h @@ -53,7 +53,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -typedef uint16_t Priority_bit_map_Word; typedef void epiphany_isr; typedef void ( *epiphany_isr_entry )( void ); diff --git a/cpukit/score/cpu/i386/rtems/score/types.h b/cpukit/score/cpu/i386/rtems/score/types.h index 40ccecb1f8..00555d41b5 100644 --- a/cpukit/score/cpu/i386/rtems/score/types.h +++ b/cpukit/score/cpu/i386/rtems/score/types.h @@ -34,7 +34,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -typedef uint16_t Priority_bit_map_Word; typedef void i386_isr; typedef i386_isr ( *i386_isr_entry )( void ); diff --git a/cpukit/score/cpu/lm32/rtems/score/types.h b/cpukit/score/cpu/lm32/rtems/score/types.h index c0fc8a8a89..c3d8666de4 100644 --- a/cpukit/score/cpu/lm32/rtems/score/types.h +++ b/cpukit/score/cpu/lm32/rtems/score/types.h @@ -37,9 +37,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -/** This defines the type for a priority bit map entry. */ -typedef uint16_t Priority_bit_map_Word; - #ifdef __cplusplus } #endif diff --git a/cpukit/score/cpu/m32c/rtems/score/types.h b/cpukit/score/cpu/m32c/rtems/score/types.h index 11e0a0ceb4..99d8297143 100644 --- a/cpukit/score/cpu/m32c/rtems/score/types.h +++ b/cpukit/score/cpu/m32c/rtems/score/types.h @@ -34,9 +34,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef unsigned long CPU_Uint32ptr; -/** This defines the type for a priority bit map entry. */ -typedef uint16_t Priority_bit_map_Word; - /** This defines the return type for an ISR entry point. */ typedef void m32c_isr; diff --git a/cpukit/score/cpu/m68k/rtems/score/types.h b/cpukit/score/cpu/m68k/rtems/score/types.h index 96f9a4c37e..947c6ace69 100644 --- a/cpukit/score/cpu/m68k/rtems/score/types.h +++ b/cpukit/score/cpu/m68k/rtems/score/types.h @@ -34,8 +34,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -typedef uint16_t Priority_bit_map_Word; - #ifdef __cplusplus } #endif diff --git a/cpukit/score/cpu/mips/rtems/score/types.h b/cpukit/score/cpu/mips/rtems/score/types.h index 01950cecef..e3226a3bb4 100644 --- a/cpukit/score/cpu/mips/rtems/score/types.h +++ b/cpukit/score/cpu/mips/rtems/score/types.h @@ -43,7 +43,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -typedef uint16_t Priority_bit_map_Word; typedef void mips_isr; typedef void ( *mips_isr_entry )( void ); diff --git a/cpukit/score/cpu/moxie/rtems/score/types.h b/cpukit/score/cpu/moxie/rtems/score/types.h index 64427a831a..99402b0208 100644 --- a/cpukit/score/cpu/moxie/rtems/score/types.h +++ b/cpukit/score/cpu/moxie/rtems/score/types.h @@ -38,7 +38,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -typedef uint16_t Priority_bit_map_Word; typedef void moxie_isr; typedef void ( *moxie_isr_entry )( void ); diff --git a/cpukit/score/cpu/nios2/rtems/score/types.h b/cpukit/score/cpu/nios2/rtems/score/types.h index 6eaee5c829..23cf39419b 100644 --- a/cpukit/score/cpu/nios2/rtems/score/types.h +++ b/cpukit/score/cpu/nios2/rtems/score/types.h @@ -34,7 +34,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -typedef uint16_t Priority_bit_map_Word; typedef void nios2_isr; typedef void ( *nios2_isr_entry )( void ); diff --git a/cpukit/score/cpu/no_cpu/rtems/score/types.h b/cpukit/score/cpu/no_cpu/rtems/score/types.h index 94a93c2586..b330c33904 100644 --- a/cpukit/score/cpu/no_cpu/rtems/score/types.h +++ b/cpukit/score/cpu/no_cpu/rtems/score/types.h @@ -34,9 +34,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -/** This defines the type for a priority bit map entry. */ -typedef uint16_t Priority_bit_map_Word; - #ifdef __cplusplus } #endif diff --git a/cpukit/score/cpu/or1k/rtems/score/cpu.h b/cpukit/score/cpu/or1k/rtems/score/cpu.h index c75d9d8bad..33717bc6e2 100644 --- a/cpukit/score/cpu/or1k/rtems/score/cpu.h +++ b/cpukit/score/cpu/or1k/rtems/score/cpu.h @@ -687,7 +687,6 @@ typedef struct { #ifndef ASM typedef uint32_t CPU_Counter_ticks; -typedef uint16_t Priority_bit_map_Word; typedef struct { uint32_t r[32]; diff --git a/cpukit/score/cpu/or1k/rtems/score/types.h b/cpukit/score/cpu/or1k/rtems/score/types.h index b3beb8371f..09790feb29 100644 --- a/cpukit/score/cpu/or1k/rtems/score/types.h +++ b/cpukit/score/cpu/or1k/rtems/score/types.h @@ -39,7 +39,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -typedef uint16_t Priority_bit_map_Word; typedef void or1k_isr; typedef void ( *or1k_isr_entry )( void ); diff --git a/cpukit/score/cpu/powerpc/rtems/score/cpu.h b/cpukit/score/cpu/powerpc/rtems/score/cpu.h index beb5127d8f..7a0fa23dcf 100644 --- a/cpukit/score/cpu/powerpc/rtems/score/cpu.h +++ b/cpukit/score/cpu/powerpc/rtems/score/cpu.h @@ -981,6 +981,7 @@ void _CPU_Context_Initialize( { \ __asm__ volatile ("cntlzw %0, %1" : "=r" ((_output)), "=r" ((_value)) : \ "1" ((_value))); \ + (_output) = (_output) - 16; \ } /* end of Bitfield handler macros */ @@ -992,7 +993,7 @@ void _CPU_Context_Initialize( */ #define _CPU_Priority_Mask( _bit_number ) \ - ( 0x80000000 >> (_bit_number) ) + ( 0x8000u >> (_bit_number) ) /* * This routine translates the bit numbers returned by diff --git a/cpukit/score/cpu/powerpc/rtems/score/types.h b/cpukit/score/cpu/powerpc/rtems/score/types.h index f36038fe09..cdab30234d 100644 --- a/cpukit/score/cpu/powerpc/rtems/score/types.h +++ b/cpukit/score/cpu/powerpc/rtems/score/types.h @@ -51,7 +51,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -typedef uint32_t Priority_bit_map_Word; typedef void ppc_isr; #ifdef __cplusplus diff --git a/cpukit/score/cpu/sh/rtems/score/types.h b/cpukit/score/cpu/sh/rtems/score/types.h index d740b2f901..a449a6d6e3 100644 --- a/cpukit/score/cpu/sh/rtems/score/types.h +++ b/cpukit/score/cpu/sh/rtems/score/types.h @@ -44,8 +44,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -typedef uint16_t Priority_bit_map_Word; - typedef void sh_isr; typedef void ( *sh_isr_entry )( void ); diff --git a/cpukit/score/cpu/sparc/rtems/score/types.h b/cpukit/score/cpu/sparc/rtems/score/types.h index 4186012589..6419c9f15f 100644 --- a/cpukit/score/cpu/sparc/rtems/score/types.h +++ b/cpukit/score/cpu/sparc/rtems/score/types.h @@ -30,15 +30,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -/** - * @brief Priority bit map type. - * - * On the SPARC, there is no bitscan instruction and no penalty associated - * for using 16-bit variables. With no overriding architectural factors, - * just using a uint16_t. - */ -typedef uint16_t Priority_bit_map_Word; - /** * @brief SPARC ISR handler return type. * diff --git a/cpukit/score/cpu/sparc64/rtems/score/types.h b/cpukit/score/cpu/sparc64/rtems/score/types.h index c4d1c7f85e..faf50b7a55 100644 --- a/cpukit/score/cpu/sparc64/rtems/score/types.h +++ b/cpukit/score/cpu/sparc64/rtems/score/types.h @@ -33,7 +33,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -typedef uint16_t Priority_bit_map_Word; typedef void sparc_isr; typedef void ( *sparc_isr_entry )( void ); diff --git a/cpukit/score/cpu/v850/rtems/score/types.h b/cpukit/score/cpu/v850/rtems/score/types.h index a209d091f3..bfec49d284 100644 --- a/cpukit/score/cpu/v850/rtems/score/types.h +++ b/cpukit/score/cpu/v850/rtems/score/types.h @@ -34,9 +34,6 @@ extern "C" { /** Type that can store a 32-bit integer or a pointer. */ typedef uintptr_t CPU_Uint32ptr; -/** This defines the type for a priority bit map entry. */ -typedef uint16_t Priority_bit_map_Word; - #ifdef __cplusplus } #endif diff --git a/cpukit/score/include/rtems/score/prioritybitmap.h b/cpukit/score/include/rtems/score/prioritybitmap.h index f363fe4257..40638dd628 100644 --- a/cpukit/score/include/rtems/score/prioritybitmap.h +++ b/cpukit/score/include/rtems/score/prioritybitmap.h @@ -32,10 +32,7 @@ extern "C" { */ /**@{*/ -/* - * The definition of the Priority_bit_map_Word type is CPU dependent. - * - */ +typedef uint16_t Priority_bit_map_Word; typedef struct { /** diff --git a/cpukit/score/include/rtems/score/prioritybitmapimpl.h b/cpukit/score/include/rtems/score/prioritybitmapimpl.h index 492dbd398c..119e8376a1 100644 --- a/cpukit/score/include/rtems/score/prioritybitmapimpl.h +++ b/cpukit/score/include/rtems/score/prioritybitmapimpl.h @@ -20,7 +20,6 @@ #define _RTEMS_SCORE_PRIORITYBITMAPIMPL_H #include -#include #include @@ -65,8 +64,8 @@ extern const unsigned char _Bitfield_Leading_zeros[256]; #else #define _Bitfield_Find_first_bit( _value, _bit_number ) \ { \ - register uint32_t __value = (uint32_t) (_value); \ - register const unsigned char *__p = _Bitfield_Leading_zeros; \ + unsigned int __value = (_value); \ + const unsigned char *__p = _Bitfield_Leading_zeros; \ \ if ( __value < 0x100 ) \ (_bit_number) = (Priority_bit_map_Word)( __p[ __value ] + 8 ); \ @@ -108,22 +107,18 @@ extern const unsigned char _Bitfield_Leading_zeros[256]; * This function returns the major portion of the_priority. */ -RTEMS_INLINE_ROUTINE Priority_bit_map_Word _Priority_Major ( - Priority_Control the_priority -) +RTEMS_INLINE_ROUTINE unsigned int _Priority_Major( unsigned int the_priority ) { - return (Priority_bit_map_Word)( the_priority / 16 ); + return the_priority / 16; } /** * This function returns the minor portion of the_priority. */ -RTEMS_INLINE_ROUTINE Priority_bit_map_Word _Priority_Minor ( - Priority_Control the_priority -) +RTEMS_INLINE_ROUTINE unsigned int _Priority_Minor( unsigned int the_priority ) { - return (Priority_bit_map_Word)( the_priority % 16 ); + return the_priority % 16; } #if ( CPU_USE_GENERIC_BITFIELD_CODE == TRUE ) @@ -134,31 +129,20 @@ RTEMS_INLINE_ROUTINE Priority_bit_map_Word _Priority_Minor ( */ RTEMS_INLINE_ROUTINE Priority_bit_map_Word _Priority_Mask ( - uint32_t bit_number + unsigned int bit_number ) { return (Priority_bit_map_Word)(0x8000u >> bit_number); } -/** - * This function returns the mask bit inverted. - */ - -RTEMS_INLINE_ROUTINE Priority_bit_map_Word _Priority_Mask_invert ( - uint32_t mask -) -{ - return (Priority_bit_map_Word)(~mask); -} - /** * This function translates the bit numbers returned by the bit scan * of a priority bit field into something suitable for use as * a major or minor component of a priority. */ -RTEMS_INLINE_ROUTINE uint32_t _Priority_Bits_index ( - uint32_t bit_number +RTEMS_INLINE_ROUTINE unsigned int _Priority_Bits_index( + unsigned int bit_number ) { return bit_number; @@ -196,15 +180,15 @@ RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove ( bit_map->major_bit_map &= bit_map_info->block_major; } -RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( +RTEMS_INLINE_ROUTINE unsigned int _Priority_bit_map_Get_highest( const Priority_bit_map_Control *bit_map ) { - Priority_bit_map_Word minor; - Priority_bit_map_Word major; + unsigned int minor; + unsigned int major; /* Avoid problems with some inline ASM statements */ - Priority_bit_map_Word tmp; + unsigned int tmp; tmp = bit_map->major_bit_map; _Bitfield_Find_first_bit( tmp, major ); @@ -226,11 +210,11 @@ RTEMS_INLINE_ROUTINE bool _Priority_bit_map_Is_empty( RTEMS_INLINE_ROUTINE void _Priority_bit_map_Initialize_information( Priority_bit_map_Control *bit_map, Priority_bit_map_Information *bit_map_info, - Priority_Control new_priority + unsigned int new_priority ) { - Priority_bit_map_Word major; - Priority_bit_map_Word minor; + unsigned int major; + unsigned int minor; Priority_bit_map_Word mask; major = _Priority_Major( new_priority ); @@ -240,13 +224,11 @@ RTEMS_INLINE_ROUTINE void _Priority_bit_map_Initialize_information( mask = _Priority_Mask( major ); bit_map_info->ready_major = mask; - /* Add _Priority_Mask_invert to non-generic bitfield then change this code. */ - bit_map_info->block_major = (Priority_bit_map_Word)(~((uint32_t)mask)); + bit_map_info->block_major = (Priority_bit_map_Word) ~mask; mask = _Priority_Mask( minor ); bit_map_info->ready_minor = mask; - /* Add _Priority_Mask_invert to non-generic bitfield then change this code. */ - bit_map_info->block_minor = (Priority_bit_map_Word)(~((uint32_t)mask)); + bit_map_info->block_minor = (Priority_bit_map_Word) ~mask; } /** @} */ -- cgit v1.2.3