mescc: Mes C Library: Initialize streams in crt1.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 24 Feb 2019 11:31:44 +0000 (12:31 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 24 Feb 2019 11:31:44 +0000 (12:31 +0100)
* lib/linux/x86-mes-gcc/crt1.c: Initialize streams.
* lib/linux/x86-mes/crt1.c: Likewise.
* lib/linux/x86_64-mes-gcc/crt1.c: Likewise.
* lib/linux/x86_64-mes/crt1.c: Likewise.
* src/mes.c (main): Remove initialization of streams.

include/libmes-mini.h
lib/libc.c
lib/linux/x86-mes-gcc/crt0.c
lib/linux/x86-mes-gcc/crt1.c
lib/linux/x86-mes/crt1.c
lib/linux/x86_64-mes-gcc/crt0.c
lib/linux/x86_64-mes-gcc/crt1.c
lib/linux/x86_64-mes/crt1.c
lib/x86-mes/x86.M1
lib/x86_64-mes/x86_64.M1
src/mes.c

index cfb6779bd6c585859a73c25afdacf37fec833e79..b0104d3d246f60c25aba0feb4813345f30499091 100644 (file)
 #ifndef __MES_LIBMES_MINI_H
 #define __MES_LIBMES_MINI_H
 
-char **environ;
-int g_stdin;
-int g_stdout;
-int g_stderr;
-
 #if !WITH_GLIBC
 
 #ifndef _SIZE_T
@@ -64,18 +59,25 @@ int errno;
 
 #endif //!WITH_LIBC
 
+// CONSTANT STDIN 0
 #ifndef STDIN
 #define STDIN 0
 #endif
 
+// CONSTANT STDOUT 1
 #ifndef STDOUT
 #define STDOUT 1
 #endif
 
+// CONSTANT STDERR 2
 #ifndef STDERR
 #define STDERR 2
 #endif
 
+char **environ;
+int g_stdin;
+int g_stdout;
+int g_stderr;
 
 int eputs (char const* s);
 int puts (char const* s);
index 0d0c99adfed82b42db15d498f0b7e7c54f41fb81..2c88613783ada924760f25860553811316114707 100644 (file)
@@ -40,8 +40,6 @@
 #error both __GNU__ and _linux__ are undefined, choose one
 #endif
 
-int g_stdin = 0;
-
 void _env ();
 
 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
index d17fc92ba7fbc9075ea3bf0779b37d7cfd58e6de..668cea15f82bb5e9beca8dff3ed1d80927aebff5 100644 (file)
@@ -23,7 +23,7 @@
 // instead of calling main, it seems to call either _main or ___main,
 // let's try _main first
 
-char **environ = 0;
+#include <libmes-mini.h>
 int _main (int argc, char *argv[]);
 
 void
index 0b9cc182ae95b0be9731ac4ed0073d8d49edf5ce..01eb32ff6fdb4a8c7037c6457bd4bdf7c3db71e1 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-comment-start: "//";comment-end:""-*-
  * GNU Mes --- Maxwell Equations of Software
- * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ * Copyright © 2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
  *
  * This file is part of GNU Mes.
  *
  * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-char **environ = 0;
+#include <libmes-mini.h>
 //int main (int argc, char *argv[], char *envp[]);
 
 void
 _start ()
 {
+  asm (
+       "mov    $0,%%eax\n\t"
+       "mov    %%eax,%0\n"
+       : "=r" (g_stdin)
+       : //no inputs ""
+       );
+
+  asm (
+       "mov    $1,%%eax\n\t"
+       "mov    %%eax,%0\n"
+       : "=r" (g_stdout)
+       : //no inputs ""
+       );
+
+  asm (
+       "mov    $2,%%eax\n\t"
+       "mov    %%eax,%0\n"
+       : "=r" (g_stderr)
+       : //no inputs ""
+       );
   asm (
        "mov     %%ebp,%%eax\n\t"
        "add     $4,%%eax\n\t"
index a46b97ed4eb0cb84b374ebd551fa22528b90169d..07b33e3f5fa37dff93b2fd640fcce81b46bc57b2 100644 (file)
  * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-char **environ = 0;
+#include "libmes-mini.h"
+
 int main (int argc, char *argv[], char *envp[]);
 
 int
 _start ()
 {
+  asm ("mov____$i8,%eax !0");
+  asm ("mov____%eax,0x32 &g_stdin");
+
+  asm ("mov____$i8,%eax !1");
+  asm ("mov____%eax,0x32 &g_stdout");
+
+  asm ("mov____$i8,%eax !2");
+  asm ("mov____%eax,0x32 &g_stderr");
+
   asm ("mov____%ebp,%eax");
   asm ("add____$i8,%eax !4");
 
index 9fcbd800e0a76649e6d3b62196030776b265a5bd..d744d90c7eaa2680dc6ad149723578755bd34b0c 100644 (file)
@@ -23,7 +23,7 @@
 // instead of calling main, it seems to call either _main or ___main,
 // let's try _main first
 
-char **environ = 0;
+#include <libmes-mini.h>
 int main (int argc, char *argv[]);
 
 // gcc x86_64 calling convention:
index a1be28ee5901daee7b0d5fb320443fb7cc7ef898..5a93f81e866aa297d22fd65520db00e4dda7a123 100644 (file)
@@ -18,7 +18,7 @@
  * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-char **environ = 0;
+#include <libmes-mini.h>
 // int main (int argc, char *argv[]);
 
 // gcc x86_64 calling convention:
@@ -27,6 +27,26 @@ char **environ = 0;
 void
 _start ()
 {
+  asm (
+       "mov    $0,%%rax\n\t"
+       "mov    %%rax,%0\n"
+       : "=r" (g_stdin)
+       : //no inputs ""
+       );
+
+  asm (
+       "mov    $1,%%rax\n\t"
+       "mov    %%rax,%0\n"
+       : "=r" (g_stdout)
+       : //no inputs ""
+       );
+
+  asm (
+       "mov    $2,%%rax\n\t"
+       "mov    %%rax,%0\n"
+       : "=r" (g_stderr)
+       : //no inputs ""
+       );
   asm (
        "mov     %%rbp,%%rax\n\t"
        "add     $8,%%rax\n\t"
index fc33fdd9b87bca65355afa28c3b23eebb4110ad1..ac0add4836089d98d46d27e45176bace274e36de 100644 (file)
  * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-char **environ = 0;
-int main (int argc, char *argv[]);
+#include "libmes-mini.h"
+int main (int argc, char *argv[], char *envp[]);
 
 int
 _start ()
 {
+  asm ("mov____$i8,%rax !0");
+  asm ("mov____%rax,0x32 &g_stdin");
+
+  asm ("mov____$i8,%rax !1");
+  asm ("mov____%rax,0x32 &g_stdout");
+
+  asm ("mov____$i8,%rax !2");
+  asm ("mov____%rax,0x32 &g_stderr");
+
 #if 0 //MES_CCAMD64
   asm ("add____$i32,%rbp %0x80"); // FIXME: corresponds to x86_64/as.scm function-preamble-fu
 #endif
index f600f8265dd208707a056f5a474cad05d3b9d79b..c3c6ed82378ec59e99cd970f10206128ec921610 100644 (file)
@@ -82,6 +82,8 @@ DEFINE mov____$i32,(%eax) c700
 DEFINE mov____$i32,0x32 c705
 DEFINE mov____$i32,0x8(%eax) c740
 DEFINE mov____$i32,0x8(%ebp) c745
+DEFINE mov____$i8,%al b0
+DEFINE mov____$i8,%eax b0
 DEFINE mov____%al,(%ebx) 8803
 DEFINE mov____%al,0x8(%ebp) 8845
 DEFINE mov____%ax,(%ebx) 668903
index 9b6670152ac4ca2b796401dcb86f5bc134c640cd..9ffbbf15cb8f4745e12ff7112692de08560a1d93 100644 (file)
@@ -82,6 +82,8 @@ DEFINE mov____$i32,0x8(%rbp) c745
 DEFINE mov____$i64,%r15 49bf
 DEFINE mov____$i64,%rax 48b8
 DEFINE mov____$i64,%rdi 48bf
+DEFINE mov____$i8,%al b0
+DEFINE mov____$i8,%rax b0
 DEFINE mov____%al,(%rdi) 8807
 DEFINE mov____%al,0x32(%rbp) 8885
 DEFINE mov____%al,0x8(%rbp) 8845
index a85364dcb917d54aafbecf36eafbd679092e9840..3a36e109db87ed84b46375b68973039fb67631b9 100644 (file)
--- a/src/mes.c
+++ b/src/mes.c
@@ -2286,9 +2286,6 @@ main (int argc, char *argv[])
     STACK_SIZE = atoi (p);
   if (p = getenv ("MES_MAX_STRING"))
     MAX_STRING = atoi (p);
-  g_stdin = STDIN;
-  g_stdout = STDOUT;
-  g_stderr = STDERR;
 
   SCM a = mes_environment (argc, argv);
   a = mes_builtins (a);