1/* Kernel-side additional module for the VxWorks threading support
2   logic for GCC.  Written 2002 by Zack Weinberg.
3
4   This file is distributed with GCC, but it is not part of GCC.
5   The contents of this file are in the public domain.  */
6
7/* If you are using the Tornado IDE, copy this file to
8   $WIND_BASE/target/config/comps/src/gthread_supp.c.  Then create a
9   file named 10comp_gthread_supp.cdf in target/config/comps/vxWorks
10   with the following contents:
11
12   Component INCLUDE_GCC_GTHREAD {
13      NAME                GCC 3.x gthread support (required by C++)
14      CONFIGLETTES        gthread_supp.c
15      REQUIRES            INCLUDE_CPLUS
16      INCLUDE_WHEN        INCLUDE_CPLUS
17      _FOLDER             FOLDER_CPLUS
18   }
19
20   If you are using command line builds, instead copy this file to
21   $WIND_BASE/target/src/config/gthread_supp.c, and add the following
22   block to target/src/config/usrExtra.c:
23
24   #ifdef INCLUDE_CPLUS
25   #include "../../src/config/gthread_supp.c"
26   #endif
27
28   You should now be able to rebuild your application using GCC 3.x.  */
29
30#include <vxWorks.h>
31#include <taskLib.h>
32
33/* This file provides these routines:  */
34extern void *__gthread_get_tsd_data (WIND_TCB *tcb);
35extern void __gthread_set_tsd_data (WIND_TCB *tcb, void *data);
36
37extern void __gthread_enter_tsd_dtor_context (WIND_TCB *tcb);
38extern void __gthread_leave_tsd_dtor_context (WIND_TCB *tcb);
39
40/* Set and retrieve the TSD data block for the task TCB.
41
42   Possible choices for TSD_SLOT are:
43     reserved1
44     reserved2
45     spare1
46     spare2
47     spare3
48     spare4
49   (these are all fields of the TCB structure; all have type 'int').
50
51   If you find that the slot chosen by default is already used for
52   something else, simply change the #define below and recompile this
53   file.  No other file should reference TSD_SLOT directly.  */
54
55/* WARNING: This code is not 64-bit clean (it assumes that a pointer
56   can be held in an 'int' without truncation).  As much of the rest
57   of VxWorks also makes this assumption, we can't really avoid it.  */
58
59#define TSD_SLOT reserved1
60
61void *
62__gthread_get_tsd_data (WIND_TCB *tcb)
63{
64  return (void *) (tcb->TSD_SLOT);
65}
66
67void
68__gthread_set_tsd_data (WIND_TCB *tcb, void *data)
69{
70  tcb->TSD_SLOT = (int) data;
71}
72
73/* Enter and leave "TSD destructor context".  This is defined as a
74   state in which it is safe to call free() from a task delete hook
75   on a memory block allocated by the task being deleted.
76   For VxWorks 5.x, nothing needs to be done.  */
77
78#if __GNUC__ >= 2
79#define UNUSED __attribute__((unused))
80#else
81#define UNUSED
82#endif
83
84void
85__gthread_enter_tsd_dtor_context (WIND_TCB *tcb UNUSED)
86{
87}
88
89void
90__gthread_leave_tsd_dtor_context (WIND_TCB *tcb UNUSED)
91{
92}
93