blob: db56bd7aacf60374ef5fd5b77822202780a1f1fb [file] [log] [blame]
#!/usr/bin/env bash
# Copyright 2017 The Fuchsia Authors
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT
header() {
echo "// This file is generated by $0. DO NOT EDIT."
echo
echo '#include <stdint.h>'
echo '#include "vdso-code.h"'
echo
echo "\
struct VDso::ValidSyscallPC {
"
}
footer() {
echo '};'
}
scan() {
local define symbol rest syscall caller
local syscalls=''
while read define symbol rest; do
case "$symbol" in
VDSO_CODE_SYSRET_*) ;;
*) continue ;;
esac
syscall="${symbol#VDSO_CODE_SYSRET_zx_}"
caller="${syscall#*_VIA_}"
syscall="${syscall%_VIA_*}"
if eval "test -z \"\$syscall_callers_${syscall}\""; then
syscalls+=" $syscall"
eval "local syscall_callers_${syscall}=\$caller"
else
eval "syscall_callers_${syscall}+=\" \$caller\""
fi
done
for syscall in $syscalls; do
echo "\
static bool ${syscall}(uintptr_t offset) {
switch (offset) {\
"
eval "local callers=\$syscall_callers_$syscall"
for caller in $callers; do
echo "\
case VDSO_CODE_SYSRET_zx_${syscall}_VIA_${caller} - VDSO_CODE_START:
return true;\
"
done
echo "\
}
return false;
}
"
done
}
set -e
header
scan < "$1"
footer