#!/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 ' 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