提交 203de796 创建 作者: Austin Clements's avatar Austin Clements

Automatically generate user space syscall stubs

This requires adding flags to the magic syscall comment so that we can mark sys_exec as using INT instead of SYSCALL for entry.
上级 860627e6
......@@ -68,6 +68,11 @@ $(O)/%.o: %.S
$(Q)mkdir -p $(@D)
$(Q)$(CC) $(ASFLAGS) -c -o $@ $<
$(O)/%.o: $(O)/%.S
@echo " CC $@"
$(Q)mkdir -p $(@D)
$(Q)$(CC) $(ASFLAGS) -c -o $@ $<
xv6memfs.img: bootblock kernelmemfs
dd if=/dev/zero of=xv6memfs.img count=10000
dd if=bootblock of=xv6memfs.img conv=notrunc
......
......@@ -431,7 +431,7 @@ sys_chdir(const char *path)
return 0;
}
//SYSCALL
//SYSCALL INT
int
sys_exec(const char *upath, userptr<userptr<const char> > uargv)
{
......
$(O)/lib/%.o: CFLAGS:=$(CFLAGS) -DXV6_USER
$(O)/lib/%.o: CXXFLAGS:=$(CXXFLAGS) -DXV6_USER -fno-exceptions -fno-rtti
ULIB = ulib.o usys.o printf.o umalloc.o uthread.o fmt.o stream.o ipc.o \
threads.o crt.o wqlib.o wquser.o perf.o wqalloc.o
ULIB = ulib.o printf.o umalloc.o uthread.o fmt.o stream.o ipc.o \
threads.o crt.o wqlib.o wquser.o perf.o wqalloc.o sysstubs.o
ULIB := $(addprefix $(O)/lib/, $(ULIB))
$(O)/lib/sysstubs.S: tools/syscalls.py kernel/*.cc
@echo " GEN $@"
$(Q)mkdir -p $(@D)
$(Q)python $^ --ustubs > $@
.PRECIOUS: $(O)/lib/%.o
-include $(O)/lib/*.d
#include "syscall.h"
#include "traps.h"
#define SYSCALL_INT(name) \
.globl name; \
name: \
movq $SYS_ ## name, %rax; \
int $T_SYSCALL; \
ret
#define SYSCALL(name) \
.globl name; \
name: \
movq $SYS_ ## name, %rax; \
movq %rcx, %r10; \
syscall; \
ret
SYSCALL(fork)
SYSCALL(exit)
SYSCALL(wait)
SYSCALL(pipe)
SYSCALL(read)
SYSCALL(write)
SYSCALL(close)
SYSCALL(kill)
SYSCALL_INT(exec)
SYSCALL(openat)
SYSCALL(mknod)
SYSCALL(unlink)
SYSCALL(fstat)
SYSCALL(link)
SYSCALL(mkdirat)
SYSCALL(chdir)
SYSCALL(dup)
SYSCALL(getpid)
SYSCALL(sbrk)
SYSCALL(nsleep)
SYSCALL(uptime)
SYSCALL(map)
SYSCALL(unmap)
SYSCALL(halt)
SYSCALL(socket)
SYSCALL(bind)
SYSCALL(listen)
SYSCALL(accept)
SYSCALL(pread)
SYSCALL(async)
SYSCALL(script)
SYSCALL(setfs)
SYSCALL(wqwait)
SYSCALL(setaffinity)
SYSCALL(futex)
......@@ -5,6 +5,8 @@ def main():
parser = OptionParser(usage="usage: %prog [options] source...")
parser.add_option("--kvectors", action="store_true",
help="output kernel syscall vectors")
parser.add_option("--ustubs", action="store_true",
help="output user syscall stubs")
(options, args) = parser.parse_args()
if len(args) < 1:
......@@ -42,16 +44,34 @@ def main():
print
print "extern const int nsyscalls = %d;" % (max(bynum.keys()) + 1)
if options.ustubs:
print "#include \"traps.h\""
print
for syscall in syscalls:
print """\
.globl %(uname)s
%(uname)s:
movq $%(num)d, %%rax""" % syscall.__dict__
if "INT" in syscall.flags:
print " int $T_SYSCALL"
else:
print " movq %rcx, %r10\n syscall"
print " ret"
print
class Syscall(object):
def __init__(self, kname, rettype, kargs, num=None):
self.kname, self.rettype, self.kargs, self.num = \
kname, rettype, kargs, num
def __init__(self, kname, rettype, kargs, flags, num=None):
self.kname, self.rettype, self.kargs, self.flags, self.num = \
kname, rettype, kargs, flags, num
self.basename = kname[4:]
# Construct user space prototype
self.uname = self.basename
def __repr__(self):
return "Syscall(%r,%r,%r,%r)" % (
self.kname, self.rettype, self.kargs, self.num)
return "Syscall(%r,%r,%r,%r,%r)" % (
self.kname, self.rettype, self.kargs, self.flags, self.num)
class ParseError(RuntimeError):
def __init__(self, fname, msg):
......@@ -60,7 +80,7 @@ class ParseError(RuntimeError):
def parse(fp):
res = []
for proto in re.findall(r"//SYSCALL\n([^{]*)", fp.read()):
for flags, proto in re.findall(r"//SYSCALL(.*)([^{]*)", fp.read()):
# Parse the prototype
proto = " ".join(proto.split())
m = re.match(r"(.+) ([a-z_]+) *\(([^)]+)\)", proto)
......@@ -69,7 +89,7 @@ def parse(fp):
rettype, name, kargs = m.groups()
kargs = re.split(" *, *", kargs)
res.append(Syscall(name, rettype, kargs))
res.append(Syscall(name, rettype, kargs, flags.split()))
return res
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论