mmtk/util/metadata/side_metadata/
mod.rs

1//! This module provides an implementation of side table metadata.
2// For convenience, this module is public and the bindings may create and use side metadata for their purpose.
3
4pub(crate) mod helpers;
5#[cfg(target_pointer_width = "32")]
6mod helpers_32;
7mod layout;
8
9mod global;
10pub(crate) mod ranges;
11mod sanity;
12mod side_metadata_tests;
13pub(crate) mod spec_defs;
14
15pub use global::*;
16pub use layout::*;
17
18use crate::util::options::Options;
19use crate::vm::ObjectModel;
20use crate::vm::VMBinding;
21
22/// Initialize side metadata runtime state and reserve the side metadata address range.
23pub fn initialize_side_metadata<VM: VMBinding>(options: &Options) {
24    let vm_side_metadata_specs = super::extract_side_metadata(&[
25        *VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC,
26        *VM::VMObjectModel::LOCAL_FORWARDING_POINTER_SPEC,
27        *VM::VMObjectModel::LOCAL_FORWARDING_BITS_SPEC,
28        *VM::VMObjectModel::LOCAL_MARK_BIT_SPEC,
29        #[cfg(feature = "object_pinning")]
30        *VM::VMObjectModel::LOCAL_PINNING_BIT_SPEC,
31        *VM::VMObjectModel::LOCAL_LOS_MARK_NURSERY_SPEC,
32    ]);
33    debug!(
34        "initialize_side_metadata(): collected {} VM side metadata specs",
35        vm_side_metadata_specs.len()
36    );
37    for spec in &vm_side_metadata_specs {
38        debug!("  VM side metadata spec: {:?}", spec);
39    }
40    set_vm_side_metadata_specs(&vm_side_metadata_specs);
41    initialize_side_metadata_base(
42        *options.side_metadata_base_address,
43        options.transparent_hugepages_as_huge_page_support(),
44    );
45}
46
47#[cfg(test)]
48pub(crate) fn core_test_initialize_side_metadata() {
49    use crate::util::os::HugePageSupport;
50    use crate::util::Address;
51
52    if is_side_metadata_initialized() {
53        return;
54    }
55
56    set_vm_side_metadata_specs(&[]);
57    initialize_side_metadata_base(Address::ZERO, HugePageSupport::No);
58}
59
60// Re-export helper functions. Allow unused imports in case there is no function that can be re-exported.
61#[allow(unused_imports)]
62pub(crate) use helpers::*;
63#[cfg(target_pointer_width = "32")]
64#[allow(unused_imports)]
65pub(crate) use helpers_32::*;
66pub(crate) use sanity::SideMetadataSanity;