mescc: Mes C Library: Use __ as global internal prefix.
[mes.git] / lib / linux / x86_64-mes / crt1.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * GNU Mes --- Maxwell Equations of Software
3  * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of GNU Mes.
6  *
7  * GNU Mes is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * GNU Mes is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include "libmes-mini.h"
22 int main (int argc, char *argv[], char *envp[]);
23
24 int
25 _start ()
26 {
27   asm ("mov____$i8,%rax !0");
28   asm ("mov____%rax,0x32 &__stdin");
29
30   asm ("mov____$i8,%rax !1");
31   asm ("mov____%rax,0x32 &__stdout");
32
33   asm ("mov____$i8,%rax !2");
34   asm ("mov____%rax,0x32 &__stderr");
35
36 #if 0 //MES_CCAMD64
37   asm ("add____$i32,%rbp %0x80"); // FIXME: corresponds to x86_64/as.scm function-preamble-fu
38 #endif
39   asm ("mov____%rbp,%rax");
40   asm ("add____$i8,%rax !8");
41
42   asm ("mov____(%rax),%rax");
43   asm ("add____$i8,%rax !0x03");
44
45   asm ("shl____$i8,%rax !0x03");
46   asm ("add____%rbp,%rax");
47
48   // FIXME: 64-bit addresses...
49   asm ("mov____%rax,0x32 &environ");
50 #if 0 //MES_CCAMD64
51   asm ("mov____%rax,%rdx");     // amd
52 #else
53   asm ("push___%rax");          // bootstrap
54 #endif
55
56   asm ("mov____%rbp,%rax");
57   asm ("add____$i8,%rax !16");
58 #if 0 //MES_CCAMD64
59   asm ("mov____%rax,%rsi");     // amd
60 #else
61   asm ("push___%rax");          // bootstrap
62 #endif
63
64   asm ("mov____%rbp,%rax");
65   asm ("add____$i8,%rax !8");
66   asm ("mov____(%rax),%rax");
67 #if 0 //MES_CCAMD64
68   asm ("mov____%rax,%rdi");     // amd
69 #else
70   asm ("push___%rax");          // bootstrap
71 #endif
72
73   main ();
74
75   asm ("mov____%rax,%rdi");
76   asm ("mov____$i32,%rax %0x3c");
77   asm ("syscall");
78   asm ("hlt");
79 }