|
|
@@ -282,6 +282,12 @@ int __init cma_declare_contiguous(phys_addr_t base,
|
|
|
*/
|
|
|
alignment = max(alignment, (phys_addr_t)PAGE_SIZE <<
|
|
|
max_t(unsigned long, MAX_ORDER - 1, pageblock_order));
|
|
|
+ if (fixed && base & (alignment - 1)) {
|
|
|
+ ret = -EINVAL;
|
|
|
+ pr_err("Region at %pa must be aligned to %pa bytes\n",
|
|
|
+ &base, &alignment);
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
base = ALIGN(base, alignment);
|
|
|
size = ALIGN(size, alignment);
|
|
|
limit &= ~(alignment - 1);
|
|
|
@@ -312,6 +318,13 @@ int __init cma_declare_contiguous(phys_addr_t base,
|
|
|
if (limit == 0 || limit > memblock_end)
|
|
|
limit = memblock_end;
|
|
|
|
|
|
+ if (base + size > limit) {
|
|
|
+ ret = -EINVAL;
|
|
|
+ pr_err("Size (%pa) of region at %pa exceeds limit (%pa)\n",
|
|
|
+ &size, &base, &limit);
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+
|
|
|
/* Reserve memory */
|
|
|
if (fixed) {
|
|
|
if (memblock_is_region_reserved(base, size) ||
|