1 /**
2  * @file signal.h
3  * @author longjin (longjin@RinGoTek.cn)
4  * @brief signal相关类型在C语言中的导出。(以rust版本为准)
5  * @version 0.1
6  *
7  * @copyright Copyright (c) 2022
8  *
9  */
10 #pragma once
11 #include <DragonOS/refcount.h>
12 #include <common/atomic.h>
13 #include <common/list.h>
14 #include <common/spinlock.h>
15 #include <common/sys/types.h>
16 #include <common/wait_queue.h>
17 
18 // 系统最大支持的信号数量
19 #define MAX_SIG_NUM 64
20 // sigset所占用的u64的数量
21 #define _NSIG_U64_CNT (MAX_SIG_NUM / 64)
22 
23 typedef void __signalfn_t(int);
24 typedef __signalfn_t *__sighandler_t;
25 
26 typedef uint64_t sigset_t;
27 
28 #define SIGHUP 1
29 #define SIGINT 2
30 #define SIGQUIT 3
31 #define SIGILL 4
32 #define SIGTRAP 5
33 #define SIGABRT 6
34 #define SIGIOT 6
35 #define SIGBUS 7
36 #define SIGFPE 8
37 #define SIGKILL 9
38 #define SIGUSR1 10
39 #define SIGSEGV 11
40 #define SIGUSR2 12
41 #define SIGPIPE 13
42 #define SIGALRM 14
43 #define SIGTERM 15
44 #define SIGSTKFLT 16
45 #define SIGCHLD 17
46 #define SIGCONT 18
47 #define SIGSTOP 19
48 #define SIGTSTP 20
49 #define SIGTTIN 21
50 #define SIGTTOU 22
51 #define SIGURG 23
52 #define SIGXCPU 24
53 #define SIGXFSZ 25
54 #define SIGVTALRM 26
55 #define SIGPROF 27
56 #define SIGWINCH 28
57 #define SIGIO 29
58 #define SIGPOLL SIGIO
59 
60 #define SIGPWR 30
61 #define SIGSYS 31
62 
63 /* These should not be considered constants from userland.  */
64 #define SIGRTMIN 32
65 #define SIGRTMAX MAX_SIG_NUM
66 
67 // 注意,该结构体最大16字节
68 union __sifields {
69     /* kill() */
70     struct
71     {
72         pid_t _pid; /* 信号发送者的pid */
73     } _kill;
74 };
75 
76 // 注意,该结构体最大大小为32字节
77 #define __SIGINFO                                                                                                      \
78     struct                                                                                                             \
79     {                                                                                                                  \
80         int32_t si_signo; /* signal number */                                                                          \
81         int32_t si_code;                                                                                               \
82         int32_t si_errno;                                                                                              \
83         uint32_t reserved; /* 保留备用 */                                                                          \
84         union __sifields _sifields;                                                                                    \
85     }
86 
87 struct siginfo
88 {
89     union {
90         __SIGINFO;
91         uint64_t padding[4]; // 让siginfo占用32字节大小
92     };
93 };
94 
95 /**
96  * @brief 信号处理结构体
97  *
98  */
99 struct sigaction
100 {
101     // 信号处理函数的指针
102     union {
103         __sighandler_t _sa_handler;
104         void (*_sa_sigaction)(int sig, struct siginfo *sinfo, void *);
105     } _u;
106     uint64_t sa_flags;
107     sigset_t sa_mask;
108     void (*sa_restorer)(void); // 暂时未实现
109 };
110 
111 // ============ sigaction结构体中的的sa_flags的可选值 ===========
112 #define SA_FLAG_IGN (1UL << 0)      // 当前sigaction表示忽略信号的动作
113 #define SA_FLAG_DFL (1UL << 1)      // 当前sigaction表示系统默认的动作
114 #define SA_FLAG_RESTORER (1UL << 2) // 当前sigaction具有用户指定的restorer
115 #define SA_FLAG_IMMUTABLE (1UL << 3) // 当前sigaction不可被更改
116 
117 /**
118  * 由于signal_struct总是和sighand_struct一起使用,并且信号处理的过程中必定会对sighand加锁,
119  * 因此signal_struct不用加锁
120  */
121 struct signal_struct
122 {
123     atomic_t sig_cnt;
124 };
125 
126 /**
127  * @brief 信号处理结构体,位于pcb之中。
128  * 请注意,该结构体需要与rust的版本一致,且以rust的为准
129  */
130 struct sighand_struct
131 {
132     spinlock_t siglock;
133     refcount_t count;
134     // 为每个信号注册的处理函数的结构体
135     struct sigaction action[MAX_SIG_NUM];
136 };
137 
138 /**
139  * @brief 正在等待的信号的标志位
140  */
141 struct sigpending
142 {
143     sigset_t signal;
144     void *sigqueue; // 信号队列(在rust中实现)
145 };