diff --git a/README.md b/README.md index 5f444c8..a47669e 100644 --- a/README.md +++ b/README.md @@ -703,66 +703,117 @@ To troubleshoot the Apache NuttX MMU Fault on Unicorn Emulator, we auto-generate ```mermaid flowchart TD arm64_boot_el1_init --> arm64_isb + click arm64_boot_el1_init href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_boot.c#L137" "arch/arm64/src/common/arm64_boot.c " arm64_isb --> arm64_boot_el1_init + click arm64_isb href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/barriers.h#L57" "arch/arm64/src/common/barriers.h " arm64_boot_el1_init --> arm64_isb + click arm64_boot_el1_init href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_boot.c#L145" "arch/arm64/src/common/arm64_boot.c " arm64_isb --> arm64_boot_el1_init + click arm64_isb href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/barriers.h#L57" "arch/arm64/src/common/barriers.h " arm64_boot_el1_init --> arm64_boot_primary_c_routine + click arm64_boot_el1_init href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_boot.c#L161" "arch/arm64/src/common/arm64_boot.c " arm64_boot_primary_c_routine --> memset + click arm64_boot_primary_c_routine href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_boot.c#L180" "arch/arm64/src/common/arm64_boot.c " memset --> arm64_boot_primary_c_routine + click memset href "https://github.com/apache/nuttx/blob/master/libs/libc/string/lib_memset.c#L168" "libs/libc/string/lib_memset.c " arm64_boot_primary_c_routine --> arm64_chip_boot + click arm64_boot_primary_c_routine href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_boot.c#L181" "arch/arm64/src/common/arm64_boot.c " arm64_chip_boot --> arm64_mmu_init + click arm64_chip_boot href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/a64/a64_boot.c#L81" "arch/arm64/src/a64/a64_boot.c " arm64_mmu_init --> setup_page_tables + click arm64_mmu_init href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L583" "arch/arm64/src/common/arm64_mmu.c " setup_page_tables --> init_xlat_tables + click setup_page_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L490" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> calculate_pte_index + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L417" "arch/arm64/src/common/arm64_mmu.c " calculate_pte_index --> init_xlat_tables + click calculate_pte_index href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L246" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> pte_desc_type + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L447" "arch/arm64/src/common/arm64_mmu.c " pte_desc_type --> new_prealloc_table + click pte_desc_type href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L234" "arch/arm64/src/common/arm64_mmu.c " new_prealloc_table --> init_xlat_tables + click new_prealloc_table href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L378" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> calculate_pte_index + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L437" "arch/arm64/src/common/arm64_mmu.c " calculate_pte_index --> pte_desc_type + click calculate_pte_index href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L246" "arch/arm64/src/common/arm64_mmu.c " pte_desc_type --> calculate_pte_index + click pte_desc_type href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L234" "arch/arm64/src/common/arm64_mmu.c " calculate_pte_index --> init_xlat_tables + click calculate_pte_index href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L247" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> set_pte_block_desc + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L447" "arch/arm64/src/common/arm64_mmu.c " set_pte_block_desc --> init_xlat_tables + click set_pte_block_desc href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L293" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> calculate_pte_index + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L456" "arch/arm64/src/common/arm64_mmu.c " calculate_pte_index --> init_xlat_tables + click calculate_pte_index href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L246" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> pte_desc_type + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L447" "arch/arm64/src/common/arm64_mmu.c " pte_desc_type --> init_xlat_tables + click pte_desc_type href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L234" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> calculate_pte_index + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L472" "arch/arm64/src/common/arm64_mmu.c " calculate_pte_index --> pte_desc_type + click calculate_pte_index href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L246" "arch/arm64/src/common/arm64_mmu.c " pte_desc_type --> calculate_pte_index + click pte_desc_type href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L234" "arch/arm64/src/common/arm64_mmu.c " calculate_pte_index --> init_xlat_tables + click calculate_pte_index href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L247" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> set_pte_block_desc - set_pte_block_desc --> init_xlat_tables + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L447" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> calculate_pte_index + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L456" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> pte_desc_type + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L447" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> calculate_pte_index + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L472" "arch/arm64/src/common/arm64_mmu.c " calculate_pte_index --> pte_desc_type - pte_desc_type --> calculate_pte_index + click calculate_pte_index href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L246" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> set_pte_block_desc + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L447" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> pte_desc_type + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L447" "arch/arm64/src/common/arm64_mmu.c " calculate_pte_index --> pte_desc_type + click calculate_pte_index href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L246" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> set_pte_block_desc - init_xlat_tables --> pte_desc_type - init_xlat_tables --> set_pte_block_desc + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L447" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> set_pte_block_desc + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L447" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> set_pte_block_desc + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L447" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> set_pte_block_desc + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L447" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> set_pte_block_desc + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L447" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> setup_page_tables + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L456" "arch/arm64/src/common/arm64_mmu.c " pte_desc_type --> new_prealloc_table + click pte_desc_type href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L234" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> setup_page_tables + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L456" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> new_prealloc_table + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L472" "arch/arm64/src/common/arm64_mmu.c " new_prealloc_table --> split_pte_block_desc + click new_prealloc_table href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L378" "arch/arm64/src/common/arm64_mmu.c " split_pte_block_desc --> set_pte_table_desc + click split_pte_block_desc href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L401" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> setup_page_tables + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L456" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> setup_page_tables + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L456" "arch/arm64/src/common/arm64_mmu.c " init_xlat_tables --> setup_page_tables + click init_xlat_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L456" "arch/arm64/src/common/arm64_mmu.c " setup_page_tables --> enable_mmu_el1 + click setup_page_tables href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L515" "arch/arm64/src/common/arm64_mmu.c " enable_mmu_el1 --> arm64_isb + click enable_mmu_el1 href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L532" "arch/arm64/src/common/arm64_mmu.c " arm64_isb --> enable_mmu_el1 + click arm64_isb href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/barriers.h#L57" "arch/arm64/src/common/barriers.h " enable_mmu_el1 --> ***_HALT_*** - click arm64_isb href "https://www.github.com" "This is a tooltip for a link" + click enable_mmu_el1 href "https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L542" "arch/arm64/src/common/arm64_mmu.c " ``` We generated the Call Graph with this command... diff --git a/src/main.rs b/src/main.rs index c1e8497..eac02d6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -210,7 +210,8 @@ fn map_address_to_location( if let Some(loc) = loc { if let Some(file) = loc.file { let s = String::from(file) - .replace("/private/tmp/nuttx/nuttx/", ""); + .replace("/private/tmp/nuttx/nuttx/", "") + .replace("arch/arm64/src/chip", "arch/arm64/src/a64"); // TODO: Handle other chips Some((Some(s), loc.line, loc.column)) } else { Some((None, loc.line, loc.column)) @@ -226,10 +227,10 @@ fn call_graph( _address: u64, // Code Address _size: u32, // Size of Code Block function: Option, // Function Name - _loc: Option<( // Source Location - Option, // Filename - Option, // Line - Option // Column + loc: Option<( // Source Location + Option, // Filename + Option, // Line + Option // Column )> ) { // Get the Function Name @@ -238,8 +239,9 @@ fn call_graph( // Unsafe because `LAST_FNAME` is a Static Mutable unsafe { - // Skip we are still in the same Function + // Skip if we are still in the same Function static mut LAST_FNAME: String = String::new(); + static mut LAST_LOC: Option<(Option, Option, Option)> = None; if fname.eq(&LAST_FNAME) { return; } // If this function has not been shown too often... @@ -248,10 +250,17 @@ fn call_graph( if LAST_FNAME.is_empty() { println!("call_graph: flowchart TD"); // Top-Down Flowchart } else { - println!("call_graph: {} --> {}", LAST_FNAME, fname); + // URL looks like https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_mmu.c#L541 + let (file, line, _) = LAST_LOC.clone().unwrap_or((Some("".to_string()), None, None)); + let file = file.unwrap_or("".to_string()); + let line = line.unwrap_or(1) - 1; + let url = format!("https://github.com/apache/nuttx/blob/master/{file}#L{line}"); + println!("call_graph: {LAST_FNAME} --> {fname}"); + println!("call_graph: click {LAST_FNAME} href \"{url}\" \"{file} \""); } } - LAST_FNAME = fname; + LAST_FNAME = fname; + LAST_LOC = loc; } }