|
@@ -355,10 +355,19 @@ int mpx_enable_management(void)
|
|
|
*/
|
|
|
bd_base = mpx_get_bounds_dir();
|
|
|
down_write(&mm->mmap_sem);
|
|
|
+
|
|
|
+ /* MPX doesn't support addresses above 47 bits yet. */
|
|
|
+ if (find_vma(mm, DEFAULT_MAP_WINDOW)) {
|
|
|
+ pr_warn_once("%s (%d): MPX cannot handle addresses "
|
|
|
+ "above 47-bits. Disabling.",
|
|
|
+ current->comm, current->pid);
|
|
|
+ ret = -ENXIO;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
mm->context.bd_addr = bd_base;
|
|
|
if (mm->context.bd_addr == MPX_INVALID_BOUNDS_DIR)
|
|
|
ret = -ENXIO;
|
|
|
-
|
|
|
+out:
|
|
|
up_write(&mm->mmap_sem);
|
|
|
return ret;
|
|
|
}
|
|
@@ -1030,3 +1039,25 @@ void mpx_notify_unmap(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
|
if (ret)
|
|
|
force_sig(SIGSEGV, current);
|
|
|
}
|
|
|
+
|
|
|
+/* MPX cannot handle addresses above 47 bits yet. */
|
|
|
+unsigned long mpx_unmapped_area_check(unsigned long addr, unsigned long len,
|
|
|
+ unsigned long flags)
|
|
|
+{
|
|
|
+ if (!kernel_managing_mpx_tables(current->mm))
|
|
|
+ return addr;
|
|
|
+ if (addr + len <= DEFAULT_MAP_WINDOW)
|
|
|
+ return addr;
|
|
|
+ if (flags & MAP_FIXED)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Requested len is larger than the whole area we're allowed to map in.
|
|
|
+ * Resetting hinting address wouldn't do much good -- fail early.
|
|
|
+ */
|
|
|
+ if (len > DEFAULT_MAP_WINDOW)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ /* Look for unmap area within DEFAULT_MAP_WINDOW */
|
|
|
+ return 0;
|
|
|
+}
|