11use super :: BlockDevice ;
2- use crate :: mm:: {
3- frame_alloc, frame_dealloc, kernel_token, FrameTracker , PageTable , PhysAddr , PhysPageNum ,
4- StepByOne , VirtAddr ,
5- } ;
62use crate :: sync:: { Condvar , UPIntrFreeCell } ;
73use crate :: task:: schedule;
84use crate :: DEV_NON_BLOCKING_ACCESS ;
95use alloc:: collections:: BTreeMap ;
10- use alloc:: vec:: Vec ;
11- use lazy_static:: * ;
126use virtio_drivers:: { BlkResp , RespStatus , VirtIOBlk , VirtIOHeader } ;
7+ use crate :: drivers:: bus:: virtio:: VirtioHal ;
138
149#[ allow( unused) ]
1510const VIRTIO0 : usize = 0x10008000 ;
1611
1712pub struct VirtIOBlock {
18- virtio_blk : UPIntrFreeCell < VirtIOBlk < ' static > > ,
13+ virtio_blk : UPIntrFreeCell < VirtIOBlk < ' static , VirtioHal > > ,
1914 condvars : BTreeMap < u16 , Condvar > ,
2015}
2116
22- lazy_static ! {
23- static ref QUEUE_FRAMES : UPIntrFreeCell <Vec <FrameTracker >> =
24- unsafe { UPIntrFreeCell :: new( Vec :: new( ) ) } ;
25- }
26-
2717impl BlockDevice for VirtIOBlock {
2818 fn read_block ( & self , block_id : usize , buf : & mut [ u8 ] ) {
2919 let nb = * DEV_NON_BLOCKING_ACCESS . exclusive_access ( ) ;
@@ -79,7 +69,7 @@ impl BlockDevice for VirtIOBlock {
7969impl VirtIOBlock {
8070 pub fn new ( ) -> Self {
8171 let virtio_blk = unsafe {
82- UPIntrFreeCell :: new ( VirtIOBlk :: new ( & mut * ( VIRTIO0 as * mut VirtIOHeader ) ) . unwrap ( ) )
72+ UPIntrFreeCell :: new ( VirtIOBlk :: < VirtioHal > :: new ( & mut * ( VIRTIO0 as * mut VirtIOHeader ) ) . unwrap ( ) )
8373 } ;
8474 let mut condvars = BTreeMap :: new ( ) ;
8575 let channels = virtio_blk. exclusive_access ( ) . virt_queue_size ( ) ;
@@ -94,38 +84,3 @@ impl VirtIOBlock {
9484 }
9585}
9686
97- #[ no_mangle]
98- pub extern "C" fn virtio_dma_alloc ( pages : usize ) -> PhysAddr {
99- let mut ppn_base = PhysPageNum ( 0 ) ;
100- for i in 0 ..pages {
101- let frame = frame_alloc ( ) . unwrap ( ) ;
102- if i == 0 {
103- ppn_base = frame. ppn ;
104- }
105- assert_eq ! ( frame. ppn. 0 , ppn_base. 0 + i) ;
106- QUEUE_FRAMES . exclusive_access ( ) . push ( frame) ;
107- }
108- ppn_base. into ( )
109- }
110-
111- #[ no_mangle]
112- pub extern "C" fn virtio_dma_dealloc ( pa : PhysAddr , pages : usize ) -> i32 {
113- let mut ppn_base: PhysPageNum = pa. into ( ) ;
114- for _ in 0 ..pages {
115- frame_dealloc ( ppn_base) ;
116- ppn_base. step ( ) ;
117- }
118- 0
119- }
120-
121- #[ no_mangle]
122- pub extern "C" fn virtio_phys_to_virt ( paddr : PhysAddr ) -> VirtAddr {
123- VirtAddr ( paddr. 0 )
124- }
125-
126- #[ no_mangle]
127- pub extern "C" fn virtio_virt_to_phys ( vaddr : VirtAddr ) -> PhysAddr {
128- PageTable :: from_token ( kernel_token ( ) )
129- . translate_va ( vaddr)
130- . unwrap ( )
131- }
0 commit comments