Initial commit on c10s

Resolves: RHEL-130925

Signed-off-by: Luigi Leonardi <leonardi@redhat.com>
This commit is contained in:
Luigi Leonardi 2026-01-21 14:38:47 +01:00
parent fc4b995092
commit 18ce62a2b9
10 changed files with 420 additions and 0 deletions

6
.gitignore vendored
View File

@ -0,0 +1,6 @@
!*
localversion
rpmbuild
*.tar.xz
*.log
*.rpm

View File

@ -0,0 +1,26 @@
From dccb5de1092ebfc8f6e380d448b533ebd83cb9ac Mon Sep 17 00:00:00 2001
From: Luigi Leonardi <leonardi@redhat.com>
Date: Thu, 6 Nov 2025 12:47:30 +0100
Subject: [PATCH] Bump bitfield-struct to 0.12.1
Signed-off-by: Luigi Leonardi <leonardi@redhat.com>
---
Cargo.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Cargo.toml b/Cargo.toml
index 0687d83..cc50a57 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -13,7 +13,7 @@ igvm_defs = { path = "igvm_defs", version = "0.4.0" }
igvm = { path = "igvm", version = "0.4.0" }
anyhow = "1.0"
-bitfield-struct = "0.10"
+bitfield-struct = "0.12.1"
crc32fast = { version = "1.3.2", default-features = false }
hex = { version = "0.4", default-features = false }
open-enum = "0.5.2"
--
2.51.1

141
0002-switch-to-cbuild.patch Normal file
View File

