update CLib startup code
git-svn-id: svn://kolibrios.org@615 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
3be3768ce0
commit
34c712de5d
77
programs/develop/open watcom/trunk/clib/crt/atexit.c
Normal file
77
programs/develop/open watcom/trunk/clib/crt/atexit.c
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Open Watcom Project
|
||||||
|
*
|
||||||
|
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* This file contains Original Code and/or Modifications of Original
|
||||||
|
* Code as defined in and that are subject to the Sybase Open Watcom
|
||||||
|
* Public License version 1.0 (the 'License'). You may not use this file
|
||||||
|
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
|
||||||
|
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
|
||||||
|
* provided with the Original Code and Modifications, and is also
|
||||||
|
* available at www.sybase.com/developer/opensource.
|
||||||
|
*
|
||||||
|
* The Original Code and all software distributed under the License are
|
||||||
|
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||||
|
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
|
||||||
|
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
|
||||||
|
* NON-INFRINGEMENT. Please see the License for the specific language
|
||||||
|
* governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* Description: Module for adding functions to the atexit() list, as well
|
||||||
|
* invoking the functions on library shutdown.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#include "variety.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "rtdata.h"
|
||||||
|
#include "extfunc.h"
|
||||||
|
#include "rtinit.h"
|
||||||
|
|
||||||
|
#define EXIT_LIMIT 32
|
||||||
|
|
||||||
|
static void (* _HUGEDATA _ExitList[EXIT_LIMIT])( void );
|
||||||
|
static int _ExitCount;
|
||||||
|
|
||||||
|
int atexit( void (*func)( void ) )
|
||||||
|
{
|
||||||
|
if( _ExitCount < EXIT_LIMIT ) {
|
||||||
|
_ExitList[ _ExitCount++ ] = func;
|
||||||
|
return( 0 ); /* indicate added successfully */
|
||||||
|
}
|
||||||
|
return( -1 ); /* indicate no room */
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef void exit_fn( void );
|
||||||
|
#if defined(_M_IX86)
|
||||||
|
#pragma aux (__outside_CLIB) exit_fn;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void _Full_at_exit_rtn( void )
|
||||||
|
{
|
||||||
|
int count;
|
||||||
|
exit_fn *func;
|
||||||
|
|
||||||
|
count = _ExitCount;
|
||||||
|
if( count == ( EXIT_LIMIT + 1 ) ) {
|
||||||
|
return; /* already done once */
|
||||||
|
}
|
||||||
|
_ExitCount = EXIT_LIMIT + 1; /* prevent others being registered */
|
||||||
|
/* call functions in reverse order of their registration */
|
||||||
|
while( count != 0 ) {
|
||||||
|
--count;
|
||||||
|
func = _ExitList[ count ];
|
||||||
|
(*func)(); /* invoke user exit routine */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AYI( _Full_at_exit_rtn, INIT_PRIORITY_PROGRAM + 32 );
|
71
programs/develop/open watcom/trunk/clib/crt/cmdname.c
Normal file
71
programs/develop/open watcom/trunk/clib/crt/cmdname.c
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Open Watcom Project
|
||||||
|
*
|
||||||
|
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* This file contains Original Code and/or Modifications of Original
|
||||||
|
* Code as defined in and that are subject to the Sybase Open Watcom
|
||||||
|
* Public License version 1.0 (the 'License'). You may not use this file
|
||||||
|
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
|
||||||
|
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
|
||||||
|
* provided with the Original Code and Modifications, and is also
|
||||||
|
* available at www.sybase.com/developer/opensource.
|
||||||
|
*
|
||||||
|
* The Original Code and all software distributed under the License are
|
||||||
|
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||||
|
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
|
||||||
|
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
|
||||||
|
* NON-INFRINGEMENT. Please see the License for the specific language
|
||||||
|
* governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* Description: Implementation of _cmdname().
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __WATCOMC__
|
||||||
|
#include "variety.h"
|
||||||
|
#else
|
||||||
|
#define _WCRTLINK
|
||||||
|
#endif
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
extern char **_argv; /* argument vector */
|
||||||
|
|
||||||
|
/* NOTE: This file isn't used for QNX. It's got its own version. */
|
||||||
|
|
||||||
|
#ifdef __LINUX__
|
||||||
|
|
||||||
|
_WCRTLINK char *_cmdname( char *name )
|
||||||
|
{
|
||||||
|
int save_errno = errno;
|
||||||
|
int result = readlink( "/proc/self/exe", name, PATH_MAX );
|
||||||
|
|
||||||
|
errno = save_errno;
|
||||||
|
|
||||||
|
/* fall back to argv[0] if readlink doesn't work */
|
||||||
|
if( result == -1 || result == PATH_MAX )
|
||||||
|
return( strcpy( name, _argv[0] ) );
|
||||||
|
|
||||||
|
/* readlink does not add a NUL so we need to do it ourselves */
|
||||||
|
name[result] = '\0';
|
||||||
|
return( name );
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
_WCRTLINK char *_cmdname( char *name )
|
||||||
|
{
|
||||||
|
return( strcpy( name, _argv[0] ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
106
programs/develop/open watcom/trunk/clib/crt/extfunc.h
Normal file
106
programs/develop/open watcom/trunk/clib/crt/extfunc.h
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Open Watcom Project
|
||||||
|
*
|
||||||
|
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* This file contains Original Code and/or Modifications of Original
|
||||||
|
* Code as defined in and that are subject to the Sybase Open Watcom
|
||||||
|
* Public License version 1.0 (the 'License'). You may not use this file
|
||||||
|
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
|
||||||
|
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
|
||||||
|
* provided with the Original Code and Modifications, and is also
|
||||||
|
* available at www.sybase.com/developer/opensource.
|
||||||
|
*
|
||||||
|
* The Original Code and all software distributed under the License are
|
||||||
|
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||||
|
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
|
||||||
|
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
|
||||||
|
* NON-INFRINGEMENT. Please see the License for the specific language
|
||||||
|
* governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* Description: Special interface for calls to non-Watcom routines from
|
||||||
|
* inside clib (x86 specific).
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef EXTFUNC_H_INCLUDED
|
||||||
|
#define EXTFUNC_H_INCLUDED
|
||||||
|
|
||||||
|
#include "variety.h"
|
||||||
|
|
||||||
|
#if defined(_M_IX86)
|
||||||
|
#if !defined(__WINDOWS__)
|
||||||
|
#if defined(__BIG_DATA__)
|
||||||
|
#define __DS ds
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(__FLAT__)
|
||||||
|
#define __ES es
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__386__)
|
||||||
|
#if defined(__WINDOWS__) || !defined(__FLAT__)
|
||||||
|
#define __FS fs
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __GS gs
|
||||||
|
#if defined(__SW_3S)
|
||||||
|
#define __AX eax
|
||||||
|
#define __BX ebx
|
||||||
|
#define __CX ecx
|
||||||
|
#define __DX edx
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __AX
|
||||||
|
#define __AX
|
||||||
|
#endif
|
||||||
|
#ifndef __BX
|
||||||
|
#define __BX
|
||||||
|
#endif
|
||||||
|
#ifndef __CX
|
||||||
|
#define __CX
|
||||||
|
#endif
|
||||||
|
#ifndef __DX
|
||||||
|
#define __DX
|
||||||
|
#endif
|
||||||
|
#ifndef __DS
|
||||||
|
#define __DS
|
||||||
|
#endif
|
||||||
|
#ifndef __ES
|
||||||
|
#define __ES
|
||||||
|
#endif
|
||||||
|
#ifndef __FS
|
||||||
|
#define __FS
|
||||||
|
#endif
|
||||||
|
#ifndef __GS
|
||||||
|
#define __GS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#pragma aux __outside_CLIB modify [__AX __BX __CX __DX __DS __ES __FS __GS];
|
||||||
|
/*
|
||||||
|
use as follows:
|
||||||
|
|
||||||
|
typedef void vfv( void );
|
||||||
|
#pragma aux (__outside_CLIB) __vfv;
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef __AX
|
||||||
|
#undef __BX
|
||||||
|
#undef __CX
|
||||||
|
#undef __DX
|
||||||
|
#undef __DS
|
||||||
|
#undef __ES
|
||||||
|
#undef __FS
|
||||||
|
#undef __GS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
43
programs/develop/open watcom/trunk/clib/crt/ljmphdl.c
Normal file
43
programs/develop/open watcom/trunk/clib/crt/ljmphdl.c
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Open Watcom Project
|
||||||
|
*
|
||||||
|
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* This file contains Original Code and/or Modifications of Original
|
||||||
|
* Code as defined in and that are subject to the Sybase Open Watcom
|
||||||
|
* Public License version 1.0 (the 'License'). You may not use this file
|
||||||
|
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
|
||||||
|
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
|
||||||
|
* provided with the Original Code and Modifications, and is also
|
||||||
|
* available at www.sybase.com/developer/opensource.
|
||||||
|
*
|
||||||
|
* The Original Code and all software distributed under the License are
|
||||||
|
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||||
|
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
|
||||||
|
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
|
||||||
|
* NON-INFRINGEMENT. Please see the License for the specific language
|
||||||
|
* governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* Description: Default longjmp handler.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#include "variety.h"
|
||||||
|
#include "ljmphdl.h"
|
||||||
|
|
||||||
|
static void default_handler( void _WCFAR *p )
|
||||||
|
{
|
||||||
|
p = p;
|
||||||
|
}
|
||||||
|
#if defined(_M_IX86)
|
||||||
|
#pragma aux (__arg_convention) default_handler;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_WCRTLINKD pfun __longjmp_handler = &default_handler;
|
50
programs/develop/open watcom/trunk/clib/crt/ljmphdl.h
Normal file
50
programs/develop/open watcom/trunk/clib/crt/ljmphdl.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Open Watcom Project
|
||||||
|
*
|
||||||
|
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* This file contains Original Code and/or Modifications of Original
|
||||||
|
* Code as defined in and that are subject to the Sybase Open Watcom
|
||||||
|
* Public License version 1.0 (the 'License'). You may not use this file
|
||||||
|
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
|
||||||
|
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
|
||||||
|
* provided with the Original Code and Modifications, and is also
|
||||||
|
* available at www.sybase.com/developer/opensource.
|
||||||
|
*
|
||||||
|
* The Original Code and all software distributed under the License are
|
||||||
|
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||||
|
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
|
||||||
|
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
|
||||||
|
* NON-INFRINGEMENT. Please see the License for the specific language
|
||||||
|
* governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* Description: WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
|
||||||
|
* DESCRIBE IT HERE!
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _LJMPHDL_H_INCLUDED
|
||||||
|
#define _LJMPHDL_H_INCLUDED
|
||||||
|
|
||||||
|
#include "variety.h"
|
||||||
|
|
||||||
|
typedef void (*pfun)( void _WCFAR * );
|
||||||
|
|
||||||
|
#if defined(__386__)
|
||||||
|
#pragma aux __arg_convention parm caller [eax dx];
|
||||||
|
#pragma aux (__arg_convention) pfun;
|
||||||
|
#elif defined(M_I86)
|
||||||
|
#pragma aux __arg_convention parm caller [ax dx];
|
||||||
|
#pragma aux (__arg_convention) pfun;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_WCRTLINKD extern pfun __longjmp_handler;
|
||||||
|
|
||||||
|
#endif
|
76
programs/develop/open watcom/trunk/clib/crt/seterrno.c
Normal file
76
programs/develop/open watcom/trunk/clib/crt/seterrno.c
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Open Watcom Project
|
||||||
|
*
|
||||||
|
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* This file contains Original Code and/or Modifications of Original
|
||||||
|
* Code as defined in and that are subject to the Sybase Open Watcom
|
||||||
|
* Public License version 1.0 (the 'License'). You may not use this file
|
||||||
|
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
|
||||||
|
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
|
||||||
|
* provided with the Original Code and Modifications, and is also
|
||||||
|
* available at www.sybase.com/developer/opensource.
|
||||||
|
*
|
||||||
|
* The Original Code and all software distributed under the License are
|
||||||
|
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||||
|
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
|
||||||
|
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
|
||||||
|
* NON-INFRINGEMENT. Please see the License for the specific language
|
||||||
|
* governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* Description: Implementation of __set_errno().
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __WATCOMC__
|
||||||
|
|
||||||
|
#include "variety.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include "rtdata.h"
|
||||||
|
#include "seterrno.h"
|
||||||
|
|
||||||
|
_WCRTLINK void __set_errno( unsigned int err )
|
||||||
|
{
|
||||||
|
_RWD_errno = err;
|
||||||
|
}
|
||||||
|
|
||||||
|
_WCRTLINK void __set_EDOM()
|
||||||
|
{
|
||||||
|
__set_errno( EDOM );
|
||||||
|
}
|
||||||
|
|
||||||
|
_WCRTLINK void __set_ERANGE()
|
||||||
|
{
|
||||||
|
__set_errno( ERANGE );
|
||||||
|
}
|
||||||
|
|
||||||
|
_WCRTLINK int __set_EINVAL()
|
||||||
|
{
|
||||||
|
__set_errno( EINVAL );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !defined(__UNIX__) && !defined(__NETWARE__)
|
||||||
|
_WCRTLINK void __set_doserrno( unsigned int err )
|
||||||
|
{
|
||||||
|
_RWD_doserrno = err;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
void __set_errno( unsigned int err )
|
||||||
|
{
|
||||||
|
errno = err;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
52
programs/develop/open watcom/trunk/clib/crt/seterrno.h
Normal file
52
programs/develop/open watcom/trunk/clib/crt/seterrno.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Open Watcom Project
|
||||||
|
*
|
||||||
|
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* This file contains Original Code and/or Modifications of Original
|
||||||
|
* Code as defined in and that are subject to the Sybase Open Watcom
|
||||||
|
* Public License version 1.0 (the 'License'). You may not use this file
|
||||||
|
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
|
||||||
|
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
|
||||||
|
* provided with the Original Code and Modifications, and is also
|
||||||
|
* available at www.sybase.com/developer/opensource.
|
||||||
|
*
|
||||||
|
* The Original Code and all software distributed under the License are
|
||||||
|
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||||
|
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
|
||||||
|
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
|
||||||
|
* NON-INFRINGEMENT. Please see the License for the specific language
|
||||||
|
* governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* Description: errno related CLIB internal declarations.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _SETERNO_H_INCLUDED
|
||||||
|
#define _SETERNO_H_INCLUDED
|
||||||
|
|
||||||
|
#include "variety.h"
|
||||||
|
|
||||||
|
// defined in _dos\c\dosret.c
|
||||||
|
_WCRTLINK extern int __set_errno_dos( unsigned int );
|
||||||
|
#if defined(__NT__)
|
||||||
|
_WCRTLINK extern int __set_errno_nt( void );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// defined in startup\c\seterrno.c
|
||||||
|
_WCRTLINK extern void __set_errno( unsigned int );
|
||||||
|
_WCRTLINK extern int __set_EINVAL( void );
|
||||||
|
_WCRTLINK extern void __set_EDOM( void );
|
||||||
|
_WCRTLINK extern void __set_ERANGE( void );
|
||||||
|
#if !defined(__UNIX__)
|
||||||
|
_WCRTLINK extern void __set_doserrno( unsigned int );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
177
programs/develop/open watcom/trunk/clib/crt/stjmp386.asm
Normal file
177
programs/develop/open watcom/trunk/clib/crt/stjmp386.asm
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
;*****************************************************************************
|
||||||
|
;*
|
||||||
|
;* Open Watcom Project
|
||||||
|
;*
|
||||||
|
;* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
|
||||||
|
;*
|
||||||
|
;* ========================================================================
|
||||||
|
;*
|
||||||
|
;* This file contains Original Code and/or Modifications of Original
|
||||||
|
;* Code as defined in and that are subject to the Sybase Open Watcom
|
||||||
|
;* Public License version 1.0 (the 'License'). You may not use this file
|
||||||
|
;* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
|
||||||
|
;* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
|
||||||
|
;* provided with the Original Code and Modifications, and is also
|
||||||
|
;* available at www.sybase.com/developer/opensource.
|
||||||
|
;*
|
||||||
|
;* The Original Code and all software distributed under the License are
|
||||||
|
;* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||||
|
;* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
|
||||||
|
;* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
|
||||||
|
;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
|
||||||
|
;* NON-INFRINGEMENT. Please see the License for the specific language
|
||||||
|
;* governing rights and limitations under the License.
|
||||||
|
;*
|
||||||
|
;* ========================================================================
|
||||||
|
;*
|
||||||
|
;* Description: C library setjmp/longjmp support for 386 processors
|
||||||
|
;*
|
||||||
|
;*****************************************************************************
|
||||||
|
|
||||||
|
.386p
|
||||||
|
include mdef.inc
|
||||||
|
include struct.inc
|
||||||
|
|
||||||
|
codeptr "C",__longjmp_handler
|
||||||
|
|
||||||
|
modstart setjmp
|
||||||
|
|
||||||
|
ifdef __386__
|
||||||
|
ifdef __OS2__
|
||||||
|
xref DosUnwindException
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
ifdef __NT__
|
||||||
|
xref _RtlUnwind@16
|
||||||
|
endif
|
||||||
|
|
||||||
|
xdefp "C",_setjmp
|
||||||
|
defpe _setjmp
|
||||||
|
mov [eax],ebx ; save registers
|
||||||
|
mov 4[eax],ecx
|
||||||
|
mov 8[eax],edx
|
||||||
|
mov 12[eax],esi
|
||||||
|
mov 16[eax],edi
|
||||||
|
mov 20[eax],ebp
|
||||||
|
pop 24[eax] ; get return address
|
||||||
|
mov 28[eax],esp
|
||||||
|
push 24[eax] ; push return address back on stack
|
||||||
|
mov 32[eax],es ; save segment registers
|
||||||
|
mov 34[eax],ds
|
||||||
|
mov 36[eax],cs
|
||||||
|
mov 38[eax],fs
|
||||||
|
mov 40[eax],gs
|
||||||
|
mov 42[eax],ss
|
||||||
|
ifdef __NT__
|
||||||
|
push fs:[0] ; touched this line to cause recompile
|
||||||
|
pop 44[eax]
|
||||||
|
endif
|
||||||
|
ifdef __386__
|
||||||
|
ifdef __OS2__
|
||||||
|
push fs:[0] ; get exception chain
|
||||||
|
pop 44[eax] ; ...
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
sub eax,eax ; return 0
|
||||||
|
ret ; return
|
||||||
|
_setjmp endp
|
||||||
|
|
||||||
|
;
|
||||||
|
; There is a pragma for longjmp, saying that it aborts, therefore
|
||||||
|
; the code generator does a jmp to here as opposed to a call.
|
||||||
|
|
||||||
|
xdefp "C",longjmp
|
||||||
|
defpe longjmp
|
||||||
|
ifdef __STACK__
|
||||||
|
pop eax ; get address of jmp_buf
|
||||||
|
pop edx ; get return code
|
||||||
|
endif
|
||||||
|
; Warning, warning!
|
||||||
|
; the profiler knows about the stack frame that longjmp generates.
|
||||||
|
; do not change these 3 instructions without also changing the findLongJmpStack
|
||||||
|
; pragma in profilog.c
|
||||||
|
;
|
||||||
|
push edx
|
||||||
|
push eax ; save jmp_buf & retval in safe place
|
||||||
|
mov ebp,esp
|
||||||
|
;
|
||||||
|
; end warning
|
||||||
|
;
|
||||||
|
ifdef __NT__
|
||||||
|
push eax ; save address of jmp_buf
|
||||||
|
mov eax,[eax+44]
|
||||||
|
cmp eax,fs:[0]
|
||||||
|
jne dounwind
|
||||||
|
jmp short done_unwind
|
||||||
|
dounwind:
|
||||||
|
push 0
|
||||||
|
push offset done_unwind
|
||||||
|
push eax ; unwind up to but not including SEH active
|
||||||
|
; at setjmp()
|
||||||
|
call _RtlUnwind@16 ; trashes most registers except for ebp
|
||||||
|
done_unwind:
|
||||||
|
mov esp,ebp
|
||||||
|
mov eax,0[ebp]
|
||||||
|
mov edx,4[ebp]
|
||||||
|
endif
|
||||||
|
ifdef __386__
|
||||||
|
ifdef __OS2__
|
||||||
|
push eax ; save address of jmp_buf
|
||||||
|
push 0
|
||||||
|
;; push offset unwind
|
||||||
|
mov eax, offset unwind
|
||||||
|
push eax
|
||||||
|
mov eax,8[esp]
|
||||||
|
push 44[eax]
|
||||||
|
call DosUnwindException
|
||||||
|
unwind: add esp,12
|
||||||
|
pop eax ; restore address of jmp_buf
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
push eax ; save parm regs
|
||||||
|
push edx
|
||||||
|
mov dx,42[eax] ; setup old ss:esp as a parm
|
||||||
|
mov eax,28[eax]
|
||||||
|
call __longjmp_handler ; call handler
|
||||||
|
pop edx ; restore parm regs
|
||||||
|
pop eax
|
||||||
|
|
||||||
|
mov ss,42[eax] ; load old ss:esp
|
||||||
|
mov esp,28[eax] ; ...
|
||||||
|
push 24[eax] ; push saved eip (our return address)
|
||||||
|
or edx,edx ; if return code is 0
|
||||||
|
_if e ; then
|
||||||
|
inc edx ; - set it to 1
|
||||||
|
_endif ; endif
|
||||||
|
push edx ; save return code
|
||||||
|
mov ebx,[eax] ; load up the saved registers
|
||||||
|
mov ecx,4[eax]
|
||||||
|
mov esi,12[eax]
|
||||||
|
mov edi,16[eax]
|
||||||
|
mov ebp,20[eax]
|
||||||
|
mov dx,32[eax]
|
||||||
|
verr dx ; verify segment
|
||||||
|
_if ne
|
||||||
|
sub edx,edx
|
||||||
|
_endif
|
||||||
|
mov es,dx
|
||||||
|
mov dx,38[eax]
|
||||||
|
verr dx ; verify segment
|
||||||
|
_if ne
|
||||||
|
sub edx,edx
|
||||||
|
_endif
|
||||||
|
mov fs,dx
|
||||||
|
mov dx,40[eax]
|
||||||
|
verr dx ; verify segment
|
||||||
|
_if ne
|
||||||
|
sub edx,edx
|
||||||
|
_endif
|
||||||
|
mov gs,dx
|
||||||
|
mov edx,8[eax]
|
||||||
|
mov ds,34[eax]
|
||||||
|
pop eax ; get return code
|
||||||
|
ret ; return to point following setjmp call
|
||||||
|
longjmp endp
|
||||||
|
|
||||||
|
_TEXT ends
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user