Major refactor
This commit is contained in:
parent
30d9527ceb
commit
8edd90b6a3
5
.idea/DendrobatesTinctoriusAzureus.iml
generated
5
.idea/DendrobatesTinctoriusAzureus.iml
generated
@ -2,7 +2,7 @@
|
|||||||
<module type="CPP_MODULE" version="4">
|
<module type="CPP_MODULE" version="4">
|
||||||
<component name="FacetManager">
|
<component name="FacetManager">
|
||||||
<facet type="Python" name="Python facet">
|
<facet type="Python" name="Python facet">
|
||||||
<configuration sdkName="Python 3.7 (dendrobates-t-azureus)" />
|
<configuration sdkName="" />
|
||||||
</facet>
|
</facet>
|
||||||
</component>
|
</component>
|
||||||
<component name="NewModuleRootManager">
|
<component name="NewModuleRootManager">
|
||||||
@ -41,6 +41,8 @@
|
|||||||
<sourceFolder url="file://$MODULE_DIR$/covert_channels_benchmark/src" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/covert_channels_benchmark/src" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/prefetcher_reverse/src" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/prefetcher_reverse/src" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/CacheObserver/src" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/CacheObserver/src" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/dendrobates-t-azureus/src" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/dendrobates-t-azureus/tests" isTestSource="true" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/cache_info/target" />
|
<excludeFolder url="file://$MODULE_DIR$/cache_info/target" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/cache_utils/target" />
|
<excludeFolder url="file://$MODULE_DIR$/cache_utils/target" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/kernel/target" />
|
<excludeFolder url="file://$MODULE_DIR$/kernel/target" />
|
||||||
@ -51,6 +53,5 @@
|
|||||||
</content>
|
</content>
|
||||||
<orderEntry type="inheritedJdk" />
|
<orderEntry type="inheritedJdk" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
<orderEntry type="library" name="Python 3.7 (dendrobates-t-azureus) interpreter library" level="application" />
|
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
227
Cargo.lock
generated
227
Cargo.lock
generated
@ -12,23 +12,9 @@ dependencies = [
|
|||||||
"cache_utils",
|
"cache_utils",
|
||||||
"flush_flush",
|
"flush_flush",
|
||||||
"flush_reload",
|
"flush_reload",
|
||||||
"itertools",
|
"itertools 0.10.1",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"nix",
|
"nix 0.20.0",
|
||||||
"rand",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "aes-t-tables"
|
|
||||||
version = "0.1.0"
|
|
||||||
dependencies = [
|
|
||||||
"cache_side_channel",
|
|
||||||
"cache_utils",
|
|
||||||
"flush_flush",
|
|
||||||
"flush_reload",
|
|
||||||
"memmap2",
|
|
||||||
"nix",
|
|
||||||
"openssl",
|
|
||||||
"rand",
|
"rand",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -45,15 +31,24 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "arrayref"
|
name = "arrayref"
|
||||||
version = "0.3.6"
|
version = "0.3.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
|
checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "atomic"
|
||||||
|
version = "0.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994"
|
||||||
|
dependencies = [
|
||||||
|
"bytemuck",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "autocfg"
|
name = "autocfg"
|
||||||
version = "1.0.1"
|
version = "1.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
|
checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "basic_timing_cache_channel"
|
name = "basic_timing_cache_channel"
|
||||||
@ -61,20 +56,14 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"cache_side_channel",
|
"cache_side_channel",
|
||||||
"cache_utils",
|
"cache_utils",
|
||||||
"nix",
|
"nix 0.28.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bit_field"
|
name = "bit_field"
|
||||||
version = "0.9.0"
|
version = "0.10.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ed8765909f9009617974ab6b7d332625b320b33c326b1e9321382ef1999b5d56"
|
checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bit_field"
|
|
||||||
version = "0.10.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitflags"
|
name = "bitflags"
|
||||||
@ -82,6 +71,12 @@ version = "1.2.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
|
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "2.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitvec"
|
name = "bitvec"
|
||||||
version = "0.22.3"
|
version = "0.22.3"
|
||||||
@ -96,32 +91,39 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bootloader"
|
name = "bootloader"
|
||||||
version = "0.9.18"
|
version = "0.9.29"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7a3c1ceed1cd9e61c7998100cc18c13d413aa40d018992b871ab8e7435ce6372"
|
checksum = "365861702868e2a37b4247aaecc7bd8f4389baec8d025497ad8ba7ff37ee9440"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bit_field 0.10.1",
|
"bit_field",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bytemuck"
|
||||||
|
version = "1.16.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cache_side_channel"
|
name = "cache_side_channel"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bit_field 0.10.1",
|
"bit_field",
|
||||||
"nix",
|
"nix 0.28.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cache_utils"
|
name = "cache_utils"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"atomic",
|
||||||
"bitvec",
|
"bitvec",
|
||||||
"cpuid",
|
"cpuid",
|
||||||
"hashbrown",
|
"hashbrown",
|
||||||
"itertools",
|
"itertools 0.12.1",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"libc",
|
"libc",
|
||||||
"nix",
|
"nix 0.28.0",
|
||||||
"polling_serial",
|
"polling_serial",
|
||||||
"static_assertions",
|
"static_assertions",
|
||||||
"turn_lock",
|
"turn_lock",
|
||||||
@ -141,6 +143,12 @@ version = "1.0.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cfg_aliases"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "covert_channels_benchmark"
|
name = "covert_channels_benchmark"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
@ -150,17 +158,17 @@ dependencies = [
|
|||||||
"covert_channels_evaluation",
|
"covert_channels_evaluation",
|
||||||
"flush_flush",
|
"flush_flush",
|
||||||
"flush_reload",
|
"flush_reload",
|
||||||
"nix",
|
"nix 0.20.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "covert_channels_evaluation"
|
name = "covert_channels_evaluation"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bit_field 0.10.1",
|
"bit_field",
|
||||||
"cache_side_channel",
|
"cache_side_channel",
|
||||||
"cache_utils",
|
"cache_utils",
|
||||||
"nix",
|
"nix 0.28.0",
|
||||||
"rand",
|
"rand",
|
||||||
"turn_lock",
|
"turn_lock",
|
||||||
]
|
]
|
||||||
@ -169,7 +177,7 @@ dependencies = [
|
|||||||
name = "cpuid"
|
name = "cpuid"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itertools",
|
"itertools 0.13.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -200,7 +208,7 @@ dependencies = [
|
|||||||
"basic_timing_cache_channel",
|
"basic_timing_cache_channel",
|
||||||
"cache_side_channel",
|
"cache_side_channel",
|
||||||
"cache_utils",
|
"cache_utils",
|
||||||
"nix",
|
"nix 0.28.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -210,24 +218,9 @@ dependencies = [
|
|||||||
"basic_timing_cache_channel",
|
"basic_timing_cache_channel",
|
||||||
"cache_side_channel",
|
"cache_side_channel",
|
||||||
"cache_utils",
|
"cache_utils",
|
||||||
"nix",
|
"nix 0.28.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "foreign-types"
|
|
||||||
version = "0.3.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
|
|
||||||
dependencies = [
|
|
||||||
"foreign-types-shared",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "foreign-types-shared"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "funty"
|
name = "funty"
|
||||||
version = "1.2.0"
|
version = "1.2.0"
|
||||||
@ -263,6 +256,24 @@ dependencies = [
|
|||||||
"either",
|
"either",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itertools"
|
||||||
|
version = "0.12.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
|
||||||
|
dependencies = [
|
||||||
|
"either",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itertools"
|
||||||
|
version = "0.13.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
|
||||||
|
dependencies = [
|
||||||
|
"either",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lazy_static"
|
name = "lazy_static"
|
||||||
version = "1.4.0"
|
version = "1.4.0"
|
||||||
@ -274,88 +285,59 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.96"
|
version = "0.2.155"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5600b4e6efc5421841a2138a6b082e07fe12f9aaa12783d50e5d13325b26b4fc"
|
checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "linked_list_allocator"
|
name = "linked_list_allocator"
|
||||||
version = "0.9.0"
|
version = "0.9.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d0b725207570aa16096962d0b20c79f8a543df2280bd3c903022b9b0b4d7ea68"
|
checksum = "549ce1740e46b291953c4340adcd74c59bcf4308f4cac050fd33ba91b7168f4a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"spinning_top",
|
"spinning_top",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lock_api"
|
name = "lock_api"
|
||||||
version = "0.4.4"
|
version = "0.4.12"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb"
|
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
"scopeguard",
|
"scopeguard",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "memmap2"
|
|
||||||
version = "0.2.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "723e3ebdcdc5c023db1df315364573789f8857c11b631a2fdfad7c00f5c046b4"
|
|
||||||
dependencies = [
|
|
||||||
"libc",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nix"
|
name = "nix"
|
||||||
version = "0.20.0"
|
version = "0.20.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a"
|
checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.2.1",
|
||||||
"cc",
|
"cc",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nix"
|
||||||
|
version = "0.28.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.5.0",
|
||||||
|
"cfg-if",
|
||||||
|
"cfg_aliases",
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "once_cell"
|
name = "once_cell"
|
||||||
version = "1.7.2"
|
version = "1.7.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3"
|
checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "openssl"
|
|
||||||
version = "0.10.34"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6d7830286ad6a3973c0f1d9b73738f69c76b739301d0229c4b96501695cbe4c8"
|
|
||||||
dependencies = [
|
|
||||||
"bitflags",
|
|
||||||
"cfg-if",
|
|
||||||
"foreign-types",
|
|
||||||
"libc",
|
|
||||||
"once_cell",
|
|
||||||
"openssl-sys",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "openssl-sys"
|
|
||||||
version = "0.9.63"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b6b0d6fb7d80f877617dfcb014e605e2b5ab2fb0afdf27935219bb6bd984cb98"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg",
|
|
||||||
"cc",
|
|
||||||
"libc",
|
|
||||||
"pkg-config",
|
|
||||||
"vcpkg",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "pkg-config"
|
|
||||||
version = "0.3.19"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "polling_serial"
|
name = "polling_serial"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
@ -379,14 +361,13 @@ checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.8.3"
|
version = "0.8.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e"
|
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"rand_chacha",
|
"rand_chacha",
|
||||||
"rand_core",
|
"rand_core",
|
||||||
"rand_hc",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -409,13 +390,10 @@ dependencies = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_hc"
|
name = "rustversion"
|
||||||
version = "0.3.0"
|
version = "1.0.15"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73"
|
checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47"
|
||||||
dependencies = [
|
|
||||||
"rand_core",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "scopeguard"
|
name = "scopeguard"
|
||||||
@ -440,9 +418,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "spinning_top"
|
name = "spinning_top"
|
||||||
version = "0.2.4"
|
version = "0.2.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "75adad84ee84b521fb2cca2d4fd0f1dab1d8d026bda3c5bea4ca63b5f9f9293c"
|
checksum = "5b9eb1a2f4c41445a3a0ff9abc5221c5fcd28e1f13cd7c0397706f9ac938ddb0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"lock_api",
|
"lock_api",
|
||||||
]
|
]
|
||||||
@ -463,12 +441,6 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
|
|||||||
name = "turn_lock"
|
name = "turn_lock"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "vcpkg"
|
|
||||||
version = "0.2.13"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "025ce40a007e1907e58d5bc1a594def78e5573bb0b1160bc389634e8f12e4faa"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "version_check"
|
name = "version_check"
|
||||||
version = "0.9.3"
|
version = "0.9.3"
|
||||||
@ -513,11 +485,12 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "x86_64"
|
name = "x86_64"
|
||||||
version = "0.14.3"
|
version = "0.15.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b7c54a17492391c594753ce2a180142bec7ad2876543565c2a08aa11cddef251"
|
checksum = "4bc79523af8abf92fb1a970c3e086c5a343f6bcc1a0eb890f575cbb3b45743df"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bit_field 0.9.0",
|
"bit_field",
|
||||||
"bitflags",
|
"bitflags 2.5.0",
|
||||||
|
"rustversion",
|
||||||
"volatile 0.4.4",
|
"volatile 0.4.4",
|
||||||
]
|
]
|
||||||
|
57
Cargo.toml
57
Cargo.toml
@ -5,7 +5,7 @@ members = [
|
|||||||
"polling_serial",
|
"polling_serial",
|
||||||
"cache_utils",
|
"cache_utils",
|
||||||
"cpuid",
|
"cpuid",
|
||||||
"aes-t-tables",
|
#"aes-t-tables",
|
||||||
"covert_channels_benchmark",
|
"covert_channels_benchmark",
|
||||||
"covert_channels_evaluation",
|
"covert_channels_evaluation",
|
||||||
"cache_side_channel",
|
"cache_side_channel",
|
||||||
@ -14,58 +14,5 @@ members = [
|
|||||||
"basic_timing_cache_channel",
|
"basic_timing_cache_channel",
|
||||||
"turn_lock",
|
"turn_lock",
|
||||||
"CacheObserver",
|
"CacheObserver",
|
||||||
|
"dendrobates-t-azureus"
|
||||||
]
|
]
|
||||||
|
|
||||||
[package]
|
|
||||||
name = "dendrobates_tinctoreus_azureus"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["Guillaume DIDIER <guillaume.didier.2014@polytechnique.org>"]
|
|
||||||
edition = "2018"
|
|
||||||
|
|
||||||
[package.metadata.bootimage]
|
|
||||||
#run-command = ["./scripts/bochs.sh", "{}"]
|
|
||||||
run-command = ["./scripts/run.sh", "{}"]
|
|
||||||
test-args = ["qemu"]
|
|
||||||
run-args = ["bochs"]
|
|
||||||
#run-command = ["qemu-system-x86_64", "-drive", "format=raw,file={}"]
|
|
||||||
#test-args = ["-device", "isa-debug-exit,iobase=0xf4,iosize=0x04"]
|
|
||||||
test-success-exit-code = 33 # (0x10 << 1) | 1
|
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
x86_64 = "0.14.3"
|
|
||||||
vga_buffer = { path = "vga_buffer" }
|
|
||||||
polling_serial = { path = "polling_serial" }
|
|
||||||
volatile = "0.4.4"
|
|
||||||
linked_list_allocator = "0.9.0"
|
|
||||||
cache_utils = { path = "cache_utils", features = ["no_std"], default-features = false }
|
|
||||||
arrayref = "0.3.6"
|
|
||||||
|
|
||||||
[dependencies.lazy_static]
|
|
||||||
version = "1.4.0"
|
|
||||||
features = ["spin_no_std"]
|
|
||||||
|
|
||||||
[dependencies.bootloader]
|
|
||||||
version = "0.9.16"
|
|
||||||
features = ["sse", "map_physical_memory"]
|
|
||||||
|
|
||||||
#[patch.crates-io]
|
|
||||||
#bootloader = { path = "../bootloader" }
|
|
||||||
|
|
||||||
[profile.dev]
|
|
||||||
opt-level = 1
|
|
||||||
debug = 2
|
|
||||||
|
|
||||||
|
|
||||||
[profile.test]
|
|
||||||
opt-level = 1
|
|
||||||
debug = 2
|
|
||||||
|
|
||||||
[[test]]
|
|
||||||
name = "panic_test"
|
|
||||||
harness = false
|
|
||||||
|
|
||||||
[[test]]
|
|
||||||
name = "stack_overflow"
|
|
||||||
harness = false
|
|
||||||
|
88
README-Calibration.md
Normal file
88
README-Calibration.md
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
# calibration-done-right
|
||||||
|
Public code for the "calibration done right" paper
|
||||||
|
|
||||||
|
The code base is written entirely in rust.
|
||||||
|
|
||||||
|
There are three crates with binaries providing results :
|
||||||
|
- **aes-t-tables** runs the T-table attack using the 3 side channels
|
||||||
|
- **cache_utils** `two_thread_cal` runs a full calibration on all core pairs for Flush+Flush
|
||||||
|
and analyses the results to provide error rate predictions in various attacker models
|
||||||
|
- **covert_channel_beanchmark** is the crate that runs covert channel benchmarks on the various covert channels
|
||||||
|
|
||||||
|
The code presented runs under Fedora 30, and can also be made run on Ubuntu 18.04 LTS with minor tweaks
|
||||||
|
|
||||||
|
(Notably lib cpupower may also be called lib cpufreq)
|
||||||
|
|
||||||
|
On recent fedora the package is `kernel-tools-libs-devel`, on debian `libcpupower-dev`
|
||||||
|
|
||||||
|
You will also need utility `cpupower` (from `kernel-tools` / `linux-cpupower`)
|
||||||
|
|
||||||
|
# Usage
|
||||||
|
|
||||||
|
## General set-up
|
||||||
|
|
||||||
|
Requires rust nightly features. Install rust nightly using rustup
|
||||||
|
|
||||||
|
One should disable turbo boost and other source of idle frequency scaling
|
||||||
|
|
||||||
|
On Intel platforms, the following should work.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# performance cpu frequency governor
|
||||||
|
cpupower frequency-set -g performance
|
||||||
|
|
||||||
|
# No Turbo Boost
|
||||||
|
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
|
||||||
|
```
|
||||||
|
|
||||||
|
Depending on the experiment you may be interested in disabling prefetchers.
|
||||||
|
|
||||||
|
## Two thread calibration set-up and usage
|
||||||
|
|
||||||
|
In addition to the general set-up you need to enable 2MB hugepage and ensure at least one is available.
|
||||||
|
|
||||||
|
Then you can run `cargo run --release --bin two_thread_cal > result.log`
|
||||||
|
|
||||||
|
Various scripts are also included that have been used to parse the log.
|
||||||
|
|
||||||
|
`analyse.sh` -> `analyse_csv.py` -> `analyse_median.py` Is used to analyse the timing histograms
|
||||||
|
`extract_analysis_csv.sh` Is used to extract the attacker model results.
|
||||||
|
|
||||||
|
The python scripts requires an environment (such as a virtual env) with the packages in `cache_utils/requirements.txt`
|
||||||
|
|
||||||
|
## AES T-table set-up and usage
|
||||||
|
|
||||||
|
One needs an OpenSSL built with the no-asm and the no-hw flags install in ~/openssl (the path is in aes-t-tables/cargo.sh and can be changed).
|
||||||
|
|
||||||
|
You the need to extract the T-table addresses, this can be done using `nm libcrypto.so | "grep Te[0-4]"`, and update those in aes-t-tables/src/main.rs
|
||||||
|
|
||||||
|
You'll also want to update the thresholds in main.rs using the results from the calibration.
|
||||||
|
|
||||||
|
You can then run `./cargo.sh run --release > result.log`
|
||||||
|
|
||||||
|
|
||||||
|
## Covert Channel benchmark
|
||||||
|
|
||||||
|
Do the general set-up, update the thresholds for Naive channels in main.rs and then run `cargo run --release | tee results.log`
|
||||||
|
|
||||||
|
|
||||||
|
# Crate documentation
|
||||||
|
|
||||||
|
- `cpuid` is a small crate that handles CPU microarchitecture indentification and provides info about what is known about it
|
||||||
|
- `cache_utils` contains utilities related to cache attacks
|
||||||
|
- `cache_side_channel` defines the interface cache side channels have to implement
|
||||||
|
- `basic_timing_cache_channel` contains generic implementations of Naive and Optimised cache side channels, that just require providing the actual operation used
|
||||||
|
- `flush_flush` and `flush_reload` are tiny crates that use `basic_timing_cache_channel` to export Flush+Flush and Flush+Reload primitives
|
||||||
|
- `turn_lock` is the synchronisation primitive used by `cache_utils` and the `covert_channel_evaluation`.
|
||||||
|
- `covert_channel_evaluation` is a generic implementation of a `covert_channel` benchmark
|
||||||
|
- `covert_channel_benchmark` calls the previous implementation over the 3 channels.
|
||||||
|
|
||||||
|
# rust version
|
||||||
|
|
||||||
|
Known good nightly :
|
||||||
|
- rustc 1.54.0-nightly (eab201df7 2021-06-09)
|
||||||
|
- rustc 1.55.0-nightly (885399992 2021-07-06)
|
||||||
|
|
||||||
|
# License
|
||||||
|
|
||||||
|
Apache-2.0 or MIT
|
3
README.md
Normal file
3
README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
See README-Calibration.md
|
||||||
|
|
||||||
|
Merging of the readmes of various paper code in progress.
|
@ -3,15 +3,16 @@ name = "aes-t-tables"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["GuillaumeDIDIER <guillaume.didier95@hotmail.fr>"]
|
authors = ["GuillaumeDIDIER <guillaume.didier95@hotmail.fr>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
license = "MIT OR Apache-2.0"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
openssl = "0.10.33"
|
openssl = "0.10.33"
|
||||||
cache_utils = { path = "../cache_utils" }
|
cache_utils = { path = "../cache_utils" }
|
||||||
memmap2 = "0.2.1"
|
memmap2 = "0.9.4"
|
||||||
rand = "0.8.3"
|
rand = "0.8.5"
|
||||||
nix = "0.20.0"
|
nix = "0.28.0"
|
||||||
cache_side_channel = { path = "../cache_side_channel" }
|
cache_side_channel = { path = "../cache_side_channel" }
|
||||||
flush_flush = { path = "../flush_flush" }
|
flush_flush = { path = "../flush_flush" }
|
||||||
flush_reload = { path = "../flush_reload" }
|
flush_reload = { path = "../flush_reload" }
|
||||||
|
@ -1,4 +1,11 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2021 Guillaume DIDIER
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
#/bin/bash
|
#/bin/bash
|
||||||
|
|
||||||
|
# Change this to the correct openssl installation path
|
||||||
export OPENSSL_DIR=$(readlink -f ~/openssl)
|
export OPENSSL_DIR=$(readlink -f ~/openssl)
|
||||||
export X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR=$OPENSSL_DIR
|
export X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR=$OPENSSL_DIR
|
||||||
export PKG_CONFIG_PATH=$OPENSSL_DIR
|
export PKG_CONFIG_PATH=$OPENSSL_DIR
|
||||||
|
@ -9,4 +9,4 @@ edition = "2018"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
cache_utils = { path = "../cache_utils" }
|
cache_utils = { path = "../cache_utils" }
|
||||||
cache_side_channel = { path = "../cache_side_channel" }
|
cache_side_channel = { path = "../cache_side_channel" }
|
||||||
nix = "0.20.0"
|
nix = "0.28.0"
|
||||||
|
@ -13,7 +13,6 @@ use cache_side_channel::table_side_channel::{
|
|||||||
MultipleTableCacheSideChannel, SingleTableCacheSideChannel, TableAttackResult,
|
MultipleTableCacheSideChannel, SingleTableCacheSideChannel, TableAttackResult,
|
||||||
TableCacheSideChannel,
|
TableCacheSideChannel,
|
||||||
};
|
};
|
||||||
use cache_side_channel::SideChannelError::AddressNotReady;
|
|
||||||
use cache_side_channel::{
|
use cache_side_channel::{
|
||||||
BitIterator, CacheStatus, ChannelFatalError, ChannelHandle, CoreSpec, CovertChannel,
|
BitIterator, CacheStatus, ChannelFatalError, ChannelHandle, CoreSpec, CovertChannel,
|
||||||
MultipleAddrCacheSideChannel, SideChannelError, SingleAddrCacheSideChannel,
|
MultipleAddrCacheSideChannel, SideChannelError, SingleAddrCacheSideChannel,
|
||||||
@ -26,9 +25,9 @@ use cache_utils::calibration::{
|
|||||||
CFLUSH_BUCKET_NUMBER, CFLUSH_BUCKET_SIZE, CFLUSH_NUM_ITER, CLFLUSH_NUM_ITERATION_AV, PAGE_LEN,
|
CFLUSH_BUCKET_NUMBER, CFLUSH_BUCKET_SIZE, CFLUSH_NUM_ITER, CLFLUSH_NUM_ITERATION_AV, PAGE_LEN,
|
||||||
SP, VPN,
|
SP, VPN,
|
||||||
};
|
};
|
||||||
use cache_utils::complex_addressing::{CacheAttackSlicing, CacheSlicing};
|
use cache_utils::complex_addressing::{CacheAttackSlicing};
|
||||||
use cache_utils::mmap::MMappedMemory;
|
use cache_utils::mmap::MMappedMemory;
|
||||||
use cache_utils::{find_core_per_socket, flush, maccess, noop};
|
use cache_utils::{find_core_per_socket, flush, maccess};
|
||||||
use nix::sched::sched_getaffinity;
|
use nix::sched::sched_getaffinity;
|
||||||
use nix::sched::CpuSet;
|
use nix::sched::CpuSet;
|
||||||
use nix::unistd::Pid;
|
use nix::unistd::Pid;
|
||||||
@ -314,7 +313,7 @@ impl<T: TimingChannelPrimitives> TopologyAwareTimingChannel<T> {
|
|||||||
|
|
||||||
// Select the proper core
|
// Select the proper core
|
||||||
|
|
||||||
for (av, (global_error_pred, thresholds)) in res.iter() {
|
for (av, (global_error_pred, _thresholds)) in res.iter() {
|
||||||
if global_error_pred.error_rate() < best_error_rate {
|
if global_error_pred.error_rate() < best_error_rate {
|
||||||
best_av = *av;
|
best_av = *av;
|
||||||
best_error_rate = global_error_pred.error_rate();
|
best_error_rate = global_error_pred.error_rate();
|
||||||
@ -625,7 +624,7 @@ impl<T: TimingChannelPrimitives> MultipleAddrCacheSideChannel for TopologyAwareT
|
|||||||
pages.into_iter().map(|(k, v)| v),
|
pages.into_iter().map(|(k, v)| v),
|
||||||
self.calibration_strategy,
|
self.calibration_strategy,
|
||||||
) {
|
) {
|
||||||
Err(e) => {
|
Err(_e) => {
|
||||||
return Err(ChannelFatalError::Oops);
|
return Err(ChannelFatalError::Oops);
|
||||||
}
|
}
|
||||||
Ok(r) => r,
|
Ok(r) => r,
|
||||||
@ -740,7 +739,7 @@ impl<T: TimingChannelPrimitives> CovertChannel for TopologyAwareTimingChannel<T>
|
|||||||
unsafe fn ready_page(&mut self, page: *const u8) -> Result<Self::CovertChannelHandle, ()> {
|
unsafe fn ready_page(&mut self, page: *const u8) -> Result<Self::CovertChannelHandle, ()> {
|
||||||
let vpn: VPN = get_vpn(page);
|
let vpn: VPN = get_vpn(page);
|
||||||
// Check if the page has already been readied. If so should error out ?
|
// Check if the page has already been readied. If so should error out ?
|
||||||
if let Some(preferred) = self.preferred_address.get(&vpn) {
|
if self.preferred_address.get(&vpn).is_some() {
|
||||||
return Err(());
|
return Err(());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -758,7 +757,7 @@ impl<T: TimingChannelPrimitives> CovertChannel for TopologyAwareTimingChannel<T>
|
|||||||
pages.into_iter(),
|
pages.into_iter(),
|
||||||
self.calibration_strategy,
|
self.calibration_strategy,
|
||||||
) {
|
) {
|
||||||
Err(e) => {
|
Err(_e) => {
|
||||||
return Err(());
|
return Err(());
|
||||||
}
|
}
|
||||||
Ok(r) => r,
|
Ok(r) => r,
|
||||||
@ -816,7 +815,7 @@ impl<T: TimingChannelPrimitives> CovertChannel for TopologyAwareTimingChannel<T>
|
|||||||
calibration_epoch: self.calibration_epoch,
|
calibration_epoch: self.calibration_epoch,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
let r = unsafe { self.prepare_one_impl(&mut handle.0) }.unwrap();
|
unsafe { self.prepare_one_impl(&mut handle.0) }.unwrap();
|
||||||
|
|
||||||
return Ok(handle);
|
return Ok(handle);
|
||||||
}
|
}
|
||||||
|
@ -7,5 +7,5 @@ edition = "2018"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
nix = "0.20.0"
|
nix = "0.28.0"
|
||||||
bit_field = "0.10.1"
|
bit_field = "0.10.2"
|
||||||
|
@ -41,7 +41,7 @@ pub fn restore_affinity(cpu_set: &CpuSet) {
|
|||||||
sched_setaffinity(Pid::from_raw(0), &cpu_set).unwrap();
|
sched_setaffinity(Pid::from_raw(0), &cpu_set).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[must_use = "This result must be used to restore affinity"]
|
//#[must_use = "This result must be used to restore affinity"]
|
||||||
pub fn set_affinity(cpu_set: &CpuSet) -> Result<CpuSet, nix::Error> {
|
pub fn set_affinity(cpu_set: &CpuSet) -> Result<CpuSet, nix::Error> {
|
||||||
let old = sched_getaffinity(Pid::from_raw(0))?;
|
let old = sched_getaffinity(Pid::from_raw(0))?;
|
||||||
sched_setaffinity(Pid::from_raw(0), &cpu_set)?;
|
sched_setaffinity(Pid::from_raw(0), &cpu_set)?;
|
||||||
@ -161,7 +161,7 @@ impl<'a> BitIterator<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn atEnd(&self) -> bool {
|
pub fn at_end(&self) -> bool {
|
||||||
self.byte_index >= self.bytes.len()
|
self.byte_index >= self.bytes.len()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -118,11 +118,11 @@ impl<T: SingleAddrCacheSideChannel> SingleTableCacheSideChannel<T::Handle> for T
|
|||||||
SideChannelError::AddressNotCalibrated(_addr) => unimplemented!(),
|
SideChannelError::AddressNotCalibrated(_addr) => unimplemented!(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for iteration in 0..100 {
|
for _iteration in 0..100 {
|
||||||
self.victim_single(victim);
|
self.victim_single(victim);
|
||||||
let r = unsafe { self.test_single(addr, true) };
|
let r = unsafe { self.test_single(addr, true) };
|
||||||
match r {
|
match r {
|
||||||
Ok(status) => {}
|
Ok(_status) => {}
|
||||||
Err(e) => match e {
|
Err(e) => match e {
|
||||||
SideChannelError::NeedRecalibration => panic!(),
|
SideChannelError::NeedRecalibration => panic!(),
|
||||||
SideChannelError::FatalError(e) => {
|
SideChannelError::FatalError(e) => {
|
||||||
@ -193,7 +193,7 @@ impl<T: MultipleAddrCacheSideChannel> MultipleTableCacheSideChannel<T::Handle> f
|
|||||||
batch.push(&mut **addr);
|
batch.push(&mut **addr);
|
||||||
let mut hits: HashMap<*const u8, u32> = HashMap::new();
|
let mut hits: HashMap<*const u8, u32> = HashMap::new();
|
||||||
let mut misses: HashMap<*const u8, u32> = HashMap::new();
|
let mut misses: HashMap<*const u8, u32> = HashMap::new();
|
||||||
for i in 1..T::MAX_ADDR {
|
for _i in 1..T::MAX_ADDR {
|
||||||
if let Some(addr) = addr_iter.next() {
|
if let Some(addr) = addr_iter.next() {
|
||||||
batch.push(&mut **addr);
|
batch.push(&mut **addr);
|
||||||
} else {
|
} else {
|
||||||
|
@ -3,6 +3,7 @@ name = "cache_utils"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Guillaume DIDIER <guillaume.didier.2014@polytechnique.org>"]
|
authors = ["Guillaume DIDIER <guillaume.didier.2014@polytechnique.org>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
license = "MIT OR Apache-2.0"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
@ -10,12 +11,13 @@ edition = "2018"
|
|||||||
polling_serial = { path = "../polling_serial", optional = true }
|
polling_serial = { path = "../polling_serial", optional = true }
|
||||||
vga_buffer = { path = "../vga_buffer", optional = true }
|
vga_buffer = { path = "../vga_buffer", optional = true }
|
||||||
cpuid = { path = "../cpuid", default-features = false }
|
cpuid = { path = "../cpuid", default-features = false }
|
||||||
x86_64 = "0.14.1"
|
x86_64 = "0.15.1"
|
||||||
static_assertions = "1.1.0"
|
static_assertions = "1.1.0"
|
||||||
itertools = { version = "0.10.0", default-features = false }
|
itertools = { version = "0.12.1", default-features = false }
|
||||||
|
atomic = "0.6.0"
|
||||||
|
|
||||||
nix = { version = "0.20.0", optional = true }
|
nix = { version = "0.28.0", optional = true, features = ["process", "mman", "sched"] }
|
||||||
libc = { version = "0.2.92", optional = true }
|
libc = { version = "0.2.153", optional = true }
|
||||||
hashbrown = { version = "0.11.2", optional = true }
|
hashbrown = { version = "0.11.2", optional = true }
|
||||||
turn_lock = { path = "../turn_lock", optional = true}
|
turn_lock = { path = "../turn_lock", optional = true}
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
|
3
cache_utils/Readme.md
Normal file
3
cache_utils/Readme.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
Notes for Fedora 39
|
||||||
|
- kernel-tools + kernel-tools-devel needed
|
231
cache_utils/analyse_csv.py
Normal file
231
cache_utils/analyse_csv.py
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2021 Guillaume DIDIER
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
import pandas as pd
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import seaborn as sns
|
||||||
|
import tikzplotlib
|
||||||
|
from sys import exit
|
||||||
|
import wquantiles as wq
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
from functools import partial
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# For cyber cobay sanity check :
|
||||||
|
from gmpy2 import popcount
|
||||||
|
functions_i9_9900 = [
|
||||||
|
0b1111111111010101110101010001000000,
|
||||||
|
0b0110111110111010110001001000000000,
|
||||||
|
0b1111111000011111110010110000000000]
|
||||||
|
|
||||||
|
|
||||||
|
def complex_hash(addr):
|
||||||
|
r = 0
|
||||||
|
for f in reversed(functions_i9_9900):
|
||||||
|
r <<= 1
|
||||||
|
r |= (popcount(f & addr) & 1)
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
def convert64(x):
|
||||||
|
return np.int64(int(x, base=16))
|
||||||
|
|
||||||
|
def convert8(x):
|
||||||
|
return np.int8(int(x, base=16))
|
||||||
|
|
||||||
|
df = pd.read_csv(sys.argv[1] + "-results_lite.csv.bz2",
|
||||||
|
dtype={
|
||||||
|
"main_core": np.int8,
|
||||||
|
"helper_core": np.int8,
|
||||||
|
# "address": int,
|
||||||
|
# "hash": np.int8,
|
||||||
|
"time": np.int16,
|
||||||
|
"clflush_remote_hit": np.int32,
|
||||||
|
"clflush_shared_hit": np.int32,
|
||||||
|
"clflush_miss_f": np.int32,
|
||||||
|
"clflush_local_hit_f": np.int32,
|
||||||
|
"clflush_miss_n": np.int32,
|
||||||
|
"clflush_local_hit_n": np.int32,
|
||||||
|
"reload_miss": np.int32,
|
||||||
|
"reload_remote_hit": np.int32,
|
||||||
|
"reload_shared_hit": np.int32,
|
||||||
|
"reload_local_hit": np.int32},
|
||||||
|
converters={'address': convert64, 'hash': convert8},
|
||||||
|
)
|
||||||
|
|
||||||
|
sample_columns = [
|
||||||
|
"clflush_remote_hit",
|
||||||
|
"clflush_shared_hit",
|
||||||
|
"clflush_miss_f",
|
||||||
|
"clflush_local_hit_f",
|
||||||
|
"clflush_miss_n",
|
||||||
|
"clflush_local_hit_n",
|
||||||
|
"reload_miss",
|
||||||
|
"reload_remote_hit",
|
||||||
|
"reload_shared_hit",
|
||||||
|
"reload_local_hit",
|
||||||
|
]
|
||||||
|
|
||||||
|
sample_flush_columns = [
|
||||||
|
"clflush_remote_hit",
|
||||||
|
"clflush_shared_hit",
|
||||||
|
"clflush_miss_f",
|
||||||
|
"clflush_local_hit_f",
|
||||||
|
"clflush_miss_n",
|
||||||
|
"clflush_local_hit_n",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
slice_mapping = pd.read_csv(sys.argv[1] + ".slices.csv")
|
||||||
|
core_mapping = pd.read_csv(sys.argv[1] + ".cores.csv")
|
||||||
|
|
||||||
|
def remap_core(key):
|
||||||
|
def remap(core):
|
||||||
|
remapped = core_mapping.iloc[core]
|
||||||
|
return remapped[key]
|
||||||
|
|
||||||
|
return remap
|
||||||
|
|
||||||
|
|
||||||
|
df["main_socket"] = df["main_core"].apply(remap_core("socket"))
|
||||||
|
df["main_core_fixed"] = df["main_core"].apply(remap_core("core"))
|
||||||
|
df["main_ht"] = df["main_core"].apply(remap_core("hthread"))
|
||||||
|
df["helper_socket"] = df["helper_core"].apply(remap_core("socket"))
|
||||||
|
df["helper_core_fixed"] = df["helper_core"].apply(remap_core("core"))
|
||||||
|
df["helper_ht"] = df["helper_core"].apply(remap_core("hthread"))
|
||||||
|
|
||||||
|
# slice_mapping = {3: 0, 1: 1, 2: 2, 0: 3}
|
||||||
|
|
||||||
|
slice_remap = lambda h: slice_mapping["slice_group"].iloc[h]
|
||||||
|
df["slice_group"] = df["hash"].apply(slice_remap)
|
||||||
|
|
||||||
|
|
||||||
|
print(df.columns)
|
||||||
|
#df["Hash"] = df["Addr"].apply(lambda x: (x >> 15)&0x3)
|
||||||
|
|
||||||
|
addresses = df["address"].unique()
|
||||||
|
print(addresses)
|
||||||
|
print(*[bin(a) for a in addresses], sep='\n')
|
||||||
|
|
||||||
|
print(df.head())
|
||||||
|
|
||||||
|
print(df["hash"].unique())
|
||||||
|
|
||||||
|
min_time = df["time"].min()
|
||||||
|
max_time = df["time"].max()
|
||||||
|
|
||||||
|
q10s = [wq.quantile(df["time"], df[col], 0.1) for col in sample_flush_columns]
|
||||||
|
q90s = [wq.quantile(df["time"], df[col], 0.9) for col in sample_flush_columns]
|
||||||
|
|
||||||
|
graph_upper = int(((max(q90s) + 19) // 10) * 10)
|
||||||
|
graph_lower = int(((min(q10s) - 10) // 10) * 10)
|
||||||
|
# graph_lower = (min_time // 10) * 10
|
||||||
|
# graph_upper = ((max_time + 9) // 10) * 10
|
||||||
|
|
||||||
|
print("graphing between {}, {}".format(graph_lower, graph_upper))
|
||||||
|
|
||||||
|
df_main_core_0 = df[df["main_core"] == 0]
|
||||||
|
#df_helper_core_0 = df[df["helper_core"] == 0]
|
||||||
|
|
||||||
|
colours = ["b", "r", "g", "y"]
|
||||||
|
|
||||||
|
def custom_hist(x, *y, **kwargs):
|
||||||
|
for (i, yi) in enumerate(y):
|
||||||
|
kwargs["color"] = colours[i]
|
||||||
|
sns.distplot(x, range(graph_lower, graph_upper), hist_kws={"weights": yi, "histtype":"step"}, kde=False, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
custom_hist(df["time"], df["clflush_miss_n"], df["clflush_remote_hit"])
|
||||||
|
|
||||||
|
tikzplotlib.save("fig-hist-all.tex")#, axis_width=r'0.175\textwidth', axis_height=r'0.25\textwidth')
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
attacker = 2
|
||||||
|
victim = 7
|
||||||
|
slice = 14
|
||||||
|
|
||||||
|
df_ax_vx_sx = df[(df["hash"] == slice) & (df["main_core"] == attacker) & (df["helper_core"] == victim)]
|
||||||
|
|
||||||
|
custom_hist(df_ax_vx_sx["time"], df_ax_vx_sx["clflush_miss_n"], df_ax_vx_sx["clflush_remote_hit"])
|
||||||
|
tikzplotlib.save("fig-hist-good-A{}V{}S{}.tex".format(attacker,victim,slice))#, axis_width=r'0.175\textwidth', axis_height=r'0.25\textwidth')
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
attacker = 9
|
||||||
|
victim = 4
|
||||||
|
slice = 8
|
||||||
|
|
||||||
|
df_ax_vx_sx = df[(df["hash"] == slice) & (df["main_core"] == attacker) & (df["helper_core"] == victim)]
|
||||||
|
|
||||||
|
custom_hist(df_ax_vx_sx["time"], df_ax_vx_sx["clflush_miss_n"], df_ax_vx_sx["clflush_remote_hit"])
|
||||||
|
tikzplotlib.save("fig-hist-bad-A{}V{}S{}.tex".format(attacker,victim,slice))#, axis_width=r'0.175\textwidth', axis_height=r'0.25\textwidth')
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
|
g = sns.FacetGrid(df_main_core_0, col="helper_core", row="hash", legend_out=True)
|
||||||
|
g2 = sns.FacetGrid(df, col="main_core", row="hash", legend_out=True)
|
||||||
|
|
||||||
|
|
||||||
|
# Color convention here :
|
||||||
|
# Blue = miss
|
||||||
|
# Red = Remote Hit
|
||||||
|
# Green = Local Hit
|
||||||
|
# Yellow = Shared Hit
|
||||||
|
|
||||||
|
g.map(custom_hist, "time", "clflush_miss_n", "clflush_remote_hit", "clflush_local_hit_n", "clflush_shared_hit")
|
||||||
|
|
||||||
|
g2.map(custom_hist, "time", "clflush_miss_n", "clflush_remote_hit", "clflush_local_hit_n", "clflush_shared_hit")
|
||||||
|
|
||||||
|
# g.map(sns.distplot, "time", hist_kws={"weights": df["clflush_hit"]}, kde=False)
|
||||||
|
|
||||||
|
#plt.show()
|
||||||
|
#plt.figure()
|
||||||
|
|
||||||
|
#df_mcf6 = df[df["main_core_fixed"] == 6]
|
||||||
|
#df_mcf6_slg7 = df_mcf6[df_mcf6["slice_group"] == 7]
|
||||||
|
#g3 = sns.FacetGrid(df_mcf6_slg7, row="helper_core_fixed", col="main_ht")
|
||||||
|
#g3.map(custom_hist, "time", "clflush_miss_n", "clflush_remote_hit", "clflush_local_hit_n", "clflush_shared_hit")
|
||||||
|
|
||||||
|
#g4 = sns.FacetGrid(df_mcf6_slg7, row="helper_core_fixed", col="helper_ht")
|
||||||
|
g#4.map(custom_hist, "time", "clflush_miss_n", "clflush_remote_hit", "clflush_local_hit_n", "clflush_shared_hit")
|
||||||
|
|
||||||
|
def stat(x, key):
|
||||||
|
return wq.median(x["time"], x[key])
|
||||||
|
|
||||||
|
|
||||||
|
miss = df.groupby(["main_core", "helper_core", "hash"]).apply(stat, "clflush_miss_n")
|
||||||
|
hit_remote = df.groupby(["main_core", "helper_core", "hash"]).apply(stat, "clflush_remote_hit")
|
||||||
|
hit_local = df.groupby(["main_core", "helper_core", "hash"]).apply(stat, "clflush_local_hit_n")
|
||||||
|
hit_shared = df.groupby(["main_core", "helper_core", "hash"]).apply(stat, "clflush_shared_hit")
|
||||||
|
|
||||||
|
stats = miss.reset_index()
|
||||||
|
stats.columns = ["main_core", "helper_core", "hash", "clflush_miss_n"]
|
||||||
|
stats["clflush_remote_hit"] = hit_remote.values
|
||||||
|
stats["clflush_local_hit_n"] = hit_local.values
|
||||||
|
stats["clflush_shared_hit"] = hit_shared.values
|
||||||
|
|
||||||
|
stats.to_csv(sys.argv[1] + ".stats.csv", index=False)
|
||||||
|
|
||||||
|
#print(stats.to_string())
|
||||||
|
|
||||||
|
plt.show()
|
||||||
|
exit(0)
|
||||||
|
g = sns.FacetGrid(stats, row="Core")
|
||||||
|
|
||||||
|
g.map(sns.distplot, 'Miss', bins=range(100, 480), color="r")
|
||||||
|
g.map(sns.distplot, 'Hit', bins=range(100, 480))
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
#stats["clflush_miss_med"] = stats[[0]].apply(lambda x: x["miss_med"])
|
||||||
|
#stats["clflush_hit_med"] = stats[[0]].apply(lambda x: x["hit_med"])
|
||||||
|
#del df[[0]]
|
||||||
|
#print(hit.to_string(), miss.to_string())
|
||||||
|
|
||||||
|
# test = pd.DataFrame({"value" : [0, 5], "weight": [5, 1]})
|
||||||
|
# plt.figure()
|
||||||
|
# sns.distplot(test["value"], hist_kws={"weights": test["weight"]}, kde=False)
|
||||||
|
|
||||||
|
exit(0)
|
281
cache_utils/analyse_medians.py
Normal file
281
cache_utils/analyse_medians.py
Normal file
@ -0,0 +1,281 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2021 Guillaume DIDIER
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
import pandas as pd
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import seaborn as sns
|
||||||
|
from sys import exit
|
||||||
|
import numpy as np
|
||||||
|
from scipy import optimize
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# TODO
|
||||||
|
# sys.argv[1] should be the root
|
||||||
|
# with root-result_lite.csv.bz2 the result
|
||||||
|
# and .stats.csv
|
||||||
|
# root.slices a slice mapping - done
|
||||||
|
# root.cores a core + socket mapping - done -> move to analyse csv ?
|
||||||
|
#
|
||||||
|
# Facet plot with actual dot cloud + plot the linear regression
|
||||||
|
# each row is a slice
|
||||||
|
# each row is an origin core
|
||||||
|
# each column a helper core if applicable
|
||||||
|
|
||||||
|
|
||||||
|
stats = pd.read_csv(sys.argv[1] + ".stats.csv",
|
||||||
|
dtype={
|
||||||
|
"main_core": np.int8,
|
||||||
|
"helper_core": np.int8,
|
||||||
|
# "address": int,
|
||||||
|
"hash": np.int8,
|
||||||
|
# "time": np.int16,
|
||||||
|
"clflush_remote_hit": np.float64,
|
||||||
|
"clflush_shared_hit": np.float64,
|
||||||
|
# "clflush_miss_f": np.int32,
|
||||||
|
# "clflush_local_hit_f": np.int32,
|
||||||
|
"clflush_miss_n": np.float64,
|
||||||
|
"clflush_local_hit_n": np.float64,
|
||||||
|
# "reload_miss": np.int32,
|
||||||
|
# "reload_remote_hit": np.int32,
|
||||||
|
# "reload_shared_hit": np.int32,
|
||||||
|
# "reload_local_hit": np.int32
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
slice_mapping = pd.read_csv(sys.argv[1] + ".slices.csv")
|
||||||
|
core_mapping = pd.read_csv(sys.argv[1] + ".cores.csv")
|
||||||
|
|
||||||
|
print(core_mapping.to_string())
|
||||||
|
print(slice_mapping.to_string())
|
||||||
|
|
||||||
|
print("core {} is mapped to '{}'".format(4, repr(core_mapping.iloc[4])))
|
||||||
|
|
||||||
|
min_time_miss = stats["clflush_miss_n"].min()
|
||||||
|
max_time_miss = stats["clflush_miss_n"].max()
|
||||||
|
|
||||||
|
|
||||||
|
def remap_core(key):
|
||||||
|
def remap(core):
|
||||||
|
remapped = core_mapping.iloc[core]
|
||||||
|
return remapped[key]
|
||||||
|
|
||||||
|
return remap
|
||||||
|
|
||||||
|
|
||||||
|
stats["main_socket"] = stats["main_core"].apply(remap_core("socket"))
|
||||||
|
stats["main_core_fixed"] = stats["main_core"].apply(remap_core("core"))
|
||||||
|
stats["main_ht"] = stats["main_core"].apply(remap_core("hthread"))
|
||||||
|
stats["helper_socket"] = stats["helper_core"].apply(remap_core("socket"))
|
||||||
|
stats["helper_core_fixed"] = stats["helper_core"].apply(remap_core("core"))
|
||||||
|
stats["helper_ht"] = stats["helper_core"].apply(remap_core("hthread"))
|
||||||
|
|
||||||
|
# slice_mapping = {3: 0, 1: 1, 2: 2, 0: 3}
|
||||||
|
|
||||||
|
stats["slice_group"] = stats["hash"].apply(lambda h: slice_mapping["slice_group"].iloc[h])
|
||||||
|
|
||||||
|
graph_lower_miss = int((min_time_miss // 10) * 10)
|
||||||
|
graph_upper_miss = int(((max_time_miss + 9) // 10) * 10)
|
||||||
|
|
||||||
|
print("Graphing from {} to {}".format(graph_lower_miss, graph_upper_miss))
|
||||||
|
|
||||||
|
g_ = sns.FacetGrid(stats, col="main_core_fixed", row="slice_group")
|
||||||
|
|
||||||
|
g_.map(sns.distplot, 'clflush_miss_n', bins=range(graph_lower_miss, graph_upper_miss), color="b")
|
||||||
|
#g.map(sns.scatterplot, 'slice_group', 'clflush_local_hit_n', color="g")
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# also explains remote
|
||||||
|
# shared needs some thinking as there is something weird happening there.
|
||||||
|
|
||||||
|
#
|
||||||
|
# M 0 1 2 3 4 5 6 7
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
print(stats.head())
|
||||||
|
|
||||||
|
num_core = len(stats["main_core_fixed"].unique())
|
||||||
|
print("Found {}".format(num_core))
|
||||||
|
|
||||||
|
|
||||||
|
def miss_topology(main_core_fixed, slice_group, C, h):
|
||||||
|
return C + h * abs(main_core_fixed - slice_group) + h * abs(slice_group + 1)
|
||||||
|
|
||||||
|
def miss_topology_df(x, C, h):
|
||||||
|
return x.apply(lambda x, C, h: miss_topology(x["main_core_fixed"], x["slice_group"], C, h), args=(C, h), axis=1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
res_miss = optimize.curve_fit(miss_topology_df, stats[["main_core_fixed", "slice_group"]], stats["clflush_miss_n"])
|
||||||
|
print("Miss topology:")
|
||||||
|
print(res_miss)
|
||||||
|
|
||||||
|
|
||||||
|
memory = -1
|
||||||
|
gpu_if_any = num_core
|
||||||
|
|
||||||
|
|
||||||
|
def exclusive_hit_topology_gpu(main_core, slice_group, helper_core, C, h1, h2):
|
||||||
|
round_trip = gpu_if_any - memory
|
||||||
|
|
||||||
|
if slice_group <= num_core/2:
|
||||||
|
# send message towards higher cores first
|
||||||
|
if helper_core < slice_group:
|
||||||
|
r = C + h1 * abs(main_core - slice_group) + h2 * abs(round_trip - (helper_core - memory))
|
||||||
|
else:
|
||||||
|
r = C + h1 * abs(main_core - slice_group) + h2 * abs(helper_core - slice_group)
|
||||||
|
else:
|
||||||
|
# send message toward lower cores first
|
||||||
|
if helper_core > slice_group:
|
||||||
|
r = C + h1 * abs(main_core - slice_group) + h2 * abs(helper_core - memory)
|
||||||
|
else:
|
||||||
|
r = C + h1 * abs(main_core - slice_group) + h2 * abs(helper_core - slice_group)
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
def exclusive_hit_topology_gpu_df(x, C, h1, h2):
|
||||||
|
return x.apply(lambda x, C, h1, h2: exclusive_hit_topology_gpu(x["main_core_fixed"], x["slice_group"], x["helper_core_fixed"], C, h1, h2), args=(C, h1, h2), axis=1)
|
||||||
|
|
||||||
|
|
||||||
|
def exclusive_hit_topology_gpu2(main_core, slice_group, helper_core, C, h1, h2):
|
||||||
|
round_trip = gpu_if_any + 1 - memory
|
||||||
|
|
||||||
|
if slice_group <= num_core/2:
|
||||||
|
# send message towards higher cores first
|
||||||
|
if helper_core < slice_group:
|
||||||
|
r = C + h1 * abs(main_core - slice_group) + h2 * abs(round_trip - (helper_core - memory))
|
||||||
|
else:
|
||||||
|
r = C + h1 * abs(main_core - slice_group) + h2 * abs(helper_core - slice_group)
|
||||||
|
else:
|
||||||
|
# send message toward lower cores first
|
||||||
|
if helper_core > slice_group:
|
||||||
|
r = C + h1 * abs(main_core - slice_group) + h2 * abs(helper_core - memory)
|
||||||
|
else:
|
||||||
|
r = C + h1 * abs(main_core - slice_group) + h2 * abs(helper_core - slice_group)
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
def exclusive_hit_topology_gpu2_df(x, C, h1, h2):
|
||||||
|
return x.apply(lambda x, C, h1, h2: exclusive_hit_topology_gpu2(x["main_core_fixed"], x["slice_group"], x["helper_core_fixed"], C, h1, h2), args=(C, h1, h2), axis=1)
|
||||||
|
|
||||||
|
|
||||||
|
# unlikely
|
||||||
|
def exclusive_hit_topology_nogpu(main_core, slice_group, helper_core, C, h1, h2):
|
||||||
|
round_trip = (num_core-1) - memory
|
||||||
|
|
||||||
|
if slice_group <= num_core/2:
|
||||||
|
# send message towards higher cores first
|
||||||
|
if helper_core < slice_group:
|
||||||
|
r = C + h1 * abs(main_core - slice_group) + h2 * abs(round_trip - (helper_core - memory))
|
||||||
|
else:
|
||||||
|
r = C + h1 * abs(main_core - slice_group) + h2 * abs(helper_core - slice_group)
|
||||||
|
else:
|
||||||
|
# send message toward lower cores first
|
||||||
|
if helper_core > slice_group:
|
||||||
|
r = C + h1 * abs(main_core - slice_group) + h2 * abs(helper_core - memory)
|
||||||
|
else:
|
||||||
|
r = C + h1 * abs(main_core - slice_group) + h2 * abs(helper_core - slice_group)
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
def exclusive_hit_topology_nogpu_df(x, C, h1, h2):
|
||||||
|
return x.apply(lambda x, C, h1, h2: exclusive_hit_topology_nogpu(x["main_core_fixed"], x["slice_group"], x["helper_core_fixed"], C, h1, h2), args=(C, h1, h2), axis=1)
|
||||||
|
|
||||||
|
|
||||||
|
#res_no_gpu = optimize.curve_fit(exclusive_hit_topology_nogpu_df, stats[["main_core_fixed", "slice_group", "helper_core_fixed"]], stats["clflush_remote_hit"])
|
||||||
|
#print("Exclusive hit topology (No GPU):")
|
||||||
|
#print(res_no_gpu)
|
||||||
|
|
||||||
|
res_gpu = optimize.curve_fit(exclusive_hit_topology_gpu_df, stats[["main_core_fixed", "slice_group", "helper_core_fixed"]], stats["clflush_remote_hit"])
|
||||||
|
print("Exclusive hit topology (GPU):")
|
||||||
|
print(res_gpu)
|
||||||
|
|
||||||
|
#res_gpu2 = optimize.curve_fit(exclusive_hit_topology_gpu2_df, stats[["main_core_fixed", "slice_group", "helper_core_fixed"]], stats["clflush_remote_hit"])
|
||||||
|
#print("Exclusive hit topology (GPU2):")
|
||||||
|
#print(res_gpu2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def remote_hit_topology_2(x, C, h):
|
||||||
|
main_core = x["main_core_fixed"]
|
||||||
|
slice_group = x["slice_group"]
|
||||||
|
helper_core = x["helper_core_fixed"]
|
||||||
|
return C + h * abs(main_core - slice_group) + h * abs(slice_group - helper_core) + h * abs(helper_core - main_core)
|
||||||
|
|
||||||
|
|
||||||
|
def shared_hit_topology_1(x, C, h):
|
||||||
|
main_core = x["main_core_fixed"]
|
||||||
|
slice_group = x["slice_group"]
|
||||||
|
helper_core = x["helper_core_fixed"]
|
||||||
|
return C + h * abs(main_core - slice_group) + h * max(abs(slice_group - main_core), abs(slice_group - helper_core))
|
||||||
|
|
||||||
|
|
||||||
|
def plot_func(function, *params):
|
||||||
|
def plot_it(x, **kwargs):
|
||||||
|
# plot_x = []
|
||||||
|
# plot_y = []
|
||||||
|
# for x in set(x):
|
||||||
|
# plot_y.append(function(x, *params))
|
||||||
|
# plot_x = x
|
||||||
|
print(x)
|
||||||
|
plot_y = function(x, *params)
|
||||||
|
sns.lineplot(x, plot_y, **kwargs)
|
||||||
|
return plot_it
|
||||||
|
|
||||||
|
stats["predicted_miss"] = miss_topology_df(stats, *(res_miss[0]))
|
||||||
|
|
||||||
|
figure_median_I = sns.FacetGrid(stats, col="main_core_fixed")
|
||||||
|
figure_median_I.map(sns.scatterplot, 'slice_group', 'clflush_miss_n', color="b")
|
||||||
|
figure_median_I.map(sns.lineplot, 'slice_group', 'predicted_miss', color="b")
|
||||||
|
figure_median_I.set_titles(col_template="$A$ = {col_name}")
|
||||||
|
figure_median_I.tight_layout()
|
||||||
|
|
||||||
|
import tikzplotlib
|
||||||
|
|
||||||
|
tikzplotlib.save("fig-median-I.tex", axis_width=r'0.175\textwidth', axis_height=r'0.25\textwidth')
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
#stats["predicted_remote_hit_no_gpu"] = exclusive_hit_topology_nogpu_df(stats, *(res_no_gpu[0]))
|
||||||
|
stats["predicted_remote_hit_gpu"] = exclusive_hit_topology_gpu_df(stats, *(res_gpu[0]))
|
||||||
|
#stats["predicted_remote_hit_gpu2"] = exclusive_hit_topology_gpu_df(stats, *(res_gpu2[0]))
|
||||||
|
|
||||||
|
|
||||||
|
stats_A0 = stats[stats["main_core_fixed"] == 0]
|
||||||
|
figure_median_E_A0 = sns.FacetGrid(stats_A0, col="slice_group")
|
||||||
|
figure_median_E_A0.map(sns.scatterplot, 'helper_core_fixed', 'clflush_remote_hit', color="r")
|
||||||
|
figure_median_E_A0.map(sns.lineplot, 'helper_core_fixed', 'predicted_remote_hit_gpu', color="r")
|
||||||
|
figure_median_E_A0.set_titles(col_template="$S$ = {col_name}")
|
||||||
|
|
||||||
|
tikzplotlib.save("fig-median-E-A0.tex", axis_width=r'0.175\textwidth', axis_height=r'0.25\textwidth')
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
g = sns.FacetGrid(stats, row="main_core_fixed")
|
||||||
|
|
||||||
|
g.map(sns.scatterplot, 'slice_group', 'clflush_miss_n', color="b")
|
||||||
|
g.map(sns.scatterplot, 'slice_group', 'clflush_local_hit_n', color="g")
|
||||||
|
|
||||||
|
g0 = sns.FacetGrid(stats, row="slice_group")
|
||||||
|
|
||||||
|
g0.map(sns.scatterplot, 'main_core_fixed', 'clflush_miss_n', color="b")
|
||||||
|
g0.map(sns.scatterplot, 'main_core_fixed', 'clflush_local_hit_n', color="g") # this gives away the trick I think !
|
||||||
|
# possibility of sending a general please discard this everyone around one of the ring + wait for ACK - direction depends on the core.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
g2 = sns.FacetGrid(stats, row="main_core_fixed", col="slice_group")
|
||||||
|
g2.map(sns.scatterplot, 'helper_core_fixed', 'clflush_remote_hit', color="r")
|
||||||
|
g2.map(sns.lineplot, 'helper_core_fixed', 'predicted_remote_hit_gpu', color="r")
|
||||||
|
#g2.map(sns.lineplot, 'helper_core_fixed', 'predicted_remote_hit_gpu2', color="g")
|
||||||
|
#g2.map(sns.lineplot, 'helper_core_fixed', 'predicted_remote_hit_no_gpu', color="g")
|
||||||
|
#g2.map(plot_func(exclusive_hit_topology_nogpu_df, *(res_no_gpu[0])), 'helper_core_fixed', color="g")
|
||||||
|
|
||||||
|
g3 = sns.FacetGrid(stats, row="main_core_fixed", col="slice_group")
|
||||||
|
g3.map(sns.scatterplot, 'helper_core_fixed', 'clflush_shared_hit', color="y")
|
||||||
|
|
||||||
|
# more ideas needed
|
||||||
|
|
||||||
|
plt.show()
|
15
cache_utils/run-2-thread-cal.sh
Executable file
15
cache_utils/run-2-thread-cal.sh
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
>&2 echo "# Running the following commands with sudo to set-up"
|
||||||
|
>&2 echo 'sudo sh -c "echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo"'
|
||||||
|
>&2 echo sudo cpupower frequency-set -g performance
|
||||||
|
|
||||||
|
# performance cpu frequency governor
|
||||||
|
sudo cpupower frequency-set -g performance
|
||||||
|
|
||||||
|
# No Turbo Boost
|
||||||
|
sudo sh -c "echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo"
|
||||||
|
|
||||||
|
cargo run --release --bin two_thread_cal "$@"
|
||||||
|
|
||||||
|
>&2 echo "# Please run the following commands to restore configuration"
|
||||||
|
>&2 echo 'sudo sh -c "echo 0 > /sys/devices/system/cpu/intel_pstate/no_turbo"'
|
||||||
|
>&2 echo sudo cpupower frequency-set -g powersave
|
@ -1,5 +1,10 @@
|
|||||||
#![deny(unsafe_op_in_unsafe_fn)]
|
#![deny(unsafe_op_in_unsafe_fn)]
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: 2021 Guillaume DIDIER
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
use cache_utils::calibration::{
|
use cache_utils::calibration::{
|
||||||
accumulate, calibrate_fixed_freq_2_thread, calibration_result_to_ASVP, flush_and_reload,
|
accumulate, calibrate_fixed_freq_2_thread, calibration_result_to_ASVP, flush_and_reload,
|
||||||
get_cache_attack_slicing, load_and_flush, map_values, only_flush, only_reload, reduce,
|
get_cache_attack_slicing, load_and_flush, map_values, only_flush, only_reload, reduce,
|
||||||
@ -14,12 +19,13 @@ use nix::unistd::Pid;
|
|||||||
|
|
||||||
use core::arch::x86_64 as arch_x86;
|
use core::arch::x86_64 as arch_x86;
|
||||||
|
|
||||||
use core::cmp::min;
|
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
|
use std::cmp::min;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
use std::str::from_utf8;
|
use std::str::from_utf8;
|
||||||
|
|
||||||
|
|
||||||
unsafe fn multiple_access(p: *const u8) {
|
unsafe fn multiple_access(p: *const u8) {
|
||||||
unsafe {
|
unsafe {
|
||||||
maccess::<u8>(p);
|
maccess::<u8>(p);
|
||||||
@ -34,7 +40,9 @@ unsafe fn multiple_access(p: *const u8) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const SIZE: usize = 2 << 20;
|
//const SIZE: usize = 2 << 20;
|
||||||
|
const SIZE: usize = 4 << 10;
|
||||||
|
|
||||||
const MAX_SEQUENCE: usize = 2048 * 64;
|
const MAX_SEQUENCE: usize = 2048 * 64;
|
||||||
|
|
||||||
#[derive(Clone, Copy, Hash, Eq, PartialEq, Debug)]
|
#[derive(Clone, Copy, Hash, Eq, PartialEq, Debug)]
|
||||||
@ -111,7 +119,8 @@ fn main() {
|
|||||||
|
|
||||||
println!("Number of cores per socket: {}", core_per_socket);
|
println!("Number of cores per socket: {}", core_per_socket);
|
||||||
|
|
||||||
let m = MMappedMemory::new(SIZE, true, false, |i: usize| i as u8);
|
// TODO Enable Hugepage here if needed.
|
||||||
|
let m = MMappedMemory::new(SIZE, false, false, |i: usize| i as u8);
|
||||||
let array = m.slice();
|
let array = m.slice();
|
||||||
|
|
||||||
let cache_line_size = 64;
|
let cache_line_size = 64;
|
||||||
|
@ -349,7 +349,7 @@ fn calibrate_fixed_freq_2_thread_impl<I: Iterator<Item = (usize, usize)>, T>(
|
|||||||
main_turn_handle.next();
|
main_turn_handle.next();
|
||||||
params = main_turn_handle.wait();
|
params = main_turn_handle.wait();
|
||||||
// join thread.
|
// join thread.
|
||||||
helper_thread.unwrap().join();
|
helper_thread.unwrap().join().expect("Failed to join thread");
|
||||||
// FIXME error handling
|
// FIXME error handling
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ use crate::complex_addressing::{cache_slicing, CacheAttackSlicing, CacheSlicing}
|
|||||||
use crate::{flush, maccess, rdtsc_fence};
|
use crate::{flush, maccess, rdtsc_fence};
|
||||||
|
|
||||||
use cpuid::MicroArchitecture;
|
use cpuid::MicroArchitecture;
|
||||||
|
use core::cmp::min;
|
||||||
|
|
||||||
use core::arch::x86_64 as arch_x86;
|
use core::arch::x86_64 as arch_x86;
|
||||||
#[cfg(feature = "no_std")]
|
#[cfg(feature = "no_std")]
|
||||||
@ -16,7 +17,6 @@ extern crate alloc;
|
|||||||
use crate::calibration::Verbosity::*;
|
use crate::calibration::Verbosity::*;
|
||||||
use alloc::vec;
|
use alloc::vec;
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use core::cmp::min;
|
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use core::hash::Hash;
|
use core::hash::Hash;
|
||||||
use core::ops::{Add, AddAssign};
|
use core::ops::{Add, AddAssign};
|
||||||
|
@ -12,6 +12,8 @@ use hashbrown::HashMap;
|
|||||||
#[cfg(feature = "no_std")]
|
#[cfg(feature = "no_std")]
|
||||||
use hashbrown::HashSet;
|
use hashbrown::HashSet;
|
||||||
|
|
||||||
|
#[cfg(feature = "use_std")]
|
||||||
|
use std::vec::Vec;
|
||||||
#[cfg(feature = "use_std")]
|
#[cfg(feature = "use_std")]
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
#[cfg(feature = "use_std")]
|
#[cfg(feature = "use_std")]
|
||||||
@ -78,7 +80,7 @@ pub fn cache_slicing(
|
|||||||
match vendor {
|
match vendor {
|
||||||
CPUVendor::Intel => {
|
CPUVendor::Intel => {
|
||||||
match uarch {
|
match uarch {
|
||||||
MicroArchitecture::KabyLake | MicroArchitecture::Skylake => ComplexAddressing(
|
MicroArchitecture::KabyLake | MicroArchitecture::Skylake | MicroArchitecture::WhiskeyLake => ComplexAddressing(
|
||||||
&SANDYBRIDGE_TO_SKYLAKE_FUNCTIONS[0..((trailing_zeros + 1) as usize)],
|
&SANDYBRIDGE_TO_SKYLAKE_FUNCTIONS[0..((trailing_zeros + 1) as usize)],
|
||||||
),
|
),
|
||||||
MicroArchitecture::CoffeeLake => {
|
MicroArchitecture::CoffeeLake => {
|
||||||
|
@ -7,6 +7,7 @@ use std::collections::LinkedList;
|
|||||||
use std::ptr::copy_nonoverlapping;
|
use std::ptr::copy_nonoverlapping;
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
use std::vec::Vec;
|
use std::vec::Vec;
|
||||||
|
use core::arch::global_asm;
|
||||||
|
|
||||||
struct WXRange {
|
struct WXRange {
|
||||||
start: usize,
|
start: usize,
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
#![cfg_attr(feature = "no_std", no_std)]
|
#![cfg_attr(feature = "no_std", no_std)]
|
||||||
#![feature(ptr_internals)]
|
|
||||||
#![feature(linked_list_cursors)]
|
#![feature(linked_list_cursors)]
|
||||||
#![feature(global_asm)]
|
|
||||||
#![allow(clippy::missing_safety_doc)]
|
#![allow(clippy::missing_safety_doc)]
|
||||||
#![deny(unsafe_op_in_unsafe_fn)]
|
#![deny(unsafe_op_in_unsafe_fn)]
|
||||||
|
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
#![cfg(feature = "use_std")]
|
#![cfg(feature = "use_std")]
|
||||||
|
|
||||||
use core::borrow::{Borrow, BorrowMut};
|
use core::borrow::{Borrow, BorrowMut};
|
||||||
use core::ffi::c_void;
|
use core::mem::size_of;
|
||||||
use core::mem::{size_of, MaybeUninit};
|
use core::num::NonZeroUsize;
|
||||||
use core::ops::{Deref, DerefMut};
|
use core::ops::{Deref, DerefMut};
|
||||||
use core::ptr;
|
use core::ptr::NonNull;
|
||||||
use core::ptr::null_mut;
|
|
||||||
use core::ptr::Unique;
|
|
||||||
use core::slice::{from_raw_parts, from_raw_parts_mut};
|
use core::slice::{from_raw_parts, from_raw_parts_mut};
|
||||||
use nix::errno::Errno::EINVAL;
|
use std::convert::TryFrom;
|
||||||
use nix::sys::mman;
|
use nix::sys::mman;
|
||||||
|
use core::ptr;
|
||||||
|
|
||||||
|
|
||||||
/* from linux kernel headers.
|
/* from linux kernel headers.
|
||||||
#define HUGETLB_FLAG_ENCODE_SHIFT 26
|
#define HUGETLB_FLAG_ENCODE_SHIFT 26
|
||||||
@ -22,7 +22,7 @@ use nix::sys::mman;
|
|||||||
*/
|
*/
|
||||||
/** Safety issue : if T is non triviably constructable and destructable this is dangerous */
|
/** Safety issue : if T is non triviably constructable and destructable this is dangerous */
|
||||||
pub struct MMappedMemory<T> {
|
pub struct MMappedMemory<T> {
|
||||||
pointer: Unique<T>,
|
pointer: NonNull<T>,
|
||||||
size: usize,
|
size: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,17 +34,11 @@ impl<T> MMappedMemory<T> {
|
|||||||
initializer: impl Fn(usize) -> T,
|
initializer: impl Fn(usize) -> T,
|
||||||
) -> Result<MMappedMemory<T>, nix::Error> {
|
) -> Result<MMappedMemory<T>, nix::Error> {
|
||||||
assert_ne!(size_of::<T>(), 0);
|
assert_ne!(size_of::<T>(), 0);
|
||||||
if let Some(p) = unsafe {
|
match unsafe {
|
||||||
let p = mman::mmap(
|
mman::mmap_anonymous(
|
||||||
null_mut(),
|
None,
|
||||||
size * size_of::<T>(),
|
NonZeroUsize::try_from(size * size_of::<T>()).unwrap(),
|
||||||
mman::ProtFlags::PROT_READ
|
mman::ProtFlags::PROT_READ | mman::ProtFlags::PROT_WRITE,
|
||||||
| mman::ProtFlags::PROT_WRITE
|
|
||||||
| if executable {
|
|
||||||
mman::ProtFlags::PROT_EXEC
|
|
||||||
} else {
|
|
||||||
mman::ProtFlags::PROT_READ
|
|
||||||
},
|
|
||||||
mman::MapFlags::MAP_PRIVATE
|
mman::MapFlags::MAP_PRIVATE
|
||||||
| mman::MapFlags::MAP_ANONYMOUS
|
| mman::MapFlags::MAP_ANONYMOUS
|
||||||
| if huge {
|
| if huge {
|
||||||
@ -52,19 +46,18 @@ impl<T> MMappedMemory<T> {
|
|||||||
} else {
|
} else {
|
||||||
mman::MapFlags::MAP_ANONYMOUS
|
mman::MapFlags::MAP_ANONYMOUS
|
||||||
},
|
},
|
||||||
-1,
|
)
|
||||||
0,
|
}
|
||||||
)?;
|
{
|
||||||
let pointer_T = p as *mut T;
|
Ok(p) => {
|
||||||
Unique::new(pointer_T)
|
let mut s : MMappedMemory<T> = MMappedMemory { pointer: p.cast(), size };
|
||||||
} {
|
|
||||||
let mut s = MMappedMemory { pointer: p, size };
|
|
||||||
for i in 0..s.size {
|
for i in 0..s.size {
|
||||||
unsafe { ptr::write(s.pointer.as_ptr().add(i), initializer(i)) };
|
unsafe { ptr::write(s.pointer.as_ptr().add(i), initializer(i)) };
|
||||||
}
|
}
|
||||||
Ok(s)
|
Ok(s)
|
||||||
} else {
|
} Err(e) => {
|
||||||
Err(nix::Error::Sys(EINVAL))
|
Err(e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@ -118,11 +111,8 @@ impl<T> MMappedMemory<T> {
|
|||||||
|
|
||||||
impl<T> Drop for MMappedMemory<T> {
|
impl<T> Drop for MMappedMemory<T> {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
for i in 0..self.size {
|
|
||||||
unsafe { ptr::drop_in_place(self.pointer.as_ptr().add(i)) };
|
|
||||||
}
|
|
||||||
unsafe {
|
unsafe {
|
||||||
mman::munmap(self.pointer.as_ptr() as *mut c_void, self.size).unwrap();
|
mman::munmap(self.pointer.cast(), self.size).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -164,3 +154,7 @@ impl<T> BorrowMut<[T]> for MMappedMemory<T> {
|
|||||||
self.slice_mut()
|
self.slice_mut()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// It owns the memory, so it should be safe to send.
|
||||||
|
unsafe impl<T> Send for MMappedMemory<T> {}
|
||||||
|
|
||||||
|
@ -7,9 +7,9 @@ edition = "2018"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rand = "0.8.3"
|
rand = "0.8.5"
|
||||||
bit_field = "0.10.1"
|
bit_field = "0.10.2"
|
||||||
turn_lock = { path = "../turn_lock" }
|
turn_lock = { path = "../turn_lock" }
|
||||||
cache_utils = { path = "../cache_utils" }
|
cache_utils = { path = "../cache_utils" }
|
||||||
nix = "0.20.0"
|
nix = "0.28.0"
|
||||||
cache_side_channel = { path = "../cache_side_channel" }
|
cache_side_channel = { path = "../cache_side_channel" }
|
||||||
|
@ -95,13 +95,13 @@ fn transmit_thread<T: CovertChannel>(
|
|||||||
let mut bit_iter = BitIterator::new(&result);
|
let mut bit_iter = BitIterator::new(&result);
|
||||||
let start_time = std::time::Instant::now();
|
let start_time = std::time::Instant::now();
|
||||||
let start = unsafe { rdtsc_fence() };
|
let start = unsafe { rdtsc_fence() };
|
||||||
while !bit_iter.atEnd() {
|
while !bit_iter.at_end() {
|
||||||
for page in params.handles.iter_mut() {
|
for page in params.handles.iter_mut() {
|
||||||
let mut handle = page.wait();
|
let mut handle = page.wait();
|
||||||
unsafe { params.covert_channel.transmit(&mut *handle, &mut bit_iter) };
|
unsafe { params.covert_channel.transmit(&mut *handle, &mut bit_iter) };
|
||||||
bit_sent += T::BIT_PER_PAGE;
|
bit_sent += T::BIT_PER_PAGE;
|
||||||
page.next();
|
page.next();
|
||||||
if bit_iter.atEnd() {
|
if bit_iter.at_end() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ edition = "2018"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
itertools = { version = "0.10.0", default-features = false }
|
itertools = { version = "0.13.0", default-features = false }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
use_std = ["itertools/use_std"]
|
use_std = ["itertools/use_std"]
|
||||||
|
@ -12,12 +12,8 @@ use core::arch::x86_64;
|
|||||||
//use cstr_core::{CStr, CString};
|
//use cstr_core::{CStr, CString};
|
||||||
|
|
||||||
use crate::CPUVendor::{Intel, Unknown};
|
use crate::CPUVendor::{Intel, Unknown};
|
||||||
use crate::MicroArchitecture::{
|
use crate::MicroArchitecture::{Airmont, Bonnell, Broadwell, CannonLake, CascadeLake, CoffeeLake, CooperLake, Core, Goldmont, GoldmontPlus, Haswell, HaswellE, IceLake, IvyBridge, IvyBridgeE, KabyLake, KnightsLanding, KnightsMill, Nehalem, NetBurst, Penryn, PentiumM, Saltwell, SandyBridge, Silvermont, Skylake, SkylakeServer, Tremont, Westmere, Yonah, P5, P6, WhiskeyLake};
|
||||||
Airmont, Bonnell, Broadwell, CannonLake, CascadeLake, CoffeeLake, CooperLake, Core, Goldmont,
|
|
||||||
GoldmontPlus, Haswell, HaswellE, IceLake, IvyBridge, IvyBridgeE, KabyLake, KnightsLanding,
|
|
||||||
KnightsMill, Nehalem, NetBurst, Penryn, PentiumM, Saltwell, SandyBridge, Silvermont, Skylake,
|
|
||||||
SkylakeServer, Tremont, Westmere, Yonah, P5, P6,
|
|
||||||
};
|
|
||||||
//#[cfg(feature = "std")]
|
//#[cfg(feature = "std")]
|
||||||
//use std::ffi::{CStr, CString};
|
//use std::ffi::{CStr, CString};
|
||||||
|
|
||||||
@ -152,6 +148,7 @@ pub enum MicroArchitecture {
|
|||||||
// supports Intel 64 architecture.
|
// supports Intel 64 architecture.
|
||||||
CascadeLake,
|
CascadeLake,
|
||||||
CannonLake, // Only in volume 4 ??
|
CannonLake, // Only in volume 4 ??
|
||||||
|
WhiskeyLake,
|
||||||
// The 2nd generation Intel® Xeon® Processor Scalable Family is based on the Cascade Lake product and supports
|
// The 2nd generation Intel® Xeon® Processor Scalable Family is based on the Cascade Lake product and supports
|
||||||
// Intel 64 architecture.
|
// Intel 64 architecture.
|
||||||
IceLake,
|
IceLake,
|
||||||
@ -184,17 +181,20 @@ impl MicroArchitecture {
|
|||||||
// Intel® CoreTM processors based on Coffee Lake microarchitecture, Intel® Xeon® E processors based on
|
// Intel® CoreTM processors based on Coffee Lake microarchitecture, Intel® Xeon® E processors based on
|
||||||
// Coffee Lake microarchitecture
|
// Coffee Lake microarchitecture
|
||||||
0x06_8E => {
|
0x06_8E => {
|
||||||
if stepping <= 9 {
|
match stepping {
|
||||||
KabyLake
|
9 => KabyLake,
|
||||||
} else {
|
10 => CoffeeLake,
|
||||||
CoffeeLake
|
11 | 12 => WhiskeyLake,
|
||||||
|
_ => {return None;}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
0x06_9E => {
|
0x06_9E => {
|
||||||
if stepping <= 9 {
|
if stepping <= 9 {
|
||||||
KabyLake
|
KabyLake
|
||||||
} else {
|
} else if stepping <= 13{
|
||||||
CoffeeLake
|
CoffeeLake
|
||||||
|
} else {
|
||||||
|
return None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Future Intel® Xeon® processors based on Ice Lake microarchitecture
|
// Future Intel® Xeon® processors based on Ice Lake microarchitecture
|
||||||
@ -289,11 +289,11 @@ impl MicroArchitecture {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn get_family_model_stepping() -> Option<(CPUVendor, u32, u32)> {
|
pub fn get_family_model_stepping() -> Option<(CPUVendor, u32, u32)> {
|
||||||
|
let vendor = CPUVendor::get_cpu_vendor();
|
||||||
// Warning this might not support AMD
|
// Warning this might not support AMD
|
||||||
if true {
|
if vendor == Intel {
|
||||||
// TODO refactor some of this into a separate function.
|
// TODO refactor some of this into a separate function.
|
||||||
// has cpuid
|
// has cpuid
|
||||||
let vendor = CPUVendor::get_cpu_vendor();
|
|
||||||
let eax = unsafe { x86_64::__cpuid(1) }.eax;
|
let eax = unsafe { x86_64::__cpuid(1) }.eax;
|
||||||
let stepping = eax & 0xf;
|
let stepping = eax & 0xf;
|
||||||
let mut model = (eax >> 4) & 0xf;
|
let mut model = (eax >> 4) & 0xf;
|
||||||
|
44
dendrobates-t-azureus/Cargo.toml
Normal file
44
dendrobates-t-azureus/Cargo.toml
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
[package]
|
||||||
|
name = "dendrobates_tinctoreus_azureus"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Guillaume DIDIER <guillaume.didier.2014@polytechnique.org>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[package.metadata.bootimage]
|
||||||
|
#run-command = ["./scripts/bochs.sh", "{}"]
|
||||||
|
run-command = ["./scripts/run.sh", "{}"]
|
||||||
|
test-args = ["qemu"]
|
||||||
|
run-args = ["bochs"]
|
||||||
|
#run-command = ["qemu-system-x86_64", "-drive", "format=raw,file={}"]
|
||||||
|
#test-args = ["-device", "isa-debug-exit,iobase=0xf4,iosize=0x04"]
|
||||||
|
test-success-exit-code = 33 # (0x10 << 1) | 1
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
x86_64 = "0.15.1"
|
||||||
|
vga_buffer = { path = "../vga_buffer" }
|
||||||
|
polling_serial = { path = "../polling_serial" }
|
||||||
|
volatile = "0.4.4"
|
||||||
|
linked_list_allocator = "0.9.0"
|
||||||
|
cache_utils = { path = "../cache_utils", features = ["no_std"], default-features = false }
|
||||||
|
arrayref = "0.3.6"
|
||||||
|
|
||||||
|
[dependencies.lazy_static]
|
||||||
|
version = "1.4.0"
|
||||||
|
features = ["spin_no_std"]
|
||||||
|
|
||||||
|
[dependencies.bootloader]
|
||||||
|
version = "0.9.16"
|
||||||
|
features = ["sse", "map_physical_memory"]
|
||||||
|
|
||||||
|
#[patch.crates-io]
|
||||||
|
#bootloader = { path = "../bootloader" }
|
||||||
|
|
||||||
|
[[test]]
|
||||||
|
name = "panic_test"
|
||||||
|
harness = false
|
||||||
|
|
||||||
|
[[test]]
|
||||||
|
name = "stack_overflow"
|
||||||
|
harness = false
|
@ -9,5 +9,5 @@ edition = "2018"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
cache_utils = { path = "../cache_utils" }
|
cache_utils = { path = "../cache_utils" }
|
||||||
cache_side_channel = { path = "../cache_side_channel" }
|
cache_side_channel = { path = "../cache_side_channel" }
|
||||||
nix = "0.20.0"
|
nix = "0.28.0"
|
||||||
basic_timing_cache_channel = { path = "../basic_timing_cache_channel" }
|
basic_timing_cache_channel = { path = "../basic_timing_cache_channel" }
|
||||||
|
@ -9,5 +9,5 @@ edition = "2018"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
cache_utils = { path = "../cache_utils" }
|
cache_utils = { path = "../cache_utils" }
|
||||||
cache_side_channel = { path = "../cache_side_channel" }
|
cache_side_channel = { path = "../cache_side_channel" }
|
||||||
nix = "0.20.0"
|
nix = "0.28.0"
|
||||||
basic_timing_cache_channel = { path = "../basic_timing_cache_channel" }
|
basic_timing_cache_channel = { path = "../basic_timing_cache_channel" }
|
||||||
|
@ -7,7 +7,7 @@ edition = "2018"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
x86_64 = "0.14.1"
|
x86_64 = "0.15.1"
|
||||||
spin = "0.9.0"
|
spin = "0.9.0"
|
||||||
|
|
||||||
[dependencies.lazy_static]
|
[dependencies.lazy_static]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user