• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2022 Huawei Device Co., Ltd. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without modification,
5  * are permitted provided that the following conditions are met:
6  *
7  * 1. Redistributions of source code must retain the above copyright notice, this list of
8  *    conditions and the following disclaimer.
9  *
10  * 2. Redistributions in binary form must reproduce the above copyright notice, this list
11  *    of conditions and the following disclaimer in the documentation and/or other materials
12  *    provided with the distribution.
13  *
14  * 3. Neither the name of the copyright holder nor the names of its contributors may be used
15  *    to endorse or promote products derived from this software without specific prior written
16  *    permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
20  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
22  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
27  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
28  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #ifndef _LOS_SIGNAL_H
32 #define _LOS_SIGNAL_H
33 
34 #include <signal.h>
35 #include "los_list.h"
36 
37 #ifdef __cplusplus
38 #if __cplusplus
39 extern "C" {
40 #endif /* __cplusplus */
41 #endif /* __cplusplus */
42 
43 /**
44  * @ingroup los_signal
45  * Signal error code: The parameters of interface is error.
46  *
47  * Value: 0x02003200
48  *
49  */
50 #define LOS_ERRNO_SIGNAL_INVALID                    LOS_ERRNO_OS_FATAL(LOS_MOD_SIGNAL, 0x00)
51 
52 /**
53  * @ingroup los_signal
54  * Signal error code: The memory requests failed.
55  *
56  * Value: 0x02003201
57  *
58  */
59 #define LOS_ERRNO_SIGNAL_NO_MEMORY                  LOS_ERRNO_OS_ERROR(LOS_MOD_SIGNAL, 0x01)
60 
61 /**
62  * @ingroup los_signal
63  * Signal error code: The signal is not set.
64  *
65  * Value: 0x02003202
66  *
67  */
68 #define LOS_ERRNO_SIGNAL_NO_SET                     LOS_ERRNO_OS_ERROR(LOS_MOD_SIGNAL, 0x02)
69 
70 /**
71  * @ingroup los_signal
72  * Signal error code: Waiting for signal timeout.
73  *
74  * Value: 0x02003203
75  *
76  */
77 #define LOS_ERRNO_SIGNAL_TIMEOUT                    LOS_ERRNO_OS_ERROR(LOS_MOD_SIGNAL, 0x03)
78 
79 /**
80  * @ingroup los_signal
81  * Signal error code: The interface is used before system start.
82  *
83  * Value: 0x02003204
84  *
85  */
86 #define LOS_ERRNO_SIGNAL_CAN_NOT_CALL               LOS_ERRNO_OS_ERROR(LOS_MOD_SIGNAL, 0x04)
87 
88 /**
89 * @ingroup los_signal
90 * Mutex error code: Waiting for signal in interrupt callback.
91 *
92 * Value: 0x02003205
93 *
94 */
95 #define LOS_ERRNO_SIGNAL_PEND_INTERR                LOS_ERRNO_OS_ERROR(LOS_MOD_SIGNAL, 0x05)
96 
97 /**
98  * @ingroup los_signal
99  * Add the signal num to the signal set.
100  */
101 #define LOS_SIGNAL_MASK(sigNo)          (1U << ((sigNo) - 1))
102 
103 /**
104  * @ingroup los_signal
105  * Maximum signal supported num.
106  */
107 #define LOS_SIGNAL_SUPPORT_MAX           31
108 
109 /**
110  * @ingroup los_signal
111  * Signal handler type.
112  */
113 typedef VOID (*SIG_HANDLER)(INT32 sigNo);
114 
115 typedef struct {
116     sigset_t     sigSetFlag;                              /**< installing signals */
117     sigset_t     sigPendFlag;                             /**< pending signals */
118     sigset_t     sigWaitFlag;                             /**< waiting signals */
119     siginfo_t    sigInfo;                                 /**< signal info */
120     SIG_HANDLER  sigHandlers[LOS_SIGNAL_SUPPORT_MAX + 1]; /**< signal handler */
121     LOS_DL_LIST  sigInfoList;                             /**< signal info list */
122     VOID         *sigSaveSP;                              /**< save stack pointer */
123     VOID         *sigRestoreSP;                           /**< restore stack pointer */
124     UINT32       sigStatus;                               /**< status of signal */
125 } OsSigCB;
126 
127 typedef struct {
128     LOS_DL_LIST node;
129     siginfo_t info;
130 } OsSigInfoNode;
131 
132 #define OS_SIGNAL_STATUS_WAIT            0x0001
133 #define OS_SIGNAL_VALID(sigNo)           (((sigNo) > 0) && ((sigNo) <= LOS_SIGNAL_SUPPORT_MAX))
134 
135 UINT32 OsSignalInit(VOID);
136 UINTPTR OsSignalTaskContextRestore(VOID);
137 
138 /**
139  * @ingroup los_signal
140  * @brief Register the handler for the specified signal.
141  *
142  * @par Description:
143  * This API is used to register the handler for the specified signal, otherwise it is the default handler.
144  *
145  * @attention None.
146  *
147  * @param sigNo   [IN] The specified signal num.
148  * @param handler [IN] The handler for this signal, which is either SIG_IGN, SIG_DFL,
149  * or the address of a programmer-defined function.
150  *
151  * @retval: SIG_ERR Type#SIG_HANDLER: error code.
152  * @retval: old     Type#SIG_HANDLER: success, the previous handler is returned.
153  * <ul><li>los_signal.h: the header file that contains the API declaration.</li></ul>
154  * @see None
155  */
156 SIG_HANDLER LOS_SignalSet(INT32 sigNo, SIG_HANDLER handler);
157 
158 /**
159  * @ingroup los_signal
160  * @brief Shield the specified signal set.
161  *
162  * @par Description:
163  * This API is used to shield the specified signal set and get the current signal set.
164  *
165  * @attention None.
166  *
167  * @param how    [IN] The behavior of the call is dependent on the value of how, which is either SIG_BLOCK,
168  * SIG_UNBLOCK, SIG_SETMASK.
169  * @param set    [IN] The new signal set.
170  * @param oldSet [OUT] The old signal set.
171  *
172  * @retval: LOS_ERRNO_SIGNAL_CAN_NOT_CALL Type#UINT32: The interface is used before system start.
173  * @retval: LOS_ERRNO_SIGNAL_NO_MEMORY Type#UINT32: The memory requests failed.
174  * @retval: LOS_ERRNO_SIGNAL_INVALID Type#UINT32: The parameters of interface is error.
175  * @retval: LOS_OK Type#UINT32: success.
176  * <ul><li>los_signal.h: the header file that contains the API declaration.</li></ul>
177  * @see None
178  */
179 UINT32 LOS_SignalMask(INT32 how, const sigset_t *set, sigset_t *oldSet);
180 
181 /**
182  * @ingroup los_signal
183  * @brief Suspend execution of the calling thread until one of the signals specified in
184  * the signal set becomes pending.
185  *
186  * @par Description:
187  * This API is used to suspend execution of the calling thread until one of the signals
188  * specified in the signal set becomes pending and return the signal number in sig.
189  *
190  * @attention None.
191  *
192  * @param set     [IN] The specified signal set which waiting for.
193  * @param info    [OUT] The info of signal becomes pending.
194  * @param timeout [IN] The waiting time.
195  *
196  * @retval: LOS_ERRNO_SIGNAL_INVALID Type#UINT32: The parameters of interface is error.
197  * @retval: LOS_ERRNO_SIGNAL_CAN_NOT_CALL Type#UINT32: The interface is used before system start.
198  * @retval: LOS_ERRNO_SIGNAL_NO_MEMORY Type#UINT32: The memory requests failed.
199  * @retval: LOS_ERRNO_SIGNAL_PEND_INTERR Type#UINT32: Waiting for signal in interrupt callback.
200  * @retval: LOS_ERRNO_SIGNAL_TIMEOUT Type#UINT32: Waiting for signal timeout.
201  * @retval: signo Type#UINT32: success, returning the signal num which becomes pending.
202  * <ul><li>los_signal.h: the header file that contains the API declaration.</li></ul>
203  * @see LOS_SignalSend
204  */
205 UINT32 LOS_SignalWait(const sigset_t *set, siginfo_t *info, UINT32 timeout);
206 
207 /**
208  * @ingroup los_signal
209  * @brief Send the specified signal to the specified task.
210  *
211  * @par Description:
212  * This API is used to send the specified signal to the specified task.
213  *
214  * @attention None.
215  *
216  * @param taskID   [IN] Send a signal to this task.
217  * @param sigNo    [IN] The signal num.
218  *
219  * @retval: LOS_ERRNO_SIGNAL_NO_MEMORY Type#UINT32: The memory requests failed.
220  * @retval: LOS_ERRNO_SIGNAL_INVALID Type#UINT32: The parameters of interface is error.
221  * @retval: LOS_ERRNO_SIGNAL_NO_SET Type#UINT32: The signal is not set.
222  * @retval: LOS_OK Type#UINT32: success.
223  * <ul><li>los_signal.h: the header file that contains the API declaration.</li></ul>
224  * @see None
225  */
226 UINT32 LOS_SignalSend(UINT32 taskID, INT32 sigNo);
227 
228 #ifdef __cplusplus
229 #if __cplusplus
230 }
231 #endif /* __cplusplus */
232 #endif /* __cplusplus */
233 
234 #endif /* _LOS_SIGNAL_H */