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(-) diff --git a/cpukit/score/cpu/arm/rtems/score/types.h b/cpukit/score/cpu/arm/rtems/score/types.h index deefd54..37a56df 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 eaa8de6..9865357 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 e1dae21..9a6428a 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 5b6c503..24c8955 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 40ccecb..00555d4 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 c0fc8a8..c3d8666 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 11e0a0c..99d8297 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 96f9a4c..947c6ac 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 01950ce..e3226a3 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 64427a8..99402b0 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 6eaee5c..23cf394 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 94a93c2..b330c33 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 c75d9d8..33717bc 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 b3beb83..09790fe 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 beb5127..7a0fa23 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 f36038f..cdab302 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 d740b2f..a449a6d 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 4186012..6419c9f 100644 --- a/cpukit/score/cpu/sparc/rtems/score/types.h +++ b/cpukit/score/cpu/sparc/rtems/score/types.h @@ -31,15 +31,6 @@ extern "C" { 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. * * This is the type which SPARC ISR Handlers return. diff --git a/cpukit/score/cpu/sparc64/rtems/score/types.h b/cpukit/score/cpu/sparc64/rtems/score/types.h index c4d1c7f..faf50b7 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 a209d09..bfec49d 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 f363fe4..40638dd 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 492dbd3..119e837 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 <rtems/score/prioritybitmap.h> -#include <rtems/score/priority.h> #include <string.h> @@ -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; } /** @} */ -- 1.8.4.5 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel