diff options
| -rw-r--r-- | arch/parisc/include/asm/cacheflush.h | 2 | ||||
| -rw-r--r-- | arch/parisc/include/asm/elf.h | 4 | ||||
| -rw-r--r-- | arch/parisc/include/asm/page.h | 3 | ||||
| -rw-r--r-- | arch/parisc/include/asm/pgtable.h | 1 | ||||
| -rw-r--r-- | arch/parisc/include/asm/processor.h | 2 | ||||
| -rw-r--r-- | arch/parisc/include/asm/thread_info.h | 10 | ||||
| -rw-r--r-- | arch/parisc/include/uapi/asm/errno.h | 2 | ||||
| -rw-r--r-- | arch/parisc/include/uapi/asm/stat.h | 40 | ||||
| -rw-r--r-- | arch/parisc/include/uapi/asm/unistd.h | 4 | ||||
| -rw-r--r-- | arch/parisc/kernel/cache.c | 14 | ||||
| -rw-r--r-- | arch/parisc/kernel/process.c | 21 | ||||
| -rw-r--r-- | arch/parisc/kernel/sys_parisc.c | 238 | ||||
| -rw-r--r-- | arch/parisc/kernel/syscall_table.S | 2 | ||||
| -rw-r--r-- | drivers/video/console/sticore.c | 2 | ||||
| -rw-r--r-- | lib/fonts/Kconfig | 6 |
15 files changed, 278 insertions, 73 deletions
diff --git a/arch/parisc/include/asm/cacheflush.h b/arch/parisc/include/asm/cacheflush.h index 2f9b751878ba..de65f66ea64e 100644 --- a/arch/parisc/include/asm/cacheflush.h +++ b/arch/parisc/include/asm/cacheflush.h | |||
| @@ -132,7 +132,6 @@ void mark_rodata_ro(void); | |||
| 132 | static inline void *kmap(struct page *page) | 132 | static inline void *kmap(struct page *page) |
| 133 | { | 133 | { |
| 134 | might_sleep(); | 134 | might_sleep(); |
| 135 | flush_dcache_page(page); | ||
| 136 | return page_address(page); | 135 | return page_address(page); |
| 137 | } | 136 | } |
| 138 | 137 | ||
| @@ -144,7 +143,6 @@ static inline void kunmap(struct page *page) | |||
| 144 | static inline void *kmap_atomic(struct page *page) | 143 | static inline void *kmap_atomic(struct page *page) |
| 145 | { | 144 | { |
| 146 | pagefault_disable(); | 145 | pagefault_disable(); |
| 147 | flush_dcache_page(page); | ||
| 148 | return page_address(page); | 146 | return page_address(page); |
| 149 | } | 147 | } |
| 150 | 148 | ||
diff --git a/arch/parisc/include/asm/elf.h b/arch/parisc/include/asm/elf.h index ad2b50397894..3391d061eccc 100644 --- a/arch/parisc/include/asm/elf.h +++ b/arch/parisc/include/asm/elf.h | |||
| @@ -348,4 +348,8 @@ struct pt_regs; /* forward declaration... */ | |||
| 348 | 348 | ||
| 349 | #define ELF_HWCAP 0 | 349 | #define ELF_HWCAP 0 |
| 350 | 350 | ||
| 351 | struct mm_struct; | ||
| 352 | extern unsigned long arch_randomize_brk(struct mm_struct *); | ||
| 353 | #define arch_randomize_brk arch_randomize_brk | ||
| 354 | |||
| 351 | #endif | 355 | #endif |
diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h index c53fc63149e8..637fe031aa84 100644 --- a/arch/parisc/include/asm/page.h +++ b/arch/parisc/include/asm/page.h | |||
| @@ -29,7 +29,8 @@ struct page; | |||
| 29 | void clear_page_asm(void *page); | 29 | void clear_page_asm(void *page); |
| 30 | void copy_page_asm(void *to, void *from); | 30 | void copy_page_asm(void *to, void *from); |
| 31 | #define clear_user_page(vto, vaddr, page) clear_page_asm(vto) | 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 | /* #define CONFIG_PARISC_TMPALIAS */ | 35 | /* #define CONFIG_PARISC_TMPALIAS */ |
| 35 | 36 | ||
diff --git a/arch/parisc/include/asm/pgtable.h b/arch/parisc/include/asm/pgtable.h index 34899b5d959a..22b89d1edba7 100644 --- a/arch/parisc/include/asm/pgtable.h +++ b/arch/parisc/include/asm/pgtable.h | |||
| @@ -511,6 +511,7 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, | |||
| 511 | /* We provide our own get_unmapped_area to provide cache coherency */ | 511 | /* We provide our own get_unmapped_area to provide cache coherency */ |
| 512 | 512 | ||
| 513 | #define HAVE_ARCH_UNMAPPED_AREA | 513 | #define HAVE_ARCH_UNMAPPED_AREA |
| 514 | #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN | ||
| 514 | 515 | ||
| 515 | #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG | 516 | #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG |
| 516 | #define __HAVE_ARCH_PTEP_GET_AND_CLEAR | 517 | #define __HAVE_ARCH_PTEP_GET_AND_CLEAR |
diff --git a/arch/parisc/include/asm/processor.h b/arch/parisc/include/asm/processor.h index cc2290a3cace..198a86feb574 100644 --- a/arch/parisc/include/asm/processor.h +++ b/arch/parisc/include/asm/processor.h | |||
| @@ -30,6 +30,8 @@ | |||
| 30 | #endif | 30 | #endif |
| 31 | #define current_text_addr() ({ void *pc; current_ia(pc); pc; }) | 31 | #define current_text_addr() ({ void *pc; current_ia(pc); pc; }) |
| 32 | 32 | ||
| 33 | #define HAVE_ARCH_PICK_MMAP_LAYOUT | ||
| 34 | |||
| 33 | #define TASK_SIZE_OF(tsk) ((tsk)->thread.task_size) | 35 | #define TASK_SIZE_OF(tsk) ((tsk)->thread.task_size) |
| 34 | #define TASK_SIZE TASK_SIZE_OF(current) | 36 | #define TASK_SIZE TASK_SIZE_OF(current) |
| 35 | #define TASK_UNMAPPED_BASE (current->thread.map_base) | 37 | #define TASK_UNMAPPED_BASE (current->thread.map_base) |
diff --git a/arch/parisc/include/asm/thread_info.h b/arch/parisc/include/asm/thread_info.h index d5f97ea3a4e1..4b9b10ce1f9d 100644 --- a/arch/parisc/include/asm/thread_info.h +++ b/arch/parisc/include/asm/thread_info.h | |||
| @@ -76,6 +76,16 @@ struct thread_info { | |||
| 76 | #define _TIF_SYSCALL_TRACE_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \ | 76 | #define _TIF_SYSCALL_TRACE_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \ |
| 77 | _TIF_BLOCKSTEP | _TIF_SYSCALL_AUDIT) | 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 | #endif /* __KERNEL__ */ | 89 | #endif /* __KERNEL__ */ |
| 80 | 90 | ||
| 81 | #endif /* _ASM_PARISC_THREAD_INFO_H */ | 91 | #endif /* _ASM_PARISC_THREAD_INFO_H */ |
diff --git a/arch/parisc/include/uapi/asm/errno.h b/arch/parisc/include/uapi/asm/errno.h index f3a8aa554841..c0ae62520d15 100644 --- a/arch/parisc/include/uapi/asm/errno.h +++ b/arch/parisc/include/uapi/asm/errno.h | |||
| @@ -106,7 +106,7 @@ | |||
| 106 | 106 | ||
| 107 | #define EALREADY 244 /* Operation already in progress */ | 107 | #define EALREADY 244 /* Operation already in progress */ |
| 108 | #define EINPROGRESS 245 /* Operation now in progress */ | 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 | #define ENOTEMPTY 247 /* Directory not empty */ | 110 | #define ENOTEMPTY 247 /* Directory not empty */ |
| 111 | #define ENAMETOOLONG 248 /* File name too long */ | 111 | #define ENAMETOOLONG 248 /* File name too long */ |
| 112 | #define ELOOP 249 /* Too many symbolic links encountered */ | 112 | #define ELOOP 249 /* Too many symbolic links encountered */ |
diff --git a/arch/parisc/include/uapi/asm/stat.h b/arch/parisc/include/uapi/asm/stat.h index d76fbda5d62c..b606b366d0a7 100644 --- a/arch/parisc/include/uapi/asm/stat.h +++ b/arch/parisc/include/uapi/asm/stat.h | |||
| @@ -5,67 +5,65 @@ | |||
| 5 | 5 | ||
| 6 | struct stat { | 6 | struct stat { |
| 7 | unsigned int st_dev; /* dev_t is 32 bits on parisc */ | 7 | unsigned int st_dev; /* dev_t is 32 bits on parisc */ |
| 8 | ino_t st_ino; /* 32 bits */ | 8 | unsigned int st_ino; /* 32 bits */ |
| 9 | mode_t st_mode; /* 16 bits */ | 9 | unsigned short st_mode; /* 16 bits */ |
| 10 | unsigned short st_nlink; /* 16 bits */ | 10 | unsigned short st_nlink; /* 16 bits */ |
| 11 | unsigned short st_reserved1; /* old st_uid */ | 11 | unsigned short st_reserved1; /* old st_uid */ |
| 12 | unsigned short st_reserved2; /* old st_gid */ | 12 | unsigned short st_reserved2; /* old st_gid */ |
| 13 | unsigned int st_rdev; | 13 | unsigned int st_rdev; |
| 14 | off_t st_size; | 14 | signed int st_size; |
| 15 | time_t st_atime; | 15 | signed int st_atime; |
| 16 | unsigned int st_atime_nsec; | 16 | unsigned int st_atime_nsec; |
| 17 | time_t st_mtime; | 17 | signed int st_mtime; |
| 18 | unsigned int st_mtime_nsec; | 18 | unsigned int st_mtime_nsec; |
| 19 | time_t st_ctime; | 19 | signed int st_ctime; |
| 20 | unsigned int st_ctime_nsec; | 20 | unsigned int st_ctime_nsec; |
| 21 | int st_blksize; | 21 | int st_blksize; |
| 22 | int st_blocks; | 22 | int st_blocks; |
| 23 | unsigned int __unused1; /* ACL stuff */ | 23 | unsigned int __unused1; /* ACL stuff */ |
| 24 | unsigned int __unused2; /* network */ | 24 | unsigned int __unused2; /* network */ |
| 25 | ino_t __unused3; /* network */ | 25 | unsigned int __unused3; /* network */ |
| 26 | unsigned int __unused4; /* cnodes */ | 26 | unsigned int __unused4; /* cnodes */ |
| 27 | unsigned short __unused5; /* netsite */ | 27 | unsigned short __unused5; /* netsite */ |
| 28 | short st_fstype; | 28 | short st_fstype; |
| 29 | unsigned int st_realdev; | 29 | unsigned int st_realdev; |
| 30 | unsigned short st_basemode; | 30 | unsigned short st_basemode; |
| 31 | unsigned short st_spareshort; | 31 | unsigned short st_spareshort; |
| 32 | uid_t st_uid; | 32 | unsigned int st_uid; |
| 33 | gid_t st_gid; | 33 | unsigned int st_gid; |
| 34 | unsigned int st_spare4[3]; | 34 | unsigned int st_spare4[3]; |
| 35 | }; | 35 | }; |
| 36 | 36 | ||
| 37 | #define STAT_HAVE_NSEC | 37 | #define STAT_HAVE_NSEC |
| 38 | 38 | ||
| 39 | typedef __kernel_off64_t off64_t; | ||
| 40 | |||
| 41 | struct hpux_stat64 { | 39 | struct hpux_stat64 { |
| 42 | unsigned int st_dev; /* dev_t is 32 bits on parisc */ | 40 | unsigned int st_dev; /* dev_t is 32 bits on parisc */ |
| 43 | ino_t st_ino; /* 32 bits */ | 41 | unsigned int st_ino; /* 32 bits */ |
| 44 | mode_t st_mode; /* 16 bits */ | 42 | unsigned short st_mode; /* 16 bits */ |
| 45 | unsigned short st_nlink; /* 16 bits */ | 43 | unsigned short st_nlink; /* 16 bits */ |
| 46 | unsigned short st_reserved1; /* old st_uid */ | 44 | unsigned short st_reserved1; /* old st_uid */ |
| 47 | unsigned short st_reserved2; /* old st_gid */ | 45 | unsigned short st_reserved2; /* old st_gid */ |
| 48 | unsigned int st_rdev; | 46 | unsigned int st_rdev; |
| 49 | off64_t st_size; | 47 | signed long long st_size; |
| 50 | time_t st_atime; | 48 | signed int st_atime; |
| 51 | unsigned int st_spare1; | 49 | unsigned int st_spare1; |
| 52 | time_t st_mtime; | 50 | signed int st_mtime; |
| 53 | unsigned int st_spare2; | 51 | unsigned int st_spare2; |
| 54 | time_t st_ctime; | 52 | signed int st_ctime; |
| 55 | unsigned int st_spare3; | 53 | unsigned int st_spare3; |
| 56 | int st_blksize; | 54 | int st_blksize; |
| 57 | __u64 st_blocks; | 55 | unsigned long long st_blocks; |
| 58 | unsigned int __unused1; /* ACL stuff */ | 56 | unsigned int __unused1; /* ACL stuff */ |
| 59 | unsigned int __unused2; /* network */ | 57 | unsigned int __unused2; /* network */ |
| 60 | ino_t __unused3; /* network */ | 58 | unsigned int __unused3; /* network */ |
| 61 | unsigned int __unused4; /* cnodes */ | 59 | unsigned int __unused4; /* cnodes */ |
| 62 | unsigned short __unused5; /* netsite */ | 60 | unsigned short __unused5; /* netsite */ |
| 63 | short st_fstype; | 61 | short st_fstype; |
| 64 | unsigned int st_realdev; | 62 | unsigned int st_realdev; |
| 65 | unsigned short st_basemode; | 63 | unsigned short st_basemode; |
| 66 | unsigned short st_spareshort; | 64 | unsigned short st_spareshort; |
| 67 | uid_t st_uid; | 65 | unsigned int st_uid; |
| 68 | gid_t st_gid; | 66 | unsigned int st_gid; |
| 69 | unsigned int st_spare4[3]; | 67 | unsigned int st_spare4[3]; |
| 70 | }; | 68 | }; |
| 71 | 69 | ||
diff --git a/arch/parisc/include/uapi/asm/unistd.h b/arch/parisc/include/uapi/asm/unistd.h index 2c8b9bde18eb..42706794a36f 100644 --- a/arch/parisc/include/uapi/asm/unistd.h +++ b/arch/parisc/include/uapi/asm/unistd.h | |||
| @@ -826,8 +826,10 @@ | |||
| 826 | #define __NR_process_vm_writev (__NR_Linux + 331) | 826 | #define __NR_process_vm_writev (__NR_Linux + 331) |
| 827 | #define __NR_kcmp (__NR_Linux + 332) | 827 | #define __NR_kcmp (__NR_Linux + 332) |
| 828 | #define __NR_finit_module (__NR_Linux + 333) | 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 | #define __IGNORE_select /* newselect */ | 835 | #define __IGNORE_select /* newselect */ |
diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index a72545554a31..ac87a40502e6 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c | |||
| @@ -388,6 +388,20 @@ void flush_kernel_dcache_page_addr(void *addr) | |||
| 388 | } | 388 | } |
| 389 | EXPORT_SYMBOL(flush_kernel_dcache_page_addr); | 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 | void purge_tlb_entries(struct mm_struct *mm, unsigned long addr) | 405 | void purge_tlb_entries(struct mm_struct *mm, unsigned long addr) |
| 392 | { | 406 | { |
| 393 | unsigned long flags; | 407 | unsigned long flags; |
diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c index 55f92b614182..0bbbf0d3f608 100644 --- a/arch/parisc/kernel/process.c +++ b/arch/parisc/kernel/process.c | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | * Copyright (C) 2000 Grant Grundler <grundler with parisc-linux.org> | 13 | * Copyright (C) 2000 Grant Grundler <grundler with parisc-linux.org> |
| 14 | * Copyright (C) 2001 Alan Modra <amodra at parisc-linux.org> | 14 | * Copyright (C) 2001 Alan Modra <amodra at parisc-linux.org> |
| 15 | * Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org> | 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 | * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> | 17 | * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> |
| 18 | * | 18 | * |
| 19 | * | 19 | * |
| @@ -49,6 +49,7 @@ | |||
| 49 | #include <linux/kallsyms.h> | 49 | #include <linux/kallsyms.h> |
| 50 | #include <linux/uaccess.h> | 50 | #include <linux/uaccess.h> |
| 51 | #include <linux/rcupdate.h> | 51 | #include <linux/rcupdate.h> |
| 52 | #include <linux/random.h> | ||
| 52 | 53 | ||
| 53 | #include <asm/io.h> | 54 | #include <asm/io.h> |
| 54 | #include <asm/asm-offsets.h> | 55 | #include <asm/asm-offsets.h> |
| @@ -286,3 +287,21 @@ void *dereference_function_descriptor(void *ptr) | |||
| 286 | return ptr; | 287 | return ptr; |
| 287 | } | 288 | } |
| 288 | #endif | 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 | } | ||
diff --git a/arch/parisc/kernel/sys_parisc.c b/arch/parisc/kernel/sys_parisc.c index 0d3a9d4927b5..b7cadc4a06cd 100644 --- a/arch/parisc/kernel/sys_parisc.c +++ b/arch/parisc/kernel/sys_parisc.c | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | * Copyright (C) 1999-2003 Matthew Wilcox <willy at parisc-linux.org> | 5 | * Copyright (C) 1999-2003 Matthew Wilcox <willy at parisc-linux.org> |
| 6 | * Copyright (C) 2000-2003 Paul Bame <bame at parisc-linux.org> | 6 | * Copyright (C) 2000-2003 Paul Bame <bame at parisc-linux.org> |
| 7 | * Copyright (C) 2001 Thomas Bogendoerfer <tsbogend at parisc-linux.org> | 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 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
| @@ -23,6 +24,7 @@ | |||
| 23 | */ | 24 | */ |
| 24 | 25 | ||
| 25 | #include <asm/uaccess.h> | 26 | #include <asm/uaccess.h> |
| 27 | #include <asm/elf.h> | ||
| 26 | #include <linux/file.h> | 28 | #include <linux/file.h> |
| 27 | #include <linux/fs.h> | 29 | #include <linux/fs.h> |
| 28 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
| @@ -32,78 +34,230 @@ | |||
| 32 | #include <linux/syscalls.h> | 34 | #include <linux/syscalls.h> |
| 33 | #include <linux/utsname.h> | 35 | #include <linux/utsname.h> |
| 34 | #include <linux/personality.h> | 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; | 51 | static unsigned long shared_align_offset(unsigned int last_mmap, |
| 41 | info.length = len; | 52 | unsigned long pgoff) |
| 42 | info.low_limit = PAGE_ALIGN(addr); | 53 | { |
| 43 | info.high_limit = TASK_SIZE; | 54 | return (get_offset(last_mmap) + pgoff) << PAGE_SHIFT; |
| 44 | info.align_mask = 0; | ||
| 45 | info.align_offset = 0; | ||
| 46 | return vm_unmapped_area(&info); | ||
| 47 | } | 55 | } |
| 48 | 56 | ||
| 49 | /* | 57 | static inline unsigned long COLOR_ALIGN(unsigned long addr, |
| 50 | * We need to know the offset to use. Old scheme was to look for | 58 | unsigned int last_mmap, unsigned long pgoff) |
| 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) | ||
| 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, | 83 | |
| 72 | unsigned long len, unsigned long pgoff) | 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 | struct vm_unmapped_area_info info; | 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 | info.flags = 0; | 121 | info.flags = 0; |
| 77 | info.length = len; | 122 | info.length = len; |
| 78 | info.low_limit = PAGE_ALIGN(addr); | 123 | info.low_limit = mm->mmap_legacy_base; |
| 79 | info.high_limit = TASK_SIZE; | 124 | info.high_limit = mmap_upper_limit(); |
| 80 | info.align_mask = PAGE_MASK & (SHMLBA - 1); | 125 | info.align_mask = last_mmap ? (PAGE_MASK & (SHMLBA - 1)) : 0; |
| 81 | info.align_offset = shared_align_offset(filp, pgoff); | 126 | info.align_offset = shared_align_offset(last_mmap, pgoff); |
| 82 | return vm_unmapped_area(&info); | 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, | 136 | unsigned long |
| 86 | unsigned long len, unsigned long pgoff, unsigned long flags) | 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 | if (len > TASK_SIZE) | 153 | if (len > TASK_SIZE) |
| 89 | return -ENOMEM; | 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 | if (flags & MAP_FIXED) { | 161 | if (flags & MAP_FIXED) { |
| 91 | if ((flags & MAP_SHARED) && | 162 | if ((flags & MAP_SHARED) && last_mmap && |
| 92 | (addr - shared_align_offset(filp, pgoff)) & (SHMLBA - 1)) | 163 | (addr - shared_align_offset(last_mmap, pgoff)) |
| 164 | & (SHMLBA - 1)) | ||
| 93 | return -EINVAL; | 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)) | 169 | /* requesting a specific address */ |
| 100 | addr = get_shared_area(filp, addr, len, pgoff); | 170 | if (addr) { |
| 101 | else | 171 | if (do_color_align && last_mmap) |
| 102 | addr = get_unshared_area(addr, len); | 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 | } | ||
| 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)); | ||
| 103 | 203 | ||
| 104 | return addr; | 204 | return addr; |
| 105 | } | 205 | } |
| 106 | 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 | |||
| 260 | |||
| 107 | asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len, | 261 | asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len, |
| 108 | unsigned long prot, unsigned long flags, unsigned long fd, | 262 | unsigned long prot, unsigned long flags, unsigned long fd, |
| 109 | unsigned long pgoff) | 263 | unsigned long pgoff) |
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index 0c9107285e66..8fa3fbb3e4d3 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S | |||
| @@ -429,6 +429,8 @@ | |||
| 429 | ENTRY_COMP(process_vm_writev) | 429 | ENTRY_COMP(process_vm_writev) |
| 430 | ENTRY_SAME(kcmp) | 430 | ENTRY_SAME(kcmp) |
| 431 | ENTRY_SAME(finit_module) | 431 | ENTRY_SAME(finit_module) |
| 432 | ENTRY_SAME(sched_setattr) | ||
| 433 | ENTRY_SAME(sched_getattr) /* 335 */ | ||
| 432 | 434 | ||
| 433 | /* Nothing yet */ | 435 | /* Nothing yet */ |
| 434 | 436 | ||
diff --git a/drivers/video/console/sticore.c b/drivers/video/console/sticore.c index 4ad24f2c6472..cecd3de01c24 100644 --- a/drivers/video/console/sticore.c +++ b/drivers/video/console/sticore.c | |||
| @@ -488,7 +488,7 @@ static int sti_init_glob_cfg(struct sti_struct *sti, unsigned long rom_address, | |||
| 488 | return 0; | 488 | return 0; |
| 489 | } | 489 | } |
| 490 | 490 | ||
| 491 | #ifdef CONFIG_FONTS | 491 | #ifdef CONFIG_FONT_SUPPORT |
| 492 | static struct sti_cooked_font * | 492 | static struct sti_cooked_font * |
| 493 | sti_select_fbfont(struct sti_cooked_rom *cooked_rom, const char *fbfont_name) | 493 | sti_select_fbfont(struct sti_cooked_rom *cooked_rom, const char *fbfont_name) |
| 494 | { | 494 | { |
diff --git a/lib/fonts/Kconfig b/lib/fonts/Kconfig index 34fd931b54b5..4dc1b990aa23 100644 --- a/lib/fonts/Kconfig +++ b/lib/fonts/Kconfig | |||
| @@ -9,7 +9,7 @@ if FONT_SUPPORT | |||
| 9 | 9 | ||
| 10 | config FONTS | 10 | config FONTS |
| 11 | bool "Select compiled-in fonts" | 11 | bool "Select compiled-in fonts" |
| 12 | depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE | 12 | depends on FRAMEBUFFER_CONSOLE |
| 13 | help | 13 | help |
| 14 | Say Y here if you would like to use fonts other than the default | 14 | Say Y here if you would like to use fonts other than the default |
| 15 | your frame buffer console usually use. | 15 | your frame buffer console usually use. |
| @@ -22,7 +22,7 @@ config FONTS | |||
| 22 | 22 | ||
| 23 | config FONT_8x8 | 23 | config FONT_8x8 |
| 24 | bool "VGA 8x8 font" if FONTS | 24 | bool "VGA 8x8 font" if FONTS |
| 25 | depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE | 25 | depends on FRAMEBUFFER_CONSOLE |
| 26 | default y if !SPARC && !FONTS | 26 | default y if !SPARC && !FONTS |
| 27 | help | 27 | help |
| 28 | This is the "high resolution" font for the VGA frame buffer (the one | 28 | This is the "high resolution" font for the VGA frame buffer (the one |
| @@ -45,7 +45,7 @@ config FONT_8x16 | |||
| 45 | 45 | ||
| 46 | config FONT_6x11 | 46 | config FONT_6x11 |
| 47 | bool "Mac console 6x11 font (not supported by all drivers)" if FONTS | 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 | default y if !SPARC && !FONTS && MAC | 49 | default y if !SPARC && !FONTS && MAC |
| 50 | help | 50 | help |
| 51 | Small console font with Macintosh-style high-half glyphs. Some Mac | 51 | Small console font with Macintosh-style high-half glyphs. Some Mac |
