OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [newlib-1.17.0/] [newlib/] [libc/] [sys/] [rdos/] [crt0.S] - Rev 158

Go to most recent revision | Compare with Previous | Blame | View Log

/*#######################################################################
# 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

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.