diff --git a/.gitignore b/.gitignore index e69de29..5c00ea1 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,6 @@ +!* +localversion +rpmbuild +*.tar.xz +*.log +*.rpm diff --git a/0001-Bump-bitfield-struct-to-0.12.1.patch b/0001-Bump-bitfield-struct-to-0.12.1.patch new file mode 100644 index 0000000..8516871 --- /dev/null +++ b/0001-Bump-bitfield-struct-to-0.12.1.patch @@ -0,0 +1,26 @@ +From dccb5de1092ebfc8f6e380d448b533ebd83cb9ac Mon Sep 17 00:00:00 2001 +From: Luigi Leonardi +Date: Thu, 6 Nov 2025 12:47:30 +0100 +Subject: [PATCH] Bump bitfield-struct to 0.12.1 + +Signed-off-by: Luigi Leonardi +--- + 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 + diff --git a/0002-switch-to-cbuild.patch b/0002-switch-to-cbuild.patch new file mode 100644 index 0000000..801fc46 --- /dev/null +++ b/0002-switch-to-cbuild.patch @@ -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} diff --git a/0003-igvm_c-dump_igvm-add-missing-device-tree-directive-9.patch b/0003-igvm_c-dump_igvm-add-missing-device-tree-directive-9.patch new file mode 100644 index 0000000..c53b572 --- /dev/null +++ b/0003-igvm_c-dump_igvm-add-missing-device-tree-directive-9.patch @@ -0,0 +1,30 @@ +From 5d2b5a58e0b294e2adfc923ac4baddfd270eb5a8 Mon Sep 17 00:00:00 2001 +From: Luigi Leonardi +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 +--- + 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 + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6bb0815 --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +all: cargo-c igvm + +cargo-c: + ./create-cargo-c-tarball.sh + +igvm: + ./create-igvm-tarball.sh \ No newline at end of file diff --git a/build_cargo-c.sh b/build_cargo-c.sh new file mode 100755 index 0000000..8f81ea9 --- /dev/null +++ b/build_cargo-c.sh @@ -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} diff --git a/create-cargo-c-tarball.sh b/create-cargo-c-tarball.sh new file mode 100755 index 0000000..f1935e7 --- /dev/null +++ b/create-cargo-c-tarball.sh @@ -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 \ No newline at end of file diff --git a/create-igvm-tarball.sh b/create-igvm-tarball.sh new file mode 100755 index 0000000..c581f0e --- /dev/null +++ b/create-igvm-tarball.sh @@ -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 diff --git a/igvm.spec b/igvm.spec new file mode 100644 index 0000000..07b4d6b --- /dev/null +++ b/igvm.spec @@ -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 diff --git a/sources b/sources new file mode 100644 index 0000000..e17b7ba --- /dev/null +++ b/sources @@ -0,0 +1,2 @@ +SHA512 (igvm-9848d1f.tar.xz) = 75b188291cc73635a2a4e1f02aff3f7bae102b3126d27edb382f486e89834c399c768b66195ff5f68c5bad9702a8c52a95edbf6b5579ba641d20de2c1383f3a8 +SHA512 (cargo-c-0.10.18+cargo-0.92.0.tar.xz) = b2368a5e15884e40c3c15a6bba5280456899da2d285e4ed135da38079ca1f5c56b988c4b31c9072e9d78e018dd4532399e1d57710acf0275721b80334050b378