@@ -3,12 +3,12 @@ mod gpm;
33mod hal;
44mod vmexit;
55
6- use rvm:: { GuestPhysAddr , HostVirtAddr , MemFlags , RvmPerCpu , RvmResult } ;
6+ use rvm:: { GuestPhysAddr , HostPhysAddr , HostVirtAddr , MemFlags , RvmPerCpu , RvmResult } ;
77
88use self :: gconfig:: * ;
99use self :: gpm:: { GuestMemoryRegion , GuestPhysMemorySet } ;
1010use self :: hal:: RvmHalImpl ;
11- use crate :: mm:: address:: virt_to_phys;
11+ use crate :: mm:: address:: { phys_to_virt , virt_to_phys} ;
1212
1313#[ repr( align( 4096 ) ) ]
1414struct AlignedMemory < const LEN : usize > ( [ u8 ; LEN ] ) ;
@@ -22,42 +22,51 @@ fn gpa_as_mut_ptr(guest_paddr: GuestPhysAddr) -> *mut u8 {
2222 host_vaddr as * mut u8
2323}
2424
25- fn setup_guest_page_table ( ) {
26- use x86_64:: structures:: paging:: { PageTable , PageTableFlags as PTF } ;
27- let pt1 = unsafe { & mut * ( gpa_as_mut_ptr ( GUEST_PT1 ) as * mut PageTable ) } ;
28- let pt2 = unsafe { & mut * ( gpa_as_mut_ptr ( GUEST_PT2 ) as * mut PageTable ) } ;
29- // identity mapping
30- pt1[ 0 ] . set_addr (
31- x86_64:: PhysAddr :: new ( GUEST_PT2 as _ ) ,
32- PTF :: PRESENT | PTF :: WRITABLE ,
33- ) ;
34- pt2[ 0 ] . set_addr (
35- x86_64:: PhysAddr :: new ( 0 ) ,
36- PTF :: PRESENT | PTF :: WRITABLE | PTF :: HUGE_PAGE ,
37- ) ;
25+ fn load_guest_image ( hpa : HostPhysAddr , load_gpa : GuestPhysAddr , size : usize ) {
26+ let image_ptr = phys_to_virt ( hpa) as * const u8 ;
27+ let image = unsafe { core:: slice:: from_raw_parts ( image_ptr, size) } ;
28+ unsafe {
29+ core:: slice:: from_raw_parts_mut ( gpa_as_mut_ptr ( load_gpa) , size) . copy_from_slice ( image)
30+ }
3831}
3932
4033fn setup_gpm ( ) -> RvmResult < GuestPhysMemorySet > {
41- setup_guest_page_table ( ) ;
42-
43- // copy guest code
44- unsafe {
45- core:: ptr:: copy_nonoverlapping (
46- test_guest as usize as * const u8 ,
47- gpa_as_mut_ptr ( GUEST_ENTRY ) ,
48- 0x100 ,
49- ) ;
50- }
34+ // copy BIOS and guest images
35+ load_guest_image ( BIOS_PADDR , BIOS_ENTRY , BIOS_SIZE ) ;
36+ load_guest_image ( GUEST_IMAGE_PADDR , GUEST_ENTRY , GUEST_IMAGE_SIZE ) ;
5137
5238 // create nested page table and add mapping
5339 let mut gpm = GuestPhysMemorySet :: new ( ) ?;
54- let guest_memory_regions = [ GuestMemoryRegion {
55- // RAM
56- gpa : GUEST_PHYS_MEMORY_BASE ,
57- hpa : virt_to_phys ( gpa_as_mut_ptr ( GUEST_PHYS_MEMORY_BASE ) as HostVirtAddr ) ,
58- size : GUEST_PHYS_MEMORY_SIZE ,
59- flags : MemFlags :: READ | MemFlags :: WRITE | MemFlags :: EXECUTE ,
60- } ] ;
40+ let guest_memory_regions = [
41+ GuestMemoryRegion {
42+ // RAM
43+ gpa : GUEST_PHYS_MEMORY_BASE ,
44+ hpa : virt_to_phys ( gpa_as_mut_ptr ( GUEST_PHYS_MEMORY_BASE ) as HostVirtAddr ) ,
45+ size : GUEST_PHYS_MEMORY_SIZE ,
46+ flags : MemFlags :: READ | MemFlags :: WRITE | MemFlags :: EXECUTE ,
47+ } ,
48+ GuestMemoryRegion {
49+ // IO APIC
50+ gpa : 0xfec0_0000 ,
51+ hpa : 0xfec0_0000 ,
52+ size : 0x1000 ,
53+ flags : MemFlags :: READ | MemFlags :: WRITE | MemFlags :: DEVICE ,
54+ } ,
55+ GuestMemoryRegion {
56+ // HPET
57+ gpa : 0xfed0_0000 ,
58+ hpa : 0xfed0_0000 ,
59+ size : 0x1000 ,
60+ flags : MemFlags :: READ | MemFlags :: WRITE | MemFlags :: DEVICE ,
61+ } ,
62+ GuestMemoryRegion {
63+ // Local APIC
64+ gpa : 0xfee0_0000 ,
65+ hpa : 0xfee0_0000 ,
66+ size : 0x1000 ,
67+ flags : MemFlags :: READ | MemFlags :: WRITE | MemFlags :: DEVICE ,
68+ } ,
69+ ] ;
6170 for r in guest_memory_regions. into_iter ( ) {
6271 gpm. map_region ( r. into ( ) ) ?;
6372 }
@@ -75,27 +84,9 @@ pub fn run() -> ! {
7584 info ! ( "{:#x?}" , gpm) ;
7685
7786 let mut vcpu = percpu
78- . create_vcpu ( GUEST_ENTRY , gpm. nest_page_table_root ( ) )
87+ . create_vcpu ( BIOS_ENTRY , gpm. nest_page_table_root ( ) )
7988 . unwrap ( ) ;
80- vcpu. set_page_table_root ( GUEST_PT1 ) ;
81- vcpu. set_stack_pointer ( GUEST_STACK_TOP ) ;
82- info ! ( "{:#x?}" , vcpu) ;
8389
8490 println ! ( "Running guest..." ) ;
8591 vcpu. run ( ) ;
8692}
87-
88- unsafe extern "C" fn test_guest ( ) -> ! {
89- for i in 0 ..100 {
90- core:: arch:: asm!(
91- "vmcall" ,
92- inout( "rax" ) i => _,
93- in( "rdi" ) 2 ,
94- in( "rsi" ) 3 ,
95- in( "rdx" ) 3 ,
96- in( "rcx" ) 3 ,
97- ) ;
98- }
99- core:: arch:: asm!( "mov qword ptr [$0xffff233], $2333" ) ; // panic
100- loop { }
101- }
0 commit comments