@@ -1649,14 +1649,19 @@ def setup(self):
1649
1649
# pylint: disable=attribute-defined-outside-init
1650
1650
self .gdb .load ()
1651
1651
1652
- misa = self .hart .misa
1652
+ # It may be affected by reset halt
1653
+ misa = self .gdb .p (f"$misa=0x{ self .hart .misa :x} " )
1653
1654
self .supported = set ()
1654
1655
if misa & (1 << 20 ):
1655
1656
self .supported .add (0 )
1656
1657
if misa & (1 << 18 ):
1657
1658
self .supported .add (1 )
1658
1659
if misa & (1 << 7 ):
1659
- self .supported .add (2 )
1660
+ self .supported_vmodes = self .supported
1661
+ for privilege in self .supported_vmodes :
1662
+ self .supported .add (f"{ (1 << 2 ) + privilege } " )
1663
+ else :
1664
+ self .supported_vmodes = None
1660
1665
self .supported .add (3 )
1661
1666
1662
1667
self .disable_pmp ()
@@ -1672,14 +1677,18 @@ def setup(self):
1672
1677
class PrivRw (PrivTest ):
1673
1678
"""Test reading/writing priv."""
1674
1679
def test (self ):
1675
- self .write_nop_program (4 )
1676
- for privilege in range (4 ):
1680
+ privilege_limit = max (self .supported ) + 1
1681
+ self .write_nop_program (privilege_limit )
1682
+ for privilege in range (privilege_limit ):
1677
1683
self .gdb .p (f"$priv={ privilege } " )
1678
1684
self .gdb .stepi ()
1679
1685
actual = self .gdb .p ("$priv" )
1680
1686
assertIn (actual , self .supported )
1681
1687
if privilege in self .supported :
1682
1688
assertEqual (actual , privilege )
1689
+ if self .supported_vmodes :
1690
+ # Restore to machine mode
1691
+ self .gdb .p ("$priv=3" )
1683
1692
1684
1693
class PrivChange (PrivTest ):
1685
1694
"""Test that the core's privilege level actually changes when the debugger
0 commit comments