ref: 3f34c5ebfa25b7f6494c0097c6ea0e889745a82f
author: Ori Bernstein <[email protected]>
date: Tue Jul 17 13:58:27 EDT 2012
Initial commit. Some system calls for Linux.
--- /dev/null
+++ b/Makefile
@@ -1,0 +1,11 @@
+# don't build anything for 'all'
+all:
+ ./bld.sh
+.PHONY: clean
+clean:
+ @for i in `awk '{print $$1}' tests`; do \
+ echo rm -f $$i; \
+ rm -f $$i; \
+ done
+
+install:
--- /dev/null
+++ b/bld.sh
@@ -1,0 +1,36 @@
+#!/bin/bash
+
+# We have no dependency handling yet, so this is done via
+# a shell script. Also, we want to rebuild everything for
+# testing purposes on every run as things stand.
+
+export PATH=.:$PATH
+export MC=8m
+export MU=muse
+export CC=cc
+export ASOPT="-g"
+
+function use {
+ N=`basename $1 .myr`
+
+ echo $MU $1 -o $N.use && \
+ $MU $1 -o $N.use
+}
+
+function build {
+ N=`basename $1 .myr`
+
+ echo $MC $1 && \
+ $MC $1 -I.
+}
+
+function assem {
+ $CC $ASOPT -m32 -c $1
+}
+
+assem syscall.s
+use sys.myr
+build sys.myr
+build hello.myr
+
+$CC -m32 -o hello sys.o hello.o syscall.o
--- /dev/null
+++ b/hello.myr
@@ -1,0 +1,5 @@
+use "sys.use"
+
+const main = {
+ sys.write(1, "Hello world\n")
+}
--- /dev/null
+++ b/sys.myr
@@ -1,0 +1,74 @@
+pkg sys =
+ type scno = int
+ type fdopt = int
+ type statbuf = struct
+ dev : uint
+ ino : uint
+ mode : uint16
+ nlink : uint16
+ uid : uint16
+ gid : uint16
+ rdev : uint
+ size : uint
+ blksize : uint
+ blocks : uint
+ atime : uint
+ atimens : uint
+ mtime : uint
+ mtimens : uint
+ ctime : uint
+ ctimens : uint
+ _unused1: uint
+ _unused2: uint
+ ;;
+
+ const Rdonly : fdopt = 0x0
+ const Wronly : fdopt = 0x1
+ const Rdwr : fdopt = 0x2
+ const Append : fdopt = 0x80
+ const Creat : fdopt = 0x40
+ const Nofollow : fdopt = 0x20000
+ const Ndelay : fdopt = 0x800
+ const Trunc : fdopt = 0x200
+
+ const Sysexit : scno = 1
+ const Sysread : scno = 3
+ const Syswrite : scno = 4
+ const Sysopen : scno = 5
+ const Sysclose : scno = 6
+ const Syscreat : scno = 8
+ const Syslseek : scno = 19
+ const Sysfstat : scno = 108
+ const Syskill : scno = 37
+ const Sysgetpid : scno = 20
+ const Sysmmap2 : scno = 192
+ const Sysmunmap : scno = 91
+
+ extern const syscall : (sc:scno, count:int, args:... -> int)
+
+ const exit : (status:int -> int)
+ const getpid : ( -> int)
+ const kill : (pid:int, sig:int -> int)
+ const open : (path:char[,], opts:fdopt -> int)
+ const close : (fd:int -> int)
+ const creat : (path:char[,], mode:int -> int)
+ const read : (fd:int, buf:char[,] -> int)
+ const write : (fd:int, buf:char[,] -> int)
+ const lseek : (fd:int, off:uint, whence:int -> int)
+ const fstat : (fd:int, sb:statbuf* -> int)
+ const munmap : (addr:byte*, len:uint -> int)
+ const mmap : (add:byte*, len:uint, prot:uint, flags:uint, fd:int, off:uint)
+;;
+
+const exit = {status; -> syscall(Sysexit, 1);}
+const getpid = {; -> syscall(Sysgetpid, 1);}
+const kill = {pid, sig; -> syscall(Syskill, 2, pid, sig);}
+const open = {path, opts:fdopt; -> syscall(Sysopen, 2, path castto(char*), opts);}
+const close = {fd; -> syscall(Sysclose, 1, fd);}
+const creat = {path, mode; -> syscall(Syscreat, 2, path castto(char*), mode);}
+const read = {fd, buf; -> syscall(Sysread, 3, fd, buf castto(char*), buf.len);}
+const write = {fd, buf; -> syscall(Syswrite, 3, fd, buf castto(char*), buf.len);}
+const lseek = {fd, off, whence; -> syscall(Syslseek, 2, fd, off, whence);}
+const fstat = {fd, sb; -> syscall(Sysfstat, 2, fd, sb);}
+const munmap = {addr, len; -> syscall(Sysmunmap, 2, addr, len);}
+const mmap = {addr, len, prot, flags, fd, off; -> syscall(Sysmmap2, 6, addr, len, prot, flags, fd, off);}
--- /dev/null
+++ b/syscall.s
@@ -1,0 +1,33 @@
+.globl sys$syscall
+sys$syscall:
+ pushl %ebp
+ movl %esp,%ebp
+ movl 12(%ebp),%eax #count
+ shl $2,%eax
+ jmp *.jmptab(%eax)
+.jmptab:
+ .long .a0
+ .long .a1
+ .long .a2
+ .long .a3
+ .long .a4
+ .long .a5
+ .long .a6
+ /*
+ hack: 6 args uses %ebp, so we index
+ relative to %esp. This means that if
+ we actually start using stack space,
+ this code will need adjustment
+ */
+.a6: movl 36(%esp),%ebp
+.a5: movl 32(%esp),%edi
+.a4: movl 28(%esp),%esi
+.a3: movl 24(%esp),%edx
+.a2: movl 20(%esp),%ecx
+.a1: movl 16(%esp),%ebx
+ /* 12(%esp) holds nargs */
+.a0: movl 8(%esp),%eax
+ int $0x80
+ movl %ebp,%esp
+ popl %ebp
+ ret