Revision a014ed07 memory.c
b/memory.c | ||
---|---|---|
856 | 856 |
unsigned size, |
857 | 857 |
bool is_write) |
858 | 858 |
{ |
859 |
if (mr->ops->valid.accepts |
|
860 |
&& !mr->ops->valid.accepts(mr->opaque, addr, size, is_write)) { |
|
861 |
return false; |
|
862 |
} |
|
859 |
int access_size_min, access_size_max; |
|
860 |
int access_size, i; |
|
863 | 861 |
|
864 | 862 |
if (!mr->ops->valid.unaligned && (addr & (size - 1))) { |
865 | 863 |
return false; |
866 | 864 |
} |
867 | 865 |
|
868 |
/* Treat zero as compatibility all valid */ |
|
869 |
if (!mr->ops->valid.max_access_size) { |
|
866 |
if (!mr->ops->valid.accepts) { |
|
870 | 867 |
return true; |
871 | 868 |
} |
872 | 869 |
|
873 |
if (size > mr->ops->valid.max_access_size |
|
874 |
|| size < mr->ops->valid.min_access_size) { |
|
875 |
return false; |
|
870 |
access_size_min = mr->ops->valid.min_access_size; |
|
871 |
if (!mr->ops->valid.min_access_size) { |
|
872 |
access_size_min = 1; |
|
873 |
} |
|
874 |
|
|
875 |
access_size_max = mr->ops->valid.max_access_size; |
|
876 |
if (!mr->ops->valid.max_access_size) { |
|
877 |
access_size_max = 4; |
|
878 |
} |
|
879 |
|
|
880 |
access_size = MAX(MIN(size, access_size_max), access_size_min); |
|
881 |
for (i = 0; i < size; i += access_size) { |
|
882 |
if (!mr->ops->valid.accepts(mr->opaque, addr + i, access_size, |
|
883 |
is_write)) { |
|
884 |
return false; |
|
885 |
} |
|
876 | 886 |
} |
887 |
|
|
877 | 888 |
return true; |
878 | 889 |
} |
879 | 890 |
|
Also available in: Unified diff