signal.inc 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by Jonas Maebe,
  5. member of the Free Pascal development team.
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. {$packrecords C}
  13. {********************
  14. Signal
  15. ********************}
  16. Const
  17. { For sending a signal }
  18. SA_NOCLDSTOP = 1;
  19. SA_SHIRQ = $04000000;
  20. SA_STACK = $08000000;
  21. SA_RESTART = $10000000;
  22. SA_INTERRUPT = $20000000;
  23. SA_NOMASK = $40000000;
  24. SA_ONESHOT = $80000000;
  25. SIG_BLOCK = 0;
  26. SIG_UNBLOCK = 1;
  27. SIG_SETMASK = 2;
  28. SIG_DFL = 0 ;
  29. SIG_IGN = 1 ;
  30. SIG_ERR = -1 ;
  31. SIGHUP = 1;
  32. SIGINT = 2;
  33. SIGQUIT = 3;
  34. SIGILL = 4;
  35. SIGTRAP = 5;
  36. SIGABRT = 6;
  37. SIGIOT = 6;
  38. SIGBUS = 7;
  39. SIGFPE = 8;
  40. SIGKILL = 9;
  41. SIGUSR1 = 10;
  42. SIGSEGV = 11;
  43. SIGUSR2 = 12;
  44. SIGPIPE = 13;
  45. SIGALRM = 14;
  46. SIGTerm = 15;
  47. SIGSTKFLT = 16;
  48. SIGCHLD = 17;
  49. SIGCONT = 18;
  50. SIGSTOP = 19;
  51. SIGTSTP = 20;
  52. SIGTTIN = 21;
  53. SIGTTOU = 22;
  54. SIGURG = 23;
  55. SIGXCPU = 24;
  56. SIGXFSZ = 25;
  57. SIGVTALRM = 26;
  58. SIGPROF = 27;
  59. SIGWINCH = 28;
  60. SIGIO = 29;
  61. SIGPOLL = SIGIO;
  62. SIGPWR = 30;
  63. SIGUNUSED = 31;
  64. const
  65. SI_PAD_SIZE = ((128 div sizeof(longint)) - 3);
  66. type
  67. tfpreg = record
  68. significand: array[0..3] of word;
  69. exponent: word;
  70. end;
  71. pfpstate = ^tfpstate;
  72. tfpstate = record
  73. cw, sw, tag, ipoff, cssel, dataoff, datasel: cardinal;
  74. st: array[0..7] of tfpreg;
  75. status: cardinal;
  76. end;
  77. SigSet = array[0..wordsinsigset-1] of cint;
  78. sigset_t= SigSet;
  79. PSigSet = ^SigSet;
  80. psigset_t=psigset;
  81. TSigSet = SigSet;
  82. {$ifdef cpui386}
  83. PSigContextRec = ^SigContextRec;
  84. SigContextRec = record
  85. gs, __gsh: word;
  86. fs, __fsh: word;
  87. es, __esh: word;
  88. ds, __dsh: word;
  89. edi: cardinal;
  90. esi: cardinal;
  91. ebp: cardinal;
  92. esp: cardinal;
  93. ebx: cardinal;
  94. edx: cardinal;
  95. ecx: cardinal;
  96. eax: cardinal;
  97. trapno: cardinal;
  98. err: cardinal;
  99. eip: cardinal;
  100. cs, __csh: word;
  101. eflags: cardinal;
  102. esp_at_signal: cardinal;
  103. ss, __ssh: word;
  104. fpstate: pfpstate;
  105. oldmask: cardinal;
  106. cr2: cardinal;
  107. end;
  108. {$endif cpui386}
  109. {$Ifdef cpum68k}
  110. PSigContextRec = ^SigContextRec;
  111. SigContextRec = record
  112. { dummy for now PM }
  113. end;
  114. {$endif cpum68k}
  115. {$ifdef cpupowerpc}
  116. { from include/ppc/ptrace.h }
  117. pptregs = ^tptregs;
  118. tptregs = record
  119. gpr: array[0..31] of cardinal;
  120. nip: cardinal;
  121. msr: cardinal;
  122. orig_gpr3: cardinal; { Used for restarting system calls }
  123. ctr: cardinal;
  124. link: cardinal;
  125. xer: cardinal;
  126. ccr: cardinal;
  127. mq: cardinal; { 601 only (not used at present) }
  128. { Used on APUS to hold IPL value. }
  129. trap: cardinal; { Reason for being here }
  130. dar: cardinal; { Fault registers }
  131. dsisr: cardinal;
  132. result: cardinal; { Result of a system call }
  133. end;
  134. { from include/asm/ppc/siginfo.h }
  135. psiginfo = ^tsiginfo;
  136. tsiginfo = record
  137. si_signo : longint;
  138. si_errno : longint;
  139. si_code : longint;
  140. _sifields : record
  141. case longint of
  142. 0 : ( _pad : array[0..(SI_PAD_SIZE)-1] of longint );
  143. 1 : ( _kill : record
  144. _pid : pid_t;
  145. _uid : uid_t;
  146. end );
  147. 2 : ( _timer : record
  148. _timer1 : dword;
  149. _timer2 : dword;
  150. end );
  151. 3 : ( _rt : record
  152. _pid : pid_t;
  153. _uid : uid_t;
  154. _sigval : pointer;
  155. end );
  156. 4 : ( _sigchld : record
  157. _pid : pid_t;
  158. _uid : uid_t;
  159. _status : longint;
  160. _utime : clock_t;
  161. _stime : clock_t;
  162. end );
  163. 5 : ( _sigfault : record
  164. _addr : pointer;
  165. end );
  166. 6 : ( _sigpoll : record
  167. _band : longint;
  168. _fd : longint;
  169. end );
  170. end;
  171. end;
  172. { from include/asm-ppc/signal.h }
  173. stack_t = record
  174. ss_sp: pointer;
  175. ss_flags: longint;
  176. ss_size: size_t;
  177. end;
  178. { from include/asm-ppc/sigcontext.h }
  179. tsigcontext_struct = record
  180. _unused: array[0..3] of dword;
  181. signal: longint;
  182. handler: dword;
  183. oldmask: dword;
  184. pt_regs: pptregs;
  185. end;
  186. { from include/asm-ppc/ucontext.h }
  187. pucontext = ^tucontext;
  188. tucontext = record
  189. uc_flags : dword;
  190. uc_link : pucontext;
  191. uc_stack : stack_t;
  192. uc_mcontext : tsigcontext_struct;
  193. uc_sigmask : sigset_t;
  194. end;
  195. { from arch/ppc/kernel/signal.c, the type of the actual parameter passed }
  196. { to the sigaction handler }
  197. t_rt_sigframe = record
  198. _unused: array[0..1] of cardinal;
  199. pinfo: psiginfo;
  200. puc: pointer;
  201. siginfo: tsiginfo;
  202. uc: tucontext;
  203. end;
  204. PSigContextRec = ^SigContextRec;
  205. SigContextRec = tsigcontext_struct;
  206. {$endif cpupowerpc}
  207. {$ifdef cpusparc}
  208. PSigContextRec = ^SigContextRec;
  209. SigContextRec = record
  210. { dummy for now PM }
  211. end;
  212. {$endif cpusparc}
  213. {$ifdef cpux86_64}
  214. { get it from glibc/sysdeps/unix/sysv/linux/x86_64/sys/uncontext.h }
  215. PSigContextRec = ^SigContextRec;
  216. SigContextRec = record
  217. end;
  218. {$endif cpux86_64}
  219. {$ifdef cpuarm}
  220. PSigContextRec = ^SigContextRec;
  221. SigContextRec = record
  222. trap_no : dword;
  223. error_code : dword;
  224. oldmask : dword;
  225. arm_r0 : dword;
  226. arm_r1 : dword;
  227. arm_r2 : dword;
  228. arm_r3 : dword;
  229. arm_r4 : dword;
  230. arm_r5 : dword;
  231. arm_r6 : dword;
  232. arm_r7 : dword;
  233. arm_r8 : dword;
  234. arm_r9 : dword;
  235. arm_r10 : dword;
  236. arm_fp : dword;
  237. arm_ip : dword;
  238. arm_sp : dword;
  239. arm_lr : dword;
  240. arm_pc : dword;
  241. arm_cpsr : dword;
  242. fault_address : dword;
  243. end;
  244. { from include/asm-ppc/signal.h }
  245. stack_t = record
  246. ss_sp: pointer;
  247. ss_flags: longint;
  248. ss_size: size_t;
  249. end;
  250. { from include/asm-arm/ucontext.h }
  251. pucontext = ^tucontext;
  252. tucontext = record
  253. uc_flags : dword;
  254. uc_link : pucontext;
  255. uc_stack : stack_t;
  256. uc_mcontext : SigContextRec;
  257. uc_sigmask : sigset_t;
  258. end;
  259. {$endif cpuarm}
  260. PSigInfoRec = ^SigInfoRec;
  261. SigInfoRec = record
  262. si_signo: longint;
  263. si_errno: longint;
  264. si_code: longint;
  265. case longint of
  266. 0:
  267. (pad: array[0..SI_PAD_SIZE-1] of longint);
  268. 1: { kill }
  269. ( kill: record
  270. pid: longint; { sender's pid }
  271. uid : longint; { sender's uid }
  272. end );
  273. 2: { POSIX.1b timers }
  274. ( timer : record
  275. timer1 : cardinal;
  276. timer2 : cardinal;
  277. end );
  278. 3: { POSIX.1b signals }
  279. ( rt : record
  280. pid : longint; { sender's pid }
  281. uid : longint; { sender's uid }
  282. sigval : longint;
  283. end );
  284. 4: { SIGCHLD }
  285. ( sigchld : record
  286. pid : longint; { which child }
  287. uid : longint; { sender's uid }
  288. status : longint; { exit code }
  289. utime : timeval;
  290. stime : timeval;
  291. end );
  292. 5: { SIGILL, SIGFPE, SIGSEGV, SIGBUS }
  293. ( sigfault : record
  294. addr : pointer;{ faulting insn/memory ref. }
  295. end );
  296. 6:
  297. ( sigpoll : record
  298. band : longint; { POLL_IN, POLL_OUT, POLL_MSG }
  299. fd : longint;
  300. end );
  301. end;
  302. SignalHandler = Procedure(Sig : Longint);cdecl;
  303. PSignalHandler = ^SignalHandler;
  304. SignalRestorer = Procedure;cdecl;
  305. PSignalRestorer = ^SignalRestorer;
  306. TSigAction = procedure(Sig: Longint; SigContext: SigContextRec);cdecl;
  307. {$ifdef CPUARM}
  308. {$define NEWSIGNAL}
  309. {$endif CPUARM}
  310. {$ifdef CPUx86_64}
  311. {$define NEWSIGNAL}
  312. {$endif CPUx86_64}
  313. SigActionRec = packed record // this is temporary for the migration
  314. {$ifdef posixworkaround}
  315. sa_handler : signalhandler;
  316. {$else}
  317. Handler : record
  318. case byte of
  319. 0: (Sh: SignalHandler);
  320. 1: (Sa: TSigAction);
  321. end;
  322. {$endif}
  323. {$ifdef NEWSIGNAL}
  324. Sa_Flags : cuint;
  325. Sa_restorer : SignalRestorer; { Obsolete - Don't use }
  326. Sa_Mask : SigSet;
  327. {$else NEWSIGNAL}
  328. Sa_Mask : SigSet;
  329. Sa_Flags : Longint;
  330. Sa_restorer : SignalRestorer; { Obsolete - Don't use }
  331. {$endif NEWSIGNAL}
  332. end;
  333. TSigActionRec = SigActionRec;
  334. PSigActionRec = ^SigActionRec;
  335. {
  336. $Log$
  337. Revision 1.18 2004-04-27 20:47:00 florian
  338. * tried to fix x86-64 signal handling
  339. Revision 1.17 2004/03/27 14:35:13 florian
  340. * structs for arm adapted
  341. Revision 1.16 2004/02/05 01:16:12 florian
  342. + completed x86-64/linux system unit
  343. Revision 1.15 2004/01/01 16:28:16 jonas
  344. * fixed signal handling
  345. Revision 1.14 2003/11/21 00:40:06 florian
  346. * some arm issues fixed
  347. Revision 1.13 2003/11/02 14:53:06 jonas
  348. + sighand and associated record definitions for ppc. Untested.
  349. Revision 1.12 2003/09/14 20:15:01 marco
  350. * Unix reform stage two. Remove all calls from Unix that exist in Baseunix.
  351. Revision 1.11 2003/09/03 14:09:37 florian
  352. * arm fixes to the common rtl code
  353. * some generic math code fixed
  354. * ...
  355. Revision 1.10 2003/08/21 22:24:52 olle
  356. - removed parameter from fpc_iocheck
  357. Revision 1.9 2002/12/24 21:30:20 mazen
  358. - some writeln(s) removed in compiler
  359. + many files added to RTL
  360. * some errors fixed in RTL
  361. Revision 1.8 2002/12/18 16:43:26 marco
  362. * new unix rtl, linux part.....
  363. Revision 1.7 2002/11/12 14:51:44 marco
  364. * signal.
  365. Revision 1.6 2002/09/07 16:01:19 peter
  366. * old logs removed and tabs fixed
  367. Revision 1.5 2002/07/28 20:43:48 florian
  368. * several fixes for linux/powerpc
  369. * several fixes to MT
  370. }