Release 0.22. master v0.22
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 19 Jan 2020 07:31:38 +0000 (08:31 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Mon, 20 Jan 2020 21:47:53 +0000 (22:47 +0100)
* configure (VERSION): Update to 0.22.
(main): Likewise.
* build-aux/GNUmakefile.in: Likewise.
* configure.sh (VERSION): Likewise.
* guix/git/mes.scm (mes, mes.git): Likewise.

206 files changed:
.gitignore
AUTHORS
BOOTSTRAP
HACKING
INSTALL
NEWS
PORTING
README
ROADMAP
build-aux/GNUmakefile.in
build-aux/bootstrap.sh.in
build-aux/build-lib.sh
build-aux/build-mes.sh
build-aux/build-scaffold.sh
build-aux/build.sh.in
build-aux/cc.sh
build-aux/cflags.sh [new file with mode: 0644]
build-aux/check-mescc.sh
build-aux/config.make.in
build-aux/config.sh.in
build-aux/configure-lib.sh
build-aux/export.make
build-aux/gitlog-to-changelog
build-aux/install.sh.in
build-aux/pre-inst-env.in
build-aux/test-c.sh
configure
configure.sh
doc/announce/ANNOUNCE-0.21
doc/announce/ANNOUNCE-0.22 [new file with mode: 0644]
doc/mes.texi
guix/git/mes.scm
include/argz.h
include/fcntl.h
include/gnu/hurd-types.h [new file with mode: 0644]
include/gnu/hurd.h [new file with mode: 0644]
include/gnu/syscall.h [new file with mode: 0644]
include/mach/mach-init.h [new file with mode: 0644]
include/sys/wait.h
lib/freebsd/x86-mes-gcc/crt1.c [new file with mode: 0644]
lib/freebsd/x86-mes-gcc/exit-42.S [new file with mode: 0644]
lib/freebsd/x86-mes-gcc/hello-mes.S [new file with mode: 0644]
lib/freebsd/x86-mes-gcc/mini.c [new file with mode: 0644]
lib/freebsd/x86-mes-mescc/crt1.c [new file with mode: 0644]
lib/freebsd/x86-mes-mescc/mini.c [new file with mode: 0644]
lib/freebsd/x86-mes/elf32-0exit-42.hex2 [new file with mode: 0644]
lib/freebsd/x86-mes/elf32-0header.hex2 [new file with mode: 0644]
lib/freebsd/x86-mes/elf32-0hello-mes.hex2 [new file with mode: 0644]
lib/freebsd/x86-mes/elf32-body-exit-42.hex2 [new file with mode: 0644]
lib/freebsd/x86-mes/elf32-body-hello-mes.hex2 [new file with mode: 0644]
lib/freebsd/x86-mes/elf32-footer-single-main.hex2 [new file with mode: 0644]
lib/freebsd/x86-mes/elf32-header.hex2 [new file with mode: 0644]
lib/gnu/_exit.c [new file with mode: 0644]
lib/gnu/_open3.c [new file with mode: 0644]
lib/gnu/_read.c [new file with mode: 0644]
lib/gnu/_write.c [new file with mode: 0644]
lib/gnu/dir-lookup.c [new file with mode: 0644]
lib/gnu/exec-startup-get-data.c [new file with mode: 0644]
lib/gnu/fd-get.c [new file with mode: 0644]
lib/gnu/fd-read.c [new file with mode: 0644]
lib/gnu/fd-write.c [new file with mode: 0644]
lib/gnu/hurd-start.c [new file with mode: 0644]
lib/gnu/io-read.c [new file with mode: 0644]
lib/gnu/io-write.c [new file with mode: 0644]
lib/gnu/malloc.c [new file with mode: 0644]
lib/gnu/proc-mark-exit.c [new file with mode: 0644]
lib/gnu/syscall.c [new file with mode: 0644]
lib/gnu/task-get-special-port.c [new file with mode: 0644]
lib/gnu/task-terminate.c [new file with mode: 0644]
lib/gnu/vm-allocate.c [new file with mode: 0644]
lib/gnu/vm-statistics.c [new file with mode: 0644]
lib/gnu/x86-mes-gcc/crt1.c [new file with mode: 0644]
lib/gnu/x86-mes-gcc/mini.c [new file with mode: 0644]
lib/linux/lseek.c
lib/linux/x86-mes-gcc/exit-42.S [new file with mode: 0644]
lib/linux/x86-mes-gcc/hello-mes.S [new file with mode: 0644]
lib/linux/x86-mes-mescc/exit-42.S [new file with mode: 0644]
lib/linux/x86-mes-mescc/hello-mes.S [new file with mode: 0644]
lib/linux/x86-mes/elf32-0exit-42.hex2 [new file with mode: 0644]
lib/linux/x86-mes/elf32-0header.hex2 [new file with mode: 0644]
lib/linux/x86-mes/elf32-0hello-mes.hex2 [new file with mode: 0644]
lib/linux/x86-mes/elf32-body-exit-42.hex2 [new file with mode: 0644]
lib/linux/x86-mes/elf32-body-hello-mes.hex2 [new file with mode: 0644]
lib/linux/x86-mes/elf32-footer-single-main.hex2 [new file with mode: 0644]
lib/linux/x86-mes/elf32-header.hex2 [new file with mode: 0644]
lib/linux/x86_64-mes-gcc/exit-42.S [new file with mode: 0644]
lib/linux/x86_64-mes-gcc/hello-mes.S [new file with mode: 0644]
lib/linux/x86_64-mes-mescc/exit-42.S [new file with mode: 0644]
lib/linux/x86_64-mes-mescc/hello-mes.S [new file with mode: 0644]
lib/linux/x86_64-mes/elf64-0exit-42.hex2 [new file with mode: 0644]
lib/linux/x86_64-mes/elf64-0header.hex2 [new file with mode: 0644]
lib/linux/x86_64-mes/elf64-0hello-mes.hex2 [new file with mode: 0644]
lib/linux/x86_64-mes/elf64-body-exit-42.hex2 [new file with mode: 0644]
lib/linux/x86_64-mes/elf64-body-hello-mes.hex2 [new file with mode: 0644]
lib/linux/x86_64-mes/elf64-footer-single-main.hex2 [new file with mode: 0644]
lib/linux/x86_64-mes/elf64-header.hex2 [new file with mode: 0644]
lib/mach/mach-init.c [new file with mode: 0644]
lib/mach/mach_host_self.S [new file with mode: 0644]
lib/mach/mach_msg_trap.S [new file with mode: 0644]
lib/mach/mach_reply_port.S [new file with mode: 0644]
lib/mach/mach_task_self.S [new file with mode: 0644]
lib/mach/mach_thread_self.S [new file with mode: 0644]
lib/mach/msg.c [new file with mode: 0644]
lib/mes/__buffered_read.c
lib/mes/mini-write.c [new file with mode: 0644]
lib/mes/write.c [deleted file]
lib/posix/buffered-read.c [new file with mode: 0644]
lib/posix/execlp.c
lib/posix/execvp.c
lib/posix/open.c
lib/posix/read.c [deleted file]
lib/stdio/fopen.c
lib/stdio/vfscanf.c
lib/stdlib/malloc.c
lib/string/argz-count.c
lib/string/argz-extract.c
lib/stub/_getcwd.c [new file with mode: 0644]
lib/stub/_open3.c [new file with mode: 0644]
lib/stub/access.c [new file with mode: 0644]
lib/stub/brk.c [new file with mode: 0644]
lib/stub/chmod.c [new file with mode: 0644]
lib/stub/clock_gettime.c [new file with mode: 0644]
lib/stub/close.c [new file with mode: 0644]
lib/stub/dup.c [new file with mode: 0644]
lib/stub/dup2.c [new file with mode: 0644]
lib/stub/execve.c [new file with mode: 0644]
lib/stub/fork.c [new file with mode: 0644]
lib/stub/gettimeofday.c [new file with mode: 0644]
lib/stub/ioctl.c [new file with mode: 0644]
lib/stub/lseek.c [new file with mode: 0644]
lib/stub/rmdir.c [new file with mode: 0644]
lib/stub/stat.c [new file with mode: 0644]
lib/stub/time.c [new file with mode: 0644]
lib/stub/unlink.c [new file with mode: 0644]
lib/stub/waitpid.c [new file with mode: 0644]
lib/tests/dirent/90-readdir.c
lib/tests/mes/30-eputs.c [new file with mode: 0644]
lib/tests/mes/30-eputs.stderr [new file with mode: 0644]
lib/tests/mes/30-oputs.c
lib/tests/mes/30-oputs.stdout [new file with mode: 0644]
lib/tests/mes/90-abtod.c
lib/tests/mes/90-abtod.stdout [deleted file]
lib/tests/posix/50-open-read.c
lib/tests/scaffold/00-exit-0.c [deleted file]
lib/tests/scaffold/30-exit-0.c [new file with mode: 0644]
lib/tests/scaffold/30-exit-42.c [new file with mode: 0644]
lib/tests/scaffold/30-exit-42.exit [new file with mode: 0644]
lib/tests/stdio/90-fseek.c
lib/x86-mes-gcc/exit-42.S [deleted file]
lib/x86-mes-gcc/hello-mes.S [deleted file]
lib/x86-mes/elf32-0exit-42.hex2 [deleted file]
lib/x86-mes/elf32-0header.hex2 [deleted file]
lib/x86-mes/elf32-0hello-mes.hex2 [deleted file]
lib/x86-mes/elf32-body-exit-42.hex2 [deleted file]
lib/x86-mes/elf32-body-hello-mes.hex2 [deleted file]
lib/x86-mes/elf32-footer-single-main.hex2 [deleted file]
lib/x86-mes/elf32-header.hex2 [deleted file]
lib/x86_64-mes-gcc/exit-42.S [deleted file]
lib/x86_64-mes-gcc/hello-mes.S [deleted file]
lib/x86_64-mes/elf64-0exit-42.hex2 [deleted file]
lib/x86_64-mes/elf64-0header.hex2 [deleted file]
lib/x86_64-mes/elf64-0hello-mes.hex2 [deleted file]
lib/x86_64-mes/elf64-body-exit-42.hex2 [deleted file]
lib/x86_64-mes/elf64-body-hello-mes.hex2 [deleted file]
lib/x86_64-mes/elf64-footer-single-main.hex2 [deleted file]
lib/x86_64-mes/elf64-header.hex2 [deleted file]
mes/module/mes/boot-0.scm
mes/module/mes/guile.mes
module/mescc.scm
module/mescc/compile.scm
module/mescc/mescc.scm
module/mescc/preprocess.scm
scripts/mescc.in
scripts/mescc.scm.in
simple.sh
src/mes.c
src/posix.c
tests/catch.test
tests/closure.test
tests/cwv.test
tests/display.test
tests/fluids.test
tests/getopt-long.test
tests/guile.test
tests/let-syntax.test
tests/let.test
tests/macro.test
tests/match.test
tests/math.test
tests/module.test
tests/optargs.test
tests/peg.test
tests/perform.test
tests/pmatch.test
tests/posix.test
tests/psyntax.test
tests/read.test
tests/srfi-0.test
tests/srfi-1.test
tests/srfi-13.test
tests/srfi-14.test
tests/srfi-16.test
tests/srfi-43.test
tests/srfi-9.test
tests/syntax.test
tests/vector.test

index 8826fb661b8a3ce969210c322e4884f9cc1db1a8..7c534a14b335b1dacf6e9491fc4527d15b22ba4b 100644 (file)
 *.a
 *.o
 *.seed-out
-*.stderr
-*.stdout
-
-*.x86-out
-
-*.x86-mes-E
-*.x86-mes-S
-*.x86-mes-gcc-a
-*.x86-mes-gcc-o
-*.x86-mes-gcc-out
-*.x86-mes-gcc-stdout
-*.x86-mes-o
-*.x86-mes-out
-*.x86-mes-stdout
-
-*.x86_64-mes-E
-*.x86_64-mes-S
-*.x86_64-mes-gcc-a
-*.x86_64-mes-gcc-o
-*.x86_64-mes-gcc-out
-*.x86_64-mes-gcc-stdout
-*.x86_64-mes-o
-*.x86_64-mes-out
-*.x86_64-mes-stdout
-*.x86_64-out
-
-/lib/x86-mes/0exit-42
-/lib/x86-mes/exit-42
 
 /lib/tests/*/[0-9a][0-9a-z]-*
-/lib/tests/*/x86-mes-*
 !/lib/tests/*/*.c
 !/lib/tests/*/*.exit
 !/lib/tests/*/*.stdout
 /scaffold/micro-mes
 /scaffold/tiny-mes
 
-/scaffold/x86-mes-*
-/scaffold/x86_64-mes-*
-
-/scaffold/tests/x86-mes-*
 /scaffold/tests/[0-9a][0-9a-z]-*
 /scaffold/tests/t.*
 !/scaffold/tests/*.c
 !/scaffold/tests/*.exit
 !/scaffold/tests/*.stdout
 
-/src/mes.mes.symbols.h
-/src/gc.mes.h
-/src/hash.mes.h
-/src/lib.mes.h
-/src/math.mes.h
-/src/mes.mes.h
-/src/module.mes.h
-/src/posix.mes.h
-/src/reader.mes.h
-/src/strings.mes.h
-/src/struct.mes.h
-/src/vector.mes.h
-/src/gc.mes.i
-/src/hash.mes.i
-/src/lib.mes.i
-/src/math.mes.i
-/src/mes.mes.i
-/src/module.mes.i
-/src/posix.mes.i
-/src/reader.mes.i
-/src/strings.mes.i
-/src/struct.mes.i
-/src/vector.mes.i
-
-/src/mes
-/src/x86-mes-mes
-/src/x86_64-mes-mes
-
 /.config.make
 /.store
 /.tarball-version
 
-#keep this: bootstrap
-#/mes.mes
-
 /out
 ?
 ?.mes
 /doc/fosdem/fosdem.tex
 /doc/fosdem/fosdem.toc
 /doc/fosdem/fosdem.*vrb
-/doc/mes
 /doc/mes.1
 /doc/mes.info
 /doc/mes.pdf
+/doc/mesar.1
 /doc/mescc.1
 /doc/version.texi
+/mes.aux
+/mes.cp
+/mes.cps
+/mes.fn
+/mes.info
+/mes.tmp
+/mes.toc
+/mes.vr
+/mes.vrs
 
 /config.status
 /pre-inst-env
 /doc/images/gcc-mesboot-graph.eps
 /doc/images/gcc-mesboot-graph.pdf
 /doc/web/
-/lib/x86_64-mes/0exit-42
-/lib/x86_64-mes/exit-42
 /config.sh
 /include/mes/config.h
 /gcc-lib
 /body-hello-mes
 /exit-42
 /hello-mes
+core
+/.config
+a.out
diff --git a/AUTHORS b/AUTHORS
index 7349a3d02b59ac70c2fcbdec79e8d186341dd045..858c53ad76b2cb4bbd6e3305cad479e7a7423357 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -73,6 +73,13 @@ mes/module/srfi/srfi-26.scm
 GNU FDL in texinfo from GNU
 doc/fdl-1.3.texi
 
+Hurd and Mach support from GNU C Library
+include/gnu/hurd-types.h
+include/mach/mach-init.h
+lib/mach/msg.c
+lib/mach/mach-init.c
+lib/mach/*.S
+
 * legalese
 Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 
index c8b83cdd09a2b488410fcd6fac0b610af89a6891..c2d97dc38385632caf31ade00852271895e7a312 100644 (file)
--- a/BOOTSTRAP
+++ b/BOOTSTRAP
@@ -8,24 +8,24 @@ Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
   notice and this notice are preserved.
 
 * What?
-** Full source bootstrapping for GNU Guix
+** Full source bootstrapping for the GNU System
 
-A package in Guix is uniquely identified by the hash of its source code,
-its dependencies, and its build recipe.
+A package in GNU Guix is uniquely identified by the hash of its source
+code, its dependencies, and its build recipe.
 
 Every package can be built from source, except for the bootstrap
 binaries.
 
-*** From the Guix manual
+*** From the GNU Guix manual
 
-   The distribution is fully “bootstrapped” and “self-contained”: each
+The distribution is fully “bootstrapped” and “self-contained”: each
 package is built based solely on other packages in the distribution.
 
 The root of this dependency graph is a small set of “bootstrap
 binaries”, provided by the ‘(gnu packages bootstrap)’ module.  For more
 information on bootstrapping, *note Bootstrapping::.
 
-**** Guix bootstrap tarballs
+**** Guix v1.0 bootstrap binary seed
 
 $ du -schx $(readlink $(guix build bootstrap-tarballs)/*)
 2.1M   /gnu/store/9623n4bq6iq5c8cwwdq99qb7d0xj93ym-binutils-static-stripped-tarball-2.28.1/binutils-static-stripped-2.28.1-x86_64-linux.tar.xz
@@ -44,6 +44,42 @@ $ du -schx *
 5.2M   share
 252M   total
 
+**** Guix Reduced Binary Seed bootstrap binary seed
+
+$ du -schx $(readlink $(guix build bootstrap-tarballs)/*)
+5.7M   /gnu/store/9f8gi8raqfx9j3l9d00qrrc0jg3r1kyj-guile-static-stripped-tarball-2.2.6/guile-static-stripped-2.2.6-x86_64-linux.tar.xz
+80K    /gnu/store/b6rjl52hibhmvyw4dg8678pwryhla0h2-linux-libre-headers-stripped-tarball-4.19.56/linux-libre-headers-stripped-4.19.56-x86_64-linux.tar.xz
+12K    /gnu/store/d7zlxsjcnqilmvqwx7scija9x9bjw8cw-mescc-tools-static-stripped-tarball-0.5.2-0.bb062b0/mescc-tools-static-stripped-0.5.2-0.bb062b0-x86_64-linux.tar.xz
+428K   /gnu/store/n7zc4kpi8ny6jlfaikkzxlwhc5fvr1vr-mes-minimal-stripped-tarball-0.19/mes-minimal-stripped-0.19-x86_64-linux.tar.xz
+6.0M   /gnu/store/nv4djwlrljfqmynqr2cqvfwz0ydx7kxb-static-binaries-tarball-0/static-binaries-0-x86_64-linux.tar.xz
+13M    total
+$ for i in $(readlink $(guix build bootstrap-tarballs)/*);\
+  do sudo tar xf $i; done
+Password:
+$ du -schx *
+93M    bin
+700K   include
+38M    lib
+14M    share
+145M   total
+
+**** Guix Scheme-only bootstrap binary seed
+
+$ du -schx $(readlink $(~/src/guix/wip-bootstrap/pre-inst-env guix build bootstrap-tarballs)/*)
+5.7M   /gnu/store/1mq2pcd2h7g54xpi2jrgj6ibbi4lgi3c-guile-static-stripped-tarball-2.2.6/guile-static-stripped-2.2.6-x86_64-linux.tar.xz
+80K    /gnu/store/bl1r2bpk6fam8r2gjvr5mvr48i3dm2hn-linux-libre-headers-stripped-tarball-4.19.56/linux-libre-headers-stripped-4.19.56-x86_64-linux.tar.xz
+12K    /gnu/store/w0dlz486dhb8aiq8pxm5akllz628fqin-mescc-tools-static-stripped-tarball-0.5.2-0.bb062b0/mescc-tools-static-stripped-0.5.2-0.bb062b0-x86_64-linux.tar.xz
+428K   /gnu/store/15j6l18q44ymlrh1cfp4s4hc9835xic5-mes-minimal-stripped-tarball-0.19/mes-minimal-stripped-0.19-x86_64-linux.tar.xz
+6.2M   total
+$ for i in $(readlink $(~/src/guix/wip-bootstrap/pre-inst-env guix build bootstrap-tarballs)/*);\
+  do sudo tar xf $i; done
+$ du -schx *
+4.9M   bin
+700K   include
+38M    lib
+14M    share
+57M    total
+
 * Why?
 ** Reproducibility is essential to Software Freedom
 
@@ -92,20 +128,22 @@ be source.
 
 *** mes.c: a Scheme interpreter in ~5,000LOC of simple C
 *** mescc: a C compiler written in Scheme (uses Nyacc C99 parser in Scheme)
-*** mes.M2: this Scheme interpreter in preprocessed M2
+*** mes.M2: this Scheme interpreter in bootstrappable M2
 
 ** TinyCC
 
     https://gitlab.com/janneke/tinycc
 
 * TODO
+** merge scheme-only bootstrap into Guix.
+** reduced binary seed bootstrap into NixOS, Debian.
 ** remove or upstream patches from tcc-boot
 ** prepare src/mes.c for M2-Planet transpiler.
 ** ARM, the Hurd
 ** fix bootstrap-loops: (Nyacc?, mes.M2, psyntax.pp?)
 ** make GNU gcc (8.0?) bootstrappable again, remove [need for] tcc stage
 * DONE
-** upstream mes-boot to Guix.
+** reduced binary seed bootstrap into Guix.
 ** replace Guix bootstrap for x86_64.
 ** replace Guix bootstrap for x86.
 ** add full source gcc-4.7 package build.
@@ -121,5 +159,6 @@ be source.
 ** tcc compiled with gcc is known to compile gcc
 
 * Contact
+** bug-mes@gnu.org
 ** #bootstrappable, #guix on freenode
 ** bootstrappable.org
diff --git a/HACKING b/HACKING
index c4096c6bbfa4f226897599b45bd2c83e072658c5..fb6d7e958e5d776e7bc3322e6ad4ef6fec5424da 100644 (file)
--- a/HACKING
+++ b/HACKING
@@ -1,64 +1,31 @@
                                                               -*- org -*-
 #+TITLE: Hacking GNU Mes
 
-Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
-
-  Copying and distribution of this file, with or without modification,
-  are permitted in any medium without royalty provided the copyright
-  notice and this notice are preserved.
-
 * SETUP
     guix environment -l guix.scm     #64 bit + 32bit
 
+    CC=i686-unkown-linux-gnu-gcc ./configure
 or
+    ./configure
 
-    guix environment --system=i686-linux -l guix.scm #32 bit only
-
-or
-
-    guix package --profile=~/.config/guix/mes --manifest=build-aux/manifest.scm
-    . ~/.config/guix/mes/etc/profile
+The 64bit bootstrap is not supported; MesCC needs work to be able to
+compile a functional tinycc.
 
 * BUILD
-There are two major modes to build Mes: true bootstrap and
-development.
-
-** DEVELOPMENT BUILD
-To help development we assume ./configure sets these variables for make
-
-   CC     -- gcc (or i686-unknown-linux-gnu-gcc sans libc)
-   GUILE  -- guile
-   HEX2   -- hex2
-   MES    -- unset
-   M1     -- M1
-   prefix -- ""
 
-Mes is supposed to serve as a full equivalent for Guile, however Mes
-is still about 2 to 10 times slower than Guile.  That's why we usually
-don't use Mes during development, configure --with-cheating.
+GNU Guile can be used as a replacement for Mes.  It's faster and has
+much better error handling.
 
-Gcc is used to verify the sanity of our C sources.
+   #+BEGIN_SRC bash
+   make MES=guile
+   make check MES=guile
+   #+END_SRC
 
-i686-unknown-linux-gnu-gcc is used to compare hex/assembly, to test
-the gcc variant of Mes C Libirary.
-Target prefix: x86-mes-gcc.
+Configure to compile with Tiny CC
 
-gcc -nostdinc,-nostdlib is used to compare hex/assembly, to test the
-64bit variant of Mes C Library.  Target prefix: x86_64-mes-gcc.
-
-Guile is used to develop MesCC, the C compiler in Scheme that during
-bootstrapping will be executed by Mes.
-
-** BOOTSTRAP BUILD
-
-    ./configure.sh [--prefix=PREFIX]
-    ./bootstrap.sh
-    ./install.sh
-
-In bootstrap mode, we don't have gcc (CC), we don't have a 32 bit gcc,
-we have no guile (GUILE)...but we should have hex2, M1, and mes.M1.
-That's a bootstrap problem which is currently ignored by using the
-mes-seed package.  mes.M1 will be produced by M2-Planet from mes.c.
+   #+BEGIN_SRC bash
+   ./configure CC=tcc --host=i686-unknown-linux-gnu --with-courage
+   #+END_SRC
 
 * DEBUG
   MES_DEBUG=<level> mes
@@ -83,7 +50,7 @@ mes-seed package.  mes.M1 will be produced by M2-Planet from mes.c.
 
 * Bugs
 ** mes: performance, Mes is now 2-10x slower than Guile.
-** mes/mescc lack support for the Hurd.
+** mes/mescc lack support for fork/exec on the Hurd.
 ** mes: gcc-x86_64 compiled mes segfaults with small arena, or gc_up_arena.
 ** mes: gcc-x86 compiled, tests/srfi-13.test number->string INT-MIN fails:
 test: number->string INT-MIN: fail
@@ -214,3 +181,10 @@ https://notabug.org/rain1/hex86/src/master/tests/hex0b3.hex86
            https://jamey.thesharps.us/2016/07/15/testing-strategies-for-corrode/
            ("Randomized testing with Csmith and C-Reduce")  [10:58]
 ** linux syscalls: https://fedora.juszkiewicz.com.pl/syscalls.html
+* legalese
+
+Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+
+  Copying and distribution of this file, with or without modification,
+  are permitted in any medium without royalty provided the copyright
+  notice and this notice are preserved.
diff --git a/INSTALL b/INSTALL
index 554226d0bbd29cfa53736e35feaed27446901b20..dcea9ebd30dcfac15a6d46f7e2af395175c7bfb3 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -32,7 +32,6 @@ similar way.
   - SH, /bin/sh, GNU Bash 4.3 is known to work.
   - GNU coreutils
   - sed, GNU sed 4.2 is known to work.
-  - git, 2.10 is known to work.
   - Perl, 5.22 is known to work.
 
 ** Build it
@@ -42,6 +41,19 @@ similar way.
    make
    #+END_SRC
 
+If you get something like
+
+   #+BEGIN_SRC bash
+   mes.c:(.text+0x8da0): undefined reference to `__stack_chk_fail'
+   #+END_SRC
+
+then your compiler inserts stack protection code.  The Mes C Library
+does not support that.  Turn it off lik this
+
+   #+BEGIN_SRC bash
+   ./configure CFLAGS=-fno-stack-protector
+   #+END_SRC
+
 ** Check it
 
    #+BEGIN_SRC bash
@@ -87,3 +99,13 @@ https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/commencement.scm
    #+BEGIN_SRC bash
    sh install.sh
    #+END_SRC
+* Regular build and bootstrap combine
+
+To build mes.c using MesCC, configure using --with-bootstrap:
+
+   #+BEGIN_SRC bash
+   ./configure --with-bootstrap
+   make
+   #+END_SRC
+
+This creates bin/mes-gcc and bin/mes-mescc.
diff --git a/NEWS b/NEWS
index a9c09328156adb2a924895b9dbc3ef5e2f0b5531..1c4138752be4cf55c8c0d607e1c1ad36e93291c6 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,41 @@ Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 
 Please send Mes bug reports to bug-mes@gnu.org.
 
+* Changes in 0.22 since 0.21
+** Core
+*** Mes now builds reproducibly with MesCC, cross distribution
+Using --with-bootstrap on x86, a bin/mes-mescc is compiled with
+mes+mescc, that shall have sha256sum
+
+    9e0bcb1633c58e7bc415f6ea27cee7951d6b0658e13cdc147e992b31a14625fb  bin/mes-mescc
+
+This has been verified on GNU Guix, Debian GNU/Linux and NixOS.
+*** Mes now builds reproducibly with Guile+MesCC vs Mes+MesCC.
+*** Mes now builds reproducibly with Tiny CC-built MesCC.
+*** configure now respects the user's CFLAGS, CPPFLAGS and LDFLAGS.
+*** Mes now supports mescc-tools 0.5.2 next to 0.6.1.
+This allows introducing the Scheme-only bootstrap without updating or
+adding new bootstrap binary seeds into GNU Guix.
+*** Mes now runs when configured --with-courage on the Hurd:
+    GNU debian 0.9 GNU-Mach 1.8+git20170609-486/Hurd-0.9 i686-AT386 GNU
+Note that mescc does not run; fork and exec are not yet implemented.
+*** Mes now configures --with-courage on x86-FreeBSD 12.1
+The initial ELF scaffold tests: exit-42.S, 0exit-42.hex2,
+body-exit-42.hex2, hello-mes.S, 0hello-mes.hex2, body-hello-mes.hex2
+pass.
+*** configure now has a --with-bootstrap option.
+This adds the reproducible bootstrap build of bin/mes-mescc, using
+mes+mescc.
+*** configure prefers $CC over gcc; tcc over gcc, gcc over cc.
+*** Mes now prints an error when attempting to read a file that does not exist.
+*** Mes no longer depends on GIT.
+** Noteworthy bug fixes
+*** Several annoying build problems were fixed, for non-Guix systems.
+*** A bug with buffered-read was fixed.
+This means that bash-2.05 can now build glibc-2.2.5; notably it now
+successfully executes make-syscall.sh.
+*** A bug with execlp, execvp for file names containing a slash was fixed.
+This should allow make-3.80 running scripts that have "#! ./move-if-change".
 * Changes in 0.21 since 0.20
 ** Core
 *** Mes can now be bootstrapped with Gash and Gash Core Utils.
@@ -48,6 +83,7 @@ take-while.
 *** 1 new function
 __mesabi_uldiv.
 ** Noteworthy bug fixes
+*** map and for-each now support lists with unequal length.
 *** interger division has been fixed.
 *** isatty now looks at terminfo.
 *** signal now uses sigaction correctly for non-x86.
diff --git a/PORTING b/PORTING
index 8eeb418befd951662cc60c2a370fb787650dbd1b..706ea13f6acbece109cd08fd867a9d004fdd7a51 100644 (file)
--- a/PORTING
+++ b/PORTING
@@ -54,6 +54,28 @@ bootstrap for x86_64 uses x86 mes and that is not expected to change.
 The Hurd port can be found in wip-hurd on savannah.  For development, we
 use a Debian GNU/Hurd vm.
 
+* Porting GNU Mes to FreeBSD
+The FreeBSD port can be found in wip-freebsd on savannah.
+
+* Porting the Reduced Binary Seed bootstrap to NixOS
+The NixOS port of the Reduced Binary Seed bootstrap lives on the
+mes-bootstrap branch in https://github.com/xwvvvvwx/nixpkgs
+
+* Porting the Reduced Binary Seed bootstrap to Debian GNU/Linux
+To port the Reduced Binary Seed bootstrap to a traditional distribution
+such as Debian, two things need to happen: the bootstrap must be ported
+and the distribution build process needs to change to start from a only
+binary seed.
+
+The porting aspect is probably easiest: we start by packaging GNU Mes as
+a regular package.  Having Mes built as a regular package, we can then
+build a bootstrap Mes.  This bootstrap Mes can be used to build tinycc,
+and so on.
+
+Once we have shown that the Debian base system can be bootstrapped from
+a Reduced Binary seed, thus significantly reducing the Trusted Computing
+Base (TCB), strategic decisions about the build process can start.
+
 * Legalese
 Copyright © 2019 Jan (janneke) Nieuwenhuizen <[[mailto:janneke@gnu.org][janneke@gnu.org]]>
 
diff --git a/README b/README
index 00280cc6b817e7577b7d7ddd82e4c04655902eee..7607b6c884793cf9abbd865afebe574c1e22c4b1 100644 (file)
--- a/README
+++ b/README
@@ -4,20 +4,20 @@
 #+SUBTITLE: Maxwell Equations of Software
 
 [[https://www.gnu.org/software/mes][GNU Mes]] is a Scheme interpreter and C compiler for bootstrapping the GNU
-system.  Since version 0.20 it brings a [[https://guix.gnu.org/blog/2019/guix-reduces-bootstrap-seed-by-50/][Reduced Binary Seed bootstrap]] to
-[[https://www.gnu.org/software/guix][GNU Guix]].  This bootstrap has halved the size of opaque, uninspectable
-binaries that were needed to bootstrap Guix 1.0.  The final goal is to
-help create a full source bootstrap as part of the [[http://bootstrappable.org][bootstrappable builds]]
+System.  Since version 0.22 it has again helped to halve the size of
+opaque, uninspectable binary seeds that are currently being used in the
+[[https://guix.gnu.org/blog/2019/guix-reduces-bootstrap-seed-by-50/][Reduced Binary Seed bootstrap]] of [[https://www.gnu.org/software/guix][GNU Guix]].  The final goal is to help
+create a full source bootstrap as part of the [[http://bootstrappable.org][bootstrappable builds]]
 effort for UNIX-like operating systems.
 
-Mes consists of a mutual self-hosting Scheme interpreter written in
-~5,000 LOC of simple C, and a C compiler written in Scheme.  This mes.c
-is [[https://github.com/oriansj/mes-m2][being simplified]] to be transpiled by [[https://github.com/oriansj/m2-planet][M2-Planet]].
+The Scheme interpreter is written in ~5,000 LOC of simple C, and the C
+compiler written in Scheme and these are mutual self-hosting.  This
+mes.c is [[https://github.com/oriansj/mes-m2][being simplified]] to be transpiled by [[https://github.com/oriansj/m2-planet][M2-Planet]].
 
-The Scheme interpreter has a Garbage Collector, a library of loadable
-Scheme modules-- notably Dominique Boucher's [[https://github.com/schemeway/lalr-scm][LALR]], Pre-R6RS [[https://www.cs.indiana.edu/chezscheme/syntax-case/old-psyntax.html][portable
-syntax-case]] with R7RS ellipsis, Matt Wette's [[https://www.nongnu.org/nyacc][Nyacc]] --and test suite just
-enough to support a REPL and a C99 compiler: MesCC.
+Mes has a Garbage Collector, a library of loadable Scheme modules--
+notably Dominique Boucher's [[https://github.com/schemeway/lalr-scm][LALR]], Pre-R6RS [[https://www.cs.indiana.edu/chezscheme/syntax-case/old-psyntax.html][portable syntax-case]] with
+R7RS ellipsis, Matt Wette's [[https://www.nongnu.org/nyacc][Nyacc]] --and test suite, just enough to
+support a REPL and a C99 compiler: mescc.
 
 Mes+MesCC can compile an only [[http://gitlab.com/janneke/tinycc][lightly patched TinyCC]] that is
 self-hosting.  Using this tcc and the Mes C library we now have a
diff --git a/ROADMAP b/ROADMAP
index c4dd4d8b774c18cd6fd9ed7d3b7093ae11d6c39f..ca476c45f961add56cfd2743b44efa830c5e662c 100644 (file)
--- a/ROADMAP
+++ b/ROADMAP
@@ -9,7 +9,7 @@ Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 
 The goals of the GNU Mes project are two-fold:
 
-  - to bootstrap the GNU system purely from source, without using any binary
+  - to bootstrap the GNU System purely from source, without using any binary
     seeds.
 
   - to aid the Reproducible-Builds.org effort; demonstrate the impact and
@@ -23,23 +23,32 @@ on Freenode!
 
 * TODO
 ** release 0.x, unsorted
+  - Merge the Scheme-only bootstrap which uses Gash and Gash Core
+    Utilities to remove from bootstrap-binary seed : Awk, Bash, Core
+    Utilities, Grep, Gzip, Sed, Tar.
   - Introduce the Reduced Binaries Seed bootstrap to NixOS (Debian,
-    Gentoo, ...?)
-  - Full Source Bootstrap: compile Mes.c using M2-Planet.  Jeremiah
+    Arch, Gentoo, ...?)
+  - Full Source Bootstrap: compile mes.c using M2-Planet.  Jeremiah
     branched-out from mes; see https://github.com/oriansj/mes-m2, also see the
-    branches: wip-m2-merge and wip-m2.
-  - Scheme-only bootstrap bootstrap-binaries with Gash and Gash Core
-    Utilities: Awk, Bash, Core Utilities, Grep, Gzip, Make, Sed, Tar.
+    branches: wip-full-source-bootstrap, wip-m2-merge and wip-m2.
   - Full Guile-compatible module support: define-module, define-public,
     export, use-modules, ...
   - ARMv7/AArch64 support: Mes C Library and MesCC.
   - Simplify eval-apply and other core functionality (see mes-m2).
-** after release 1.0
-  - Replace the initial gcc-2.95.3 with gcc-4.6.4.
+  - Support native x86_64 bootstrap.
+  - Simplify MesCC ``MesCC should optimize ease of convincing us of its
+    correctness''
   - tcc: remove or upstream patches from tcc-boot.
   - tcc: build 0.9.27 directly instead of via 0.9.26, see tinycc
+** after release 1.0
+  - Build Guix packages using Mes: run or simplify (guix build utils),
+    (guix build gnu-build-system).
+  - Build Guix packages without guix-daemon.  See Ludovic's initrd build
+    work.
+  - Bootstrap support for the Hurd.  Most needed now are fork and exec.
+  - Replace the initial gcc-2.95.3 with gcc-4.6.4.
+  - FreeBSD, *BSD?
     wip-bootstrappable@0.9.27 branch
-  - Bootstrap a `bootstrap-Guile' before bootstrapping tcc?
   - Skip tcc: Build gcc using MesCC.
   - better garbage collector.
   - mes/mescc: proper docstrings, api reference documentation.
@@ -51,9 +60,9 @@ on Freenode!
     + get full source syntax-case up (Andre van Tonder?)
       https://srfi.schemers.org/srfi-72/srfi-72.html, or
     + ... drop it?
-  - Support the Hurd.  There is a wip-hurd branch; most needed now are fork
-    and exec.
 * DONE
+  - 0.22 GNU Mes now builds reproducibly cross-platform, runs on the
+    Hurd and has better support for other distributions and kernels.
   - 0.21 GNU Mes now supports a Scheme-only bootstrap and is packaged in
     Debian GNU/Linux.
   - 0.20 GNU Mes brings the Reduced Binary Source bootstrap to Guix.
index 53b05234e388d99bf1cc74f117663a5f92b21987..a5a3ffe92f4ed5fa651d1c5a2e40c175775dc602 100644 (file)
@@ -78,7 +78,7 @@ PHONY_TARGETS:=\
  mostlyclean\
  pdf\
  ps\
- sign\
+ sign-dist\
  uninstall\
  web\
 #
@@ -97,27 +97,41 @@ build:
 src/${program_prefix}mes: build
 
 clean:
-       git clean -dfx\
-           -e .config.make\
-           -e config.sh\
-           -e GNUmakefile\
-           -e build.sh\
-           -e check.sh\
-           -e install.sh\
-           -e uninstall.sh\
-           -e pre-inst-env\
-           -e scripts/mescc\
-
-#
-
-# Mes does not cache anything on the file system; therefore clean
-distclean:
-       git clean -dfX
+       rm -f *.o *.s bin/mes bin/mes-gcc bin/mes-mescc
+       rm -f mes.{aux,cp,cps,fn,info,log,tmp,toc,vr,vrs}
+       rm -f .log build.log
+       rm -f 0exit-42 0hello-mes exit-42 body-exit-42 body-hello-mes hello-mes
+       rm -f build-aux/mes-snarf.go
+       rm -f module/mescc.go
+       rm -f module/mes/*.go module/mescc/*.go
+       rm -f module/mescc/i386/*.go
+       rm -f module/mescc/x86_64/*.go
+       rm -rf gcc-lib/*.o gcc-lib/*.s gcc-lib/*.a gcc-lib/*-mes
+       rm -f gcc-lib/libc+gnu.c
+       rm -f gcc-lib/.log gcc-lib/build.log
+       rm -rf mescc-lib/*.o mescc-lib/*.s mescc-lib/*.a mescc-lib/*-mes
+       rm -f mescc-lib/libc+gnu.c
+       rm -f mescc-lib/.log mescc-lib/build.log
+       rm -rf mescc/bin
+       rm -f scaffold/boot/*.log scaffold/boot/*.trs
+       rm -f test-suite.log tests/*.log tests/*.trs
+       rm -f scaffold/*.s scaffold/*.o
+       rm -f doc/images/gcc-mesboot-graph.{eps,pdf,png}
+       rm -f doc/mes.1 doc/mesar.1 doc/mescc.1
+       rm -f .config .config.E .config.o
+
+distclean: clean
+       rm -f GNUmakefile bootstrap.sh build.sh check.sh install.sh uninstall.sh
+       rm -f include/mes/config.h
+       rm -f .config.make config.sh mescc-lib/config.sh gcc-lib/config.sh
+       rm -f scripts/mesar scripts/mescc scripts/mescc.scm scripts/m2-merge
+       rm -f TAGS
 
 mostlyclean: clean
 
-maintainer-clean:
-       git clean -dfx
+maintainer-clean: distclean
+       rm -f doc/mes.info
+       rm -f doc/version.texi
 
 TAGS:
        etags ${srcdest}lib/*.c ${srcdest}lib/*/*.c ${srcdest}src/*.c ${srcdest}include/*.h ${srcdest}include/sys/*.h
@@ -269,7 +283,7 @@ endif
 
 dist: $(TARBALL)
 
-sign: $(TARBALL)
+sign-dist: $(TARBALL)
        gpg -a --output $(TARBALL).sig --detach-sig $(TARBALL)
        git checkout ChangeLog
 
@@ -305,10 +319,17 @@ tag:
        git tag -s v$(VERSION) -m "GNU Mes $(VERSION)."
 
 # Release process
-#  0. doc: Release update, Release commit, test guix bootstrap
-#  1. make tag
-#  2. make dist
+#  0. Prepare git, see history:
+#     - doc: Release update
+#       + NEWS, etc.
+#       + doc/announce/ANNOUNCE-0.22, using xxx for checksums
+#     - Release 0.22
+#  1. make tag VERSION=0.22
+#  2. make sign-dist
 #  3. make release
+#     - Update doc/announce/ANNOUNCE-0.22
+#     - doc: Post-release update.
+#  4. verify bootstrap
 
 guix-build:
        ./pre-inst-env $(GUIX) build mes@$(VERSION) --with-source=$(TARBALL)
@@ -322,7 +343,7 @@ gen-announce:
        $(GEN_ANNOUNCE)\
            --release-type=beta\
            --package-name=mes\
-           --previous-version='0.20 '\
+           --previous-version='0.21 '\
             --current-version=$(VERSION)\
            --gpg-key-id=$(GPG_KEY_ID)\
            --url-directory=https://ftp.gnu.org/gnu/mes\
index 192508a7bb808f4df71948dfa640c3dbe74d5a4c..1fbd38df0d52db608fb061f3fc12fceb5ce2eff9 100644 (file)
@@ -27,49 +27,60 @@ MES_STACK=${MES_STACK-5000000}
 export MES_STACK
 MES_PREFIX=${MES_PREFIX-$PWD}
 
-. build-aux/configure-lib.sh
+. ./config.sh
+. ${srcdest}build-aux/configure-lib.sh
+. ${srcdest}build-aux/cflags.sh
 
 CPPFLAGS="-D HAVE_CONFIG_H=1 -I include"
-CFLAGS=""
+AM_CFLAGS=""
 mkdir -p mescc-lib
 cp config.sh mescc-lib/config.sh
 cd mescc-lib
-srcdest=../
-CPPFLAGS="-D HAVE_CONFIG_H=1 -I ${srcdest}include -I ${srcdest}include/$mes_kernel/$mes_cpu"
+srcdest=../${srcdest}
+ln -sf ${srcdest}mes .
+ln -sf ${srcdest}module .
+ln -sf ${srcdest}src .
+AM_CPPFLAGS="-D HAVE_CONFIG_H=1 -I ${srcdest}include -I ${srcdest}include/$mes_kernel/$mes_cpu"
 
-mkdir $mes_cpu-mes
-$CC -c $CPPFLAGS $CFLAGS ${srcdest}lib/$mes_kernel/$mes_cpu-mes-$compiler/crt1.c
+mkdir -p $mes_cpu-mes
+$CC -c $AM_CPPFLAGS $CPPFLAGS $AM_CFLAGS $CFLAGS ${srcdest}lib/$mes_kernel/$mes_cpu-mes-$compiler/crt1.c
 cp crt1.o $mes_cpu-mes
 cp crt1.s $mes_cpu-mes
 
 objects=
 for c in $libc_mini_SOURCES; do
-    echo "CC         $c"
-    $CC -c $CPPFLAGS $CFLAGS ${srcdest}$c
     o=$(basename $c .c).o
+    if test ! -e $o -o ${srcdest}$c -nt $o; then
+        echo "  CC       $c"
+        $CC -c $AM_CPPFLAGS $CPPFLAGS $AM_CFLAGS $CFLAGS ${srcdest}$c
+    fi
     objects="$objects $o"
 done
-echo "AR         $mes_cpu-mes/libc-mini.a"
+echo "  AR       $mes_cpu-mes/libc-mini.a"
 $AR crD $mes_cpu-mes/libc-mini.a $objects
 
 objects=
 for c in $libc_SOURCES; do
-    echo "CC         $c"
-    $CC -c $CPPFLAGS $CFLAGS ${srcdest}$c
     o=$(basename $c .c).o
+    if test ! -e $o -o ${srcdest}$c -nt $o; then
+        echo "  CC       $c"
+        $CC -c $AM_CPPFLAGS $CPPFLAGS $AM_CFLAGS $CFLAGS ${srcdest}$c
+    fi
     objects="$objects $o"
 done
-echo "AR         $mes_cpu-mes/libc.a"
+echo "  AR       $mes_cpu-mes/libc.a"
 $AR crD $mes_cpu-mes/libc.a $objects
 
 objects=
 for c in $libc_tcc_SOURCES; do
-    echo "CC         $c"
-    $CC -c $CPPFLAGS $CFLAGS ${srcdest}$c
     o=$(basename $c .c).o
+    if test ! -e $o -o ${srcdest}$c -nt $o; then
+        echo "  CC       $c"
+        $CC -c $AM_CPPFLAGS $CPPFLAGS $AM_CFLAGS $CFLAGS ${srcdest}$c
+    fi
     objects="$objects $o"
 done
-echo "AR         $mes_cpu-mes/libc+tcc.a"
+echo "  AR       $mes_cpu-mes/libc+tcc.a"
 $AR crD $mes_cpu-mes/libc+tcc.a $objects
 
 cd ..
@@ -78,13 +89,17 @@ CPPFLAGS="-D HAVE_CONFIG_H=1 -I ${srcdest}include -I ${srcdest}include/$mes_kern
 
 objects=
 for c in $mes_SOURCES; do
-    echo "CC         $c"
-    $CC -c $CPPFLAGS $CFLAGS ${srcdest}$c
     o=$(basename $c .c).o
+    if test ! -e $o -o ${srcdest}$c -nt $o; then
+        echo "  CC       $c"
+        $CC -c $AM_CPPFLAGS $CPPFLAGS $AM_CFLAGS $CFLAGS ${srcdest}$c
+    fi
     objects="$objects $o"
 done
-echo "CCLD       src/mes"
-$CC -nostdlib -o src/mes -L mescc-lib mescc-lib/crt1.o $objects -lc
+echo "  CCLD     bin/mes-mescc"
+mkdir -p bin
+$CC -nostdlib -o bin/mes-mescc -L mescc-lib mescc-lib/crt1.o $objects -lc
+cp bin/mes-mescc bin/mes
 
 (
     mkdir -p gcc-lib
index b70902aa1148e95854b918cfc726d2cf0e9f1a03..4ef701c3e2f890786c55ad4c6525d07b1b6caddb 100755 (executable)
@@ -18,7 +18,7 @@
 # You should have received a copy of the GNU General Public License
 # along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
 
-srcdest=${srcdest-}
+. ./config.sh
 . ${srcdest}build-aux/configure-lib.sh
 . ${srcdest}build-aux/trace.sh
 . ${srcdest}build-aux/cc.sh
index 1a8bcf3600db35e34f11728d8211f382e2ff8eb6..4e388c4f12f07509d883b6dd80da47754f761161 100755 (executable)
@@ -21,7 +21,7 @@
 set -e
 set -u
 
-V=${V-1}
+V=${V-}
 
 if [ "$V" = 2 ]; then
     set -x
@@ -33,7 +33,6 @@ fi
 
 trap 'test -f .log && cat .log' EXIT
 
-srcdest=${srcdest-}
 mes_sources="
 src/gc.c
 src/hash.c
@@ -54,4 +53,5 @@ done
 if test $mes_libc = system; then
     LIBS=-lmes
 fi
-link src/mes
+link bin/mes-$compiler
+cp bin/mes-$compiler bin/mes
index dc07f43245977548895fe98890b65dc3bc1ed430..911e8cdead646f4d20adb01f294db8c07701f527 100755 (executable)
@@ -44,19 +44,27 @@ fi
 
 case "$mes_cpu" in
     arm)
-        stage0_cpu=armv7l;;
+        stage0_arch=40
+        stage0_cpu=armv7l
+        ;;
     x86_64)
-        stage0_cpu=amd64;;
+        stage0_arch=2
+        stage0_cpu=amd64
+        ;;
     x86)
-        stage0_cpu=x86;;
+        stage0_arch=1
+        stage0_cpu=x86
+        ;;
     *)
-        stage0_cpu=$mes_cpu;;
+        stage0_arch=1
+        stage0_cpu=$mes_cpu
+        ;;
 esac
 
-trace "CCLD       ${srcdest}lib/$mes_cpu-mes-$compiler/exit-42.S" $CC\
+trace "CCLD       ${srcdest}lib/$mes_kernel/$mes_cpu-mes-$compiler/exit-42.S" $CC\
       -nostdlib\
       -g\
-      ${srcdest}lib/$mes_cpu-mes-$compiler/exit-42.S\
+      ${srcdest}lib/$mes_kernel/$mes_cpu-mes-$compiler/exit-42.S\
       -o exit-42
 
 trace "TEST       exit-42"
@@ -64,12 +72,18 @@ trace "TEST       exit-42"
 [ $r != 42 ] && echo "  => $r"
 [ $r = 42 ]
 
-trace "HEX2       ${srcdest}lib/$mes_cpu-mes/elf$mes_bits-0exit-42.hex2" $HEX2\
+if $numbered_arch; then
+    stage0_cpu_flag="--Architecture $stage0_arch";
+else
+    stage0_cpu_flag="--architecture $stage0_cpu";
+fi
+
+trace "HEX2       ${srcdest}lib/$mes_kernel/$mes_cpu-mes/elf$mes_bits-0exit-42.hex2" $HEX2\
       --LittleEndian\
-      --architecture $stage0_cpu\
+      $stage0_cpu_flag\
       --BaseAddress 0x1000000\
-      -f ${srcdest}lib/$mes_cpu-mes/elf$mes_bits-0header.hex2\
-      -f ${srcdest}lib/$mes_cpu-mes/elf$mes_bits-0exit-42.hex2\
+      -f ${srcdest}lib/$mes_kernel/$mes_cpu-mes/elf$mes_bits-0header.hex2\
+      -f ${srcdest}lib/$mes_kernel/$mes_cpu-mes/elf$mes_bits-0exit-42.hex2\
       --exec_enable\
       -o 0exit-42
 
@@ -78,13 +92,13 @@ trace "TEST       0exit-42"
 [ $r != 42 ] && echo "  => $r"
 [ $r = 42 ]
 
-trace "HEX2       ${srcdest}lib/$mes_cpu-mes/elf$mes_bits-body-exit-42.hex2" $HEX2\
+trace "HEX2       ${srcdest}lib/$mes_kernel/$mes_cpu-mes/elf$mes_bits-body-exit-42.hex2" $HEX2\
       --LittleEndian\
-      --architecture $stage0_cpu\
+      $stage0_cpu_flag\
       --BaseAddress 0x1000000\
-      -f ${srcdest}lib/$mes_cpu-mes/elf$mes_bits-header.hex2\
-      -f ${srcdest}lib/$mes_cpu-mes/elf$mes_bits-body-exit-42.hex2\
-      -f ${srcdest}lib/$mes_cpu-mes/elf$mes_bits-footer-single-main.hex2\
+      -f ${srcdest}lib/$mes_kernel/$mes_cpu-mes/elf$mes_bits-header.hex2\
+      -f ${srcdest}lib/$mes_kernel/$mes_cpu-mes/elf$mes_bits-body-exit-42.hex2\
+      -f ${srcdest}lib/$mes_kernel/$mes_cpu-mes/elf$mes_bits-footer-single-main.hex2\
       --exec_enable\
       -o body-exit-42
 
@@ -94,10 +108,10 @@ trace "TEST       body-exit-42"
 [ $r = 42 ]
 
 ### FIXME: c&p from exit-42
-trace "CCLD       ${srcdest}lib/$mes_cpu-mes-$compiler/hello-mes.S" $CC\
+trace "CCLD       ${srcdest}lib/$mes_kernel/$mes_cpu-mes-$compiler/hello-mes.S" $CC\
       -nostdlib\
       -g\
-      ${srcdest}lib/$mes_cpu-mes-$compiler/hello-mes.S\
+      ${srcdest}lib/$mes_kernel/$mes_cpu-mes-$compiler/hello-mes.S\
       -o hello-mes
 
 trace "TEST       hello-mes"
@@ -105,12 +119,12 @@ trace "TEST       hello-mes"
 [ $r != 0 ] && echo "  => $r"
 [ $r = 0 ]
 
-trace "HEX2       ${srcdest}lib/$mes_cpu-mes/elf$mes_bits-0hello-mes.hex2" $HEX2\
+trace "HEX2       ${srcdest}lib/$mes_kernel/$mes_cpu-mes/elf$mes_bits-0hello-mes.hex2" $HEX2\
       --LittleEndian\
-      --architecture $stage0_cpu\
+      $stage0_cpu_flag\
       --BaseAddress 0x1000000\
-      -f ${srcdest}lib/$mes_cpu-mes/elf$mes_bits-0header.hex2\
-      -f ${srcdest}lib/$mes_cpu-mes/elf$mes_bits-0hello-mes.hex2\
+      -f ${srcdest}lib/$mes_kernel/$mes_cpu-mes/elf$mes_bits-0header.hex2\
+      -f ${srcdest}lib/$mes_kernel/$mes_cpu-mes/elf$mes_bits-0hello-mes.hex2\
       --exec_enable\
       -o 0hello-mes
 
@@ -119,13 +133,13 @@ trace "TEST       0hello-mes"
 [ $r != 0 ] && echo "  => $r"
 [ $r = 0 ]
 
-trace "HEX2       ${srcdest}lib/$mes_cpu-mes/elf$mes_bits-body-hello-mes.hex2" $HEX2\
+trace "HEX2       ${srcdest}lib/$mes_kernel/$mes_cpu-mes/elf$mes_bits-body-hello-mes.hex2" $HEX2\
       --LittleEndian\
-      --architecture $stage0_cpu\
+      $stage0_cpu_flag\
       --BaseAddress 0x1000000\
-      -f ${srcdest}lib/$mes_cpu-mes/elf$mes_bits-header.hex2\
-      -f ${srcdest}lib/$mes_cpu-mes/elf$mes_bits-body-hello-mes.hex2\
-      -f ${srcdest}lib/$mes_cpu-mes/elf$mes_bits-footer-single-main.hex2\
+      -f ${srcdest}lib/$mes_kernel/$mes_cpu-mes/elf$mes_bits-header.hex2\
+      -f ${srcdest}lib/$mes_kernel/$mes_cpu-mes/elf$mes_bits-body-hello-mes.hex2\
+      -f ${srcdest}lib/$mes_kernel/$mes_cpu-mes/elf$mes_bits-footer-single-main.hex2\
       --exec_enable\
       -o body-hello-mes
 
index 13952a90dc1ac0d5c0426adae27d09968fb45c9f..db6184b5ff92660a3166d5d78eaa831f47660e12 100644 (file)
@@ -36,57 +36,21 @@ fi
 
 set -u
 . ./config.sh
+. ${srcdest}build-aux/cflags.sh
 
 if $courageous; then
     echo "Applying courage"
     set +e
 fi
 
-${SHELL} ${srcdest}build-aux/build-scaffold.sh
+if test "$compiler" != bootstrap; then
+    ${SHELL} ${srcdest}build-aux/build-scaffold.sh
+fi
 
 if test -n "$GUILE" -a "$GUILE" != true; then
     ${SHELL} ${srcdest}build-aux/build-guile.sh
 fi
 
-debug=
-#debug=-g
-
-CFLAGS="
--static
-$debug
-"
-
-if test $mes_libc = mes; then
-    CFLAGS="$CFLAGS
--nostdinc
--nostdlib
--fno-builtin
-"
-fi
-
-CPPFLAGS="
--D HAVE_CONFIG_H=1
--I ../include
--I ${srcdir}/../include
--I ${srcdir}/../include/$mes_kernel/$mes_cpu
-"
-
-LDFLAGS="
-$debug
--L .
-"
-if test $mes_libc = mes; then
-    LDFLAGS="$LDFLAGS
--nostdlib
-"
-fi
-LIBS=-lc
-
-export CFLAGS
-export CPPFLAGS
-export LDFLAGS
-export LIBS
-
 (
     mkdir -p gcc-lib
     cp config.sh gcc-lib
@@ -96,32 +60,46 @@ export LIBS
         srcdir=../
     fi
     if test $compiler = gcc; then
-        CPPFLAGS="
+        AM_LDFLAGS="$AM_LDFLAGS
+-L gcc-lib
+"
+        AM_CPPFLAGS="
 -D HAVE_CONFIG_H=1
+-I ${srcdest}lib
 -I include
 -I ${srcdest}include
 -I ${srcdest}include/$mes_kernel/$mes_cpu
 "
+        if test $mes_kernel = gnu; then
+            AM_CPPFLAGS="$AM_CPPFLAGS
+-I /usr/include
+"
+        fi
+
         ${SHELL} ${srcdest}build-aux/build-lib.sh
         cp crt1.o ..
     fi
     compiler=gcc ${SHELL} ${srcdest}build-aux/build-source-lib.sh
 )
 
+
 (
     if test $compiler = gcc; then
-        LDFLAGS="$LDFLAGS
+        AM_LDFLAGS="$AM_LDFLAGS
 -L gcc-lib
 "
     fi
 
-    CPPFLAGS="
+    AM_CPPFLAGS="
 -D HAVE_CONFIG_H=1
+-I ${srcdest}lib
 -I include
 -I ${srcdest}include
 -I ${srcdest}include/$mes_kernel/$mes_cpu
 "
-    ${SHELL} ${srcdest}build-aux/build-mes.sh
+    if test $compiler = gcc; then
+        ${SHELL} ${srcdest}build-aux/build-mes.sh
+    fi
 )
 
 (
@@ -130,21 +108,34 @@ export LIBS
     cd mescc-lib
     sed -i s,mes_libc=system,mes_libc=mes, config.sh
     mkdir -p include/mes
-    cp -p ../include/mes/config.h include/mes/config.h
+    cp ../include/mes/config.h include/mes/config.h
     sed -i 's,#define SYSTEM_LIBC 1,#undef SYSTEM_LIBC,' include/mes/config.h
     if test -z "$srcdest"; then
         srcdest=../
         srcdir=../
     fi
-        CPPFLAGS="
+    ln -sf ${srcdest}mes .
+    ln -sf ${srcdest}module .
+    ln -sf ${srcdest}src .
+    AM_CPPFLAGS="
 -D HAVE_CONFIG_H=1
+-I ${srcdest}lib
 -I include
 -I ${srcdest}include
 -I ${srcdest}include/$mes_kernel/$mes_cpu
 "
     compiler=mescc
-    AR="${srcdest}pre-inst-env mesar"
-    CC="${srcdest}pre-inst-env mescc -m $mes_bits"
+    AR=${MESAR-"${srcdest}pre-inst-env mesar"}
+    CC=${MESCC-"${srcdest}pre-inst-env mescc -m $mes_bits"}
+    # No user overrides for MesCC, they are probably intended for GCC
+    CFLAGS=
+    CPPFLAGS=
+    LDFLAGS=
     ${SHELL} ${srcdest}build-aux/build-lib.sh
     ${SHELL} ${srcdest}build-aux/build-source-lib.sh
+    if $bootstrap; then
+        ${SHELL} ${srcdest}build-aux/build-mes.sh
+        cp -f bin/mes-mescc ../bin
+        cp -f bin/mes ../bin
+    fi
 )
index 93ae07ba1adc45760f14817083df284e7fe0c141..1a99e95f335d2586c5dc7c8d84d49bf3770aa6c5 100755 (executable)
@@ -22,9 +22,9 @@ compile () {
     b=$(basename $c .c)
     o=$b.o
     objects="$objects $o"
-    if test $c -nt $o; then
-        trace "CC         $c" $CC -c $CPPFLAGS $CFLAGS -o $o $c
-        $CC -c $CPPFLAGS $CFLAGS -o $o $c
+    if test ! -e $o -o $c -nt $o; then
+        trace "CC         $c" $CC -c $AM_CPPFLAGS $CPPFLAGS $AM_CFLAGS $CFLAGS -o $o $c
+        $CC -c $AM_CPPFLAGS $CPPFLAGS $AM_CFLAGS $CFLAGS -o $o $c
     fi
 }
 
@@ -51,6 +51,6 @@ link () {
     else
         crt1=crt1.o
     fi
-    trace "CCLD       $out" $CC $CFLAGS $LDFLAGS -o $out $crt1 $objects $LIBS
+    trace "CCLD       $out" $CC $AM_CFLAGS $CFLAGS $AM_LDFLAGS $LDFLAGS -o $out $crt1 $objects $LIBS
     objects=
 }
diff --git a/build-aux/cflags.sh b/build-aux/cflags.sh
new file mode 100644 (file)
index 0000000..2ce778a
--- /dev/null
@@ -0,0 +1,56 @@
+# GNU Mes --- Maxwell Equations of Software
+# Copyright © 2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+#
+# This file is part of GNU Mes.
+#
+# GNU Mes is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or (at
+# your option) any later version.
+#
+# GNU Mes is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+AM_CPPFLAGS="
+-D HAVE_CONFIG_H=1
+-I ${srcdest}include
+-I ${srcdest}include/$mes_kernel/$mes_cpu
+"
+
+if test $mes_kernel = gnu; then
+    AM_CPPFLAGS="$AM_CPPFLAGS
+-I /usr/include
+"
+fi
+
+AM_CFLAGS=
+
+if test $mes_libc = mes; then
+    AM_CFLAGS="$AM_CFLAGS
+-static
+-nostdinc
+-nostdlib
+-fno-builtin
+"
+fi
+
+AM_LDFLAGS="
+-L .
+"
+if test $mes_libc = mes; then
+    AM_LDFLAGS="$AM_LDFLAGS
+-static
+-nostdlib
+"
+fi
+LIBS=-lc
+
+export AM_CFLAGS CFLAGS
+export AM_CPPFLAGS CPPFLAGS
+export AM_LDFLAGS LDFLAGS
+export LIBS
index f060da67f0684539644c3b2336d30e773f8ae380..15204d355cceaf759ae4dcbae9f6ef7923df814f 100755 (executable)
@@ -24,7 +24,6 @@ set -u
 
 TESTS="
 lib/tests/scaffold/t.c
-lib/tests/scaffold/00-exit-0.c
 lib/tests/scaffold/01-return-0.c
 lib/tests/scaffold/02-return-1.c
 lib/tests/scaffold/03-call.c
@@ -76,7 +75,10 @@ lib/tests/scaffold/23-global-pointer-pointer-ref.c
 lib/tests/scaffold/23-pointer-sub.c
 lib/tests/scaffold/23-pointer.c
 lib/tests/mes/30-oputs.c
+lib/tests/mes/30-eputs.c
 lib/tests/string/30-strlen.c
+lib/tests/scaffold/30-exit-0.c
+lib/tests/scaffold/30-exit-42.c
 lib/tests/scaffold/32-call-wrap.c
 lib/tests/scaffold/32-compare.c
 lib/tests/scaffold/33-and-or.c
@@ -226,7 +228,6 @@ lib/tests/scaffold/a1-global-no-clobber.c
 fi
 
 XFAIL_TESTS="
-lib/tests/mes/90-abtod.c
 lib/tests/stdio/90-sprintf.c
 "
 
@@ -236,6 +237,7 @@ lib/tests/scaffold/17-compare-unsigned-char-le.c
 lib/tests/scaffold/17-compare-unsigned-short-le.c
 lib/tests/scaffold/66-local-char-array.c
 lib/tests/scaffold/72-typedef-struct-def-local.c
+lib/tests/mes/90-abtod.c
 lib/tests/mes/90-dtoab.c
 lib/tests/scaffold/90-goto-var.c
 lib/tests/scaffold/91-goto-array.c
@@ -261,7 +263,6 @@ fi
 
 if test $compiler = gcc; then
     XFAIL_TESTS="$XFAIL_TESTS
-lib/tests/mes/90-abtod.c
 "
 
     if test $mes_cpu = x86; then
@@ -277,7 +278,6 @@ lib/tests/stdio/70-printf-simple.c
 lib/tests/stdio/70-printf.c
 lib/tests/scaffold/70-extern.c
 lib/tests/stdio/80-sscanf.c
-lib/tests/mes/90-abtod.c
 lib/tests/posix/90-execlp.c
 lib/tests/string/90-snprintf.c
 "
index 45947ef8dfa22b1ea626e8679b275ff8b0b71704..1e250e5efda5539a24daf7e7cf1935ccc66b2ddf 100644 (file)
@@ -20,19 +20,22 @@ AR:=@AR@
 BASH:=@BASH@
 BLOOD_ELF:=@BLOOD_ELF@
 CC:=@CC@
+CFLAGS:=@CFLAGS@
+CPPFLAGS:=@CPPFLAGS@
 DIFF:=@DIFF@
 DOT:=@DOT@
 GIT:=@GIT@
 GUILD:=@GUILD@
 GUILE:=@GUILE@
 GUILE_EFFECTIVE_VERSION:=@GUILE_EFFECTIVE_VERSION@
+GUILE_LOAD_PATH:=@GUILE_LOAD_PATH@
 GUIX:=@GUIX@
 HELP2MAN:=@HELP2MAN@
 HEX2:=@HEX2@
+LDFLAGS:=@LDFLAGS@
 MAKEINFO:=@MAKEINFO@
 M1:=@M1@
 MES_FOR_BUILD:=@MES_FOR_BUILD@
-MES_SEED:=@MES_SEED@
 NYACC:=@NYACC@
 PACKAGE:=@PACKAGE@
 PACKAGE_NAME:=@PACKAGE_NAME@
@@ -50,7 +53,7 @@ arch:=@arch@
 build:=@build@
 host:=@host@
 
-bootstrap:=
+bootstrap:=@bootstrap@
 compiler:=@compiler@
 courageous:=@courageous@
 mes_system:=@mes_system@
index 83fa015d93f7ead8f47a8968e55a241c17ee0f9e..4e2953e5585ff92183d00a498d7af4d120a272e5 100644 (file)
@@ -21,19 +21,22 @@ AR=${AR-"@AR@"}
 BASH="@BASH@"
 BLOOD_ELF="@BLOOD_ELF@"
 CC=${CC-"@CC@"}
+CFLAGS=${CFLAGS-"@CFLAGS@"}
+CPPFLAGS=${CPPFLAGS-"@CPPFLAGS@"}
 DIFF=${DIFF-@DIFF@}
 DOT="@DOT@"
 GIT="@GIT@"
 GUILD="@GUILD@"
 GUILE="@GUILE@"
 GUILE_EFFECTIVE_VERSION="@GUILE_EFFECTIVE_VERSION@"
+GUILE_LOAD_PATH="@GUILE_LOAD_PATH@"
 GUIX="@GUIX@"
 HELP2MAN="@HELP2MAN@"
 HEX2="@HEX2@"
+LDFLAGS=${LDFLAGS-"@LDFLAGS@"}
 MAKEINFO="@MAKEINFO@"
 M1="@M1@"
 MES_FOR_BUILD="@MES_FOR_BUILD@"
-MES_SEED="@MES_SEED@"
 NYACC="@NYACC@"
 PACKAGE="@PACKAGE@"
 PACKAGE_NAME="@PACKAGE_NAME@"
@@ -51,6 +54,7 @@ abs_top_srcdir="@abs_top_srcdir@"
 arch="@arch@"
 build="@build@"
 host="@host@"
+numbered_arch=${numbered_arch-"@numbered_arch@"}
 
 bootstrap=${bootstrap-@bootstrap@}
 compiler=${compiler-@compiler@}
index 7568de8dbaf381604f146d146dd55521db541017..ed0e23bbbe5913d082da6424a4eaf98773c64b87 100644 (file)
@@ -41,13 +41,38 @@ lib/stdlib/exit.c
 lib/stdlib/puts.c
 lib/string/strlen.c
 "
+
+    if test $mes_kernel = gnu; then
+        libc_mini_shared_SOURCES="$libc_mini_shared_SOURCES
+lib/gnu/_exit.c
+lib/gnu/exec-startup-get-data.c
+lib/gnu/fd-get.c
+lib/gnu/fd-write.c
+lib/gnu/io-write.c
+lib/gnu/_write.c
+lib/gnu/hurd-start.c
+lib/gnu/proc-mark-exit.c
+lib/gnu/syscall.c
+lib/gnu/task-get-special-port.c
+lib/gnu/task-terminate.c
+lib/gnu/vm-statistics.c
+lib/mach/mach-init.c
+lib/mach/mach_host_self.S
+lib/mach/mach_msg_trap.S
+lib/mach/mach_reply_port.S
+lib/mach/mach_task_self.S
+lib/mach/mach_thread_self.S
+lib/mach/msg.c
+lib/string/argz-extract.c
+"
+    fi
 fi
 
 libc_mini_SOURCES="$libc_mini_shared_SOURCES"
 
 if test $mes_libc = mes; then
     libc_mini_SOURCES="$libc_mini_SOURCES
-lib/mes/write.c
+lib/mes/mini-write.c
 "
 fi
 
@@ -79,6 +104,11 @@ lib/ctype/isxdigit.c
 lib/posix/write.c
 lib/stdlib/atoi.c
 "
+    if test $mes_kernel = gnu; then
+        libmes_SOURCES="$libmes_SOURCES
+lib/stub/lseek.c
+"
+    fi
     if test $mes_kernel = linux; then
         libmes_SOURCES="$libmes_SOURCES
 lib/linux/lseek.c
@@ -101,7 +131,7 @@ lib/posix/getcwd.c
 lib/posix/getenv.c
 lib/posix/isatty.c
 lib/posix/open.c
-lib/posix/read.c
+lib/posix/buffered-read.c
 lib/posix/setenv.c
 lib/posix/wait.c
 lib/stdio/fgetc.c
@@ -125,6 +155,32 @@ lib/string/strcpy.c
 lib/string/strncmp.c
 "
 
+if test $mes_kernel = gnu; then
+    libc_SOURCES="$libc_SOURCES
+lib/gnu/_open3.c
+lib/gnu/_read.c
+lib/gnu/dir-lookup.c
+lib/gnu/fd-read.c
+lib/gnu/io-read.c
+lib/gnu/malloc.c
+lib/gnu/vm-allocate.c
+lib/stub/access.c
+lib/stub/brk.c
+lib/stub/chmod.c
+lib/stub/clock_gettime.c
+lib/stub/dup2.c
+lib/stub/dup.c
+lib/stub/execve.c
+lib/stub/fork.c
+lib/stub/_getcwd.c
+lib/stub/gettimeofday.c
+lib/stub/ioctl.c
+lib/stub/time.c
+lib/stub/unlink.c
+lib/stub/waitpid.c
+"
+fi
+
 if test $mes_kernel = linux; then
     libc_SOURCES="$libc_SOURCES
 lib/linux/access.c
@@ -215,6 +271,14 @@ lib/linux/stat.c
 "
 fi
 
+if test $mes_kernel = gnu; then
+    libc_tcc_SOURCES="$libc_tcc_SOURCES
+lib/stub/close.c
+lib/stub/rmdir.c
+lib/stub/stat.c
+"
+fi
+
 libc_gnu_SOURCES="
 $libc_tcc_SOURCES
 lib/ctype/isalnum.c
index f3807af729c171616619461fae4efca235e5044d..d8ca89e08bad2717a59287d4231f3c716983ae26 100644 (file)
@@ -83,10 +83,6 @@ ifdef MES_FOR_BUILD
 export MES_FOR_BUILD
 endif
 
-ifdef MES_SEED
-export MES_SEED
-endif
-
 ifdef MESCC
 export MESCC
 endif
@@ -131,6 +127,18 @@ ifdef GUILE_LOAD_COMPILED_PATH
 export GUILE_LOAD_COMPILED_PATH
 endif
 
+ifdef AM_CFLAGS
+export AM_CFLAGS
+endif
+
+ifdef AM_CPPFLAGS
+export AM_CPPFLAGS
+endif
+
+ifdef AM_LDFLAGS
+export AM_LDFLAGS
+endif
+
 ifdef CFLAGS
 export CFLAGS
 endif
@@ -139,6 +147,10 @@ ifdef CPPFLAGS
 export CPPFLAGS
 endif
 
+ifdef LDFLAGS
+export LDFLAGS
+endif
+
 ifdef HEX2FLAGS
 export HEX2FLAGS
 endif
index 9ed1cc0e624f7fb626644cb1a222f0c23166aa2d..b9e0fd449b90a80552b5a4db8f48756b5a76240f 100755 (executable)
@@ -3,7 +3,7 @@ eval '(exit $?0)' && eval 'exec perl -wS "$0" "$@"'
     if 0;
 # Convert git log output to ChangeLog format.
 
-my $VERSION = '2016-10-16 06:30'; # UTC
+my $VERSION = '2019-12-08 20:13'; # UTC
 # The definition above must lie within the first 8 lines in order
 # for the Emacs time-stamp write hook (at end) to update it.
 # If you change this file with Emacs, please let the write hook
@@ -345,7 +345,7 @@ sub git_dir_option($)
                   ? '  (tiny change)' : '');
 
       my $date_line = sprintf "%s  %s$tiny\n",
-        strftime ("%Y-%m-%d", localtime ($1)), $2;
+        strftime ("%Y-%m-%d", gmtime ($1)), $2;
 
       my @coauthors = grep /^Co-authored-by:.*$/, @line;
       # Omit meta-data lines we've already interpreted.
index c8ecb67eb445a505661b285949ebda5caad54ae6..db4c6436a9b725401a423b72a01e17f26f290e30 100644 (file)
@@ -43,7 +43,13 @@ fi
 
 DESTDIR=${DESTDIR-}
 mkdir -p ${DESTDIR}${bindir}
-cp $_v src/mes ${DESTDIR}${bindir}/mes
+cp $_v bin/mes ${DESTDIR}${bindir}/mes
+if test -f bin/mes-gcc; then
+    cp $_v bin/mes-gcc ${DESTDIR}${bindir}/mes-gcc
+fi
+if test -f bin/mes-mescc; then
+    cp $_v bin/mes-mescc ${DESTDIR}${bindir}/mes-mescc
+fi
 cp $_v scripts/mesar ${DESTDIR}${bindir}/mesar
 cp $_v scripts/mescc.scm ${DESTDIR}${bindir}/mescc.scm
 cp $_v scripts/mescc ${DESTDIR}${bindir}/mescc
@@ -91,6 +97,7 @@ mkdir -p $DESTDIR$libdir
 mkdir -p $DESTDIR$pkgdatadir
 tar -cf- -C ${srcdir}/include . | tar -${v}xf- -C $DESTDIR$includedir
 tar -cf- -C ${srcdir}/lib $mes_cpu-mes | tar -${v}xf- -C $DESTDIR$libdir
+tar -cf- -C ${srcdir}/lib $mes_kernel/$mes_cpu-mes | tar -${v}xf- -C $DESTDIR$libdir
 if test -z "$srcdest"; then
     tar -cf- $__exclude_go module | tar -${v}xf- -C $DESTDIR$pkgdatadir
 else
index 3f6201ac144619caf9853083099b0a838ebe6064..b8ef1151cd49af815615f1a460c06743fb354f5a 100644 (file)
@@ -36,10 +36,10 @@ if [ -n "$srcdest" ]; then
 fi
 export GUILE_LOAD_COMPILED_PATH GUILE_LOAD_PATH
 
-PATH="$abs_top_builddir/scripts:$abs_top_builddir/scripts:$abs_top_builddir/src:$abs_top_builddir/build-aux:$PATH"
+PATH="$abs_top_builddir/scripts:$abs_top_builddir/scripts:$abs_top_builddir/bin:$abs_top_builddir/build-aux:$PATH"
 export PATH
 
-MES=${MES-${abs_top_builddir}/src/${program_prefix}mes}
+MES=${MES-${abs_top_builddir}/bin/${program_prefix}mes}
 export MES
 
 bindir=${abs_top_builddir}/scripts
index 9a84f6c4db0183009c2070ffe484ea91b0e2574e..008440759efbf8bd75b51b27881494e6ac98a577 100755 (executable)
@@ -52,6 +52,11 @@ else
     LIBS='-l c'
 fi
 
+if test $mes_kernel = gnu\
+        && test -z "$LIBS"; then
+    LIBS="-l c-mini"
+fi
+
 if test $mes_libc = system; then
     crt1=
     LIBS='-l mes'
@@ -59,8 +64,8 @@ else
     crt1=crt1.o
 fi
 
-$CC -c $CPPFLAGS $CFLAGS -o "$o".o "$t"
-$CC $CFLAGS $LDFLAGS -L . -o "$o" $crt1 "$o".o $LIBS
+$CC -g -c $AM_CPPFLAGS $CPPFLAGS $AM_CFLAGS $CFLAGS -o "$o".o "$t"
+$CC -g $AM_CFLAGS $CFLAGS $AM_LDFLAGS $LDFLAGS -L . -o "$o" $crt1 "$o".o $LIBS
 
 set +e
 timeout 10 "$o" -s --long file0 file1 > "$o".1 2> "$o".2
index 44c44cb20615bd74984121d842a7f37f9bf2787a..7e59b5a984dc849d77a129c28a362b168cbf8e0f 100755 (executable)
--- a/configure
+++ b/configure
@@ -36,7 +36,7 @@ MES_ARENA=100000000 exec ${SCHEME-guile} -L . --no-auto-compile -e '(configure)'
 (define PACKAGE "mes")
 (define PACKAGE-NAME "GNU Mes")
 (define PACKAGE-BUGREPORT "bug-mes@gnu.org")
-(define VERSION "0.21")
+(define VERSION "0.22")
 
 (cond-expand
  (guile)
@@ -86,10 +86,10 @@ MES_ARENA=100000000 exec ${SCHEME-guile} -L . --no-auto-compile -e '(configure)'
 (define (verbose string . rest)
   (if %verbose? (apply stderr (cons string rest))))
 
-(define (gulp-pipe* . command)
+(define (gulp-pipe command)
   (let* ((err (current-error-port))
          (foo (set-current-error-port (open-output-file ".error")))
-         (port (apply open-pipe* OPEN_READ command))
+         (port (open-pipe command "r"))
          (output (read-string port))
          (status (close-pipe port))
          (error (with-input-from-file ".error" read-string)))
@@ -100,6 +100,9 @@ MES_ARENA=100000000 exec ${SCHEME-guile} -L . --no-auto-compile -e '(configure)'
     (if (not (zero? status)) ""
         (string-trim-right (string-append output error)))))
 
+(define (gulp-pipe* . command)
+  (gulp-pipe (string-join command)))
+
 (define (tuple< a b)
   (cond
    ((and (null? a) (null? b)) #t)
@@ -152,7 +155,7 @@ MES_ARENA=100000000 exec ${SCHEME-guile} -L . --no-auto-compile -e '(configure)'
   (data dependency-data)
   (version-found dependency-version-found))
 
-(define* (make-dep name #:key (version '(0)) optional? (version-option "--version") (commands (list name)) file-name data)
+(define* (make-dep name #:key (version '()) optional? (version-option "--version") (commands (list name)) file-name data)
   (let* ((env-var (getenv (name->shell-name name)))
          (commands (if env-var (cons env-var commands) commands)))
     (make-dependency name version optional? version-option commands file-name data #f)))
@@ -183,7 +186,12 @@ MES_ARENA=100000000 exec ${SCHEME-guile} -L . --no-auto-compile -e '(configure)'
   (let ((split (string-tokenize string
                                 (char-set-adjoin char-set:digit #\.))))
     (and (pair? split)
-         (let* ((version (sort split (lambda (a b) (> (string-length a) (string-length b)))))
+         (let* ((version (sort split (lambda (a b)
+                                       (let ((len-a (length (string-split a #\.)))
+                                             (len-b (length (string-split b #\.))))
+                                         (cond ((> len-a len-b) #t)
+                                               ((< len-a len-b) #f)
+                                               (else (> (string-length a) (string-length b))))))))
                 (version (car version))
                 (version (string-tokenize version
                                           (char-set-complement (char-set #\.)))))
@@ -195,20 +203,17 @@ MES_ARENA=100000000 exec ${SCHEME-guile} -L . --no-auto-compile -e '(configure)'
         (version-option (dependency-version-option dependency))
         (commands (dependency-commands dependency)))
     (let loop ((commands commands))
-      (if (null? commands) dependency
+      (if (or (null? commands)
+              (not (car commands))) dependency
           (let ((command (car commands)))
-            (stdout "checking for ~a~a... " name
+            (stdout "checking for ~a~a... " (if (string-index command #\space) name command)
                     (if (null? expected) ""
                         (format #f " [~a]" (version->string expected))))
-            (let* ((output (gulp-pipe* command version-option))
-                   ;;(foo (stderr "output=~s\n" output))
+            (let* ((output (gulp-pipe (string-append command " " (if version-option version-option ""))))
                    (actual (string->version output))
-                   ;;(foo (stderr "actual=~s\n" actual))
-                   ;;(foo (stderr "expected=~s\n" expected))
                    (pass? (and actual (tuple< expected actual)))
-                   ;;(foo (stderr "PASS?~s\n" pass?))
                    (dependency (set-field dependency (dependency-version-found) actual)))
-              (stdout "~a ~a\n" (if pass? (if (pair? actual) "" " yes")
+              (stdout "~a ~a\n" (if pass? (if (pair? actual) "" "yes")
                                     (if actual " no, found" "no"))
                       (or (version->string actual) ""))
               (if pass? (let ((file-name (or (PATH-search-path command)
@@ -253,23 +258,39 @@ MES_ARENA=100000000 exec ${SCHEME-guile} -L . --no-auto-compile -e '(configure)'
       (if result (set-field dependency (dependency-file-name) name)
           dependency))))
 
+(define (cflags-list)
+  (let ((cflags (getenv "CFLAGS")))
+    (if cflags (list cflags)
+        '())))
+
+(define (ldflags-list)
+  (let ((ldflags (getenv "LDFLAGS")))
+    (if ldflags (list ldflags)
+        '())))
+
 (define (check-preprocess-header-c cc header)
   (with-output-to-file ".config.c"
     (cut format #t "#include \"~a\"" header))
-  (with-error-to-file "/dev/null"
-    (cut zero? (system* cc "-E" "-o" ".config.E" ".config.c"))))
+  (let ((test (lambda _ (apply system* `(,cc "-E" "-o" ".config.E" ,@(cflags-list) ".config.c")))))
+    (zero? (if %verbose? (test)
+               (with-error-to-file "/dev/null"
+                 test)))))
 
 (define (check-compile-string-c cc string)
   (with-output-to-file ".config.c"
     (cut display string))
-  (with-error-to-file "/dev/null"
-    (cut zero? (system* cc "--std=gnu99" "-c" "-o" ".config.o" ".config.c"))))
+  (let ((test (lambda _ (apply system* `(,cc "-std=gnu99" "-c" "-o" ".config.o" ,@(cflags-list) ".config.c")))))
+    (zero? (if %verbose? (test)
+               (with-error-to-file "/dev/null"
+                 test)))))
 
 (define (check-link-string-c cc string)
   (with-output-to-file ".config.c"
     (cut display string))
-  (with-error-to-file "/dev/null"
-    (cut zero? (system* cc "--std=gnu99" "-o" ".config" ".config.c"))))
+  (let ((test (lambda _ (apply system* `(,cc "-std=gnu99" "-o" ".config" ,@(cflags-list) ,@(ldflags-list) ".config.c")))))
+    (zero? (if %verbose? (test)
+               (with-error-to-file "/dev/null"
+                 test)))))
 
 (define (parse-opts args)
   (let* ((option-spec
@@ -289,6 +310,7 @@ MES_ARENA=100000000 exec ${SCHEME-guile} -L . --no-auto-compile -e '(configure)'
             (mes)
             (help (single-char #\h))
             (verbose (single-char #\v))
+            (with-bootstrap)
             (with-cheating)
             (with-courage)
             (infodir (value #t))
@@ -329,6 +351,7 @@ Options:
                        verbose build output [V=1]
       --host=HOST      cross-compile to build programs to run on HOST [BUILD]
   -v, --verbose        be verbose
+  --with-bootstrap     After building mes with CC, build mes with MesCC
   --with-courage       Assert that even if this platform is unsupported,
                        you will be courageous and port GNU Mes to it
                        (see \"Porting GNU Mes\" in the manual.)
@@ -361,10 +384,12 @@ Ignored for Debian:
 Some influential environment variables:
   CC                C compiler command
   CFLAGS            C compiler flags
+  CPPFLAGS          C preprocessor flags
+  LDFLAGS           C linker flags
   GUILE             guile command
   GUILD             guild command
+  GUILE_LOAD_PATH   guile load path; where to find Nyacc
   MES_FOR_BUILD     build system MES [can be mes or guile]
-  MES_SEED          location of mes-seed
 " PACKAGE VERSION (getenv "prefix")))
 
 (define (main args)
@@ -386,6 +411,8 @@ Some influential environment variables:
          (includedir (option-ref options 'includedir "${prefix}/include"))
          (libdir (option-ref options 'libdir "${prefix}/lib"))
          (pkgdatadir (string-append datadir "/mes"))
+         (guile-load-path (if (and (pair? %load-path) (equal? (car %load-path) ".")) (cdr %load-path)
+                              %load-path))
          (guile-effective-version (effective-version))
          (guile-site-dir (if (equal? prefix ".") (canonicalize-path ".")
                              (string-append prefix "/share/guile/site/" guile-effective-version)))
@@ -400,6 +427,7 @@ Some influential environment variables:
          (top-builddir (if (equal? srcdir ".") "."
                            abs-top-builddir))
 
+         (with-bootstrap? (option-ref options 'with-bootstrap #f))
          (with-cheating? (option-ref options 'with-cheating #f))
          (with-courage? (option-ref options 'with-courage #f))
          (disable-colors? (option-ref options 'disable-colors #f))
@@ -417,51 +445,53 @@ Some influential environment variables:
     (when %verbose?
       (stderr "configure args=~s\n" args))
     (for-each (lambda (v) (apply setenv (string-split v #\=))) vars)
-    (let* ((mes-seed (or (getenv "MES_SEED")
-                         (string-append srcdest "../mes-seed")))
-           (mes-seed (and mes-seed
-                          (file-exists? (string-append mes-seed "/x86-mes/mes.S"))
-                          mes-seed))
-           (tinycc-prefix (or (getenv "TINYCC_PREFIX")
-                              (string-append srcdest "../tinycc-prefix")))
-           (gcc (or (getenv "CC") "gcc"))
-           (tcc (or (getenv "TCC") "tcc"))
-           (mescc (or (getenv "MESCC") "mescc"))
+    (let* ((cross? (not (equal? host-type build-type)))
+           (gcc (if cross? (string-append host-type "-" "gcc") "gcc"))
+           (tcc (if cross? (string-append host-type "-" "tcc") "tcc"))
+           (mescc (if cross? (string-append host-type "-" "mescc") "mescc"))
            (deps (fold (lambda (program results)
                          (cons (check-program-version program) results))
                        '()
-                       (list (make-dep "hex2" #:version '(0 6))
-                             (make-dep "M1" #:version '(0 6))
-                             (make-dep "blood-elf" #:version '(0 6))
+                       (list (make-dep "hex2")
+                             (make-dep "M1")
+                             (make-dep "blood-elf")
                              (make-dep "diff" #:optional? #t)
                              (make-dep "guile" #:version '(2 0) #:commands '("guile-2.2" "guile-2.0" "guile-2" "guile") #:optional? #t)
                              (make-dep "mes" #:version '(0 20) #:optional? #t)
-                             (make-dep "guix" #:version '(0 13) #:optional? #t)
+                             (make-dep "guix" #:version '() #:optional? #t)
                              (make-dep "ar" #:version '(2 10) #:optional? #t)
-                             (make-dep "sh" #:version '(0) #:optional? #t)
+                             (make-dep "sh" #:optional? #t)
                              (make-dep "bash" #:version '(2 0) #:optional? #t)
-                             (make-dep "guild" #:version '(2 0) #:commands '("guild" "guile-tools"))
-                             (make-dep "cc" #:commands (list gcc tcc mescc) #:optional? #t)
-                             (make-dep "make" #:optional? #t)
-                             (make-dep "makeinfo" #:optional? #t)
+                             (make-dep "guild" #:version '(2 0) #:commands '("guild" "guile-tools" "true"))
+                             (make-dep "CC" #:commands `(,(getenv "CC")) #:optional? #t)
+                             (make-dep "CC-v" #:commands `(,(getenv "CC")) #:optional? #t #:version-option "-v")
+                             (make-dep "cc" #:commands '("cc") #:optional? #t)
+                             (make-dep "gcc" #:commands `(,gcc "gcc") #:optional? #t)
+                             (make-dep "mescc" #:commands `(,mescc "mescc") #:optional? #t)
+                             (make-dep "tcc" #:commands `(,tcc "tcc") #:optional? #t #:version-option "-v")
+                             (make-dep "cc-v" #:commands '("cc") #:optional? #t #:version-option "-v")
+                             (make-dep "make" #:optional? #t #:commands '("gmake" "make"))
+                             (make-dep "makeinfo" #:version '(6) #:optional? #t)
                              (make-dep "dot" #:version-option "-V" #:optional? #t)
                              (make-dep "help2man" #:version '(1 47) #:optional? #t)
-                             (make-dep "perl" #:version '(5) #:optional? #t)
-                             (make-dep "git" #:version '(2) #:optional? #t))))
+                             (make-dep "perl" #:version '(5) #:optional? #t))))
            (guile (file-name "guile" deps))
-           (deps (if guile (cons (check-program-version (make-dep "nyacc" #:version '(0 86 0) #:commands (list (string-append guile " -c '(use-modules (nyacc lalr)) (display *nyacc-version*)'")) #:file-name #t))
+           (deps (if guile (cons (check-program-version (make-dep "nyacc" #:version '(0 99 0) #:commands (list (string-append guile " -c '(use-modules (nyacc lalr)) (display *nyacc-version*)'")) #:file-name #t #:version-option #f))
                                  deps)
                      deps))
            (guile (or guile "guile"))
-           (cc (file-name "cc" deps))
+           (cc (or (file-name "CC" deps)
+                   (file-name "CC-v" deps)
+                   (file-name "tcc" deps)
+                   (file-name "gcc" deps)
+                   (file-name "cc" deps)
+                   (file-name "cc-v" deps)
+                   (file-name "mescc" deps)))
            (deps (if cc
                      (cons* (check-header-c cc (make-dep "limits.h"))
                             (check-header-c cc (make-dep "stdio.h" #:optional? #t))
                             deps)
                      deps))
-           (deps (cons (check-file (make-dep "tinycc-prefix" #:optional? #t
-                                             #:file-name tinycc-prefix))
-                       deps))
            (missing (filter (conjoin (negate dependency-file-name)
                                      (negate dependency-optional?)) deps))
            (deps (if cc
@@ -479,36 +509,36 @@ Some influential environment variables:
 "))
                            deps)
                      deps))
-           (mesc? (file-name "cc is Mes C" deps))
+           (mesc? (file-name "cc is MES C" deps))
            (deps (if cc
-                     (cons (check-compile-c cc (make-dep "cc is Tiny CC" #:data "#if !defined (__TINYCC__)
+                     (cons (check-compile-c cc (make-dep "cc is Tiny C" #:data "#if !defined (__TINYC__)
 #error no tinycc
 #endif
 "))
                            deps)
                      deps))
-           (tcc? (file-name "cc is Tiny CC" deps))
+           (tcc? (file-name "cc is Tiny C" deps))
            (deps (if cc
-                     (cons (check-link-c cc (make-dep "if cc can create executables" #:data "int main () {return 0;}"))
+                     (cons (check-link-c cc (make-dep "whether cc can create executables" #:data "int main () {return 0;}"))
                            deps)
                      deps))
            (system-libc? (and with-system-libc? (file-name "if cc can create executables" deps)))
-           (build-type (or (and cc (gulp-pipe* cc "-dumpmachine")) build-type))
-           (build-type-list (string-split build-type #\-))
-           (mes-cpu (car build-type-list))
+           (host-type (or (and cc (let ((dump (gulp-pipe* cc "-dumpmachine")))
+                                    (and (not (string-null? dump)) dump))) host-type))
+           (host-type-list (string-split host-type #\-))
+           (mes-cpu (car host-type-list))
            (mes-cpu (cond ((member mes-cpu '("i386" "i486" "i586" "i686")) "x86")
                           ((member mes-cpu '("arm" "armv4" "armv7l")) "arm")
                           (else mes-cpu)))
            (mes-bits (if (member mes-cpu '("x86_64")) "64"
                          "32"))
            (mes-libc (if system-libc? "system" "mes"))
-
-           (kernel-list (filter (compose not (cut equal? <> "unknown")) (cdr build-type-list)))
-           (mes-kernel (cond ((or (equal? '("linux" "gnu") kernel-list)
-                                  (equal? "linux" (car kernel-list))) "linux")
-                             ((equal? '( "gnu") kernel-list) "gnu")
-                             (else "unknown")))
-           (compiler (if gcc? "gcc" "mescc"))
+           (mes-kernel (car (filter
+                             (compose not
+                                      (cut member <> '("pc" "portbld" "unknown")))
+                             (cdr host-type-list))))
+           (mes-kernel (if (string-prefix? "freebsd" mes-kernel) "freebsd" mes-kernel))
+           (mes-compiler (cond (gcc? "gcc") (tcc? "gcc") (else "mescc")))
            (mes-system (string-join (list mes-cpu mes-kernel "mes") "-"))
            (bash (or (and (file-exists? "/bin/bash") "/bin/bash")
                      (file-name "bash" deps)
@@ -517,7 +547,13 @@ Some influential environment variables:
                       (file-name "bash" deps)
                       (and (file-exists? "/bin/sh") "/bin/sh")
                       (file-name "sh" deps)
-                      "sh")))
+                      "sh"))
+           (hex2 (file-name "hex2" deps))
+           (numbered-arch? (begin
+                             (stdout "checking for stage0 architecture flag... ")
+                             (let ((numbered? (and hex2 (string-contains (gulp-pipe (string-append hex2 " --help 2>&1" )) "--Architecture 12345"))))
+                               (stdout (if numbered? "numbered\n" "named\n"))
+                               numbered?))))
 
       (define* (substitute file-name pairs
                            #:key (target (if (string-suffix? ".in" file-name)
@@ -543,15 +579,6 @@ See \"Porting GNU Mes\" in the manual, or try --with-courage\n" mes-system)
       (when (pair? missing)
         (stderr "\nMissing dependencies: ~a\n" (string-join (map dependency-name missing)))
         (exit 1))
-      (let ((git (find-dep "git" deps)))
-        (when (and git
-                   (not (file-exists? ".git")))
-          ;; Debian wants to run `make clean' from a tarball
-          (and (zero? (system* "git" "init"))
-               (zero? (system* "git" "add" "."))
-               (zero? (system* "touch" ".git-for-build"))
-               (zero? (system* "git" "commit" "--allow-empty" "-m" "Import mes")))))
-
       (let ((pairs `(("@PACKAGE@" . ,PACKAGE)
                      ("@PACKAGE_NAME@" . ,PACKAGE-NAME)
                      ("@PACKAGE_BUGREPORT@" . ,PACKAGE-BUGREPORT)
@@ -560,8 +587,9 @@ See \"Porting GNU Mes\" in the manual, or try --with-courage\n" mes-system)
                      ("@build@" . ,build-type)
                      ("@host@" . ,host-type)
 
+                     ("@bootstrap@" . ,(if with-bootstrap? "true" "false"))
                      ("@courageous@" . ,(if with-courage? "true" "false"))
-                     ("@compiler@" . ,compiler)
+                     ("@compiler@" . ,mes-compiler)
                      ("@mes_bits@" . ,mes-bits)
                      ("@mes_kernel@" . ,mes-kernel)
                      ("@mes_cpu@" . ,mes-cpu)
@@ -589,40 +617,42 @@ See \"Porting GNU Mes\" in the manual, or try --with-courage\n" mes-system)
                      ("@mandir@" . ,mandir)
                      ("@sysconfdir@" . ,sysconfdir)
 
-                     ("@GUILE_EFFECTIVE_VERSION@" . ,(effective-version))
                      ("@colors@" . ,(if disable-colors? "no" "yes"))
                      ("@V@" . ,(if disable-silent-rules? "1" "0"))
 
                      ("@AR@" . ,(or (file-name "ar" deps) ""))
                      ("@BASH@" . ,bash)
-                     ("@CC@" . ,(or (file-name "cc" deps) ""))
+                     ("@CC@" . ,cc)
                      ("@DIFF@" . ,(or (file-name "diff" deps) (string-append abs-top-builddir "/pre-inst-env diff.scm")))
                      ("@DOT@" . ,(or (file-name "dot" deps) ""))
                      ("@GIT@" . ,(or (file-name "git" deps) ""))
                      ("@GUILE@" . ,guile)
+                     ("@GUILE_EFFECTIVE_VERSION@" . ,(effective-version))
+                     ("@GUILE_LOAD_PATH@" . ,(string-join guile-load-path ":"))
                      ("@GUIX@" . ,(or (file-name "guix" deps) ""))
                      ("@HELP2MAN@" . ,(or (file-name "help2man" deps) ""))
                      ("@MAKEINFO@" . ,(or (file-name "makeinfo" deps) ""))
                      ("@MES_FOR_BUILD@" . ,(or (file-name "mes" deps)
                                                guile))
-                     ("@MES_SEED@" . ,(or mes-seed ""))
                      ("@PERL@" . ,(or (file-name "perl" deps) ""))
                      ("#SCHEME=\"@SCHEME@\"" . ,(if with-cheating? (string-append "\nSCHEME=\"" guile "\"") ""))
                      ("@SCHEME@" . ,(if with-cheating? guile ""))
                      ("@SHELL@" . ,shell)
 
-                     ("@CFLAGS@" . ,(or (getenv "CFLAGS") ""))
+                     ("@CFLAGS@" . ,(or (getenv "CFLAGS") "-static -g"))
+                     ("@CPPFLAGS@" . ,(or (getenv "CPPFLAGS") ""))
+                     ("@LDFLAGS@" . ,(or (getenv "LDFLAGS") "-static -g"))
                      ("@HEX2FLAGS@" . ,(or (getenv "HEX2FLAGS") ""))
                      ("@M1FLAGS@" . ,(or (getenv "M1FLAGS") ""))
+                     ("@numbered_arch@" . ,(if numbered-arch? "true" "false"))
 
                      ,@(map
                         (lambda (o)
                           (cons (string-append "@" (variable-name o) "@") (or (format #f "~a" (dependency-file-name o)) "")))
                         deps))))
 
-        (when (and (not cc)
-                   (not mes-seed))
-          (format (current-error-port) "must supply C compiler or MES_SEED/x86-mes/mes.S\n")
+        (unless cc
+          (format (current-error-port) "must supply a C compiler")
           (exit 2))
         (for-each (lambda (o)
                     (let* ((src (string-append srcdest o))
@@ -664,19 +694,21 @@ See \"Porting GNU Mes\" in the manual, or try --with-courage\n" mes-system)
 "))
               (display (string-append "
 #define MES_VERSION \"" VERSION "\"
-#define MES_PKGDATADIR \"" pkgdatadir "\"
 ")))))
         (substitute (string-append srcdest "build-aux/config.make.in") pairs #:target ".config.make"))
 
       (let ((make (and=> (file-name "make" deps) basename)))
         (display (string-append "
 GNU Mes is configured for
-   compiler: " compiler "
-   cpu:      " mes-cpu "
-   bits:     " mes-bits "
-   libc:     " mes-libc "
-   kernel:   " mes-kernel "
-   system:   " mes-system "
+   compiler:   " mes-compiler "
+   cpu:        " mes-cpu "
+   bits:       " mes-bits "
+   libc:       " mes-libc "
+   kernel:     " mes-kernel "
+   system:     " mes-system "
+   tools:      " (if numbered-arch? "numbered" "named") " arch
+   bootstrap:  " (if with-bootstrap? "yes" "no") "
+   courageous: " (if with-courage? "yes" "no") "
 
 Run:
   " (or make "./build.sh") "           to build mes
index edf57789fa9f62be416fe3b908a8cbe981a2fabc..62a5f25d94952a4ffde2ba57d055fb91e35055f6 100755 (executable)
 
 set -e
 
-VERSION=0.21
+VERSION=0.22
 srcdir=${srcdir-$(dirname $0)}
+srcdest=
+if test "$srcdir" != "."; then
+    srcdest=$srcdir/
+fi
 . ${srcdest}build-aux/trace.sh
 
 # parse arguments
@@ -35,6 +39,7 @@ while [ $# -gt 0 ]; do
             ;;
         (--build=*)
             build=${1#--build=}
+            host=${host-$build}
             ;;
         (--host=*)
             host=${1#--host=}
@@ -52,12 +57,12 @@ done
 prefix=${prefix-/usr/local}
 mes_libc=${mes_libc-mes}
 courageous=${courageous-false}
-host=${host-$build}
 
-AR=${AR-$(command -v ar)} || true
-BASH=${BASH-$(command -v bash)}
+BASH=${BASH-$(command -v bash || command -v sh)}
 BLOOD_ELF=${BLOOD_ELF-$(command -v blood-elf)}
 CC=${CC-$(command -v gcc)} || true
+CFLAGS=${CFLAGS-}
+CPPFLAGS=${CPPFLAGS-}
 DIFF=${DIFF-$(command -v diff || echo $PWD/pre-inst-env diff.scm)}
 GUILD=${GUILD-$(command -v guild)} || true
 GUILE_TOOLS=${GUILE_TOOLS-$(command -v guile-tools)} || true
@@ -70,14 +75,13 @@ if test ! "$GUILD"; then
 fi
 GUILE=${GUILE-$(command -v guile)} || true
 HEX2=${HEX2-$(command -v hex2)}
+LDPFLAGS=${LDFLAGS-}
 M1=${M1-$(command -v M1)}
 MES_FOR_BUILD=${MES_FOR_BUILD-$(command -v mes || command -v guile || echo mes)}
 GIT=${GIT-$(command -v git)} || true
 PERL=${PERL-$(command -v perl)} || true
 SHELL=${BASH-$SHELL}
 
-MES_SEED=${MES_SEED-../mes-seed}
-
 if test "$srcdir" = .; then
     top_builddir=.
 else
@@ -92,6 +96,14 @@ if test -z "$GUILE" -o "$GUILE" = true; then
 else
     GUILE_EFFECTIVE_VERSION=${GUILE_EFFECTIVE_VERSION-$(guile -c '(display (effective-version))')}
 fi
+
+numbered_arch=false
+mes_tools=named
+if ( $HEX2 --help 2>&1 ) | grep -q "\-\-Architecture 12345"; then
+    numbered_arch=true
+    mes_tools=numbered
+fi
+
 bindir=$(eval echo ${bindir-$prefix/bin})
 datadir=$(eval echo ${datadir-$prefix/share})
 docdir=$(eval echo ${docdir-$datadir/doc/mes})
@@ -110,7 +122,7 @@ subst () {
     -e s,"@PACKAGE_NAME@,$PACKAGE_NAME,"\
     -e s,"@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,"\
     -e s,"@VERSION@,$VERSION,"\
-    -e s,"@bootstrap@,yes,"\
+    -e s,"@bootstrap@,true,"\
     -e s,"@build@,$build,"\
     -e s,"@host@,$host,"\
     -e s,"@compiler@,$compiler,"\
@@ -139,6 +151,7 @@ subst () {
     -e s,"@pkgdatadir@,$pkgdatadir,"\
     -e s,"@sysconfdir@,$sysconfdir,"\
     -e s,"@GUILE_EFFECTIVE_VERSION@,$GUILE_EFFECTIVE_VERSION,"\
+    -e s,"@GUILE_LOAD_PATH@,$GUILE_LOAD_PATH,"\
     -e s,"@V@,$V,"\
     -e s,"@AR@,$AR,"\
     -e s,"@BASH@,$BASH,"\
@@ -155,8 +168,7 @@ subst () {
     -e s,"@M1@,$M1,"\
     -e s,"@M1FLAGS@,$M1FLAGS,"\
     -e s,"@MES_FOR_BUILD@,$MES_FOR_BUILD,"\
-    -e s,"@MES_SEED@,$MES_SEED,"\
-    -e s,"@MES_SEED@,$MES_SEED,"\
+    -e s,"@numbered_arch@,$numbered_arch,"\
     -e s,"@SHELL@,$SHELL,"\
     $1 > $2
 }
@@ -186,6 +198,8 @@ case "$host" in
         mes_kernel=linux;;
     *gnu)
         mes_kernel=gnu;;
+    *freebsd*)
+        mes_kernel=frreebsd;;
     *)
         mes_kernel=linux;;
 esac
@@ -197,16 +211,20 @@ case "$mes_cpu" in
         mes_bits=32;;
 esac
 #
-if $CC --version | grep gcc; then #2>/dev/null; then
+if $CC --version | grep gcc; then
     compiler=gcc
-elif $CC --version | grep tcc; then #2>/dev/null; then
+elif $CC --version | grep tcc; then
     compiler=gcc
 else
     compiler=mescc
+    AR=${AR-$PWD/scripts/mesar}
 fi
 
+AR=${AR-$(command -v ar)} || true
+
 mes_system=$mes_cpu-$mes_kernel-mes
 
+mkdir -p scripts
 subst ${srcdest}build-aux/GNUmakefile.in GNUmakefile
 subst ${srcdest}build-aux/config.sh.in config.sh
 subst ${srcdest}build-aux/bootstrap.sh.in bootstrap.sh
@@ -241,20 +259,22 @@ EOF
 fi
 cat >> include/mes/config.h <<EOF
 #define MES_VERSION "$VERSION"
-#define MES_PKGDATADIR "$pkgdatadir"
 EOF
 
 cat <<EOF
 GNU Mes is configured for
-   compiler: $compiler
-   cpu:      $mes_cpu
-   bits:     $mes_bits
-   libc:     $mes_libc
-   kernel:   $mes_kernel
-   system:   $mes_system
+   compiler:   $compiler
+   cpu:        $mes_cpu
+   bits:       $mes_bits
+   libc:       $mes_libc
+   kernel:     $mes_kernel
+   system:     $mes_system
+   tools:      $mes_tools arch
+   courageous: $courageous
+   bootstrap:  yes
 
 Run:
-  sh build.sh      to build mes
+  sh bootstrap.sh  to bootstrap build mes
   sh check.sh      to check mes
   sh install.sh    to install mes
 EOF
index bc642b748deb64e90838a63deb82d6224cbd3492..6cf75d44434876316b75b2e3871541b4c0bd4aef 100644 (file)
@@ -37,18 +37,18 @@ Packages are available in Guix master.
 
   GNU Mes[0] brings a Reduced Binary Seed bootstrap[1] to GNU Guix[2].
   This bootstrap has halved the size of opaque, uninspectable binaries
-  that were needed to bootstrap Guix.  The final goal is to help create
-  a full source bootstrap as part of the bootstrappable builds[3] effort
-  for any interested UNIX-like operating system.
+  that were needed to bootstrap Guix 1.0.  The final goal is to help
+  create a full source bootstrap as part of the bootstrappable builds[3]
+  effort for any interested UNIX-like operating system.
 
-  It consists of a mutual self-hosting Scheme interpreter written in
-  ~5,000 LOC of simple C and a Nyacc-based C compiler written in Scheme.
-  This mes.c is being simplified[4] to be transpiled by M2-Planet[5].
+  Mes consists of a mutual self-hosting Scheme interpreter written in
+  ~5,000 LOC of simple C, and a C compiler written in Scheme.  This
+  mes.c is being simplified[4] to be transpiled by M2-Planet[5].
 
   The Scheme interpreter has a Garbage Collector, a library of loadable
   Scheme modules-- notably Dominique Boucher's LALR[6], Pre-R6RS
   [portable syntax-case[7] with R7RS ellipsis, Matt Wette's Nyacc[8]
-  --and test suite just enough to support a REPL and a C99 compiler:
+  --and test suite, just enough to support a REPL and a C99 compiler:
   MesCC.
 
   Mes+MesCC can compile an only lightly patched TinyCC[9] that is
diff --git a/doc/announce/ANNOUNCE-0.22 b/doc/announce/ANNOUNCE-0.22
new file mode 100644 (file)
index 0000000..e148793
--- /dev/null
@@ -0,0 +1,162 @@
+
+Subject: GNU Mes 0.22 released
+
+<#secure method=pgpmime mode=sign>
+
+We are pleased to announce the release of GNU Mes 0.22, representing
+57 commits over 8 weeks.
+
+Mes can now be built reproducibly by mes+mescc or guile+mescc accross
+distributions such as GNU Guix, Debian GNU/Linux and NixOS.  Also, many
+build issues were fixed.  A big thank you to reproducible-builds.org,
+Vagrant Cascadian, Jelle van der Waa, Hannes Mehnert and David Terry!
+
+Mes now runs on the Hurd--mescc does not run yet, many system calls are
+missing, especially fork/exec--and initial scaffolding support for
+creating FreeBSD binaries was added.
+
+This release better supports bringing the Scheme-only bootstrap to Guix:
+it no longer requires an update to the Guix bootstrap seed.
+
+The Scheme-only bootstrap means that Mes can now be built with Gash and
+the experimental Gash Core Utils instead of using GNU Awk, GNU Bash, the
+GNU Core Utilities, GNU Grep, GNU Gzip, GNU Make, GNU Sed, and GNU Tar.
+Also, the Mes C Library now supports bootstrapping those.
+
+We are excited that the Nlnet Foundation[12] is now sponsoring this
+work!
+
+Next targets:
+
+ - Introduce the Reduced Binaries Seed bootstrap to NixOS (Debian,
+   Arch, Gentoo, ...?)
+ - Merge the Scheme-only bootstrap, the wip-bootstrap branch (using
+   Guile, Gash and Gash Core Utils to remove awk, bash, core utilities,
+   grep, gzip, make, sed, tar, etc. from the Guix bootstrap binaries)
+   into Guix core-updates.
+ - ARM support
+ - Full Source Bootstrap: compile Mes.c using M2-Planet
+ - Add full Guile module support
+ - Reduced Binary Seed bootstrap for ARM
+ - Support mescc on the Hurd (fork/exec, ...)
+
+Packages are available in Guix master; the cross-distro reproducible
+is built using
+
+    guix build --system=i686-linux mes-rb5
+
+* About
+
+  GNU Mes[0] is a Scheme interpreter and C compiler for bootstrapping the GNU
+  System.  Since version 0.22 it has again helped to halve the size of
+  opaque, uninspectable binary seeds that are currently being used in the
+  Reduced Binary Seed bootstrap[1] of GNU Guix[2].  The final goal is to help
+  create a full source bootstrap as part of the bootstrappable builds[3]
+  effort for UNIX-like operating systems.
+
+  The Scheme interpreter is written in ~5,000 LOC of simple C, and the C
+  compiler written in Scheme and these are mutual self-hosting.  This
+  mes.c is being simplified[4] to be transpiled by M2-Planet[5].
+
+  Mes has a Garbage Collector, a library of loadable Scheme modules--
+  notably Dominique Boucher's LALR[6], Pre-R6RS [portable syntax-case[7]
+  with R7RS ellipsis, Matt Wette's Nyacc[8] --and test suite just enough
+  to support a REPL and a C99 compiler: MesCC.
+
+  Mes+MesCC can compile an only lightly patched TinyCC[9] that is
+  self-hosting.  Using this tcc and the Mes C library we now have a
+  Reduced Binary Seed bootstrap for the gnutools triplet: glibc-2.2.5,
+  binutils-2.20.1, gcc-2.95.3.  This is enough to bootstrap Guix for
+  i686-linux and x86_64-linux.
+
+  Mes is inspired by The Maxwell Equations of Software: LISP-1.5[10] -- John
+  McCarthy page 13, GNU Guix's source/binary packaging transparency and
+  Jeremiah Orians's stage0[11] ~500 byte self-hosting hex assembler.
+
+* Download
+
+  git clone git://git.savannah.gnu.org/mes.git
+
+  Here are the compressed sources and a GPG detached signature[*]:
+    https://ftp.gnu.org/gnu/mes/mes-0.22.tar.gz
+    https://ftp.gnu.org/gnu/mes/mes-0.22.tar.gz.sig
+
+  Use a mirror for higher download bandwidth:
+    https://ftpmirror.gnu.org/mes/mes-0.22.tar.gz
+    https://ftpmirror.gnu.org/mes/mes-0.22.tar.gz.sig
+
+  Here are the MD5 and SHA1 checksums:
+
+  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  mes-0.22.tar.gz
+  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  mes-0.22.tar.gz
+
+  [*] Use a .sig file to verify that the corresponding file (without the
+  .sig suffix) is intact.  First, be sure to download both the .sig file
+  and the corresponding tarball.  Then, run a command like this:
+
+    gpg --verify mes-0.22.tar.gz.sig
+
+  If that command fails because you don't have the required public key,
+  then run this command to import it:
+
+    gpg --keyserver keys.gnupg.net --recv-keys 1A858392E331EAFDB8C27FFBF3C1A0D9C1D65273
+
+  and rerun the 'gpg --verify' command.
+
+* Get informed, get involved
+
+  See https://bootstrappable.org
+  Join #bootstrappable on irc.freenode.net.
+
+* Changes in 0.22 since 0.21
+ ** Core
+ *** Mes now builds reproducibly with MesCC, cross distribution
+ Using --with-bootstrap on x86, a bin/mes-mescc is compiled with
+ mes+mescc, that shall have sha256sum
+
+     9e0bcb1633c58e7bc415f6ea27cee7951d6b0658e13cdc147e992b31a14625fb  bin/mes-mescc
+
+ This has been verified on GNU Guix, Debian GNU/Linux and NixOS.
+ *** Mes now builds reproducibly with Guile+MesCC vs Mes+MesCC.
+ *** Mes now builds reproducibly with Tiny CC-built MesCC.
+ *** configure now respects the user's CFLAGS, CPPFLAGS and LDFLAGS.
+ *** Mes now supports mescc-tools 0.5.2 next to 0.6.1.
+ This allows introducing the Scheme-only bootstrap without updating or
+ adding new bootstrap binary seeds into GNU Guix.
+ *** Mes now runs when configured --with-courage on the Hurd:
+     GNU debian 0.9 GNU-Mach 1.8+git20170609-486/Hurd-0.9 i686-AT386 GNU
+ Note that mescc does not run; fork and exec are not yet implemented.
+ *** Mes now configures --with-courage on x86-FreeBSD 12.1
+ The initial ELF scaffold tests: exit-42.S, 0exit-42.hex2,
+ body-exit-42.hex2, hello-mes.S, 0hello-mes.hex2, body-hello-mes.hex2
+ pass.
+ *** configure now has a --with-bootstrap option.
+ This adds the reproducible bootstrap build of bin/mes-mescc, using
+ mes+mescc.
+ *** configure prefers $CC over gcc; tcc over gcc, gcc over cc.
+ *** Mes now prints an error when attempting to read a file that does not exist.
+ *** Mes no longer depends on GIT.
+ ** Noteworthy bug fixes
+ *** Several annoying build problems were fixed, for non-Guix systems.
+ *** A bug with buffered-read was fixed.
+ This means that bash-2.05 can now build glibc-2.2.5; notably it now
+ successfully executes make-syscall.sh.
+ *** A bug with execlp, execvp for file names containing a slash was fixed.
+ This should allow make-3.80 running scripts that have "#! ./move-if-change".
+
+Greetings,
+janneke and Danny.
+
+[0] https://www.gnu.org/software/mes
+[1] https://guix.gnu.org/blog/2019/guix-reduces-bootstrap-seed-by-50/
+[2] https://www.gnu.org/software/guix
+[3] https://bootstrappable.org
+[4] https://github.com/oriansj/mes-m2
+[5] https://github.com/oriansj/m2-planet
+[6] https://github.com/schemeway/lalr-scm
+[7] https://www.cs.indiana.edu/chezscheme/syntax-case/old-psyntax.html
+[8] https://www.nongnu.org/nyacc
+[9] https://gitlab.com/janneke/tinycc
+[10] http://www.softwarepreservation.org/projects/LISP/book/LISP%201.5%20Programmers%20Manual.pdf
+[11] https://savannah.nongnu.org/projects/stage0
+[12] https://nlnet.nl/project/GNUMes
index 011494aad9ef8856b4d8f0705ce89087e3a1e10d..0c2de61dcdd7baf3f59140a030be53f8953b0ec3 100644 (file)
@@ -29,7 +29,7 @@ Documentation License''.
 
 
 * mes: (mes)Invoking mes.       Running Mes, a minimalist Guile lookalike.
-* mescc: (mes)Invoking MesCC.   Running the MesCC bootstrap compiler.
+* mescc: (mes)Invoking mescc.   Running the MesCC bootstrap compiler.
 @end direntry
 
 @titlepage
@@ -48,7 +48,7 @@ Edition @value{EDITION} @*
 @contents
 
 @c *********************************************************************
-@node Top
+@node Top, Introduction, (dir), (dir)
 @top GNU Mes
 
 This document describes GNU Mes version @value{VERSION}, a bootstrappable
@@ -73,6 +73,7 @@ Software Freedom
 * Reproducible Builds::         Reproducibility and free software.
 * Bootstrappable Builds::       The freedom to build a software without binary seed.
 * Full Source Bootstrap::       Software dependencies worthy of GNU.
+* LISP as Maxwell's Equations of Software::  Auditable elegance.
 
 Installation
 
@@ -83,15 +84,15 @@ Installation
 Bootstrapping
 
 * The Mes Bootstrap Process::   How Mes will make you yogurt from pure milk.
-* Invoking Mes::                Running Mes, a minimalist Guile lookalike.
-* Invoking MesCC::              Running the MesCC bootstrap compiler.
+* Invoking mes::                Running Mes, a minimalist Guile lookalike.
+* Invoking mescc::              Running the MesCC bootstrap compiler.
 * Invoking mesar::
 
-Invoking Mes
+Invoking mes
 
 * Environment Variables::       If the bits won't change, change their habitat.
 
-Invoking MesCC
+Invoking mescc
 
 * MesCC Environment Variables::  There's no NIX like POSIX.
 
@@ -108,7 +109,7 @@ Contributing
 @end menu
 
 @c *********************************************************************
-@node Introduction
+@node Introduction, Installation, Top, Top
 @chapter Introduction
 
 @quotation
@@ -187,9 +188,10 @@ Freedom 1.
 * Reproducible Builds::         Reproducibility and free software.
 * Bootstrappable Builds::       The freedom to build a software without binary seed.
 * Full Source Bootstrap::       Software dependencies worthy of GNU.
+* LISP as Maxwell's Equations of Software::  Auditable elegance.
 @end menu
 
-@node Reproducible Builds
+@node Reproducible Builds, Bootstrappable Builds, Introduction, Introduction
 @section Reproducible Builds
 
 The current Reproducible Builds effort incubated in the Debian
@@ -238,7 +240,7 @@ packages could be rebuild bit-identical from source.
 @author Martin Uecker
 @end quotation
 
-@node Bootstrappable Builds
+@node Bootstrappable Builds, Full Source Bootstrap, Reproducible Builds, Introduction
 @section Bootstrappable Builds
 
 Software distributions that take reproducible builds seriously are
@@ -250,14 +252,14 @@ opaque ascii or binary @emph{seeds} that are injected during build
 time.  Yes, a package may build reproduciblly from all inspectable
 sourcess...but what functionality is programmed in the opaque seed?
 
-@subsection Bootstrap Binaries
+@subsection Bootstrap Binary Seed
 Possibly one of the most harmless, but certainly by far the biggest
 binary seed that all software distributions inject are the so called
-@emph{bootstrap binaries}.  Bootstrap binaries are the initial binary
+@emph{bootstrap binary seed}.  Bootstrap binaries are the initial binary
 seeds that are used to start building the distribution.
 
 The GNU Guix operating system, version 1.0 had a relatively small
-closure of bootstrap binaries: GNU binutils, GNU gcc, GNU Libc, GNU
+closure of bootstrap binary seed: GNU binutils, GNU gcc, GNU Libc, GNU
 Guile, and ``Static binaries'' (think: bash, bzip2, coreutils, gawk,
 grep, gzip, patch, sed, tar, xz).
 
@@ -287,17 +289,17 @@ $ du -schx *
 @end example
 
 During the Guix 1.1 development series we managed to create the first
-reduction by 50% of the Guix @emph{bootstrap binaries}@footnote{See
+reduction by 50% of the Guix @emph{bootstrap binary seed}@footnote{See
 @url{https://guix.gnu.org/blog/2019/guix-reduces-bootstrap-seed-by-50/}}.
 This was a very important step because the ~250MB @emph{seed} of binary
 code was practically non-auditable, which makes it hard to establish
 what source code produced them.
 
-@node Full Source Bootstrap
+@node Full Source Bootstrap,  , Bootstrappable Builds, Introduction
 @section  Full Source Bootstrap
 
 There is an obvious solution: we cannot allow any binary seeds in our
-software stack.  Not even in the bootstrap binaries.  Maybe that is a
+software stack.  Not even in the bootstrap binary seed.  Maybe that is a
 bit too strong: we want to have the absolute minimum of binary seeds and
 all binary seeds need to be inspectable and must be reviewed.  How big
 would the absolute minimal set be?
@@ -321,8 +323,8 @@ of the @var{hex} function
 @end example
 
 All computer programs look like this: an opaque list of computer codes.
-The initial programs that we take for granted---the bootstrap
-binaries---are about 250MB of such numbers: think 250,000 pages full of
+The initial programs that we take for granted---the bootstrap binary
+seed---are about 250MB of such numbers: think 250,000 pages full of
 numbers.
 
 Most computers work pretty well so apparently there is not a pressing
@@ -407,7 +409,8 @@ nothing to all of the programs that our computer runs.  Something that
 seemed to be an impossible dream is suddenly starting to look like
 ``just a couple years of work''.
 
-@subsection LISP as Maxwell's Equations of Software
+@node LISP as Maxwell's Equations of Software
+@section LISP as Maxwell's Equations of Software
 
 As fate would have it, I stumbled upon this
 @url{https://queue.acm.org/detail.cfm?id=1039523, interview with Alan
@@ -426,7 +429,7 @@ over.
 @end quotation
 
 Our starting point is @file{hex0}, a 500 byte hex assembler and we need
-to somehow close the gap to building the bootstrap binaries, esp. GNU
+to somehow close the gap to building the bootstrap binary seed, esp. GNU
 Gcc and the GNU C Library.  What better way to do that than by
 leveraging the powers of LISP?
 
@@ -435,8 +438,49 @@ will be indirectly bootstrapped from @file{hex0} and that wields the
 magical powers of LISP to close the bootstrap gap, asserting we can
 enjoy software Freedom 1.
 
+@subsection Auditable Elegance
+
+@code{eval} and @code{apply} are mutual recursing functions that---using
+a few helper functions---describe the core of the universe of computing.
+
+@lisp
+(define (apply fn x a)
+  (cond
+   ((atom fn)
+    (cond
+     ((eq fn CAR)  (caar x))
+     ((eq fn CDR)  (cdar x))
+     ((eq fn CONS) (cons (car x) (cadr x)))
+     ((eq fn ATOM) (atom (car x)))
+     ((eq fn EQ)   (eq (car x) (cadr x)))
+     (#t           (apply (eval fn a) x a))))
+   ((eq (car fn) LAMBDA)
+                   (eval (caddr fn) (pairlis (cadr fn) x a)))
+   ((eq (car fn) LABEL)
+                   (apply (caddr fn) x
+                          (cons (cons (cadr fn) (caddr fn)) a)))))
+@end lisp
+
+@lisp
+(define (eval e a)
+  (cond
+   ((atom e) (cdr (assoc e a)))
+   ((atom (car e))
+    (cond ((eq (car e) QUOTE) (cadr e))
+          ((eq (car e) COND)  (evcon (cdr e) a))
+          (#t                 (apply (car e) (evlis (cdr e) a) a))))
+   (#t       (apply (car e) (evlis (cdr e) a) a))))
+@end lisp
+
+It will be a big day when our computers are fully bootstrapped from
+source.  It would be nice if that source code were readable, auditable
+and elegant.  To be honest, the elegance displayed above that we
+achieved at the very start of the Mes project is currently hard to find.
+It is our sincerest hope to bring back this level of quality and
+elegance..
+
 @c *********************************************************************
-@node Installation
+@node Installation, Bootstrapping, Introduction, Top
 @chapter Installation
 
 @cindex installing Mes
@@ -452,7 +496,7 @@ to use it.
 * Running the Test Suites::     Testing Mes.
 @end menu
 
-@node Regular Requirements
+@node Regular Requirements, Bootstrap Requirements, Installation, Installation
 @section Regular Requirements
 
 This section lists requirements when building Mes from source.  The
@@ -476,7 +520,7 @@ Mes is compatible with GNU Guile, so it is possible to share the same
 Scheme code between both.  Currently Mes only supports the minimal
 subset of R5RS and Guile extensions to run MesCC.
 
-@node Bootstrap Requirements
+@node Bootstrap Requirements, Running the Test Suites, Regular Requirements, Installation
 @section Bootstrap Requirements
 
 This section lists requirements when building Mes as a bootstrap
@@ -501,7 +545,7 @@ Bootstrapping Mes depends on the following packages:
 @item @url{https://savannah.gnu.org/projects/nyacc/, NYACC}, 0.93.0 or later, including 0.99.0.
 @end itemize
 
-@node Running the Test Suites
+@node Running the Test Suites,  , Bootstrap Requirements, Installation
 @section Running the Test Suites
 
 @cindex test suites
@@ -521,7 +565,7 @@ build-aux/check-boot.sh
 Run a single Mes boot test
 
 @example
-MES_BOOT=scaffold/boot/00-zero.scm src/mes
+MES_BOOT=scaffold/boot/00-zero.scm bin/mes
 @end example
 
 Run a single Mes Scheme test
@@ -544,7 +588,7 @@ CC=gcc CC32=i686-unknown-linux-gnu-gcc MES=guile \
   build-aux/test.sh scaffold/tests/00-exit-0
 @end example
 
-@node Bootstrapping
+@node Bootstrapping, Contributing, Installation, Top
 @chapter Bootstrapping
 
 @quotation
@@ -584,12 +628,12 @@ responsibility.
 
 @menu
 * The Mes Bootstrap Process::   How Mes will make you yogurt from pure milk.
-* Invoking Mes::                Running Mes, a minimalist Guile lookalike.
-* Invoking MesCC::              Running the MesCC bootstrap compiler.
+* Invoking mes::                Running Mes, a minimalist Guile lookalike.
+* Invoking mescc::              Running the MesCC bootstrap compiler.
 * Invoking mesar::
 @end menu
 
-@node The Mes Bootstrap Process
+@node The Mes Bootstrap Process, Invoking mes, Bootstrapping, Bootstrapping
 @section The Mes Bootstrap Process
 
 The Reduced Binary Seed bootstrap currently adopted by Guix@footnote{See
@@ -667,8 +711,8 @@ Although we think these are less essential and thus less interesting
 than the GNU toolchain triplet that we focussed on initially, our next
 priority is to eleminate these one by one.
 
-@node Invoking Mes
-@section Invoking Mes
+@node Invoking mes, Invoking mescc, The Mes Bootstrap Process, Bootstrapping
+@section Invoking mes
 
 @cindex repl
 The @command{mes} command is the Scheme interpreter whose prime
@@ -687,13 +731,13 @@ The @var{option}s can be among the following:
 
 @item -s @var{script} @var{arg}@dots{}
 @cindex script mode
-By default, Mes will read a file named on the command line as a script.
+By default, mes will read a file named on the command line as a script.
 Any command-line arguments @var{arg}@dots{} following @var{script}
 become the script's arguments; the @code{command-line} function returns
 a list of strings of the form @code{(@var{script} @var{arg}@dots{})}.
 
 Scripts are read and evaluated as Scheme source code just as the
-@code{load} function would.  After loading @var{script}, Mes exits.
+@code{load} function would.  After loading @var{script}, mes exits.
 
 @item -c @var{expr} @var{arg}@dots{}
 @cindex evaluate expression, command-line argument
@@ -701,7 +745,7 @@ Evaluate @var{expr} as Scheme code, and then exit.  Any command-line
 arguments @var{arg}@dots{}) following @var{expr} become command-line
 arguments; the @code{command-line} function returns a list of strings of
 the form @code{(@var{guile} @var{arg}@dots{})}, where @var{mes} is the
-path of the Mes executable.
+path of the mes executable.
 
 @item -- @var{arg}@dots{}
 Run interactively, prompting the user for expressions and evaluating
@@ -709,7 +753,7 @@ them.  Any command-line arguments @var{arg}@dots{} following the
 @option{--} become command-line arguments for the interactive session;
 the @code{command-line} function returns a list of strings of the form
 @code{(@var{guile} @var{arg}@dots{})}, where @var{mes} is the path of the
-Mes executable.
+mes executable.
 
 @item -L,--load-path=@var{directory}
 Add @var{directory} to the front of Mes module load path.  The given
@@ -732,10 +776,10 @@ and the command-line arguments---the list provided by the
 @code{command-line} function.
 
 @item -h@r{, }--help
-Display help on invoking Mes, and then exit.
+Display help on invoking mes, and then exit.
 
 @item -v@r{, }--version
-Display the current version of Mes, and then exit.
+Display the current version of mes%, and then exit.
 
 @end table
 
@@ -743,7 +787,7 @@ Display the current version of Mes, and then exit.
 * Environment Variables::       If the bits won't change, change their habitat.
 @end menu
 
-@node Environment Variables
+@node Environment Variables,  , Invoking mes, Invoking mes
 @subsection Environment Variables
 @cindex environment variables
 @cindex shell
@@ -752,13 +796,13 @@ Display the current version of Mes, and then exit.
 @c Hmm, I expected this paragraph in the Guix manual?
 Here are the environment variables (see @pxref{Environment Variables,,,
 guile, Guile Reference}) that affect the run-time behavior of
-Mes:
+mes:
 
 @table @env
 @item MES_BOOT
 @vindex MES_BOOT
 
-Set @env{MES_BOOT} to change the initial Scheme program that Mes runs.
+Set @env{MES_BOOT} to change the initial Scheme program that mes runs.
 
 @item MES_ARENA
 @vindex MES_ARENA
@@ -821,8 +865,8 @@ Mes uses @var{@strong{GUILE}_LOAD_PATH} for compatibility with Guile.
 
 @end table
 
-@node Invoking MesCC
-@section Invoking MesCC
+@node Invoking mescc, Invoking mesar, Invoking mes, Bootstrapping
+@section Invoking mescc
 
 @example
 mescc @var{option}@dots{} @file{FILE}@dots{}
@@ -902,14 +946,14 @@ specify LANGUAGE of the following input files
 * MesCC Environment Variables::  There's no NIX like POSIX.
 @end menu
 
-@node MesCC Environment Variables
+@node MesCC Environment Variables,  , Invoking mescc, Invoking mescc
 @subsection MesCC Environment Variables
 
 @table @env
 @item MES
 @vindex MES
 
-Setting @env{MES} to a mes-compatible Scheme will run MesCC using that
+Setting @env{MES} to a mes-compatible Scheme will run mescc using that
 @example
 MES=guile mescc -c scaffold/main.c
 @end example
@@ -931,7 +975,7 @@ during the parsing phase.
 
 @end table
 
-@node Invoking mesar
+@node Invoking mesar,  , Invoking mescc, Bootstrapping
 @section Invoking mesar
 
 @example
@@ -961,7 +1005,7 @@ display version and exit
 @end table
 
 @c *********************************************************************
-@node Contributing
+@node Contributing, Acknowledgments, Bootstrapping, Top
 @chapter Contributing
 
 @menu
@@ -973,7 +1017,7 @@ display version and exit
 * Submitting Patches::          Share your work.
 @end menu
 
-@node Building from Git
+@node Building from Git, Running Mes From the Source Tree, Contributing, Contributing
 @section Building from Git
 
 If you want to hack GNU Mes itself, it is recommended to use the latest
@@ -997,7 +1041,7 @@ Finally, you have to invoke @code{make check} to run tests
 installation instructions (@pxref{Installation}) or send a message to
 the @email{bug-mes@@gnu.org} mailing list.
 
-@node Running Mes From the Source Tree
+@node Running Mes From the Source Tree, Porting GNU Mes, Building from Git, Contributing
 @section Running Mes From the Source Tree
 
 First, you need to have an environment with all the dependencies
@@ -1005,7 +1049,7 @@ available (@pxref{Building from Git}), and then simply prefix each
 command by @command{./pre-inst-env} (the @file{pre-inst-env} script
 lives in the top build tree of Mes).
 
-@node Porting GNU Mes
+@node Porting GNU Mes, The Perfect Setup, Running Mes From the Source Tree, Contributing
 @section Porting GNU Mes
 
 Mes was written for x86-linux.  A 64 bit (x86_64) is almost done, only a
@@ -1017,13 +1061,13 @@ An ARM (armv4/armv7l) linux port is underway.  A port to GNU/Hurd
 
 Initial scaffold, built by @file{build-aux/build-scaffold.sh}:
 @example
-  @file{lib/x86-mes-gcc/exit-42.S}
-  @file{lib/x86-mes/elf32-0exit-42.hex2}
-  @file{lib/x86-mes/elf32-body-exit-42.hex2}
+  @file{lib/linux/x86-mes-gcc/exit-42.S}
+  @file{lib/linux/x86-mes/elf32-0exit-42.hex2}
+  @file{lib/linux/x86-mes/elf32-body-exit-42.hex2}
 
-  @file{lib/x86-mes-gcc/hello-mes.S}
-  @file{lib/x86-mes/elf32-0hello-mes.hex2}
-  @file{lib/x86-mes/elf32-body-hello-mes.hex2}
+  @file{lib/linux/x86-mes-gcc/hello-mes.S}
+  @file{lib/linux/x86-mes/elf32-0hello-mes.hex2}
+  @file{lib/linux/x86-mes/elf32-body-hello-mes.hex2}
 @end example
 
 Porting MesCC:
@@ -1038,7 +1082,7 @@ Porting MesCC:
   @file{mes/module/mescc/i386/info.mes}
 @end example
 
-@node The Perfect Setup
+@node The Perfect Setup, Coding Style, Porting GNU Mes, Contributing
 @section The Perfect Setup
 
 The Perfect Setup to hack on Mes is basically the perfect setup used
@@ -1053,7 +1097,7 @@ on-line documentation (docstrings), context-sensitive completion,
 @kbd{M-.} to jump to an object definition, a REPL to try out your code,
 and more (@pxref{Introduction,,, geiser, Geiser User Manual}).
 
-@node Coding Style
+@node Coding Style, Submitting Patches, The Perfect Setup, Contributing
 @section Coding Style
 
 In general our code follows the GNU Coding Standards (@pxref{Top,,,
@@ -1089,7 +1133,7 @@ Additionally, in Mes we prefer to format @code{if} statements like this
       else))
 @end example
 
-@node Submitting Patches
+@node Submitting Patches,  , Coding Style, Contributing
 @section Submitting Patches
 
 Development is done using the Git distributed version control system.
@@ -1139,7 +1183,7 @@ Join us on @code{#bootstrappable} on the Freenode IRC network or on
 Please send bug reports with full details to @email{bug-mes@@gnu.org}.
 
 @c *********************************************************************
-@node Acknowledgments
+@node Acknowledgments, Resources, Contributing, Top
 @chapter Acknowledgments
 
 We would like to thank the following people for their help: Jeremiah
@@ -1151,7 +1195,7 @@ LISP-1.5 and Alan Kay for their inspiring comment on
 @url{https://queue.acm.org/detail.cfm?id=1039523, Page 13}.
 
 @c *********************************************************************
-@node Resources
+@node Resources, GNU Free Documentation License, Acknowledgments, Top
 @chapter Resources
 
 @itemize
@@ -1185,17 +1229,17 @@ at the freenode IRC network.
 @end itemize
 
 @c *********************************************************************
-@node GNU Free Documentation License
+@node GNU Free Documentation License, Concept Index, Resources, Top
 @appendix GNU Free Documentation License
 @cindex license, GNU Free Documentation License
 @include fdl-1.3.texi
 
 @c *********************************************************************
-@node Concept Index
+@node Concept Index, Programming Index, GNU Free Documentation License, Top
 @unnumbered Concept Index
 @printindex cp
 
-@node Programming Index
+@node Programming Index,  , Concept Index, Top
 @unnumbered Programming Index
 @syncodeindex tp fn
 @syncodeindex vr fn
index 4ac698012d7687e42585ac16416dabdb9e727e5e..fb861b8835cc40ad52caa242d833d85e9a931da4 100644 (file)
@@ -122,7 +122,7 @@ extensive examples, including parsers for the Javascript and C99 languages.")
 
 (define-public mes
   (let ((triplet "i686-unknown-linux-gnu")
-        (version "0.21"))
+        (version "0.22"))
     (package
       (name "mes")
       (version version)
@@ -138,8 +138,7 @@ extensive examples, including parsers for the Javascript and C99 languages.")
        `(("mescc-tools" ,mescc-tools)
          ("nyacc" ,nyacc)))
       (native-inputs
-       `(("git" ,git)
-         ("guile" ,guile-2.2)
+       `(("guile" ,guile-2.2)
          ,@(if (string-prefix? "x86_64-linux" (or (%current-target-system)
                                                   (%current-system)))
                ;; Use cross-compiler rather than #:system "i686-linux" to get
@@ -164,7 +163,7 @@ Guile.")
       (license gpl3+))))
 
 (define-public mes.git
- (let ((version "0.21")
+ (let ((version "0.22")
         (revision "0")
         (commit (read-string (open-pipe "git show HEAD | head -1 | cut -d ' ' -f 2" OPEN_READ))))
     (package
index 685c7e10c3ba4dfb34c4afdc8e1adbc8dfa25856..4664e7e4f2ea77a3c7f2db04eb22a4127685d6a2 100644 (file)
 
 #else // ! SYSTEM_LIBC
 
-#ifndef libc_hidden_def
-#define libc_hidden_def(x)
-#define weak_alias(x,y)
-#endif
+#include <mes/lib-mini.h>
 
 size_t __argz_count (char const *argz, size_t len);
 void __argz_extract (char const *argz, size_t len, char **argv);
+size_t __argz_extract_count (char const *argz, size_t len, char **argv);
 
 #endif // ! SYSTEM_LIBC
 
index f29d56acccd03d9e11bf24fbbf437b097eb0ee76..bfb870df102b872b4f1decea3e567345367b5b30 100644 (file)
@@ -30,6 +30,7 @@
 #else // ! SYSTEM_LIBC
 
 // *INDENT-OFF*
+#if __linux__
 #define O_RDONLY          0
 #define O_WRONLY          1
 #define O_RDWR            2
 #define O_TRUNC       0x200
 #define O_APPEND      0x400
 #define O_DIRECTORY 0x10000
+#elif __GNU__
+#define        O_RDONLY          1
+#define        O_WRONLY          2
+#define        O_RDWR            3
+#define        O_CREAT        0x10
+#define        O_APPEND      0x100
+#define        O_TRUNC     0x10000
+#else
+#error platform not supported
+#endif
 // *INDENT-ON*
 
 #define FD_CLOEXEC 1
diff --git a/include/gnu/hurd-types.h b/include/gnu/hurd-types.h
new file mode 100644 (file)
index 0000000..a156b64
--- /dev/null
@@ -0,0 +1,393 @@
+/* C declarations for Hurd server interfaces
+   Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2001, 2002,
+   2010 Free Software Foundation, Inc.
+
+This file is part of the GNU Hurd.
+
+The GNU Hurd is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+The GNU Hurd is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with the GNU Hurd; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifndef _HURD_TYPES_H
+#define _HURD_TYPES_H
+
+#ifndef _FILE_OFFSET_BITS
+#define _FILE_OFFSET_BITS 32
+#endif
+
+#include <time.h>              /* For struct timespec.  */
+#include <mach/std_types.h>    /* For mach_port_t et al. */
+#include <mach/message.h>      /* For mach_msg_id_t et al. */
+#include <sys/types.h>         /* For pid_t and uid_t.  */
+
+/* A string identifying this release of the GNU Hurd.  Our
+   interpretation of the term "release" is that it refers to a set of
+   server interface definitions.  A "version" in Posix terminology is
+   a distribution of the Hurd; there may be more than one distribution
+   without changing the release number.  */
+#define HURD_RELEASE "0.0"
+
+\f
+/*   Simple type declarations   */
+
+/* These types identify certain kinds of ports used by the Hurd. */
+typedef mach_port_t file_t;
+typedef mach_port_t fsys_t;
+typedef mach_port_t io_t;
+typedef mach_port_t process_t;
+typedef mach_port_t auth_t;
+typedef mach_port_t socket_t;
+typedef mach_port_t pf_t;      /* Protocol family */
+typedef mach_port_t addr_port_t;
+typedef mach_port_t startup_t;
+typedef mach_port_t fs_notify_t;
+typedef mach_port_t exec_startup_t;
+typedef mach_port_t interrupt_t;
+typedef mach_port_t proccoll_t;
+typedef mach_port_t ctty_t;
+
+#include <errno.h>             /* Defines `error_t'.  */
+
+/* These names exist only because of MiG deficiencies.
+   You should not use them in C source; use the normal C types instead.  */
+typedef char *data_t;
+typedef const char *const_data_t;
+typedef char string_t [1024];
+typedef int *intarray_t;
+typedef const int *const_intarray_t;
+typedef int *fd_mask_t;
+typedef const int *const_fd_mask_t;
+typedef mach_port_t *portarray_t;
+typedef const mach_port_t *const_portarray_t;
+typedef pid_t *pidarray_t;
+typedef const pid_t *const_pidarray_t;
+typedef uid_t *idarray_t;
+typedef const uid_t *const_idarray_t;
+#if 0
+typedef __loff_t *off_array_t;
+typedef const __loff_t *const_off_array_t;
+#endif
+typedef struct rusage rusage_t;
+typedef struct flock flock_t;
+typedef struct utsname utsname_t;
+#if _FILE_OFFSET_BITS == 64
+typedef struct stat io_statbuf_t;
+typedef struct statfs fsys_statfsbuf_t;
+#else
+typedef struct stat64 io_statbuf_t;
+typedef struct statfs64 fsys_statfsbuf_t;
+#endif
+typedef struct timespec timespec_t;
+
+\f
+/*   Parameters and flags in RPC calls   */
+
+/* Many such parameters and flags are also defined in various libc
+   headers. */
+
+/* Bits for flags in fs.defs:file_exec_paths and exec.defs:exec_* calls: */
+#define EXEC_NEWTASK   0x00000001 /* Create new task; kill old one.  */
+#define EXEC_SECURE    0x00000002 /* Use secure values of portarray, etc. */
+#define EXEC_DEFAULTS  0x00000004 /* Use defaults for unspecified ports.  */
+#define EXEC_SIGTRAP   0x00000008 /* Simulate SIGTRAP on startup.  */
+/* This flag is passed through by the exec server but not examined by it.  */
+#define        EXEC_STACK_ARGS 0x00000010 /* Use arguments from stack, not RPC.  */
+
+/* Bits for flags in fs.defs:file_set_translator call: */
+#define FS_TRANS_FORCE     0x00000001 /* Must use translator(no sht circuit) */
+#define FS_TRANS_EXCL      0x00000002 /* Don't do it if already translated.  */
+#define FS_TRANS_SET      0x00000004 /* Set or clear translator */
+#define FS_TRANS_ORPHAN    0x00000008 /* Orphan the active translator.  */
+
+/* Values for retry field in fs.defs:dir_lookup call: */
+enum retry_type
+{
+  FS_RETRY_NORMAL = 1,         /* Retry normally if retry_name is not null. */
+  FS_RETRY_REAUTH = 2,         /* Retry after reauthenticating retry port.
+                                  Even if the retry name is null, a retry
+                                  is still necessary with this code after the
+                                  reauthentication is complete. */
+  FS_RETRY_MAGICAL = 3,                /* Retry string is magical.  */
+  /* "tty" means controlling tty;
+
+     "fd/%u" means file descriptor N;
+
+     "machtype/..." means replace `machtype' with the numbers in decimal
+                   returned by the user's kernel as the cpu_type (N) and
+                   cpu_subtype (M) (producing N/M/...) and then retry
+                   as for FS_RETRY_NORMAL.
+
+     "/..." means retry "...", but starting from the users root directory.
+
+     "pid/..." means replace `pid' with the PID of the current process in %u
+               format and then retry as for FS_RETRY_NORMAL.
+     */
+};
+typedef enum retry_type retry_type;
+
+/* Types for fs_notify.defs:dir_changed call: */
+enum dir_changed_type
+{
+  DIR_CHANGED_NULL,            /* Always sent first for sync.  */
+  DIR_CHANGED_NEW,             /* Specified name has been added.  */
+  DIR_CHANGED_UNLINK,          /* Specified name has been removed.  */
+  DIR_CHANGED_RENUMBER,                /* Name has been the target of rename.  */
+};
+typedef enum dir_changed_type dir_changed_type_t;
+
+/* Types for fs_notify.defs:file_changed call: */
+enum file_changed_type
+{
+  FILE_CHANGED_NULL,           /* Always sent first for sync.  */
+  FILE_CHANGED_WRITE,          /* File data has been written.  */
+  FILE_CHANGED_EXTEND,         /* File has grown.  */
+  FILE_CHANGED_TRUNCATE,       /* File has been truncated.  */
+  FILE_CHANGED_META,           /* Stat information has changed, and none
+                                  of the previous three apply.  Not sent
+                                  for changes in node times.  */
+};
+typedef enum file_changed_type file_changed_type_t;
+
+/* Select types for io.defs:io_select call: */
+#define SELECT_READ  0x00000001
+#define SELECT_WRITE 0x00000002
+#define SELECT_URG   0x00000004
+
+/* Flags for fsys.defs:fsys_goaway.  Also, these flags are sent as the
+   oldtrans_flags in fs.defs:file_set_translator to describe how to
+   terminate the old translator. */
+#define FSYS_GOAWAY_NOWAIT    0x00000001 /* Return immediately.  */
+#define FSYS_GOAWAY_NOSYNC    0x00000002 /* Don't update physical media.  */
+#define FSYS_GOAWAY_FORCE     0x00000004 /* Go away despite current users.  */
+#define FSYS_GOAWAY_UNLINK    0x00000008 /* Go away only if non-directory.  */
+#define FSYS_GOAWAY_RECURSE   0x00000010 /* Shutdown children too.  */
+
+/* Types of ports the terminal driver can run on top of;
+   used in term.defs:term_get_bottom_type.  */
+enum term_bottom_type
+{
+ TERM_ON_MACHDEV,
+ TERM_ON_HURDIO,
+ TERM_ON_MASTERPTY,
+};
+\f
+/* Types of storage, as returned by file_get_storage_info.
+
+   STORAGE_DEVICE is a mach device_t (for random access devices)
+   STORAGE_HURD_FILE is a hurd file_t (as if a file were mapped)
+   STORAGE_TASK is a task_t (the storage is in the vm of the task)
+   STORAGE_MEMORY is a memory object port
+   STORAGE_ZERO is a fixed-size constant source of zeros
+   STORAGE_INTERLEAVE is a set of other storage types interleaved at a fixed
+    interval
+   STORAGE_CONCAT is a set of other storage types concatenated end-to-end
+   STORAGE_LAYER is a set of storage types, representing the same address
+     range; all will be written too, and will be read in turn until one
+     succeeds
+   STORAGE_REMAP is a layer on top of another store that remaps its blocks
+   STORAGE_COPY is a memory snapshot of another store
+   STORAGE_NETWORK means that the file is stored elsewhere on the
+     network; all the remaining fields contan type-specific information.
+   STORAGE_OTHER means none of these apply; and should be used when no
+     meaningful answer can be given
+
+   The vectors returned by file_get_storage_info encode each of the above
+   (note that the first int is always the storage type).  There are four:
+   ports, ints, offsets (off_t), and data (char); each type of store uses the
+   following entries in each vector:
+
+    -type-  -ports-  -ints-                 -offsets-         -data-    -kids-
+    device  DEVICE   TY, FL, BS, NR, NL, ML  NR * (OFFS, LEN)  NL + ML   -
+    file    FILE     TY, FL, BS, NR, NL, ML  NR * (OFFS, LEN)  NL + ML   -
+    memory  MEMOBJ   TY, FL, BS, NR, NL, ML  NR * (OFFS, LEN)  NL + ML   -
+    task    TASK     TY, FL, BS, NR, NL, ML  NR * (OFFS, LEN)  NL + ML   -
+      (the data for the above is a name (incl '\0') and a misc data block)
+    null    -       TY, FL                  SIZE              -         -
+      (BS is 1)
+    ileave  -       TY, FL, IL, NC          -                 -         NC
+      (BS is the LCM of its children; SIZE is the minimum of theirs * IL)
+    concat  -       TY, FL, NC              -                 -         NC
+      (BS is the LCM of its children; SIZE is the sum of theirs)
+    layer   -       TY, FL, NC              -                 -         NC
+      (BS is the LCM of its children; SIZE is the minimum of theirs)
+    remap  -        TY, FL, NR              NR * (OFFS, LEN)  -         1
+      (BS and SIZE are that of the child)
+    copy   -         TY, FL, SIZE           -                 DATA      -
+      (DATA is preceded by padding to the next page boundary, and is
+       SIZE bytes long itself)
+
+  For ileave, concat, and layer, the children are encoded following the parent.
+  The first int must always be TY.
+
+  key: TY = type code, FL = flags, BS = block size, NR = num runs,
+       NL = name len, ML = misc len, NC = num children,
+       IL = interleave (bytes), SIZE = Size of storage (blocks),
+       LEN = run length (blocks), OFFS = run offset (blocks),
+
+  The NR * (OFFS, LEN) offsets for some of the types is the set of block
+  ranges in the underlying address space that, concatenated, make up the
+  contents of the storage -- for instance, doing file_get_storage_info on a
+  file may return storage of type STORAGE_DEVICE, and the accompanying block
+  ranges are the set of blocks on the given device that correspond to that
+  file.  Any OFFS == -1 designates a hole in the address range.  Note that
+  the total size (SIZE) for these types is the sum of their LEN's.
+
+  The optional NAME returned by some types (if NL != 0) is a type specific
+  name for the same object referenced by the port also returned.  E.g.:
+    device -- The mach device name
+    file   -- The file name (unreliable, as the root may not be the same)
+    task   -- The pid
+  Unless it is MACH_PORT_NULL, the port should generally be used instead of
+  trying to regenerate it from the associated name, which is intended more for
+  printing messages, etc.  */
+enum file_storage_class
+{
+  STORAGE_OTHER,
+  STORAGE_DEVICE,
+  STORAGE_HURD_FILE,
+  STORAGE_NETWORK,
+  STORAGE_MEMORY,
+  STORAGE_TASK,
+  STORAGE_ZERO,
+  STORAGE_CONCAT,
+  STORAGE_INTERLEAVE,
+  STORAGE_LAYER,
+  STORAGE_REMAP,
+  STORAGE_COPY,
+};
+
+/* Flags for the flags word returned by some types . */
+#define STORAGE_MUTATED   0x00000001 /* data as stored is munged from file */
+\f
+/*   Data types   */
+
+#include <mach/task_info.h>
+#include <mach/thread_info.h>
+#ifndef THREAD_SCHED_INFO
+#include <mach/policy.h>
+#endif
+
+/* Flags sent in proc_getprocinfo request. */
+#define PI_FETCH_TASKINFO      0x0001
+#define PI_FETCH_TASKEVENTS    0x0020
+#define PI_FETCH_THREADS       0x0002
+#define PI_FETCH_THREAD_BASIC  0x0004
+#define PI_FETCH_THREAD_SCHED  0x0008
+#define PI_FETCH_THREAD_WAITS  0x0010
+
+struct procinfo
+{
+  int state;
+  uid_t owner;
+  pid_t ppid;
+  pid_t pgrp;
+  pid_t session;
+  pid_t logincollection;
+  int exitstatus;
+  int sigcode;
+
+  int nthreads;                        /* size of pi_threadinfos */
+
+  struct task_basic_info taskinfo;
+  struct task_events_info taskevents;
+#ifdef TASK_SCHED_TIMESHARE_INFO
+  struct policy_timeshare_base timeshare_base_info;
+#endif
+  struct
+    {
+      int died;                        /* this thread died in the middle of call */
+      mach_msg_id_t rpc_block; /* thread is blocked on this RPC */
+      struct thread_basic_info pis_bi;
+#ifdef THREAD_SCHED_INFO
+      struct thread_sched_info pis_si;
+#else
+      struct policy_infos pis_pi;
+#endif
+    } threadinfos[0];
+};
+typedef int *procinfo_t;
+typedef const int *const_procinfo_t;
+
+/* Bits in struct procinfo  state: */
+#define PI_STOPPED 0x00000001  /* Proc server thinks is stopped.  */
+#define PI_EXECED  0x00000002  /* Has called proc_exec.  */
+#define PI_WAITING 0x00000004  /* Process is waiting for child to exit */
+#define PI_ORPHAN  0x00000008  /* Process group is orphaned.  */
+#define PI_NOMSG   0x00000010  /* Process has no message port.  */
+#define PI_SESSLD  0x00000020  /* Session leader.  */
+#define PI_NOTOWNED 0x0000040  /* Process has no owner.  */
+#define PI_NOPARENT 0x0000080  /* Hasn't identified a parent.  */
+#define PI_ZOMBIE  0x00000100  /* Has no associated task.  */
+#define PI_TRACED  0x00000200  /* Process is being traced */
+#define PI_GETMSG  0x00000400  /* Process is blocked in proc_getmsgport. */
+#define PI_LOGINLD 0x00000800  /* Process is leader of login collection */
+
+\f
+/*   Conventions   */
+
+
+/* st_fstype in struct stat and fsys_stb_type in fsys_statfsbuf is one of: */
+#define FSTYPE_UFS     0x00000000 /* 4.x BSD Fast File System */
+#define FSTYPE_NFS     0x00000001 /* Network File System ala Sun */
+#define FSTYPE_GFS     0x00000002 /* GNU file system */
+#define FSTYPE_LFS     0x00000003 /* Logging File System ala Sprite */
+#define FSTYPE_SYSV    0x00000004 /* Old U*x filesystem ala System V */
+#define FSTYPE_FTP     0x00000005 /* Transparent FTP */
+#define FSTYPE_TAR     0x00000006 /* Transparent TAR */
+#define FSTYPE_AR      0x00000007 /* Transparent AR */
+#define FSTYPE_CPIO    0x00000008 /* Transparent CPIO */
+#define FSTYPE_MSLOSS  0x00000009 /* MS-DOS */
+#define FSTYPE_CPM     0x0000000a /* CP/M */
+#define FSTYPE_HFS     0x0000000b /* Don't ask */
+#define FSTYPE_DTFS    0x0000000c /* used by desktop to provide more info */
+#define FSTYPE_GRFS    0x0000000d /* GNU Remote File System */
+#define FSTYPE_TERM    0x0000000e /* GNU Terminal driver */
+#define FSTYPE_DEV     0x0000000f /* GNU Special file server */
+#define FSTYPE_PROC    0x00000010 /* /proc filesystem ala Version 9 */
+#define FSTYPE_IFSOCK  0x00000011 /* PF_LOCAL socket naming point */
+#define FSTYPE_AFS     0x00000012 /* Andrew File System 3.xx */
+#define FSTYPE_DFS     0x00000013 /* Distributed File Sys (OSF) == AFS 4.xx */
+#define FSTYPE_PROC9   0x00000014 /* /proc filesystem ala Plan 9 */
+#define FSTYPE_SOCKET  0x00000015 /* io_t that isn't a file but a socket */
+#define FSTYPE_MISC    0x00000016 /* generic trivfs server */
+#define FSTYPE_EXT2FS  0x00000017 /* Linux filesystem by Remy Card */
+#define FSTYPE_HTTP    0x00000018 /* Transparent HTTP */
+#define FSTYPE_MEMFS   0x00000019 /* In-core filesystem */
+#define FSTYPE_ISO9660 0x0000001a /* ISO9660 */
+
+/* Standard port assignments for file_exec_paths and exec_* */
+enum
+  {
+    INIT_PORT_CWDIR,
+    INIT_PORT_CRDIR,
+    INIT_PORT_AUTH,
+    INIT_PORT_PROC,
+    INIT_PORT_CTTYID,
+    /* If MACH_PORT_NULL is given for the bootstrap port,
+       the bootstrap port of the old task is used.  */
+    INIT_PORT_BOOTSTRAP,
+    INIT_PORT_MAX
+  };
+
+/* Standard ints for file_exec_paths and exec_* */
+enum
+  {
+    INIT_UMASK,
+    INIT_SIGMASK,
+    INIT_SIGIGN,
+    INIT_SIGPENDING,
+    INIT_TRACEMASK,
+    INIT_INT_MAX,
+  };
+
+#endif // _HURD_TYPES_H
diff --git a/include/gnu/hurd.h b/include/gnu/hurd.h
new file mode 100644 (file)
index 0000000..0d6a23f
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __MES_GNU_HURD_H
+#define __MES_GNU_HURD_H
+
+#define _GNU_SOURCE 1
+#define __USE_GNU 1
+
+#include <errno.h>
+#include <sys/types.h>
+
+#ifndef _BITS_TYPES_H
+#ifndef _LOFF_T
+#define _LOFF_T
+typedef off64_t loff_t;
+#endif
+#endif
+
+#include <mach/mach_types.h>
+#include <mach/message.h>
+#include <mach/port.h>
+
+struct hurd_startup_data
+  {
+    int flags;
+
+    mach_port_t *dtable;
+    mach_msg_type_number_t dtable_count;
+
+    char *argp;
+    int arg_size;
+
+    char *envp;
+    int env_size;
+
+    mach_port_t *portarray;
+    mach_msg_type_number_t portarray_count;
+
+    int *intarray;
+    mach_msg_type_number_t intarray_count;
+
+    vm_address_t stack_base;
+    vm_size_t stack_count;
+
+    vm_address_t phdr;
+    vm_size_t phdr_count;
+
+    vm_address_t user_entry;
+  };
+
+#define _HURD_DTABLE_MAX 1024
+extern mach_port_t _hurd_dtable[_HURD_DTABLE_MAX];
+extern int _hurd_dtable_count;
+extern struct hurd_startup_data _hurd_startup_data;
+
+#define _HURD_ARGV_MAX 1000
+#define _HURD_ENVV_MAX 1000
+extern size_t __argc;
+extern char *__argv[_HURD_ARGV_MAX];
+extern char *__envv[_HURD_ENVV_MAX];
+
+mach_port_t fd_get (int filedes);
+error_t fd_write (mach_port_t port, void const *buffer, size_t *size, loff_t offset);
+error_t fd_read (mach_port_t port, void *buffer, size_t *size, loff_t offset);
+
+#endif // __MES_GNU_HURD_H
diff --git a/include/gnu/syscall.h b/include/gnu/syscall.h
new file mode 100644 (file)
index 0000000..8d20f9d
--- /dev/null
@@ -0,0 +1,144 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __MES_GNU_SYSCALL_H
+#define __MES_GNU_SYSCALL_H
+
+#define _GNU_SOURCE 1
+#define __USE_GNU 1
+
+#include <mach/mach_types.h>
+#include <mach/port.h>
+#include <mach/message.h>
+#include <gnu/hurd.h>
+#include <gnu/hurd-types.h>
+
+// mach/mach.defs
+enum
+  {
+   SYS__task_terminate = 2008,
+   SYS__vm_allocate = 2021,
+   SYS__vm_statistics = 2030,
+   SYS__task_get_special_port = 2058,
+  };
+
+// hurd/fsys.defs
+enum
+  {
+   SYS__dir_lookup = 20018,
+  };
+
+// hurd/io.defs
+enum
+  {
+   SYS__io_write = 21000,
+   SYS__io_read,
+  };
+
+// hurd/process.defs
+enum
+  {
+   SYS__proc_mark_exit = 24025,
+  };
+
+// hurd/startup.defs
+enum
+  {
+   SYS__exec_startup_get_info = 30500,
+  };
+
+extern mach_msg_type_t mach_msg_type_int32;
+extern mach_msg_type_t mach_msg_type_int64;
+extern mach_msg_type_long_t mach_msg_type_pointer;
+
+struct mach_msg
+{
+  mach_msg_header_t header;
+};
+
+struct mach_msg_1
+{
+  mach_msg_header_t header;
+  mach_msg_type_t type_one; int one;
+};
+
+struct mach_msg_2
+{
+  mach_msg_header_t header;
+  mach_msg_type_t type_one; int one;
+  mach_msg_type_t type_two; int two;
+};
+
+struct mach_msg_loff_int
+{
+  mach_msg_header_t header;
+  mach_msg_type_t type_one; loff_t one;
+  mach_msg_type_t type_two; int two;
+};
+
+struct mach_msg_startup_info
+{
+  mach_msg_header_t header;
+  mach_msg_type_t RetCodeType;
+  kern_return_t RetCode;
+  mach_msg_type_t user_entryType;
+  vm_address_t user_entry;
+  mach_msg_type_t phdrType;
+  vm_address_t phdr;
+  mach_msg_type_t phdr_sizeType;
+  vm_size_t phdr_size;
+  mach_msg_type_t stack_baseType;
+  vm_address_t stack_base;
+  mach_msg_type_t stack_sizeType;
+  vm_size_t stack_size;
+  mach_msg_type_t flagsType;
+  int flags;
+  mach_msg_type_long_t argvType;
+  char *argv;
+  mach_msg_type_long_t envpType;
+  char *envp;
+  mach_msg_type_long_t dtableType;
+  mach_port_t *dtable;
+  mach_msg_type_long_t portarrayType;
+  mach_port_t *portarray;
+  mach_msg_type_long_t intarrayType;
+  int *intarray;
+};
+
+kern_return_t __syscall (mach_port_t port, int sys_call);
+kern_return_t __syscall2 (mach_port_t port, int sys_call, int one, int two);
+kern_return_t __syscall_get (mach_port_t port, int sys_call, mach_msg_header_t *message, size_t size);
+kern_return_t __syscall_put (mach_port_t port, int sys_call, mach_msg_header_t *message, size_t size);
+
+// mach.defs
+kern_return_t __task_terminate (mach_port_t task);
+kern_return_t __task_get_special_port (mach_port_t task, int which, mach_port_t *port);
+kern_return_t __vm_allocate (mach_port_t task, vm_address_t *address, vm_size_t size, boolean_t anywhere);
+kern_return_t __vm_statistics (mach_port_t task, vm_statistics_data_t *vm_stats);
+
+// process.defs
+kern_return_t __proc_mark_exit (mach_port_t process, int one, int two);
+kern_return_t __exec_startup_get_data (mach_port_t bootstrap, struct hurd_startup_data *data);
+
+// io.c
+kern_return_t __io_write (io_t io_object, data_t data, mach_msg_type_number_t size, loff_t offset, vm_size_t *wrote);
+kern_return_t __io_read (io_t io, data_t *data, mach_msg_type_number_t *read, loff_t offset, vm_size_t size);
+
+#endif // __MES_GNU_SYSCALL_H
diff --git a/include/mach/mach-init.h b/include/mach/mach-init.h
new file mode 100644 (file)
index 0000000..02916a7
--- /dev/null
@@ -0,0 +1,50 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 1993-2016 Free Software Foundation, Inc.
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** Commentary:
+    Taken from GNU C Library
+    Declarations and macros for the basic Mach things set at startup.
+ */
+
+#ifndef        _MACH_INIT_H
+
+#define        _MACH_INIT_H    1
+
+#include <mach/mach_types.h>
+
+/* Return the current task's task port.  */
+extern mach_port_t mach_task_self (void);
+extern mach_port_t mach_host_self (void);
+
+/* Kernel page size.  */
+extern vm_size_t __vm_page_size;
+extern vm_size_t vm_page_size;
+
+/* Round the address X up to a page boundary.  */
+#define round_page(x)  \
+  ((((vm_offset_t) (x) + __vm_page_size - 1) / __vm_page_size) * \
+   __vm_page_size)
+
+/* Truncate the address X down to a page boundary.  */
+#define trunc_page(x)  \
+  ((((vm_offset_t) (x)) / __vm_page_size) * __vm_page_size)
+
+#endif /* mach_init.h */
index 37d58a968cd39d7eec289110c5c2419b0f90e490..4cff86fc2fdeb823029f5d3e1fdf01fddbf10ecf 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.
  *
@@ -31,6 +31,7 @@ typedef int pid_t;
 #endif
 
 #define        WNOHANG 1
+#define W_EXITCODE(status, signal) ((status) << 8 | (signal))
 
 pid_t waitpid (pid_t pid, int *status_ptr, int options);
 pid_t wait (int *status_ptr);
diff --git a/lib/freebsd/x86-mes-gcc/crt1.c b/lib/freebsd/x86-mes-gcc/crt1.c
new file mode 100644 (file)
index 0000000..a599804
--- /dev/null
@@ -0,0 +1,76 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <mes/lib-mini.h>
+//int main (int argc, char *argv[], char *envp[]);
+
+// *INDENT-OFF*
+void
+_start ()
+{
+  asm (
+       "mov    $0,%%eax\n\t"
+       "mov    %%eax,%0\n"
+       : "=r" (__stdin)
+       : //no inputs ""
+       );
+
+  asm (
+       "mov    $1,%%eax\n\t"
+       "mov    %%eax,%0\n"
+       : "=r" (__stdout)
+       : //no inputs ""
+       );
+
+  asm (
+       "mov    $2,%%eax\n\t"
+       "mov    %%eax,%0\n"
+       : "=r" (__stderr)
+       : //no inputs ""
+       );
+  asm (
+       "mov     %%ebp,%%eax\n\t"
+       "add     $4,%%eax\n\t"
+       "movzbl  (%%eax),%%eax\n\t"
+       "add     $3,%%eax\n\t"
+       "shl     $2,%%eax\n\t"
+       "add     %%ebp,%%eax\n\t"
+       "mov     %%eax,%0\n\t"
+       "push    %%eax\n\t"
+       : "=r" (environ)
+       : //no inputs ""
+       );
+  asm (
+       "mov     %ebp,%eax\n\t"
+       "add     $8,%eax\n\t"
+       "push    %eax\n\t"
+
+       "mov     %ebp,%eax\n\t"
+       "add     $4,%eax\n\t"
+       "movzbl  (%eax),%eax\n\t"
+       "push    %eax\n\t"
+
+       "call    main\n\t"
+
+       "push    %eax\n\t"
+       "call    _exit\n\t"
+       "hlt     \n\t"
+       );
+}
diff --git a/lib/freebsd/x86-mes-gcc/exit-42.S b/lib/freebsd/x86-mes-gcc/exit-42.S
new file mode 100644 (file)
index 0000000..503186d
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** Commentary: */
+
+/* Using gdb, esp. GUD in GNU Emacs is recommended
+M-x gdb-display-disassembly-buffer
+M-x gdb-display-io-buffer
+set disassemble-next-line on
+break _start
+run
+info registers
+si
+p/x $eax
+RET
+...
+*/
+
+/** Code: */
+
+SYS_exit = 1                   /* FreeBSD syscall: exit.  */
+       .globl _start           /* Magic linker symbol: --entry-address.  */
+
+       .text                   /* Program text. */
+_start:
+       mov     $SYS_exit,%eax  /* System call function: exit, in %eax.  */
+       push    $42             /* Push first parameter: exit status. */
+       push    $00             /* Push ??. */
+       int     $0x80           /* Call system.  */
+       hlt                     /* Should not be reached.  */
diff --git a/lib/freebsd/x86-mes-gcc/hello-mes.S b/lib/freebsd/x86-mes-gcc/hello-mes.S
new file mode 100644 (file)
index 0000000..154babe
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** Commentary: */
+
+/* Using gdb, esp. GUD in GNU Emacs is recommended
+M-x gdb-display-disassembly-buffer
+M-x gdb-display-io-buffer
+set disassemble-next-line on
+break _start
+run
+info registers
+si
+p/x $eax
+RET
+...
+*/
+
+/** Code: */
+
+SYS_exit       = 1             /* Linux syscalls.  */
+SYS_write      = 4
+stdout         = 1             /* File discriptor */
+       .globl _start           /* Magic linker symbol: --entry-address.  */
+
+       .text                   /* Program text. */
+_start:
+       mov     $SYS_write,%eax /* System call function: write, in %eax.  */
+       push    $(bye-hello)    /* 3rd parameter: byte count. */
+       push    $hello          /* 2nd parameter: address. */
+       push    $stdout         /* 1st parameter: file descriptor. */
+       push    $0              /* ?? */
+       int     $0x80           /* Call system.  */
+
+       mov     $SYS_exit,%eax  /* System call function: exit, in %eax.  */
+       push    $0              /* 1st parameter: exit status. */
+       push    $0              /* ?? */
+       int     $0x80           /* Call system.  */
+       hlt                     /* Should not be reached.  */
+
+       .data
+hello: .ascii  "Hello, GNU Mes!\n"
+bye:   .byte   0
diff --git a/lib/freebsd/x86-mes-gcc/mini.c b/lib/freebsd/x86-mes-gcc/mini.c
new file mode 100644 (file)
index 0000000..7978ee2
--- /dev/null
@@ -0,0 +1,64 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "mes/lib-mini.h"
+
+#define SYS_exit   "0x01"
+#define SYS_write  "0x04"
+
+// *INDENT-OFF*
+void
+_exit (int code)
+{
+  asm (
+       "mov    $"SYS_exit",%%eax\n\t"
+       "mov    %0,%%ebx\n\t"
+       "push   %%ebx\n\t"
+       "push   %%ebx\n\t"
+       "int    $0x80\n\t"
+       : // no outputs "=" (r)
+       : "rm" (code)
+       : "eax", "ebx"
+       );
+  // not reached
+  _exit (0);
+}
+
+ssize_t
+_write (int filedes, void const *buffer, size_t size)
+{
+  long r;
+  asm (
+       "mov    $"SYS_write",%%eax\n\t"
+       "mov    %3,%%edx\n\t"
+       "push   %%edx\n\t"
+       "mov    %2,%%ecx\n\t"
+       "push   %%ecx\n\t"
+       "mov    %1,%%ebx\n\t"
+       "push   %%ebx\n\t"
+       "push   %%ebx\n\t"
+       "int    $0x80\n\t"
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "rm" (filedes), "rm" (buffer), "rm" (size)
+       : "eax", "ebx", "ecx", "edx"
+       );
+  return r;
+}
diff --git a/lib/freebsd/x86-mes-mescc/crt1.c b/lib/freebsd/x86-mes-mescc/crt1.c
new file mode 100644 (file)
index 0000000..0e92ad3
--- /dev/null
@@ -0,0 +1,65 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "mes/lib-mini.h"
+
+int main (int argc, char *argv[], char *envp[]);
+
+int
+_start ()
+{
+  asm ("mov____$i8,%eax !0");
+  asm ("mov____%eax,0x32 &__stdin");
+
+  asm ("mov____$i8,%eax !1");
+  asm ("mov____%eax,0x32 &__stdout");
+
+  asm ("mov____$i8,%eax !2");
+  asm ("mov____%eax,0x32 &__stderr");
+
+  asm ("mov____%ebp,%eax");
+  asm ("add____$i8,%eax !4");
+
+  asm ("movzbl_(%eax),%eax");
+  asm ("add____$i8,%eax !3");
+
+  asm ("shl____$i8,%eax !0x02");
+  asm ("add____%ebp,%eax");
+  asm ("mov____%eax,0x32 &environ");
+  asm ("push___%eax");
+
+  asm ("mov____%ebp,%eax");
+  asm ("add____$i8,%eax !8");
+  asm ("push___%eax");
+
+  asm ("mov____%ebp,%eax");
+  asm ("add____$i8,%eax !4");
+  asm ("movzbl_(%eax),%eax");
+  asm ("push___%eax");
+
+  main ();
+
+  asm ("mov____%eax,%ebx");
+  asm ("mov____$i32,%eax %1");
+  asm ("push___%ebx");
+  asm ("push___%ebx");
+  asm ("int____$0x80");
+  asm ("hlt");
+}
diff --git a/lib/freebsd/x86-mes-mescc/mini.c b/lib/freebsd/x86-mes-mescc/mini.c
new file mode 100644 (file)
index 0000000..7756a7a
--- /dev/null
@@ -0,0 +1,43 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+void
+_exit ()
+{
+  asm ("mov____$i32,%eax SYS_exit");
+  asm ("mov____0x8(%ebp),%ebx !8");
+  asm ("push___%ebx");
+  asm ("push___%ebx");
+  asm ("int____$0x80");
+}
+
+void
+_write ()
+{
+  asm ("mov____$i32,%eax SYS_write");
+  asm ("mov____0x8(%ebp),%edx !16");
+  asm ("push___%edx");
+  asm ("mov____0x8(%ebp),%ecx !12");
+  asm ("push___%ecx");
+  asm ("mov____0x8(%ebp),%ebx !8");
+  asm ("push___%ebx");
+  asm ("push___%ebx");
+  asm ("int____$0x80");
+}
diff --git a/lib/freebsd/x86-mes/elf32-0exit-42.hex2 b/lib/freebsd/x86-mes/elf32-0exit-42.hex2
new file mode 100644 (file)
index 0000000..b00bc38
--- /dev/null
@@ -0,0 +1,39 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf32-exit-42.hex2: `exit 42' for i686-freebsd written in hex2 assembly,
+# for usage with elf32-0header.hex2.  This produces a 112-byte binary
+# (70 hex).  Inspiration was taken from GNU Gcc output of exit-42.S.
+
+### Code:
+
+# DEFINE SYS_exit 1
+
+# @60
+:ELF_text
+b8 01 00 00 00                 # mov    SYS_exit,%eax
+68 2a 00 00 00                 # push   $42
+68 00 00 00 00                 # push   $00
+cd 80                          # int    $0x80
+f4                             # hlt
+
+      00 00  00 00 00 00       # align to @80
+00 00 00 00  00 00 00 00
+:ELF_end
diff --git a/lib/freebsd/x86-mes/elf32-0header.hex2 b/lib/freebsd/x86-mes/elf32-0header.hex2
new file mode 100644 (file)
index 0000000..542fa55
--- /dev/null
@@ -0,0 +1,85 @@
+### Copyright (C) 2016 Jeremiah Orians
+### Copyright (C) 2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf32-0header.hex2: Simplest 32 bit elf header in hex2.  Only a text
+# segment, no data segment, no symbol tables.
+
+# stage0's hex2 format for x86
+#    !<label>          1 byte relative
+#    $<label>          2 byte address
+#    @<label>          2 byte relative
+#    &<label>          4 byte address
+#    %<label>          4 byte relative
+#    local_<label>     function-local
+#    string_<index>    string #<index>
+
+### Code:
+
+:ELF_base
+7F 45 4C 46                    # e_ident[EI_MAG0-3] ELF's magic number
+
+01                             # e_ident[EI_CLASS] Indicating 32 bit
+01                             # e_ident[EI_DATA] Indicating little endianness
+01                             # e_ident[EI_VERSION] Indicating original elf
+
+09                             # e_ident[EI_OSABI] FreeBSD
+00                             # e_ident[EI_ABIVERSION] Not specified because nobody cares
+
+00 00 00 00 00 00 00           # e_ident[EI_PAD]
+
+02 00                          # e_type Indicating Executable
+03 00                          # e_machine Indicating 32bit x86
+01 00 00 00                    # e_version Indicating original elf
+
+&ELF_text                      # e_entry Address of the entry point
+%ELF_program_headers>ELF_base  # e_phoff Address of program header table
+00 00 00 00                    # e_shoff Address of section header table
+
+00 00 00 00                    # e_flags
+
+34 00                          # e_ehsize Indicating our 52 Byte header
+
+20 00                          # e_phentsize size of a program header table
+01 00                          # e_phnum number of entries in program table
+
+00 00                          # e_shentsize size of a section header table
+00 00                          # e_shnum number of entries in section table
+
+00 00                          # e_shstrndx index of the section names
+
+# @34
+00 00 00 00
+00 00 00 00
+00 00 00 00
+
+# @40
+:ELF_program_headers
+:ELF_program_header__text
+01 00 00 00                    # ph_type: PT-LOAD = 1
+00 00 00 00                    # ph_offset
+&ELF_base                      # ph_vaddr
+&ELF_base                      # ph_physaddr
+%ELF_end>ELF_base              # ph_filesz
+%ELF_end>ELF_base              # ph_memsz
+07 00 00 00                    # ph_flags: PF-X|PF-W|PF-R = 7
+01 00 00 00                    # ph_align
+
+# @60
+:ELF_text
diff --git a/lib/freebsd/x86-mes/elf32-0hello-mes.hex2 b/lib/freebsd/x86-mes/elf32-0hello-mes.hex2
new file mode 100644 (file)
index 0000000..cab6b69
--- /dev/null
@@ -0,0 +1,58 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf32-0hello-mes.hex2: `Hello, GNU Mes!' for i686-linux written in
+# hex2 assembly, for usage with elf32-0header.hex2.  This produces a
+# 160-byte binary (a0 hex).  Inspiration was taken from GNU Gcc output
+# of hello-mes.S.
+
+### Code:
+
+# DEFINE SYS_exit 1
+# DEFINE SYS_write 4
+# DEFINE stdout 1
+
+# @60
+:ELF_text
+
+                               # print <hello>
+b8 04 00 00 00                 # mov    $SYS_write,%eax
+68 %bye>hello                  # push   $(bye-hello)
+68 &hello                      # push   $hello
+68 01 00 00 00                 # push   $stdout
+68 00 00 00 00                 # push   ??
+cd 80                          # int    $0x80
+
+                               # exit 0
+b8 01 00 00 00                 # mov    $SYS_exit,%eax
+68 00 00 00 00                 # mov    $0,%ebx
+68 00 00 00 00                 # push   ??
+cd 80                          # int    $0x80
+f4                             # hlt
+
+00 00 00                       # align to a0
+
+# @a0
+:ELF_data
+:hello
+48 65 6c 6c 6f 2c 20 47        # Hello, G
+4e 55 20 4d 65 73 21 0a        # NU Mes!\n
+:bye
+:ELF_end
diff --git a/lib/freebsd/x86-mes/elf32-body-exit-42.hex2 b/lib/freebsd/x86-mes/elf32-body-exit-42.hex2
new file mode 100644 (file)
index 0000000..0ea0dbf
--- /dev/null
@@ -0,0 +1,54 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf32-body-exit-42.hex2: `exit 42' for i686-freebsd written in hex2
+# assembly, for usage with generic elf32-header.hex2 and
+# elf32-footer-single-main.hex.
+
+# This ELF binary contains a symbol table, which means that objdump and
+# gdb can be used to inspect and debug.
+
+### Code:
+
+# DEFINE SYS_exit 1
+
+# @200
+:ELF_text
+:_start
+e8 %main                       # call   +11 <main>
+00 00 00
+00 00 00 00
+00 00 00 00
+
+# @210
+:main
+b8 01 00 00 00                 # mov    SYS_exit,%eax
+68 2a 00 00 00                 # push   $42
+68 00 00 00 00                 # push   $00
+cd 80                          # int    $0x80
+f4                             # hlt
+
+      00 00  00 00 00 00       # align
+00 00 00 00  00 00 00 00
+
+# @230
+:ELF_data
+65 78 69 74 34 32 20 64 61 74 61 20 68 65 72 65 # exit42 data here"
+00
diff --git a/lib/freebsd/x86-mes/elf32-body-hello-mes.hex2 b/lib/freebsd/x86-mes/elf32-body-hello-mes.hex2
new file mode 100644 (file)
index 0000000..efd24fc
--- /dev/null
@@ -0,0 +1,69 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf32-body-hello-mes.hex2: `Hello, GNU Mes!' for i686-linux written in
+# hex2 assembly, for usage with generic elf32-header.hex2 and
+# elf32-footer-single-main.hex.
+
+# This ELF binary contains a symbol table which means that objdump and
+# gdb can be used to inspect and debug.
+
+### Code:
+
+# DEFINE SYS_exit 1
+# DEFINE SYS_write 4
+# DEFINE stdout 1
+
+# @200
+:ELF_text
+:_start
+e8 %main                       # call   +11 <main>
+00 00 00
+00 00 00 00
+00 00 00 00
+
+# @210
+:main
+                               # print <hello>
+b8 04 00 00 00                 # mov    $SYS_write,%eax
+68 %bye>hello                  # push   $(bye-hello)
+68 &hello                      # push   $hello
+68 01 00 00 00                 # push   $stdout
+68 00 00 00 00                 # push   ??
+cd 80                          # int    $0x80
+
+                               # exit 0
+b8 01 00 00 00                 # mov    $SYS_exit,%eax
+68 00 00 00 00                 # push   0
+68 00 00 00 00                 # push   ??
+cd 80                          # int    $0x80
+f4                             # hlt
+
+00 00 00 00 00 00 00 00 00 00  # align to @240
+00 00 00
+
+# @240
+:ELF_data
+:hello
+48 65 6c 6c 6f 2c 20 47        # Hello, G
+4e 55 20 4d 65 73 21 0a        # NU Mes!\n
+
+:bye
+00
diff --git a/lib/freebsd/x86-mes/elf32-footer-single-main.hex2 b/lib/freebsd/x86-mes/elf32-footer-single-main.hex2
new file mode 100644 (file)
index 0000000..5695055
--- /dev/null
@@ -0,0 +1,64 @@
+### Copyright (C) 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+### This file is part of stage0.
+###
+### stage0 is free software: you can redistribute it and/or modify
+### it under the terms of the GNU General Public License as published by
+### the Free Software Foundation, either version 3 of the License, or
+### (at your option) any later version.
+###
+### stage0 is distributed in the hope that it will be useful,
+### but WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with stage0.  If not, see <http://www.gnu.org/licenses/>.
+
+### stage0's hex2 format for x86
+###    !<label>          1 byte relative
+###    $<label>          2 byte address
+###    @<label>          2 byte relative
+###    &<label>          4 byte address
+###    %<label>          4 byte relative
+###    local_<label>     function-local
+###    string_<index>    string #<index>
+
+### elf32-footer-single-main.hex2: 32 bit elf footer in hex2 for single main
+
+# @230
+
+:ELF_str
+00                             # 0
+:ELF_str__start
+5f 73 74 61 72 74 00           # _start
+:ELF_str__main
+6d 61 69 6e 00                 # main
+
+00 00 00
+
+# @240
+:ELF_sym
+00 00 00 00                    # st-name
+00 00 00 00                    # st-offset: &_start - BaseAddress
+00 00 00 00                    # st-len   : &main - _start
+00                             # st-info = stt-func= 2
+00                             # st-other
+01 00                          # st-shndx: 1
+
+# _start
+%ELF_str__start>ELF_str        # st-name
+&_start
+10 00 00 00                    # st-len   : &main - _start
+02                             # st-info = stt-func= 2
+00                             # st-other
+01 00                          # st-shndx: 1
+
+# main
+%ELF_str__main>ELF_str         # st-name
+&main
+10 00 00 00                    # st-len   : &ELF_data - main
+02                             # st-info = stt-func= 2
+00                             # st-other
+01 00                          # st-shndx: 1
+
+:ELF_end
diff --git a/lib/freebsd/x86-mes/elf32-header.hex2 b/lib/freebsd/x86-mes/elf32-header.hex2
new file mode 100644 (file)
index 0000000..a9af141
--- /dev/null
@@ -0,0 +1,225 @@
+### Copyright (C) 2016 Jeremiah Orians
+### Copyright (C) 2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf32-header.hex2: 32 bit elf header in hex2, with text segment, data
+# segment and symbol tables.
+
+# stage0's hex2 format for x86
+#    !<label>          1 byte relative
+#    $<label>          2 byte address
+#    @<label>          2 byte relative
+#    &<label>          4 byte address
+#    %<label>          4 byte relative
+#    local_<label>     function-local
+#    string_<index>    string #<index>
+
+### Code:
+
+:ELF_base
+7F 45 4C 46                    # e_ident[EI_MAG0-3] ELF's magic number
+
+01                             # e_ident[EI_CLASS] Indicating 32 bit
+01                             # e_ident[EI_DATA] Indicating little endianness
+01                             # e_ident[EI_VERSION] Indicating original elf
+
+09                             # e_ident[EI_OSABI] FreeBSD
+00                             # e_ident[EI_ABIVERSION] Not specified because nobody cares
+
+00 00 00 00 00 00 00           # e_ident[EI_PAD]
+
+02 00                          # e_type Indicating Executable
+03 00                          # e_machine Indicating 32bit x86
+01 00 00 00                    # e_version Indicating original elf
+
+&ELF_text                      # e_entry Address of the entry point
+%ELF_program_headers>ELF_base  # e_phoff Address of program header table
+%ELF_section_headers>ELF_base  # e_shoff Address of section header table
+
+00 00 00 00                    # e_flags
+
+34 00                          # e_ehsize Indicating our 52 Byte header
+
+20 00                          # e_phentsize size of a program header table
+01 00                          # e_phnum number of entries in program table
+
+28 00                          # e_shentsize size of a section header table
+07 00                          # e_shnum number of entries in section table
+
+04 00                          # e_shstrndx index of the section names
+
+# @34
+00 00 00 00
+00 00 00 00
+00 00 00 00
+
+# @40
+:ELF_program_headers
+:ELF_program_header__text
+01 00 00 00                    # ph_type: PT-LOAD = 1
+00 00 00 00                    # ph_offset
+&ELF_base                      # ph_vaddr
+&ELF_base                      # ph_physaddr
+%ELF_end>ELF_base              # ph_filesz
+%ELF_end>ELF_base              # ph_memsz
+07 00 00 00                    # ph_flags: PF-X|PF-W|PF-R = 7
+01 00 00 00                    # ph_align
+
+# @60
+#:ELF_program_header__data     # NOT USED
+                               # FIXME: linux 4.17 does not allow this overlap
+                               #    Uhuuh, elf segment at 0000000001000000
+                               #    requested but the memory is mapped already
+01 00 00 00                    # ph_type: PT-LOAD = 1
+00 00 00 00                    # ph_offset
+&ELF_base                      # ph_vaddr
+&ELF_base                      # ph_physaddr
+%ELF_end>ELF_base              # ph_filesz
+%ELF_end>ELF_base              # ph_memsz
+07 00 00 00                    # ph_flags: PF-X|PF-W|PF-R = 7
+01 00 00 00                    # ph_align
+
+# @80
+:ELF_comment
+4d 45 53 00                     # MES
+00 00 00 00                     # align
+00 00 00 00
+00 00 00 00
+
+4d 45 53 00                     # MES
+00 00 00 00                     # align
+00 00 00 00
+00 00 00 00
+
+# @a0
+:ELF_shstr
+00
+:ELF_shstr__text
+2e 74 65 78 74 00               # .text
+:ELF_shstr__data
+2e 64 61 74 61 00               # .data
+:ELF_shstr__comment
+2e 63 6f 6d 6d 65 6e 74 00      # .comment
+:ELF_shstr__shstr
+2e 73 68 73 74 72 74 61 62 00   # .shstrtab
+:ELF_shstr__sym
+2e 73 79 6d 74 61 62 00         # .symtab
+:ELF_shstr__str
+2e 73 74 72 74 61 62 00         # .strtab
+
+# @d0
+
+:ELF_section_headers
+00 00 00 00                     # sh_name
+00 00 00 00                     # sh_type
+00 00 00 00                     # sh_flags
+00 00 00 00                     # sh_addr
+00 00 00 00                     # sh_offset
+00 00 00 00                     # sh_length
+00 00 00 00                     # sh_link
+00 00 00 00                     # sh_info
+01 00 00 00                     # sh_1?
+00 00 00 00                     # sh_entsize
+
+## FIXME: M0 for calculations?
+:ELF_section_header_text
+%ELF_shstr__text>ELF_shstr      # sh_name
+01 00 00 00                     # sh_type = SHT_PROGBITS = 1
+06 00 00 00                     # sh_flags = SHF-ALLOC|SHF-EXEC =2 | 4 = 6
+&ELF_text                       # sh_addr
+%ELF_text>ELF_base              # sh_offset
+%ELF_data>ELF_text              # sh_length
+00 00 00 00                     # sh_link
+00 00 00 00                     # sh_info
+01 00 00 00                     # sh_1?
+00 00 00 00                     # sh_entsize
+
+:ELF_section_header_data
+%ELF_shstr__data>ELF_shstr     # sh_name
+01 00 00 00                    # sh_type = SHT_PROGBITS = 1
+03 00 00 00                    # sh_flags = SHF-WRITE|SHF-ALLOC = 1 | 2 = 3
+&ELF_data                      # sh_addr
+%ELF_data>ELF_base             # sh_offset
+%ELF_sym>ELF_data              # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00                    # sh_1?
+00 00 00 00                    # sh_entsize
+
+:ELF_section_header_comment
+%ELF_shstr__comment>ELF_shstr  # sh_name
+01 00 00 00                    # sh_type = SHT_PROGBITS = 1
+00 00 00 00                    # sh_flags
+&ELF_comment                   # sh_addr
+%ELF_comment>ELF_base          # sh_offset
+%ELF_shstr>ELF_comment         # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00                    # sh_1?
+00 00 00 00                    # sh_entsize
+
+:ELF_section_header_shstr
+%ELF_shstr__shstr>ELF_shstr    # sh_name
+03 00 00 00                    # sh_type: str-sht-strtab
+00 00 00 00                    # sh_flags
+&ELF_shstr                     # sh_addr
+%ELF_shstr>ELF_base            # sh_offset
+%ELF_section_headers>ELF_shstr # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00                    # sh_1?
+00 00 00 00                    # sh_entsize
+
+:ELF_section_header_sym
+%ELF_shstr__sym>ELF_shstr      # sh_name
+02 00 00 00                    # sh_type: str-sht-symtab
+00 00 00 00                    # sh_flags
+&ELF_sym                       # sh_addr
+%ELF_sym>ELF_base              # sh_offset
+%ELF_end>ELF_sym               # sh_length
+06 00 00 00                    # sh_link:6
+00 00 00 00                    # sh_info
+01 00 00 00                    # sh_1?
+10 00 00 00                    # sh_entsize
+
+:ELF_section_header_str
+%ELF_shstr__str>ELF_shstr      # sh_name
+03 00 00 00                    # sh_type: str-sht-strtab
+00 00 00 00                    # sh_flags
+&ELF_str                       # sh_addr
+%ELF_str>ELF_base              # sh_offset
+%ELF_sym>ELF_str               # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00                    # sh_1?
+00 00 00 00                    # sh_entsize
+
+# @1e8
+00 00 00 00  # align
+00 00 00 00
+
+# @1f0
+
+00 00 00 00  # align
+00 00 00 00
+00 00 00 00
+00 00 00 00
+
+# @200
+:ELF_text
diff --git a/lib/gnu/_exit.c b/lib/gnu/_exit.c
new file mode 100644 (file)
index 0000000..39268f8
--- /dev/null
@@ -0,0 +1,42 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** Commentary:
+    Inspired by implementation in GNU C Library:
+    _hurd_exit
+    Copyright (C) 1993-2016 Free Software Foundation, Inc.
+ */
+
+#include <gnu/hurd.h>
+#include <gnu/hurd-types.h>
+#include <gnu/syscall.h>
+#include <mach/mach-init.h>
+
+void
+_exit (int status)
+{
+  __proc_mark_exit (_hurd_startup_data.portarray[INIT_PORT_PROC], status, 0);
+  __task_terminate (mach_task_self ());
+#if 0 // FIXME: this was needed?
+  while (1) {* (int *) 0 = 0;}
+#else
+  asm ("hlt");
+#endif
+}
diff --git a/lib/gnu/_open3.c b/lib/gnu/_open3.c
new file mode 100644 (file)
index 0000000..932111d
--- /dev/null
@@ -0,0 +1,48 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** Commentary:
+    Inspired by implementation in GNU C Library:
+    __hurd_file_name_lookup, __hurd_file_name_lookup_retry
+    Copyright (C) 1992-2016 Free Software Foundation, Inc.
+ */
+
+#include <gnu/hurd.h>
+#include <gnu/hurd-types.h>
+#include <gnu/syscall.h>
+#include <mach/mach-init.h>
+
+int
+_open3 (char const *file_name, int flags, int mode)
+{
+  mach_port_t port;
+  int do_retry;
+  char retry_name[1024];
+  int start_dir = (file_name[0] == '/') ? INIT_PORT_CRDIR : INIT_PORT_CWDIR;
+  mach_port_t start_port = _hurd_startup_data.portarray[start_dir];
+  while (file_name[0] == '/')
+    file_name++;
+  error_t e = __dir_lookup (start_port, file_name, flags, mode, &do_retry, retry_name, &port);
+  if (e)
+    return -1;
+  int fd = _hurd_dtable_count++;
+  _hurd_dtable[fd] = port;
+  return fd;
+}
diff --git a/lib/gnu/_read.c b/lib/gnu/_read.c
new file mode 100644 (file)
index 0000000..8035ed9
--- /dev/null
@@ -0,0 +1,34 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gnu/hurd.h>
+#include <gnu/hurd-types.h>
+#include <gnu/syscall.h>
+#include <mach/mach-init.h>
+
+ssize_t
+_read (int filedes, void *buffer, size_t size)
+{
+  mach_port_t p = fd_get (filedes);
+  error_t e = fd_read (p, buffer, &size, -1);
+  if (!e)
+    return size;
+  return -1;
+}
diff --git a/lib/gnu/_write.c b/lib/gnu/_write.c
new file mode 100644 (file)
index 0000000..656b16d
--- /dev/null
@@ -0,0 +1,34 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gnu/hurd.h>
+#include <gnu/hurd-types.h>
+#include <gnu/syscall.h>
+#include <mach/mach-init.h>
+
+ssize_t
+_write (int filedes, void const *buffer, size_t size)
+{
+  mach_port_t p = fd_get (filedes);
+  error_t e = fd_write (p, buffer, &size, -1);
+  if (!e)
+    return size;
+  return -1;
+}
diff --git a/lib/gnu/dir-lookup.c b/lib/gnu/dir-lookup.c
new file mode 100644 (file)
index 0000000..d3a8426
--- /dev/null
@@ -0,0 +1,76 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gnu/syscall.h>
+#include <string.h>
+#include <sys/stat.h>
+
+struct mach_msg_string_int_int
+{
+  mach_msg_header_t header;
+  mach_msg_type_t type_one; string_t one;
+  mach_msg_type_t type_two; int two;
+  mach_msg_type_t type_three; int three;
+};
+
+struct mach_msg_int_int_string_int
+{
+  mach_msg_header_t header;
+  mach_msg_type_t type_one; int one;
+  mach_msg_type_t type_two; int two;
+  mach_msg_type_t type_three; string_t three;
+  mach_msg_type_t type_four; int four;
+};
+
+mach_msg_type_t mach_msg_type_file_name =
+  {
+   /* msgt_name = */           (unsigned char) MACH_MSG_TYPE_STRING_C,
+   /* msgt_size = */           8,
+   /* msgt_number = */         1024,
+   /* msgt_inline = */         1,
+   /* msgt_longform = */        0,
+   /* msgt_deallocate = */     0,
+   /* msgt_unused = */         0
+  };
+
+kern_return_t __dir_lookup (file_t start_dir, string_t file_name, int flags, mode_t mode, retry_type *do_retry, string_t retry_name, mach_port_t *port)
+{
+  union message
+  {
+    struct mach_msg_string_int_int request;
+    struct mach_msg_int_int_string_int reply;
+  };
+  union message message = {0};
+  message.request.header.msgh_size = sizeof (message.request);
+  message.request.type_one = mach_msg_type_file_name;
+  strcpy (message.request.one, file_name);
+  message.request.type_two = mach_msg_type_int32;
+  message.request.two = flags;
+  message.request.type_three = mach_msg_type_int32;
+  message.request.three = mode;
+
+  kern_return_t result = __syscall_get (start_dir, SYS__dir_lookup,
+                                        &message.request.header,
+                                        sizeof (message.reply));
+  if (message.reply.one != KERN_SUCCESS)
+    return message.reply.one;
+  *port = message.reply.four;
+  return result;
+}
diff --git a/lib/gnu/exec-startup-get-data.c b/lib/gnu/exec-startup-get-data.c
new file mode 100644 (file)
index 0000000..9c6c8b2
--- /dev/null
@@ -0,0 +1,68 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gnu/syscall.h>
+
+static void
+mach_startup_info2hurd_startup_data (struct mach_msg_startup_info *info,
+                                     struct hurd_startup_data *data)
+{
+  data->flags = info->flags;
+  data->dtable = info->dtable;
+  data->dtable_count = info->dtableType.msgtl_number;
+
+  data->argp = info->argv;
+  data->arg_size = info->argvType.msgtl_number;
+
+  data->envp = info->envp;
+  data->env_size = info->envpType.msgtl_number;
+
+  data->portarray = info->portarray;
+  data->portarray_count = info->portarrayType.msgtl_number;
+
+  data->intarray = info->intarray;
+  data->intarray_count = info->intarrayType.msgtl_number;
+
+  data->stack_base = info->stack_base;
+  data->stack_count = info->stack_size;
+
+  data->phdr = info->phdr;
+  data->phdr_count = info->phdr_size;
+
+  data->user_entry = info->user_entry;
+}
+
+kern_return_t
+__exec_startup_get_data (mach_port_t bootstrap, struct hurd_startup_data *data)
+{
+  union message
+    {
+      mach_msg_header_t header;
+      struct mach_msg_startup_info info;
+    };
+  union message message;
+  message.header.msgh_size = sizeof (struct mach_msg);
+  kern_return_t result = __syscall_get (bootstrap, SYS__exec_startup_get_info,
+                                        &message.header, sizeof (message));
+
+
+  mach_startup_info2hurd_startup_data (&message.info, data);
+  return result;
+}
diff --git a/lib/gnu/fd-get.c b/lib/gnu/fd-get.c
new file mode 100644 (file)
index 0000000..2165c23
--- /dev/null
@@ -0,0 +1,37 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** Commentary:
+    Inspired by implementation in GNU C Library:
+    _hurd_fd_get
+    Copyright (C) 1993-2016 Free Software Foundation, Inc.
+ */
+
+#include <errno.h>
+#include <unistd.h>
+#include <gnu/hurd.h>
+
+mach_port_t
+fd_get (int filedes)
+{
+  if (filedes >=0 && filedes <= _hurd_dtable_count)
+    return _hurd_dtable[filedes];
+  return 0;
+}
diff --git a/lib/gnu/fd-read.c b/lib/gnu/fd-read.c
new file mode 100644 (file)
index 0000000..bf8da45
--- /dev/null
@@ -0,0 +1,40 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** Commentary:
+    Inspired by implementation in GNU C Library:
+    _hurd_fd_read
+    Copyright (C) 1993-2016 Free Software Foundation, Inc.
+ */
+
+#include <gnu/hurd.h>
+#include <gnu/syscall.h>
+#include <string.h>
+#include <errno.h>
+
+error_t
+fd_read (mach_port_t port, void *buffer, size_t *read, loff_t offset)
+{
+  char *data;
+  error_t e = __io_read (port, &data, read, offset, *read);
+  if (!e)
+    memcpy (buffer, data, *read);
+  return e;
+}
diff --git a/lib/gnu/fd-write.c b/lib/gnu/fd-write.c
new file mode 100644 (file)
index 0000000..9e18bc5
--- /dev/null
@@ -0,0 +1,41 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** Commentary:
+    Inspired by implementation in GNU C Library:
+    _hurd_fd_write -- write to a file descriptor; handles job control et al.
+    Copyright (C) 1993-2016 Free Software Foundation, Inc.
+ */
+
+#include <errno.h>
+#include <unistd.h>
+#include <gnu/hurd.h>
+#include <gnu/syscall.h>
+
+error_t
+fd_write (mach_port_t port, void const *buffer, size_t *size, loff_t offset)
+{
+  mach_msg_type_number_t wrote = 0;
+  error_t err = __io_write (port, buffer, *size, 0, &wrote);
+  if (! err)
+    *size = wrote;
+
+  return err;
+}
diff --git a/lib/gnu/hurd-start.c b/lib/gnu/hurd-start.c
new file mode 100644 (file)
index 0000000..b6b98c0
--- /dev/null
@@ -0,0 +1,60 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** Commentary:
+    Inspired by implementation in GNU C Library:
+    Initialization code run first thing by the ELF startup code.  For i386/Hurd.
+    Copyright (C) 1995-2016 Free Software Foundation, Inc.
+ */
+
+#include <mes/lib-mini.h>
+#include <argz.h>
+#include <gnu/hurd.h>
+#include <gnu/syscall.h>
+
+#include <mach/mach-init.h>
+#include <mach/mach_types.h>
+#include <mach/message.h>
+#include <mach/port.h>
+
+struct hurd_startup_data _hurd_startup_data;
+mach_port_t _hurd_dtable[_HURD_DTABLE_MAX];
+int _hurd_dtable_count;
+size_t __argc;
+char *__argv[_HURD_ARGV_MAX];
+char *__envv[_HURD_ENVV_MAX];
+
+void __mach_init (void);
+
+void
+_hurd_start ()
+{
+  mach_port_t bootstrap;
+  __mach_init ();
+  __task_get_special_port (mach_task_self (), TASK_BOOTSTRAP_PORT,
+                           &bootstrap);
+  __exec_startup_get_data (bootstrap, &_hurd_startup_data);
+  _hurd_dtable_count = _hurd_startup_data.dtable_count;
+  for (int i = 0; i < _hurd_dtable_count; i++)
+    _hurd_dtable[i] = _hurd_startup_data.dtable[i];
+  __argc = __argz_extract_count (_hurd_startup_data.argp, _hurd_startup_data.arg_size, __argv);
+  __argz_extract (_hurd_startup_data.envp, _hurd_startup_data.env_size, __envv);
+  environ = __envv;
+}
diff --git a/lib/gnu/io-read.c b/lib/gnu/io-read.c
new file mode 100644 (file)
index 0000000..8b10ae8
--- /dev/null
@@ -0,0 +1,60 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gnu/syscall.h>
+
+struct mach_msg_int_pointer
+{
+  mach_msg_header_t header;
+  mach_msg_type_t type_one; int one;
+  mach_msg_type_long_t type_two; union {char *two; char pointer[2048];};
+};
+
+kern_return_t
+__io_read (io_t io, data_t *data, mach_msg_type_number_t *read, loff_t offset, vm_size_t size)
+{
+  union message
+  {
+    struct mach_msg_loff_int request;
+    struct mach_msg_int_pointer reply;
+  };
+  union message message = {0};
+  message.request.header.msgh_size = sizeof (message.request);
+  message.request.type_one = mach_msg_type_int64;
+  message.request.one = offset;
+  message.request.type_two = mach_msg_type_int32;
+  message.request.two = size;
+
+  kern_return_t result = __syscall_put (io, SYS__io_read,
+                                        &message.request.header,
+                                        sizeof (message.reply));
+
+  if (result == KERN_SUCCESS)
+    {
+      *read = message.reply.type_two.msgtl_number;
+      *data = message.reply.pointer;
+    }
+  else
+    {
+      *read = 0;
+      *data = 0;
+    }
+  return result;
+}
diff --git a/lib/gnu/io-write.c b/lib/gnu/io-write.c
new file mode 100644 (file)
index 0000000..d7e31b0
--- /dev/null
@@ -0,0 +1,50 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gnu/syscall.h>
+
+struct mach_msg_pointer_loff
+{
+  mach_msg_header_t header;
+  mach_msg_type_long_t type_one; char *one;
+  mach_msg_type_t type_two; loff_t two;
+};
+
+kern_return_t
+__io_write (io_t io, data_t data, mach_msg_type_number_t size, loff_t offset, vm_size_t *wrote)
+{
+  struct mach_msg_pointer_loff message = {0};
+  message.header.msgh_size = sizeof (struct mach_msg_pointer_loff);
+  message.type_one = mach_msg_type_pointer;
+  message.one = data;
+  message.type_two = mach_msg_type_int64;
+  message.two = offset;
+
+  message.type_one.msgtl_number = size;
+  message.type_one.msgtl_header.msgt_inline = 0;
+  message.header.msgh_bits = MACH_MSGH_BITS_COMPLEX;
+
+  kern_return_t result = __syscall_put (io, SYS__io_write,
+                                        &message.header,
+                                        sizeof (struct mach_msg_2));
+  if (result == KERN_SUCCESS)
+    *wrote = message.two;
+  return result;
+}
diff --git a/lib/gnu/malloc.c b/lib/gnu/malloc.c
new file mode 100644 (file)
index 0000000..eb22850
--- /dev/null
@@ -0,0 +1,34 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <mes/lib.h>
+#include <gnu/syscall.h>
+#include <mach/mach-init.h>
+
+void *
+malloc (size_t size)
+{
+  vm_address_t where;
+  vm_size_t amount = size;
+  kern_return_t e = __vm_allocate (mach_task_self (), &where, (vm_size_t) amount, 1);
+  if (e)
+    return 0;
+  return (void*) where;
+}
diff --git a/lib/gnu/proc-mark-exit.c b/lib/gnu/proc-mark-exit.c
new file mode 100644 (file)
index 0000000..da3d7ac
--- /dev/null
@@ -0,0 +1,28 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gnu/syscall.h>
+#include <sys/wait.h>
+
+kern_return_t
+__proc_mark_exit (mach_port_t process, int status, int signal)
+{
+  return __syscall2 (process, SYS__proc_mark_exit, W_EXITCODE (status, 0), signal);
+}
diff --git a/lib/gnu/syscall.c b/lib/gnu/syscall.c
new file mode 100644 (file)
index 0000000..bd919a4
--- /dev/null
@@ -0,0 +1,143 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gnu/syscall.h>
+
+#include <mach/mach_traps.h>
+
+mach_msg_type_t mach_msg_type_int32 =
+  {
+   .msgt_name = (unsigned char) MACH_MSG_TYPE_INTEGER_32, // msgt_name
+   .msgt_size = 32,       // msgt_size
+   .msgt_number = 1,      // msgt_number
+   .msgt_inline = 1,      // msgt_inline
+   .msgt_longform = 0,    // msgt_longform
+   .msgt_deallocate = 0,  // msgt_deallocate
+   .msgt_unused = 0       // msgt_unused
+  };
+
+mach_msg_type_long_t mach_msg_type_pointer =
+  {
+   {
+    0, // msgt_name
+    0, // msgt_size
+    0, // msgt_number
+    1, // msgt_inline    FIXME: we always outline...
+    1, // msgt_longform
+    0, // msgt_deallocate
+    0, // msgt_unused
+   },
+   MACH_MSG_TYPE_CHAR, // msgtl_name
+   8, // msgtl_size
+   2048, // msgtl_number
+  };
+
+mach_msg_type_t mach_msg_type_int64 =
+  {
+   (unsigned char) MACH_MSG_TYPE_INTEGER_64, // msgt_name
+   64, // msgt_size
+   1,  // msgt_number
+   1,  // msgt_inline
+   0,  // msgt_longform
+   0,  // msgt_deallocate
+   0,  // msgt_unused
+  };
+
+kern_return_t
+__syscall (mach_port_t port, int sys_call)
+{
+  struct mach_msg message =
+    {
+     {
+      MACH_MSGH_BITS (MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND_ONCE),
+      0,
+      port,
+      {__mach_reply_port (),},
+      0,
+      sys_call,
+     }
+    };
+  return __mach_msg (&message.header,
+                     MACH_SEND_MSG|MACH_RCV_MSG|MACH_MSG_OPTION_NONE,
+                     sizeof (message),
+                     sizeof (message),
+                     message.header.msgh_local_port,
+                     MACH_MSG_TIMEOUT_NONE,
+                     MACH_PORT_NULL);
+}
+
+kern_return_t
+__syscall2 (mach_port_t port, int sys_call, int one, int two)
+{
+  struct mach_msg_2 message =
+    {
+     {
+      MACH_MSGH_BITS (MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND_ONCE),
+      0,
+      port,
+      {__mach_reply_port (),},
+      0,
+      sys_call,
+     },
+     mach_msg_type_int32, one,
+     mach_msg_type_int32, two,
+    };
+  return __mach_msg (&message.header,
+                     MACH_SEND_MSG|MACH_RCV_MSG|MACH_MSG_OPTION_NONE,
+                     sizeof (message),
+                     sizeof (message),
+                     message.header.msgh_local_port,
+                     MACH_MSG_TIMEOUT_NONE,
+                     MACH_PORT_NULL);
+}
+
+kern_return_t
+__syscall_get (mach_port_t port, int sys_call, mach_msg_header_t *message, size_t size)
+{
+  message->msgh_bits = MACH_MSGH_BITS (MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND_ONCE);
+  message->msgh_remote_port = port;
+  message->msgh_local_port = __mach_reply_port ();
+  message->msgh_seqno = 0;
+  message->msgh_id = sys_call;
+  return __mach_msg (message,
+                     MACH_SEND_MSG|MACH_RCV_MSG|MACH_MSG_OPTION_NONE,
+                     message->msgh_size,
+                     size,
+                     message->msgh_local_port,
+                     MACH_MSG_TIMEOUT_NONE,
+                     MACH_PORT_NULL);
+}
+
+kern_return_t
+__syscall_put (mach_port_t port, int sys_call, mach_msg_header_t *message, size_t size)
+{
+  message->msgh_bits |= MACH_MSGH_BITS (MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND_ONCE);
+  message->msgh_remote_port = port;
+  message->msgh_local_port = __mach_reply_port ();
+  message->msgh_seqno = 0;
+  message->msgh_id = sys_call;
+  return __mach_msg (message,
+                     MACH_SEND_MSG|MACH_RCV_MSG|MACH_MSG_OPTION_NONE,
+                     message->msgh_size,
+                     size,
+                     message->msgh_local_port,
+                     MACH_MSG_TIMEOUT_NONE,
+                     MACH_PORT_NULL);
+}
diff --git a/lib/gnu/task-get-special-port.c b/lib/gnu/task-get-special-port.c
new file mode 100644 (file)
index 0000000..487dfc2
--- /dev/null
@@ -0,0 +1,37 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gnu/syscall.h>
+
+kern_return_t
+__task_get_special_port (mach_port_t task, int which, mach_port_t *port)
+{
+  struct mach_msg_2 message = {0};
+  message.header.msgh_size = sizeof (struct mach_msg_1);
+  message.type_one = mach_msg_type_int32;
+  message.one = which;
+  message.type_two = mach_msg_type_int32;
+  message.two = 0;
+  kern_return_t result = __syscall_get (task, SYS__task_get_special_port,
+                                        &message.header, sizeof (message));
+  if (result == KERN_SUCCESS)
+    *port = message.two;
+  return result;
+}
diff --git a/lib/gnu/task-terminate.c b/lib/gnu/task-terminate.c
new file mode 100644 (file)
index 0000000..bc30c23
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gnu/syscall.h>
+
+kern_return_t
+__task_terminate (mach_port_t task)
+{
+  return __syscall (task, SYS__task_terminate);
+}
diff --git a/lib/gnu/vm-allocate.c b/lib/gnu/vm-allocate.c
new file mode 100644 (file)
index 0000000..46095ee
--- /dev/null
@@ -0,0 +1,76 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gnu/syscall.h>
+
+struct mach_msg_int_address
+{
+  mach_msg_header_t header;
+  mach_msg_type_t type_one; int one;
+  mach_msg_type_t type_two; vm_address_t two;
+};
+
+struct mach_msg_address_int_int
+{
+  mach_msg_header_t header;
+  mach_msg_type_t type_one; vm_address_t one;
+  mach_msg_type_t type_two; vm_size_t two;
+  mach_msg_type_t type_three; boolean_t three;
+};
+
+const mach_msg_type_t mach_msg_type_boolean =
+  {
+   (unsigned char) MACH_MSG_TYPE_BOOLEAN,    // msgt_name
+   32,                                       // msgt_size
+   1,                                        // msgt_number
+   1,                                        // msgt_inline
+   0,                                        // msgt_longform
+   0,                                        // msgt_deallocate
+   0                                         // msgt_unused
+  };
+
+kern_return_t
+__vm_allocate (mach_port_t task, vm_address_t *address, vm_size_t size, boolean_t anywhere)
+{
+  union message
+  {
+    struct mach_msg_address_int_int request;
+    struct mach_msg_int_address reply;
+  };
+  union message message = {0};
+  message.request.header.msgh_size = sizeof (message.request);
+  message.request.type_one = mach_msg_type_int32;
+  message.request.one = *address;
+  message.request.type_two = mach_msg_type_int32;
+  message.request.two = size;
+  message.request.type_three = mach_msg_type_boolean;
+  message.request.three = anywhere;
+
+  kern_return_t result = __syscall_get (task, SYS__vm_allocate,
+                                        &message.request.header,
+                                        sizeof (message.reply));
+
+  if (message.reply.one != KERN_SUCCESS)
+    return message.reply.one;
+
+  if (result == KERN_SUCCESS)
+    *address = message.reply.two;
+  return result;
+}
diff --git a/lib/gnu/vm-statistics.c b/lib/gnu/vm-statistics.c
new file mode 100644 (file)
index 0000000..1c164fe
--- /dev/null
@@ -0,0 +1,41 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gnu/syscall.h>
+
+struct mach_msg_int32_vm_statistics_data
+{
+  mach_msg_header_t header;
+  mach_msg_type_t type_one; int one;
+  mach_msg_type_t type_two; vm_statistics_data_t two;
+};
+
+kern_return_t
+__vm_statistics (mach_port_t task, vm_statistics_data_t *vm_stats)
+{
+  struct mach_msg_int32_vm_statistics_data message = {0};
+  message.header.msgh_size = sizeof (struct mach_msg);
+  message.type_one = mach_msg_type_int32;
+  message.type_two = mach_msg_type_int32;
+  kern_return_t result = __syscall_get (task, SYS__vm_statistics,
+                                        &message.header, sizeof (message));
+  *vm_stats = message.two;
+  return result;
+}
diff --git a/lib/gnu/x86-mes-gcc/crt1.c b/lib/gnu/x86-mes-gcc/crt1.c
new file mode 100644 (file)
index 0000000..18c41bb
--- /dev/null
@@ -0,0 +1,43 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gnu/hurd.h>
+
+char **environ;
+int __stdin;
+int __stdout;
+int __stderr;
+
+int main ();
+void _exit (int status);
+
+void _hurd_start (void);
+
+void
+_start ()
+{
+  _hurd_start ();
+  __stdin = 0;
+  __stdout = 1;
+  __stderr = 2;
+  int r = main (__argc, __argv, environ);
+  _exit (r);
+  asm ("hlt");
+}
diff --git a/lib/gnu/x86-mes-gcc/mini.c b/lib/gnu/x86-mes-gcc/mini.c
new file mode 100644 (file)
index 0000000..a0c42d8
--- /dev/null
@@ -0,0 +1,23 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "mes/lib-mini.h"
+
+// your mini mach here
index 94f2f9f7a257a9c1ee4c4b244f113482a11d7229..f71af59f56bc2e2c9acb8dee60fe883207a60657 100644 (file)
 #include <stdio.h>
 #include <sys/types.h>
 
+#if !__MESC__ /* FIXME: We want bin/mes-mescc's x86-linux sha256sum to stay the same. */
+off_t
+_lseek (int filedes, off_t offset, int whence)
+{
+  return _sys_call3 (SYS_lseek, (int) filedes, (long) offset, (int) whence);
+}
+#endif
+
 off_t
 lseek (int filedes, off_t offset, int whence)
 {
+#if !__MESC__ /* FIXME: We want bin/mes-mescc's x86-linux sha256sum to stay the same. */
+  if (_lseek (filedes, 0, SEEK_CUR) == -1)
+    return -1;
+#endif
   size_t skip = __buffered_read_clear (filedes);
   if (whence == SEEK_CUR)
     offset -= skip;
diff --git a/lib/linux/x86-mes-gcc/exit-42.S b/lib/linux/x86-mes-gcc/exit-42.S
new file mode 100644 (file)
index 0000000..2ab7b17
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** Commentary: */
+
+/* Using gdb, esp. GUD in GNU Emacs is recommended
+M-x gdb-display-disassembly-buffer
+M-x gdb-display-io-buffer
+set disassemble-next-line on
+break _start
+run
+info registers
+si
+p/x $eax
+RET
+...
+*/
+
+/** Code: */
+
+SYS_exit = 1                   /* Linux syscall: exit.  */
+       .globl _start           /* Magic linker symbol: --entry-address.  */
+
+       .text                   /* Program text. */
+_start:
+       mov     $SYS_exit,%eax  /* System call function: exit, in %eax.  */
+       mov     $42,%ebx        /* First parameter: exit status, in %ebx. */
+       int     $0x80           /* Call system.  */
+       hlt                     /* Should not be reached.  */
diff --git a/lib/linux/x86-mes-gcc/hello-mes.S b/lib/linux/x86-mes-gcc/hello-mes.S
new file mode 100644 (file)
index 0000000..88b55fe
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** Commentary: */
+
+/* Using gdb, esp. GUD in GNU Emacs is recommended
+M-x gdb-display-disassembly-buffer
+M-x gdb-display-io-buffer
+set disassemble-next-line on
+break _start
+run
+info registers
+si
+p/x $eax
+RET
+...
+*/
+
+/** Code: */
+
+SYS_exit       = 1             /* Linux syscalls.  */
+SYS_write      = 4
+stdout         = 1             /* File discriptor */
+       .globl _start           /* Magic linker symbol: --entry-address.  */
+
+       .text                   /* Program text. */
+_start:
+       mov     $SYS_write,%eax /* System call function: write, in %eax.  */
+       mov     $stdout,%ebx    /* 1st parameter: file descriptor, in %ebx. */
+       mov     $hello,%ecx     /* 2nd parameter: address, in %ecx. */
+       mov     $(bye-hello),%edx       /* 3rd parameter: byte count %edx. */
+       int     $0x80           /* Call system.  */
+
+       mov     $SYS_exit,%eax  /* System call function: exit, in %eax.  */
+       mov     $0,%ebx         /* 1st parameter: exit status, in %ebx. */
+       int     $0x80           /* Call system.  */
+       hlt                     /* Should not be reached.  */
+
+       .data
+hello: .ascii  "Hello, GNU Mes!\n"
+bye:   .byte   0
diff --git a/lib/linux/x86-mes-mescc/exit-42.S b/lib/linux/x86-mes-mescc/exit-42.S
new file mode 100644 (file)
index 0000000..9a3a808
--- /dev/null
@@ -0,0 +1,28 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+DEFINE sys_exit 01
+
+:main
+       mov____$i8,%eax !42
+       mov____%eax,%ebx
+       mov____$i8,%eax sys_exit
+       int____$0x80
+
+:ELF_data
+:HEX2_data
diff --git a/lib/linux/x86-mes-mescc/hello-mes.S b/lib/linux/x86-mes-mescc/hello-mes.S
new file mode 100644 (file)
index 0000000..3b26c77
--- /dev/null
@@ -0,0 +1,40 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+DEFINE sys_exit  01
+DEFINE sys_write 04
+
+:main
+       mov____$i8,%eax !end_hello_message>hello_message
+       mov____%eax,%ecx
+       mov____$i8,%eax !0
+       mov____%eax,%ebx
+       mov____$i8,%eax sys_write
+       int____$0x80
+
+       mov____$i8,%eax !0
+       mov____%eax,%ebx
+       mov____$i8,%eax sys_exit
+       int____$0x80
+
+:ELF_data
+:hello_message
+"Hello, GNU Mes!
+"
+:end_hello_message
+:HEX2_data
diff --git a/lib/linux/x86-mes/elf32-0exit-42.hex2 b/lib/linux/x86-mes/elf32-0exit-42.hex2
new file mode 100644 (file)
index 0000000..4d3b6a0
--- /dev/null
@@ -0,0 +1,34 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf32-exit-42.hex2: `exit 42' for i686-linux written in hex2 assembly,
+# for usage with elf32-0header.hex2.  This produces a 112-byte binary
+# (70 hex).  Inspiration was taken from GNU Gcc output of exit-42.S.
+
+### Code:
+
+# @60
+:ELF_text
+b8 01 00 00 00                 # mov    $1, %eax
+bb 2a 00 00 00                 # mov    $42, %ebx
+cd 80                          # int    $0x80
+f4                             # hlt
+00 00 00                       # align to @70
+:ELF_end
diff --git a/lib/linux/x86-mes/elf32-0header.hex2 b/lib/linux/x86-mes/elf32-0header.hex2
new file mode 100644 (file)
index 0000000..c8a6c7f
--- /dev/null
@@ -0,0 +1,85 @@
+### Copyright (C) 2016 Jeremiah Orians
+### Copyright (C) 2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf32-0header.hex2: Simplest 32 bit elf header in hex2.  Only a text
+# segment, no data segment, no symbol tables.
+
+# stage0's hex2 format for x86
+#    !<label>          1 byte relative
+#    $<label>          2 byte address
+#    @<label>          2 byte relative
+#    &<label>          4 byte address
+#    %<label>          4 byte relative
+#    local_<label>     function-local
+#    string_<index>    string #<index>
+
+### Code:
+
+:ELF_base
+7F 45 4C 46                    # e_ident[EI_MAG0-3] ELF's magic number
+
+01                             # e_ident[EI_CLASS] Indicating 32 bit
+01                             # e_ident[EI_DATA] Indicating little endianness
+01                             # e_ident[EI_VERSION] Indicating original elf
+
+00                             # e_ident[EI_OSABI] Set at 0 because none cares
+00                             # e_ident[EI_ABIVERSION] See above
+
+00 00 00 00 00 00 00           # e_ident[EI_PAD]
+
+02 00                          # e_type Indicating Executable
+03 00                          # e_machine Indicating 32bit x86
+01 00 00 00                    # e_version Indicating original elf
+
+&ELF_text                      # e_entry Address of the entry point
+%ELF_program_headers>ELF_base  # e_phoff Address of program header table
+00 00 00 00                    # e_shoff Address of section header table
+
+00 00 00 00                    # e_flags
+
+34 00                          # e_ehsize Indicating our 52 Byte header
+
+20 00                          # e_phentsize size of a program header table
+01 00                          # e_phnum number of entries in program table
+
+00 00                          # e_shentsize size of a section header table
+00 00                          # e_shnum number of entries in section table
+
+00 00                          # e_shstrndx index of the section names
+
+# @34
+00 00 00 00
+00 00 00 00
+00 00 00 00
+
+# @40
+:ELF_program_headers
+:ELF_program_header__text
+01 00 00 00                    # ph_type: PT-LOAD = 1
+00 00 00 00                    # ph_offset
+&ELF_base                      # ph_vaddr
+&ELF_base                      # ph_physaddr
+%ELF_end>ELF_base              # ph_filesz
+%ELF_end>ELF_base              # ph_memsz
+07 00 00 00                    # ph_flags: PF-X|PF-W|PF-R = 7
+01 00 00 00                    # ph_align
+
+# @60
+:ELF_text
diff --git a/lib/linux/x86-mes/elf32-0hello-mes.hex2 b/lib/linux/x86-mes/elf32-0hello-mes.hex2
new file mode 100644 (file)
index 0000000..7c07d25
--- /dev/null
@@ -0,0 +1,53 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf32-0hello-mes.hex2: `Hello, GNU Mes!' for i686-linux written in
+# hex2 assembly, for usage with elf32-0header.hex2.  This produces a
+# 160-byte binary (a0 hex).  Inspiration was taken from GNU Gcc output
+# of hello-mes.S.
+
+### Code:
+
+# @60
+:ELF_text
+
+                               # print <hello>
+b8 04 00 00 00                 # mov    $4,%eax
+bb 00 00 00 00                 # mov    $1,%ebx
+b9 &hello                      # mov    $hello,%ecx
+ba %bye>hello                  # mov    $(bye-hello),%edx
+cd 80                          # int    $0x80
+
+                               # exit 0
+b8 01 00 00 00                 # mov    $1,%eax
+bb 00 00 00 00                 # mov    $0,%ebx
+cd 80                          # int    $0x80
+f4                             # hlt
+
+00 00 00 00 00 00 00 00 00 00  # align to @90
+00 00 00
+
+# @90
+:ELF_data
+:hello
+48 65 6c 6c 6f 2c 20 47        # Hello, G
+4e 55 20 4d 65 73 21 0a        # NU Mes!\n
+:bye
+:ELF_end
diff --git a/lib/linux/x86-mes/elf32-body-exit-42.hex2 b/lib/linux/x86-mes/elf32-body-exit-42.hex2
new file mode 100644 (file)
index 0000000..98c12cb
--- /dev/null
@@ -0,0 +1,50 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf32-body-exit-42.hex2: `exit 42' for i686-linux written in hex2
+# assembly, for usage with generic elf32-header.hex2 and
+# elf32-footer-single-main.hex.
+
+# This ELF binary contains a symbol table, which means that objdump and
+# gdb can be used to inspect and debug.
+
+### Code:
+
+# @200
+:ELF_text
+:_start
+e8 %main                       # call   +11 <main>
+00 00 00
+00 00 00 00
+00 00 00 00
+
+# @210
+:main
+bb 2a 00 00 00                 # mov    $42,%ebx
+b8 01 00 00 00                 # mov    $0x1,%eax
+cd 80                          # int    $0x80
+f4                             # hlt
+
+00 00 00                       # align
+
+# @220
+:ELF_data
+65 78 69 74 34 32 20 64 61 74 61 20 68 65 72 65 # exit42 data here"
+00
diff --git a/lib/linux/x86-mes/elf32-body-hello-mes.hex2 b/lib/linux/x86-mes/elf32-body-hello-mes.hex2
new file mode 100644 (file)
index 0000000..5741133
--- /dev/null
@@ -0,0 +1,63 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf32-body-hello-mes.hex2: `Hello, GNU Mes!' for i686-linux written in
+# hex2 assembly, for usage with generic elf32-header.hex2 and
+# elf32-footer-single-main.hex.
+
+# This ELF binary contains a symbol table which means that objdump and
+# gdb can be used to inspect and debug.
+
+### Code:
+
+# @200
+:ELF_text
+:_start
+e8 %main                       # call   +11 <main>
+00 00 00
+00 00 00 00
+00 00 00 00
+
+# @210
+:main
+                               # print <hello>
+b8 04 00 00 00                 # mov    $4, %eax
+bb 00 00 00 00                 # mov    $1, %ebx
+b9 &hello                      # mov    $hello,%ecx
+ba %bye>hello                  # mov    $(bye-hello),%edx
+cd 80                          # int    $0x80
+
+                               # exit 0
+b8 01 00 00 00                 # mov    $0x1,%eax
+bb 00 00 00 00                 # mov    $0,%ebx
+cd 80                          # int    $0x80
+f4                             # hlt
+
+00 00 00 00 00 00 00 00 00 00  # align to @240
+00 00 00
+
+# @240
+:ELF_data
+:hello
+48 65 6c 6c 6f 2c 20 47        # Hello, G
+4e 55 20 4d 65 73 21 0a        # NU Mes!\n
+
+:bye
+00
diff --git a/lib/linux/x86-mes/elf32-footer-single-main.hex2 b/lib/linux/x86-mes/elf32-footer-single-main.hex2
new file mode 100644 (file)
index 0000000..5695055
--- /dev/null
@@ -0,0 +1,64 @@
+### Copyright (C) 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+### This file is part of stage0.
+###
+### stage0 is free software: you can redistribute it and/or modify
+### it under the terms of the GNU General Public License as published by
+### the Free Software Foundation, either version 3 of the License, or
+### (at your option) any later version.
+###
+### stage0 is distributed in the hope that it will be useful,
+### but WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with stage0.  If not, see <http://www.gnu.org/licenses/>.
+
+### stage0's hex2 format for x86
+###    !<label>          1 byte relative
+###    $<label>          2 byte address
+###    @<label>          2 byte relative
+###    &<label>          4 byte address
+###    %<label>          4 byte relative
+###    local_<label>     function-local
+###    string_<index>    string #<index>
+
+### elf32-footer-single-main.hex2: 32 bit elf footer in hex2 for single main
+
+# @230
+
+:ELF_str
+00                             # 0
+:ELF_str__start
+5f 73 74 61 72 74 00           # _start
+:ELF_str__main
+6d 61 69 6e 00                 # main
+
+00 00 00
+
+# @240
+:ELF_sym
+00 00 00 00                    # st-name
+00 00 00 00                    # st-offset: &_start - BaseAddress
+00 00 00 00                    # st-len   : &main - _start
+00                             # st-info = stt-func= 2
+00                             # st-other
+01 00                          # st-shndx: 1
+
+# _start
+%ELF_str__start>ELF_str        # st-name
+&_start
+10 00 00 00                    # st-len   : &main - _start
+02                             # st-info = stt-func= 2
+00                             # st-other
+01 00                          # st-shndx: 1
+
+# main
+%ELF_str__main>ELF_str         # st-name
+&main
+10 00 00 00                    # st-len   : &ELF_data - main
+02                             # st-info = stt-func= 2
+00                             # st-other
+01 00                          # st-shndx: 1
+
+:ELF_end
diff --git a/lib/linux/x86-mes/elf32-header.hex2 b/lib/linux/x86-mes/elf32-header.hex2
new file mode 100644 (file)
index 0000000..2624453
--- /dev/null
@@ -0,0 +1,225 @@
+### Copyright (C) 2016 Jeremiah Orians
+### Copyright (C) 2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf32-header.hex2: 32 bit elf header in hex2, with text segment, data
+# segment and symbol tables.
+
+# stage0's hex2 format for x86
+#    !<label>          1 byte relative
+#    $<label>          2 byte address
+#    @<label>          2 byte relative
+#    &<label>          4 byte address
+#    %<label>          4 byte relative
+#    local_<label>     function-local
+#    string_<index>    string #<index>
+
+### Code:
+
+:ELF_base
+7F 45 4C 46                    # e_ident[EI_MAG0-3] ELF's magic number
+
+01                             # e_ident[EI_CLASS] Indicating 32 bit
+01                             # e_ident[EI_DATA] Indicating little endianness
+01                             # e_ident[EI_VERSION] Indicating original elf
+
+00                             # e_ident[EI_OSABI] Set at 0 because none cares
+00                             # e_ident[EI_ABIVERSION] See above
+
+00 00 00 00 00 00 00           # e_ident[EI_PAD]
+
+02 00                          # e_type Indicating Executable
+03 00                          # e_machine Indicating 32bit x86
+01 00 00 00                    # e_version Indicating original elf
+
+&ELF_text                      # e_entry Address of the entry point
+%ELF_program_headers>ELF_base  # e_phoff Address of program header table
+%ELF_section_headers>ELF_base  # e_shoff Address of section header table
+
+00 00 00 00                    # e_flags
+
+34 00                          # e_ehsize Indicating our 52 Byte header
+
+20 00                          # e_phentsize size of a program header table
+01 00                          # e_phnum number of entries in program table
+
+28 00                          # e_shentsize size of a section header table
+07 00                          # e_shnum number of entries in section table
+
+04 00                          # e_shstrndx index of the section names
+
+# @34
+00 00 00 00
+00 00 00 00
+00 00 00 00
+
+# @40
+:ELF_program_headers
+:ELF_program_header__text
+01 00 00 00                    # ph_type: PT-LOAD = 1
+00 00 00 00                    # ph_offset
+&ELF_base                      # ph_vaddr
+&ELF_base                      # ph_physaddr
+%ELF_end>ELF_base              # ph_filesz
+%ELF_end>ELF_base              # ph_memsz
+07 00 00 00                    # ph_flags: PF-X|PF-W|PF-R = 7
+01 00 00 00                    # ph_align
+
+# @60
+#:ELF_program_header__data     # NOT USED
+                               # FIXME: linux 4.17 does not allow this overlap
+                               #    Uhuuh, elf segment at 0000000001000000
+                               #    requested but the memory is mapped already
+01 00 00 00                    # ph_type: PT-LOAD = 1
+00 00 00 00                    # ph_offset
+&ELF_base                      # ph_vaddr
+&ELF_base                      # ph_physaddr
+%ELF_end>ELF_base              # ph_filesz
+%ELF_end>ELF_base              # ph_memsz
+07 00 00 00                    # ph_flags: PF-X|PF-W|PF-R = 7
+01 00 00 00                    # ph_align
+
+# @80
+:ELF_comment
+4d 45 53 00                     # MES
+00 00 00 00                     # align
+00 00 00 00
+00 00 00 00
+
+4d 45 53 00                     # MES
+00 00 00 00                     # align
+00 00 00 00
+00 00 00 00
+
+# @a0
+:ELF_shstr
+00
+:ELF_shstr__text
+2e 74 65 78 74 00               # .text
+:ELF_shstr__data
+2e 64 61 74 61 00               # .data
+:ELF_shstr__comment
+2e 63 6f 6d 6d 65 6e 74 00      # .comment
+:ELF_shstr__shstr
+2e 73 68 73 74 72 74 61 62 00   # .shstrtab
+:ELF_shstr__sym
+2e 73 79 6d 74 61 62 00         # .symtab
+:ELF_shstr__str
+2e 73 74 72 74 61 62 00         # .strtab
+
+# @d0
+
+:ELF_section_headers
+00 00 00 00                     # sh_name
+00 00 00 00                     # sh_type
+00 00 00 00                     # sh_flags
+00 00 00 00                     # sh_addr
+00 00 00 00                     # sh_offset
+00 00 00 00                     # sh_length
+00 00 00 00                     # sh_link
+00 00 00 00                     # sh_info
+01 00 00 00                     # sh_1?
+00 00 00 00                     # sh_entsize
+
+## FIXME: M0 for calculations?
+:ELF_section_header_text
+%ELF_shstr__text>ELF_shstr      # sh_name
+01 00 00 00                     # sh_type = SHT_PROGBITS = 1
+06 00 00 00                     # sh_flags = SHF-ALLOC|SHF-EXEC =2 | 4 = 6
+&ELF_text                       # sh_addr
+%ELF_text>ELF_base              # sh_offset
+%ELF_data>ELF_text              # sh_length
+00 00 00 00                     # sh_link
+00 00 00 00                     # sh_info
+01 00 00 00                     # sh_1?
+00 00 00 00                     # sh_entsize
+
+:ELF_section_header_data
+%ELF_shstr__data>ELF_shstr     # sh_name
+01 00 00 00                    # sh_type = SHT_PROGBITS = 1
+03 00 00 00                    # sh_flags = SHF-WRITE|SHF-ALLOC = 1 | 2 = 3
+&ELF_data                      # sh_addr
+%ELF_data>ELF_base             # sh_offset
+%ELF_sym>ELF_data              # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00                    # sh_1?
+00 00 00 00                    # sh_entsize
+
+:ELF_section_header_comment
+%ELF_shstr__comment>ELF_shstr  # sh_name
+01 00 00 00                    # sh_type = SHT_PROGBITS = 1
+00 00 00 00                    # sh_flags
+&ELF_comment                   # sh_addr
+%ELF_comment>ELF_base          # sh_offset
+%ELF_shstr>ELF_comment         # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00                    # sh_1?
+00 00 00 00                    # sh_entsize
+
+:ELF_section_header_shstr
+%ELF_shstr__shstr>ELF_shstr    # sh_name
+03 00 00 00                    # sh_type: str-sht-strtab
+00 00 00 00                    # sh_flags
+&ELF_shstr                     # sh_addr
+%ELF_shstr>ELF_base            # sh_offset
+%ELF_section_headers>ELF_shstr # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00                    # sh_1?
+00 00 00 00                    # sh_entsize
+
+:ELF_section_header_sym
+%ELF_shstr__sym>ELF_shstr      # sh_name
+02 00 00 00                    # sh_type: str-sht-symtab
+00 00 00 00                    # sh_flags
+&ELF_sym                       # sh_addr
+%ELF_sym>ELF_base              # sh_offset
+%ELF_end>ELF_sym               # sh_length
+06 00 00 00                    # sh_link:6
+00 00 00 00                    # sh_info
+01 00 00 00                    # sh_1?
+10 00 00 00                    # sh_entsize
+
+:ELF_section_header_str
+%ELF_shstr__str>ELF_shstr      # sh_name
+03 00 00 00                    # sh_type: str-sht-strtab
+00 00 00 00                    # sh_flags
+&ELF_str                       # sh_addr
+%ELF_str>ELF_base              # sh_offset
+%ELF_sym>ELF_str               # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00                    # sh_1?
+00 00 00 00                    # sh_entsize
+
+# @1e8
+00 00 00 00  # align
+00 00 00 00
+
+# @1f0
+
+00 00 00 00  # align
+00 00 00 00
+00 00 00 00
+00 00 00 00
+
+# @200
+:ELF_text
diff --git a/lib/linux/x86_64-mes-gcc/exit-42.S b/lib/linux/x86_64-mes-gcc/exit-42.S
new file mode 100644 (file)
index 0000000..0e45bd0
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** Commentary: */
+
+/* Using gdb, esp. GUD in GNU Emacs is recommended
+M-x gdb-display-disassembly-buffer
+M-x gdb-display-io-buffer
+set disassemble-next-line on
+break _start
+run
+info registers
+si
+p/x $rax
+RET
+...
+*/
+
+/** Code: */
+
+SYS_exit = 0x3c                        /* Linux syscall: exit.  */
+       .globl _start           /* Magic linker symbol: --entry-address.  */
+
+       .text                   /* Program text. */
+_start:
+       movabs  $SYS_exit,%rax  /* System call function: exit, in %rax.  */
+       movabs  $42,%rdi        /* First parameter: exit status, in %rdi. */
+       syscall                 /* Call system.  */
+       hlt                     /* Should not be reached.  */
diff --git a/lib/linux/x86_64-mes-gcc/hello-mes.S b/lib/linux/x86_64-mes-gcc/hello-mes.S
new file mode 100644 (file)
index 0000000..ba9c89c
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** Commentary: */
+
+/* Using gdb, esp. GUD in GNU Emacs is recommended
+M-x gdb-display-disassembly-buffer
+M-x gdb-display-io-buffer
+set disassemble-next-line on
+break _start
+run
+info registers
+si
+p/x $rax
+RET
+...
+*/
+
+/** Code: */
+
+SYS_exit       = 0x3c          /* Linux syscalls.  */
+SYS_write      = 0x01
+stdout         = 1             /* File discriptor */
+       .globl _start           /* Magic linker symbol: --entry-address.  */
+
+       .text                   /* Program text. */
+_start:
+       movabs  $SYS_write,%rax /* System call function: write, in %rax.  */
+       movabs  $stdout,%rdi    /* 1st parameter: file descriptor, in %rdi. */
+       movabs  $hello,%rsi     /* 2nd parameter: address, in %rsi. */
+       movabs  $(bye-hello),%rdx       /* 3rd parameter: byte count %rdx. */
+       syscall                 /* Call system.  */
+
+       movabs  $SYS_exit,%rax  /* System call function: exit, in %rax.  */
+       movabs  $0,%rdi         /* 1st parameter: exit status, in %rdi. */
+       syscall                 /* Call system.  */
+       hlt                     /* Should not be reached.  */
+
+       .data
+hello: .ascii  "Hello, GNU Mes!\n"
+bye:   .byte   0
diff --git a/lib/linux/x86_64-mes-mescc/exit-42.S b/lib/linux/x86_64-mes-mescc/exit-42.S
new file mode 100644 (file)
index 0000000..8e8aa06
--- /dev/null
@@ -0,0 +1,28 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+DEFINE sys_exit 0x3c
+
+:main
+       mov____$i8,%eax !42
+       mov____%rax,%rbx
+       mov____$i8,%eax sys_exit
+       syscall
+
+:ELF_data
+:HEX2_data
diff --git a/lib/linux/x86_64-mes-mescc/hello-mes.S b/lib/linux/x86_64-mes-mescc/hello-mes.S
new file mode 100644 (file)
index 0000000..0dbe5a7
--- /dev/null
@@ -0,0 +1,40 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+DEFINE sys_exit  0x3c
+DEFINE sys_write 0x01
+
+:main
+       mov____$i8,%eax !end_hello_message>hello_message
+       mov____%rax,%rcx
+       mov____$i8,%eax !0
+       mov____%rax,%rbx
+       mov____$i8,%eax sys_write
+       syscall
+
+       mov____$i8,%eax !0
+       mov____%rax,%rbx
+       mov____$i8,%eax sys_exit
+       syscall
+
+:ELF_data
+:hello_message
+"Hello, GNU Mes!
+"
+:end_hello_message
+:HEX2_data
diff --git a/lib/linux/x86_64-mes/elf64-0exit-42.hex2 b/lib/linux/x86_64-mes/elf64-0exit-42.hex2
new file mode 100644 (file)
index 0000000..5be3faf
--- /dev/null
@@ -0,0 +1,36 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf64-exit-42.hex2: `exit 42' for x86_64-linux written in hex2
+# assembly, for usage with elf64-0header.hex2.  This produces a 160-byte
+# binary (a0 hex).  Inspiration was taken from GNU Gcc output of
+# exit-42.S.
+
+### Code:
+
+# @80
+:ELF_text
+48 b8 3c 00 00 00 00 00 00 00  # movabs $0x3c,%rax
+48 bf 2a 00 00 00 00 00 00 00  # movabs $42,%rdi
+0f 05                          # syscall
+f4                             # hlt
+
+00 00 00 00 00 00 00 00 00     # align to @a0
+:ELF_end
diff --git a/lib/linux/x86_64-mes/elf64-0header.hex2 b/lib/linux/x86_64-mes/elf64-0header.hex2
new file mode 100644 (file)
index 0000000..56aaa05
--- /dev/null
@@ -0,0 +1,83 @@
+### Copyright (C) 2016 Jeremiah Orians
+### Copyright (C) 2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf64-0header.hex2: Simplest 64 bit elf header in hex2.  Only a text
+# segment, no data segment, no symbol tables.
+
+# stage0's hex2 format for x86_64
+#    !<label>          1 byte relative
+#    $<label>          2 byte address
+#    @<label>          2 byte relative
+#    &<label>          4 byte address
+#    %<label>          4 byte relative
+#    local_<label>     function-local
+#    string_<index>    string #<index>
+
+### Code:
+
+:ELF_base
+7F 45 4C 46                    # e_ident[EI_MAG0-3] ELF's magic number
+
+02                             # e_ident[EI_CLASS] Indicating 64 bit
+01                             # e_ident[EI_DATA] Indicating little endianness
+01                             # e_ident[EI_VERSION] Indicating original elf
+
+00                             # e_ident[EI_OSABI] Set at 0 because none cares
+00                             # e_ident[EI_ABIVERSION] See above
+
+00 00 00 00 00 00 00           # e_ident[EI_PAD]
+
+02 00                          # e_type Indicating Executable
+3E 00                          # e_machine Indicating AMD64
+01 00 00 00                    # e_version Indicating original elf
+
+&ELF_text 00 00 00 00          # e_entry Address of the entry point
+%ELF_program_headers>ELF_base  # e_phoff Address of program header table
+  00 00 00 00
+
+00 00 00 00 00 00 00 00        # e_shoff Address of section header table
+
+00 00 00 00                    # e_flags
+
+40 00                          # e_ehsize Indicating our 64 Byte header
+
+38 00                          # e_phentsize size of a program header table
+01 00                          # e_phnum number of entries in program table
+
+00 00                          # e_shentsize size of a section header table
+00 00                          # e_shnum number of entries in section table
+
+00 00                          # e_shstrndx index of the section names
+
+# @40
+:ELF_program_headers
+:ELF_program_header__text
+01 00 00 00                    # ph_type: PT-LOAD = 1
+07 00 00 00                    # ph_flags: PF-X|PF-W|PF-R = 7
+00 00 00 00 00 00 00 00        # p_offset
+&ELF_base 00 00 00 00          # ph_vaddr
+&ELF_base 00 00 00 00          # ph_physaddr
+%ELF_end>ELF_base 00 00 00 00  # ph_filesz
+%ELF_end>ELF_base 00 00 00 00  # ph_memsz
+01 00 00 00 00 00 00 00        # ph_align
+
+00 00 00 00 00 00 00 00        # align to @80
+# @80
+:ELF_text
diff --git a/lib/linux/x86_64-mes/elf64-0hello-mes.hex2 b/lib/linux/x86_64-mes/elf64-0hello-mes.hex2
new file mode 100644 (file)
index 0000000..22ae310
--- /dev/null
@@ -0,0 +1,52 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf64-hello-mes.hex2: `Hello, GNU Mes!' for x86_64-linux written in
+# hex2 assembly, for usage with elf64-0header.hex2.  This produces a
+# 224-byte binary (e0 hex).  Inspiration was taken from GNU Gcc output
+# of hello-mes.S.
+
+### Code:
+
+# @80
+:ELF_text
+                               # print <hello>
+48 b8 01 00 00 00 00 00 00 00  # movabs $1,%rax
+48 bf 01 00 00 00 00 00 00 00  # movabs $1,%rdi
+48 be &hello 00 00 00 00       # movabs $<hello>,%rsi
+48 ba %bye>hello 00 00 00 00   # mov    $(bye-hello),%rdx
+0f 05                          # syscall
+
+                               # exit 0
+48 b8 3c 00 00 00 00 00 00 00  # movabs $0x3c,%rax
+48 bf 00 00 00 00 00 00 00 00  # movabs $0,%rdi
+0f 05                          # syscall
+f4                             # hlt
+
+00 00 00 00 00 00 00 00 00     # align to @d0
+00 00 00 00 00 00
+
+# @d0
+:ELF_data
+:hello
+48 65 6c 6c 6f 2c 20 47        # Hello, G
+4e 55 20 4d 65 73 21 0a        # NU Mes!\n
+:bye
+:ELF_end
diff --git a/lib/linux/x86_64-mes/elf64-body-exit-42.hex2 b/lib/linux/x86_64-mes/elf64-body-exit-42.hex2
new file mode 100644 (file)
index 0000000..c427b40
--- /dev/null
@@ -0,0 +1,51 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf64-body-exit-42.hex2: `exit 42' for x86_64-linux written in hex2
+# assembly, for usage with generic elf64-header.hex2 and
+# elf64-footer-single-main.hex.
+
+# This ELF binary contains a symbol table, which means that objdump and
+# gdb can be used to inspect and debug.
+
+### Code:
+
+# @300
+:ELF_text
+:_start
+# exit(42)
+e8 %main                       # call  +11 <main>
+00 00 00
+00 00 00 00
+00 00 00 00
+
+# @310
+:main
+48 b8 3c 00 00 00 00 00 00 00  # movabs $0x3c,%rax
+48 bf 2a 00 00 00 00 00 00 00  # movabs $42,%rdi
+0f 05                          # syscall
+f4                             # hlt
+
+00 00 00 00 00 00 00 00 00     # align to 330
+
+# @330
+:ELF_data
+65 78 69 74 34 32 20 64 61 74 61 20 68 65 72 65 # exit42 data here"
+00
diff --git a/lib/linux/x86_64-mes/elf64-body-hello-mes.hex2 b/lib/linux/x86_64-mes/elf64-body-hello-mes.hex2
new file mode 100644 (file)
index 0000000..19f3410
--- /dev/null
@@ -0,0 +1,63 @@
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf64-body-hello-mes.hex2: `Hello, GNU Mes!' for x86_64-linux written
+# in hex2 assembly, for usage with generic elf64-header.hex2 and
+# elf64-footer-single-main.hex.
+
+# This ELF binary contains a symbol table which means that objdump and
+# gdb can be used to inspect and debug.
+
+### Code:
+
+# @300
+:ELF_text
+:_start
+# exit(42)
+e8 %main                       # call  +11 <main>
+00 00 00
+00 00 00 00
+00 00 00 00
+
+# @310
+:main
+                               # print <hello>
+48 b8 01 00 00 00 00 00 00 00  # movabs $1,%rax
+48 bf 01 00 00 00 00 00 00 00  # movabs $1,%rdi
+48 be &hello 00 00 00 00       # movabs $<hello>,%rsi
+48 ba %bye>hello 00 00 00 00   # mov    $(bye-hello),%rdx
+0f 05                          # syscall
+
+                               # exit 0
+48 b8 3c 00 00 00 00 00 00 00  # movabs $0x3c,%rax
+48 bf 00 00 00 00 00 00 00 00  # movabs $0,%rdi
+0f 05                          # syscall
+f4                             # hlt
+
+00 00 00 00 00 00 00 00 00     # align to @360
+00 00 00 00 00 00
+
+# @360
+:ELF_data
+:hello
+48 65 6c 6c 6f 2c 20 47        # Hello, G
+4e 55 20 4d 65 73 21 0a        # NU Mes!\n
+:bye
+:ELF_end
diff --git a/lib/linux/x86_64-mes/elf64-footer-single-main.hex2 b/lib/linux/x86_64-mes/elf64-footer-single-main.hex2
new file mode 100644 (file)
index 0000000..0e319c3
--- /dev/null
@@ -0,0 +1,62 @@
+### Copyright (C) 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+### This file is part of stage0.
+###
+### stage0 is free software: you can redistribute it and/or modify
+### it under the terms of the GNU General Public License as published by
+### the Free Software Foundation, either version 3 of the License, or
+### (at your option) any later version.
+###
+### stage0 is distributed in the hope that it will be useful,
+### but WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with stage0.  If not, see <http://www.gnu.org/licenses/>.
+
+### stage0's hex2 format for x86_64
+###    !<label>          1 byte relative
+###    $<label>          2 byte address
+###    @<label>          2 byte relative
+###    &<label>          4 byte address
+###    %<label>          4 byte relative
+###    local_<label>     function-local
+###    string_<index>    string #<index>
+
+# @230
+
+:ELF_str
+00                             # 0
+:ELF_str__start
+5f 73 74 61 72 74 00           # _start
+:ELF_str__main
+6d 61 69 6e 00                 # main
+
+00 00 00
+
+# @370
+:ELF_sym
+00 00 00 00                    # st-name
+00                             # st-info = stt-func= 2
+00                             # st-other
+01 00                          # st-shndx: 1
+00 00 00 00 00 00 00 00        # st-offset: &_start - BaseAddress
+00 00 00 00 00 00 00 00        # st-len   : &main - _start
+
+# _start
+%ELF_str__start>ELF_str        # st-name
+02                             # st-info = stt-func= 2
+00                             # st-other
+01 00                          # st-shndx: 1
+&_start 00 00 00 00
+10 00 00 00 00 00 00 00        # st-len   : &main - _start
+
+# main
+%ELF_str__main>ELF_str         # st-name
+02                             # st-info = stt-func= 2
+00                             # st-other
+01 00                          # st-shndx: 1
+&main 00 00 00 00
+10 00 00 00 00 00 00 00        # st-len   : &ELF_data - main
+
+:ELF_end
diff --git a/lib/linux/x86_64-mes/elf64-header.hex2 b/lib/linux/x86_64-mes/elf64-header.hex2
new file mode 100644 (file)
index 0000000..258e3da
--- /dev/null
@@ -0,0 +1,240 @@
+### Copyright (C) 2016 Jeremiah Orians
+### Copyright (C) 2017,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+###
+### This file is part of GNU Mes.
+###
+### GNU Mes is free software; you can redistribute it and/or modify it
+### under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 3 of the License, or (at
+### your option) any later version.
+###
+### GNU Mes is distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+# elf64-header.hex2: 64 bit elf header in hex2, with text segment, data
+# segment and symbol tables.
+
+# stage0's hex2 format for x86_64
+#    !<label>          1 byte relative
+#    $<label>          2 byte address
+#    @<label>          2 byte relative
+#    &<label>          4 byte address
+#    %<label>          4 byte relative
+#    local_<label>     function-local
+#    string_<index>    string #<index>
+
+### Code:
+
+:ELF_base
+7F 45 4c 46                    # e_ident[EI_MAG0-3] ELF's magic number
+
+02                             # e_ident[EI_CLASS] Indicating 64 bit
+01                             # e_ident[EI_DATA] Indicating little endianness
+01                             # e_ident[EI_VERSION] Indicating original elf
+
+00                             # e_ident[EI_OSABI] Set at 0 because none cares
+00                             # e_ident[EI_ABIVERSION] See above
+
+00 00 00 00 00 00 00           # e_ident[EI_PAD]
+
+# 0x10
+02 00                          # e_type Indicating Executable
+3e 00                          # e_machine Indicating AMD64
+01 00 00 00                    # e_version Indicating original elf
+
+# 0x18
+&ELF_text 00 00 00 00          # e_entry Address of the entry point
+%ELF_program_headers>ELF_base  # e_phoff Address of program header table
+  00 00 00 00
+
+%ELF_section_headers>ELF_base  # e_shoff Address of section header table
+  00 00 00 00
+
+00 00 00 00                    # e_flags
+
+40 00                          # e_ehsize Indicating our 64 Byte header
+
+38 00                          # e_phentsize size of a program header table
+01 00                          # e_phnum number of entries in program table
+
+40 00                          # e_shentsize size of a section header table
+07 00                          # e_shnum number of entries in section table
+
+04 00                          # e_shstrndx index of the section names
+
+# @40
+:ELF_program_headers
+:ELF_program_header__text
+01 00 00 00                    # ph_type: PT-LOAD = 1
+07 00 00 00                    # ph_flags: PF-X|PF-W|PF-R = 7
+00 00 00 00 00 00 00 00        # p_offset
+&ELF_base 00 00 00 00          # ph_vaddr
+&ELF_base 00 00 00 00          # ph_physaddr
+%ELF_end>ELF_base 00 00 00 00  # ph_filesz
+%ELF_end>ELF_base 00 00 00 00  # ph_memsz
+01 00 00 00 00 00 00 00        # ph_align
+
+
+# @60
+#:ELF_program_header__data     # NOT USED
+                               # FIXME: linux 4.17 does not allow this overlap
+                               #    Uhuuh, elf segment at 0000000001000000
+                               #    requested but the memory is mapped already
+01 00 00 00                    # ph_type: PT-LOAD = 1
+07 00 00 00                    # ph_flags: PF-X|PF-W|PF-R = 7
+00 00 00 00 00 00 00 00        # ph_offset
+&ELF_base 00 00 00 00          # ph_vaddr
+&ELF_base 00 00 00 00          # ph_physaddr
+%ELF_end>ELF_base 00 00 00 00  # ph_filesz
+%ELF_end>ELF_base 00 00 00 00  # ph_memsz
+01 00 00 00 00 00 00 00        # ph_align
+
+# @b0
+:ELF_comment
+4d 45 53 00                     # MES
+00 00 00 00                     # align
+00 00 00 00
+00 00 00 00
+
+# @c0
+4d 45 53 00                     # MES
+00 00 00 00                     # align
+00 00 00 00
+00 00 00 00
+
+# @d0
+:ELF_shstr
+00
+:ELF_shstr__text
+2e 74 65 78 74 00               # .text
+:ELF_shstr__data
+2e 64 61 74 61 00               # .data
+:ELF_shstr__comment
+2e 63 6f 6d 6d 65 6e 74 00      # .comment
+:ELF_shstr__shstr
+2e 73 68 73 74 72 74 61 62 00   # .shstrtab
+:ELF_shstr__sym
+2e 73 79 6d 74 61 62 00         # .symtab
+:ELF_shstr__str
+2e 73 74 72 74 61 62 00         # .strtab
+
+# @100
+
+:ELF_section_headers
+00 00 00 00                     # sh_name
+00 00 00 00                     # sh_type
+00 00 00 00 00 00 00 00         # sh_flags
+00 00 00 00 00 00 00 00         # sh_addr
+00 00 00 00 00 00 00 00         # sh_offset
+00 00 00 00 00 00 00 00         # sh_length
+00 00 00 00                     # sh_link
+00 00 00 00                     # sh_info
+00 00 00 00 00 00 00 00         # sh_1?
+00 00 00 00 00 00 00 00         # sh_entsize
+
+## FIXME: M0 for calculations?
+:ELF_section_header_text
+%ELF_shstr__text>ELF_shstr      # sh_name
+01 00 00 00                     # sh_type = SHT_PROGBITS = 1
+06 00 00 00 00 00 00 00         # sh_flags = SHF-ALLOC|SHF-EXEC =2 | 4 = 6
+&ELF_text 00 00 00 00           # sh_addr
+%ELF_text>ELF_base 00 00 00 00  # sh_offset
+%ELF_data>ELF_text 00 00 00 00  # sh_length
+00 00 00 00                     # sh_link
+00 00 00 00                     # sh_info
+01 00 00 00 00 00 00 00         # sh_1?
+00 00 00 00 00 00 00 00         # sh_entsize
+
+:ELF_section_header_data
+%ELF_shstr__data>ELF_shstr     # sh_name
+01 00 00 00                    # sh_type = SHT_PROGBITS = 1
+03 00 00 00 00 00 00 00        # sh_flags = SHF-WRITE|SHF-ALLOC = 1 | 2 = 3
+&ELF_data 00 00 00 00          # sh_addr
+%ELF_data>ELF_base 00 00 00 00 # sh_offset
+%ELF_sym>ELF_data 00 00 00 00  # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00 00 00 00 00        # sh_1?
+00 00 00 00 00 00 00 00        # sh_entsize
+
+:ELF_section_header_comment
+%ELF_shstr__comment>ELF_shstr  # sh_name
+01 00 00 00                    # sh_type = SHT_PROGBITS = 1
+00 00 00 00 00 00 00 00        # sh_flags
+&ELF_comment 00 00 00 00       # sh_addr
+%ELF_comment>ELF_base 00 00 00 00 # sh_offset
+%ELF_shstr>ELF_comment 00 00 00 00 # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00 00 00 00 00        # sh_1?
+00 00 00 00 00 00 00 00        # sh_entsize
+
+:ELF_section_header_shstr
+%ELF_shstr__shstr>ELF_shstr    # sh_name
+03 00 00 00                    # sh_type: str-sht-strtab
+00 00 00 00 00 00 00 00        # sh_flags
+&ELF_shstr 00 00 00 00         # sh_addr
+%ELF_shstr>ELF_base 00 00 00 00 # sh_offset
+%ELF_section_headers>ELF_shstr 00 00 00 00 # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00 00 00 00 00        # sh_1?
+00 00 00 00 00 00 00 00        # sh_entsize
+
+:ELF_section_header_sym
+%ELF_shstr__sym>ELF_shstr      # sh_name
+02 00 00 00                    # sh_type: str-sht-symtab
+00 00 00 00 00 00 00 00        # sh_flags
+&ELF_sym 00 00 00 00           # sh_addr
+%ELF_sym>ELF_base 00 00 00 00  # sh_offset
+%ELF_end>ELF_sym 00 00 00 00   # sh_length
+06 00 00 00                    # sh_link:6
+00 00 00 00                    # sh_info
+01 00 00 00 00 00 00 00        # sh_1?
+18 00 00 00 00 00 00 00        # sh_entsize
+
+:ELF_section_header_str
+%ELF_shstr__str>ELF_shstr      # sh_name
+03 00 00 00                    # sh_type: str-sht-strtab
+00 00 00 00 00 00 00 00        # sh_flags
+&ELF_str 00 00 00 00           # sh_addr
+%ELF_str>ELF_base 00 00 00 00  # sh_offset
+%ELF_sym>ELF_str 00 00 00 00   # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00 00 00 00 00        # sh_1?
+00 00 00 00 00 00 00 00        # sh_entsize
+
+# @2c0
+00 00 00 00  # align
+00 00 00 00
+00 00 00 00
+00 00 00 00
+
+# @2d0
+00 00 00 00  # align
+00 00 00 00
+00 00 00 00
+00 00 00 00
+
+# @2e0
+00 00 00 00  # align
+00 00 00 00
+00 00 00 00
+00 00 00 00
+
+# @2f0
+00 00 00 00  # align
+00 00 00 00
+00 00 00 00
+00 00 00 00
+
+# @300
+:ELF_text
diff --git a/lib/mach/mach-init.c b/lib/mach/mach-init.c
new file mode 100644 (file)
index 0000000..3d64975
--- /dev/null
@@ -0,0 +1,75 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 1992-2016 Free Software Foundation, Inc.
+ * Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** Commentary:
+    Taken from GNU C Library
+ */
+
+#define _GNU_SOURCE 1
+#define __USE_GNU 1
+#define __FILE_defined 1
+
+#include <stdio.h>
+#include <mach/mach-init.h>
+#include <mach.h>
+#include <unistd.h>
+
+mach_port_t __mach_task_self_;
+mach_port_t __mach_host_self_;
+vm_size_t __vm_page_size = 0;
+
+void
+__mach_init (void)
+{
+  kern_return_t err;
+
+#ifdef HAVE_HOST_PAGE_SIZE
+  if (err = __host_page_size (mach_host_self (), &__vm_page_size))
+    _exit (err);
+#else
+  {
+    vm_statistics_data_t stats;
+    if (err = __vm_statistics (mach_task_self (), &stats))
+      _exit (err);
+    __vm_page_size = stats.pagesize;
+  }
+#endif
+}
+
+extern mach_port_t __mach_host_self (void);
+
+mach_port_t
+mach_host_self (void)
+{
+  if (!__mach_host_self_)
+    __mach_host_self_ = __mach_host_self ();
+  return __mach_host_self_;
+}
+
+extern mach_port_t __mach_task_self (void);
+
+mach_port_t
+mach_task_self (void)
+{
+  if (!__mach_task_self_)
+    __mach_task_self_ = __mach_task_self ();
+  return __mach_task_self_;
+}
diff --git a/lib/mach/mach_host_self.S b/lib/mach/mach_host_self.S
new file mode 100644 (file)
index 0000000..f70792c
--- /dev/null
@@ -0,0 +1,3 @@
+#include <mach/machine/syscall_sw.h>
+kernel_trap (__mach_host_self,-29,0)
+// weak_alias (__mach_host_self, mach_host_self)
diff --git a/lib/mach/mach_msg_trap.S b/lib/mach/mach_msg_trap.S
new file mode 100644 (file)
index 0000000..d440c05
--- /dev/null
@@ -0,0 +1,3 @@
+#include <mach/machine/syscall_sw.h>
+kernel_trap (__mach_msg_trap,-25,7)
+// weak_alias (__mach_msg_trap, mach_msg_trap)
diff --git a/lib/mach/mach_reply_port.S b/lib/mach/mach_reply_port.S
new file mode 100644 (file)
index 0000000..9a27b19
--- /dev/null
@@ -0,0 +1,3 @@
+#include <mach/machine/syscall_sw.h>
+kernel_trap (__mach_reply_port,-26,0)
+// weak_alias (__mach_reply_port, mach_reply_port)
diff --git a/lib/mach/mach_task_self.S b/lib/mach/mach_task_self.S
new file mode 100644 (file)
index 0000000..6ce2052
--- /dev/null
@@ -0,0 +1,3 @@
+#include <mach/machine/syscall_sw.h>
+kernel_trap (__mach_task_self,-28,0)
+// weak_alias (__mach_task_self, mach_task_self)
diff --git a/lib/mach/mach_thread_self.S b/lib/mach/mach_thread_self.S
new file mode 100644 (file)
index 0000000..75a8097
--- /dev/null
@@ -0,0 +1,19 @@
+#if 1  
+#include <mach/machine/syscall_sw.h>
+kernel_trap (__mach_thread_self,-27,0)
+// weak_alias (__mach_thread_self, mach_thread_self)
+#else
+        .globl __mach_thread_self
+        .type __mach_thread_self,@function
+        .align 1<<4
+__mach_thread_self: .cfi_startproc
+        movl $ -27,%eax
+        .byte 0x9a
+        .long 0
+        .word 0x7
+        ret
+        .cfi_endproc
+        .size __mach_thread_self,.-__mach_thread_self
+        .weak mach_thread_self 
+        mach_thread_self = __mach_thread_self
+#endif
diff --git a/lib/mach/msg.c b/lib/mach/msg.c
new file mode 100644 (file)
index 0000000..79b19ed
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989, 1995 Carnegie Mellon University
+ * All Rights Reserved.
+ *
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+#include <mach/port.h>
+#include <mach/message.h>
+
+#ifdef MACH_MSG_OVERWRITE
+/* In variants with this feature, the actual system call is
+   __mach_msg_overwrite_trap.  */
+mach_msg_return_t
+__mach_msg_trap (mach_msg_header_t *msg,
+                mach_msg_option_t option,
+                mach_msg_size_t send_size,
+                mach_msg_size_t rcv_size,
+                mach_port_t rcv_name,
+                mach_msg_timeout_t timeout,
+                mach_port_t notify)
+{
+  return __mach_msg_overwrite_trap (msg, option, send_size,
+                                   rcv_size, rcv_name, timeout, notify,
+                                   MACH_MSG_NULL, 0);
+}
+weak_alias (__mach_msg_trap, mach_msg_trap)
+
+/* See comments below in __mach_msg.  */
+mach_msg_return_t
+__mach_msg_overwrite (mach_msg_header_t *msg,
+                     mach_msg_option_t option,
+                     mach_msg_size_t send_size,
+                     mach_msg_size_t rcv_size,
+                     mach_port_t rcv_name,
+                     mach_msg_timeout_t timeout,
+                     mach_port_t notify,
+                     mach_msg_header_t *rcv_msg,
+                     mach_msg_size_t rcv_msg_size)
+
+{
+  mach_msg_return_t ret;
+
+  /* Consider the following cases:
+     1. Errors in pseudo-receive (eg, MACH_SEND_INTERRUPTED
+     plus special bits).
+     2. Use of MACH_SEND_INTERRUPT/MACH_RCV_INTERRUPT options.
+     3. RPC calls with interruptions in one/both halves.
+  */
+
+  ret = __mach_msg_overwrite_trap (msg, option, send_size,
+                                  rcv_size, rcv_name, timeout, notify,
+                                  rcv_msg, rcv_msg_size);
+  if (ret == MACH_MSG_SUCCESS)
+    return MACH_MSG_SUCCESS;
+
+  if (!(option & MACH_SEND_INTERRUPT))
+    while (ret == MACH_SEND_INTERRUPTED)
+      ret = __mach_msg_overwrite_trap (msg, option, send_size,
+                                      rcv_size, rcv_name, timeout, notify,
+                                      rcv_msg, rcv_msg_size);
+
+  if (!(option & MACH_RCV_INTERRUPT))
+    while (ret == MACH_RCV_INTERRUPTED)
+      ret = __mach_msg_overwrite_trap (msg, option & ~MACH_SEND_MSG,
+                                      0, rcv_size, rcv_name, timeout, notify,
+                                      rcv_msg, rcv_msg_size);
+
+  return ret;
+}
+weak_alias (__mach_msg_overwrite, mach_msg_overwrite)
+#endif
+
+mach_msg_return_t
+__mach_msg (mach_msg_header_t *msg,
+           mach_msg_option_t option,
+           mach_msg_size_t send_size,
+           mach_msg_size_t rcv_size,
+           mach_port_t rcv_name,
+           mach_msg_timeout_t timeout,
+           mach_port_t notify)
+{
+  mach_msg_return_t ret;
+
+  /* Consider the following cases:
+     1. Errors in pseudo-receive (eg, MACH_SEND_INTERRUPTED
+     plus special bits).
+     2. Use of MACH_SEND_INTERRUPT/MACH_RCV_INTERRUPT options.
+     3. RPC calls with interruptions in one/both halves.
+     */
+
+  ret = __mach_msg_trap (msg, option, send_size,
+                        rcv_size, rcv_name, timeout, notify);
+  if (ret == MACH_MSG_SUCCESS)
+    return MACH_MSG_SUCCESS;
+
+  if (!(option & MACH_SEND_INTERRUPT))
+    while (ret == MACH_SEND_INTERRUPTED)
+      ret = __mach_msg_trap (msg, option, send_size,
+                            rcv_size, rcv_name, timeout, notify);
+
+  if (!(option & MACH_RCV_INTERRUPT))
+    while (ret == MACH_RCV_INTERRUPTED)
+      ret = __mach_msg_trap (msg, option & ~MACH_SEND_MSG,
+                            0, rcv_size, rcv_name, timeout, notify);
+
+  return ret;
+}
+// weak_alias (__mach_msg, mach_msg)
+
+mach_msg_return_t
+__mach_msg_send        (mach_msg_header_t *msg)
+{
+  return __mach_msg (msg, MACH_SEND_MSG,
+                    msg->msgh_size, 0, MACH_PORT_NULL,
+                    MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+}
+// weak_alias (__mach_msg_send, mach_msg_send)
+
+mach_msg_return_t
+__mach_msg_receive (mach_msg_header_t *msg)
+{
+  return __mach_msg (msg, MACH_RCV_MSG,
+                    0, msg->msgh_size, msg->msgh_local_port,
+                    MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+}
+// weak_alias (__mach_msg_receive, mach_msg_receive)
index e47cca53d5b51ad1ffa7ca53d34183d3e9a71afa..bac1f30994c03db87705a34e2cfacc9732a24875 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
+#if !__MESC__
+#define __READ_BUFFER_MAX 128
+int __read_buffer_max;
+#else /* FIXME: We want bin/mes-mescc's x86-linux sha256sum to stay the same. */
 #define __READ_BUFFER_MAX 100
+#define __read_buffer_max 100
+#endif
 
 struct __read_buffer
 {
@@ -36,7 +42,21 @@ void
 __buffered_read_init (int filedes)
 {
   if (!__read_cache)
-    __read_cache = (struct __read_buffer *) malloc (sizeof (struct __read_buffer) * __FILEDES_MAX);
+    {
+      __read_cache = (struct __read_buffer *) malloc (sizeof (struct __read_buffer) * __FILEDES_MAX);
+#if !__MESC__
+      __read_buffer_max = __READ_BUFFER_MAX;
+      char *p = getenv ("MES_READ_BUFFER");
+      if (p)
+        {
+          __read_buffer_max = atoi (p);
+          if (__read_buffer_max < 0)
+            __read_buffer_max = 0;
+          if (__read_buffer_max > __READ_BUFFER_MAX)
+            __read_buffer_max = __READ_BUFFER_MAX;
+        }
+#endif
+    }
 }
 
 size_t
@@ -55,23 +75,33 @@ __buffered_read (int filedes, void *buffer, size_t size)
   __buffered_read_init (filedes);
   struct __read_buffer *cache = &__read_cache[filedes];
   char *p = buffer;
-  if (!cache->size && size > __READ_BUFFER_MAX)
+  if (!cache->size && size > __read_buffer_max)
     return _read (filedes, buffer, size);
   while (cache->size > 0 && todo)
     {
       todo--;
-      *p++ = cache->string[__READ_BUFFER_MAX - cache->size--];
+      *p++ = cache->string[__read_buffer_max - cache->size--];
     }
   if (todo)
     {
-      ssize_t bytes = _read (filedes, cache->string, __READ_BUFFER_MAX);
+#if !__MESC__
+      if (todo > __read_buffer_max)
+        return size - todo + _read (filedes, p, todo);
+      if (__mes_debug () > 4)
+        {
+          eputs ("__buffered_read: ");
+          eputs (itoa (__read_buffer_max));
+          eputs ("\n");
+        }
+#endif
+      ssize_t bytes = _read (filedes, cache->string, __read_buffer_max);
       if (bytes < 0)
         return -1;
       if (bytes)
         {
           cache->size = bytes;
-          if (bytes < __READ_BUFFER_MAX)
-            memmove (cache->string + __READ_BUFFER_MAX - bytes, cache->string, bytes);
+          if (bytes < __read_buffer_max)
+            memmove (cache->string + __read_buffer_max - bytes, cache->string, bytes);
           return size - todo + __buffered_read (filedes, p, todo);
         }
     }
diff --git a/lib/mes/mini-write.c b/lib/mes/mini-write.c
new file mode 100644 (file)
index 0000000..30344ca
--- /dev/null
@@ -0,0 +1,36 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <mes/lib.h>
+#include <errno.h>
+
+ssize_t
+write (int filedes, void const *buffer, size_t size)
+{
+  int r = _write (filedes, buffer, size);
+  if (r < 0)
+    {
+      errno = -r;
+      r = -1;
+    }
+  else
+    errno = 0;
+  return r;
+}
diff --git a/lib/mes/write.c b/lib/mes/write.c
deleted file mode 100644 (file)
index 30344ca..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/* -*-comment-start: "//";comment-end:""-*-
- * GNU Mes --- Maxwell Equations of Software
- * Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
- *
- * This file is part of GNU Mes.
- *
- * GNU Mes is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * GNU Mes is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <mes/lib.h>
-#include <errno.h>
-
-ssize_t
-write (int filedes, void const *buffer, size_t size)
-{
-  int r = _write (filedes, buffer, size);
-  if (r < 0)
-    {
-      errno = -r;
-      r = -1;
-    }
-  else
-    errno = 0;
-  return r;
-}
diff --git a/lib/posix/buffered-read.c b/lib/posix/buffered-read.c
new file mode 100644 (file)
index 0000000..d47d5d1
--- /dev/null
@@ -0,0 +1,48 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PUR