diff --git a/.gitignore b/.gitignore index 1293e9ee..9d6c9774 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,7 @@ /util/local /util/devtable /util/tmp-gcc +/util/kuroko /kernel/symbols.S /base/usr/python /base/usr/bin/* diff --git a/Makefile b/Makefile index b5e3538d..4cc2a5b4 100644 --- a/Makefile +++ b/Makefile @@ -116,10 +116,10 @@ fatbase/kernel: ${KERNEL_ASMOBJS} ${KERNEL_OBJS} kernel/symbols.o ${EXTRALIB} # build the kernel as a flat binary or load it with less-capable # multiboot loaders and still get symbols, which we need to # load kernel modules and link them properly. -kernel/symbols.o: ${KERNEL_ASMOBJS} ${KERNEL_OBJS} util/generate_symbols.py ${EXTRALIB} +kernel/symbols.o: ${KERNEL_ASMOBJS} ${KERNEL_OBJS} util/generate_symbols.krk ${EXTRALIB} | util/kuroko -rm -f kernel/symbols.o ${KCC} -T kernel/link.ld ${KCFLAGS} -nostdlib -o .toaruos-kernel ${KERNEL_ASMOBJS} ${KERNEL_OBJS} ${LGCC} - ${KNM} .toaruos-kernel -g | util/generate_symbols.py > kernel/symbols.S + ${KNM} .toaruos-kernel -g | util/kuroko util/generate_symbols.krk > kernel/symbols.S ${KAS} ${KASFLAGS} kernel/symbols.S -o $@ -rm -f .toaruos-kernel @@ -196,11 +196,11 @@ base/lib/libc.so: ${LIBC_OBJS} | dirs crts base/lib/libm.so: util/lm.c | dirs crts $(CC) -nodefaultlibs -o $@ $(CFLAGS) -shared -fPIC $^ -lgcc -KUROKO_OBJS=$(patsubst %.c, %.o, $(filter-out kuroko/src/module_% kuroko/src/rline.c kuroko/src/kuroko.c, $(sort $(wildcard kuroko/src/*.c)))) +KUROKO_OBJS=$(patsubst %.c, %.o, $(filter-out kuroko/src/kuroko.c,$(sort $(wildcard kuroko/src/*.c)))) kuroko/%.o: kuroko/%.c $(CC) $(CFLAGS) -fPIC -c -o $@ $^ -KUROKO_CMODS=$(patsubst kuroko/src/module_%.c,%,$(wildcard kuroko/src/module_*.c)) $(patsubst lib/kuroko/%.c,%,$(wildcard lib/kuroko/*.c)) +KUROKO_CMODS=$(patsubst kuroko/src/modules/module_%.c,%,$(wildcard kuroko/src/modules/module_*.c)) $(patsubst lib/kuroko/%.c,%,$(wildcard lib/kuroko/*.c)) KUROKO_CMODS_X=$(foreach lib,$(KUROKO_CMODS),base/lib/kuroko/$(lib).so) KUROKO_CMODS_Y=$(foreach lib,$(KUROKO_CMODS),.make/$(lib).kmak) KUROKO_KRK_MODS=$(patsubst kuroko/modules/%.krk,base/lib/kuroko/%.krk,$(wildcard kuroko/modules/*.krk kuroko/modules/*/*.krk)) @@ -211,11 +211,15 @@ base/lib/kuroko/%.krk: kuroko/modules/%.krk @mkdir -p `dirname $@` cp $< $@ -.make/%.kmak: kuroko/src/module_%.c util/auto-dep.py | dirs - util/auto-dep.py --makekurokomod $< > $@ +MINIMAL_KUROKO = $(filter-out kuroko/src/modules/module_%,$(sort $(wildcard kuroko/src/*.c))) +util/kuroko: $(MINIMAL_KUROKO) + gcc -Ikuroko/src -DNO_RLINE -DSTATIC_ONLY -DKRK_DISABLE_THREADS -o $@ $^ -.make/%.kmak: lib/kuroko/%.c util/auto-dep.py | dirs - util/auto-dep.py --makekurokomod $< > $@ +.make/%.kmak: kuroko/src/modules/module_%.c util/auto-dep.krk | dirs util/kuroko + util/kuroko util/auto-dep.krk --makekurokomod $< > $@ + +.make/%.kmak: lib/kuroko/%.c util/auto-dep.krk | dirs util/kuroko + util/kuroko util/auto-dep.krk --makekurokomod $< > $@ ifeq (,$(findstring clean,$(MAKECMDGOALS))) -include ${KUROKO_CMODS_Y} @@ -230,8 +234,8 @@ base/lib/ld.so: linker/linker.c base/lib/libc.a | dirs $(CC) -static -Wl,-static $(CFLAGS) -o $@ -Os -T linker/link.ld $< # Shared Libraries -.make/%.lmak: lib/%.c util/auto-dep.py | dirs crts - util/auto-dep.py --makelib $< > $@ +.make/%.lmak: lib/%.c util/auto-dep.krk | dirs crts util/kuroko + util/kuroko util/auto-dep.krk --makelib $< > $@ ifeq (,$(findstring clean,$(MAKECMDGOALS))) -include ${LIBS_Y} @@ -243,8 +247,8 @@ fatbase/netinit: util/netinit.c base/lib/libc.a | dirs # Userspace applications -.make/%.mak: apps/%.c util/auto-dep.py | dirs crts - util/auto-dep.py --make $< > $@ +.make/%.mak: apps/%.c util/auto-dep.krk | dirs crts util/kuroko + util/kuroko util/auto-dep.krk --make $< > $@ ifeq (,$(findstring clean,$(MAKECMDGOALS))) -include ${APPS_Y} @@ -343,8 +347,9 @@ clean: rm -f base/lib/crt*.o rm -f ${MODULES} rm -f ${APPS_Y} ${LIBS_Y} ${EXT_LIBS_Y} - rm -f ${KUROKO_FILES} + rm -f ${KUROKO_FILES} ${KUROKO_CMODS_Y} ${KUROKO_CMODS_X} rm -f kuroko/src/*.o + rm -f util/kuroko ifneq (,$(findstring Microsoft,$(shell uname -r))) QEMU_ARGS=-serial mon:stdio -m 1G -rtc base=localtime -vnc :0 @@ -419,8 +424,8 @@ EXT_LIBS=$(patsubst ext/%.c,%,$(wildcard ext/*.c)) EXT_LIBS_X=$(foreach lib,$(EXT_LIBS),base/lib/libtoaru_$(lib).so) EXT_LIBS_Y=$(foreach lib,$(EXT_LIBS),.make/$(lib).elmak) -.make/%.elmak: ext/%.c util/auto-dep.py | dirs - util/auto-dep.py --makelib $< > $@ +.make/%.elmak: ext/%.c util/auto-dep.krk | dirs util/kuroko + util/kuroko util/auto-dep.krk --makelib $< > $@ ifeq (,$(findstring clean,$(MAKECMDGOALS))) -include ${EXT_LIBS_Y} diff --git a/apps/kuroko.c b/apps/kuroko.c index 0b9b1da0..b0e1a4d0 100644 --- a/apps/kuroko.c +++ b/apps/kuroko.c @@ -621,14 +621,39 @@ static void handleSigint(int sigNum) { krk_currentThread.flags |= KRK_THREAD_SIGNALLED; } +#ifndef _WIN32 static void handleSigtrap(int sigNum) { if (!krk_currentThread.frameCount) return; krk_currentThread.flags |= KRK_THREAD_SINGLE_STEP; } +#endif static void bindSignalHandlers(void) { +#if !defined(_WIN32) && !defined(__toaru__) + struct sigaction sigIntAction; + sigIntAction.sa_handler = handleSigint; + sigemptyset(&sigIntAction.sa_mask); + sigIntAction.sa_flags = 0; /* Do not restore the default, do not restart syscalls, do not pass go, do not collect $500 */ + sigaction( + SIGINT, /* ^C for keyboard interrupts */ + &sigIntAction, + NULL); + + struct sigaction sigTrapAction; + sigTrapAction.sa_handler = handleSigtrap; + sigemptyset(&sigTrapAction.sa_mask); + sigTrapAction.sa_flags = 0; + sigaction( + SIGTRAP, + &sigTrapAction, + NULL); +#else signal(SIGINT, handleSigint); +# ifndef _WIN32 signal(SIGTRAP, handleSigtrap); + /* No SIGTRAP on windows? */ +# endif +#endif } static void findInterpreter(char * argv[]) { diff --git a/kuroko b/kuroko index 06a00b4f..567a0037 160000 --- a/kuroko +++ b/kuroko @@ -1 +1 @@ -Subproject commit 06a00b4f0d6260000afd386551ef70c3eadfc59f +Subproject commit 567a0037319fb8d65a990aa31de3a6051bd91cd4 diff --git a/util/auto-dep.py b/util/auto-dep.krk similarity index 73% rename from util/auto-dep.py rename to util/auto-dep.krk index fb94c637..319fa15b 100755 --- a/util/auto-dep.py +++ b/util/auto-dep.krk @@ -1,15 +1,12 @@ -#!/usr/bin/env python3 -# coding: utf-8 +#!/bin/kuroko +import os, kuroko, fileio -import os -import sys +let cflags = "-O2 -g -std=gnu99 -I. -Iapps -pipe -mmmx -msse -msse2 -fplan9-extensions -Wall -Wextra -Wno-unused-parameter" -import subprocess - -cflags = "-O2 -g -std=gnu99 -I. -Iapps -pipe -mmmx -msse -msse2 -fplan9-extensions -Wall -Wextra -Wno-unused-parameter" - -class Classifier(object): +def basename(path): + return path.strip('/').split('/')[-1] +class Classifier: dependency_hints = { # Toaru Standard Library '': (None, '-ltoaru_kbd', []), @@ -53,42 +50,42 @@ class Classifier(object): for k in new: if not k in depends: depends.append(k) - _, _, other = self.dependency_hints[k] + let other = self.dependency_hints[k][2] depends = self._calculate(depends, other) return depends def _sort(self, depends): """Sort the list of dependencies so that elements appearing first depend on elements following.""" - satisfied = [] - a = depends[:] + let satisfied = [] + let a = depends[:] while set(satisfied) != set(depends): - b = [] + let b = [] for k in a: - if all([x in satisfied for x in self.dependency_hints[k][2]]): + if all(x in satisfied for x in self.dependency_hints[k][2]): satisfied.append(k) else: b.append(k) a = b[:] - return satisfied[::-1] + return reversed(satisfied) def _depends(self): """Calculate include and library dependencies.""" - lines = [] - depends = [] - with open(self.filename,'r') as f: + let lines = [] + let depends = [] + with fileio.open(self.filename,'r') as f: lines = f.readlines() for l in lines: if l.startswith('#include'): - depends.extend([k for k in list(self.dependency_hints.keys()) if l.startswith('#include ' + k)]) + depends.extend(k for k in list(self.dependency_hints.keys()) if l.startswith('#include ' + k)) elif l.startswith('/* auto-dep: export-dynamic */'): self.export_dynamic_hint = True depends = self._calculate([], depends) depends = self._sort(depends) - includes = [] - libraries = [] + let includes = [] + let libraries = [] for k in depends: - dep = self.dependency_hints[k] + let dep = self.dependency_hints[k] if dep[0]: includes.append('-I' + 'base/usr/include/' + dep[0]) if dep[1]: @@ -101,11 +98,11 @@ def todep(name): if name.startswith("-l"): name = name.replace("-l","",1) if name.startswith('toaru'): - return (True, "%s/lib%s.so" % ('base/lib', name)) + return (True, "{}/lib{}.so".format('base/lib', name)) elif name.startswith('kuroko'): - return (True, "%s/lib%s.so" % ('base/lib', name)) + return (True, "{}/lib{}.so".format('base/lib', name)) else: - return (True, "%s/lib%s.so" % ('base/usr/lib', name)) + return (True, "{}/lib{}.so".format('base/usr/lib', name)) else: return (False, name) @@ -116,37 +113,36 @@ def toheader(name): return '' if __name__ == "__main__": - if len(sys.argv) < 3: - print("usage: util/auto-dep.py command filename") - exit(1) - command = sys.argv[1] - filename = sys.argv[2] - - c = Classifier(filename) + if len(kuroko.argv) < 3: + print("usage: util/auto-dep.krk command filename") + return 1 + let command = kuroko.argv[1] + let filename = kuroko.argv[2] + let c = Classifier(filename) if command == "--cflags": print(" ".join([x for x in c.includes])) elif command == "--libs": print(" ".join([x for x in c.libs])) elif command == "--deps": - results = [todep(x) for x in c.libs] - normal = [x[1] for x in results if not x[0]] - order_only = [x[1] for x in results if x[0]] + let results = [todep(x) for x in c.libs] + let normal = [x[1] for x in results if not x[0]] + let order_only = [x[1] for x in results if x[0]] print(" ".join(normal) + " | " + " ".join(order_only)) elif command == "--build": - subprocess.run("gcc {cflags} {extra} {includes} -o {app} {source} {libraries}".format( + os.system("gcc {cflags} {extra} {includes} -o {app} {source} {libraries}".format( cflags=cflags, - app=os.path.basename(filename).replace(".c",""), + app=basename(filename).replace(".c",""), source=filename, headers=" ".join([toheader(x) for x in c.libs]), libraries=" ".join([x for x in c.libs]), includes=" ".join([x for x in c.includes if x is not None]), extra="-Wl,--export-dynamic" if c.export_dynamic_hint else "", - ), shell=True) + )) elif command == "--buildlib": - libname = os.path.basename(filename).replace(".c","") - _libs = [x for x in c.libs if not x.startswith('-ltoaru_') or x.replace("-ltoaru_","") != libname] - subprocess.run("gcc {cflags} {includes} -shared -fPIC -olibtoaru_{lib}.so {source} {libraries}".format( + let libname = basename(filename).replace(".c","") + let _libs = [x for x in c.libs if not x.startswith('-ltoaru_') or x.replace("-ltoaru_","") != libname] + os.system("gcc {cflags} {includes} -shared -fPIC -olibtoaru_{lib}.so {source} {libraries}".format( cflags=cflags, lib=libname, source=filename, @@ -154,21 +150,21 @@ if __name__ == "__main__": libraryfiles=" ".join([todep(x)[1] for x in _libs]), libraries=" ".join([x for x in _libs]), includes=" ".join([x for x in c.includes if x is not None]) - ),shell=True) + )) elif command == "--make": - print("base/bin/{app}: {source} {headers} util/auto-dep.py | {libraryfiles} $(LC)\n\t$(CC) $(CFLAGS) {extra} {includes} -o $@ $< {libraries}".format( - app=os.path.basename(filename).replace(".c",""), + print("base/bin/{app}: {source} {headers} util/auto-dep.krk | {libraryfiles} $(LC)\n\t$(CC) $(CFLAGS) {extra} {includes} -o $@ $< {libraries}".format( + app=basename(filename).replace(".c",""), source=filename, headers=" ".join([toheader(x) for x in c.libs]), libraryfiles=" ".join([todep(x)[1] for x in c.libs]), libraries=" ".join([x for x in c.libs]), includes=" ".join([x for x in c.includes if x is not None]), - extra="-Wl,--export-dynamic" if c.export_dynamic_hint else "", + extra="-Wl,--export-dynamic" if c.export_dynamic_hint else "" )) elif command == "--makelib": - libname = os.path.basename(filename).replace(".c","") - _libs = [x for x in c.libs if not x.startswith('-ltoaru_') or x.replace("-ltoaru_","") != libname] - print("base/lib/libtoaru_{lib}.so: {source} {headers} util/auto-dep.py | {libraryfiles} $(LC)\n\t$(CC) $(CFLAGS) {includes} -shared -fPIC -o $@ $< {libraries}".format( + let libname = basename(filename).replace(".c","") + let _libs = [x for x in c.libs if not x.startswith('-ltoaru_') or x.replace("-ltoaru_","") != libname] + print("base/lib/libtoaru_{lib}.so: {source} {headers} util/auto-dep.krk | {libraryfiles} $(LC)\n\t$(CC) $(CFLAGS) {includes} -shared -fPIC -o $@ $< {libraries}".format( lib=libname, source=filename, headers=" ".join([toheader(x) for x in c.libs]), @@ -177,9 +173,9 @@ if __name__ == "__main__": includes=" ".join([x for x in c.includes if x is not None]) )) elif command == "--makekurokomod": - libname = os.path.basename(filename).replace(".c","").replace("module_","") - _libs = [x for x in c.libs if not x.startswith('-ltoaru_') or x.replace("-ltoaru_","") != libname] - print("base/lib/kuroko/{lib}.so: {source} {headers} util/auto-dep.py | {libraryfiles} $(LC)\n\t$(CC) $(CFLAGS) {includes} -shared -fPIC -o $@ $< {libraries}".format( + let libname = basename(filename).replace(".c","").replace("module_","") + let _libs = [x for x in c.libs if not x.startswith('-ltoaru_') or x.replace("-ltoaru_","") != libname] + print("base/lib/kuroko/{lib}.so: {source} {headers} util/auto-dep.krk | {libraryfiles} $(LC)\n\t$(CC) $(CFLAGS) {includes} -shared -fPIC -o $@ $< {libraries}".format( lib=libname, source=filename, headers=" ".join([toheader(x) for x in c.libs]), @@ -188,3 +184,4 @@ if __name__ == "__main__": includes=" ".join([x for x in c.includes if x is not None]) )) + diff --git a/util/createramdisk.py b/util/createramdisk.py index 08f88b7c..525ec083 100644 --- a/util/createramdisk.py +++ b/util/createramdisk.py @@ -34,6 +34,9 @@ def file_filter(tarinfo): elif tarinfo.name in restricted_files: tarinfo.mode = restricted_files[tarinfo.name] + if tarinfo.name.startswith('usr/include/kuroko') and tarinfo.type == tarfile.SYMTYPE: + return None + if tarinfo.name.startswith('src'): # Let local own the files here tarinfo.uid = users.get('local') @@ -57,6 +60,7 @@ with tarfile.open('fatbase/ramdisk.img','w') as ramdisk: ramdisk.add('modules',arcname='/src/modules',filter=file_filter) if os.path.exists('tags'): ramdisk.add('tags',arcname='/src/tags',filter=file_filter) - ramdisk.add('util/build-the-world.py',arcname='/usr/bin/build-the-world.py',filter=file_filter) + ramdisk.add('util/auto-dep.krk',arcname='/usr/bin/auto-dep.krk',filter=file_filter) + ramdisk.add('kuroko/src/kuroko',arcname='/usr/include/kuroko',filter=file_filter) diff --git a/util/generate_symbols.krk b/util/generate_symbols.krk new file mode 100755 index 00000000..8c9b9f8d --- /dev/null +++ b/util/generate_symbols.krk @@ -0,0 +1,32 @@ +#!/usr/bin/env kuroko +''' +@brief Generate symbol table. +''' +import fileio + +let size = 'long' + +def extern(sym): + print(f'.extern {sym}') + print(f'.type {sym}, @function') + +def entry(sym): + print(f'.{size} {sym}') + print(f'.asciz "{sym}"') + +let ignore = ['abs','kernel_symbols_start','kernel_symbols_end'] +let lines = [x.strip().split(' ')[2] for x in fileio.stdin.readlines() if x not in ignore] + +print('.section .symbols') +print() +for name in lines: + extern(name) + +print('.global kernel_symbols_start') +print('kernel_symbols_start:') +print() +for name in lines: + entry(name) + +print('.global kernel_symbols_end') +print('kernel_symbols_end:') diff --git a/util/generate_symbols.py b/util/generate_symbols.py deleted file mode 100755 index d5907233..00000000 --- a/util/generate_symbols.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python3 -""" - Generate a symbol table from nm output. -""" - -import sys - -# Write extern + type -def extern(name): - print(".extern %s" % (name)) - print(".type %s, @function" % (name)) - print("") - -# Write an entry -def entry(name): - print(".long %s" % (name)) - print(".asciz \"%s\"" % (name)) - print("") - -ignore = [ "abs", "kernel_symbols_start", "kernel_symbols_end" ] -lines = [ x.strip().split(" ")[2] for x in sys.stdin.readlines() if x not in ignore ] - -# Generate the assembly -print(".section .symbols") -print("") -for name in lines: - extern(name) - -print(".global kernel_symbols_start") -print("kernel_symbols_start:") -print("") -for name in lines: - entry(name) - -print(".global kernel_symbols_end") -print("kernel_symbols_end:") - - -