3013-11-19 Jennifer Averett <jennifer.averett@oarcorp.com>
* libc/sys/rtems/sys/cpuset.h: New file.
This commit is contained in:
		| @@ -1,3 +1,7 @@ | |||||||
|  | 3013-11-19  Jennifer Averett <jennifer.averett@oarcorp.com> | ||||||
|  |  | ||||||
|  | 	* libc/sys/rtems/sys/cpuset.h: New file. | ||||||
|  |  | ||||||
| 2013-11-19  Joel Sherrill <joel.sherrill@oarcorp.com> | 2013-11-19  Joel Sherrill <joel.sherrill@oarcorp.com> | ||||||
|  |  | ||||||
| 	* libc/include/stdlib.h: Add prototype of realpath(). | 	* libc/include/stdlib.h: Add prototype of realpath(). | ||||||
|   | |||||||
							
								
								
									
										207
									
								
								newlib/libc/sys/rtems/sys/cpuset.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										207
									
								
								newlib/libc/sys/rtems/sys/cpuset.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,207 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (c) 2013 On-Line Applications Research Corporation. | ||||||
|  |  * All rights reserved. | ||||||
|  |  * | ||||||
|  |  *  On-Line Applications Research Corporation | ||||||
|  |  *  7047 Old Madison Pike Suite 320 | ||||||
|  |  *  Huntsville Alabama 35806 | ||||||
|  |  *  <info@oarcorp.com> | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions | ||||||
|  |  * are met: | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright | ||||||
|  |  *    notice, this list of conditions and the following disclaimer. | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |  *    notice, this list of conditions and the following disclaimer in the | ||||||
|  |  *    documentation and/or other materials provided with the distribution. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||||||
|  |  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  |  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||||||
|  |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||||
|  |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||||
|  |  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||||
|  |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  |  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||||
|  |  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||||
|  |  * SUCH DAMAGE. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  *  This file implements an API compatible with static portion of | ||||||
|  |  *  the GNU/Linux cpu_set_t macros but is independently implemented. | ||||||
|  |  *  The GNU/Linux manual page and the FreeBSD cpuset_t implementation | ||||||
|  |  *  were used as reference material. | ||||||
|  |  * | ||||||
|  |  *  Not implemented: | ||||||
|  |  *    + Linux CPU_XXX_S | ||||||
|  |  *    + FreeBSD CPU_SUBSET | ||||||
|  |  *    + FreeBSD CPU_OVERLAP | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifndef _SYS_CPUSET_H_ | ||||||
|  | #define _SYS_CPUSET_H_ | ||||||
|  |  | ||||||
|  | #if 0 | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #include <stdint.h> | ||||||
|  |  | ||||||
|  | /* RTEMS supports a maximum of 32 CPU cores */ | ||||||
|  | #ifndef CPU_SETSIZE | ||||||
|  | #define CPU_SETSIZE 32 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* word in the cpu set */ | ||||||
|  | typedef uint32_t cpu_set_word_t; | ||||||
|  |  | ||||||
|  | /* Number of bits per cpu_set_t element */ | ||||||
|  | #define _NCPUBITS  (sizeof(cpu_set_word_t) * NBBY) /* bits per mask */ | ||||||
|  |  | ||||||
|  | /* Number of words in the cpu_set_t array */ | ||||||
|  | /* NOTE: Can't use howmany() because of circular dependency */ | ||||||
|  | #define _NCPUWORDS   (((CPU_SETSIZE)+((_NCPUBITS)-1))/(_NCPUBITS)) | ||||||
|  |  | ||||||
|  | /* Define the cpu set structure */ | ||||||
|  | typedef struct _cpuset { | ||||||
|  |   cpu_set_word_t __bits[_NCPUWORDS]; | ||||||
|  | } cpu_set_t; | ||||||
|  |  | ||||||
|  | /* determine the mask for a particular cpu within the element */ | ||||||
|  | static inline cpu_set_word_t  __cpuset_mask( size_t cpu ) | ||||||
|  | { | ||||||
|  |   return ((cpu_set_word_t)1 << ((cpu) % _NCPUBITS)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* determine the index for this cpu within the cpu set array */ | ||||||
|  | static inline size_t __cpuset_index( size_t cpu ) | ||||||
|  | { | ||||||
|  |   return ((cpu)/_NCPUBITS); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* zero out set */ | ||||||
|  | static inline void CPU_ZERO( cpu_set_t *set ) | ||||||
|  | { | ||||||
|  |   size_t i; | ||||||
|  |   for (i = 0; i < _NCPUWORDS; i++) | ||||||
|  |     set->__bits[i] = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* fill set */ | ||||||
|  | static inline void CPU_FILL( cpu_set_t *set ) | ||||||
|  | { | ||||||
|  |   size_t i; | ||||||
|  |   for (i = 0; i < _NCPUWORDS; i++) | ||||||
|  |     set->__bits[i] = -1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* set cpu within set */ | ||||||
|  | static inline void CPU_SET( size_t cpu, cpu_set_t *set ) | ||||||
|  | { | ||||||
|  |   set->__bits[__cpuset_index(cpu)] |= __cpuset_mask(cpu); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* clear cpu within set */ | ||||||
|  | static inline void CPU_CLR( size_t cpu, cpu_set_t *set ) | ||||||
|  | { | ||||||
|  |   set->__bits[__cpuset_index(cpu)] &= ~__cpuset_mask(cpu); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Return 1 is cpu is set in set, 0 otherwise */ | ||||||
|  | static inline int const CPU_ISSET( size_t cpu, const cpu_set_t *set ) | ||||||
|  | { | ||||||
|  |   return ((set->__bits[__cpuset_index(cpu)] & __cpuset_mask(cpu)) != 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* copy src set to dest set */ | ||||||
|  | static inline void CPU_COPY( cpu_set_t *dest, const cpu_set_t *src ) | ||||||
|  | { | ||||||
|  |   *dest = *src; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* logical and: dest set = src1 set and src2 set */ | ||||||
|  | static inline void CPU_AND( | ||||||
|  |   cpu_set_t *dest, const cpu_set_t *src1, const cpu_set_t *src2 | ||||||
|  | ) | ||||||
|  | { | ||||||
|  |   size_t i; | ||||||
|  |   for (i = 0; i < _NCPUWORDS; i++) | ||||||
|  |     dest->__bits[i] = src1->__bits[i] & src2->__bits[i]; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* logical or: dest set = src1 set or src2 set */ | ||||||
|  | static inline void CPU_OR( | ||||||
|  |   cpu_set_t *dest, const cpu_set_t *src1, const cpu_set_t *src2 | ||||||
|  | ) | ||||||
|  | { | ||||||
|  |   size_t i; | ||||||
|  |   for (i = 0; i < _NCPUWORDS; i++) | ||||||
|  |      dest->__bits[i] = src1->__bits[i] | src2->__bits[i]; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* logical xor: dest set = src1 set xor src2 set */ | ||||||
|  | static inline void CPU_XOR( | ||||||
|  |   cpu_set_t *dest, const cpu_set_t *src1, const cpu_set_t *src2 | ||||||
|  | ) | ||||||
|  | { | ||||||
|  |   size_t i; | ||||||
|  |   for (i = 0; i < _NCPUWORDS; i++) | ||||||
|  |    dest->__bits[i] = src1->__bits[i] ^ src2->__bits[i]; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* logical nand: dest set = src1 set nand src2 set */ | ||||||
|  | static inline void CPU_NAND( | ||||||
|  |   cpu_set_t *dest, const cpu_set_t *src1, const cpu_set_t *src2 | ||||||
|  | ) | ||||||
|  | { | ||||||
|  |   size_t i;  | ||||||
|  |   for (i = 0; i < _NCPUWORDS; i++) | ||||||
|  |     dest->__bits[i] = ~(src1->__bits[i] & src2->__bits[i]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* return the number of set cpus in set */ | ||||||
|  | static inline int const CPU_COUNT( const cpu_set_t *set ) | ||||||
|  | { | ||||||
|  |   size_t i; | ||||||
|  |   int    count = 0; | ||||||
|  |  | ||||||
|  |   for (i=0; i < _NCPUWORDS; i++) | ||||||
|  |     if (CPU_ISSET(i, set) != 0) | ||||||
|  |       count++; | ||||||
|  |   return count; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* return 1 if the sets set1 and set2 are equal, otherwise return 0 */ | ||||||
|  | static inline int const CPU_EQUAL(  | ||||||
|  |   const cpu_set_t *set1, const cpu_set_t *set2  | ||||||
|  | ) | ||||||
|  | { | ||||||
|  |   size_t i; | ||||||
|  |  | ||||||
|  |   for (i=0; i < _NCPUWORDS; i++) | ||||||
|  |     if (set1->__bits[i] != set2->__bits[i] ) | ||||||
|  |       return 0; | ||||||
|  |   return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* return 1 if the sets set1 and set2 are equal, otherwise return 0 */ | ||||||
|  | static inline int const CPU_CMP( const cpu_set_t *set1, const cpu_set_t *set2 ) | ||||||
|  | { | ||||||
|  |   return CPU_EQUAL(set1, set2); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* return 1 if the set is empty, otherwise return 0 */ | ||||||
|  | static inline int const CPU_EMPTY( const cpu_set_t *set ) | ||||||
|  | { | ||||||
|  |   size_t i; | ||||||
|  |  | ||||||
|  |   for (i=0; i < _NCPUWORDS; i++) | ||||||
|  |     if (set->__bits[i] != 0 ) | ||||||
|  |       return 0; | ||||||
|  |   return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
		Reference in New Issue
	
	Block a user