@@ -211,43 +211,45 @@ impl GuestSystemRegisters {
211211 /// This method uses inline assembly to read the values of various system registers
212212 /// and stores them in the corresponding fields of the `GuestSystemRegisters` structure.
213213 pub unsafe fn store ( & mut self ) {
214- asm ! ( "mrs {0}, CNTVOFF_EL2" , out( reg) self . cntvoff_el2) ;
215- asm ! ( "mrs {0}, CNTV_CVAL_EL0" , out( reg) self . cntv_cval_el0) ;
216- asm ! ( "mrs {0:x}, CNTKCTL_EL1" , out( reg) self . cntkctl_el1) ;
217- asm ! ( "mrs {0:x}, CNTP_CTL_EL0" , out( reg) self . cntp_ctl_el0) ;
218- asm ! ( "mrs {0:x}, CNTV_CTL_EL0" , out( reg) self . cntv_ctl_el0) ;
219- asm ! ( "mrs {0:x}, CNTP_TVAL_EL0" , out( reg) self . cntp_tval_el0) ;
220- asm ! ( "mrs {0:x}, CNTV_TVAL_EL0" , out( reg) self . cntv_tval_el0) ;
221- asm ! ( "mrs {0}, CNTVCT_EL0" , out( reg) self . cntvct_el0) ;
222- // MRS!("self.vpidr_el2, VPIDR_EL2, "x");
223- asm ! ( "mrs {0}, VMPIDR_EL2" , out( reg) self . vmpidr_el2) ;
214+ unsafe {
215+ asm ! ( "mrs {0}, CNTVOFF_EL2" , out( reg) self . cntvoff_el2) ;
216+ asm ! ( "mrs {0}, CNTV_CVAL_EL0" , out( reg) self . cntv_cval_el0) ;
217+ asm ! ( "mrs {0:x}, CNTKCTL_EL1" , out( reg) self . cntkctl_el1) ;
218+ asm ! ( "mrs {0:x}, CNTP_CTL_EL0" , out( reg) self . cntp_ctl_el0) ;
219+ asm ! ( "mrs {0:x}, CNTV_CTL_EL0" , out( reg) self . cntv_ctl_el0) ;
220+ asm ! ( "mrs {0:x}, CNTP_TVAL_EL0" , out( reg) self . cntp_tval_el0) ;
221+ asm ! ( "mrs {0:x}, CNTV_TVAL_EL0" , out( reg) self . cntv_tval_el0) ;
222+ asm ! ( "mrs {0}, CNTVCT_EL0" , out( reg) self . cntvct_el0) ;
223+ // MRS!("self.vpidr_el2, VPIDR_EL2, "x");
224+ asm ! ( "mrs {0}, VMPIDR_EL2" , out( reg) self . vmpidr_el2) ;
224225
225- asm ! ( "mrs {0}, SP_EL0" , out( reg) self . sp_el0) ;
226- asm ! ( "mrs {0}, SP_EL1" , out( reg) self . sp_el1) ;
227- asm ! ( "mrs {0}, ELR_EL1" , out( reg) self . elr_el1) ;
228- asm ! ( "mrs {0:x}, SPSR_EL1" , out( reg) self . spsr_el1) ;
229- asm ! ( "mrs {0:x}, SCTLR_EL1" , out( reg) self . sctlr_el1) ;
230- asm ! ( "mrs {0:x}, CPACR_EL1" , out( reg) self . cpacr_el1) ;
231- asm ! ( "mrs {0}, TTBR0_EL1" , out( reg) self . ttbr0_el1) ;
232- asm ! ( "mrs {0}, TTBR1_EL1" , out( reg) self . ttbr1_el1) ;
233- asm ! ( "mrs {0}, TCR_EL1" , out( reg) self . tcr_el1) ;
234- asm ! ( "mrs {0:x}, ESR_EL1" , out( reg) self . esr_el1) ;
235- asm ! ( "mrs {0}, FAR_EL1" , out( reg) self . far_el1) ;
236- asm ! ( "mrs {0}, PAR_EL1" , out( reg) self . par_el1) ;
237- asm ! ( "mrs {0}, MAIR_EL1" , out( reg) self . mair_el1) ;
238- asm ! ( "mrs {0}, AMAIR_EL1" , out( reg) self . amair_el1) ;
239- asm ! ( "mrs {0}, VBAR_EL1" , out( reg) self . vbar_el1) ;
240- asm ! ( "mrs {0:x}, CONTEXTIDR_EL1" , out( reg) self . contextidr_el1) ;
241- asm ! ( "mrs {0}, TPIDR_EL0" , out( reg) self . tpidr_el0) ;
242- asm ! ( "mrs {0}, TPIDR_EL1" , out( reg) self . tpidr_el1) ;
243- asm ! ( "mrs {0}, TPIDRRO_EL0" , out( reg) self . tpidrro_el0) ;
226+ asm ! ( "mrs {0}, SP_EL0" , out( reg) self . sp_el0) ;
227+ asm ! ( "mrs {0}, SP_EL1" , out( reg) self . sp_el1) ;
228+ asm ! ( "mrs {0}, ELR_EL1" , out( reg) self . elr_el1) ;
229+ asm ! ( "mrs {0:x}, SPSR_EL1" , out( reg) self . spsr_el1) ;
230+ asm ! ( "mrs {0:x}, SCTLR_EL1" , out( reg) self . sctlr_el1) ;
231+ asm ! ( "mrs {0:x}, CPACR_EL1" , out( reg) self . cpacr_el1) ;
232+ asm ! ( "mrs {0}, TTBR0_EL1" , out( reg) self . ttbr0_el1) ;
233+ asm ! ( "mrs {0}, TTBR1_EL1" , out( reg) self . ttbr1_el1) ;
234+ asm ! ( "mrs {0}, TCR_EL1" , out( reg) self . tcr_el1) ;
235+ asm ! ( "mrs {0:x}, ESR_EL1" , out( reg) self . esr_el1) ;
236+ asm ! ( "mrs {0}, FAR_EL1" , out( reg) self . far_el1) ;
237+ asm ! ( "mrs {0}, PAR_EL1" , out( reg) self . par_el1) ;
238+ asm ! ( "mrs {0}, MAIR_EL1" , out( reg) self . mair_el1) ;
239+ asm ! ( "mrs {0}, AMAIR_EL1" , out( reg) self . amair_el1) ;
240+ asm ! ( "mrs {0}, VBAR_EL1" , out( reg) self . vbar_el1) ;
241+ asm ! ( "mrs {0:x}, CONTEXTIDR_EL1" , out( reg) self . contextidr_el1) ;
242+ asm ! ( "mrs {0}, TPIDR_EL0" , out( reg) self . tpidr_el0) ;
243+ asm ! ( "mrs {0}, TPIDR_EL1" , out( reg) self . tpidr_el1) ;
244+ asm ! ( "mrs {0}, TPIDRRO_EL0" , out( reg) self . tpidrro_el0) ;
244245
245- asm ! ( "mrs {0}, PMCR_EL0" , out( reg) self . pmcr_el0) ;
246- asm ! ( "mrs {0}, VTCR_EL2" , out( reg) self . vtcr_el2) ;
247- asm ! ( "mrs {0}, VTTBR_EL2" , out( reg) self . vttbr_el2) ;
248- asm ! ( "mrs {0}, HCR_EL2" , out( reg) self . hcr_el2) ;
249- asm ! ( "mrs {0}, ACTLR_EL1" , out( reg) self . actlr_el1) ;
250- // println!("save sctlr {:x}", self.sctlr_el1);
246+ asm ! ( "mrs {0}, PMCR_EL0" , out( reg) self . pmcr_el0) ;
247+ asm ! ( "mrs {0}, VTCR_EL2" , out( reg) self . vtcr_el2) ;
248+ asm ! ( "mrs {0}, VTTBR_EL2" , out( reg) self . vttbr_el2) ;
249+ asm ! ( "mrs {0}, HCR_EL2" , out( reg) self . hcr_el2) ;
250+ asm ! ( "mrs {0}, ACTLR_EL1" , out( reg) self . actlr_el1) ;
251+ // println!("save sctlr {:x}", self.sctlr_el1);
252+ }
251253 }
252254
253255 /// Restores the values of all relevant system registers from the `GuestSystemRegisters` structure.
@@ -259,38 +261,40 @@ impl GuestSystemRegisters {
259261 /// Each system register is restored with its corresponding value from the `GuestSystemRegisters`, ensuring
260262 /// that the virtual machine or thread resumes execution with the correct context.
261263 pub unsafe fn restore ( & self ) {
262- asm ! ( "msr CNTV_CVAL_EL0, {0}" , in( reg) self . cntv_cval_el0) ;
263- asm ! ( "msr CNTKCTL_EL1, {0:x}" , in ( reg) self . cntkctl_el1) ;
264- asm ! ( "msr CNTV_CTL_EL0, {0:x}" , in ( reg) self . cntv_ctl_el0) ;
265- // The restoration of SP_EL0 is done in `exception_return_el2`,
266- // which move the value from `self.ctx.sp_el0` to `SP_EL0`.
267- // asm!("msr SP_EL0, {0}", in(reg) self.sp_el0);
268- asm ! ( "msr SP_EL1, {0}" , in( reg) self . sp_el1) ;
269- asm ! ( "msr ELR_EL1, {0}" , in( reg) self . elr_el1) ;
270- asm ! ( "msr SPSR_EL1, {0:x}" , in( reg) self . spsr_el1) ;
271- asm ! ( "msr SCTLR_EL1, {0:x}" , in( reg) self . sctlr_el1) ;
272- asm ! ( "msr CPACR_EL1, {0:x}" , in( reg) self . cpacr_el1) ;
273- asm ! ( "msr TTBR0_EL1, {0}" , in( reg) self . ttbr0_el1) ;
274- asm ! ( "msr TTBR1_EL1, {0}" , in( reg) self . ttbr1_el1) ;
275- asm ! ( "msr TCR_EL1, {0}" , in( reg) self . tcr_el1) ;
276- asm ! ( "msr ESR_EL1, {0:x}" , in( reg) self . esr_el1) ;
277- asm ! ( "msr FAR_EL1, {0}" , in( reg) self . far_el1) ;
278- asm ! ( "msr PAR_EL1, {0}" , in( reg) self . par_el1) ;
279- asm ! ( "msr MAIR_EL1, {0}" , in( reg) self . mair_el1) ;
280- asm ! ( "msr AMAIR_EL1, {0}" , in( reg) self . amair_el1) ;
281- asm ! ( "msr VBAR_EL1, {0}" , in( reg) self . vbar_el1) ;
282- asm ! ( "msr CONTEXTIDR_EL1, {0:x}" , in( reg) self . contextidr_el1) ;
283- asm ! ( "msr TPIDR_EL0, {0}" , in( reg) self . tpidr_el0) ;
284- asm ! ( "msr TPIDR_EL1, {0}" , in( reg) self . tpidr_el1) ;
285- asm ! ( "msr TPIDRRO_EL0, {0}" , in( reg) self . tpidrro_el0) ;
264+ unsafe {
265+ asm ! ( "msr CNTV_CVAL_EL0, {0}" , in( reg) self . cntv_cval_el0) ;
266+ asm ! ( "msr CNTKCTL_EL1, {0:x}" , in ( reg) self . cntkctl_el1) ;
267+ asm ! ( "msr CNTV_CTL_EL0, {0:x}" , in ( reg) self . cntv_ctl_el0) ;
268+ // The restoration of SP_EL0 is done in `exception_return_el2`,
269+ // which move the value from `self.ctx.sp_el0` to `SP_EL0`.
270+ // asm!("msr SP_EL0, {0}", in(reg) self.sp_el0);
271+ asm ! ( "msr SP_EL1, {0}" , in( reg) self . sp_el1) ;
272+ asm ! ( "msr ELR_EL1, {0}" , in( reg) self . elr_el1) ;
273+ asm ! ( "msr SPSR_EL1, {0:x}" , in( reg) self . spsr_el1) ;
274+ asm ! ( "msr SCTLR_EL1, {0:x}" , in( reg) self . sctlr_el1) ;
275+ asm ! ( "msr CPACR_EL1, {0:x}" , in( reg) self . cpacr_el1) ;
276+ asm ! ( "msr TTBR0_EL1, {0}" , in( reg) self . ttbr0_el1) ;
277+ asm ! ( "msr TTBR1_EL1, {0}" , in( reg) self . ttbr1_el1) ;
278+ asm ! ( "msr TCR_EL1, {0}" , in( reg) self . tcr_el1) ;
279+ asm ! ( "msr ESR_EL1, {0:x}" , in( reg) self . esr_el1) ;
280+ asm ! ( "msr FAR_EL1, {0}" , in( reg) self . far_el1) ;
281+ asm ! ( "msr PAR_EL1, {0}" , in( reg) self . par_el1) ;
282+ asm ! ( "msr MAIR_EL1, {0}" , in( reg) self . mair_el1) ;
283+ asm ! ( "msr AMAIR_EL1, {0}" , in( reg) self . amair_el1) ;
284+ asm ! ( "msr VBAR_EL1, {0}" , in( reg) self . vbar_el1) ;
285+ asm ! ( "msr CONTEXTIDR_EL1, {0:x}" , in( reg) self . contextidr_el1) ;
286+ asm ! ( "msr TPIDR_EL0, {0}" , in( reg) self . tpidr_el0) ;
287+ asm ! ( "msr TPIDR_EL1, {0}" , in( reg) self . tpidr_el1) ;
288+ asm ! ( "msr TPIDRRO_EL0, {0}" , in( reg) self . tpidrro_el0) ;
286289
287- asm ! ( "msr PMCR_EL0, {0}" , in( reg) self . pmcr_el0) ;
288- asm ! ( "msr ACTLR_EL1, {0}" , in( reg) self . actlr_el1) ;
290+ asm ! ( "msr PMCR_EL0, {0}" , in( reg) self . pmcr_el0) ;
291+ asm ! ( "msr ACTLR_EL1, {0}" , in( reg) self . actlr_el1) ;
289292
290- asm ! ( "msr VTCR_EL2, {0}" , in( reg) self . vtcr_el2) ;
291- asm ! ( "msr VTTBR_EL2, {0}" , in( reg) self . vttbr_el2) ;
292- asm ! ( "msr HCR_EL2, {0}" , in( reg) self . hcr_el2) ;
293- asm ! ( "msr VMPIDR_EL2, {0}" , in( reg) self . vmpidr_el2) ;
294- asm ! ( "msr CNTVOFF_EL2, {0}" , in( reg) self . cntvoff_el2) ;
293+ asm ! ( "msr VTCR_EL2, {0}" , in( reg) self . vtcr_el2) ;
294+ asm ! ( "msr VTTBR_EL2, {0}" , in( reg) self . vttbr_el2) ;
295+ asm ! ( "msr HCR_EL2, {0}" , in( reg) self . hcr_el2) ;
296+ asm ! ( "msr VMPIDR_EL2, {0}" , in( reg) self . vmpidr_el2) ;
297+ asm ! ( "msr CNTVOFF_EL2, {0}" , in( reg) self . cntvoff_el2) ;
298+ }
295299 }
296300}
0 commit comments