From b2d22c1bd78595f5dd5e183aa9e5ebb2299ac64f Mon Sep 17 00:00:00 2001 From: Mathieu Tarral Date: Wed, 9 Jul 2025 06:50:37 -0700 Subject: [PATCH 1/6] simics-api-sys: bump build.rs with Simics versions 7.21 -> 7.38 --- simics-api-sys/build.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/simics-api-sys/build.rs b/simics-api-sys/build.rs index ee9da36..94eae0a 100644 --- a/simics-api-sys/build.rs +++ b/simics-api-sys/build.rs @@ -1070,6 +1070,24 @@ fn main() -> Result<()> { // -s ~/simics/simics-7.18.0 \ // -s ~/simics/simics-7.19.0 \ // -s ~/simics/simics-7.20.0 \ +// -s ~/simics/simics-7.21.0 \ +// -s ~/simics/simics-7.22.0 \ +// -s ~/simics/simics-7.23.0 \ +// -s ~/simics/simics-7.24.0 \ +// -s ~/simics/simics-7.25.0 \ +// -s ~/simics/simics-7.26.0 \ +// -s ~/simics/simics-7.27.0 \ +// -s ~/simics/simics-7.28.0 \ +// -s ~/simics/simics-7.29.0 \ +// -s ~/simics/simics-7.30.0 \ +// -s ~/simics/simics-7.31.0 \ +// -s ~/simics/simics-7.32.0 \ +// -s ~/simics/simics-7.33.0 \ +// -s ~/simics/simics-7.34.0 \ +// -s ~/simics/simics-7.35.0 \ +// -s ~/simics/simics-7.36.0 \ +// -s ~/simics/simics-7.37.0 \ +// -s ~/simics/simics-7.38.0 \ // -o simics-api-sys/simics_api_items.rs // ``` // From 5afb1799f33f55082c9008e1ce1a27dd8d9f4f90 Mon Sep 17 00:00:00 2001 From: Mathieu Tarral Date: Wed, 9 Jul 2025 06:51:17 -0700 Subject: [PATCH 2/6] simics-api-sys: run scripts/gen-simics-api-items.rs --- simics-api-sys/simics_api_items.rs | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/simics-api-sys/simics_api_items.rs b/simics-api-sys/simics_api_items.rs index ec511cb..6057d53 100644 --- a/simics-api-sys/simics_api_items.rs +++ b/simics-api-sys/simics_api_items.rs @@ -1,4 +1,4 @@ -const SIMICS_API_ITEMS: &[&str; 2461usize] = &[ +const SIMICS_API_ITEMS: &[&str; 2480usize] = &[ "A20_INTERFACE", "ABS_POINTER_ACTIVATE_INTERFACE", "ABS_POINTER_INTERFACE", @@ -269,6 +269,8 @@ const SIMICS_API_ITEMS: &[&str; 2461usize] = &[ "I2C_SLAVE_INTERFACE", "I2C_SLAVE_V2_INTERFACE", "I3C_DAA_SNOOP_INTERFACE", + "I3C_HDR_MASTER_INTERFACE", + "I3C_HDR_SLAVE_INTERFACE", "I3C_MASTER_INTERFACE", "I3C_SLAVE_INTERFACE", "I8051_INTERRUPT_INTERFACE", @@ -341,6 +343,7 @@ const SIMICS_API_ITEMS: &[&str; 2461usize] = &[ "MS1553_TERMINAL_INTERFACE", "MULTI_LEVEL_SIGNAL_INTERFACE", "NAND_FLASH_INTERFACE", + "NETWORK_BREAKPOINT_INTERFACE", "NIOS_CACHE_INTERFACE", "NIOS_CUSTOM_INTERFACE", "NIOS_EIC_INTERFACE", @@ -432,6 +435,7 @@ const SIMICS_API_ITEMS: &[&str; 2461usize] = &[ "RECORDER_INTERFACE", "RECORDER_V2_INTERFACE", "REGISTER_BREAKPOINT_INTERFACE", + "REGISTER_VIEW_CATALOG_INTERFACE", "REGISTER_VIEW_INTERFACE", "REGISTER_VIEW_READ_ONLY_INTERFACE", "RISCV_CLIC_INTERFACE", @@ -506,6 +510,8 @@ const SIMICS_API_ITEMS: &[&str; 2461usize] = &[ "SIM_DI_PREFIX_SSE_BIT", "SIM_DI_PREFIX_SS_BIT", "SIM_MAJOR_VERSION_DIFF", + "SIM_PYOBJECT", + "SIM_PYTYPEOBJECT", "SIM_STC_flush_cache", "SIM_VERSION", "SIM_VERSION_4_8", @@ -589,6 +595,7 @@ const SIMICS_API_ITEMS: &[&str; 2461usize] = &[ "SIM_ensure_partial_attr_order", "SIM_event_cancel_step", "SIM_event_cancel_time", + "SIM_event_class_flags", "SIM_event_find_next_cycle", "SIM_event_find_next_step", "SIM_event_find_next_time", @@ -626,6 +633,7 @@ const SIMICS_API_ITEMS: &[&str; 2461usize] = &[ "SIM_get_class_port_interface", "SIM_get_debugger", "SIM_get_directories", + "SIM_get_event_class", "SIM_get_global_message", "SIM_get_init_arg_boolean", "SIM_get_init_arg_string", @@ -1240,13 +1248,14 @@ const SIMICS_API_ITEMS: &[&str; 2461usize] = &[ "XTENSA_TIE_OUTPUT_QUEUE_INTERFACE", "XTENSA_WWDT_CONFIG_INTERFACE", "XTENSA_WWDT_FAULTINFO_INTERFACE", + "_", "_LARGEFILE64_SOURCE", "_LARGEFILE_SOURCE", "_POSIX_C_SOURCE", "_XOPEN_SOURCE", "__FILE", "__bool_true_false_are_defined", - "_mod", + "_cpu_instrumentation_entry_t", "_object", "_typeobject", "a20_interface", @@ -1335,6 +1344,7 @@ const SIMICS_API_ITEMS: &[&str; 2461usize] = &[ "branch_recorder", "branch_recorder_direction_t", "branch_recorder_t", + "break_net_cb_t", "break_string_cb_t", "break_strings_v2_interface", "break_strings_v2_interface_t", @@ -1730,6 +1740,8 @@ const SIMICS_API_ITEMS: &[&str; 2461usize] = &[ "i2c_status_t", "i3c_ack_t", "i3c_daa_snoop_interface", + "i3c_hdr_master_interface", + "i3c_hdr_slave_interface", "i3c_master_interface", "i3c_slave_interface", "ieee_802_3_duplex_mode_t", @@ -1930,6 +1942,7 @@ const SIMICS_API_ITEMS: &[&str; 2461usize] = &[ "os_getcwd_nice", "os_gethostname", "os_getpid", + "os_gettid", "os_gmtime", "os_host_ncpus", "os_host_phys_mem_size", @@ -2029,6 +2042,7 @@ const SIMICS_API_ITEMS: &[&str; 2461usize] = &[ "pcie_ats_translation_completion_entry_t", "pcie_byte_count_ret_t", "pcie_device_interface", + "pcie_ecs_t", "pcie_error_ret_t", "pcie_error_t", "pcie_hotplug_events_interface", @@ -2168,6 +2182,8 @@ const SIMICS_API_ITEMS: &[&str; 2461usize] = &[ "riscv_imsic_interface", "riscv_imsic_interface_t", "riscv_instruction_action_interface", + "riscv_io_error_ret_t", + "riscv_io_error_t", "riscv_memory_transaction", "riscv_memory_transaction_t", "riscv_reset_cb_t", @@ -2181,6 +2197,7 @@ const SIMICS_API_ITEMS: &[&str; 2461usize] = &[ "sb_addesc", "sb_addfmt", "sb_detach", + "sb_escape", "sb_fmt", "sb_free", "sb_new", @@ -2298,6 +2315,8 @@ const SIMICS_API_ITEMS: &[&str; 2461usize] = &[ "transaction_issue_cb_t", "transaction_subscribe_interface", "transaction_t", + "transaction_target_type_ret_t", + "transaction_target_type_t", "transaction_trace_atom_access", "transaction_trace_atom_access_t", "translate_interface", From e39ea57013558b3fed6b7d3e187959abe077e277 Mon Sep 17 00:00:00 2001 From: Mathieu Tarral Date: Wed, 30 Jul 2025 15:31:45 +0200 Subject: [PATCH 3/6] simics-api-sys: add fallback to detect python headers/lib (1033) --- simics-api-sys/build.rs | 101 ++++++++++++++++++++++++++-------------- 1 file changed, 67 insertions(+), 34 deletions(-) diff --git a/simics-api-sys/build.rs b/simics-api-sys/build.rs index 94eae0a..dbdcfe0 100644 --- a/simics-api-sys/build.rs +++ b/simics-api-sys/build.rs @@ -450,13 +450,31 @@ pub mod common { let bindings = Builder::default() .clang_arg( - subdir(base_dir_path.as_ref().join(HOST_DIRNAME).join("include")).and_then( - |p| { + subdir(base_dir_path.as_ref().join(HOST_DIRNAME).join("include")) + .and_then(|p| { p.to_str() .map(|s| format!("-I{}", s)) .ok_or_else(|| anyhow!("Could not convert path to string")) - }, - )?, + }) + .or_else(|_| { + // Fallback for Simics 7.28.0+ where Python headers are in separate package (1033) + println!("cargo:warning=Traditional Python include path not found, trying Simics Python package fallback"); + let parent_dir = base_dir_path.as_ref().parent().unwrap(); + let python_include_path = parent_dir + .join("simics-python-7.10.0") + .join(HOST_DIRNAME) + .join("include"); + if python_include_path.exists() { + subdir(&python_include_path) + .and_then(|p| { + p.to_str() + .map(|s| format!("-I{}", s)) + .ok_or_else(|| anyhow!("Could not convert path to string")) + }) + } else { + bail!("Python include directory not found at {}", python_include_path.display()) + } + })?, ) .clang_arg(format!("-I{}", &wrapper_include_path)) .clang_arg("-fretain-comments-from-system-headers") @@ -774,37 +792,52 @@ pub mod common { let libvtutils = bin_dir.join("libvtutils.so").canonicalize()?; - let sys_lib_dir = base_dir_path - .join(HOST_DIRNAME) - .join("sys") - .join("lib") - .canonicalize()?; + // Try both traditional and fallback sys/lib directories + let sys_lib_dirs = vec![ + base_dir_path.join(HOST_DIRNAME).join("sys").join("lib"), + base_dir_path.parent().unwrap().join("simics-python-7.10.0").join(HOST_DIRNAME).join("sys").join("lib") + ]; + + let mut libpython_found = None; + let mut used_sys_lib_dir = None; + + for sys_lib_path in &sys_lib_dirs { + println!("cargo:warning=Trying libpython path: {}", sys_lib_path.display()); + if let Ok(sys_lib_dir) = sys_lib_path.canonicalize() { + if let Some(libpython_path) = read_dir(&sys_lib_dir) + .ok() + .and_then(|entries| entries + .filter_map(|p| p.ok()) + .filter(|p| p.path().is_file()) + .filter(|p| { + let path = p.path(); + let Some(file_name) = path.file_name() else { + return false; + }; + let Some(file_name) = file_name.to_str() else { + return false; + }; + file_name.starts_with("libpython") + && file_name.contains(".so") + && file_name != "libpython3.so" + }) + .map(|p| p.path()) + .next()) + { + println!("cargo:warning=Found libpython in: {}", sys_lib_dir.display()); + libpython_found = Some(libpython_path); + used_sys_lib_dir = Some(sys_lib_dir); + break; + } + } + } - let libpython = sys_lib_dir.join( - read_dir(&sys_lib_dir)? - .filter_map(|p| p.ok()) - .filter(|p| p.path().is_file()) - .filter(|p| { - let path = p.path(); - - let Some(file_name) = path.file_name() else { - return false; - }; - - let Some(file_name) = file_name.to_str() else { - return false; - }; - - file_name.starts_with("libpython") - && file_name.contains(".so") - && file_name != "libpython3.so" - }) - .map(|p| p.path()) - .next() - .ok_or_else(|| { - anyhow!("No libpythonX.XX.so.X.X found in {}", sys_lib_dir.display()) - })?, - ); + let (sys_lib_dir, libpython_path) = match (used_sys_lib_dir, libpython_found) { + (Some(dir), Some(path)) => (dir, path), + _ => return Err(anyhow!("No libpythonX.XX.so.X.X found in any sys/lib directory")), + }; + + let libpython = sys_lib_dir.join(libpython_path); println!( "cargo:rustc-link-lib=dylib:+verbatim={}", From 2e9c8e8dbfa19554a6aff612db5c7796a5195f93 Mon Sep 17 00:00:00 2001 From: Mathieu Tarral Date: Wed, 30 Jul 2025 16:22:39 +0200 Subject: [PATCH 4/6] simics-build-utils: add libpython detection fallback logic --- simics-build-utils/src/lib.rs | 75 +++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 30 deletions(-) diff --git a/simics-build-utils/src/lib.rs b/simics-build-utils/src/lib.rs index 934288b..17d33f8 100644 --- a/simics-build-utils/src/lib.rs +++ b/simics-build-utils/src/lib.rs @@ -119,37 +119,52 @@ pub fn emit_link_info() -> Result<()> { let libvtutils = bin_dir.join("libvtutils.so").canonicalize()?; - let sys_lib_dir = base_dir_path - .join(HOST_DIRNAME) - .join("sys") - .join("lib") - .canonicalize()?; - - let libpython = sys_lib_dir.join( - read_dir(&sys_lib_dir)? - .filter_map(|p| p.ok()) - .filter(|p| p.path().is_file()) - .filter(|p| { - let path = p.path(); - - let Some(file_name) = path.file_name() else { - return false; - }; - - let Some(file_name) = file_name.to_str() else { - return false; - }; + // Try both traditional and fallback sys/lib directories + let sys_lib_dirs = vec![ + base_dir_path.join(HOST_DIRNAME).join("sys").join("lib"), + base_dir_path.parent().unwrap().join("simics-python-7.10.0").join(HOST_DIRNAME).join("sys").join("lib") + ]; + + let mut libpython_found = None; + let mut used_sys_lib_dir = None; + + for sys_lib_path in &sys_lib_dirs { + println!("cargo:warning=Trying libpython path: {}", sys_lib_path.display()); + if let Ok(sys_lib_dir) = sys_lib_path.canonicalize() { + if let Some(libpython_path) = read_dir(&sys_lib_dir) + .ok() + .and_then(|entries| entries + .filter_map(|p| p.ok()) + .filter(|p| p.path().is_file()) + .filter(|p| { + let path = p.path(); + let Some(file_name) = path.file_name() else { + return false; + }; + let Some(file_name) = file_name.to_str() else { + return false; + }; + file_name.starts_with("libpython") + && file_name.contains(".so") + && file_name != "libpython3.so" + }) + .map(|p| p.path()) + .next()) + { + println!("cargo:warning=Found libpython in: {}", sys_lib_dir.display()); + libpython_found = Some(libpython_path); + used_sys_lib_dir = Some(sys_lib_dir); + break; + } + } + } + + let (sys_lib_dir, libpython_path) = match (used_sys_lib_dir, libpython_found) { + (Some(dir), Some(path)) => (dir, path), + _ => return Err(anyhow!("No libpythonX.XX.so.X.X found in any sys/lib directory")), + }; - file_name.starts_with("libpython") - && file_name.contains(".so") - && file_name != "libpython3.so" - }) - .map(|p| p.path()) - .next() - .ok_or_else(|| { - anyhow!("No libpythonX.XX.so.X.X found in {}", sys_lib_dir.display()) - })?, - ); + let libpython = sys_lib_dir.join(libpython_path); println!( "cargo:rustc-link-lib=dylib:+verbatim={}", From 4bb6257ceab61305335f3c33205ab8ab7eaf6743 Mon Sep 17 00:00:00 2001 From: Mathieu Tarral Date: Tue, 5 Aug 2025 15:29:52 +0200 Subject: [PATCH 5/6] simics-macro: add fallback to locate python --- simics-api-sys/build.rs | 33 +++++++--- simics-build-utils/src/lib.rs | 33 +++++++--- simics-macro/src/interface/mod.rs | 106 ++++++++++++++++++++++-------- 3 files changed, 127 insertions(+), 45 deletions(-) diff --git a/simics-api-sys/build.rs b/simics-api-sys/build.rs index dbdcfe0..bd8a15a 100644 --- a/simics-api-sys/build.rs +++ b/simics-api-sys/build.rs @@ -795,18 +795,26 @@ pub mod common { // Try both traditional and fallback sys/lib directories let sys_lib_dirs = vec![ base_dir_path.join(HOST_DIRNAME).join("sys").join("lib"), - base_dir_path.parent().unwrap().join("simics-python-7.10.0").join(HOST_DIRNAME).join("sys").join("lib") + base_dir_path + .parent() + .unwrap() + .join("simics-python-7.10.0") + .join(HOST_DIRNAME) + .join("sys") + .join("lib"), ]; let mut libpython_found = None; let mut used_sys_lib_dir = None; for sys_lib_path in &sys_lib_dirs { - println!("cargo:warning=Trying libpython path: {}", sys_lib_path.display()); + println!( + "cargo:warning=Trying libpython path: {}", + sys_lib_path.display() + ); if let Ok(sys_lib_dir) = sys_lib_path.canonicalize() { - if let Some(libpython_path) = read_dir(&sys_lib_dir) - .ok() - .and_then(|entries| entries + if let Some(libpython_path) = read_dir(&sys_lib_dir).ok().and_then(|entries| { + entries .filter_map(|p| p.ok()) .filter(|p| p.path().is_file()) .filter(|p| { @@ -822,9 +830,12 @@ pub mod common { && file_name != "libpython3.so" }) .map(|p| p.path()) - .next()) - { - println!("cargo:warning=Found libpython in: {}", sys_lib_dir.display()); + .next() + }) { + println!( + "cargo:warning=Found libpython in: {}", + sys_lib_dir.display() + ); libpython_found = Some(libpython_path); used_sys_lib_dir = Some(sys_lib_dir); break; @@ -834,7 +845,11 @@ pub mod common { let (sys_lib_dir, libpython_path) = match (used_sys_lib_dir, libpython_found) { (Some(dir), Some(path)) => (dir, path), - _ => return Err(anyhow!("No libpythonX.XX.so.X.X found in any sys/lib directory")), + _ => { + return Err(anyhow!( + "No libpythonX.XX.so.X.X found in any sys/lib directory" + )) + } }; let libpython = sys_lib_dir.join(libpython_path); diff --git a/simics-build-utils/src/lib.rs b/simics-build-utils/src/lib.rs index 17d33f8..f9f4928 100644 --- a/simics-build-utils/src/lib.rs +++ b/simics-build-utils/src/lib.rs @@ -122,18 +122,26 @@ pub fn emit_link_info() -> Result<()> { // Try both traditional and fallback sys/lib directories let sys_lib_dirs = vec![ base_dir_path.join(HOST_DIRNAME).join("sys").join("lib"), - base_dir_path.parent().unwrap().join("simics-python-7.10.0").join(HOST_DIRNAME).join("sys").join("lib") + base_dir_path + .parent() + .unwrap() + .join("simics-python-7.10.0") + .join(HOST_DIRNAME) + .join("sys") + .join("lib"), ]; let mut libpython_found = None; let mut used_sys_lib_dir = None; for sys_lib_path in &sys_lib_dirs { - println!("cargo:warning=Trying libpython path: {}", sys_lib_path.display()); + println!( + "cargo:warning=Trying libpython path: {}", + sys_lib_path.display() + ); if let Ok(sys_lib_dir) = sys_lib_path.canonicalize() { - if let Some(libpython_path) = read_dir(&sys_lib_dir) - .ok() - .and_then(|entries| entries + if let Some(libpython_path) = read_dir(&sys_lib_dir).ok().and_then(|entries| { + entries .filter_map(|p| p.ok()) .filter(|p| p.path().is_file()) .filter(|p| { @@ -149,9 +157,12 @@ pub fn emit_link_info() -> Result<()> { && file_name != "libpython3.so" }) .map(|p| p.path()) - .next()) - { - println!("cargo:warning=Found libpython in: {}", sys_lib_dir.display()); + .next() + }) { + println!( + "cargo:warning=Found libpython in: {}", + sys_lib_dir.display() + ); libpython_found = Some(libpython_path); used_sys_lib_dir = Some(sys_lib_dir); break; @@ -161,7 +172,11 @@ pub fn emit_link_info() -> Result<()> { let (sys_lib_dir, libpython_path) = match (used_sys_lib_dir, libpython_found) { (Some(dir), Some(path)) => (dir, path), - _ => return Err(anyhow!("No libpythonX.XX.so.X.X found in any sys/lib directory")), + _ => { + return Err(anyhow!( + "No libpythonX.XX.so.X.X found in any sys/lib directory" + )) + } }; let libpython = sys_lib_dir.join(libpython_path); diff --git a/simics-macro/src/interface/mod.rs b/simics-macro/src/interface/mod.rs index 28e2b28..33285f5 100644 --- a/simics-macro/src/interface/mod.rs +++ b/simics-macro/src/interface/mod.rs @@ -635,18 +635,38 @@ impl CInterface { }; #[cfg(unix)] - let mini_python = simics_base - .join(HOST_DIRNAME) - .join("bin") - .join("mini-python"); + let mini_python = { + let traditional_path = simics_base.join("bin").join("mini-python"); + if traditional_path.exists() { + traditional_path + } else { + // Fallback for Simics 7.28.0+ where mini-python is in separate Python package (1033) + let parent_dir = simics_base.parent().unwrap(); + parent_dir + .join("simics-python-7.10.0") + .join(HOST_DIRNAME) + .join("bin") + .join("mini-python") + } + }; #[cfg(unix)] let pywrapgen = simics_base.join(HOST_DIRNAME).join("bin").join("pywrapgen"); #[cfg(windows)] - let mini_python = simics_base - .join(HOST_DIRNAME) - .join("bin") - .join("mini-python.exe"); + let mini_python = { + let traditional_path = simics_base.join("bin").join("mini-python.exe"); + if traditional_path.exists() { + traditional_path + } else { + // Fallback for Simics 7.28.0+ where mini-python is in separate Python package (1033) + let parent_dir = simics_base.parent().unwrap(); + parent_dir + .join("simics-python-7.10.0") + .join(HOST_DIRNAME) + .join("bin") + .join("mini-python.exe") + } + }; #[cfg(windows)] let pywrapgen = simics_base .join(HOST_DIRNAME) @@ -655,22 +675,40 @@ impl CInterface { let pywrap_dir = simics_base.join(HOST_DIRNAME).join("bin").join("pywrap"); - let python_include = var(PYTHON3_INCLUDE_ENV).unwrap_or(format!( - "-I{}", - subdir(simics_base.join(HOST_DIRNAME).join("include")) - .ok_or_else(|| { - Error::custom(format!( - "Failed to get include directory subdirectory of {}", - simics_base.join(HOST_DIRNAME).join("include").display() - )) - })? - .display() - )); + let python_include = var(PYTHON3_INCLUDE_ENV).unwrap_or_else(|_| { + // Try traditional path first + if let Some(include_path) = subdir(simics_base.join(HOST_DIRNAME).join("include")) { + format!("-I{}", include_path.display()) + } else { + // Fallback for Simics 7.28.0+ where Python headers are in separate package (1033) + println!("cargo:warning=Traditional Python include path not found, trying Simics Python package fallback"); + let parent_dir = simics_base.parent().unwrap(); + let python_include_path = parent_dir + .join("simics-python-7.10.0") + .join(HOST_DIRNAME) + .join("include"); + if let Some(include_path) = subdir(&python_include_path) { + format!("-I{}", include_path.display()) + } else { + panic!("Python include directory not found at {} or fallback location", + simics_base.join(HOST_DIRNAME).join("include").display()) + } + } + }); let python_include_path = subdir(simics_base.join(HOST_DIRNAME).join("include")) + .or_else(|| { + // Fallback for Simics 7.28.0+ where Python headers are in separate package (1033) + let parent_dir = simics_base.parent().unwrap(); + let python_include_path = parent_dir + .join("simics-python-7.10.0") + .join(HOST_DIRNAME) + .join("include"); + subdir(&python_include_path) + }) .ok_or_else(|| { Error::custom(format!( - "Failed to get include directory subdirectory of {}", + "Failed to get include directory subdirectory of {} or fallback location", simics_base.join(HOST_DIRNAME).join("include").display() )) })?; @@ -693,13 +731,27 @@ impl CInterface { .collect::>>()?; #[cfg(unix)] - let libpython_path = var(PYTHON3_LDFLAGS_ENV).map(PathBuf::from).unwrap_or( - simics_base - .join(HOST_DIRNAME) - .join("sys") - .join("lib") - .join(format!("libpython3.{CDYLIB_SUFFIX}")), - ); + let libpython_path = var(PYTHON3_LDFLAGS_ENV) + .map(PathBuf::from) + .unwrap_or_else(|_| { + let traditional_path = simics_base + .join(HOST_DIRNAME) + .join("sys") + .join("lib") + .join(format!("libpython3.{CDYLIB_SUFFIX}")); + if traditional_path.exists() { + traditional_path + } else { + // Fallback for Simics 7.28.0+ where libpython is in separate Python package (1033) + let parent_dir = simics_base.parent().unwrap(); + parent_dir + .join("simics-python-7.10.0") + .join(HOST_DIRNAME) + .join("sys") + .join("lib") + .join(format!("libpython3.{CDYLIB_SUFFIX}")) + } + }); #[cfg(windows)] let libpython_path = var(PYTHON3_LDFLAGS_ENV).map(PathBuf::from).unwrap_or( From 17374ba30e564fda5fe9f5503c3ea92a28f98912 Mon Sep 17 00:00:00 2001 From: Mathieu Tarral Date: Tue, 5 Aug 2025 15:30:07 +0200 Subject: [PATCH 6/6] simics: filter generic callback functions --- simics/build.rs | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/simics/build.rs b/simics/build.rs index 9f8f86a..f3914d3 100644 --- a/simics/build.rs +++ b/simics/build.rs @@ -463,20 +463,33 @@ impl Haps { .items .iter() .filter_map(|i| match i { - Item::Type(ty) if ty.ident.to_string().ends_with("_hap_callback") => Some( - hap_name_items - .get( - &(ty.ident - .to_string() - .trim_end_matches("_hap_callback") - .to_ascii_uppercase() - + "_HAP_NAME"), - ) - .map(|hap_name_item| ((*hap_name_item).clone(), ty.clone())) - .ok_or_else(|| { - darling::Error::custom(format!("Failed to find HAP name for {:?}", ty)) - }), - ), + Item::Type(ty) if ty.ident.to_string().ends_with("_hap_callback") => { + let type_name = ty.ident.to_string(); + // Skip generic callback type definitions that are not actual HAPs + // These are used as type aliases in Simics 7.38+ but don't correspond to actual HAPs + if type_name.starts_with("callback_type") + || type_name.starts_with("description") + || type_name.starts_with("index") + { + return None; + } + Some( + hap_name_items + .get( + &(type_name + .trim_end_matches("_hap_callback") + .to_ascii_uppercase() + + "_HAP_NAME"), + ) + .map(|hap_name_item| ((*hap_name_item).clone(), ty.clone())) + .ok_or_else(|| { + darling::Error::custom(format!( + "Failed to find HAP name for {:?}", + ty + )) + }), + ) + } _ => None, }) .collect::>>()?;