summaryrefslogtreecommitdiff
path: root/os/init/evalinit.b
diff options
context:
space:
mode:
Diffstat (limited to 'os/init/evalinit.b')
-rw-r--r--os/init/evalinit.b119
1 files changed, 119 insertions, 0 deletions
diff --git a/os/init/evalinit.b b/os/init/evalinit.b
new file mode 100644
index 00000000..1e33c6f9
--- /dev/null
+++ b/os/init/evalinit.b
@@ -0,0 +1,119 @@
+implement Init;
+
+#
+# ARM evaluator 7t
+#
+
+include "sys.m";
+sys: Sys;
+FD, Connection, sprint, Dir: import sys;
+print, fprint, open, bind, mount, dial, sleep, read: import sys;
+
+include "draw.m";
+include "sh.m";
+draw: Draw;
+Context: import draw;
+
+Init: module
+{
+ init: fn();
+};
+
+Logon: module
+{
+ init: fn(ctxt: ref Context, argv: list of string);
+};
+
+Bootpreadlen: con 128;
+
+init()
+{
+ sys = load Sys Sys->PATH;
+# kr = load Keyring Keyring->PATH;
+# auth = load Auth Auth->PATH;
+# if(auth != nil)
+# auth->init();
+
+ sys->print("**\n** Inferno\n** Vita Nuova\n**\n");
+
+# sys->print("Setup boot net services ...\n");
+
+ #
+ # Setup what we need to call a server and
+ # Authenticate
+ #
+# bind("#l", "/net", sys->MREPL);
+# bind("#I", "/net", sys->MAFTER);
+ bind("#c", "/dev", sys->MAFTER);
+ bind("#r", "/dev", sys->MAFTER);
+# nvramfd := sys->open("#r/nvram", sys->ORDWR);
+# if(nvramfd != nil){
+# spec = "#Fnvram";
+# if(bind(spec, "/nvfs", sys->MAFTER) < 0)
+# print("init: bind %s: %r\n", spec);
+# }
+
+# setsysname();
+
+ #
+ # default namespace
+ #
+ bind("#c", "/dev", sys->MREPL); # console
+ bind("#t", "/dev", sys->MAFTER); # serial port
+ bind("#r", "/dev", sys->MAFTER); # RTC
+# if(spec != nil)
+# bind(spec, "/nvfs", sys->MBEFORE|sys->MCREATE); # our keys
+# bind("#l", "/net", sys->MBEFORE); # ethernet
+# bind("#I", "/net", sys->MBEFORE); # TCP/IP
+ bind("#p", "/prog", sys->MREPL); # prog device
+ sys->bind("#d", "/fd", Sys->MREPL);
+
+ sys->print("clock...\n");
+ setclock();
+
+ sys->print("logon...\n");
+
+# sys->chdir("/usr/inferno");
+# logon := load Logon "/dis/sh.dis";
+# spawn logon->init(dc, nil);
+ ts := load Sh "/dis/sh.dis";
+ ts->init(nil, nil);
+}
+
+setclock()
+{
+ (ok, dir) := sys->stat("/");
+ if (ok < 0) {
+ print("init: stat /: %r");
+ return;
+ }
+
+ fd := sys->open("/dev/time", sys->OWRITE);
+ if (fd == nil) {
+ print("init: open /dev/time: %r");
+ return;
+ }
+
+ # Time is kept as microsecs, atime is in secs
+ b := array of byte sprint("%d000000", dir.atime);
+ if (sys->write(fd, b, len b) != len b)
+ print("init: write /dev/time: %r");
+}
+
+#
+# Set system name from nvram
+#
+setsysname()
+{
+ fd := open("/nvfs/ID", sys->OREAD);
+ if(fd == nil)
+ return;
+ fds := open("/dev/sysname", sys->OWRITE);
+ if(fds == nil)
+ return;
+ buf := array[128] of byte;
+ nr := sys->read(fd, buf, len buf);
+ if(nr <= 0)
+ return;
+ sys->write(fds, buf, nr);
+}