@@ -40,39 +40,46 @@ use spin::Mutex;
4040
4141impl Zone {
4242 pub fn pt_init ( & mut self , mem_regions : & [ HvConfigMemoryRegion ] ) -> HvResult {
43+ let mut inner = self . write ( ) ;
4344 // use the new zone config type of init
4445 for region in mem_regions {
4546 trace ! ( "loongarch64: pt_init: process region: {:#x?}" , region) ;
4647 let mem_type = region. mem_type ;
4748 match mem_type {
4849 MEM_TYPE_RAM => {
49- self . gpm . insert ( MemoryRegion :: new_with_offset_mapper (
50- region. virtual_start as GuestPhysAddr ,
51- region. physical_start as HostPhysAddr ,
52- region. size as _ ,
53- MemFlags :: READ | MemFlags :: WRITE | MemFlags :: EXECUTE ,
54- ) ) ?;
50+ inner
51+ . gpm_mut ( )
52+ . insert ( MemoryRegion :: new_with_offset_mapper (
53+ region. virtual_start as GuestPhysAddr ,
54+ region. physical_start as HostPhysAddr ,
55+ region. size as _ ,
56+ MemFlags :: READ | MemFlags :: WRITE | MemFlags :: EXECUTE ,
57+ ) ) ?;
5558 }
5659 MEM_TYPE_IO => {
57- self . gpm . insert ( MemoryRegion :: new_with_offset_mapper (
58- region. virtual_start as GuestPhysAddr ,
59- region. physical_start as HostPhysAddr ,
60- region. size as _ ,
61- MemFlags :: READ | MemFlags :: WRITE | MemFlags :: IO ,
62- ) ) ?;
60+ inner
61+ . gpm_mut ( )
62+ . insert ( MemoryRegion :: new_with_offset_mapper (
63+ region. virtual_start as GuestPhysAddr ,
64+ region. physical_start as HostPhysAddr ,
65+ region. size as _ ,
66+ MemFlags :: READ | MemFlags :: WRITE | MemFlags :: IO ,
67+ ) ) ?;
6368 }
6469 MEM_TYPE_VIRTIO => {
6570 info ! (
6671 "loongarch64: pt_init: register virtio mmio region: {:#x?}" ,
6772 region
6873 ) ;
69- self . gpm . insert ( MemoryRegion :: new_with_offset_mapper (
70- region. virtual_start as GuestPhysAddr ,
71- region. physical_start as HostPhysAddr ,
72- PAGE_SIZE , // since we only need 0x200 size for virtio mmio, but the minimal size is PAGE_SIZE
73- MemFlags :: USER , // we use the USER as a hint flag for invalidating this stage-2 PTE
74- ) ) ?;
75- self . mmio_region_register (
74+ inner
75+ . gpm_mut ( )
76+ . insert ( MemoryRegion :: new_with_offset_mapper (
77+ region. virtual_start as GuestPhysAddr ,
78+ region. physical_start as HostPhysAddr ,
79+ PAGE_SIZE , // since we only need 0x200 size for virtio mmio, but the minimal size is PAGE_SIZE
80+ MemFlags :: USER , // we use the USER as a hint flag for invalidating this stage-2 PTE
81+ ) ) ?;
82+ inner. mmio_region_register (
7683 region. physical_start as _ ,
7784 region. size as _ ,
7885 mmio_virtio_handler,
@@ -92,14 +99,14 @@ impl Zone {
9299 // 3. chip configuration
93100
94101 info ! ( "loongarch64: pt_init: add mmio handler for 0x1fe0_xxxx mmio region" ) ;
95- self . mmio_region_register ( 0x1fe0_0000 , 0x3000 , loongarch_generic_mmio_handler, 0x1234 ) ;
102+ inner . mmio_region_register ( 0x1fe0_0000 , 0x3000 , loongarch_generic_mmio_handler, 0x1234 ) ;
96103
97- info ! ( "zone stage-2 memory set: {:#x?}" , self . gpm) ;
104+ info ! ( "zone stage-2 memory set: {:#x?}" , inner . gpm( ) ) ;
98105 unsafe {
99106 // test the page table by querying the first page
100107 if mem_regions. len ( ) > 0 {
101- let r = self
102- . gpm
108+ let r = inner
109+ . gpm ( )
103110 . page_table_query ( mem_regions[ 0 ] . virtual_start as GuestPhysAddr ) ;
104111 debug ! ( "query 0x{:x}: {:#x?}" , mem_regions[ 0 ] . virtual_start, r) ;
105112 // check whether the first page is mapped
@@ -674,13 +681,15 @@ pub fn loongarch_generic_mmio_handler(mmio: &mut MMIOAccess, arg: usize) -> HvRe
674681
675682impl Zone {
676683 pub fn page_table_emergency ( & mut self , vaddr : usize , size : usize ) -> HvResult {
677- self . gpm . insert ( MemoryRegion :: new_with_offset_mapper (
678- vaddr as GuestPhysAddr ,
679- vaddr as HostPhysAddr ,
680- size as _ ,
681- MemFlags :: READ | MemFlags :: WRITE | MemFlags :: IO ,
682- ) ) ?;
683- self . gpm . delete ( vaddr as GuestPhysAddr , size)
684+ self . write ( )
685+ . gpm_mut ( )
686+ . insert ( MemoryRegion :: new_with_offset_mapper (
687+ vaddr as GuestPhysAddr ,
688+ vaddr as HostPhysAddr ,
689+ size as _ ,
690+ MemFlags :: READ | MemFlags :: WRITE | MemFlags :: IO ,
691+ ) ) ?;
692+ self . write ( ) . gpm_mut ( ) . delete ( vaddr as GuestPhysAddr , size)
684693 }
685694
686695 pub fn arch_zone_pre_configuration ( & mut self , config : & HvZoneConfig ) -> HvResult {
0 commit comments