@@ -11,6 +11,7 @@ use core::ptr;
11
11
use core:: sync:: atomic:: { fence, Ordering } ;
12
12
13
13
use align_address:: Align ;
14
+ use zerocopy:: little_endian;
14
15
15
16
use super :: super :: features:: Features ;
16
17
#[ cfg( not( feature = "pci" ) ) ]
@@ -281,7 +282,7 @@ impl DescriptorRing {
281
282
// The driver performs a suitable memory barrier to ensure the device sees the updated descriptor table and available ring before the next step.
282
283
// See Virtio specfification v1.1. - 2.7.21
283
284
fence ( Ordering :: SeqCst ) ;
284
- self . ring [ first_ctrl_settings. 0 ] . flags |= first_ctrl_settings. 2 . as_flags_avail ( ) ;
285
+ self . ring [ first_ctrl_settings. 0 ] . flags |= first_ctrl_settings. 2 . as_flags_avail ( ) . into ( ) ;
285
286
286
287
// Converting a boolean as u8 is fine
287
288
( first_ctrl_settings. 0 , first_ctrl_settings. 2 . 0 as u8 )
@@ -448,7 +449,7 @@ impl<'a> ReadCtrl<'a> {
448
449
/// updating the queue and returns the respective TransferToken.
449
450
fn poll_next ( & mut self ) -> Option < Box < TransferToken > > {
450
451
// Check if descriptor has been marked used.
451
- if self . desc_ring . ring [ self . position ] . flags & WrapCount :: flag_mask ( )
452
+ if self . desc_ring . ring [ self . position ] . flags . get ( ) & WrapCount :: flag_mask ( )
452
453
== self . desc_ring . dev_wc . as_flags_used ( )
453
454
{
454
455
let buff_id = usize:: from ( self . desc_ring . ring [ self . position ] . buff_id ) ;
@@ -489,10 +490,10 @@ impl<'a> ReadCtrl<'a> {
489
490
// Need to only check for either send or receive buff to contain
490
491
// a ctrl_desc as, both carry the same if they carry one.
491
492
if send_buff. is_indirect ( ) {
492
- self . update_indirect ( Some ( send_buff) , Some ( ( recv_buff, write_len) ) ) ;
493
+ self . update_indirect ( Some ( send_buff) , Some ( ( recv_buff, write_len. into ( ) ) ) ) ;
493
494
} else {
494
495
self . update_send ( send_buff) ;
495
- self . update_recv ( ( recv_buff, write_len) ) ;
496
+ self . update_recv ( ( recv_buff, write_len. into ( ) ) ) ;
496
497
}
497
498
}
498
499
( Some ( send_buff) , None ) => {
@@ -504,9 +505,9 @@ impl<'a> ReadCtrl<'a> {
504
505
}
505
506
( None , Some ( recv_buff) ) => {
506
507
if recv_buff. is_indirect ( ) {
507
- self . update_indirect ( None , Some ( ( recv_buff, write_len) ) ) ;
508
+ self . update_indirect ( None , Some ( ( recv_buff, write_len. into ( ) ) ) ) ;
508
509
} else {
509
- self . update_recv ( ( recv_buff, write_len) ) ;
510
+ self . update_recv ( ( recv_buff, write_len. into ( ) ) ) ;
510
511
}
511
512
}
512
513
( None , None ) => unreachable ! ( "Empty Transfers are not allowed..." ) ,
@@ -555,13 +556,13 @@ impl<'a> ReadCtrl<'a> {
555
556
// Unwrapping is fine here, as lists must be of same size and same ordering
556
557
let ring_desc = desc_iter. next ( ) . unwrap ( ) ;
557
558
558
- if write_len >= ring_desc. len {
559
+ if write_len >= ring_desc. len . into ( ) {
559
560
// Complete length has been written but reduce len_written for next one
560
- write_len -= ring_desc. len ;
561
+ write_len -= ring_desc. len . get ( ) ;
561
562
} else {
562
- ring_desc. len = write_len;
563
+ ring_desc. len = ( write_len) . into ( ) ;
563
564
desc. len = write_len as usize ;
564
- write_len -= ring_desc. len ;
565
+ write_len -= ring_desc. len . get ( ) ;
565
566
assert_eq ! ( write_len, 0 ) ;
566
567
}
567
568
}
@@ -607,13 +608,13 @@ impl<'a> ReadCtrl<'a> {
607
608
// Unwrapping is fine here, as lists must be of same size and same ordering
608
609
let ring_desc = desc_iter. next ( ) . unwrap ( ) ;
609
610
610
- if write_len >= ring_desc. len {
611
+ if write_len >= ring_desc. len . into ( ) {
611
612
// Complete length has been written but reduce len_written for next one
612
- write_len -= ring_desc. len ;
613
+ write_len -= ring_desc. len . get ( ) ;
613
614
} else {
614
- ring_desc. len = write_len;
615
+ ring_desc. len = write_len. into ( ) ;
615
616
desc. len = write_len as usize ;
616
- write_len -= ring_desc. len ;
617
+ write_len -= ring_desc. len . get ( ) ;
617
618
assert_eq ! ( write_len, 0 ) ;
618
619
}
619
620
}
@@ -634,7 +635,7 @@ impl<'a> ReadCtrl<'a> {
634
635
// self.desc_ring.ring[self.position].address = 0;
635
636
// self.desc_ring.ring[self.position].len = 0;
636
637
// self.desc_ring.ring[self.position].buff_id = 0;
637
- self . desc_ring . ring [ self . position ] . flags = self . desc_ring . dev_wc . as_flags_used ( ) ;
638
+ self . desc_ring . ring [ self . position ] . flags = self . desc_ring . dev_wc . as_flags_used ( ) . into ( ) ;
638
639
}
639
640
640
641
/// Updates the accessible len of the memory areas accessible by the drivers to be consistent with
@@ -744,25 +745,31 @@ impl<'a> WriteCtrl<'a> {
744
745
// descriptor.
745
746
if self . start == self . position {
746
747
let desc_ref = & mut self . desc_ring . ring [ self . position ] ;
747
- desc_ref. address = paging:: virt_to_phys ( VirtAddr :: from ( mem_desc. ptr as u64 ) ) . into ( ) ;
748
- desc_ref. len = mem_desc. len as u32 ;
749
- desc_ref. buff_id = mem_desc. id . as_ref ( ) . unwrap ( ) . 0 ;
748
+ desc_ref
749
+ . address
750
+ . set ( paging:: virt_to_phys ( VirtAddr :: from ( mem_desc. ptr as u64 ) ) . into ( ) ) ;
751
+ desc_ref. len = ( mem_desc. len as u32 ) . into ( ) ;
752
+ desc_ref. buff_id = ( mem_desc. id . as_ref ( ) . unwrap ( ) . 0 ) . into ( ) ;
750
753
// Remove possibly set avail and used flags
751
754
desc_ref. flags =
752
- flags & !( DescrFlags :: VIRTQ_DESC_F_AVAIL ) & !( DescrFlags :: VIRTQ_DESC_F_USED ) ;
755
+ ( flags & !( DescrFlags :: VIRTQ_DESC_F_AVAIL ) & !( DescrFlags :: VIRTQ_DESC_F_USED ) )
756
+ . into ( ) ;
753
757
754
758
self . buff_id = mem_desc. id . as_ref ( ) . unwrap ( ) . 0 ;
755
759
self . incrmt ( ) ;
756
760
} else {
757
761
let desc_ref = & mut self . desc_ring . ring [ self . position ] ;
758
- desc_ref. address = paging:: virt_to_phys ( VirtAddr :: from ( mem_desc. ptr as u64 ) ) . into ( ) ;
759
- desc_ref. len = mem_desc. len as u32 ;
760
- desc_ref. buff_id = self . buff_id ;
762
+ desc_ref
763
+ . address
764
+ . set ( paging:: virt_to_phys ( VirtAddr :: from ( mem_desc. ptr as u64 ) ) . into ( ) ) ;
765
+ desc_ref. len = ( mem_desc. len as u32 ) . into ( ) ;
766
+ desc_ref. buff_id = ( self . buff_id ) . into ( ) ;
761
767
// Remove possibly set avail and used flags and then set avail and used
762
768
// according to the current WrapCount.
763
769
desc_ref. flags =
764
- ( flags & !( DescrFlags :: VIRTQ_DESC_F_AVAIL ) & !( DescrFlags :: VIRTQ_DESC_F_USED ) )
765
- | self . desc_ring . drv_wc . as_flags_avail ( ) ;
770
+ ( ( flags & !( DescrFlags :: VIRTQ_DESC_F_AVAIL ) & !( DescrFlags :: VIRTQ_DESC_F_USED ) )
771
+ | self . desc_ring . drv_wc . as_flags_avail ( ) )
772
+ . into ( ) ;
766
773
767
774
self . incrmt ( )
768
775
}
@@ -779,54 +786,28 @@ impl<'a> WriteCtrl<'a> {
779
786
// The driver performs a suitable memory barrier to ensure the device sees the updated descriptor table and available ring before the next step.
780
787
// See Virtio specfification v1.1. - 2.7.21
781
788
fence ( Ordering :: SeqCst ) ;
782
- self . desc_ring . ring [ self . start ] . flags |= self . wrap_at_init . as_flags_avail ( ) ;
789
+ self . desc_ring . ring [ self . start ] . flags |= self . wrap_at_init . as_flags_avail ( ) . into ( ) ;
783
790
}
784
791
}
785
792
786
793
#[ derive( Clone , Copy ) ]
787
794
#[ repr( C , align( 16 ) ) ]
788
795
struct Descriptor {
789
- address : u64 ,
790
- len : u32 ,
791
- buff_id : u16 ,
792
- flags : u16 ,
796
+ address : little_endian :: U64 ,
797
+ len : little_endian :: U32 ,
798
+ buff_id : little_endian :: U16 ,
799
+ flags : little_endian :: U16 ,
793
800
}
794
801
795
802
impl Descriptor {
796
803
fn new ( add : u64 , len : u32 , id : u16 , flags : u16 ) -> Self {
797
804
Descriptor {
798
- address : add,
799
- len,
800
- buff_id : id,
801
- flags,
805
+ address : add. into ( ) ,
806
+ len : len . into ( ) ,
807
+ buff_id : id. into ( ) ,
808
+ flags : flags . into ( ) ,
802
809
}
803
810
}
804
-
805
- fn to_le_bytes ( self ) -> [ u8 ; 16 ] {
806
- // 128 bits long raw descriptor bytes
807
- let mut desc_bytes: [ u8 ; 16 ] = [ 0 ; 16 ] ;
808
-
809
- // Call to little endian, as device will read this and
810
- // Virtio devices are inherently little endian coded.
811
- let mem_addr: [ u8 ; 8 ] = self . address . to_le_bytes ( ) ;
812
- desc_bytes[ 0 ..8 ] . copy_from_slice ( & mem_addr) ;
813
-
814
- // Must be 32 bit in order to fulfill specification.
815
- // MemPool.pull and .pull_untracked ensure this automatically
816
- // which makes this cast safe.
817
- let mem_len: [ u8 ; 4 ] = self . len . to_le_bytes ( ) ;
818
- desc_bytes[ 8 ..12 ] . copy_from_slice ( & mem_len) ;
819
-
820
- // Write BuffID as bytes in raw.
821
- let id: [ u8 ; 2 ] = self . buff_id . to_le_bytes ( ) ;
822
- desc_bytes[ 12 ..14 ] . copy_from_slice ( & id) ;
823
-
824
- // Write flags as bytes in raw.
825
- let flags: [ u8 ; 2 ] = self . flags . to_le_bytes ( ) ;
826
- desc_bytes[ 14 ..16 ] . copy_from_slice ( & flags) ;
827
-
828
- desc_bytes
829
- }
830
811
}
831
812
832
813
/// Driver and device event suppression struct used in packed virtqueues.
0 commit comments