Cygwin: access: Fix X_OK behaviour for backup operators and admins
[newlib-cygwin.git] / newlib / libc / sys / rdos / crt0.S
blobefc3b1633084704f37af25b711fd531e0f7b99bf
1 /*#######################################################################
2 # RDOS operating system
3 # Copyright (C) 1988-2006, Leif Ekblad
5 # This library is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU Lesser General Public License as published
7 # by the Free Software Foundation; either version 2.1 of the License, or
8 # (at your option) any later version.
10 # This library 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 Lesser General Public License for more details.
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
19 # The author of this program may be contacted at leif@rdos.net
21 # crt0.S                                                               
22 # GCC startupcode for RDOS
24 ##########################################################################*/
25   
26 #include "user.def"
28     KEY_ENTRIES = 256
29   
30     .macro UserGate nr 
31     .byte 0x9A
32     .long \nr
33     .word 2
34     .endm 
36     .data
37     .align  8
39 _key_section:
40     .word 0
42 _key_ref_arr:
43     .long 0
45 _key_dtor_arr:
46     .long 0
48         .text
49         .align 4
50                                                                                     
51 /*##########################################################################
53 #   Name       : _start
55 #   Purpose....: GCC startup-code
57 ##########################################################################*/
59         .global _start
61 _start:
62         call get_impure_data_size
63         movl %eax,%ecx
64         UserGate allocate_app_mem_nr
66         xorl %eax,%eax
67         .byte 0x64
68         movl %edx,(%eax)
69         movl %edx,%edi
70         rep
71         stosb
72         pushl %edx
74     movl $(4 * KEY_ENTRIES),%eax
75         movl %eax,%ecx
76     UserGate allocate_app_mem_nr
77     movl $4,%eax
78     .byte 0x64
79     movl %edx,(%eax)
80     movl %edx,%edi
81         xorl %eax,%eax
82     rep
83     stosb
85     movl $(4 * KEY_ENTRIES),%eax
86         movl %eax,%ecx
87     UserGate allocate_app_mem_nr
88     movl %edx,_key_ref_arr
89     movl %edx,%edi
90         xorl %eax,%eax
91     rep
92     stosb
94     movl $(4 * KEY_ENTRIES),%eax
95         movl %eax,%ecx
96     UserGate allocate_app_mem_nr
97     movl %edx,_key_dtor_arr
98     movl %edx,%edi
99         xorl %eax,%eax
100     rep
101     stosb
103         UserGate create_user_section_nr
104         movw %bx,_key_section
106         call __init_rdos
107         add $4, %esp
109         movl $0x1000,%eax
110         UserGate allocate_app_mem_nr
112         pushl %edx
113         UserGate get_cmd_line_nr
115         xorl %ecx,%ecx
116         xorb %ah,%ah
118 arg_loop:
119         movl %edi,(%edx)
120         addl $4,%edx
121         movb (%edi),%al
122         orb %al,%al
123         je arg_done
125 arg_scan:       
126         movb (%edi),%al
127         orb %al,%al
128         je next_arg
130         cmpb $0x22,%al
131         jne arg_no_quote
133         xorb $1,%ah
134         jmp arg_scan_next
136 arg_no_quote:
137         orb %ah,%ah
138         jnz arg_scan_next
140         cmpb $0x20,%al
141         je next_arg
143         cmpb $0x8,%al
144         je next_arg
146 arg_scan_next:
147         incl %edi
148         jmp arg_scan
150 next_arg:
151         incl %ecx
153 to_next_arg:
154         orb %al,%al
155         je arg_done
157         xorb %al,%al
158         movb %al,(%edi)
159         incl %edi
160         movb (%edi),%al
161         cmpb $0x20,%al
162         je to_next_arg
164         cmpb $0x8,%al
165         je to_next_arg
166         
167         jmp arg_loop    
169 arg_done:
170         int $3
171         pushl %ecx
172         call main
173         add $8, %esp
175         pushl %eax
176         call    exit
177                                             
178 /*##########################################################################
180 #   Name       : _exit
182 #   Purpose....: GCC exit-code
184 ##########################################################################*/
186         .global _exit
188 _exit:
189         pushl %ebp
190         movl %esp,%ebp
191         movl 8(%ebp),%eax
192         UserGate unload_exe_nr
193                                                                                     
194 /*##########################################################################
196 #   Name       : __getreent
198 #   Purpose....: ?
200 ##########################################################################*/
202         .global __getreent
204 __getreent:
205     xorl %eax,%eax
206         .byte 0x64
207         movl (%eax),%eax
208         ret
209                                                                                                                             
210 /*##########################################################################
212 #   Name       : __rdos_thread_key_create
214 #   Purpose....: Emulate GCC pthread_key_create
216 #   Parameters.: dtor
218 #   Returns....: Key index
220 ##########################################################################*/
222         .global __rdos_thread_key_create
223         
224 __rdos_thread_key_create:
225     int $3
226         pushl %ebp
227         movl %esp,%ebp
228         pushl %ebx
229         pushl %ecx
231     mov _key_section,%bx
232     UserGate enter_user_section_nr      
234         movl _key_ref_arr,%ebx
235     movl KEY_ENTRIES,%ecx
237 rtkc_scan_loop:
238     movl (%ebx), %eax
239     orl %eax, %eax
240     jz rtkc_entry_found
242     add $4, %ebx
243     loop rtkc_scan_loop
245     movl $-1, %eax
246     jmp rtkc_leave
248 rtkc_entry_found:
249     movb $255,3(%ebx)
250     subl _key_ref_arr,%ebx
251     addl _key_dtor_arr,%ebx
252         movl 8(%ebp),%eax
253         movl %eax,(%ebx)
254         subl _key_dtor_arr,%ebx
255         movl %ebx,%eax
257 rtkc_leave:
258     mov _key_section, %bx
259     UserGate leave_user_section_nr      
261     popl %ecx
262     popl %ebx   
263         leave
264         ret
265                                                                                                                             
266 /*##########################################################################
268 #   Name       : __rdos_thread_key_delete
270 #   Purpose....: Emulate GCC pthread_key_delete
272 #   Parameters.: index
274 #   Returns....: result
276 ##########################################################################*/
278         .global __rdos_thread_key_delete
279         
280 __rdos_thread_key_delete:
281     int $3
282         pushl %ebp
283         movl %esp,%ebp
284         pushl %ebx
286     mov _key_section,%bx
287     UserGate enter_user_section_nr      
289         movl 8(%ebp),%ebx
290         testb $3,%bl
291         jnz rtkd_fail
293     cmpl $(4 * KEY_ENTRIES),%ebx
294     jae rtkd_fail
295         
296     addl _key_ref_arr,%ebx
297     movb $0,3(%ebx)
298     mov (%ebx),%eax
299     orl %eax,%eax
300     jz rtkd_ok
302     subl _key_ref_arr,%ebx    
303     movl $0,(%ebx)
304     jmp rtkd_ok
306 rtkd_fail:
307     movl $1,%eax 
308     jmp rtkd_leave   
310 rtkd_ok:
311     xorl %eax,%eax 
313 rtkd_leave:
314     mov _key_section, %bx
315     UserGate leave_user_section_nr      
317     popl %ebx   
318         leave
319         ret
320                                                                                                                             
321 /*##########################################################################
323 #   Name       : __rdos_thread_getspecific
325 #   Purpose....: Emulate GCC pthread_getspecific
327 #   Parameters.: index
329 #   Returns....: value
331 ##########################################################################*/
333         .global __rdos_thread_getspecific
334         
335 __rdos_thread_getspecific:
336     int $3
337         pushl %ebp
338         movl %esp,%ebp
339         pushl %ebx
341         movl 8(%ebp),%ebx
342         testb $3,%bl
343         jnz rtg_fail
345     cmpl $(4 * KEY_ENTRIES),%ebx
346     jae rtg_fail
348     movl $4,%eax
349     .byte 0x64
350     movl (%eax),%eax
351     addl %eax,%ebx
352     movl (%ebx),%eax
353     jmp rtg_done
355 rtg_fail:
356     xorl %eax,%eax
358 rtg_done:
359     popl %ebx   
360         leave
361         ret
362                                                                                                                             
363 /*##########################################################################
365 #   Name       : __rdos_thread_setspecific
367 #   Purpose....: Emulate GCC pthread_setspecific
369 #   Parameters.: index
370 #                value
372 ##########################################################################*/
374         .global __rdos_thread_setspecific
375         
376 __rdos_thread_setspecific:
377     int $3
378         pushl %ebp
379         movl %esp,%ebp
380         pushl %ebx
381         pushl %ecx
383         movl 8(%ebp),%ebx
384         testb $3,%bl
385         jnz rts_fail
387     cmpl $(4 * KEY_ENTRIES),%ebx
388     jae rts_fail
390     movl $4,%eax
391     .byte 0x64
392     movl (%eax),%eax
393     addl %eax,%ebx
395         movl 12(%ebp),%eax
396     movl %eax,(%ebx)
397     xorl %eax,%eax
398     jmp rts_done
400 rts_fail:
401     movl $1,%eax
403 rts_done:
404     popl %ebx   
405         leave
406         ret