diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2006-01-31 19:33:56 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2006-01-31 19:33:56 +0000 |
commit | d968b3c86fc59507e3604ebc704aeb111f301a12 (patch) | |
tree | b4a0f936f8810a8cf695d4b42f7c733041bc9d85 /newlib/libc/sys/rdos/crt0.S | |
parent | 63a149a18fd9437576cdb81520a2246b14705e57 (diff) | |
download | cygnal-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.S | 406 |
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 |