Removed more code artifacts
This commit is contained in:
parent
222cf580e0
commit
fde87a9aa7
|
@ -1,147 +0,0 @@
|
|||
# run this as: jq -r -f SELF syscalls.json
|
||||
# download syscalls.json from https://syscalls.mebeim.net/db/x86/64/x64/v6.6/table.json
|
||||
|
||||
def asargs: join(", ");
|
||||
def csig: "\(.name)(\(.signature | asargs))";
|
||||
def indent(w): w + (split("\n") | join("\n" + w));
|
||||
def getargs: .signature | map(capture("(?<type>.*[^a-zA-Z_0-9]+)(?<name>[a-zA-Z_0-9]*)"));
|
||||
def strim: sub("^[[:space:]]+"; "") | sub("[[:space:]]+$"; "");
|
||||
def rawtype: gsub("const"; "") | strim;
|
||||
|
||||
# returns false if the given type may contain or be a pointer
|
||||
def isflat: [.] | inside([
|
||||
"char",
|
||||
"unsigned char",
|
||||
"int",
|
||||
"struct cachestat_range",
|
||||
"struct stat",
|
||||
"struct pollfd",
|
||||
"sigset_t",
|
||||
"fd_set",
|
||||
"struct __kernel_old_timeval",
|
||||
"struct __kernel_old_itimerval",
|
||||
"struct __kernel_timespec",
|
||||
"struct sockaddr",
|
||||
"void",
|
||||
"loff_t",
|
||||
"struct rusage",
|
||||
"struct new_utsname",
|
||||
"struct sembuf",
|
||||
"struct msqid_ds", # unused pointers
|
||||
"struct linux_dirent",
|
||||
"struct timezone",
|
||||
"struct rlimit",
|
||||
"struct sysinfo",
|
||||
"struct tms",
|
||||
"gid_t",
|
||||
"uid_t",
|
||||
"siginfo_t",
|
||||
"struct utimbuf",
|
||||
"struct ustat",
|
||||
"struct statfs",
|
||||
"struct sched_param",
|
||||
"struct __kernel_timex",
|
||||
"__kernel_old_time_t",
|
||||
"u32",
|
||||
"unsigned long",
|
||||
"aio_context_t",
|
||||
"struct io_event",
|
||||
"struct iocb",
|
||||
"struct linux_dirent64",
|
||||
"timer_t",
|
||||
"struct __kernel_itimerspec",
|
||||
"struct epoll_event",
|
||||
"struct mq_attr",
|
||||
"unsigned int",
|
||||
"struct siginfo",
|
||||
"size_t",
|
||||
"struct perf_event_attr",
|
||||
"struct rlimit64",
|
||||
"struct file_handle",
|
||||
"struct getcpu_cache",
|
||||
"struct sched_attr",
|
||||
"union bpf_attr",
|
||||
"struct statx",
|
||||
"struct __aio_sigset",
|
||||
"struct rseq",
|
||||
"struct io_uring_params",
|
||||
"struct clone_args",
|
||||
"struct open_how",
|
||||
"struct mount_attr",
|
||||
"struct landlock_ruleset_attr",
|
||||
"struct futex_waitv",
|
||||
""
|
||||
]);
|
||||
|
||||
# returns true if the given type definitely contains a pointer
|
||||
def isntflat: [.] | inside([
|
||||
"struct sigaction",
|
||||
"struct iovec",
|
||||
"struct shmid_ds",
|
||||
"struct user_msghdr",
|
||||
"struct msgbuf",
|
||||
"stack_t",
|
||||
"struct sigevent",
|
||||
"struct kexec_segment",
|
||||
"struct robust_list_head",
|
||||
"struct mmsghdr",
|
||||
""
|
||||
]);
|
||||
|
||||
def nimtype: rawtype |
|
||||
if . == "" then null
|
||||
|
||||
# pointers
|
||||
elif endswith("*") then rtrimstr("*") | strim |
|
||||
if isflat then "pointer"
|
||||
elif isntflat then "pointer #[ TODO \(.) is not a flat type ]#"
|
||||
elif endswith("*") then "pointer #[ TODO \(.) is a nested pointer ]#"
|
||||
else error("\(.) is of dubious flatness!") end
|
||||
|
||||
# scalar types
|
||||
elif startswith("enum") then "cint"
|
||||
elif [.] | inside(["int", "key_t", "pid_t", "clockid_t", "timer_t", "mqd_t", "__s32", "rwf_t"]) then "cint"
|
||||
elif [.] | inside(["size_t"]) then "csize_t"
|
||||
elif [.] | inside(["umode_t"]) then "cushort"
|
||||
elif [.] | inside(["unsigned int", "uid_t", "gid_t", "qid_t", "u32", "__u32"]) then "cuint"
|
||||
elif [.] | inside(["unsigned long", "off_t"]) then "clong"
|
||||
elif [.] | inside(["aio_context_t", "__u64"]) then "culong"
|
||||
elif [.] | inside(["loff_t"]) then "clonglong"
|
||||
elif [.] | inside(["key_serial_t"]) then "int32"
|
||||
elif [.] | inside(["cap_user_header_t", "cap_user_data_t"]) then "pointer"
|
||||
else error("\(.) is unknown as a nimtype") end;
|
||||
|
||||
def nimstack: rawtype |
|
||||
if . == "" then null
|
||||
|
||||
# pointers
|
||||
elif endswith("*") then rtrimstr("*") | strim |
|
||||
if isflat then "state.memory.raw_address(state.stack.pop.p)"
|
||||
elif isntflat then "nil # TODO \(.) is not a flat type"
|
||||
elif endswith("*") then "nil # TODO \(.) is a nested pointer"
|
||||
else error("\(.) is of dubious flatness!") end
|
||||
|
||||
# scalar types
|
||||
elif startswith("enum") then "state.stack.pop.i.cint"
|
||||
elif [.] | inside(["int", "key_t", "pid_t", "clockid_t", "timer_t", "mqd_t", "__s32", "rwf_t"]) then "state.stack.pop.i.cint"
|
||||
elif [.] | inside(["size_t"]) then "state.stack.pop.u.csize_t"
|
||||
elif [.] | inside(["umode_t"]) then "state.stack.pop.i.cushort"
|
||||
elif [.] | inside(["unsigned int", "uid_t", "gid_t", "qid_t", "u32", "__u32"]) then "state.stack.pop.u.cuint"
|
||||
elif [.] | inside(["unsigned long", "off_t"]) then "state.stack.pop.i.clong"
|
||||
elif [.] | inside(["aio_context_t", "__u64"]) then "state.stack.pop.u.culong"
|
||||
elif [.] | inside(["loff_t"]) then "state.stack.pop.i.clonglong"
|
||||
elif [.] | inside(["key_serial_t"]) then "state.stack.pop.i.int32"
|
||||
elif [.] | inside(["cap_user_header_t", "cap_user_data_t"]) then "state.memory.raw_address(state.stack.pop.p)"
|
||||
else error("\(.) is unknown as a nimtype") end;
|
||||
|
||||
|
||||
def letstr: getargs | map("let syscall_\(.name | gsub("_"; "")): \(.type | nimtype) = \(.type | nimstack)") | join("\n");
|
||||
|
||||
def argcomma: if ( getargs | length ) == 0 then "" else ", " end;
|
||||
def argstr: getargs | map("syscall_" + (.name | gsub("_"; ""))) | join(", ");
|
||||
|
||||
.syscalls[] |
|
||||
" of \(.number): # \(csig)\n" +
|
||||
"\(letstr | indent(" "))\n" +
|
||||
" let retval: clong = syscall(\(.number)\(argcomma)\(argstr))\n" +
|
||||
" state.stack.add ArcticType(i: retval.int64)\n"
|
|
@ -1,27 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
if [ -e src/arctic/handle_syscalls.nim ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ ! -e syscalls.json ]; then
|
||||
curl 'https://syscalls.mebeim.net/db/x86/64/x64/v6.6/table.json' > syscalls.json
|
||||
fi
|
||||
|
||||
cat <<EOF > src/arctic/handle_syscalls.nim
|
||||
import types
|
||||
import memory
|
||||
|
||||
proc syscall(number: clong): clong {.importcpp: "syscall(@)", header: "<unistd.h>", varargs.}
|
||||
|
||||
template handle_syscall*(state: var ArcticState, number: int64) =
|
||||
case number:
|
||||
EOF
|
||||
|
||||
jq -r -f generate_handle_syscalls.jq < syscalls.json >> src/arctic/handle_syscalls.nim
|
||||
|
||||
cat <<EOF >> src/arctic/handle_syscalls.nim
|
||||
else:
|
||||
# TODO: invalid syscall
|
||||
discard
|
||||
EOF
|
Loading…
Reference in a new issue