shithub: mc

Download patch

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