Hi Dmitry, [auto build test WARNING on tip/x86/core] [also build test WARNING on v4.10-rc4 next-20170116] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Dmitry-Safonov/Fix-compatible-mmap-return-pointer-over-4Gb/20170116-204523 config: x86_64-randconfig-ne0-01162147 (attached as .config) compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901 reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All warnings (new ones prefixed by >>): In file included from include/uapi/linux/stddef.h:1:0, from include/linux/stddef.h:4, from include/uapi/linux/posix_types.h:4, from include/uapi/linux/types.h:13, from include/linux/types.h:5, from include/uapi/linux/capability.h:16, from include/linux/capability.h:15, from include/linux/sched.h:15, from arch/x86/kernel/sys_x86_64.c:2: arch/x86/kernel/sys_x86_64.c: In function 'find_start_end': arch/x86/kernel/sys_x86_64.c:131:8: error: implicit declaration of function 'in_compat_syscall' [-Werror=implicit-function-declaration] if (!in_compat_syscall()) { ^ include/linux/compiler.h:149:30: note: in definition of macro '__trace_if' if (__builtin_constant_p(!!(cond)) ? !!(cond) : \ ^~~~ >> arch/x86/kernel/sys_x86_64.c:131:3: note: in expansion of macro 'if' if (!in_compat_syscall()) { ^~ cc1: some warnings being treated as errors vim +/if +131 arch/x86/kernel/sys_x86_64.c 1 #include <linux/errno.h> > 2 #include <linux/sched.h> 3 #include <linux/syscalls.h> 4 #include <linux/mm.h> 5 #include <linux/fs.h> 6 #include <linux/smp.h> 7 #include <linux/sem.h> 8 #include <linux/msg.h> 9 #include <linux/shm.h> 10 #include <linux/stat.h> 11 #include <linux/mman.h> 12 #include <linux/file.h> 13 #include <linux/utsname.h> 14 #include <linux/personality.h> 15 #include <linux/random.h> 16 #include <linux/uaccess.h> 17 #include <linux/elf.h> 18 19 #include <asm/ia32.h> 20 #include <asm/syscalls.h> 21 22 /* 23 * Align a virtual address to avoid aliasing in the I$ on AMD F15h. 24 */ 25 static unsigned long get_align_mask(void) 26 { 27 /* handle 32- and 64-bit case with a single conditional */ 28 if (va_align.flags < 0 || !(va_align.flags & (2 - mmap_is_ia32()))) 29 return 0; 30 31 if (!(current->flags & PF_RANDOMIZE)) 32 return 0; 33 34 return va_align.mask; 35 } 36 37 /* 38 * To avoid aliasing in the I$ on AMD F15h, the bits defined by the 39 * va_align.bits, [12:upper_bit), are set to a random value instead of 40 * zeroing them. This random value is computed once per boot. This form 41 * of ASLR is known as "per-boot ASLR". 42 * 43 * To achieve this, the random value is added to the info.align_offset 44 * value before calling vm_unmapped_area() or ORed directly to the 45 * address. 46 */ 47 static unsigned long get_align_bits(void) 48 { 49 return va_align.bits & get_align_mask(); 50 } 51 52 unsigned long align_vdso_addr(unsigned long addr) 53 { 54 unsigned long align_mask = get_align_mask(); 55 addr = (addr + align_mask) & ~align_mask; 56 return addr | get_align_bits(); 57 } 58 59 static int __init control_va_addr_alignment(char *str) 60 { 61 /* guard against enabling this on other CPU families */ 62 if (va_align.flags < 0) 63 return 1; 64 65 if (*str == 0) 66 return 1; 67 68 if (*str == '=') 69 str++; 70 71 if (!strcmp(str, "32")) 72 va_align.flags = ALIGN_VA_32; 73 else if (!strcmp(str, "64")) 74 va_align.flags = ALIGN_VA_64; 75 else if (!strcmp(str, "off")) 76 va_align.flags = 0; 77 else if (!strcmp(str, "on")) 78 va_align.flags = ALIGN_VA_32 | ALIGN_VA_64; 79 else 80 return 0; 81 82 return 1; 83 } 84 __setup("align_va_addr", control_va_addr_alignment); 85 86 SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, 87 unsigned long, prot, unsigned long, flags, 88 unsigned long, fd, unsigned long, off) 89 { 90 long error; 91 error = -EINVAL; 92 if (off & ~PAGE_MASK) 93 goto out; 94 95 error = sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT); 96 out: 97 return error; 98 } 99 100 static void find_start_end(unsigned long flags, unsigned long *begin, 101 unsigned long *end) 102 { 103 if (!test_thread_flag(TIF_ADDR32) && (flags & MAP_32BIT)) { 104 /* This is usually used needed to map code in small 105 model, so it needs to be in the first 31bit. Limit 106 it to that. This means we need to move the 107 unmapped base down for this case. This can give 108 conflicts with the heap, but we assume that glibc 109 malloc knows how to fall back to mmap. Give it 1GB 110 of playground for now. -AK */ 111 *begin = 0x40000000; 112 *end = 0x80000000; 113 if (current->flags & PF_RANDOMIZE) { 114 *begin = randomize_page(*begin, 0x02000000); 115 } 116 return; 117 } 118 119 if (!test_thread_flag(TIF_ADDR32)) { 120 #ifdef CONFIG_COMPAT 121 /* 64-bit native binary doing compat 32-bit syscall */ 122 if (in_compat_syscall()) { 123 *begin = mmap_legacy_base(arch_compat_rnd(), 124 IA32_PAGE_OFFSET); 125 *end = IA32_PAGE_OFFSET; 126 return; 127 } 128 #endif 129 } else { 130 /* 32-bit binary doing 64-bit syscall */ > 131 if (!in_compat_syscall()) { 132 *begin = mmap_legacy_base(arch_native_rnd(), 133 IA32_PAGE_OFFSET); 134 *end = TASK_SIZE_MAX; --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
Attachment:
.config.gz
Description: application/gzip