Skip to content

Building the Latest Kernel with eBPF and Tests

Yuriy Kolerov edited this page Feb 20, 2024 · 11 revisions

Building the Kernel Using Buildroot

Download, install and add to PATH GCC toolchain for ARC HS3x/4x.

Clone the latest Buildroot. Further configuration will use the latest Pahole (>=1.25) and elfutils (>=0.189) so everything must be built successfully.

git clone https://git.buildroot.net/buildroot
mkdir buildroot/build
cd buildroot/build

Create ebpf.fragment with additional options for the kernel:

CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT=y
CONFIG_CGROUPS=y
CONFIG_CGROUP_BPF=y
CONFIG_MEMCG=y
CONFIG_BLK_CGROUP=y
CONFIG_CGROUP_SCHED=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_RDMA=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CPUSETS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_BPF=y
CONFIG_CGROUP_MISC=y
CONFIG_NAMESPACES=y
CONFIG_KPROBES=y
CONFIG_NVME_MULTIPATH=y
CONFIG_NVME_VERBOSE_ERRORS=y
CONFIG_NVME_FC=y
CONFIG_NVME_TCP=y
CONFIG_NETFILTER=y
CONFIG_NF_CONNTRACK=y
CONFIG_NF_CONNTRACK_MARK=y
CONFIG_DEBUG_INFO_DWARF5=y
CONFIG_DEBUG_INFO_BTF=y
CONFIG_DEBUG_FS=y
CONFIG_BOOTTIME_TRACING=y
CONFIG_IRQSOFF_TRACER=y
CONFIG_PREEMPT_TRACER=y
CONFIG_SCHED_TRACER=y
CONFIG_HWLAT_TRACER=y
CONFIG_TIMERLAT_TRACER=y
CONFIG_FTRACE_SYSCALLS=y

Create defconfig for HSDK. BR2_TOOLCHAIN_EXTERNAL_PATH is empty thus Buildroot will try to find the toolchain in PATH. Also we set BR2_TARGET_ROOTFS_EXT2_SIZE="8000M" to reserve extra space for filesystem on SD-card.

BR2_arcle=y
BR2_archs38_full=y
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="$(ARCH)-linux-gnu"
BR2_TOOLCHAIN_EXTERNAL_PATH=""
BR2_TOOLCHAIN_EXTERNAL_GCC_13=y
BR2_TOOLCHAIN_EXTERNAL_HEADERS_5_16=y
BR2_TOOLCHAIN_EXTERNAL_INET_RPC=n
BR2_TOOLCHAIN_EXTERNAL_CXX=y
BR2_TOOLCHAIN_EXTERNAL_FORTRAN=y
BR2_TOOLCHAIN_EXTERNAL_HAS_SSP=y
BR2_TOOLCHAIN_EXTERNAL_GDB_SERVER_COPY=y
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_5_16=y
BR2_PACKAGE_GLIBC_UTILS=y
BR2_TARGET_OPTIMIZATION="-mfpu=fpud_all"
BR2_TARGET_GENERIC_HOSTNAME="hsdk"
BR2_TARGET_GENERIC_ISSUE="Welcome to the HSDK Platform"
#BR2_SYSTEM_DHCP="eth0"
BR2_ROOTFS_POST_IMAGE_SCRIPT="support/scripts/genimage.sh"
BR2_ROOTFS_POST_SCRIPT_ARGS="-c board/synopsys/hsdk/genimage.cfg"
BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_GIT=y
BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/foss-for-synopsys-dwc-arc-processors/linux.git"
BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="shahab-bpf-jit-6"
BR2_LINUX_KERNEL_DEFCONFIG="hsdk"
BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="board/synopsys/hsdk/linux.fragment build/ebpf.fragment"
BR2_LINUX_KERNEL_NEEDS_HOST_PAHOLE=y
BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_EXT2_4=y
BR2_TARGET_ROOTFS_EXT2_SIZE="8000M"
# BR2_TARGET_ROOTFS_TAR is not set
BR2_TARGET_ROOTFS_CPIO=y
BR2_TARGET_UBOOT=y
BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y
BR2_TARGET_UBOOT_CUSTOM_VERSION=y
BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE="2022.01"
BR2_TARGET_UBOOT_BOARD_DEFCONFIG="hsdk"
BR2_TARGET_UBOOT_NEEDS_DTC=y
BR2_TARGET_UBOOT_FORMAT_ELF=y
BR2_TARGET_UBOOT_NEEDS_OPENSSL=y
BR2_PACKAGE_HOST_DOSFSTOOLS=y
BR2_PACKAGE_HOST_GENIMAGE=y
BR2_PACKAGE_HOST_MTOOLS=y
BR2_PACKAGE_HOST_UBOOT_TOOLS_ENVIMAGE=y
BR2_PACKAGE_HOST_UBOOT_TOOLS_ENVIMAGE_SOURCE="board/synopsys/hsdk/uboot.env.txt"
BR2_PACKAGE_HOST_UBOOT_TOOLS_ENVIMAGE_SIZE="0x4000"
BR2_PACKAGE_NCURSES=y
BR2_PACKAGE_NCURSES_WCHAR=y
BR2_PACKAGE_HAVEGED=y
BR2_PACKAGE_RSYNC=y
BR2_PACKAGE_OPENSSH=y
BR2_PACKAGE_NFS_UTILS=y
BR2_PACKAGE_MAKE=y
BR2_PACKAGE_NANO=y
BR2_PACKAGE_ELFUTILS=y
BR2_PACKAGE_ELFUTILS_PROGS=y
BR2_PACKAGE_ZLIB=y
BR2_PACKAGE_LIBZLIB=y