@ -0,0 +1,141 @@
diff --git a/igvm/Cargo.toml b/igvm/Cargo.toml
index 350d0a3..974300b 100644
--- a/igvm/Cargo.toml
+++ b/igvm/Cargo.toml
@@ -12,6 +12,10 @@ repository = "https://github.com/microsoft/igvm"
keywords = ["virtualization"]
categories = ["virtualization", "parser-implementations"]
+[package.metadata.capi.header]
+# cbindgen is handled from igvm_c/Makefile
+enabled = false
+
[package.metadata.docs.rs]
# Document all features
all-features = true
@@ -40,4 +44,5 @@ static_assertions.workspace = true
[features]
default = []
+capi = ["igvm-c"]
igvm-c = [] # Add exports that allow the library to be used from C
diff --git a/igvm_c/Makefile b/igvm_c/Makefile
index ace990e..1796e07 100644
--- a/igvm_c/Makefile
+++ b/igvm_c/Makefile
@@ -7,24 +7,27 @@
API_DIR:=$(realpath $(shell dirname $(firstword $(MAKEFILE_LIST))))
IGVM_DIR := $(API_DIR)/..
TARGET_DIR ?= target_c
-
-ifdef RELEASE
-TARGET_PATH="$(IGVM_DIR)/$(TARGET_DIR)/$(CARGO_BUILD_TARGET)/release"
-else
-TARGET_PATH="$(IGVM_DIR)/$(TARGET_DIR)/$(CARGO_BUILD_TARGET)/debug"
-endif
+EXE =
PREFIX ?= /usr
DESTDIR ?=
CFLAGS ?= -g3 -O0
-LDFLAGS += -L $(TARGET_PATH)
CARGO=CARGO_TARGET_DIR=$(IGVM_DIR)/$(TARGET_DIR) cargo
+CARGO_BUILD_HOST := $(shell $(CARGO) -Vv | sed -n 's,^host: ,,p')
FEATURES = "igvm-c"
+PROFILE = $(if $(RELEASE),release,debug)
+
+TARGET_PATH = "$(IGVM_DIR)/$(TARGET_DIR)/$(CARGO_BUILD_TARGET)/$(PROFILE)"
+LIB_PATH = "$(IGVM_DIR)/$(TARGET_DIR)/$(or $(CARGO_BUILD_TARGET),$(CARGO_BUILD_HOST))/$(PROFILE)"
RUST_SOURCE := $(IGVM_DIR)/igvm/src/c_api.rs $(IGVM_DIR)/igvm/src/lib.rs $(IGVM_DIR)/igvm_defs/src/lib.rs
+LIBIGVM = $(LIB_PATH)/libigvm.a
+UNINSTALLED_PC = $(LIB_PATH)/igvm-uninstalled.pc
+IGVM_LIBS = $(shell pkg-config --libs --static $(UNINSTALLED_PC))
+IGVM_LIBS_STATIC = $(subst $(IGVM_LIBS), -ligvm, $(LIBIGVM))
# Determine igvm crate version from Cargo.toml
VERSION = $(shell grep -oP "(?<=version = \").+(?=\")" $(IGVM_DIR)/igvm/Cargo.toml)
@@ -33,15 +36,15 @@ VERSION = $(shell grep -oP "(?<=version = \").+(?=\")" $(IGVM_DIR)/igvm/Cargo.to
all: build test
-build: $(API_DIR)/include/igvm.h $(TARGET_PATH)/dump_igvm
+build: $(API_DIR)/include/igvm.h $(TARGET_PATH)/dump_igvm$(EXE)
-$(TARGET_PATH)/libigvm.a:
- $(CARGO) build --features $(FEATURES) $(EXTRA_PARAMS) --manifest-path=$(IGVM_DIR)/igvm/Cargo.toml
+$(LIBIGVM):
+ $(CARGO) cbuild --prefix $(PREFIX) --features $(FEATURES) $(EXTRA_PARAMS) --manifest-path=$(IGVM_DIR)/igvm/Cargo.toml
$(TARGET_PATH)/libigvm_defs.rlib:
$(CARGO) build $(EXTRA_PARAMS) --manifest-path=$(IGVM_DIR)/igvm_defs/Cargo.toml
-$(TARGET_PATH)/test_data:
+$(TARGET_PATH)/test_data$(EXE):
$(CARGO) build $(EXTRA_PARAMS) --manifest-path=$(IGVM_DIR)/igvm_c/test_data/Cargo.toml
$(API_DIR)/include/igvm.h: $(RUST_SOURCE)
@@ -49,31 +52,27 @@ $(API_DIR)/include/igvm.h: $(RUST_SOURCE)
cbindgen -q -c $(API_DIR)/cbindgen_igvm_defs.toml $(IGVM_DIR)/igvm_defs -o "$(API_DIR)/include/igvm_defs.h"
$(API_DIR)/scripts/post_process.sh "$(API_DIR)/include"
-$(TARGET_PATH)/dump_igvm: $(API_DIR)/include/igvm.h $(API_DIR)/sample/dump_igvm.c $(TARGET_PATH)/libigvm.a
- $(CC) $(CFLAGS) -I $(API_DIR) -o $@ $^ -ligvm -ldl -pthread -lutil -lrt $(LDFLAGS)
+$(TARGET_PATH)/dump_igvm$(EXE): $(API_DIR)/sample/dump_igvm.c $(API_DIR)/include/igvm.h $(LIBIGVM)
+ $(CC) $(CFLAGS) -I $(API_DIR) -o $@ $< $(IGVM_LIBS) $(LDFLAGS)
-$(TARGET_PATH)/igvm_test: $(API_DIR)/include/igvm.h $(API_DIR)/tests/igvm_test.c $(TARGET_PATH)/libigvm.a
- $(CC) $(CFLAGS) -I $(API_DIR) -o $@ $^ -ligvm -lcunit -ldl -pthread -lm -lutil -lrt $(LDFLAGS)
+$(TARGET_PATH)/igvm_test$(EXE): $(API_DIR)/tests/igvm_test.c $(API_DIR)/include/igvm.h $(LIBIGVM)
+ $(CC) $(CFLAGS) -I $(API_DIR) -o $@ $< -lcunit $(IGVM_LIBS_STATIC) $(LDFLAGS)
-$(TARGET_PATH)/igvm.bin: $(TARGET_PATH)/test_data
+$(TARGET_PATH)/igvm.bin: $(TARGET_PATH)/test_data$(EXE)
$(TARGET_PATH)/test_data $(TARGET_PATH)/igvm.bin
-test: $(TARGET_PATH)/igvm_test $(TARGET_PATH)/igvm.bin
+test: $(TARGET_PATH)/igvm_test$(EXE) $(TARGET_PATH)/igvm.bin
$(TARGET_PATH)/igvm_test $(TARGET_PATH)/igvm.bin
$(CARGO) test --features $(FEATURES) $(EXTRA_PARAMS) --manifest-path=$(IGVM_DIR)/igvm/Cargo.toml
clean:
$(CARGO) clean $(EXTRA_PARAMS) --manifest-path=$(IGVM_DIR)/igvm/Cargo.toml
$(CARGO) clean $(EXTRA_PARAMS) --manifest-path=$(IGVM_DIR)/igvm_defs/Cargo.toml
- rm -f $(API_DIR)/include/igvm.h $(API_DIR)/include/igvm_defs.h $(TARGET_PATH)/dump_igvm $(TARGET_PATH)/test_data $(TARGET_PATH)/igvm.bin
+ rm -f $(API_DIR)/include/igvm.h $(API_DIR)/include/igvm_defs.h $(TARGET_PATH)/dump_igvm$(EXE) $(TARGET_PATH)/test_data$(EXE) $(TARGET_PATH)/igvm.bin
-install:
+install: build
mkdir -p $(DESTDIR)/$(PREFIX)/include/igvm
- mkdir -p $(DESTDIR)/$(PREFIX)/lib64/pkgconfig
- install -m 644 $(TARGET_PATH)/libigvm.a $(DESTDIR)/$(PREFIX)/lib64
install -m 644 $(IGVM_DIR)/igvm_c/include/* $(DESTDIR)/$(PREFIX)/include/igvm
+ $(CARGO) cinstall --destdir "$(DESTDIR)" --prefix "$(PREFIX)" --features $(FEATURES) $(EXTRA_PARAMS) --manifest-path=$(IGVM_DIR)/igvm/Cargo.toml
mkdir -p $(DESTDIR)/$(PREFIX)/bin/
- install -m 755 $(TARGET_PATH)/dump_igvm $(DESTDIR)/$(PREFIX)/bin/
- VERSION=$(VERSION) PREFIX=$(PREFIX) envsubst '$$VERSION $$PREFIX' \
- < $(IGVM_DIR)/igvm_c/igvm.pc.in \
- > $(DESTDIR)/$(PREFIX)/lib64/pkgconfig/igvm.pc
+ install -m 755 $(TARGET_PATH)/dump_igvm$(EXE) $(DESTDIR)/$(PREFIX)/bin/
diff --git a/igvm_c/igvm.pc.in b/igvm_c/igvm.pc.in
deleted file mode 100644
index 2f92404..0000000
--- a/igvm_c/igvm.pc.in
+++ /dev/null
@@ -1,13 +0,0 @@
-prefix=$PREFIX
-exec_prefix=${prefix}
-libdir=${prefix}/lib64
-sharedlibdir=${libdir}
-includedir=${prefix}/include
-
-Name: igvm
-Description: igvm library
-Version: $VERSION
-
-Requires:
-Libs: -L${libdir} -L${sharedlibdir} -ligvm
-Cflags: -I${includedir}

View File

@ -0,0 +1,30 @@
From 5d2b5a58e0b294e2adfc923ac4baddfd270eb5a8 Mon Sep 17 00:00:00 2001
From: Luigi Leonardi <leonardi@redhat.com>
Date: Mon, 13 Oct 2025 16:30:01 +0200
Subject: [PATCH] igvm_c/dump_igvm: add missing device tree directive (#98)
`IGVM_VHT_DEVICE_TREE` was missing from the list of directives and was
not being dumped.
Add it to the list.
Signed-off-by: Luigi Leonardi <leonardi@redhat.com>
---
igvm_c/sample/dump_igvm.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/igvm_c/sample/dump_igvm.c b/igvm_c/sample/dump_igvm.c
index 8da6d27..7dd4748 100644
--- a/igvm_c/sample/dump_igvm.c
+++ b/igvm_c/sample/dump_igvm.c
@@ -212,6 +212,7 @@ static void igvm_dump_variable_header(IGVM_VHS_VARIABLE_HEADER *header)
case IGVM_VHT_VP_COUNT_PARAMETER:
case IGVM_VHT_SRAT:
case IGVM_VHT_MADT:
+ case IGVM_VHT_DEVICE_TREE:
case IGVM_VHT_MMIO_RANGES:
case IGVM_VHT_MEMORY_MAP:
case IGVM_VHT_COMMAND_LINE:
--
2.51.0

7
Makefile Normal file
View File

@ -0,0 +1,7 @@
all: cargo-c igvm
cargo-c:
./create-cargo-c-tarball.sh
igvm:
./create-igvm-tarball.sh

35
build_cargo-c.sh Executable file
View File

@ -0,0 +1,35 @@
#!/bin/bash
set -ex
VERSION=0.10.18+cargo-0.92.0
FOLDER=$(mktemp -d)
#RHEL build fails with flags
unset RUSTFLAGS
OUTPUT_FOLDER=~/.cargo/bin
mkdir -p ${OUTPUT_FOLDER}
mv cargo-c-${VERSION} ${FOLDER}
pushd $FOLDER
pushd cargo-c-${VERSION}
rm -f Cargo.lock
mkdir -p .cargo
cat << EOF > .cargo/config
[source.local-registry]
directory = "vendor"
[source.crates-io]
registry = "https://crates.io"
replace-with = "local-registry"
EOF
cargo build --offline
cp ${FOLDER}/cargo-c-${VERSION}/target/debug/cargo-cbuild ${OUTPUT_FOLDER}
cp ${FOLDER}/cargo-c-${VERSION}/target/debug/cargo-cinstall ${OUTPUT_FOLDER}

30
create-cargo-c-tarball.sh Executable file
View File

@ -0,0 +1,30 @@
#!/bin/bash -eux
NAME=cargo-c
VERSION=0.10.18+cargo-0.92.0
URL="https://crates.io/api/v1/crates/${NAME}/${VERSION}/download"
echo "Creating ${NAME} tarball."
pwd
ORIG_FOLDER=$(pwd)
TEMP_FOLDER=$(mktemp -d)
pushd $TEMP_FOLDER
wget $URL -O "${NAME}-${VERSION}.crate"
tar xf "${NAME}-${VERSION}.crate"
pushd $NAME-$VERSION
cargo vendor --verbose
popd
tar -c \
-v \
${NAME}-${VERSION} |
xz -c -9 -T0 >"$NAME-$VERSION.tar.xz"
rm "${NAME}-${VERSION}.crate"
mv $NAME-$VERSION.tar.xz $ORIG_FOLDER

34
create-igvm-tarball.sh Executable file
View File

@ -0,0 +1,34 @@
#!/bin/bash -eux
URL="https://github.com/microsoft/igvm"
SELFDIR=$PWD
echo "Creating IGVM tarball."
DIR=$(mktemp -d)
trap "rm -rf \${DIR}" exit
pushd "${DIR}"
# clone the current repo to a temporary location, check out the base commit,
# vendor dependencies, and tar up everything.
git clone ${URL}
pushd igvm
COMMIT=$(git rev-parse --short HEAD)
cargo vendor --verbose
popd
tar -c \
-v \
igvm |
xz -c -9 -T0 >"../igvm-$COMMIT.tar.xz"
mv "../igvm-$COMMIT.tar.xz" "$SELFDIR"
popd # DIR
# Update spec file and set base commit
sed -i s/%define\ igvm_commit\.\*/%define\ igvm_commit\ "${COMMIT}"/ "${SELFDIR}"/igvm.spec

109
igvm.spec Normal file
View File

@ -0,0 +1,109 @@
%global __brp_strip_static_archive %{nil}
%define igvm_commit 9848d1f
%define cargo_c_version 0.10.18+cargo-0.92.0
Name: igvm
Version: 0.4.0
Release: %autorelease
Summary: IGVM library
License: MIT
URL: https://github.com/microsoft/igvm
Source0: igvm-%{igvm_commit}.tar.xz
Source1: cargo-c-%{cargo_c_version}.tar.xz
Source2: build_cargo-c.sh
ExclusiveArch: %{rust_arches}
ExcludeArch: %{ix86}
%if 0%{?rhel}
BuildRequires: rust-toolset
%else
BuildRequires: rust-packaging >= 21
%endif
BuildRequires: CUnit-devel cbindgen make gcc cargo nano openssl-devel
%description
Igvm is an implementation of a parser for the Independent Guest Virtual Machine
%package libs
Summary: IGVM shared library
%description libs
Contains a shared library that applications that use %{name} will link to
%package devel
Provides: igvm-static = %{version}-%{release}
Requires: igvm-libs = %{version}-%{release}
Summary: IGVM library header files
%description devel
Contains header files and a static library for developing applications that use %{name}
%package tools
Requires: igvm-libs = %{version}-%{release}
Summary: IGVM tools
%description tools
The %{name}-tools package contains tools for
developing applications that use %{name}
%prep
%autosetup -n igvm
%cargo_prep -v vendor
rm -f Cargo.lock
cp -a -- %{SOURCE2} .
tar -a -f %{SOURCE1} -x
%define igvm_makeflags EXTRA_PARAMS="--profile rpm" TARGET_DIR="target" PROFILE=rpm
%define igvm_makeenv CARGO_HOME='.cargo' RUSTFLAGS='%{build_rustflags} -Csymbol-mangling-version=v0'
%build
# cargo-c will be installed in $HOME/.cargo/bin
export PATH="$HOME/.cargo/bin:$PATH"
./build_cargo-c.sh
%cargo_license_summary
%{cargo_license} > LICENSE.dependencies
%cargo_vendor_manifest
# -Csymbol-mangling-version=v0 is from the upstream .cargo/config.toml.
# Enable v0 symbols to get better output from `perf` and related tools.
%{igvm_makeenv} %make_build -C igvm_c build %{igvm_makeflags}
%check
export PATH="$HOME/.cargo/bin:$PATH"
%{igvm_makeenv} %make_build -C igvm_c test %{igvm_makeflags}
%install
export PATH="$HOME/.cargo/bin:$PATH"
%{igvm_makeenv} %make_install -C igvm_c PREFIX=/usr DESTDIR=%{buildroot} %{igvm_makeflags}
%files libs
%license LICENSE
%license LICENSE.dependencies
%license cargo-vendor.txt
%{_libdir}/libigvm.so.*
%files devel
%{_includedir}/igvm
%license LICENSE
%license LICENSE.dependencies
%license cargo-vendor.txt
%doc README.md
%{_libdir}/libigvm.a
%{_libdir}/libigvm.so
%{_libdir}/pkgconfig/igvm.pc
%files tools
%{_bindir}/dump_igvm
%doc README.md
%license LICENSE
%license LICENSE.dependencies
%license cargo-vendor.txt
%changelog
%autochangelog

2
sources Normal file
View File

@ -0,0 +1,2 @@
SHA512 (igvm-9848d1f.tar.xz) = 75b188291cc73635a2a4e1f02aff3f7bae102b3126d27edb382f486e89834c399c768b66195ff5f68c5bad9702a8c52a95edbf6b5579ba641d20de2c1383f3a8
SHA512 (cargo-c-0.10.18+cargo-0.92.0.tar.xz) = b2368a5e15884e40c3c15a6bba5280456899da2d285e4ed135da38079ca1f5c56b988c4b31c9072e9d78e018dd4532399e1d57710acf0275721b80334050b378