OSDN Git Service

* cygwin/include/signal.h: Add copyright notice.
[pf3gnuchains/pf3gnuchains3x.git] / winsup / cygwin / gendef
1 #!/usr/bin/perl
2 use strict;
3 my $in = shift;
4 my $tls_offsets = shift;
5 my $out = shift;
6 my $sigfe = shift;
7
8 $main::first = 0;
9 if (!defined($in) || !defined($out) || !defined($sigfe)) {
10     die "usage: $0 deffile.in cygtls.h deffile.def sigfe.s\n";
11 }
12
13 require $tls_offsets;
14
15 open(IN, $in) or die "$0: couldn't open \"$in\" - $!\n";
16 my @top = ();
17 while (<IN>) {
18     push(@top, $_);
19     last if /^\s*exports\s*$/i;
20 }
21 my $libline = <IN>;
22 my @in = <IN>;
23 close(IN);
24
25 my %sigfe = ();
26 my @data = ();
27 my @nosigfuncs = ();
28 my @out = ();
29 for (@in) {
30     /\sDATA$/o and do {
31         push(@data, $_);
32         next;
33     };
34     chomp;
35     if (/=/o) {
36         if (s/\s+NOSIGFE\s*$//) {
37         } elsif (s/ SIGFE$//) {
38           my $func = (split(' '))[2];
39           $sigfe{$func} = '_sigfe_' . $func;
40         }
41     } else {
42         my ($func, $sigfe) = m%^\s*(\S+)(?:\s+((?:NO)?SIGR?FE))?$%o;
43         if (defined($sigfe) && $sigfe =~ /^NO/o) {
44             $_ = $func;
45         } else {
46             $sigfe ||= 'sigfe';
47             $_ = '_' . lc($sigfe) . '_' . $func;
48             $sigfe{$func} = $_;
49             $_ = $func . ' = ' . $_;
50         }
51     }
52     s/(\S)\s+(\S)/$1 $2/go;
53     s/(\S)\s+$/$1/o;
54     s/^\s+(\S)/$1/o;
55     push(@out, $_ . "\n");
56 }
57
58 for (@out) {
59     my ($alias, $func) = /^(\S+) = (\S+)\s*$/o;
60     $_ = $alias . ' = ' . $sigfe{$func} . "\n"
61       if defined($func) && $sigfe{$func};
62 }
63 open(OUT, '>', $out) or die "$0: couldn't open \"$out\" - $!\n";
64 print OUT @top, @data, @out;
65 close OUT;
66
67 open(SIGFE, '>', $sigfe) or die "$0: couldn't open sigfe file \"$sigfe\" - $!\n";
68
69 for my $k (sort keys %sigfe) {
70     print SIGFE fefunc($k, $sigfe{$k});
71 }
72 close SIGFE;
73
74 sub fefunc {
75     my $func = '_' . shift;
76     my $fe = '_' . shift;
77     my $extra;
78     my $res = <<EOF;
79         .extern _siglist_index
80         .extern _siglist
81         .extern $func
82         .global $fe
83 $fe:
84         pushl   \$$func
85         jmp     __sigfe
86
87 EOF
88     if (!$main::first++) {
89         $res = <<EOF . longjmp () . $res;
90         .text
91         .global __sigbe
92         .global _sigreturn
93         .global _sigdelayed
94
95         .stabs  "_sigfe:F(0,1)",36,0,0,__sigbe
96 __sigfe:
97         pushl   %edx
98         movl    %fs:4,%eax
99         movl    \$4,%edx
100         xadd    %edx,$tls::stackptr(%eax)
101         leal    __sigbe,%eax
102         xchg    %eax,8(%esp)
103         movl    %eax,(%edx)
104         popl    %edx
105         ret
106
107         .stabs  "_sigbe:F(0,1)",36,0,0,__sigbe
108 __sigbe:
109         pushl   %eax
110         pushl   %edx
111         movl    \$-4,%edx
112 1:      movl    %fs:4,%eax
113         xadd    %edx,$tls::stackptr(%eax)
114         xorl    %eax,%eax
115         lock    xchg %eax,-4(%edx)
116         testl   %eax,%eax
117         jnz     2f
118         call    _low_priority_sleep
119         xorl    %edx,%edx
120         jmp     1b
121 2:      xchg    %eax,4(%esp)
122         popl    %edx
123         ret
124
125         .stabs  "sigreturn:F(0,1)",36,0,0,_sigreturn
126 _sigreturn:
127         addl    \$4,%esp                        # Remove argument
128         call    _set_process_mask\@4
129
130         movl    %fs:4,%eax
131
132         cmpl    \$0,$tls::sig(%eax)     # Did a signal come in?
133         jnz     3f                      # Yes, if non-zero
134
135 1:      popl    %edx                    # saved errno
136         testl   %edx,%edx               # Is it < 0
137         jl      2f                      # yup.  ignore it
138         movl    $tls::errno_addr(%eax),%eax
139         movl    %edx,(%eax)
140 2:      popl    %eax
141         popl    %ebx
142         popl    %ecx
143         popl    %edx
144         popl    %edi
145         popl    %esi
146         popf
147         popl    %ebp
148         jmp     __sigbe
149
150         .stabs  "sigdelayed:F(0,1)",36,0,0,_sigdelayed
151 _sigdelayed:
152         pushl   %ebp
153         movl    %esp,%ebp
154         pushf
155         pushl   %esi
156         pushl   %edi
157         pushl   %edx
158         pushl   %ecx
159         pushl   %ebx
160         pushl   %eax
161         movl    %fs:4,%ebx
162         pushl   $tls::saved_errno(%ebx) # saved errno
163 3:      pushl   $tls::oldmask(%ebx)     # oldmask
164         pushl   $tls::sig(%ebx)         # signal argument
165         pushl   \$_sigreturn
166
167         call    _reset_signal_arrived\@0
168         pushl   $tls::func(%ebx)        # signal func
169         pushl   $tls::newmask(%ebx)     # newmask - eaten by set_process_mask
170
171         call    _set_process_mask\@4
172         cmpl    \$0,$tls::threadkill(%ebx)#pthread_kill signal?
173         jnz     4f                      #yes.  Callee clears signal number
174         movl    \$0,$tls::sig(%ebx)     # zero the signal number as a
175                                         # flag to the signal handler thread
176                                         # that it is ok to set up sigsave
177 4:      popl    %ebx
178         jmp     *%ebx
179
180 EOF
181     }
182     return $res;
183 }
184
185 sub longjmp {
186     return <<EOF;
187
188         .globl  _longjmp
189
190 _longjmp:
191         pushl   %ebp
192         movl    %esp,%ebp
193         movl    8(%ebp),%edi
194         movl    12(%ebp),%eax
195         testl   %eax,%eax
196         jne     0f
197         incl    %eax
198 0:
199         movl    %eax,0(%edi)
200         movl    24(%edi),%ebp
201         pushfl
202         popl    %ebx
203         movw    42(%edi),%ax
204         movw    %ax,%ss
205         movl    28(%edi),%esp
206         pushl   32(%edi)
207         pushl   %ebx
208         movw    36(%edi),%ax
209         movw    %ax,%es
210         movw    40(%edi),%ax
211         movw    %ax,%gs
212         movl    %fs:4,%eax
213         leal    ($tls::stack)(%eax),%edx
214         movl    %edx,($tls::stackptr)(%eax)
215         movl    0(%edi),%eax
216         movl    4(%edi),%ebx
217         movl    8(%edi),%ecx
218         movl    12(%edi),%edx
219         movl    16(%edi),%esi
220         movl    20(%edi),%edi
221         popfl
222         ret
223
224 EOF
225 }