TLS: Add logic to get/set arbitrary TLS values

This commit is contained in:
Gregory Nutt
2016-03-10 19:31:22 -06:00
parent d69dc04d96
commit 934069e422
8 changed files with 436 additions and 3 deletions
+1 -1
Submodule arch updated: 7195b24346...42309e169e
+51 -2
View File
@@ -55,6 +55,11 @@
# error CONFIG_TLS_LOG2_MAXSTACK is not defined # error CONFIG_TLS_LOG2_MAXSTACK is not defined
#endif #endif
#ifndef CONFIG_TLS_NELEM
# warning CONFIG_TLS_NELEM is not defined
# define CONFIG_TLS_NELEM 0
#endif
/* TLS Definitions **********************************************************/ /* TLS Definitions **********************************************************/
#define TLS_STACK_ALIGN (1L << CONFIG_TLS_LOG2_MAXSTACK) #define TLS_STACK_ALIGN (1L << CONFIG_TLS_LOG2_MAXSTACK)
@@ -83,7 +88,10 @@
struct tcb_s; /* Forward reference */ struct tcb_s; /* Forward reference */
struct tls_info_s 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: * Returned Value:
* An integer index in the range of 0 through (CONFIG_SMP_NCPUS-1) that * 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); int tls_cpu_index(void);
#endif #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 /* CONFIG_TLS */
#endif /* __INCLUDE_NUTTX_TLS_H */ #endif /* __INCLUDE_NUTTX_TLS_H */
+7
View File
@@ -537,6 +537,13 @@ config TLS_LOG2_MAXSTACK
values will limit the maximum size of the stack (hence the naming values will limit the maximum size of the stack (hence the naming
of this configuration value). 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 endif # TLS
menu "Pthread Options" menu "Pthread Options"
+51
View File
@@ -0,0 +1,51 @@
############################################################################
# sched/tls/Make.defs
#
# Copyright (C) 2016 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# 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
+49
View File
@@ -0,0 +1,49 @@
/****************************************************************************
* sched/tls/tls.h
*
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 <nuttx/config.h>
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
#endif /* __SCHED_TLS_TLS_H */
+97
View File
@@ -0,0 +1,97 @@
/****************************************************************************
* libc/fixedmath/tls_cpuindex.c
*
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 <nuttx/config.h>
#include <assert.h>
#include <nuttx/arch.h>
#include <nuttx/sched.h>
#include <nuttx/tls.h>
#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 */
+92
View File
@@ -0,0 +1,92 @@
/****************************************************************************
* libc/fixedmath/tls_getelem.c
*
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 <nuttx/config.h>
#include <stdint.h>
#include <assert.h>
#include <nuttx/arch.h>
#include <nuttx/tls.h>
#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 */
+88
View File
@@ -0,0 +1,88 @@
/****************************************************************************
* libc/fixedmath/tls_setelem.c
*
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 <nuttx/config.h>
#include <stdint.h>
#include <assert.h>
#include <nuttx/arch.h>
#include <nuttx/tls.h>
#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 */