0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #include <linux/personality.h>
0015 #include <linux/mm.h>
0016 #include <linux/random.h>
0017 #include <linux/limits.h>
0018 #include <linux/sched/signal.h>
0019 #include <linux/sched/mm.h>
0020 #include <linux/compat.h>
0021 #include <linux/elf-randomize.h>
0022 #include <asm/elf.h>
0023 #include <asm/io.h>
0024
0025 #include "physaddr.h"
0026
0027 struct va_alignment __read_mostly va_align = {
0028 .flags = -1,
0029 };
0030
0031 unsigned long task_size_32bit(void)
0032 {
0033 return IA32_PAGE_OFFSET;
0034 }
0035
0036 unsigned long task_size_64bit(int full_addr_space)
0037 {
0038 return full_addr_space ? TASK_SIZE_MAX : DEFAULT_MAP_WINDOW;
0039 }
0040
0041 static unsigned long stack_maxrandom_size(unsigned long task_size)
0042 {
0043 unsigned long max = 0;
0044 if (current->flags & PF_RANDOMIZE) {
0045 max = (-1UL) & __STACK_RND_MASK(task_size == task_size_32bit());
0046 max <<= PAGE_SHIFT;
0047 }
0048
0049 return max;
0050 }
0051
0052 #ifdef CONFIG_COMPAT
0053 # define mmap32_rnd_bits mmap_rnd_compat_bits
0054 # define mmap64_rnd_bits mmap_rnd_bits
0055 #else
0056 # define mmap32_rnd_bits mmap_rnd_bits
0057 # define mmap64_rnd_bits mmap_rnd_bits
0058 #endif
0059
0060 #define SIZE_128M (128 * 1024 * 1024UL)
0061
0062 static int mmap_is_legacy(void)
0063 {
0064 if (current->personality & ADDR_COMPAT_LAYOUT)
0065 return 1;
0066
0067 return sysctl_legacy_va_layout;
0068 }
0069
0070 static unsigned long arch_rnd(unsigned int rndbits)
0071 {
0072 if (!(current->flags & PF_RANDOMIZE))
0073 return 0;
0074 return (get_random_long() & ((1UL << rndbits) - 1)) << PAGE_SHIFT;
0075 }
0076
0077 unsigned long arch_mmap_rnd(void)
0078 {
0079 return arch_rnd(mmap_is_ia32() ? mmap32_rnd_bits : mmap64_rnd_bits);
0080 }
0081
0082 static unsigned long mmap_base(unsigned long rnd, unsigned long task_size,
0083 struct rlimit *rlim_stack)
0084 {
0085 unsigned long gap = rlim_stack->rlim_cur;
0086 unsigned long pad = stack_maxrandom_size(task_size) + stack_guard_gap;
0087 unsigned long gap_min, gap_max;
0088
0089
0090 if (gap + pad > gap)
0091 gap += pad;
0092
0093
0094
0095
0096
0097 gap_min = SIZE_128M;
0098 gap_max = (task_size / 6) * 5;
0099
0100 if (gap < gap_min)
0101 gap = gap_min;
0102 else if (gap > gap_max)
0103 gap = gap_max;
0104
0105 return PAGE_ALIGN(task_size - gap - rnd);
0106 }
0107
0108 static unsigned long mmap_legacy_base(unsigned long rnd,
0109 unsigned long task_size)
0110 {
0111 return __TASK_UNMAPPED_BASE(task_size) + rnd;
0112 }
0113
0114
0115
0116
0117
0118 static void arch_pick_mmap_base(unsigned long *base, unsigned long *legacy_base,
0119 unsigned long random_factor, unsigned long task_size,
0120 struct rlimit *rlim_stack)
0121 {
0122 *legacy_base = mmap_legacy_base(random_factor, task_size);
0123 if (mmap_is_legacy())
0124 *base = *legacy_base;
0125 else
0126 *base = mmap_base(random_factor, task_size, rlim_stack);
0127 }
0128
0129 void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack)
0130 {
0131 if (mmap_is_legacy())
0132 mm->get_unmapped_area = arch_get_unmapped_area;
0133 else
0134 mm->get_unmapped_area = arch_get_unmapped_area_topdown;
0135
0136 arch_pick_mmap_base(&mm->mmap_base, &mm->mmap_legacy_base,
0137 arch_rnd(mmap64_rnd_bits), task_size_64bit(0),
0138 rlim_stack);
0139
0140 #ifdef CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES
0141
0142
0143
0144
0145
0146
0147 arch_pick_mmap_base(&mm->mmap_compat_base, &mm->mmap_compat_legacy_base,
0148 arch_rnd(mmap32_rnd_bits), task_size_32bit(),
0149 rlim_stack);
0150 #endif
0151 }
0152
0153 unsigned long get_mmap_base(int is_legacy)
0154 {
0155 struct mm_struct *mm = current->mm;
0156
0157 #ifdef CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES
0158 if (in_32bit_syscall()) {
0159 return is_legacy ? mm->mmap_compat_legacy_base
0160 : mm->mmap_compat_base;
0161 }
0162 #endif
0163 return is_legacy ? mm->mmap_legacy_base : mm->mmap_base;
0164 }
0165
0166 const char *arch_vma_name(struct vm_area_struct *vma)
0167 {
0168 return NULL;
0169 }
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209 bool mmap_address_hint_valid(unsigned long addr, unsigned long len)
0210 {
0211 if (TASK_SIZE - len < addr)
0212 return false;
0213
0214 return (addr > DEFAULT_MAP_WINDOW) == (addr + len > DEFAULT_MAP_WINDOW);
0215 }
0216
0217
0218 int valid_phys_addr_range(phys_addr_t addr, size_t count)
0219 {
0220 return addr + count - 1 <= __pa(high_memory - 1);
0221 }
0222
0223
0224 int valid_mmap_phys_addr_range(unsigned long pfn, size_t count)
0225 {
0226 phys_addr_t addr = (phys_addr_t)pfn << PAGE_SHIFT;
0227
0228 return phys_addr_valid(addr + count - 1);
0229 }
0230
0231
0232
0233
0234
0235
0236
0237
0238 bool pfn_modify_allowed(unsigned long pfn, pgprot_t prot)
0239 {
0240 if (!boot_cpu_has_bug(X86_BUG_L1TF))
0241 return true;
0242 if (!__pte_needs_invert(pgprot_val(prot)))
0243 return true;
0244
0245 if (pfn_valid(pfn))
0246 return true;
0247 if (pfn >= l1tf_pfn_limit() && !capable(CAP_SYS_ADMIN))
0248 return false;
0249 return true;
0250 }