Skip to content

Commit

Permalink
Add Windows VMI Options (#98)
Browse files Browse the repository at this point in the history
  • Loading branch information
novafacing authored Sep 15, 2024
1 parent 23be831 commit e412fc4
Show file tree
Hide file tree
Showing 37 changed files with 8,153 additions and 90 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ COPY .github/builder/rsrc/lld-5.0.2.src.tar.xz /install/lld-5.0.2.src.tar.xz
COPY .github/builder/rsrc/cfe-5.0.2.src.tar.xz /install/cfe-5.0.2.src.tar.xz
COPY .github/builder/rsrc/llvm-5.0.2.src.tar.xz /install/llvm-5.0.2.src.tar.xz
COPY .github/builder/rsrc/rpms /install/rpms
COPY .github/builder/rsrc/simics /simics
COPY .github/builder/rsrc/simics-6 /simics
COPY .github/builder/rsrc/ispm /simics/ispm

RUN yum -y install /install/rpms/*.rpm && yum clean all
Expand Down Expand Up @@ -58,7 +58,7 @@ RUN ispm settings install-dir /simics && \
RUN RUSTFLAGS="-C linker=clang -C link-arg=-fuse-ld=$(which ld.lld)" && \
export RUSTFLAGS && \
cargo install cargo-simics-build && \
SIMICS_PACKAGE_VERSION="$(ispm packages --list | grep 1000 | awk '{print $3}' | cut -d '.' -f1).$(grep -E '^version = ' < Cargo.toml | sed -n '$p' | grep -oE '\"[^\"]+\"' | tr -d '\"' | cut -d'.' -f2-)" && \
SIMICS_PACKAGE_VERSION="$(ispm packages --list-installed | grep 1000 | awk '{print $3}' | cut -d '.' -f1).$(grep -E '^version = ' < Cargo.toml | sed -n '$p' | grep -oE '\"[^\"]+\"' | tr -d '\"' | cut -d'.' -f2-)" && \
export SIMICS_PACKAGE_VERSION && \
cargo simics-build -r && \
mkdir -p /packages-internal && \
Expand Down
65 changes: 65 additions & 0 deletions .github/builder/Dockerfile-internal-7
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# hadolint global ignore=DL3033,SC3044
FROM fedora:20

SHELL ["/bin/bash", "-o", "pipefail", "-c"]

ENV PATH="${PATH}:/root/.cargo/bin/"

COPY .github/builder/rsrc/rust-nightly-x86_64-unknown-linux-gnu.tar.xz /install/rust-nightly-x86_64-unknown-linux-gnu.tar.xz
COPY .github/builder/rsrc/make-4.4.1.tar.gz /install/make-4.4.1.tar.gz
COPY .github/builder/rsrc/cmake-3.29.3-linux-x86_64.tar.gz /install/cmake-3.29.3-linux-x86_64.tar.gz
COPY .github/builder/rsrc/lld-5.0.2.src.tar.xz /install/lld-5.0.2.src.tar.xz
COPY .github/builder/rsrc/cfe-5.0.2.src.tar.xz /install/cfe-5.0.2.src.tar.xz
COPY .github/builder/rsrc/llvm-5.0.2.src.tar.xz /install/llvm-5.0.2.src.tar.xz
COPY .github/builder/rsrc/rpms /install/rpms
COPY .github/builder/rsrc/simics-7 /simics
COPY .github/builder/rsrc/ispm /simics/ispm

RUN yum -y install /install/rpms/*.rpm && yum clean all

RUN tar -C /install -xvf /install/rust-nightly-x86_64-unknown-linux-gnu.tar.xz && \
/install/rust-nightly-x86_64-unknown-linux-gnu/install.sh && \
mkdir -p /make && \
tar -C /make --strip-components=1 -xf /install/make-4.4.1.tar.gz && \
pushd /make && \
./configure && \
make && \
make install && \
make clean && \
popd && \
tar -C /usr/local/ --strip-components=1 -xf /install/cmake-3.29.3-linux-x86_64.tar.gz && \
mkdir -p /llvm/tools/clang && \
mkdir -p /llvm/tools/lld && \
tar -C /llvm --strip-components=1 -xf /install/llvm-5.0.2.src.tar.xz && \
tar -C /llvm/tools/clang --strip-components=1 -xf /install/cfe-5.0.2.src.tar.xz && \
tar -C /llvm/tools/lld --strip-components=1 -xf /install/lld-5.0.2.src.tar.xz && \
mkdir -p /llvm/build && \
pushd /llvm/build && \
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE="MinSizeRel" -DLLVM_TARGETS_TO_BUILD="X86" .. && \
make -j "$(nproc)" && \
make install && \
make clean && \
rm -rf /llvm/build/ && \
popd && \
rm -rf /make /llvm

WORKDIR /

ENV PATH="${PATH}:/simics/ispm/"
ENV PATH="${PATH}:/root/.cargo/bin/"

COPY . /tsffs/

WORKDIR /tsffs/

RUN ispm settings install-dir /simics && \
ispm packages --list

RUN RUSTFLAGS="-C linker=clang -C link-arg=-fuse-ld=$(which ld.lld)" && \
export RUSTFLAGS && \
cargo install cargo-simics-build && \
SIMICS_PACKAGE_VERSION="$(ispm packages --list-installed | grep 1000 | awk '{print $3}' | cut -d '.' -f1).$(grep -E '^version = ' < Cargo.toml | sed -n '$p' | grep -oE '\"[^\"]+\"' | tr -d '\"' | cut -d'.' -f2-)" && \
export SIMICS_PACKAGE_VERSION && \
cargo simics-build -r && \
mkdir -p /packages-internal && \
cp target/release/*.ispm /packages-internal
5 changes: 3 additions & 2 deletions .github/builder/common.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/bin/bash

# NOTE: Do not just copy-paste scripts/build.sh!
# NOTE: The `use-keyboxd` option in ~/.gnupg/common.conf should be disabled for this script's GPG routines to
# work correctly!

set -e

Expand Down Expand Up @@ -233,4 +234,4 @@ download_and_verify_builder_deps() {
download_and_verify_cmake
download_and_verify_simics
download_and_verify_builder_rpms
}
}
29 changes: 28 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ version = "0.2.2"

[package.metadata.simics]
package-number = 31337
version = "6.1.4"
version = "6.1.6"

[lib]
crate-type = ["cdylib", "rlib"]
Expand Down Expand Up @@ -76,6 +76,33 @@ tracing-subscriber = "0.3.18"
tracing = { version = "0.1.40", features = ["log"] }
yaxpeax-arm = "0.3.0"
chrono = "0.4.38"
vergilius = "0.1.2"
windows-sys = { features = [
"Win32_Foundation",
"Win32_System_SystemServices",
"Win32_System_Diagnostics_Debug",
"Win32_System_Diagnostics",
"Win32_System_SystemInformation",
"Win32_System_Kernel",
], version = "0.59.0" }
reqwest = { version = "0.12.5", features = [
"blocking",
# NOTE: rustls is used because native-tls does not build with the
# compatibility builder and we don't need any advanced features
"rustls-tls",
], default-features = false }
pdb = "0.8.0"
intervaltree = "0.2.7"
lending-iterator = "0.1.7"
rustc-demangle = "0.1.24"
cpp_demangle = "0.4.3"
walkdir = "2.5.0"
md5 = "0.7.0"
sha1 = "0.10.6"
sha2 = "0.10.8"
typed-path = "0.9.0"
thiserror = "1.0.63"
lcov2 = "0.1.0"

[dev-dependencies]
simics-test = "0.1.0"
Expand Down
61 changes: 41 additions & 20 deletions scripts/build-internal.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@

set -e

MAJOR_VERSION="${1}"

if [ -z "${MAJOR_VERSION}" ]; then
MAJOR_VERSION="7"
fi

SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
ROOT_DIR="${SCRIPT_DIR}/../"
BUILDER_DIR="${ROOT_DIR}/.github/builder/"
Expand All @@ -31,32 +37,47 @@ if [ ! -d "${BUILDER_DIR}/rsrc/ispm" ]; then
cp -a "${ISPM_DIR}" "${BUILDER_DIR}/rsrc/ispm"
fi

if [ ! -d "${BUILDER_DIR}/rsrc/simics" ]; then
echo "Simics packages not found. Installing..."
mkdir -p "${BUILDER_DIR}/rsrc/simics"
ispm packages --install-dir "${BUILDER_DIR}/rsrc/simics" -i \
1000-latest \
1020-latest \
1030-latest \
1031-latest \
2050-latest \
2053-latest \
2096-latest \
4094-latest \
6010-latest \
7801-latest \
8112-latest \
8126-latest \
8144-latest \
install_major_version() {
WANTED_MAJOR_VERSION="${1}"
ispm packages --install-dir "${BUILDER_DIR}/rsrc/simics-${WANTED_MAJOR_VERSION}" -i \
"1000-${WANTED_MAJOR_VERSION}.latest" \
"1020-${WANTED_MAJOR_VERSION}.latest" \
"1030-${WANTED_MAJOR_VERSION}.latest" \
"1031-${WANTED_MAJOR_VERSION}.latest" \
"2050-${WANTED_MAJOR_VERSION}.latest" \
"2053-${WANTED_MAJOR_VERSION}.latest" \
"2096-${WANTED_MAJOR_VERSION}.latest" \
"4094-${WANTED_MAJOR_VERSION}.latest" \
"6010-${WANTED_MAJOR_VERSION}.latest" \
"7801-${WANTED_MAJOR_VERSION}.latest" \
"8112-${WANTED_MAJOR_VERSION}.latest" \
"8126-${WANTED_MAJOR_VERSION}.latest" \
"8144-${WANTED_MAJOR_VERSION}.latest" \
--non-interactive
fi
}

download_and_verify_builder_deps

if [ "${MAJOR_VERSION}" -eq "7" ]; then
DOCKERFILE="${BUILDER_DIR}/Dockerfile-internal-7"
if [ ! -d "${BUILDER_DIR}/rsrc/simics-7" ]; then
echo "Simics 7 packages not found. Installing..."
install_major_version 7
fi
fi

if [ "${MAJOR_VERSION}" -eq "6" ]; then
DOCKERFILE="${BUILDER_DIR}/Dockerfile-internal-6"
if [ ! -d "${BUILDER_DIR}/rsrc/simics-6" ]; then
echo "Simics 6 packages not found. Installing..."
install_major_version 6
fi
fi

unset SIMICS_BASE
docker build \
-t "${IMAGE_NAME}" -f "${BUILDER_DIR}/Dockerfile-internal" "${ROOT_DIR}"
-t "${IMAGE_NAME}" -f "${DOCKERFILE}" "${ROOT_DIR}"
docker create --name "${CONTAINER_NAME}" "${IMAGE_NAME}" bash
mkdir -p "${ROOT_DIR}/packages-internal"
docker cp "${CONTAINER_NAME}:/packages-internal" "${ROOT_DIR}/"
docker rm -f "${CONTAINER_NAME}"
docker rm -f "${CONTAINER_NAME}"
71 changes: 70 additions & 1 deletion src/haps/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use std::time::SystemTime;
use crate::{
arch::ArchitectureOperations,
magic::MagicNumber,
os::DebugInfoConfig,
state::{SolutionKind, StopReason},
ManualStartInfo, Tsffs,
};
Expand All @@ -29,6 +30,7 @@ impl Tsffs {
let start_processor = self
.start_processor()
.ok_or_else(|| anyhow!("No start processor"))?;
let start_processor_raw = start_processor.cpu();

let start_info = match magic_number {
MagicNumber::StartBufferPtrSizePtr => {
Expand All @@ -54,6 +56,20 @@ impl Tsffs {
.map_err(|_| anyhow!("Failed to set start time"))?;
self.coverage_enabled = true;
self.save_initial_snapshot()?;
// Collect windows coverage info if enabled
if self.windows && self.symbolic_coverage {
info!(self.as_conf_object(), "Collecting initial coverage info");
self.windows_os_info.collect(
start_processor_raw,
&self.debuginfo_download_directory,
&mut DebugInfoConfig {
system: self.symbolic_coverage_system,
user_debug_info: &self.debug_info,
coverage: &mut self.coverage,
},
&self.source_file_cache,
)?;
}
self.get_and_write_testcase()?;
self.post_timeout_event()?;
}
Expand Down Expand Up @@ -157,6 +173,10 @@ impl Tsffs {
self.save_execution_trace()?;
}

if self.symbolic_coverage {
self.save_symbolic_coverage()?;
}

debug!(self.as_conf_object(), "Resuming simulation");

run_alone(|| {
Expand Down Expand Up @@ -204,6 +224,21 @@ impl Tsffs {
self.coverage_enabled = true;
self.save_initial_snapshot()?;

// Collect windows coverage info if enabled
if self.windows && self.symbolic_coverage {
info!(self.as_conf_object(), "Collecting initial coverage info");
self.windows_os_info.collect(
processor,
&self.debuginfo_download_directory,
&mut DebugInfoConfig {
system: self.symbolic_coverage_system,
user_debug_info: &self.debug_info,
coverage: &mut self.coverage,
},
&self.source_file_cache,
)?;
}

self.get_and_write_testcase()?;

self.post_timeout_event()?;
Expand Down Expand Up @@ -236,6 +271,21 @@ impl Tsffs {
self.coverage_enabled = true;
self.save_initial_snapshot()?;

// Collect windows coverage info if enabled
if self.windows && self.symbolic_coverage {
info!(self.as_conf_object(), "Collecting initial coverage info");
self.windows_os_info.collect(
processor,
&self.debuginfo_download_directory,
&mut DebugInfoConfig {
system: self.symbolic_coverage_system,
user_debug_info: &self.debug_info,
coverage: &mut self.coverage,
},
&self.source_file_cache,
)?;
}

self.post_timeout_event()?;
}

Expand Down Expand Up @@ -334,6 +384,10 @@ impl Tsffs {
self.save_execution_trace()?;
}

if self.symbolic_coverage {
self.save_symbolic_coverage()?;
}

debug!(self.as_conf_object(), "Resuming simulation");

run_alone(|| {
Expand Down Expand Up @@ -435,6 +489,10 @@ impl Tsffs {
self.save_execution_trace()?;
}

if self.symbolic_coverage {
self.save_symbolic_coverage()?;
}

debug!(self.as_conf_object(), "Resuming simulation");

run_alone(|| {
Expand Down Expand Up @@ -571,7 +629,7 @@ impl Tsffs {
) -> Result<()> {
trace!(
self.as_conf_object(),
"on_magic_instruction({magic_number})"
"Got magic instruction with magic #{magic_number})"
);

if object_is_processor(trigger_obj)? {
Expand Down Expand Up @@ -629,4 +687,15 @@ impl Tsffs {

Ok(())
}

pub fn on_control_register_write(
&mut self,
trigger_obj: *mut ConfObject,
register_nr: i64,
value: i64,
) -> Result<()> {
self.on_control_register_write_windows_symcov(trigger_obj, register_nr, value)?;

Ok(())
}
}
Loading

0 comments on commit e412fc4

Please sign in to comment.