@@ -55,17 +55,18 @@ static inline uint64_t ufs_reg_size(UfsHc *u)
55
55
return ufs_mcq_op_reg_addr (u , 0 ) + sizeof (u -> mcq_op_reg );
56
56
}
57
57
58
- static inline bool ufs_is_mcq_reg (UfsHc * u , uint64_t addr )
58
+ static inline bool ufs_is_mcq_reg (UfsHc * u , uint64_t addr , unsigned size )
59
59
{
60
60
uint64_t mcq_reg_addr = ufs_mcq_reg_addr (u , 0 );
61
- return addr >= mcq_reg_addr && addr < mcq_reg_addr + sizeof (u -> mcq_reg );
61
+ return (addr >= mcq_reg_addr &&
62
+ addr + size <= mcq_reg_addr + sizeof (u -> mcq_reg ));
62
63
}
63
64
64
- static inline bool ufs_is_mcq_op_reg (UfsHc * u , uint64_t addr )
65
+ static inline bool ufs_is_mcq_op_reg (UfsHc * u , uint64_t addr , unsigned size )
65
66
{
66
67
uint64_t mcq_op_reg_addr = ufs_mcq_op_reg_addr (u , 0 );
67
68
return (addr >= mcq_op_reg_addr &&
68
- addr < mcq_op_reg_addr + sizeof (u -> mcq_op_reg ));
69
+ addr + size <= mcq_op_reg_addr + sizeof (u -> mcq_op_reg ));
69
70
}
70
71
71
72
static MemTxResult ufs_addr_read (UfsHc * u , hwaddr addr , void * buf , int size )
@@ -774,25 +775,25 @@ static void ufs_write_mcq_op_reg(UfsHc *u, hwaddr offset, uint32_t data,
774
775
static uint64_t ufs_mmio_read (void * opaque , hwaddr addr , unsigned size )
775
776
{
776
777
UfsHc * u = (UfsHc * )opaque ;
777
- uint8_t * ptr ;
778
+ uint32_t * ptr ;
778
779
uint64_t value ;
779
780
uint64_t offset ;
780
781
781
- if (addr < sizeof (u -> reg )) {
782
+ if (addr + size <= sizeof (u -> reg )) {
782
783
offset = addr ;
783
- ptr = (uint8_t * )& u -> reg ;
784
- } else if (ufs_is_mcq_reg (u , addr )) {
784
+ ptr = (uint32_t * )& u -> reg ;
785
+ } else if (ufs_is_mcq_reg (u , addr , size )) {
785
786
offset = addr - ufs_mcq_reg_addr (u , 0 );
786
- ptr = (uint8_t * )& u -> mcq_reg ;
787
- } else if (ufs_is_mcq_op_reg (u , addr )) {
787
+ ptr = (uint32_t * )& u -> mcq_reg ;
788
+ } else if (ufs_is_mcq_op_reg (u , addr , size )) {
788
789
offset = addr - ufs_mcq_op_reg_addr (u , 0 );
789
- ptr = (uint8_t * )& u -> mcq_op_reg ;
790
+ ptr = (uint32_t * )& u -> mcq_op_reg ;
790
791
} else {
791
792
trace_ufs_err_invalid_register_offset (addr );
792
793
return 0 ;
793
794
}
794
795
795
- value = * ( uint32_t * )( ptr + offset ) ;
796
+ value = ptr [ offset >> 2 ] ;
796
797
trace_ufs_mmio_read (addr , value , size );
797
798
return value ;
798
799
}
@@ -804,11 +805,11 @@ static void ufs_mmio_write(void *opaque, hwaddr addr, uint64_t data,
804
805
805
806
trace_ufs_mmio_write (addr , data , size );
806
807
807
- if (addr < sizeof (u -> reg )) {
808
+ if (addr + size <= sizeof (u -> reg )) {
808
809
ufs_write_reg (u , addr , data , size );
809
- } else if (ufs_is_mcq_reg (u , addr )) {
810
+ } else if (ufs_is_mcq_reg (u , addr , size )) {
810
811
ufs_write_mcq_reg (u , addr - ufs_mcq_reg_addr (u , 0 ), data , size );
811
- } else if (ufs_is_mcq_op_reg (u , addr )) {
812
+ } else if (ufs_is_mcq_op_reg (u , addr , size )) {
812
813
ufs_write_mcq_op_reg (u , addr - ufs_mcq_op_reg_addr (u , 0 ), data , size );
813
814
} else {
814
815
trace_ufs_err_invalid_register_offset (addr );
0 commit comments