@@ -5,7 +5,7 @@ use intervaltree::IntervalTree;
55use kernel:: { find_kernel_with_idt, KernelInfo } ;
66use raw_cstr:: AsRawCstr ;
77use simics:: {
8- get_interface, get_processor_number, sys:: cpu_cb_handle_t, ConfObject ,
8+ get_interface, get_object , get_processor_number, info , sys:: cpu_cb_handle_t, ConfObject ,
99 CpuInstrumentationSubscribeInterface , IntRegisterInterface , ProcessorInfoV2Interface ,
1010} ;
1111use std:: {
@@ -73,10 +73,12 @@ impl WindowsOsInfo {
7373 where
7474 P : AsRef < Path > ,
7575 {
76+ info ! ( get_object( "tsffs" ) ?, "Collecting Windows OS information" ) ;
7677 let processor_nr = get_processor_number ( processor) ?;
7778 let mut processor_info_v2: ProcessorInfoV2Interface = get_interface ( processor) ?;
7879
7980 if self . kernel_info . is_none ( ) {
81+ info ! ( get_object( "tsffs" ) ?, "Collecting kernel information" ) ;
8082 // Make sure we're running 64-bit Windows
8183 ensure ! (
8284 processor_info_v2. get_logical_address_width( ) ? == 64 ,
@@ -100,6 +102,8 @@ impl WindowsOsInfo {
100102 let _ = WindowsKpcr :: new ( processor, maj, min, build) ?;
101103 let kernel_base = find_kernel_with_idt ( processor, build) ?;
102104
105+ info ! ( get_object( "tsffs" ) ?, "Found kernel base {kernel_base:#x}" ) ;
106+
103107 self . kernel_info = Some ( KernelInfo :: new (
104108 processor,
105109 "ntoskrnl.exe" ,
@@ -110,6 +114,8 @@ impl WindowsOsInfo {
110114 ) ?) ;
111115 }
112116
117+ info ! ( get_object( "tsffs" ) ?, "Collecting process list" ) ;
118+
113119 self . processes . insert (
114120 processor_nr,
115121 self . kernel_info
@@ -123,6 +129,8 @@ impl WindowsOsInfo {
123129 ) ?,
124130 ) ;
125131
132+ info ! ( get_object( "tsffs" ) ?, "Collecting module list" ) ;
133+
126134 self . modules . insert (
127135 processor_nr,
128136 self . kernel_info
@@ -179,41 +187,39 @@ impl WindowsOsInfo {
179187 }
180188}
181189
182- #[ ffi( expect, self_ty = "*mut std::ffi::c_void" ) ]
183- impl Tsffs {
184- #[ ffi( arg( rest) , arg( self ) ) ]
185- pub fn on_instruction_before_symcov (
186- & mut self ,
187- _obj : * mut ConfObject ,
188- cpu : * mut ConfObject ,
189- _handle : * mut simics:: sys:: instruction_handle_t ,
190- ) -> Result < ( ) > {
191- let cpu_nr = get_processor_number ( cpu) ?;
192-
193- Ok ( ( ) )
194- }
195- }
196-
197190impl Tsffs {
198191 pub fn on_control_register_write_windows_symcov (
199192 & mut self ,
200193 trigger_obj : * mut ConfObject ,
201194 register_nr : i64 ,
202- _value : i64 ,
195+ value : i64 ,
203196 ) -> Result < ( ) > {
204197 let mut int_register: IntRegisterInterface = get_interface ( trigger_obj) ?;
198+ let processor_nr = get_processor_number ( trigger_obj) ?;
205199
206- // Check if the register was CR3
207- if self . windows
200+ if self . processors . contains_key ( & processor_nr)
201+ && self . coverage_enabled
202+ && self . windows
208203 && self . symbolic_coverage
209204 && register_nr == int_register. get_number ( "cr3" . as_raw_cstr ( ) ?) ? as i64
205+ && self
206+ . cr3_cache
207+ . get ( & processor_nr)
208+ . is_some_and ( |v| * v != value)
210209 {
210+ info ! (
211+ get_object( "tsffs" ) ?,
212+ "Got write {value:#x} to CR3 for processor {processor_nr}, refreshing kernel & process mappings"
213+ ) ;
214+
211215 self . windows_os_info . collect (
212216 trigger_obj,
213217 & self . debuginfo_download_directory ,
214218 self . guess_pdb_function_size ,
215219 & self . debug_info ,
216220 ) ?;
221+
222+ self . cr3_cache . insert ( processor_nr, value) ;
217223 }
218224
219225 Ok ( ( ) )
0 commit comments