Commit 69048e01881747e27457cd514a6b85d925982046
Exists in
master
and in
16 other branches
Merge branch 'parisc-3.14' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux
Pull parisc updates from Helge Deller: "The three major changes in this patchset is a implementation for flexible userspace memory maps, cache-flushing fixes (again), and a long-discussed ABI change to make EWOULDBLOCK the same value as EAGAIN. parisc has been the only platform where we had EWOULDBLOCK != EAGAIN to keep HP-UX compatibility. Since we will probably never implement full HP-UX support, we prefer to drop this compatibility to make it easier for us with Linux userspace programs which mostly never checked for both values. We don't expect major fall-outs because of this change, and if we face some, we will simply rebuild the necessary applications in the debian archives" * 'parisc-3.14' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux: parisc: add flexible mmap memory layout support parisc: Make EWOULDBLOCK be equal to EAGAIN on parisc parisc: convert uapi/asm/stat.h to use native types only parisc: wire up sched_setattr and sched_getattr parisc: fix cache-flushing parisc/sti_console: prefer Linux fonts over built-in ROM fonts
Showing 15 changed files Side-by-side Diff
- arch/parisc/include/asm/cacheflush.h
- arch/parisc/include/asm/elf.h
- arch/parisc/include/asm/page.h
- arch/parisc/include/asm/pgtable.h
- arch/parisc/include/asm/processor.h
- arch/parisc/include/asm/thread_info.h
- arch/parisc/include/uapi/asm/errno.h
- arch/parisc/include/uapi/asm/stat.h
- arch/parisc/include/uapi/asm/unistd.h
- arch/parisc/kernel/cache.c
- arch/parisc/kernel/process.c
- arch/parisc/kernel/sys_parisc.c
- arch/parisc/kernel/syscall_table.S
- drivers/video/console/sticore.c
- lib/fonts/Kconfig
arch/parisc/include/asm/cacheflush.h
... | ... | @@ -132,7 +132,6 @@ |
132 | 132 | static inline void *kmap(struct page *page) |
133 | 133 | { |
134 | 134 | might_sleep(); |
135 | - flush_dcache_page(page); | |
136 | 135 | return page_address(page); |
137 | 136 | } |
138 | 137 | |
... | ... | @@ -144,7 +143,6 @@ |
144 | 143 | static inline void *kmap_atomic(struct page *page) |
145 | 144 | { |
146 | 145 | pagefault_disable(); |
147 | - flush_dcache_page(page); | |
148 | 146 | return page_address(page); |
149 | 147 | } |
150 | 148 |
arch/parisc/include/asm/elf.h
arch/parisc/include/asm/page.h
... | ... | @@ -29,7 +29,8 @@ |
29 | 29 | void clear_page_asm(void *page); |
30 | 30 | void copy_page_asm(void *to, void *from); |
31 | 31 | #define clear_user_page(vto, vaddr, page) clear_page_asm(vto) |
32 | -#define copy_user_page(vto, vfrom, vaddr, page) copy_page_asm(vto, vfrom) | |
32 | +void copy_user_page(void *vto, void *vfrom, unsigned long vaddr, | |
33 | + struct page *pg); | |
33 | 34 | |
34 | 35 | /* #define CONFIG_PARISC_TMPALIAS */ |
35 | 36 |
arch/parisc/include/asm/pgtable.h
... | ... | @@ -511,6 +511,7 @@ |
511 | 511 | /* We provide our own get_unmapped_area to provide cache coherency */ |
512 | 512 | |
513 | 513 | #define HAVE_ARCH_UNMAPPED_AREA |
514 | +#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN | |
514 | 515 | |
515 | 516 | #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG |
516 | 517 | #define __HAVE_ARCH_PTEP_GET_AND_CLEAR |
arch/parisc/include/asm/processor.h
... | ... | @@ -30,6 +30,8 @@ |
30 | 30 | #endif |
31 | 31 | #define current_text_addr() ({ void *pc; current_ia(pc); pc; }) |
32 | 32 | |
33 | +#define HAVE_ARCH_PICK_MMAP_LAYOUT | |
34 | + | |
33 | 35 | #define TASK_SIZE_OF(tsk) ((tsk)->thread.task_size) |
34 | 36 | #define TASK_SIZE TASK_SIZE_OF(current) |
35 | 37 | #define TASK_UNMAPPED_BASE (current->thread.map_base) |
arch/parisc/include/asm/thread_info.h
... | ... | @@ -76,6 +76,16 @@ |
76 | 76 | #define _TIF_SYSCALL_TRACE_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \ |
77 | 77 | _TIF_BLOCKSTEP | _TIF_SYSCALL_AUDIT) |
78 | 78 | |
79 | +#ifdef CONFIG_64BIT | |
80 | +# ifdef CONFIG_COMPAT | |
81 | +# define is_32bit_task() (test_thread_flag(TIF_32BIT)) | |
82 | +# else | |
83 | +# define is_32bit_task() (0) | |
84 | +# endif | |
85 | +#else | |
86 | +# define is_32bit_task() (1) | |
87 | +#endif | |
88 | + | |
79 | 89 | #endif /* __KERNEL__ */ |
80 | 90 | |
81 | 91 | #endif /* _ASM_PARISC_THREAD_INFO_H */ |
arch/parisc/include/uapi/asm/errno.h
... | ... | @@ -106,7 +106,7 @@ |
106 | 106 | |
107 | 107 | #define EALREADY 244 /* Operation already in progress */ |
108 | 108 | #define EINPROGRESS 245 /* Operation now in progress */ |
109 | -#define EWOULDBLOCK 246 /* Operation would block (Linux returns EAGAIN) */ | |
109 | +#define EWOULDBLOCK EAGAIN /* Operation would block (Not HPUX compliant) */ | |
110 | 110 | #define ENOTEMPTY 247 /* Directory not empty */ |
111 | 111 | #define ENAMETOOLONG 248 /* File name too long */ |
112 | 112 | #define ELOOP 249 /* Too many symbolic links encountered */ |
arch/parisc/include/uapi/asm/stat.h
... | ... | @@ -5,67 +5,65 @@ |
5 | 5 | |
6 | 6 | struct stat { |
7 | 7 | unsigned int st_dev; /* dev_t is 32 bits on parisc */ |
8 | - ino_t st_ino; /* 32 bits */ | |
9 | - mode_t st_mode; /* 16 bits */ | |
8 | + unsigned int st_ino; /* 32 bits */ | |
9 | + unsigned short st_mode; /* 16 bits */ | |
10 | 10 | unsigned short st_nlink; /* 16 bits */ |
11 | 11 | unsigned short st_reserved1; /* old st_uid */ |
12 | 12 | unsigned short st_reserved2; /* old st_gid */ |
13 | 13 | unsigned int st_rdev; |
14 | - off_t st_size; | |
15 | - time_t st_atime; | |
14 | + signed int st_size; | |
15 | + signed int st_atime; | |
16 | 16 | unsigned int st_atime_nsec; |
17 | - time_t st_mtime; | |
17 | + signed int st_mtime; | |
18 | 18 | unsigned int st_mtime_nsec; |
19 | - time_t st_ctime; | |
19 | + signed int st_ctime; | |
20 | 20 | unsigned int st_ctime_nsec; |
21 | 21 | int st_blksize; |
22 | 22 | int st_blocks; |
23 | 23 | unsigned int __unused1; /* ACL stuff */ |
24 | 24 | unsigned int __unused2; /* network */ |
25 | - ino_t __unused3; /* network */ | |
25 | + unsigned int __unused3; /* network */ | |
26 | 26 | unsigned int __unused4; /* cnodes */ |
27 | 27 | unsigned short __unused5; /* netsite */ |
28 | 28 | short st_fstype; |
29 | 29 | unsigned int st_realdev; |
30 | 30 | unsigned short st_basemode; |
31 | 31 | unsigned short st_spareshort; |
32 | - uid_t st_uid; | |
33 | - gid_t st_gid; | |
32 | + unsigned int st_uid; | |
33 | + unsigned int st_gid; | |
34 | 34 | unsigned int st_spare4[3]; |
35 | 35 | }; |
36 | 36 | |
37 | 37 | #define STAT_HAVE_NSEC |
38 | 38 | |
39 | -typedef __kernel_off64_t off64_t; | |
40 | - | |
41 | 39 | struct hpux_stat64 { |
42 | 40 | unsigned int st_dev; /* dev_t is 32 bits on parisc */ |
43 | - ino_t st_ino; /* 32 bits */ | |
44 | - mode_t st_mode; /* 16 bits */ | |
41 | + unsigned int st_ino; /* 32 bits */ | |
42 | + unsigned short st_mode; /* 16 bits */ | |
45 | 43 | unsigned short st_nlink; /* 16 bits */ |
46 | 44 | unsigned short st_reserved1; /* old st_uid */ |
47 | 45 | unsigned short st_reserved2; /* old st_gid */ |
48 | 46 | unsigned int st_rdev; |
49 | - off64_t st_size; | |
50 | - time_t st_atime; | |
47 | + signed long long st_size; | |
48 | + signed int st_atime; | |
51 | 49 | unsigned int st_spare1; |
52 | - time_t st_mtime; | |
50 | + signed int st_mtime; | |
53 | 51 | unsigned int st_spare2; |
54 | - time_t st_ctime; | |
52 | + signed int st_ctime; | |
55 | 53 | unsigned int st_spare3; |
56 | 54 | int st_blksize; |
57 | - __u64 st_blocks; | |
55 | + unsigned long long st_blocks; | |
58 | 56 | unsigned int __unused1; /* ACL stuff */ |
59 | 57 | unsigned int __unused2; /* network */ |
60 | - ino_t __unused3; /* network */ | |
58 | + unsigned int __unused3; /* network */ | |
61 | 59 | unsigned int __unused4; /* cnodes */ |
62 | 60 | unsigned short __unused5; /* netsite */ |
63 | 61 | short st_fstype; |
64 | 62 | unsigned int st_realdev; |
65 | 63 | unsigned short st_basemode; |
66 | 64 | unsigned short st_spareshort; |
67 | - uid_t st_uid; | |
68 | - gid_t st_gid; | |
65 | + unsigned int st_uid; | |
66 | + unsigned int st_gid; | |
69 | 67 | unsigned int st_spare4[3]; |
70 | 68 | }; |
71 | 69 |
arch/parisc/include/uapi/asm/unistd.h
... | ... | @@ -826,8 +826,10 @@ |
826 | 826 | #define __NR_process_vm_writev (__NR_Linux + 331) |
827 | 827 | #define __NR_kcmp (__NR_Linux + 332) |
828 | 828 | #define __NR_finit_module (__NR_Linux + 333) |
829 | +#define __NR_sched_setattr (__NR_Linux + 334) | |
830 | +#define __NR_sched_getattr (__NR_Linux + 335) | |
829 | 831 | |
830 | -#define __NR_Linux_syscalls (__NR_finit_module + 1) | |
832 | +#define __NR_Linux_syscalls (__NR_sched_getattr + 1) | |
831 | 833 | |
832 | 834 | |
833 | 835 | #define __IGNORE_select /* newselect */ |
arch/parisc/kernel/cache.c
... | ... | @@ -388,6 +388,20 @@ |
388 | 388 | } |
389 | 389 | EXPORT_SYMBOL(flush_kernel_dcache_page_addr); |
390 | 390 | |
391 | +void copy_user_page(void *vto, void *vfrom, unsigned long vaddr, | |
392 | + struct page *pg) | |
393 | +{ | |
394 | + /* Copy using kernel mapping. No coherency is needed (all in | |
395 | + kunmap) for the `to' page. However, the `from' page needs to | |
396 | + be flushed through a mapping equivalent to the user mapping | |
397 | + before it can be accessed through the kernel mapping. */ | |
398 | + preempt_disable(); | |
399 | + flush_dcache_page_asm(__pa(vfrom), vaddr); | |
400 | + preempt_enable(); | |
401 | + copy_page_asm(vto, vfrom); | |
402 | +} | |
403 | +EXPORT_SYMBOL(copy_user_page); | |
404 | + | |
391 | 405 | void purge_tlb_entries(struct mm_struct *mm, unsigned long addr) |
392 | 406 | { |
393 | 407 | unsigned long flags; |
arch/parisc/kernel/process.c
... | ... | @@ -13,7 +13,7 @@ |
13 | 13 | * Copyright (C) 2000 Grant Grundler <grundler with parisc-linux.org> |
14 | 14 | * Copyright (C) 2001 Alan Modra <amodra at parisc-linux.org> |
15 | 15 | * Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org> |
16 | - * Copyright (C) 2001-2007 Helge Deller <deller at parisc-linux.org> | |
16 | + * Copyright (C) 2001-2014 Helge Deller <deller@gmx.de> | |
17 | 17 | * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> |
18 | 18 | * |
19 | 19 | * |
... | ... | @@ -49,6 +49,7 @@ |
49 | 49 | #include <linux/kallsyms.h> |
50 | 50 | #include <linux/uaccess.h> |
51 | 51 | #include <linux/rcupdate.h> |
52 | +#include <linux/random.h> | |
52 | 53 | |
53 | 54 | #include <asm/io.h> |
54 | 55 | #include <asm/asm-offsets.h> |
... | ... | @@ -286,4 +287,22 @@ |
286 | 287 | return ptr; |
287 | 288 | } |
288 | 289 | #endif |
290 | + | |
291 | +static inline unsigned long brk_rnd(void) | |
292 | +{ | |
293 | + /* 8MB for 32bit, 1GB for 64bit */ | |
294 | + if (is_32bit_task()) | |
295 | + return (get_random_int() & 0x7ffUL) << PAGE_SHIFT; | |
296 | + else | |
297 | + return (get_random_int() & 0x3ffffUL) << PAGE_SHIFT; | |
298 | +} | |
299 | + | |
300 | +unsigned long arch_randomize_brk(struct mm_struct *mm) | |
301 | +{ | |
302 | + unsigned long ret = PAGE_ALIGN(mm->brk + brk_rnd()); | |
303 | + | |
304 | + if (ret < mm->brk) | |
305 | + return mm->brk; | |
306 | + return ret; | |
307 | +} |
arch/parisc/kernel/sys_parisc.c
... | ... | @@ -5,6 +5,7 @@ |
5 | 5 | * Copyright (C) 1999-2003 Matthew Wilcox <willy at parisc-linux.org> |
6 | 6 | * Copyright (C) 2000-2003 Paul Bame <bame at parisc-linux.org> |
7 | 7 | * Copyright (C) 2001 Thomas Bogendoerfer <tsbogend at parisc-linux.org> |
8 | + * Copyright (C) 1999-2014 Helge Deller <deller@gmx.de> | |
8 | 9 | * |
9 | 10 | * |
10 | 11 | * This program is free software; you can redistribute it and/or modify |
... | ... | @@ -23,6 +24,7 @@ |
23 | 24 | */ |
24 | 25 | |
25 | 26 | #include <asm/uaccess.h> |
27 | +#include <asm/elf.h> | |
26 | 28 | #include <linux/file.h> |
27 | 29 | #include <linux/fs.h> |
28 | 30 | #include <linux/linkage.h> |
29 | 31 | |
30 | 32 | |
31 | 33 | |
32 | 34 | |
33 | 35 | |
34 | 36 | |
35 | 37 | |
36 | 38 | |
37 | 39 | |
38 | 40 | |
39 | 41 | |
40 | 42 | |
41 | 43 | |
42 | 44 | |
43 | 45 | |
44 | 46 | |
45 | 47 | |
46 | 48 | |
47 | 49 | |
48 | 50 | |
49 | 51 | |
... | ... | @@ -32,77 +34,229 @@ |
32 | 34 | #include <linux/syscalls.h> |
33 | 35 | #include <linux/utsname.h> |
34 | 36 | #include <linux/personality.h> |
37 | +#include <linux/random.h> | |
35 | 38 | |
36 | -static unsigned long get_unshared_area(unsigned long addr, unsigned long len) | |
39 | +/* we construct an artificial offset for the mapping based on the physical | |
40 | + * address of the kernel mapping variable */ | |
41 | +#define GET_LAST_MMAP(filp) \ | |
42 | + (filp ? ((unsigned long) filp->f_mapping) >> 8 : 0UL) | |
43 | +#define SET_LAST_MMAP(filp, val) \ | |
44 | + { /* nothing */ } | |
45 | + | |
46 | +static int get_offset(unsigned int last_mmap) | |
37 | 47 | { |
38 | - struct vm_unmapped_area_info info; | |
48 | + return (last_mmap & (SHMLBA-1)) >> PAGE_SHIFT; | |
49 | +} | |
39 | 50 | |
40 | - info.flags = 0; | |
41 | - info.length = len; | |
42 | - info.low_limit = PAGE_ALIGN(addr); | |
43 | - info.high_limit = TASK_SIZE; | |
44 | - info.align_mask = 0; | |
45 | - info.align_offset = 0; | |
46 | - return vm_unmapped_area(&info); | |
51 | +static unsigned long shared_align_offset(unsigned int last_mmap, | |
52 | + unsigned long pgoff) | |
53 | +{ | |
54 | + return (get_offset(last_mmap) + pgoff) << PAGE_SHIFT; | |
47 | 55 | } |
48 | 56 | |
49 | -/* | |
50 | - * We need to know the offset to use. Old scheme was to look for | |
51 | - * existing mapping and use the same offset. New scheme is to use the | |
52 | - * address of the kernel data structure as the seed for the offset. | |
53 | - * We'll see how that works... | |
54 | - * | |
55 | - * The mapping is cacheline aligned, so there's no information in the bottom | |
56 | - * few bits of the address. We're looking for 10 bits (4MB / 4k), so let's | |
57 | - * drop the bottom 8 bits and use bits 8-17. | |
58 | - */ | |
59 | -static int get_offset(struct address_space *mapping) | |
57 | +static inline unsigned long COLOR_ALIGN(unsigned long addr, | |
58 | + unsigned int last_mmap, unsigned long pgoff) | |
60 | 59 | { |
61 | - return (unsigned long) mapping >> 8; | |
60 | + unsigned long base = (addr+SHMLBA-1) & ~(SHMLBA-1); | |
61 | + unsigned long off = (SHMLBA-1) & | |
62 | + (shared_align_offset(last_mmap, pgoff) << PAGE_SHIFT); | |
63 | + | |
64 | + return base + off; | |
62 | 65 | } |
63 | 66 | |
64 | -static unsigned long shared_align_offset(struct file *filp, unsigned long pgoff) | |
67 | +/* | |
68 | + * Top of mmap area (just below the process stack). | |
69 | + */ | |
70 | + | |
71 | +static unsigned long mmap_upper_limit(void) | |
65 | 72 | { |
66 | - struct address_space *mapping = filp ? filp->f_mapping : NULL; | |
73 | + unsigned long stack_base; | |
67 | 74 | |
68 | - return (get_offset(mapping) + pgoff) << PAGE_SHIFT; | |
75 | + /* Limit stack size to 1GB - see setup_arg_pages() in fs/exec.c */ | |
76 | + stack_base = rlimit_max(RLIMIT_STACK); | |
77 | + if (stack_base > (1 << 30)) | |
78 | + stack_base = 1 << 30; | |
79 | + | |
80 | + return PAGE_ALIGN(STACK_TOP - stack_base); | |
69 | 81 | } |
70 | 82 | |
71 | -static unsigned long get_shared_area(struct file *filp, unsigned long addr, | |
72 | - unsigned long len, unsigned long pgoff) | |
83 | + | |
84 | +unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, | |
85 | + unsigned long len, unsigned long pgoff, unsigned long flags) | |
73 | 86 | { |
87 | + struct mm_struct *mm = current->mm; | |
88 | + struct vm_area_struct *vma; | |
89 | + unsigned long task_size = TASK_SIZE; | |
90 | + int do_color_align, last_mmap; | |
74 | 91 | struct vm_unmapped_area_info info; |
75 | 92 | |
93 | + if (len > task_size) | |
94 | + return -ENOMEM; | |
95 | + | |
96 | + do_color_align = 0; | |
97 | + if (filp || (flags & MAP_SHARED)) | |
98 | + do_color_align = 1; | |
99 | + last_mmap = GET_LAST_MMAP(filp); | |
100 | + | |
101 | + if (flags & MAP_FIXED) { | |
102 | + if ((flags & MAP_SHARED) && last_mmap && | |
103 | + (addr - shared_align_offset(last_mmap, pgoff)) | |
104 | + & (SHMLBA - 1)) | |
105 | + return -EINVAL; | |
106 | + goto found_addr; | |
107 | + } | |
108 | + | |
109 | + if (addr) { | |
110 | + if (do_color_align && last_mmap) | |
111 | + addr = COLOR_ALIGN(addr, last_mmap, pgoff); | |
112 | + else | |
113 | + addr = PAGE_ALIGN(addr); | |
114 | + | |
115 | + vma = find_vma(mm, addr); | |
116 | + if (task_size - len >= addr && | |
117 | + (!vma || addr + len <= vma->vm_start)) | |
118 | + goto found_addr; | |
119 | + } | |
120 | + | |
76 | 121 | info.flags = 0; |
77 | 122 | info.length = len; |
78 | - info.low_limit = PAGE_ALIGN(addr); | |
79 | - info.high_limit = TASK_SIZE; | |
80 | - info.align_mask = PAGE_MASK & (SHMLBA - 1); | |
81 | - info.align_offset = shared_align_offset(filp, pgoff); | |
82 | - return vm_unmapped_area(&info); | |
123 | + info.low_limit = mm->mmap_legacy_base; | |
124 | + info.high_limit = mmap_upper_limit(); | |
125 | + info.align_mask = last_mmap ? (PAGE_MASK & (SHMLBA - 1)) : 0; | |
126 | + info.align_offset = shared_align_offset(last_mmap, pgoff); | |
127 | + addr = vm_unmapped_area(&info); | |
128 | + | |
129 | +found_addr: | |
130 | + if (do_color_align && !last_mmap && !(addr & ~PAGE_MASK)) | |
131 | + SET_LAST_MMAP(filp, addr - (pgoff << PAGE_SHIFT)); | |
132 | + | |
133 | + return addr; | |
83 | 134 | } |
84 | 135 | |
85 | -unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, | |
86 | - unsigned long len, unsigned long pgoff, unsigned long flags) | |
136 | +unsigned long | |
137 | +arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, | |
138 | + const unsigned long len, const unsigned long pgoff, | |
139 | + const unsigned long flags) | |
87 | 140 | { |
141 | + struct vm_area_struct *vma; | |
142 | + struct mm_struct *mm = current->mm; | |
143 | + unsigned long addr = addr0; | |
144 | + int do_color_align, last_mmap; | |
145 | + struct vm_unmapped_area_info info; | |
146 | + | |
147 | +#ifdef CONFIG_64BIT | |
148 | + /* This should only ever run for 32-bit processes. */ | |
149 | + BUG_ON(!test_thread_flag(TIF_32BIT)); | |
150 | +#endif | |
151 | + | |
152 | + /* requested length too big for entire address space */ | |
88 | 153 | if (len > TASK_SIZE) |
89 | 154 | return -ENOMEM; |
155 | + | |
156 | + do_color_align = 0; | |
157 | + if (filp || (flags & MAP_SHARED)) | |
158 | + do_color_align = 1; | |
159 | + last_mmap = GET_LAST_MMAP(filp); | |
160 | + | |
90 | 161 | if (flags & MAP_FIXED) { |
91 | - if ((flags & MAP_SHARED) && | |
92 | - (addr - shared_align_offset(filp, pgoff)) & (SHMLBA - 1)) | |
162 | + if ((flags & MAP_SHARED) && last_mmap && | |
163 | + (addr - shared_align_offset(last_mmap, pgoff)) | |
164 | + & (SHMLBA - 1)) | |
93 | 165 | return -EINVAL; |
94 | - return addr; | |
166 | + goto found_addr; | |
95 | 167 | } |
96 | - if (!addr) | |
97 | - addr = TASK_UNMAPPED_BASE; | |
98 | 168 | |
99 | - if (filp || (flags & MAP_SHARED)) | |
100 | - addr = get_shared_area(filp, addr, len, pgoff); | |
101 | - else | |
102 | - addr = get_unshared_area(addr, len); | |
169 | + /* requesting a specific address */ | |
170 | + if (addr) { | |
171 | + if (do_color_align && last_mmap) | |
172 | + addr = COLOR_ALIGN(addr, last_mmap, pgoff); | |
173 | + else | |
174 | + addr = PAGE_ALIGN(addr); | |
175 | + vma = find_vma(mm, addr); | |
176 | + if (TASK_SIZE - len >= addr && | |
177 | + (!vma || addr + len <= vma->vm_start)) | |
178 | + goto found_addr; | |
179 | + } | |
103 | 180 | |
181 | + info.flags = VM_UNMAPPED_AREA_TOPDOWN; | |
182 | + info.length = len; | |
183 | + info.low_limit = PAGE_SIZE; | |
184 | + info.high_limit = mm->mmap_base; | |
185 | + info.align_mask = last_mmap ? (PAGE_MASK & (SHMLBA - 1)) : 0; | |
186 | + info.align_offset = shared_align_offset(last_mmap, pgoff); | |
187 | + addr = vm_unmapped_area(&info); | |
188 | + if (!(addr & ~PAGE_MASK)) | |
189 | + goto found_addr; | |
190 | + VM_BUG_ON(addr != -ENOMEM); | |
191 | + | |
192 | + /* | |
193 | + * A failed mmap() very likely causes application failure, | |
194 | + * so fall back to the bottom-up function here. This scenario | |
195 | + * can happen with large stack limits and large mmap() | |
196 | + * allocations. | |
197 | + */ | |
198 | + return arch_get_unmapped_area(filp, addr0, len, pgoff, flags); | |
199 | + | |
200 | +found_addr: | |
201 | + if (do_color_align && !last_mmap && !(addr & ~PAGE_MASK)) | |
202 | + SET_LAST_MMAP(filp, addr - (pgoff << PAGE_SHIFT)); | |
203 | + | |
104 | 204 | return addr; |
105 | 205 | } |
206 | + | |
207 | +static int mmap_is_legacy(void) | |
208 | +{ | |
209 | + if (current->personality & ADDR_COMPAT_LAYOUT) | |
210 | + return 1; | |
211 | + | |
212 | + /* parisc stack always grows up - so a unlimited stack should | |
213 | + * not be an indicator to use the legacy memory layout. | |
214 | + * if (rlimit(RLIMIT_STACK) == RLIM_INFINITY) | |
215 | + * return 1; | |
216 | + */ | |
217 | + | |
218 | + return sysctl_legacy_va_layout; | |
219 | +} | |
220 | + | |
221 | +static unsigned long mmap_rnd(void) | |
222 | +{ | |
223 | + unsigned long rnd = 0; | |
224 | + | |
225 | + /* | |
226 | + * 8 bits of randomness in 32bit mmaps, 20 address space bits | |
227 | + * 28 bits of randomness in 64bit mmaps, 40 address space bits | |
228 | + */ | |
229 | + if (current->flags & PF_RANDOMIZE) { | |
230 | + if (is_32bit_task()) | |
231 | + rnd = get_random_int() % (1<<8); | |
232 | + else | |
233 | + rnd = get_random_int() % (1<<28); | |
234 | + } | |
235 | + return rnd << PAGE_SHIFT; | |
236 | +} | |
237 | + | |
238 | +static unsigned long mmap_legacy_base(void) | |
239 | +{ | |
240 | + return TASK_UNMAPPED_BASE + mmap_rnd(); | |
241 | +} | |
242 | + | |
243 | +/* | |
244 | + * This function, called very early during the creation of a new | |
245 | + * process VM image, sets up which VM layout function to use: | |
246 | + */ | |
247 | +void arch_pick_mmap_layout(struct mm_struct *mm) | |
248 | +{ | |
249 | + mm->mmap_legacy_base = mmap_legacy_base(); | |
250 | + mm->mmap_base = mmap_upper_limit(); | |
251 | + | |
252 | + if (mmap_is_legacy()) { | |
253 | + mm->mmap_base = mm->mmap_legacy_base; | |
254 | + mm->get_unmapped_area = arch_get_unmapped_area; | |
255 | + } else { | |
256 | + mm->get_unmapped_area = arch_get_unmapped_area_topdown; | |
257 | + } | |
258 | +} | |
259 | + | |
106 | 260 | |
107 | 261 | asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len, |
108 | 262 | unsigned long prot, unsigned long flags, unsigned long fd, |
arch/parisc/kernel/syscall_table.S
drivers/video/console/sticore.c
lib/fonts/Kconfig
... | ... | @@ -9,7 +9,7 @@ |
9 | 9 | |
10 | 10 | config FONTS |
11 | 11 | bool "Select compiled-in fonts" |
12 | - depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE | |
12 | + depends on FRAMEBUFFER_CONSOLE | |
13 | 13 | help |
14 | 14 | Say Y here if you would like to use fonts other than the default |
15 | 15 | your frame buffer console usually use. |
... | ... | @@ -22,7 +22,7 @@ |
22 | 22 | |
23 | 23 | config FONT_8x8 |
24 | 24 | bool "VGA 8x8 font" if FONTS |
25 | - depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE | |
25 | + depends on FRAMEBUFFER_CONSOLE | |
26 | 26 | default y if !SPARC && !FONTS |
27 | 27 | help |
28 | 28 | This is the "high resolution" font for the VGA frame buffer (the one |
... | ... | @@ -45,7 +45,7 @@ |
45 | 45 | |
46 | 46 | config FONT_6x11 |
47 | 47 | bool "Mac console 6x11 font (not supported by all drivers)" if FONTS |
48 | - depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE | |
48 | + depends on FRAMEBUFFER_CONSOLE | |
49 | 49 | default y if !SPARC && !FONTS && MAC |
50 | 50 | help |
51 | 51 | Small console font with Macintosh-style high-half glyphs. Some Mac |