diff options
Diffstat (limited to 'winsup/cygwin/crt0.c')
-rw-r--r-- | winsup/cygwin/crt0.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/winsup/cygwin/crt0.c b/winsup/cygwin/crt0.c new file mode 100644 index 0000000..2837a54 --- /dev/null +++ b/winsup/cygwin/crt0.c @@ -0,0 +1,56 @@ +/* crt0.c. + + Copyright 2001 Red Hat, Inc. + +This software is a copyrighted work licensed under the terms of the +Cygwin license. Please consult the file "CYGWIN_LICENSE" for +details. */ + +#ifdef __PPC__ +/* For the PowerPC, we want to make this function have its structured + exception table exception function point to something we control. */ + +extern void __cygwin_exception_handler(); +extern void mainCRTStartup(void) __attribute__((__exception__(__cygwin_exception_handler))); +#endif + +/* In the following ifdef'd i386 code, the FPU precision is set to 80 bits + and all FPU exceptions are masked. The former is needed to make long + doubles work correctly. The latter causes the FPU to generate NaNs and + Infinities instead of signals for certain operations. +*/ + +#ifdef __i386__ +#define FPU_RESERVED 0xF0C0 +#define FPU_DEFAULT 0x033f + +/* For debugging on *#!$@ windbg. bp for breakpoint. */ +int __cygwin_crt0_bp = 0; +#endif + +extern int main (int argc, char **argv); + +void +mainCRTStartup () +{ +#ifdef __i386__ + if (__cygwin_crt0_bp) + asm volatile ("int3"); + + { + volatile unsigned short cw; + + /* Get Control Word */ + __asm__ volatile ("fnstcw %0" : "=m" (cw) : ); + + /* mask in */ + cw &= FPU_RESERVED; + cw |= FPU_DEFAULT; + + /* set cw */ + __asm__ volatile ("fldcw %0" :: "m" (cw)); + } +#endif + + cygwin_crt0 (main); +} |