diff --git a/arch b/arch index 7195b24346e..42309e169e9 160000 --- a/arch +++ b/arch @@ -1 +1 @@ -Subproject commit 7195b24346e9d4115feff64d09f406ef31966630 +Subproject commit 42309e169e94db92096afb8f4b6957e84c6b6fc8 diff --git a/include/nuttx/tls.h b/include/nuttx/tls.h index e3477aada18..e6feaaeb15d 100644 --- a/include/nuttx/tls.h +++ b/include/nuttx/tls.h @@ -55,6 +55,11 @@ # error CONFIG_TLS_LOG2_MAXSTACK is not defined #endif +#ifndef CONFIG_TLS_NELEM +# warning CONFIG_TLS_NELEM is not defined +# define CONFIG_TLS_NELEM 0 +#endif + /* TLS Definitions **********************************************************/ #define TLS_STACK_ALIGN (1L << CONFIG_TLS_LOG2_MAXSTACK) @@ -83,7 +88,10 @@ struct tcb_s; /* Forward reference */ struct tls_info_s { - FAR struct tcb_s *tl_tcb; /* The TCB of the current task */ + FAR struct tcb_s *tl_tcb; /* The TCB of the current task */ +#if CONFIG_TLS_NELEM > 0 + uintptr_t tl_elem[CONFIG_TLS_NELEM]; /* TLS elements */ +#endif }; /**************************************************************************** @@ -103,7 +111,7 @@ struct tls_info_s * * Returned Value: * An integer index in the range of 0 through (CONFIG_SMP_NCPUS-1) that - * corresponds to the currently executing CPU. + * corresponds to the currently executing CPU * ****************************************************************************/ @@ -111,5 +119,46 @@ struct tls_info_s int tls_cpu_index(void); #endif +/**************************************************************************** + * Name: tls_get_element + * + * Description: + * Return an the TLS element associated with the 'elem' index + * + * Input Parameters: + * elem - Index of TLS element to return + * + * Returned Value: + * The value of TLS element associated with 'elem'. Errors are not reported. + * Aero is returned in the event of an error, but zero may also be valid + * value and returned when there is no error. The only possible error would + * be if elem >=CONFIG_TLS_NELEM. + * + ****************************************************************************/ + +#if CONFIG_TLS_NELEM > 0 +uintptr_t tls_get_element(int elem); +#endif + +/**************************************************************************** + * Name: tls_get_element + * + * Description: + * Set the TLS element associated with the 'elem' index to 'value' + * + * Input Parameters: + * elem - Index of TLS element to set + * value - The new value of the TLS element + * + * Returned Value: + * None. Errors are not reported. The only possible error would be if + * elem >=CONFIG_TLS_NELEM. + * + ****************************************************************************/ + +#if CONFIG_TLS_NELEM > 0 +void tls_set_element(int elem, uintptr_t value); +#endif + #endif /* CONFIG_TLS */ #endif /* __INCLUDE_NUTTX_TLS_H */ diff --git a/sched/Kconfig b/sched/Kconfig index fa8d25252c8..d1f4471b1e3 100644 --- a/sched/Kconfig +++ b/sched/Kconfig @@ -537,6 +537,13 @@ config TLS_LOG2_MAXSTACK values will limit the maximum size of the stack (hence the naming of this configuration value). +config TLS_NELEM + int "Number of TLS elements" + default 0 + ---help--- + The number of unique TLS elements. These can be accessed with + tls_get_element() and tls_set_element(). + endif # TLS menu "Pthread Options" diff --git a/sched/tls/Make.defs b/sched/tls/Make.defs new file mode 100644 index 00000000000..a2007770011 --- /dev/null +++ b/sched/tls/Make.defs @@ -0,0 +1,51 @@ +############################################################################ +# sched/tls/Make.defs +# +# Copyright (C) 2016 Gregory Nutt. All rights reserved. +# Author: Gregory Nutt +# +# 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. +# 3. Neither the name NuttX nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 +# COPYRIGHT OWNER 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. +# +############################################################################ + +ifeq ($(CONFIG_TLS),y) + +ifeq ($(CONFIG_SMP),y) +CSRCS += tls_cpuindex.c +endif + +ifneq ($(CONFIG_TLS_NELEM),0) +CSRCS += tls_setelem.c tls_getelem.c +endif + +# Include tls build support + +DEPPATH += --dep-path tls +VPATH += :tls + +endif diff --git a/sched/tls/tls.h b/sched/tls/tls.h new file mode 100644 index 00000000000..c7d361a3f79 --- /dev/null +++ b/sched/tls/tls.h @@ -0,0 +1,49 @@ +/**************************************************************************** + * sched/tls/tls.h + * + * Copyright (C) 2016 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 + * COPYRIGHT OWNER 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. + * + ****************************************************************************/ + +#ifndef __SCHED_TLS_TLS_H +#define __SCHED_TLS_TLS_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#endif /* __SCHED_TLS_TLS_H */ diff --git a/sched/tls/tls_cpuindex.c b/sched/tls/tls_cpuindex.c new file mode 100644 index 00000000000..b906d0ade96 --- /dev/null +++ b/sched/tls/tls_cpuindex.c @@ -0,0 +1,97 @@ +/**************************************************************************** + * libc/fixedmath/tls_cpuindex.c + * + * Copyright (C) 2016 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 + * COPYRIGHT OWNER 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include +#include + +#if defined(CONFIG_TLS) && defined(CONFIG_SMP) + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: tls_cpu_index + * + * Description: + * Return an index in the range of 0 through (CONFIG_SMP_NCPUS-1) that + * corresponds to the currently executing CPU. This is index is retained + * in the task TCB which is accessible via the tls_info_s structure. + * + * There is a race condition in that this thread could be swapped out and + * be running on a different CPU when the function returns. If that is a + * problem, then the calling function should disable pre-emption before + * calling this function. + * + * Input Parameters: + * None + * + * Returned Value: + * On success, an integer index is returned in the range of 0 through + * (CONFIG_SMP_NCPUS-1) that corresponds to the currently executing CPU. + * + ****************************************************************************/ + +int tls_cpu_index(void) +{ + FAR struct tls_info_s *info; + FAR struct tcb_s *tcb; + + /* Get the TLS info structure from the current threads stack */ + + info = up_tls_info(); + DEBUGASSERT(info != NULL && info->tl_tcb != NULL); + + /* Get the TCB from the TLS info. We expect the TCB state to indicate that + * the task is running (it must be because it is this thread). + */ + + tcb = info->tl_tcb; + DEBUGASSERT(tcb->task_state == TSTATE_TASK_RUNNING && + tcb->cpu <= (CONFIG_SMP_NCPUS-1)); + + return tcb->cpu; +} + +#endif /* CONFIG_TLS && CONFIG_SMP */ diff --git a/sched/tls/tls_getelem.c b/sched/tls/tls_getelem.c new file mode 100644 index 00000000000..9a11a5194bd --- /dev/null +++ b/sched/tls/tls_getelem.c @@ -0,0 +1,92 @@ +/**************************************************************************** + * libc/fixedmath/tls_getelem.c + * + * Copyright (C) 2016 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 + * COPYRIGHT OWNER 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include + +#if defined(CONFIG_TLS) && CONFIG_TLS_NELEM > 0 + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: tls_get_element + * + * Description: + * Return an the TLS element associated with the 'elem' index + * + * Input Parameters: + * elem - Index of TLS element to return + * + * Returned Value: + * The value of TLS element associated with 'elem'. Errors are not reported. + * Aero is returned in the event of an error, but zero may also be valid + * value and returned when there is no error. The only possible error would + * be if elem >=CONFIG_TLS_NELEM. + * + ****************************************************************************/ + +uintptr_t tls_get_element(int elem) +{ + FAR struct tls_info_s *info; + uintptr_t ret = 0; + + DEBUGASSERT(elem >= 0 && elem < CONFIG_TLS_NELEM); + if (elem >= 0 && elem < CONFIG_TLS_NELEM) + { + /* Get the TLS info structure from the current threads stack */ + + info = up_tls_info(); + DEBUGASSERT(info != NULL); + + /* Get the element value from the TLS info. */ + + ret = info->tl_elem[elem]; + } + + return ret; +} + +#endif /* CONFIG_TLS && CONFIG_TLS_NELEM > 0 */ diff --git a/sched/tls/tls_setelem.c b/sched/tls/tls_setelem.c new file mode 100644 index 00000000000..cca74adee36 --- /dev/null +++ b/sched/tls/tls_setelem.c @@ -0,0 +1,88 @@ +/**************************************************************************** + * libc/fixedmath/tls_setelem.c + * + * Copyright (C) 2016 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 + * COPYRIGHT OWNER 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include + +#if defined(CONFIG_TLS) && CONFIG_TLS_NELEM > 0 + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: tls_get_element + * + * Description: + * Set the TLS element associated with the 'elem' index to 'value' + * + * Input Parameters: + * elem - Index of TLS element to set + * value - The new value of the TLS element + * + * Returned Value: + * None. Errors are not reported. The only possible error would be if + * elem >=CONFIG_TLS_NELEM. + * + ****************************************************************************/ + +void tls_set_element(int elem, uintptr_t value) +{ + FAR struct tls_info_s *info; + + DEBUGASSERT(elem >= 0 && elem < CONFIG_TLS_NELEM); + if (elem >= 0 && elem < CONFIG_TLS_NELEM) + { + /* Get the TLS info structure from the current threads stack */ + + info = up_tls_info(); + DEBUGASSERT(info != NULL); + + /* Set the element value int the TLS info. */ + + info->tl_elem[elem] = value; + } +} + +#endif /* CONFIG_TLS && CONFIG_TLS_NELEM > 0 */