diff --git a/flake.nix b/flake.nix index 3da6136..717dea2 100644 --- a/flake.nix +++ b/flake.nix @@ -184,6 +184,16 @@ exec cat ${docText} > options.md ''; }; + + generateSyscallTable = pkgs.mkShell { + # this should be made cross-platform via nix + shellHook = '' + exec ${pkgs.perl}/bin/perl \ + sandbox/seccomp/mksysnum_linux.pl \ + ${pkgs.linuxHeaders}/include/asm/unistd_64.h > \ + sandbox/seccomp/syscall_linux_amd64.go + ''; + }; } ); }; diff --git a/sandbox/seccomp/mksysnum_linux.pl b/sandbox/seccomp/mksysnum_linux.pl new file mode 100755 index 0000000..0df511c --- /dev/null +++ b/sandbox/seccomp/mksysnum_linux.pl @@ -0,0 +1,68 @@ +#!/usr/bin/env perl +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +use strict; + +my $command = "mksysnum_linux.pl ". join(' ', @ARGV); + +print < 999){ + # ignore deprecated syscalls that are no longer implemented + # https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/uapi/asm-generic/unistd.h?id=refs/heads/master#n716 + return; + } + (my $name_upper = $name) =~ y/a-z/A-Z/; + $num = $num + $offset; + if($num > 302){ # not wired in Go standard library + print " \"$name\": $num,\n"; + } + else{ + print " \"$name\": SYS_$name_upper,\n"; + } +} + +my $prev; +open(GCC, "gcc -E -dD $ARGV[0] |") || die "can't run gcc"; +while(){ + if(/^#define __NR_Linux\s+([0-9]+)/){ + # mips/mips64: extract offset + $offset = $1; + } + elsif(/^#define __NR_syscalls\s+/) { + # ignore redefinitions of __NR_syscalls + } + elsif(/^#define __NR_(\w+)\s+([0-9]+)/){ + $prev = $2; + fmt($1, $2); + } + elsif(/^#define __NR3264_(\w+)\s+([0-9]+)/){ + $prev = $2; + fmt($1, $2); + } + elsif(/^#define __NR_(\w+)\s+\(\w+\+\s*([0-9]+)\)/){ + fmt($1, $prev+$2) + } + elsif(/^#define __NR_(\w+)\s+\(__NR_Linux \+ ([0-9]+)/){ + fmt($1, $2); + } +} + +print <