summaryrefslogtreecommitdiffstats
path: root/newlib/libc/sys/rdos/crt0.S
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2006-01-31 19:33:56 +0000
committerJeff Johnston <jjohnstn@redhat.com>2006-01-31 19:33:56 +0000
commitd968b3c86fc59507e3604ebc704aeb111f301a12 (patch)
treeb4a0f936f8810a8cf695d4b42f7c733041bc9d85 /newlib/libc/sys/rdos/crt0.S
parent63a149a18fd9437576cdb81520a2246b14705e57 (diff)
downloadcygnal-d968b3c86fc59507e3604ebc704aeb111f301a12.tar.gz
cygnal-d968b3c86fc59507e3604ebc704aeb111f301a12.tar.bz2
cygnal-d968b3c86fc59507e3604ebc704aeb111f301a12.zip
2006-01-31 Leif Ekblad <leif@rdos.net>
* configure.host: RDOS support added * libc/include/sys/config.h: Ditto. * libc/sys/rdos/Makefile.am, libc/sys/rdos/Makefile.in: New files. * libc/sys/rdos/aclocal.m4, libc/sys/rdos/chown.c: Ditto. * libc/sys/rdos/close.c, libc/sys/rdos/config.h: Ditto. * libc/sys/rdos/configure, libc/sys/rdos/configure.in: Ditto. * libc/sys/rdos/crt0.S, libc/sys/rdos/execve.c: Ditto. * libc/sys/rdos/fork.c, libc/sys/rdos/fstat.c: Ditto. * libc/sys/rdos/getenv.c, libc/sys/rdos/getpid.c: Ditto. * libc/sys/rdos/gettod.c, libc/sys/rdos/isatty.c: Ditto. * libc/sys/rdos/kill.c, libc/sys/rdos/link.c: Ditto. * libc/sys/rdos/lseek.c, libc/sys/rdos/open.c: Ditto. * libc/sys/rdos/rdos.S, libc/sys/rdos/rdos.h: Ditto. * libc/sys/rdos/rdoshelp.c, libc/sys/rdos/read.c: Ditto. * libc/sys/rdos/readlink.c, libc/sys/rdos/sbrk.c: Ditto. * libc/sys/rdos/stat.c, libc/sys/rdos/symlink.c: Ditto. * libc/sys/rdos/times.c, libc/sys/rdos/unlink.c: Ditto. * libc/sys/rdos/user.def, libc/sys/rdos/wait.c: Ditto. * libc/sys/rdos/write.c: Ditto.
Diffstat (limited to 'newlib/libc/sys/rdos/crt0.S')
-rw-r--r--newlib/libc/sys/rdos/crt0.S406
1 files changed, 406 insertions, 0 deletions
diff --git a/newlib/libc/sys/rdos/crt0.S b/newlib/libc/sys/rdos/crt0.S
new file mode 100644
index 000000000..efc3b1633
--- /dev/null
+++ b/newlib/libc/sys/rdos/crt0.S
@@ -0,0 +1,406 @@
+/*#######################################################################
+# RDOS operating system
+# Copyright (C) 1988-2006, Leif Ekblad
+#
+# This library is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published
+# by the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# The author of this program may be contacted at leif@rdos.net
+#
+# crt0.S
+# GCC startupcode for RDOS
+#
+##########################################################################*/
+
+#include "user.def"
+
+ KEY_ENTRIES = 256
+
+ .macro UserGate nr
+ .byte 0x9A
+ .long \nr
+ .word 2
+ .endm
+
+ .data
+ .align 8
+
+_key_section:
+ .word 0
+
+_key_ref_arr:
+ .long 0
+
+_key_dtor_arr:
+ .long 0
+
+ .text
+ .align 4
+
+/*##########################################################################
+#
+# Name : _start
+#
+# Purpose....: GCC startup-code
+#
+##########################################################################*/
+
+ .global _start
+
+_start:
+ call get_impure_data_size
+ movl %eax,%ecx
+ UserGate allocate_app_mem_nr
+
+ xorl %eax,%eax
+ .byte 0x64
+ movl %edx,(%eax)
+ movl %edx,%edi
+ rep
+ stosb
+ pushl %edx
+
+ movl $(4 * KEY_ENTRIES),%eax
+ movl %eax,%ecx
+ UserGate allocate_app_mem_nr
+ movl $4,%eax
+ .byte 0x64
+ movl %edx,(%eax)
+ movl %edx,%edi
+ xorl %eax,%eax
+ rep
+ stosb
+
+ movl $(4 * KEY_ENTRIES),%eax
+ movl %eax,%ecx
+ UserGate allocate_app_mem_nr
+ movl %edx,_key_ref_arr
+ movl %edx,%edi
+ xorl %eax,%eax
+ rep
+ stosb
+
+ movl $(4 * KEY_ENTRIES),%eax
+ movl %eax,%ecx
+ UserGate allocate_app_mem_nr
+ movl %edx,_key_dtor_arr
+ movl %edx,%edi
+ xorl %eax,%eax
+ rep
+ stosb
+
+ UserGate create_user_section_nr
+ movw %bx,_key_section
+
+ call __init_rdos
+ add $4, %esp
+
+ movl $0x1000,%eax
+ UserGate allocate_app_mem_nr
+
+ pushl %edx
+ UserGate get_cmd_line_nr
+
+ xorl %ecx,%ecx
+ xorb %ah,%ah
+
+arg_loop:
+ movl %edi,(%edx)
+ addl $4,%edx
+ movb (%edi),%al
+ orb %al,%al
+ je arg_done
+
+arg_scan:
+ movb (%edi),%al
+ orb %al,%al
+ je next_arg
+
+ cmpb $0x22,%al
+ jne arg_no_quote
+
+ xorb $1,%ah
+ jmp arg_scan_next
+
+arg_no_quote:
+ orb %ah,%ah
+ jnz arg_scan_next
+
+ cmpb $0x20,%al
+ je next_arg
+
+ cmpb $0x8,%al
+ je next_arg
+
+arg_scan_next:
+ incl %edi
+ jmp arg_scan
+
+next_arg:
+ incl %ecx
+
+to_next_arg:
+ orb %al,%al
+ je arg_done
+
+ xorb %al,%al
+ movb %al,(%edi)
+ incl %edi
+ movb (%edi),%al
+ cmpb $0x20,%al
+ je to_next_arg
+
+ cmpb $0x8,%al
+ je to_next_arg
+
+ jmp arg_loop
+
+arg_done:
+ int $3
+ pushl %ecx
+ call main
+ add $8, %esp
+
+ pushl %eax
+ call exit
+
+/*##########################################################################
+#
+# Name : _exit
+#
+# Purpose....: GCC exit-code
+#
+##########################################################################*/
+
+ .global _exit
+
+_exit:
+ pushl %ebp
+ movl %esp,%ebp
+ movl 8(%ebp),%eax
+ UserGate unload_exe_nr
+
+/*##########################################################################
+#
+# Name : __getreent
+#
+# Purpose....: ?
+#
+##########################################################################*/
+
+ .global __getreent
+
+__getreent:
+ xorl %eax,%eax
+ .byte 0x64
+ movl (%eax),%eax
+ ret
+
+/*##########################################################################
+#
+# Name : __rdos_thread_key_create
+#
+# Purpose....: Emulate GCC pthread_key_create
+#
+# Parameters.: dtor
+#
+# Returns....: Key index
+#
+##########################################################################*/
+
+ .global __rdos_thread_key_create
+
+__rdos_thread_key_create:
+ int $3
+ pushl %ebp
+ movl %esp,%ebp
+ pushl %ebx
+ pushl %ecx
+
+ mov _key_section,%bx
+ UserGate enter_user_section_nr
+
+ movl _key_ref_arr,%ebx
+ movl KEY_ENTRIES,%ecx
+
+rtkc_scan_loop:
+ movl (%ebx), %eax
+ orl %eax, %eax
+ jz rtkc_entry_found
+
+ add $4, %ebx
+ loop rtkc_scan_loop
+
+ movl $-1, %eax
+ jmp rtkc_leave
+
+rtkc_entry_found:
+ movb $255,3(%ebx)
+ subl _key_ref_arr,%ebx
+ addl _key_dtor_arr,%ebx
+ movl 8(%ebp),%eax
+ movl %eax,(%ebx)
+ subl _key_dtor_arr,%ebx
+ movl %ebx,%eax
+
+rtkc_leave:
+ mov _key_section, %bx
+ UserGate leave_user_section_nr
+
+ popl %ecx
+ popl %ebx
+ leave
+ ret
+
+/*##########################################################################
+#
+# Name : __rdos_thread_key_delete
+#
+# Purpose....: Emulate GCC pthread_key_delete
+#
+# Parameters.: index
+#
+# Returns....: result
+#
+##########################################################################*/
+
+ .global __rdos_thread_key_delete
+
+__rdos_thread_key_delete:
+ int $3
+ pushl %ebp
+ movl %esp,%ebp
+ pushl %ebx
+
+ mov _key_section,%bx
+ UserGate enter_user_section_nr
+
+ movl 8(%ebp),%ebx
+ testb $3,%bl
+ jnz rtkd_fail
+
+ cmpl $(4 * KEY_ENTRIES),%ebx
+ jae rtkd_fail
+
+ addl _key_ref_arr,%ebx
+ movb $0,3(%ebx)
+ mov (%ebx),%eax
+ orl %eax,%eax
+ jz rtkd_ok
+
+ subl _key_ref_arr,%ebx
+ movl $0,(%ebx)
+ jmp rtkd_ok
+
+rtkd_fail:
+ movl $1,%eax
+ jmp rtkd_leave
+
+rtkd_ok:
+ xorl %eax,%eax
+
+rtkd_leave:
+ mov _key_section, %bx
+ UserGate leave_user_section_nr
+
+ popl %ebx
+ leave
+ ret
+
+/*##########################################################################
+#
+# Name : __rdos_thread_getspecific
+#
+# Purpose....: Emulate GCC pthread_getspecific
+#
+# Parameters.: index
+#
+# Returns....: value
+#
+##########################################################################*/
+
+ .global __rdos_thread_getspecific
+
+__rdos_thread_getspecific:
+ int $3
+ pushl %ebp
+ movl %esp,%ebp
+ pushl %ebx
+
+ movl 8(%ebp),%ebx
+ testb $3,%bl
+ jnz rtg_fail
+
+ cmpl $(4 * KEY_ENTRIES),%ebx
+ jae rtg_fail
+
+ movl $4,%eax
+ .byte 0x64
+ movl (%eax),%eax
+ addl %eax,%ebx
+ movl (%ebx),%eax
+ jmp rtg_done
+
+rtg_fail:
+ xorl %eax,%eax
+
+rtg_done:
+ popl %ebx
+ leave
+ ret
+
+/*##########################################################################
+#
+# Name : __rdos_thread_setspecific
+#
+# Purpose....: Emulate GCC pthread_setspecific
+#
+# Parameters.: index
+# value
+#
+##########################################################################*/
+
+ .global __rdos_thread_setspecific
+
+__rdos_thread_setspecific:
+ int $3
+ pushl %ebp
+ movl %esp,%ebp
+ pushl %ebx
+ pushl %ecx
+
+ movl 8(%ebp),%ebx
+ testb $3,%bl
+ jnz rts_fail
+
+ cmpl $(4 * KEY_ENTRIES),%ebx
+ jae rts_fail
+
+ movl $4,%eax
+ .byte 0x64
+ movl (%eax),%eax
+ addl %eax,%ebx
+
+ movl 12(%ebp),%eax
+ movl %eax,(%ebx)
+ xorl %eax,%eax
+ jmp rts_done
+
+rts_fail:
+ movl $1,%eax
+
+rts_done:
+ popl %ebx
+ leave
+ ret