4
4
5
5
# pylint: disable=too-many-lines
6
6
7
+ import csv
7
8
import io
8
9
import os
9
10
import platform
14
15
from difflib import unified_diff
15
16
from pathlib import Path
16
17
17
- import pandas as pd
18
18
import pytest
19
19
20
20
import framework .utils_cpuid as cpuid_utils
30
30
DATA_FILES = Path ("./data/msr" )
31
31
32
32
33
+ def read_msr_csv (fd ):
34
+ """Read a CSV of MSRs"""
35
+ csvin = csv .DictReader (fd )
36
+ return list (csvin )
37
+
38
+
33
39
def clean_and_mkdir (dir_path ):
34
40
"""
35
41
Create a clean directory
@@ -313,7 +319,7 @@ def test_cpu_rdmsr(
313
319
assert stderr == ""
314
320
315
321
# Load results read from the microvm
316
- microvm_df = pd . read_csv (io .StringIO (stdout ))
322
+ guest_recs = read_msr_csv (io .StringIO (stdout ))
317
323
318
324
# Load baseline
319
325
host_cpu = global_props .cpu_codename
@@ -329,11 +335,9 @@ def test_cpu_rdmsr(
329
335
330
336
# Load baseline
331
337
baseline_file_path = DATA_FILES / baseline_file_name
332
- # We can use the following line when regathering baselines.
333
- # microvm_df.to_csv(baseline_file_path, index=False, encoding="utf-8")
334
- baseline_df = pd .read_csv (baseline_file_path )
338
+ baseline_recs = read_msr_csv (baseline_file_path .open ())
335
339
336
- check_msrs_are_equal (baseline_df , microvm_df )
340
+ check_msrs_are_equal (baseline_recs , guest_recs )
337
341
338
342
339
343
# These names need to be consistent across the two parts of the snapshot-restore test
@@ -441,29 +445,31 @@ def test_cpu_wrmsr_snapshot(
441
445
snapshot .save_to (snapshot_artifacts_dir )
442
446
443
447
444
- def check_msrs_are_equal (before_df , after_df ):
448
+ def check_msrs_are_equal (before_recs , after_recs ):
445
449
"""
446
450
Checks that reported MSRs and their values in the files are equal.
447
451
"""
448
452
453
+ before = {x ["MSR_ADDR" ]: x ["VALUE" ] for x in before_recs }
454
+ after = {x ["MSR_ADDR" ]: x ["VALUE" ] for x in after_recs }
449
455
# We first want to see if the same set of MSRs are exposed in the microvm.
450
- # Drop the VALUE columns and compare the 2 dataframes.
451
- join = pd . merge ( before_df , after_df , on = "MSR_ADDR" , how = "outer" , indicator = True )
452
- removed = join [ join [ "_merge" ] == "left_only" ]
453
- added = join [ join [ "_merge" ] == "right_only" ]
454
-
455
- assert removed . empty , f"MSRs removed: \n { removed [[ 'MSR_ADDR' , 'VALUE_x' ]] } "
456
- assert added . empty , f"MSRs added: \n { added [[ 'MSR_ADDR' , 'VALUE_y' ]] } "
457
-
458
- # Remove MSR that can change at runtime.
459
- before_df = before_df [ ~ before_df [ "MSR_ADDR" ]. isin ( MSR_EXCEPTION_LIST )]
460
- after_df = after_df [ ~ after_df [ "MSR_ADDR" ]. isin ( MSR_EXCEPTION_LIST )]
461
-
462
- # Compare values
463
- val_diff = pd . concat (
464
- [ before_df , after_df ], keys = [ " before" , " after" ]
465
- ). drop_duplicates ( keep = False )
466
- assert val_diff . empty , f" \n { val_diff . to_string () } "
456
+ all_msrs = set ( before . keys ()) | set ( after . keys ())
457
+
458
+ changes = 0
459
+ for msr in all_msrs :
460
+ if msr in before and msr not in after :
461
+ print ( f"MSR removed { msr } before= { before [ msr ] } " )
462
+ changes += 1
463
+ elif msr not in before and msr in after :
464
+ print ( f"MSR added { msr } after= { after [ msr ] } " )
465
+ changes += 1
466
+ elif msr in MSR_EXCEPTION_LIST :
467
+ continue
468
+ elif before [ msr ] != after [ msr ]:
469
+ # Compare values
470
+ print ( f"MSR changed { msr } before= { before [ msr ] } after= { after [ msr ] } " )
471
+ changes += 1
472
+ assert changes == 0
467
473
468
474
469
475
@pytest .mark .skipif (
@@ -504,11 +510,12 @@ def test_cpu_wrmsr_restore(microvm_factory, msr_cpu_template, guest_kernel):
504
510
# Dump MSR state to a file for further comparison
505
511
msrs_after_fname = snapshot_artifacts_dir / shared_names ["msrs_after_fname" ]
506
512
dump_msr_state_to_file (msrs_after_fname , vm .ssh , shared_names )
513
+ msrs_before_fname = snapshot_artifacts_dir / shared_names ["msrs_before_fname" ]
507
514
508
515
# Compare the two lists of MSR values and assert they are equal
509
- before_df = pd . read_csv ( snapshot_artifacts_dir / shared_names [ " msrs_before_fname" ] )
510
- after_df = pd . read_csv ( snapshot_artifacts_dir / shared_names [ " msrs_after_fname" ] )
511
- check_msrs_are_equal (before_df , after_df )
516
+ before_recs = read_msr_csv ( msrs_before_fname . open () )
517
+ after_recs = read_msr_csv ( msrs_after_fname . open () )
518
+ check_msrs_are_equal (before_recs , after_recs )
512
519
513
520
514
521
def dump_cpuid_to_file (dump_fname , ssh_conn ):
0 commit comments