On 1/26/26 07:24, Piyush Raj wrote:
The new bpf.exp baseboard is used by GCC for runtime testing of
BPF programs across different kernel versions.

First, we will definitely need copyright papers to accept this patch.  Please contact <[email protected]> for the details. Since you have included an FSF copyright notice in the proposed file, it seems clear that you have the intent, but the FSF needs the papers to formalize that intent and ensure that copyright notice is valid.

Second, I have a few preliminary review notes interspersed below.  They range from trivial to potentially serious on now-unusual-but-once-universal configurations.  Based on this preliminary review, I am expecting at least two to three versions of this patch before it can be merged.  (This initial patch counts as one of those.)

2026-01-26  Piyush Raj <[email protected]>
     * baseboards/bpf.exp: Add a new baseboard for runtime testing
          of bpf programs in gcc testsuite.
     * Makefile.am (baseboard_DATA): Add bpf.exp.
     * Makefile.in (baseboard_DATA): Likewise.

---
  ChangeLog          |   6 ++
  Makefile.am        |   1 +
  Makefile.in        |   1 +
  baseboards/bpf.exp | 151 +++++++++++++++++++++++++++++++++++++++++++++
  4 files changed, 159 insertions(+)
  create mode 100644 baseboards/bpf.exp

diff --git a/ChangeLog b/ChangeLog
index 235125f..d101b51 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2026-01-26  Piyush Raj <[email protected]>
+    * baseboards/bpf.exp: Add a new baseboard for runtime testing
+         of bpf programs in gcc testsuite.
+    * Makefile.am (baseboard_DATA): Add bpf.exp.
+    * Makefile.in (baseboard_DATA): Likewise.
+

The convention in the DejaGnu ChangeLog is to have a blank line both before and after each block of changes.  Please align this with the other entries in the file.  Also, "gcc" here should probably be "GCC", referring to the package instead of the "gcc" program itself.  (I can fix these if needed.)

  2025-12-02  Jacob Bachmeyer  <[email protected]>
* baseboards/h8300.exp: Restore from Git history per a request
diff --git a/Makefile.am b/Makefile.am
index 9493cc6..4ef26d1 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -98,6 +98,7 @@ baseboard_DATA = \
        baseboards/arm-sim.exp \
        baseboards/basic-sid.exp \
        baseboards/basic-sim.exp \
+       baseboards/bpf.exp \
        baseboards/cris-sim.exp \
        baseboards/d30v-sim.exp \
        baseboards/fr30-sim.exp \
diff --git a/Makefile.in b/Makefile.in
index 1fb4120..1e51ca8 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -469,6 +469,7 @@ baseboard_DATA = \
        baseboards/arm-sim.exp \
        baseboards/basic-sid.exp \
        baseboards/basic-sim.exp \
+       baseboards/bpf.exp \
        baseboards/cris-sim.exp \
        baseboards/d30v-sim.exp \
        baseboards/fr30-sim.exp \
diff --git a/baseboards/bpf.exp b/baseboards/bpf.exp
new file mode 100644
index 0000000..e9b98d6
--- /dev/null
+++ b/baseboards/bpf.exp
@@ -0,0 +1,151 @@
+# Copyright (C) 1997-2026, 2026 Free Software Foundation, Inc.
+#
+# This file is part of DejaGnu.
+#
+# DejaGnu is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# DejaGnu is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with DejaGnu.  If not, see <http://www.gnu.org/licenses/>.
+
+# Baseboard for runtime testing of BPF programs in the GCC testsuite.
+# Uses bpf-vmtest-tool(https://gcc.gnu.org/wiki/BPFRunTimeTests)
+
+# Load procedures from common libraries.
+load_lib "standard.exp"
+# list of toolchains that are supported on this board.
+set_board_info target_install {bpf-unknown-none}
+set_board_info generic_name bpf
+# bpf does not need -lm
+set_board_info mathlib ""
+# set board as local
+unset_board_info isremote
+set_board_info isremote "0"

Why is this here?  Is it absolutely logically impossible to test BPF remotely, or could a user possibly want to run the tests on a remote target or using a compiler on a remote host?  Remember that the DejaGnu framework supports testing in "Canadian cross" configurations where build, host, and target are all different architectures.

