/* * Functions for checking if address ranges overlap. * * Copyright (C) 2012 Google, Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and * may be copied, distributed, and modified under those terms. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef _ADDR_OVERLAP_H #define _ADDR_OVERLAP_H /** * Tell whether the two regions of physical addresses overlap at all. * * If there's any overlap between the region a..a+a_size and * b..b+b_size then we'll return true. * * @a: Start of region 1. * @a_size: Size of region 1 in bytes. * @b: Start of region 2. * @b_size: Size of region 2 in bytes. * @return: True if the regions overlap; false otherwise. */ static inline bool phys_addrs_overlap(phys_addr_t a, size_t a_size, phys_addr_t b, size_t b_size) { if ((b + b_size) <= a) return false; if (b >= (a + a_size)) return false; return true; } /** * Tell whether the two regions of virtual addresses overlap at all. * * If there's any overlap between the region a..a+a_size and * b..b+b_size then we'll return true. * * @a: Start of region 1. * @a_size: Size of region 1 in bytes. * @b: Start of region 2. * @b_size: Size of region 2 in bytes. * @return: True if the regions overlap; false otherwise. */ static inline bool virt_addrs_overlap(void *a, size_t a_size, void *b, size_t b_size) { if ((b + b_size) <= a) return false; if (b >= (a + a_size)) return false; return true; } #endif /* _ADDR_OVERLAP_H */