50 lines
1.1 KiB
C
50 lines
1.1 KiB
C
|
|
||
|
#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);
|
||
|
}
|