Set these options to build vmlinux instead of uImage:

# BR2_LINUX_KERNEL_UIMAGE=n
# BR2_ROOTFS_POST_IMAGE_SCRIPT=""
BR2_LINUX_KERNEL_VMLINUX=y

Configure and build:

make -C .. O=$(pwd) defconfig DEFCONFIG=build/defconfig
make -j 1 # U-Boot images may be build only with -j 1

Then write sdcard.img image to SD-card:

  • On Linux: sudo dd if=sdcard.img of=/dev/mmcblk0 bs=1M
  • On Windows: use Balena Etcher

Building the Linux Kernel and Selftests Separately

Build zlib for the target and install to toolchain's sysroot:

git clone -b v1.3 https://github.com/madler/zlib
cd zlib
CHOST=arc-linux-gnu CFLAGS="-Og -g3 -fPIC" ./configure --prefix=/usr
make
make DESTDIR=/tools/gcc-arc-linux-gnu-2023.09/arc-snps-linux-gnu/sysroot LDCONFIG=true install 

Build elfutils for the target and install to toolchain's sysroot:

wget https://sourceware.org/elfutils/ftp/0.189/elfutils-0.189.tar.bz2
tar -xf elfutils-0.189.tar.bz2
cd elfutils-0.189
autoreconf -i -f
CFLAGS="-Og -g3" ./configure \
    --host=arc-linux-gnu \
    --target=arc-linux-gnu \
    --program-prefix=eu- \
    --disable-libdebuginfod \
    --disable-debuginfod \
    --without-bzlib \
    --without-lzma \
    --without-zstd \
    --prefix=/usr \
    --sysconfdir=/etc \
    --localstatedir=/var

make
make DESTDIR=/tools/gcc-arc-linux-gnu-2023.09/arc-snps-linux-gnu/sysroot install

Build and install elfutils for host and update the environment:

git clone -b elfutils-0.189 https://sourceware.org/git/elfutils.git
cd elfutils
autoreconf -fi
mkdir build
cd build
../configure --prefix=/tools/elfutils --enable-maintainer-mode
make
make install

export C_INCLUDE_PATH="/tools/elfutils/include"
export LIBRARY_PATH="/tools/elfutils/lib"
export PATH="/tools/elfutils/bin:$PATH"
export LD_LIBRARY_PATH="/tools/elfutils/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"

Build and install Pahole for host and update the environment:

git clone -b v1.25 https://git.kernel.org/pub/scm/devel/pahole/pahole.git
mkdir pahole/build
cd pahole/build
cmake -G "Unix Makefiles"                              \
      -D__LIB=lib                                      \
      -DDWARF_INCLUDE_DIR=/tools/elfutils/include      \
      -DLIBDW_INCLUDE_DIR=/tools/elfutils/include      \
      -DDWARF_LIBRARY=/tools/elfutils/lib/libdw.so.1   \
      -DELF_LIBRARY=/tools/elfutils/lib/libelf.so.1    \
      -DCMAKE_INSTALL_PREFIX=/tools/pahole             \
      ..

make install

export PATH="/tools/pahole/bin:$PATH"
export LD_LIBRARY_PATH="/tools/pahole/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"

Build and install bpftool and update the environment:

git clone --recurse-submodules https://github.com/libbpf/bpftool.git
cd bpftool/src
make prefix=/tools/bpftool EXTRA_CFLAGS="-I/tools/elfutils/include" \
                           EXTRA_LDFLAGS="-L/tools/elfutils/lib"    \
                           install-bin

export PATH=/tools/bpftool/sbin/:$PATH

Clone the kernel with patches for eBPF tests:

git clone -b ykolerov-bpf-tests https://github.com/foss-for-synopsys-dwc-arc-processors/linux
mkdir linux/build
cd linux/build

Save this minimal configuration file as arch/arc/configs/qemu_hs4x_ebpf_defconfig (note that this configuration file uses ../buildroot/build/images/rootfs.cpio filesystem image - you must prepare it before building the Linux kernel):

# CONFIG_SWAP is not set
CONFIG_PERF_EVENTS=y
CONFIG_BPF_EVENTS=y
CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
# CONFIG_CROSS_MEMORY_ATTACH is not set
CONFIG_NO_HZ_IDLE=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT=y
# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set
CONFIG_PREEMPT=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_NAMESPACES=y
# CONFIG_UTS_NS is not set
# CONFIG_PID_NS is not set
CONFIG_INITRAMFS_SOURCE="../buildroot/build/images/rootfs.cpio"
CONFIG_ARC_BUILTIN_DTB_NAME="haps_hs_idu"
CONFIG_EXPERT=y
# CONFIG_SGETMASK_SYSCALL is not set
CONFIG_DEBUG_PERF_USE_VMALLOC=y
# CONFIG_COMPAT_BRK is not set
CONFIG_SLAB=y
CONFIG_KPROBES=y
CONFIG_COMPAT_32BIT_TIME=y
CONFIG_MODULES=y
# CONFIG_COMPACTION is not set
CONFIG_NET=y
CONFIG_PACKET=y
CONFIG_PACKET_DIAG=y
CONFIG_UNIX=y
CONFIG_UNIX_DIAG=y
CONFIG_NET_KEY=y
CONFIG_INET=y
CONFIG_IPV6=y
# CONFIG_WIRELESS is not set
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
# CONFIG_STANDALONE is not set
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
# CONFIG_FIRMWARE_MEMMAP is not set
CONFIG_OF=y
CONFIG_VIRTIO_BLK=y
CONFIG_NETDEVICES=y
CONFIG_VIRTIO_NET=y
# CONFIG_ETHERNET is not set
# CONFIG_WLAN is not set
CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_KEYBOARD is not set
# CONFIG_INPUT_MOUSE is not set
# CONFIG_SERIO is not set
# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_16550A_VARIANTS=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_NR_UARTS=1
CONFIG_SERIAL_8250_RUNTIME_UARTS=1
CONFIG_SERIAL_8250_DW=y
CONFIG_SERIAL_OF_PLATFORM=y
# CONFIG_HW_RANDOM is not set
# CONFIG_HWMON is not set
# CONFIG_HID is not set
# CONFIG_USB_SUPPORT is not set
CONFIG_VIRTIO_MMIO=y
CONFIG_COMMON_CLK=y
# CONFIG_IOMMU_SUPPORT is not set
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
CONFIG_TMPFS=y
# CONFIG_MISC_FILESYSTEMS is not set
CONFIG_NFS_FS=y
CONFIG_FUSE_FS=y
CONFIG_NFSD=y
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
CONFIG_DEBUG_INFO_BTF=y
CONFIG_GDB_SCRIPTS=y
CONFIG_FRAME_WARN=1024
CONFIG_DEBUG_FS=y
CONFIG_DEBUG_MEMORY_INIT=y
# CONFIG_DEBUG_PREEMPT is not set
CONFIG_BOOTTIME_TRACING=y
CONFIG_IRQSOFF_TRACER=y
CONFIG_PREEMPT_TRACER=y
CONFIG_SCHED_TRACER=y
CONFIG_HWLAT_TRACER=y
CONFIG_FTRACE_SYSCALLS=y
CONFIG_TEST_BPF=m
CONFIG_NETFILTER=y
CONFIG_NF_CONNTRACK=y
CONFIG_NF_CONNTRACK_MARK=y
CONFIG_SMP=y
CONFIG_CGROUPS=y
CONFIG_CGROUP_BPF=y

Build the kernel and then build selftests:

make -C .. O=$(pwd) qemu_hs4x_ebpf_defconfig
make -C ../tools/testing/selftests/bpf O=$(pwd)
Clone this wiki locally