@@ -1649,15 +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 ()
1655
+ self .supported_vmodes = set ()
1654
1656
if misa & (1 << 20 ):
1655
1657
self .supported .add (0 )
1656
1658
if misa & (1 << 18 ):
1657
1659
self .supported .add (1 )
1658
1660
if misa & (1 << 7 ):
1659
- self .supported . add ( 2 )
1661
+ self .supported_vmodes = self . supported
1660
1662
self .supported .add (3 )
1663
+ for privilege in self .supported_vmodes :
1664
+ self .supported .add (f"{ (1 << 2 ) + privilege } " )
1661
1665
1662
1666
self .disable_pmp ()
1663
1667
@@ -1672,14 +1676,18 @@ def setup(self):
1672
1676
class PrivRw (PrivTest ):
1673
1677
"""Test reading/writing priv."""
1674
1678
def test (self ):
1675
- self .write_nop_program (4 )
1676
- for privilege in range (4 ):
1679
+ privilege_limit = max (self .supported ) + 1
1680
+ self .write_nop_program (privilege_limit )
1681
+ for privilege in range (privilege_limit ):
1677
1682
self .gdb .p (f"$priv={ privilege } " )
1678
1683
self .gdb .stepi ()
1679
1684
actual = self .gdb .p ("$priv" )
1680
1685
assertIn (actual , self .supported )
1681
1686
if privilege in self .supported :
1682
1687
assertEqual (actual , privilege )
1688
+ if len (self .supported_vmodes ):
1689
+ # Restore to machine mode
1690
+ self .gdb .p ("$priv=3" )
1683
1691
1684
1692
class PrivChange (PrivTest ):
1685
1693
"""Test that the core's privilege level actually changes when the debugger
0 commit comments