+
+if {[getenv VMTEST_DIR] == ""} {

This can go either way, but you can test if getenv returns an empty string or directly test if ::env(VMTEST_DIR) exists.  That test would be "if {![info exists ::env(VMTEST_DIR)]} ..." which would more closely match the others, but would also be less visually distinctive that VMTEST_DIR is an environment variable while the others are Tcl globals.

+    verbose "ERROR: VMTEST_DIR needs to be set for bpf-vmtest-tool" 0
+    exit 1
+}
+
+if {![info exists KERNEL_VERSION]} {
+    set KERNEL_VERSION 6.15
+    verbose -log "Using default kernel version: $KERNEL_VERSION" 1
+}
+
+if {![info exists LOG_LEVEL]} {
+    set LOG_LEVEL ERROR
+    verbose -log "Using default log level: $LOG_LEVEL" 1
+}
+
+proc bpf_compile {source destfile type options} {
+
+    if { $type == "executable" } {
+        return [bpf_target_compile $source $destfile $type $options]
+    }
+    return [default_target_compile $source $destfile $type $options]
+}
Again, why is this here?  Why is a special procedure needed only to compile executables?
+
+proc bpf_target_compile {source destfile type options} {
+
+    global srcdir
+    global KERNEL_VERSION
+    global LOG_LEVEL
+    set python3 [find_python3]
+    if {$python3 == ""} {
+        error "Cannot find python3 in $PATH"
+    }

Normally, tools used in DejaGnu are referenced using global variables with all-caps names that are set during initialization. Here, there should be a "global PYTHON3" and that variable should be defined outside of any procedure.

+    set script_path "$srcdir/../../contrib/bpf-vmtest-tool/main.py"

This needs to be generalized.  Remember that this is going into the *framework*, not just the GCC testsuite.  It is acceptable to require a special tool, and to default to the location in the GCC source tree, but the user needs to be able to override that location.  This could be as simple as a BPF_VMTEST_PY global variable.

+    set opts ""
+    foreach i $options {
+        if {[regexp "^compiler=" $i]} {
+            regsub "^compiler=" $i "" tmp
+            if { $tmp eq "" } {
+                return "bpf_target_compile: No compiler to compile with"
+            }
+            set compiler [ lindex [split $tmp " "] 0 ]
+            set compiler_flags [ lindex [split $tmp " "] 1 ]
+            append opts " $compiler_flags"
+        }
+
+        if {[regexp "^additional_flags=" $i]} {
+            regsub "^additional_flags=" $i "" tmp
+            set tmp [string trim $tmp]
+            append opts " $tmp"
+        }
+    }
+
+    set opts [string trim $opts]
+
+    setenv BPF_CFLAGS $opts
+    setenv BPF_CC $compiler
+    set args [list $script_path --log-level $LOG_LEVEL bpf compile $source -k 
$KERNEL_VERSION -o $destfile ]
+    set status [remote_exec host $python3 $args]
+    set exit_code [lindex $status 0]
+    set output [lindex $status 1]
+    unsetenv BPF_CFLAGS
+    unsetenv BPF_CC

I will consider this acceptable, but the preferred way to do this is to use env(1), rather than modifying and reverting the parent's environment.

+
+    if { $exit_code < 0 } {
+        verbose -log "Couldn't compile $source: $output"
+        return $output
+    }
+
+    verbose -log "Executed $source, exit_code $exit_code"
+    if {$output ne ""} {
+        verbose -log -- $output 2
+    }
+
+    return $output
+}

This is not acceptable.  The target_compile procedure (which will call bpf_compile, which will call bpf_target_compile) is documented as only *compiling* the program, not also running it. All targets need to be consistent on this.

Either the final verbose message is misleading, or this needs to be redesigned.

+
+proc bpf_load {dest prog args} {
+    global srcdir
+    global KERNEL_VERSION
+    global LOG_LEVEL
+    # Construct command
+    set python3 [find_python3]
+    if {$python3 == ""} {
+        error "Cannot find python3 in $PATH"
+    }

Again, get python3 from a global PYTHON3 that was set and checked during initialization.  Do not repeat the search for every testcase.  Modern computers are fast, but that is no excuse to be wasteful.

+    set script_path "$srcdir/../../contrib/bpf-vmtest-tool/main.py"

Again, this needs to be customizable.

+    set bpf_object $prog
+
+    set args [list $script_path --log-level $LOG_LEVEL vmtest -k 
$KERNEL_VERSION --bpf-obj $prog ]
+    set status [remote_exec $dest $python3 $args]
+    set exit_code [lindex $status 0]
+    set output [lindex $status 1]
+
+    if { $exit_code < 0 } {
+        verbose -log "Couldn't execute $prog: $output"
+        return "unresolved"
+    }
+
+    verbose -log "Executed $prog, exit_code $exit_code"
+    if {$output ne ""} {
+        verbose -log -- $output 2
+    }
+
+    if { $exit_code == 0 } {
+        return [list "pass" $output]
+    } else {
+        return [list "fail" $output]
+    }
+}
+
+
+proc find_python3 {} {
+    foreach candidate {python3 python} {
+        set path [which $candidate]
+        if {$path != ""} {
+            return $path
+        }
+    }
+    return ""
+}

This is inadequate because it makes no attempt to verify that "python" is actually Python 3.  If it is intended to specifically locate a Python 3 interpreter, it needs to ensure that it has *actually* found a Python 3 interpreter.  You have the full reach of Expect available if needed, so there is no "it is too hard" excuse here.  How does the user determine the version of a Python interpreter?

Also, this find_python3 procedure should be located near the top of the file, before the bpf_* procedures, and followed by using it to set the PYTHON3 global variable ("set PYTHON3 [find_python3]") and then ensuring that PYTHON3 is set to a meaningful value, as you do for KERNEL_VERSION, LOG_LEVEL, and VMTEST_DIR.

Lastly, the file should probably be "bpf-vmtest.exp" since that is the actual target.


-- Jacob



Reply via email to