summaryrefslogtreecommitdiff
path: root/newlib/libc/sys/cygwin/crt0.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/sys/cygwin/crt0.c')
-rw-r--r--newlib/libc/sys/cygwin/crt0.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/newlib/libc/sys/cygwin/crt0.c b/newlib/libc/sys/cygwin/crt0.c
new file mode 100644
index 00000000000..d6bdd5a572c
--- /dev/null
+++ b/newlib/libc/sys/cygwin/crt0.c
@@ -0,0 +1,49 @@
+
+#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);
+}