/ kernel / syscall.h
syscall.h
  1  /**************************************************************************
  2      BuguRTOS-4.0.x (Bugurt real time operating system)
  3      Copyright (C) 2018 anonimous
  4  
  5      This program is free software: you can redistribute it and/or modify
  6      it under the terms of the GNU General Public License as published by
  7      the Free Software Foundation, either version 3 of the License, or
  8      (at your option) any later version.
  9  
 10      This program is distributed in the hope that it will be useful,
 11      but WITHOUT ANY WARRANTY; without even the implied warranty of
 12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 13      GNU General Public License for more details.
 14  
 15      You should have received a copy of the GNU General Public License
 16      along with this program.  If not, see <http://www.gnu.org/licenses/>.
 17  
 18      Please contact with me by E-mail: shkolnick.kun@gmail.com
 19  
 20      A special exception to the GPL can be applied should you wish to distribute
 21      a combined work that includes BuguRTOS, without being obliged to provide
 22      the source code for any proprietary components. See the file exception.txt
 23      for full details of how and when the exception can be applied.
 24  **************************************************************************/
 25  
 26  /*****************************************************************************************
 27  ```````````````````````````````..:+oyhdmNNMMMMMMNmmdhyo+:..```````````````````````````````
 28  ``````````````````````````.:oydNMMMMMMMMMNNNNNNNNMMMMMMMMMNdy+:.``````````````````````````
 29  ```````````````````````:sdNMMMMMNdys+/::----------::/osydNMMMMMNds:```````````````````````
 30  ```````````````````.+hNMMMMmho/-..........................-/shmMMMMNh/.```````````````````
 31  ````````````````./hNMMMNho:...................................-:ohNMMMNh/`````````````````
 32  ``````````````.smMMMNy/-.......:////ss++/+-.......................-+yNMMMmo.``````````````
 33  ````````````-sNMMMd+-.....:////:-...-/s::..............+o/-..........-odMMMNs.````````````
 34  ``````````.sNMMNh/....................................-o:--............./hMMMNo.``````````
 35  `````````+mMMMh:-........................................-...............-/dMMMm/`````````
 36  ```````.yMMMm/...................-::--..................:-........--........+mMMMy.```````
 37  ``````:mMMMy-.......................-::-...............-:.........-::........-yMMMd:``````
 38  `````/NMMN+-..................::-.....-:-............../--.........-:/-.......-+NMMN:`````
 39  ````+NMMm::o/-..--/+o+o+++++o+osys+//::-::.............:/....-:-::-..-++-.......:NMMN/````
 40  ```/NMMm:.-++-+yhs/-``       `dMMMMMmho+:-..............:-/+yho/:/+oyo//o-......./mMMN:```
 41  ``-NMMm/....-/--::/o+o+oo+oo++oosyss+smyo/.............:yyho-`     smMMddh-......./NMMN.``
 42  `.hMMM/......-++:-.-:oooooooooosyyhhys/...............-+osyyyyysssssooo+ohhs-......+MMMh.`
 43  `+MMMy.......-::/++:-.....-:/++++o+o/--................--/oooo+o++o+++////-y/.......hMMM/`
 44  .mMMN:.........--:---...-::/+//::--.......................--//+//-...-.....+/......./NMMd`
 45  /MMMy............-::----------....----/+-.....................-++/:---....-o-........hMMN:
 46  yMMM/.............--:://///oo+++/+++oo+-.......................-://+/:--::::.........+MMMs
 47  mMMN:................----:/h:::/:/::---.........................--/osss+++:..........:NMMd
 48  MMMd-....................:mNs:-....................................--:odo:-..........:mMMN
 49  MMMd-....................yoshyoso:--................................../mm/...........:mMMM
 50  MMMm:..................../-o/h.y-:+dooo+/:--....................-/osydddmh...........:mMMN
 51  mMMN:........................+mNs `h.  -d/:/+h++ooooy+++s++y+++mo+y` yh.do...........:NMMh
 52  sMMM+........................-hmMo/ds  oMo`.-o     :h   s:`h` `Nysd.-Ny-h:...........+MMMo
 53  /MMMh........................./smMMMMd+NMMNNMh`    sN: .mNNMddNMMMMNmN+..............hMMN:
 54  .dMMN/........................./+hMMMMMMMMMMMMmhyyyNMNNMMMMMMMMMMMNsoo-............./NMMd`
 55  `+MMMh.........................-/+omMMMMMMMMMMMMMMMMMMMMMMMMMMMMms-/+...............hMMM/`
 56  `.hMMM+..........................:/-omMMMMMMMMMMMMMMMdmMdhMMMds/-..-...............oMMMy``
 57  ``.NMMN/............................--/hNN/h.`ys:dmsd:-syos+--+.................../NMMN.``
 58  ```/NMMm:...........................:+/--:+s++oo+osoo+/:-..-/+::-................/mMMN:```
 59  ````/NMMN:............................-/++/:-..........-//+/-..:+.--............/NMMN/````
 60  `````:NMMN+-.............../+-.............-://////////:-.......+s+::.........-oNMMN:`````
 61  ``````:mMMMy-..............:/o-.................................:yo//........-hMMMd-``````
 62  ```````.yMMMm+.............:o:++-...............................+y+o-......-+mMMMs.```````
 63  `````````/mMMMd/-...........-++:+/-.---........................-ho+/.....-/dMMMm/`````````
 64  ``````````.oNMMMh/............-++:++/////:....................-yo:o-...-+hMMMNo.``````````
 65  ````````````.sNMMMdo-...........-++::++:-:/+//:..............:o:/o-..-omMMMNo.````````````
 66  ``````````````.omMMMNy+-..........-/+-.:/+/:--:+++/++//:/::/+/-+/.-+hMMMMmo```````````````
 67  `````````````````/hNMMMNho:-...............-:/:-....--::::--..-/ohNMMMNy:`````````````````
 68  ```````````````````./hNMMMMmhs/-..........................-/shNMMMMNy/.```````````````````
 69  ```````````````````````:sdNMMMMMNdhso+/:----------:/+oshdNMMMMMNho:```````````````````````
 70  ``````````````````````````.:+ydNMMMMMMMMMMNNNNNNMMMMMMMMMMmds+:```````````````````````````
 71  ````````````````````````````````.:/osyhdmNNMMMMNNmdhyso/:.````````````````````````````````
 72  ******************************************************************************************
 73  *                                                                                        *
 74  *                   This logo was graciously delivered by 10003-kun ITT:                 *
 75  *                                                                                        *
 76  *                           http://www.0chan.ru/r/res/9996.html                          *
 77  *                                                                                        *
 78  *****************************************************************************************/
 79  #ifndef SYSCALL_H
 80  #define SYSCALL_H
 81  BGRT_CDECL_BEGIN
 82  #include <stdarg.h>
 83  /*!
 84  \file
 85  \brief \~russian Заголовок системных вызовов.
 86  
 87  \warning Все содержимое файла для внутреннего использования!
 88  
 89  \~english System call header.
 90  
 91  \warning This file content is internal usage!
 92  */
 93  #define BGRT_SC_ID(syscall) BGRT_CONCAT(BGRT_SC_ENUM_, syscall) /*!< \~russian \brief Получить идентификатор системного вызова по названию. \~english \brief Get system call id. */
 94  
 95  enum _bgrt_sc_enum
 96  {
 97  #   define BGRT_SC_TBL_ENTRY(syscall,arg) BGRT_SC_ID(syscall),
 98  #   include <syscall_table.h> /* ADLINT:SF:[W0073] No include guard! */
 99  #   undef  BGRT_SC_TBL_ENTRY
100      BGRT_SC_ENUM_END
101  };
102  typedef enum _bgrt_sc_enum bgrt_sc_enum; /*!< \~russian \brief Идентификаторы системных вызовов. \~english \brief Suystem call IDs. */
103  
104  #define BGRT_SC_SR_NAME(syscall) BGRT_CONCAT2(BGRT_SC_, BGRT_CONCAT(syscall, _SR)) /*!< \~russian \brief Имя обработчика системного вызова.         \~english \brief System call service routine name. */
105  #define BGRT_SC_SR(syscall,arg) bgrt_st_t BGRT_SC_SR_NAME(syscall)(arg)    /*!< \~russian \brief Обработчик системного вызова.              \~english \brief System call service routine. */
106  typedef bgrt_st_t (* bgrt_scsr_t)(void *);                                         /*!< \~russian \brief Указатель на обработчик системного вызова. \~english \brief System call service routine pointer. */
107  
108  typedef struct _bgrt_va_wr_t bgrt_va_wr_t; /*!< \~russian \brief Обёртка для va_list. \~english \brief va_list wrapper. */
109  struct _bgrt_va_wr_t
110  {
111      va_list list;
112  };
113  /*!
114  \~russian
115  \brief
116  Обработка системного вызова.
117  
118  Запускает обработчик системного вызова и передаёт ему аргумент.
119  
120  \param syscall_num Номер системного вызова.
121  \param syscall_arg Аргумент системного вызова.
122  \return Результат выполнения системного вызова.
123  
124  \~english
125  \brief
126  System call processing routine.
127  
128  This function calls system call handlers and passes arguments to them.
129  
130  \param syscall_num System call number.
131  \param syscall_arg System call argument.
132  \return System call execution status.
133  */
134  bgrt_st_t bgrt_priv_do_syscall(bgrt_syscall_t syscall_num, void * syscall_arg);
135  
136  /*!
137  \~russian
138  \brief
139  Системный вызов.
140  
141  Код Ядра всегда выполняется в контексте Ядра. Это нужно для экономии памяти в стеках процессов.
142  Соответственно, если мы хотим выполнить какие либо операции над процессами, мьютексами, семафорами, сигналами,
143  то нам нужно "попросить" Ядро сделать эту работу.
144  
145  Именно для этого существует функция bgrt_syscall, которая передаёт управление Ядру для выполнения требуемой работы.
146  
147  \warning Для внутреннего использования.
148  
149  \param num номер системного вызова (что именно надо выполнить).
150  \~english
151  \brief
152  A system call.
153  
154  This function switches a processor core from a process context to the kernel context.
155  The kernel code is always run in the kernel context. This is done to save memory in process stacks.
156  A system calls are done on every operations with processes, mutexes, semaphores and signals.
157  The Kernel does all of this job.
158  
159  \warning Internal usage function.
160  
161  \param num a number of a system call (what is going to be done).
162  */
163  bgrt_st_t bgrt_syscall_var(bgrt_syscall_t num, ...);
164  
165  /*!
166  \~russian
167  \brief
168  Системный вызов в виде макроса, см. #bgrt_syscall.
169  
170  \warning Для внутреннего использования.
171  
172  \param sc_name имя системного вызова (что именно надо выполнить).
173  \param arg Указатель на аргумент.
174  \~english
175  \brief
176  A system call macro, see #bgrt_syscall.
177  
178  \warning For internal usage.
179  
180  \param sc_name A system call name.
181  \param arg A system call argument pointer.
182  */
183  #define BGRT_SYSCALL_N(sc_name, arg) bgrt_syscall(BGRT_SC_ID(sc_name), arg)
184  
185  /*!
186  \~russian
187  \brief
188  Системный вызов в виде макроса, см. #bgrt_syscall_var.
189  
190  \warning Для внутреннего использования.
191  
192  \param sc_name имя системного вызова (что именно надо выполнить).
193  \~english
194  \brief
195  A system call macro, see #bgrt_syscall_var.
196  
197  \warning For internal usage.
198  
199  \param sc_name A system call name.
200  */
201  #define BGRT_SYSCALL_NVAR(sc_name,...) bgrt_syscall_var(BGRT_SC_ID(sc_name), __VA_ARGS__)
202  
203  /*User may write his own system calls*/
204  #ifdef BGRT_CONFIG_CUSTOM_SYSCALL
205  #   include <custom_syscall_api.h>
206  #else
207  #   include <default/syscall_api.h> /*Default system call dispatcher*/
208  #endif/*BGRT_CONFIG_USER_SYSCALL*/
209  
210  BGRT_CDECL_END
211  #endif /*SYSCALL_H*/