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