Skip to content

Commit e412fc4

Browse files
authored
Add Windows VMI Options (#98)
1 parent 23be831 commit e412fc4

File tree

37 files changed

+8153
-90
lines changed

37 files changed

+8153
-90
lines changed

.github/builder/Dockerfile-internal renamed to .github/builder/Dockerfile-internal-6

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ COPY .github/builder/rsrc/lld-5.0.2.src.tar.xz /install/lld-5.0.2.src.tar.xz
1212
COPY .github/builder/rsrc/cfe-5.0.2.src.tar.xz /install/cfe-5.0.2.src.tar.xz
1313
COPY .github/builder/rsrc/llvm-5.0.2.src.tar.xz /install/llvm-5.0.2.src.tar.xz
1414
COPY .github/builder/rsrc/rpms /install/rpms
15-
COPY .github/builder/rsrc/simics /simics
15+
COPY .github/builder/rsrc/simics-6 /simics
1616
COPY .github/builder/rsrc/ispm /simics/ispm
1717

1818
RUN yum -y install /install/rpms/*.rpm && yum clean all
@@ -58,7 +58,7 @@ RUN ispm settings install-dir /simics && \
5858
RUN RUSTFLAGS="-C linker=clang -C link-arg=-fuse-ld=$(which ld.lld)" && \
5959
export RUSTFLAGS && \
6060
cargo install cargo-simics-build && \
61-
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-)" && \
61+
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-)" && \
6262
export SIMICS_PACKAGE_VERSION && \
6363
cargo simics-build -r && \
6464
mkdir -p /packages-internal && \
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# hadolint global ignore=DL3033,SC3044
2+
FROM fedora:20
3+
4+
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
5+
6+
ENV PATH="${PATH}:/root/.cargo/bin/"
7+
8+
COPY .github/builder/rsrc/rust-nightly-x86_64-unknown-linux-gnu.tar.xz /install/rust-nightly-x86_64-unknown-linux-gnu.tar.xz
9+
COPY .github/builder/rsrc/make-4.4.1.tar.gz /install/make-4.4.1.tar.gz
10+
COPY .github/builder/rsrc/cmake-3.29.3-linux-x86_64.tar.gz /install/cmake-3.29.3-linux-x86_64.tar.gz
11+
COPY .github/builder/rsrc/lld-5.0.2.src.tar.xz /install/lld-5.0.2.src.tar.xz
12+
COPY .github/builder/rsrc/cfe-5.0.2.src.tar.xz /install/cfe-5.0.2.src.tar.xz
13+
COPY .github/builder/rsrc/llvm-5.0.2.src.tar.xz /install/llvm-5.0.2.src.tar.xz
14+
COPY .github/builder/rsrc/rpms /install/rpms
15+
COPY .github/builder/rsrc/simics-7 /simics
16+
COPY .github/builder/rsrc/ispm /simics/ispm
17+
18+
RUN yum -y install /install/rpms/*.rpm && yum clean all
19+
20+
RUN tar -C /install -xvf /install/rust-nightly-x86_64-unknown-linux-gnu.tar.xz && \
21+
/install/rust-nightly-x86_64-unknown-linux-gnu/install.sh && \
22+
mkdir -p /make && \
23+
tar -C /make --strip-components=1 -xf /install/make-4.4.1.tar.gz && \
24+
pushd /make && \
25+
./configure && \
26+
make && \
27+
make install && \
28+
make clean && \
29+
popd && \
30+
tar -C /usr/local/ --strip-components=1 -xf /install/cmake-3.29.3-linux-x86_64.tar.gz && \
31+
mkdir -p /llvm/tools/clang && \
32+
mkdir -p /llvm/tools/lld && \
33+
tar -C /llvm --strip-components=1 -xf /install/llvm-5.0.2.src.tar.xz && \
34+
tar -C /llvm/tools/clang --strip-components=1 -xf /install/cfe-5.0.2.src.tar.xz && \
35+
tar -C /llvm/tools/lld --strip-components=1 -xf /install/lld-5.0.2.src.tar.xz && \
36+
mkdir -p /llvm/build && \
37+
pushd /llvm/build && \
38+
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE="MinSizeRel" -DLLVM_TARGETS_TO_BUILD="X86" .. && \
39+
make -j "$(nproc)" && \
40+
make install && \
41+
make clean && \
42+
rm -rf /llvm/build/ && \
43+
popd && \
44+
rm -rf /make /llvm
45+
46+
WORKDIR /
47+
48+
ENV PATH="${PATH}:/simics/ispm/"
49+
ENV PATH="${PATH}:/root/.cargo/bin/"
50+
51+
COPY . /tsffs/
52+
53+
WORKDIR /tsffs/
54+
55+
RUN ispm settings install-dir /simics && \
56+
ispm packages --list
57+
58+
RUN RUSTFLAGS="-C linker=clang -C link-arg=-fuse-ld=$(which ld.lld)" && \
59+
export RUSTFLAGS && \
60+
cargo install cargo-simics-build && \
61+
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-)" && \
62+
export SIMICS_PACKAGE_VERSION && \
63+
cargo simics-build -r && \
64+
mkdir -p /packages-internal && \
65+
cp target/release/*.ispm /packages-internal

.github/builder/common.sh

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#!/bin/bash
22

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

56
set -e
67

@@ -233,4 +234,4 @@ download_and_verify_builder_deps() {
233234
download_and_verify_cmake
234235
download_and_verify_simics
235236
download_and_verify_builder_rpms
236-
}
237+
}

Cargo.toml

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ version = "0.2.2"
2121

2222
[package.metadata.simics]
2323
package-number = 31337
24-
version = "6.1.4"
24+
version = "6.1.6"
2525

2626
[lib]
2727
crate-type = ["cdylib", "rlib"]
@@ -76,6 +76,33 @@ tracing-subscriber = "0.3.18"
7676
tracing = { version = "0.1.40", features = ["log"] }
7777
yaxpeax-arm = "0.3.0"
7878
chrono = "0.4.38"
79+
vergilius = "0.1.2"
80+
windows-sys = { features = [
81+
"Win32_Foundation",
82+
"Win32_System_SystemServices",
83+
"Win32_System_Diagnostics_Debug",
84+
"Win32_System_Diagnostics",
85+
"Win32_System_SystemInformation",
86+
"Win32_System_Kernel",
87+
], version = "0.59.0" }
88+
reqwest = { version = "0.12.5", features = [
89+
"blocking",
90+
# NOTE: rustls is used because native-tls does not build with the
91+
# compatibility builder and we don't need any advanced features
92+
"rustls-tls",
93+
], default-features = false }
94+
pdb = "0.8.0"
95+
intervaltree = "0.2.7"
96+
lending-iterator = "0.1.7"
97+
rustc-demangle = "0.1.24"
98+
cpp_demangle = "0.4.3"
99+
walkdir = "2.5.0"
100+
md5 = "0.7.0"
101+
sha1 = "0.10.6"
102+
sha2 = "0.10.8"
103+
typed-path = "0.9.0"
104+
thiserror = "1.0.63"
105+
lcov2 = "0.1.0"
79106

80107
[dev-dependencies]
81108
simics-test = "0.1.0"

scripts/build-internal.sh

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@
1111

1212
set -e
1313

14+
MAJOR_VERSION="${1}"
15+
16+
if [ -z "${MAJOR_VERSION}" ]; then
17+
MAJOR_VERSION="7"
18+
fi
19+
1420
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
1521
ROOT_DIR="${SCRIPT_DIR}/../"
1622
BUILDER_DIR="${ROOT_DIR}/.github/builder/"
@@ -31,32 +37,47 @@ if [ ! -d "${BUILDER_DIR}/rsrc/ispm" ]; then
3137
cp -a "${ISPM_DIR}" "${BUILDER_DIR}/rsrc/ispm"
3238
fi
3339

34-
if [ ! -d "${BUILDER_DIR}/rsrc/simics" ]; then
35-
echo "Simics packages not found. Installing..."
36-
mkdir -p "${BUILDER_DIR}/rsrc/simics"
37-
ispm packages --install-dir "${BUILDER_DIR}/rsrc/simics" -i \
38-
1000-latest \
39-
1020-latest \
40-
1030-latest \
41-
1031-latest \
42-
2050-latest \
43-
2053-latest \
44-
2096-latest \
45-
4094-latest \
46-
6010-latest \
47-
7801-latest \
48-
8112-latest \
49-
8126-latest \
50-
8144-latest \
40+
install_major_version() {
41+
WANTED_MAJOR_VERSION="${1}"
42+
ispm packages --install-dir "${BUILDER_DIR}/rsrc/simics-${WANTED_MAJOR_VERSION}" -i \
43+
"1000-${WANTED_MAJOR_VERSION}.latest" \
44+
"1020-${WANTED_MAJOR_VERSION}.latest" \
45+
"1030-${WANTED_MAJOR_VERSION}.latest" \
46+
"1031-${WANTED_MAJOR_VERSION}.latest" \
47+
"2050-${WANTED_MAJOR_VERSION}.latest" \
48+
"2053-${WANTED_MAJOR_VERSION}.latest" \
49+
"2096-${WANTED_MAJOR_VERSION}.latest" \
50+
"4094-${WANTED_MAJOR_VERSION}.latest" \
51+
"6010-${WANTED_MAJOR_VERSION}.latest" \
52+
"7801-${WANTED_MAJOR_VERSION}.latest" \
53+
"8112-${WANTED_MAJOR_VERSION}.latest" \
54+
"8126-${WANTED_MAJOR_VERSION}.latest" \
55+
"8144-${WANTED_MAJOR_VERSION}.latest" \
5156
--non-interactive
52-
fi
57+
}
5358

5459
download_and_verify_builder_deps
5560

61+
if [ "${MAJOR_VERSION}" -eq "7" ]; then
62+
DOCKERFILE="${BUILDER_DIR}/Dockerfile-internal-7"
63+
if [ ! -d "${BUILDER_DIR}/rsrc/simics-7" ]; then
64+
echo "Simics 7 packages not found. Installing..."
65+
install_major_version 7
66+
fi
67+
fi
68+
69+
if [ "${MAJOR_VERSION}" -eq "6" ]; then
70+
DOCKERFILE="${BUILDER_DIR}/Dockerfile-internal-6"
71+
if [ ! -d "${BUILDER_DIR}/rsrc/simics-6" ]; then
72+
echo "Simics 6 packages not found. Installing..."
73+
install_major_version 6
74+
fi
75+
fi
76+
5677
unset SIMICS_BASE
5778
docker build \
58-
-t "${IMAGE_NAME}" -f "${BUILDER_DIR}/Dockerfile-internal" "${ROOT_DIR}"
79+
-t "${IMAGE_NAME}" -f "${DOCKERFILE}" "${ROOT_DIR}"
5980
docker create --name "${CONTAINER_NAME}" "${IMAGE_NAME}" bash
6081
mkdir -p "${ROOT_DIR}/packages-internal"
6182
docker cp "${CONTAINER_NAME}:/packages-internal" "${ROOT_DIR}/"
62-
docker rm -f "${CONTAINER_NAME}"
83+
docker rm -f "${CONTAINER_NAME}"

src/haps/mod.rs

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::time::SystemTime;
88
use crate::{
99
arch::ArchitectureOperations,
1010
magic::MagicNumber,
11+
os::DebugInfoConfig,
1112
state::{SolutionKind, StopReason},
1213
ManualStartInfo, Tsffs,
1314
};
@@ -29,6 +30,7 @@ impl Tsffs {
2930
let start_processor = self
3031
.start_processor()
3132
.ok_or_else(|| anyhow!("No start processor"))?;
33+
let start_processor_raw = start_processor.cpu();
3234

3335
let start_info = match magic_number {
3436
MagicNumber::StartBufferPtrSizePtr => {
@@ -54,6 +56,20 @@ impl Tsffs {
5456
.map_err(|_| anyhow!("Failed to set start time"))?;
5557
self.coverage_enabled = true;
5658
self.save_initial_snapshot()?;
59+
// Collect windows coverage info if enabled
60+
if self.windows && self.symbolic_coverage {
61+
info!(self.as_conf_object(), "Collecting initial coverage info");
62+
self.windows_os_info.collect(
63+
start_processor_raw,
64+
&self.debuginfo_download_directory,
65+
&mut DebugInfoConfig {
66+
system: self.symbolic_coverage_system,
67+
user_debug_info: &self.debug_info,
68+
coverage: &mut self.coverage,
69+
},
70+
&self.source_file_cache,
71+
)?;
72+
}
5773
self.get_and_write_testcase()?;
5874
self.post_timeout_event()?;
5975
}
@@ -157,6 +173,10 @@ impl Tsffs {
157173
self.save_execution_trace()?;
158174
}
159175

176+
if self.symbolic_coverage {
177+
self.save_symbolic_coverage()?;
178+
}
179+
160180
debug!(self.as_conf_object(), "Resuming simulation");
161181

162182
run_alone(|| {
@@ -204,6 +224,21 @@ impl Tsffs {
204224
self.coverage_enabled = true;
205225
self.save_initial_snapshot()?;
206226

227+
// Collect windows coverage info if enabled
228+
if self.windows && self.symbolic_coverage {
229+
info!(self.as_conf_object(), "Collecting initial coverage info");
230+
self.windows_os_info.collect(
231+
processor,
232+
&self.debuginfo_download_directory,
233+
&mut DebugInfoConfig {
234+
system: self.symbolic_coverage_system,
235+
user_debug_info: &self.debug_info,
236+
coverage: &mut self.coverage,
237+
},
238+
&self.source_file_cache,
239+
)?;
240+
}
241+
207242
self.get_and_write_testcase()?;
208243

209244
self.post_timeout_event()?;
@@ -236,6 +271,21 @@ impl Tsffs {
236271
self.coverage_enabled = true;
237272
self.save_initial_snapshot()?;
238273

274+
// Collect windows coverage info if enabled
275+
if self.windows && self.symbolic_coverage {
276+
info!(self.as_conf_object(), "Collecting initial coverage info");
277+
self.windows_os_info.collect(
278+
processor,
279+
&self.debuginfo_download_directory,
280+
&mut DebugInfoConfig {
281+
system: self.symbolic_coverage_system,
282+
user_debug_info: &self.debug_info,
283+
coverage: &mut self.coverage,
284+
},
285+
&self.source_file_cache,
286+
)?;
287+
}
288+
239289
self.post_timeout_event()?;
240290
}
241291

@@ -334,6 +384,10 @@ impl Tsffs {
334384
self.save_execution_trace()?;
335385
}
336386

387+
if self.symbolic_coverage {
388+
self.save_symbolic_coverage()?;
389+
}
390+
337391
debug!(self.as_conf_object(), "Resuming simulation");
338392

339393
run_alone(|| {
@@ -435,6 +489,10 @@ impl Tsffs {
435489
self.save_execution_trace()?;
436490
}
437491

492+
if self.symbolic_coverage {
493+
self.save_symbolic_coverage()?;
494+
}
495+
438496
debug!(self.as_conf_object(), "Resuming simulation");
439497

440498
run_alone(|| {
@@ -571,7 +629,7 @@ impl Tsffs {
571629
) -> Result<()> {
572630
trace!(
573631
self.as_conf_object(),
574-
"on_magic_instruction({magic_number})"
632+
"Got magic instruction with magic #{magic_number})"
575633
);
576634

577635
if object_is_processor(trigger_obj)? {
@@ -629,4 +687,15 @@ impl Tsffs {
629687

630688
Ok(())
631689
}
690+
691+
pub fn on_control_register_write(
692+
&mut self,
693+
trigger_obj: *mut ConfObject,
694+
register_nr: i64,
695+
value: i64,
696+
) -> Result<()> {
697+
self.on_control_register_write_windows_symcov(trigger_obj, register_nr, value)?;
698+
699+
Ok(())
700+
}
632701
}

0 commit comments

Comments
 (0)