Promote peer-site 0x5dc1 companion lane
This commit is contained in:
parent
c843b55d10
commit
c6ed7d56c6
2 changed files with 218 additions and 3 deletions
|
|
@ -1893,6 +1893,15 @@ pub struct SmpSavePlacedStructureRecordTripletEntryProbe {
|
||||||
pub profile_open_marker_hex: String,
|
pub profile_open_marker_hex: String,
|
||||||
pub profile_repeated_primary_name: String,
|
pub profile_repeated_primary_name: String,
|
||||||
pub profile_repeated_secondary_name: String,
|
pub profile_repeated_secondary_name: String,
|
||||||
|
pub profile_footer_relative_offset: usize,
|
||||||
|
pub profile_footer_relative_offset_hex: String,
|
||||||
|
pub profile_pre_footer_padding_len: usize,
|
||||||
|
#[serde(default)]
|
||||||
|
pub profile_pre_footer_padding_hex_bytes: Vec<String>,
|
||||||
|
#[serde(default)]
|
||||||
|
pub profile_companion_byte_u8: Option<u8>,
|
||||||
|
#[serde(default)]
|
||||||
|
pub profile_companion_byte_hex: Option<String>,
|
||||||
pub profile_payload_dword: u32,
|
pub profile_payload_dword: u32,
|
||||||
pub profile_payload_dword_hex: String,
|
pub profile_payload_dword_hex: String,
|
||||||
pub profile_sentinel_i32: i32,
|
pub profile_sentinel_i32: i32,
|
||||||
|
|
@ -3572,6 +3581,24 @@ pub struct SmpSavePlacedStructureProfilePayloadDeltaSummaryEntry {
|
||||||
pub count: usize,
|
pub count: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
|
pub struct SmpSavePlacedStructureProfileFooterPaddingSummaryEntry {
|
||||||
|
pub padding_len: usize,
|
||||||
|
pub count: usize,
|
||||||
|
#[serde(default)]
|
||||||
|
pub sample_hex_bytes: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
|
pub struct SmpSavePlacedStructureProfileCompanionByteSummaryEntry {
|
||||||
|
pub companion_byte_hex: String,
|
||||||
|
pub count: usize,
|
||||||
|
#[serde(default)]
|
||||||
|
pub sample_primary_names: Vec<String>,
|
||||||
|
#[serde(default)]
|
||||||
|
pub sample_secondary_names: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
pub struct SmpPeriodicCompanyServiceTraceReport {
|
pub struct SmpPeriodicCompanyServiceTraceReport {
|
||||||
pub profile_family: String,
|
pub profile_family: String,
|
||||||
|
|
@ -3590,6 +3617,7 @@ pub struct SmpPeriodicCompanyServiceTraceReport {
|
||||||
pub peer_site_selector_candidate_owner_strip: String,
|
pub peer_site_selector_candidate_owner_strip: String,
|
||||||
pub peer_site_selector_candidate_persisted_tag_hex: String,
|
pub peer_site_selector_candidate_persisted_tag_hex: String,
|
||||||
pub peer_site_selector_candidate_selector_lane: String,
|
pub peer_site_selector_candidate_selector_lane: String,
|
||||||
|
pub peer_site_selector_candidate_companion_lane: String,
|
||||||
pub peer_site_selector_candidate_class_identity_status: String,
|
pub peer_site_selector_candidate_class_identity_status: String,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub peer_site_selector_candidate_helper_linkage: Vec<String>,
|
pub peer_site_selector_candidate_helper_linkage: Vec<String>,
|
||||||
|
|
@ -3600,6 +3628,12 @@ pub struct SmpPeriodicCompanyServiceTraceReport {
|
||||||
pub peer_site_selector_candidate_saved_payload_delta_summaries:
|
pub peer_site_selector_candidate_saved_payload_delta_summaries:
|
||||||
Vec<SmpSavePlacedStructureProfilePayloadDeltaSummaryEntry>,
|
Vec<SmpSavePlacedStructureProfilePayloadDeltaSummaryEntry>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
|
pub peer_site_selector_candidate_saved_footer_padding_summaries:
|
||||||
|
Vec<SmpSavePlacedStructureProfileFooterPaddingSummaryEntry>,
|
||||||
|
#[serde(default)]
|
||||||
|
pub peer_site_selector_candidate_saved_companion_byte_summaries:
|
||||||
|
Vec<SmpSavePlacedStructureProfileCompanionByteSummaryEntry>,
|
||||||
|
#[serde(default)]
|
||||||
pub peer_site_restore_input_fields: Vec<String>,
|
pub peer_site_restore_input_fields: Vec<String>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub peer_site_runtime_input_fields: Vec<String>,
|
pub peer_site_runtime_input_fields: Vec<String>,
|
||||||
|
|
@ -4288,6 +4322,89 @@ fn summarize_peer_site_selector_candidate_saved_payload_deltas(
|
||||||
summaries
|
summaries
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn summarize_peer_site_selector_candidate_saved_footer_padding(
|
||||||
|
analysis: &SmpSaveCompanyChairmanAnalysisReport,
|
||||||
|
) -> Vec<SmpSavePlacedStructureProfileFooterPaddingSummaryEntry> {
|
||||||
|
let Some(triplets) = analysis.placed_structure_record_triplets.as_ref() else {
|
||||||
|
return Vec::new();
|
||||||
|
};
|
||||||
|
let mut grouped = BTreeMap::<usize, (usize, BTreeSet<String>)>::new();
|
||||||
|
for entry in &triplets.entries {
|
||||||
|
let grouped_entry = grouped
|
||||||
|
.entry(entry.profile_pre_footer_padding_len)
|
||||||
|
.or_insert_with(|| (0, BTreeSet::new()));
|
||||||
|
grouped_entry.0 += 1;
|
||||||
|
if grouped_entry.1.len() < 4 {
|
||||||
|
grouped_entry
|
||||||
|
.1
|
||||||
|
.insert(entry.profile_pre_footer_padding_hex_bytes.join(","));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mut summaries = grouped
|
||||||
|
.into_iter()
|
||||||
|
.map(|(padding_len, (count, sample_hex_bytes))| {
|
||||||
|
SmpSavePlacedStructureProfileFooterPaddingSummaryEntry {
|
||||||
|
padding_len,
|
||||||
|
count,
|
||||||
|
sample_hex_bytes: sample_hex_bytes.into_iter().collect(),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
summaries.sort_by(|left, right| {
|
||||||
|
right
|
||||||
|
.count
|
||||||
|
.cmp(&left.count)
|
||||||
|
.then_with(|| left.padding_len.cmp(&right.padding_len))
|
||||||
|
});
|
||||||
|
summaries.truncate(6);
|
||||||
|
summaries
|
||||||
|
}
|
||||||
|
|
||||||
|
fn summarize_peer_site_selector_candidate_saved_companion_bytes(
|
||||||
|
analysis: &SmpSaveCompanyChairmanAnalysisReport,
|
||||||
|
) -> Vec<SmpSavePlacedStructureProfileCompanionByteSummaryEntry> {
|
||||||
|
let Some(triplets) = analysis.placed_structure_record_triplets.as_ref() else {
|
||||||
|
return Vec::new();
|
||||||
|
};
|
||||||
|
let mut grouped = BTreeMap::<String, (usize, BTreeSet<String>, BTreeSet<String>)>::new();
|
||||||
|
for entry in &triplets.entries {
|
||||||
|
let Some(companion_byte_hex) = entry.profile_companion_byte_hex.as_ref() else {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
let grouped_entry = grouped
|
||||||
|
.entry(companion_byte_hex.clone())
|
||||||
|
.or_insert_with(|| (0, BTreeSet::new(), BTreeSet::new()));
|
||||||
|
grouped_entry.0 += 1;
|
||||||
|
if grouped_entry.1.len() < 4 {
|
||||||
|
grouped_entry.1.insert(entry.primary_name.clone());
|
||||||
|
}
|
||||||
|
if grouped_entry.2.len() < 4 {
|
||||||
|
grouped_entry.2.insert(entry.secondary_name.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mut summaries = grouped
|
||||||
|
.into_iter()
|
||||||
|
.map(
|
||||||
|
|(companion_byte_hex, (count, primary_names, secondary_names))| {
|
||||||
|
SmpSavePlacedStructureProfileCompanionByteSummaryEntry {
|
||||||
|
companion_byte_hex,
|
||||||
|
count,
|
||||||
|
sample_primary_names: primary_names.into_iter().collect(),
|
||||||
|
sample_secondary_names: secondary_names.into_iter().collect(),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
summaries.sort_by(|left, right| {
|
||||||
|
right
|
||||||
|
.count
|
||||||
|
.cmp(&left.count)
|
||||||
|
.then_with(|| left.companion_byte_hex.cmp(&right.companion_byte_hex))
|
||||||
|
});
|
||||||
|
summaries.truncate(8);
|
||||||
|
summaries
|
||||||
|
}
|
||||||
|
|
||||||
fn build_periodic_company_service_trace_report(
|
fn build_periodic_company_service_trace_report(
|
||||||
analysis: &SmpSaveCompanyChairmanAnalysisReport,
|
analysis: &SmpSaveCompanyChairmanAnalysisReport,
|
||||||
) -> SmpPeriodicCompanyServiceTraceReport {
|
) -> SmpPeriodicCompanyServiceTraceReport {
|
||||||
|
|
@ -4303,6 +4420,7 @@ fn build_periodic_company_service_trace_report(
|
||||||
"0x0045c150 -> 0x0045c310 -> 0x0045c36e -> 0x00456100 -> 0x00455b70".to_string();
|
"0x0045c150 -> 0x0045c310 -> 0x0045c36e -> 0x00456100 -> 0x00455b70".to_string();
|
||||||
let peer_site_selector_candidate_persisted_tag_hex = "0x5dc1".to_string();
|
let peer_site_selector_candidate_persisted_tag_hex = "0x5dc1".to_string();
|
||||||
let peer_site_selector_candidate_selector_lane = "[owner+0x23e]".to_string();
|
let peer_site_selector_candidate_selector_lane = "[owner+0x23e]".to_string();
|
||||||
|
let peer_site_selector_candidate_companion_lane = "[owner+0x242]".to_string();
|
||||||
let peer_site_selector_candidate_class_identity_status =
|
let peer_site_selector_candidate_class_identity_status =
|
||||||
"grounded_direct_local_helper_strip".to_string();
|
"grounded_direct_local_helper_strip".to_string();
|
||||||
let peer_site_selector_candidate_helper_linkage = vec![
|
let peer_site_selector_candidate_helper_linkage = vec![
|
||||||
|
|
@ -4316,6 +4434,10 @@ fn build_periodic_company_service_trace_report(
|
||||||
summarize_peer_site_selector_candidate_saved_payloads(analysis);
|
summarize_peer_site_selector_candidate_saved_payloads(analysis);
|
||||||
let peer_site_selector_candidate_saved_payload_delta_summaries =
|
let peer_site_selector_candidate_saved_payload_delta_summaries =
|
||||||
summarize_peer_site_selector_candidate_saved_payload_deltas(analysis);
|
summarize_peer_site_selector_candidate_saved_payload_deltas(analysis);
|
||||||
|
let peer_site_selector_candidate_saved_footer_padding_summaries =
|
||||||
|
summarize_peer_site_selector_candidate_saved_footer_padding(analysis);
|
||||||
|
let peer_site_selector_candidate_saved_companion_byte_summaries =
|
||||||
|
summarize_peer_site_selector_candidate_saved_companion_bytes(analysis);
|
||||||
let peer_site_restore_input_fields = vec![
|
let peer_site_restore_input_fields = vec![
|
||||||
"[site+0x3cc] saved placed-structure id feeding 0x62b2fc".to_string(),
|
"[site+0x3cc] saved placed-structure id feeding 0x62b2fc".to_string(),
|
||||||
"[site+0x3d0] saved companion-region id from [placed+0x173] feeding 0x62b268".to_string(),
|
"[site+0x3d0] saved companion-region id from [placed+0x173] feeding 0x62b268".to_string(),
|
||||||
|
|
@ -4624,13 +4746,19 @@ fn build_periodic_company_service_trace_report(
|
||||||
);
|
);
|
||||||
if !peer_site_selector_candidate_saved_payload_summaries.is_empty() {
|
if !peer_site_selector_candidate_saved_payload_summaries.is_empty() {
|
||||||
notes.push(format!(
|
notes.push(format!(
|
||||||
"The periodic-company trace now also carries a compact save-side summary of the tagged 0x5dc1 placed-structure profile payload/status pairs already parsed from the 0x36b1 triplet seam; dominant current pair is {} / {} x{}, and dominant adjacent payload delta is {:?}.",
|
"The periodic-company trace now also carries a compact save-side summary of the tagged 0x5dc1 placed-structure profile payload/status pairs already parsed from the 0x36b1 triplet seam; dominant current pair is {} / {} x{}, dominant adjacent payload delta is {:?}, dominant one-byte companion lane is {:?}, and dominant pre-footer padding len is {:?}.",
|
||||||
peer_site_selector_candidate_saved_payload_summaries[0].profile_payload_dword_hex,
|
peer_site_selector_candidate_saved_payload_summaries[0].profile_payload_dword_hex,
|
||||||
peer_site_selector_candidate_saved_payload_summaries[0].profile_status_kind,
|
peer_site_selector_candidate_saved_payload_summaries[0].profile_status_kind,
|
||||||
peer_site_selector_candidate_saved_payload_summaries[0].count,
|
peer_site_selector_candidate_saved_payload_summaries[0].count,
|
||||||
peer_site_selector_candidate_saved_payload_delta_summaries
|
peer_site_selector_candidate_saved_payload_delta_summaries
|
||||||
.first()
|
.first()
|
||||||
.map(|entry| entry.delta_hex.as_str())
|
.map(|entry| entry.delta_hex.as_str()),
|
||||||
|
peer_site_selector_candidate_saved_companion_byte_summaries
|
||||||
|
.first()
|
||||||
|
.map(|entry| entry.companion_byte_hex.as_str()),
|
||||||
|
peer_site_selector_candidate_saved_footer_padding_summaries
|
||||||
|
.first()
|
||||||
|
.map(|entry| entry.padding_len)
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
notes.push(
|
notes.push(
|
||||||
|
|
@ -4648,10 +4776,13 @@ fn build_periodic_company_service_trace_report(
|
||||||
peer_site_selector_candidate_owner_strip,
|
peer_site_selector_candidate_owner_strip,
|
||||||
peer_site_selector_candidate_persisted_tag_hex,
|
peer_site_selector_candidate_persisted_tag_hex,
|
||||||
peer_site_selector_candidate_selector_lane,
|
peer_site_selector_candidate_selector_lane,
|
||||||
|
peer_site_selector_candidate_companion_lane,
|
||||||
peer_site_selector_candidate_class_identity_status,
|
peer_site_selector_candidate_class_identity_status,
|
||||||
peer_site_selector_candidate_helper_linkage,
|
peer_site_selector_candidate_helper_linkage,
|
||||||
peer_site_selector_candidate_saved_payload_summaries,
|
peer_site_selector_candidate_saved_payload_summaries,
|
||||||
peer_site_selector_candidate_saved_payload_delta_summaries,
|
peer_site_selector_candidate_saved_payload_delta_summaries,
|
||||||
|
peer_site_selector_candidate_saved_footer_padding_summaries,
|
||||||
|
peer_site_selector_candidate_saved_companion_byte_summaries,
|
||||||
peer_site_restore_input_fields,
|
peer_site_restore_input_fields,
|
||||||
peer_site_runtime_input_fields,
|
peer_site_runtime_input_fields,
|
||||||
peer_site_runtime_reconstruction_status,
|
peer_site_runtime_reconstruction_status,
|
||||||
|
|
@ -14253,6 +14384,7 @@ fn parse_save_placed_structure_record_triplet_probe(
|
||||||
) {
|
) {
|
||||||
if profile_close_marker == 0x00005dc2 {
|
if profile_close_marker == 0x00005dc2 {
|
||||||
matched_footer = Some((
|
matched_footer = Some((
|
||||||
|
candidate_offset,
|
||||||
profile_payload_dword,
|
profile_payload_dword,
|
||||||
profile_sentinel_i32,
|
profile_sentinel_i32,
|
||||||
profile_close_marker,
|
profile_close_marker,
|
||||||
|
|
@ -14261,7 +14393,22 @@ fn parse_save_placed_structure_record_triplet_probe(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let (profile_payload_dword, profile_sentinel_i32, profile_close_marker) = matched_footer?;
|
let (
|
||||||
|
profile_footer_relative_offset,
|
||||||
|
profile_payload_dword,
|
||||||
|
profile_sentinel_i32,
|
||||||
|
profile_close_marker,
|
||||||
|
) = matched_footer?;
|
||||||
|
let profile_pre_footer_padding = profile_payload
|
||||||
|
.get(trailer_offset..profile_footer_relative_offset)?
|
||||||
|
.iter()
|
||||||
|
.map(|byte| format!("0x{byte:02x}"))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
let profile_companion_byte_u8 = if profile_pre_footer_padding.len() == 1 {
|
||||||
|
profile_payload.get(trailer_offset).copied()
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
let (profile_status_kind, farm_growth_stage_index) =
|
let (profile_status_kind, farm_growth_stage_index) =
|
||||||
derive_save_placed_structure_profile_status(
|
derive_save_placed_structure_profile_status(
|
||||||
&primary_name,
|
&primary_name,
|
||||||
|
|
@ -14289,6 +14436,13 @@ fn parse_save_placed_structure_record_triplet_probe(
|
||||||
profile_open_marker_hex: format!("0x{profile_open_marker:08x}"),
|
profile_open_marker_hex: format!("0x{profile_open_marker:08x}"),
|
||||||
profile_repeated_primary_name,
|
profile_repeated_primary_name,
|
||||||
profile_repeated_secondary_name,
|
profile_repeated_secondary_name,
|
||||||
|
profile_footer_relative_offset,
|
||||||
|
profile_footer_relative_offset_hex: format!("0x{profile_footer_relative_offset:x}"),
|
||||||
|
profile_pre_footer_padding_len: profile_pre_footer_padding.len(),
|
||||||
|
profile_pre_footer_padding_hex_bytes: profile_pre_footer_padding,
|
||||||
|
profile_companion_byte_hex: profile_companion_byte_u8
|
||||||
|
.map(|byte| format!("0x{byte:02x}")),
|
||||||
|
profile_companion_byte_u8,
|
||||||
profile_payload_dword,
|
profile_payload_dword,
|
||||||
profile_payload_dword_hex: format!("0x{profile_payload_dword:08x}"),
|
profile_payload_dword_hex: format!("0x{profile_payload_dword:08x}"),
|
||||||
profile_sentinel_i32,
|
profile_sentinel_i32,
|
||||||
|
|
@ -25035,6 +25189,22 @@ mod tests {
|
||||||
triplet_probe.entries[0].profile_repeated_secondary_name,
|
triplet_probe.entries[0].profile_repeated_secondary_name,
|
||||||
"StationSetA"
|
"StationSetA"
|
||||||
);
|
);
|
||||||
|
assert_eq!(
|
||||||
|
triplet_probe.entries[0].profile_footer_relative_offset_hex,
|
||||||
|
"0x1b"
|
||||||
|
);
|
||||||
|
assert_eq!(triplet_probe.entries[0].profile_pre_footer_padding_len, 1);
|
||||||
|
assert_eq!(
|
||||||
|
triplet_probe.entries[0].profile_pre_footer_padding_hex_bytes,
|
||||||
|
vec!["0x00".to_string()]
|
||||||
|
);
|
||||||
|
assert_eq!(triplet_probe.entries[0].profile_companion_byte_u8, Some(0));
|
||||||
|
assert_eq!(
|
||||||
|
triplet_probe.entries[0]
|
||||||
|
.profile_companion_byte_hex
|
||||||
|
.as_deref(),
|
||||||
|
Some("0x00")
|
||||||
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
triplet_probe.entries[0].profile_payload_dword_hex,
|
triplet_probe.entries[0].profile_payload_dword_hex,
|
||||||
"0x0e373500"
|
"0x0e373500"
|
||||||
|
|
@ -25442,6 +25612,12 @@ mod tests {
|
||||||
profile_open_marker_hex: "0x00000000".to_string(),
|
profile_open_marker_hex: "0x00000000".to_string(),
|
||||||
profile_repeated_primary_name: "TunnelSTBrick_Section.3dp".to_string(),
|
profile_repeated_primary_name: "TunnelSTBrick_Section.3dp".to_string(),
|
||||||
profile_repeated_secondary_name: "Infrastructure".to_string(),
|
profile_repeated_secondary_name: "Infrastructure".to_string(),
|
||||||
|
profile_footer_relative_offset: 0,
|
||||||
|
profile_footer_relative_offset_hex: "0x0".to_string(),
|
||||||
|
profile_pre_footer_padding_len: 0,
|
||||||
|
profile_pre_footer_padding_hex_bytes: Vec::new(),
|
||||||
|
profile_companion_byte_u8: None,
|
||||||
|
profile_companion_byte_hex: None,
|
||||||
profile_payload_dword: 0,
|
profile_payload_dword: 0,
|
||||||
profile_payload_dword_hex: "0x00000000".to_string(),
|
profile_payload_dword_hex: "0x00000000".to_string(),
|
||||||
profile_sentinel_i32: -1,
|
profile_sentinel_i32: -1,
|
||||||
|
|
@ -25471,6 +25647,12 @@ mod tests {
|
||||||
profile_open_marker_hex: "0x00000000".to_string(),
|
profile_open_marker_hex: "0x00000000".to_string(),
|
||||||
profile_repeated_primary_name: "TrackCapST_Cap.3dp".to_string(),
|
profile_repeated_primary_name: "TrackCapST_Cap.3dp".to_string(),
|
||||||
profile_repeated_secondary_name: "Infrastructure".to_string(),
|
profile_repeated_secondary_name: "Infrastructure".to_string(),
|
||||||
|
profile_footer_relative_offset: 0,
|
||||||
|
profile_footer_relative_offset_hex: "0x0".to_string(),
|
||||||
|
profile_pre_footer_padding_len: 0,
|
||||||
|
profile_pre_footer_padding_hex_bytes: Vec::new(),
|
||||||
|
profile_companion_byte_u8: None,
|
||||||
|
profile_companion_byte_hex: None,
|
||||||
profile_payload_dword: 0,
|
profile_payload_dword: 0,
|
||||||
profile_payload_dword_hex: "0x00000000".to_string(),
|
profile_payload_dword_hex: "0x00000000".to_string(),
|
||||||
profile_sentinel_i32: -1,
|
profile_sentinel_i32: -1,
|
||||||
|
|
@ -27255,6 +27437,12 @@ mod tests {
|
||||||
profile_open_marker_hex: "0x00005dc1".to_string(),
|
profile_open_marker_hex: "0x00005dc1".to_string(),
|
||||||
profile_repeated_primary_name: "StationA".to_string(),
|
profile_repeated_primary_name: "StationA".to_string(),
|
||||||
profile_repeated_secondary_name: "StationSetA".to_string(),
|
profile_repeated_secondary_name: "StationSetA".to_string(),
|
||||||
|
profile_footer_relative_offset: 0,
|
||||||
|
profile_footer_relative_offset_hex: "0x0".to_string(),
|
||||||
|
profile_pre_footer_padding_len: 1,
|
||||||
|
profile_pre_footer_padding_hex_bytes: vec!["0x01".to_string()],
|
||||||
|
profile_companion_byte_u8: Some(1),
|
||||||
|
profile_companion_byte_hex: Some("0x01".to_string()),
|
||||||
profile_payload_dword: 0x0e373880,
|
profile_payload_dword: 0x0e373880,
|
||||||
profile_payload_dword_hex: "0x0e373880".to_string(),
|
profile_payload_dword_hex: "0x0e373880".to_string(),
|
||||||
profile_sentinel_i32: -1,
|
profile_sentinel_i32: -1,
|
||||||
|
|
@ -27284,6 +27472,12 @@ mod tests {
|
||||||
profile_open_marker_hex: "0x00005dc1".to_string(),
|
profile_open_marker_hex: "0x00005dc1".to_string(),
|
||||||
profile_repeated_primary_name: "StationB".to_string(),
|
profile_repeated_primary_name: "StationB".to_string(),
|
||||||
profile_repeated_secondary_name: "StationSetB".to_string(),
|
profile_repeated_secondary_name: "StationSetB".to_string(),
|
||||||
|
profile_footer_relative_offset: 0,
|
||||||
|
profile_footer_relative_offset_hex: "0x0".to_string(),
|
||||||
|
profile_pre_footer_padding_len: 1,
|
||||||
|
profile_pre_footer_padding_hex_bytes: vec!["0x00".to_string()],
|
||||||
|
profile_companion_byte_u8: Some(0),
|
||||||
|
profile_companion_byte_hex: Some("0x00".to_string()),
|
||||||
profile_payload_dword: 0x0e373500,
|
profile_payload_dword: 0x0e373500,
|
||||||
profile_payload_dword_hex: "0x0e373500".to_string(),
|
profile_payload_dword_hex: "0x0e373500".to_string(),
|
||||||
profile_sentinel_i32: -1,
|
profile_sentinel_i32: -1,
|
||||||
|
|
@ -27350,6 +27544,10 @@ mod tests {
|
||||||
trace.peer_site_selector_candidate_selector_lane,
|
trace.peer_site_selector_candidate_selector_lane,
|
||||||
"[owner+0x23e]"
|
"[owner+0x23e]"
|
||||||
);
|
);
|
||||||
|
assert_eq!(
|
||||||
|
trace.peer_site_selector_candidate_companion_lane,
|
||||||
|
"[owner+0x242]"
|
||||||
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
trace.peer_site_selector_candidate_class_identity_status,
|
trace.peer_site_selector_candidate_class_identity_status,
|
||||||
"grounded_direct_local_helper_strip"
|
"grounded_direct_local_helper_strip"
|
||||||
|
|
@ -27373,6 +27571,14 @@ mod tests {
|
||||||
trace.peer_site_selector_candidate_saved_payload_delta_summaries[0].delta_hex,
|
trace.peer_site_selector_candidate_saved_payload_delta_summaries[0].delta_hex,
|
||||||
"0x00000380"
|
"0x00000380"
|
||||||
);
|
);
|
||||||
|
assert_eq!(
|
||||||
|
trace.peer_site_selector_candidate_saved_footer_padding_summaries[0].padding_len,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
trace.peer_site_selector_candidate_saved_companion_byte_summaries[0].companion_byte_hex,
|
||||||
|
"0x00"
|
||||||
|
);
|
||||||
assert_eq!(trace.peer_site_restore_input_fields.len(), 4);
|
assert_eq!(trace.peer_site_restore_input_fields.len(), 4);
|
||||||
assert_eq!(trace.peer_site_runtime_input_fields.len(), 3);
|
assert_eq!(trace.peer_site_runtime_input_fields.len(), 3);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,11 @@ Working rule:
|
||||||
almost entirely unique while the status kind stays `unset`, and the dominant adjacent payload
|
almost entirely unique while the status kind stays `unset`, and the dominant adjacent payload
|
||||||
delta is `0x00000780` across `1908` steps; grounded `q.gms` shows the same dominant adjacent
|
delta is `0x00000780` across `1908` steps; grounded `q.gms` shows the same dominant adjacent
|
||||||
delta `0x00000780` across `1868` steps
|
delta `0x00000780` across `1868` steps
|
||||||
|
- the same trace now also promotes the one-byte `0x5dc1` companion lane explicitly: grounded
|
||||||
|
`p.gms` shows dominant companion byte `0x00` on `2023` rows with only `3` `0x01` rows, and
|
||||||
|
grounded `q.gms` shows dominant companion byte `0x00` on `2043` rows with only `14` `0x01`
|
||||||
|
rows; the old “pre-footer padding” hypothesis is now better understood as the probable
|
||||||
|
`[owner+0x242]` companion lane rather than anonymous slack bytes
|
||||||
So the next owner question is no longer “what does the acquisition branch do?” or “which post-
|
So the next owner question is no longer “what does the acquisition branch do?” or “which post-
|
||||||
load owner replays linked-site refresh?” but “which concrete `0x00455b70` caller family applies
|
load owner replays linked-site refresh?” but “which concrete `0x00455b70` caller family applies
|
||||||
to the live site rows, and which persisted lane becomes the selector bundle that ultimately
|
to the live site rows, and which persisted lane becomes the selector bundle that ultimately
|
||||||
|
|
@ -123,6 +128,10 @@ Working rule:
|
||||||
(`dominant adjacent delta 0x780` on both `p.gms` and `q.gms`) rather than a compact selector
|
(`dominant adjacent delta 0x780` on both `p.gms` and `q.gms`) rather than a compact selector
|
||||||
family, so the next peer-site slice should treat that raw dword as a likely allocator/offset
|
family, so the next peer-site slice should treat that raw dword as a likely allocator/offset
|
||||||
lane until a stronger selector interpretation appears
|
lane until a stronger selector interpretation appears
|
||||||
|
- use the new `0x5dc1` companion-byte summary in the same trace as positive evidence:
|
||||||
|
the probable `[owner+0x242]` lane is overwhelmingly `0x00` with a tiny `0x01` residue on both
|
||||||
|
grounded saves, so the next peer-site slice should treat that byte as a real typed companion
|
||||||
|
discriminator and ask which later `0x004014b0` / `0x00406050` predicates actually consume it
|
||||||
- treat the peer-site selector seam itself as grounded enough for planning purposes
|
- treat the peer-site selector seam itself as grounded enough for planning purposes
|
||||||
- use the new structured restore/runtime field split in the same trace:
|
- use the new structured restore/runtime field split in the same trace:
|
||||||
restore subset
|
restore subset
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue