Commit 69048e01 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 1c0b8a7a 9dabf60d
...@@ -132,7 +132,6 @@ void mark_rodata_ro(void); ...@@ -132,7 +132,6 @@ void mark_rodata_ro(void);
static inline void *kmap(struct page *page) static inline void *kmap(struct page *page)
{ {
might_sleep(); might_sleep();
flush_dcache_page(page);
return page_address(page); return page_address(page);
} }
...@@ -144,7 +143,6 @@ static inline void kunmap(struct page *page) ...@@ -144,7 +143,6 @@ static inline void kunmap(struct page *page)
static inline void *kmap_atomic(struct page *page) static inline void *kmap_atomic(struct page *page)
{ {
pagefault_disable(); pagefault_disable();
flush_dcache_page(page);
return page_address(page); return page_address(page);
} }
......
...@@ -348,4 +348,8 @@ struct pt_regs; /* forward declaration... */ ...@@ -348,4 +348,8 @@ struct pt_regs; /* forward declaration... */
#define ELF_HWCAP 0 #define ELF_HWCAP 0
struct mm_struct;
extern unsigned long arch_randomize_brk(struct mm_struct *);
#define arch_randomize_brk arch_randomize_brk
#endif #endif
...@@ -29,7 +29,8 @@ struct page; ...@@ -29,7 +29,8 @@ struct page;
void clear_page_asm(void *page); void clear_page_asm(void *page);
void copy_page_asm(void *to, void *from); void copy_page_asm(void *to, void *from);
#define clear_user_page(vto, vaddr, page) clear_page_asm(vto) #define clear_user_page(vto, vaddr, page) clear_page_asm(vto)
#define copy_user_page(vto, vfrom, vaddr, page) copy_page_asm(vto, vfrom) void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
struct page *pg);
/* #define CONFIG_PARISC_TMPALIAS */ /* #define CONFIG_PARISC_TMPALIAS */
......
...@@ -511,6 +511,7 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, ...@@ -511,6 +511,7 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
/* We provide our own get_unmapped_area to provide cache coherency */ /* We provide our own get_unmapped_area to provide cache coherency */
#define HAVE_ARCH_UNMAPPED_AREA #define HAVE_ARCH_UNMAPPED_AREA
#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
#define __HAVE_ARCH_PTEP_GET_AND_CLEAR #define __HAVE_ARCH_PTEP_GET_AND_CLEAR
......
...@@ -30,6 +30,8 @@ ...@@ -30,6 +30,8 @@
#endif #endif
#define current_text_addr() ({ void *pc; current_ia(pc); pc; }) #define current_text_addr() ({ void *pc; current_ia(pc); pc; })
#define HAVE_ARCH_PICK_MMAP_LAYOUT
#define TASK_SIZE_OF(tsk) ((tsk)->thread.task_size) #define TASK_SIZE_OF(tsk) ((tsk)->thread.task_size)
#define TASK_SIZE TASK_SIZE_OF(current) #define TASK_SIZE TASK_SIZE_OF(current)
#define TASK_UNMAPPED_BASE (current->thread.map_base) #define TASK_UNMAPPED_BASE (current->thread.map_base)
......
...@@ -76,6 +76,16 @@ struct thread_info { ...@@ -76,6 +76,16 @@ struct thread_info {
#define _TIF_SYSCALL_TRACE_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \ #define _TIF_SYSCALL_TRACE_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \
_TIF_BLOCKSTEP | _TIF_SYSCALL_AUDIT) _TIF_BLOCKSTEP | _TIF_SYSCALL_AUDIT)
#ifdef CONFIG_64BIT
# ifdef CONFIG_COMPAT
# define is_32bit_task() (test_thread_flag(TIF_32BIT))
# else
# define is_32bit_task() (0)
# endif
#else
# define is_32bit_task() (1)
#endif
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _ASM_PARISC_THREAD_INFO_H */ #endif /* _ASM_PARISC_THREAD_INFO_H */
...@@ -106,7 +106,7 @@ ...@@ -106,7 +106,7 @@
#define EALREADY 244 /* Operation already in progress */ #define EALREADY 244 /* Operation already in progress */
#define EINPROGRESS 245 /* Operation now in progress */ #define EINPROGRESS 245 /* Operation now in progress */
#define EWOULDBLOCK 246 /* Operation would block (Linux returns EAGAIN) */ #define EWOULDBLOCK EAGAIN /* Operation would block (Not HPUX compliant) */
#define ENOTEMPTY 247 /* Directory not empty */ #define ENOTEMPTY 247 /* Directory not empty */
#define ENAMETOOLONG 248 /* File name too long */ #define ENAMETOOLONG 248 /* File name too long */
#define ELOOP 249 /* Too many symbolic links encountered */ #define ELOOP 249 /* Too many symbolic links encountered */
......
...@@ -5,67 +5,65 @@ ...@@ -5,67 +5,65 @@
struct stat { struct stat {
unsigned int st_dev; /* dev_t is 32 bits on parisc */ unsigned int st_dev; /* dev_t is 32 bits on parisc */
ino_t st_ino; /* 32 bits */ unsigned int st_ino; /* 32 bits */
mode_t st_mode; /* 16 bits */ unsigned short st_mode; /* 16 bits */
unsigned short st_nlink; /* 16 bits */ unsigned short st_nlink; /* 16 bits */
unsigned short st_reserved1; /* old st_uid */ unsigned short st_reserved1; /* old st_uid */
unsigned short st_reserved2; /* old st_gid */ unsigned short st_reserved2; /* old st_gid */
unsigned int st_rdev; unsigned int st_rdev;
off_t st_size; signed int st_size;
time_t st_atime; signed int st_atime;
unsigned int st_atime_nsec; unsigned int st_atime_nsec;
time_t st_mtime; signed int st_mtime;
unsigned int st_mtime_nsec; unsigned int st_mtime_nsec;
time_t st_ctime; signed int st_ctime;
unsigned int st_ctime_nsec; unsigned int st_ctime_nsec;
int st_blksize; int st_blksize;
int st_blocks; int st_blocks;
unsigned int __unused1; /* ACL stuff */ unsigned int __unused1; /* ACL stuff */
unsigned int __unused2; /* network */ unsigned int __unused2; /* network */
ino_t __unused3; /* network */ unsigned int __unused3; /* network */
unsigned int __unused4; /* cnodes */ unsigned int __unused4; /* cnodes */
unsigned short __unused5; /* netsite */ unsigned short __unused5; /* netsite */
short st_fstype; short st_fstype;
unsigned int st_realdev; unsigned int st_realdev;
unsigned short st_basemode; unsigned short st_basemode;
unsigned short st_spareshort; unsigned short st_spareshort;
uid_t st_uid; unsigned int st_uid;
gid_t st_gid; unsigned int st_gid;
unsigned int st_spare4[3]; unsigned int st_spare4[3];
}; };
#define STAT_HAVE_NSEC #define STAT_HAVE_NSEC
typedef __kernel_off64_t off64_t;
struct hpux_stat64 { struct hpux_stat64 {
unsigned int st_dev; /* dev_t is 32 bits on parisc */ unsigned int st_dev; /* dev_t is 32 bits on parisc */
ino_t st_ino; /* 32 bits */ unsigned int st_ino; /* 32 bits */
mode_t st_mode; /* 16 bits */ unsigned short st_mode; /* 16 bits */
unsigned short st_nlink; /* 16 bits */ unsigned short st_nlink; /* 16 bits */
unsigned short st_reserved1; /* old st_uid */ unsigned short st_reserved1; /* old st_uid */
unsigned short st_reserved2; /* old st_gid */ unsigned short st_reserved2; /* old st_gid */
unsigned int st_rdev; unsigned int st_rdev;
off64_t st_size; signed long long st_size;
time_t st_atime; signed int st_atime;
unsigned int st_spare1; unsigned int st_spare1;
time_t st_mtime; signed int st_mtime;
unsigned int st_spare2; unsigned int st_spare2;
time_t st_ctime; signed int st_ctime;
unsigned int st_spare3; unsigned int st_spare3;
int st_blksize; int st_blksize;
__u64 st_blocks; unsigned long long st_blocks;
unsigned int __unused1; /* ACL stuff */ unsigned int __unused1; /* ACL stuff */
unsigned int __unused2; /* network */ unsigned int __unused2; /* network */
ino_t __unused3; /* network */ unsigned int __unused3; /* network */
unsigned int __unused4; /* cnodes */ unsigned int __unused4; /* cnodes */
unsigned short __unused5; /* netsite */ unsigned short __unused5; /* netsite */
short st_fstype; short st_fstype;
unsigned int st_realdev; unsigned int st_realdev;
unsigned short st_basemode; unsigned short st_basemode;
unsigned short st_spareshort; unsigned short st_spareshort;
uid_t st_uid; unsigned int st_uid;
gid_t st_gid; unsigned int st_gid;
unsigned int st_spare4[3]; unsigned int st_spare4[3];
}; };
......
...@@ -826,8 +826,10 @@ ...@@ -826,8 +826,10 @@
#define __NR_process_vm_writev (__NR_Linux + 331) #define __NR_process_vm_writev (__NR_Linux + 331)
#define __NR_kcmp (__NR_Linux + 332) #define __NR_kcmp (__NR_Linux + 332)
#define __NR_finit_module (__NR_Linux + 333) #define __NR_finit_module (__NR_Linux + 333)
#define __NR_sched_setattr (__NR_Linux + 334)
#define __NR_sched_getattr (__NR_Linux + 335)
#define __NR_Linux_syscalls (__NR_finit_module + 1) #define __NR_Linux_syscalls (__NR_sched_getattr + 1)
#define __IGNORE_select /* newselect */ #define __IGNORE_select /* newselect */
......
...@@ -388,6 +388,20 @@ void flush_kernel_dcache_page_addr(void *addr) ...@@ -388,6 +388,20 @@ void flush_kernel_dcache_page_addr(void *addr)
} }
EXPORT_SYMBOL(flush_kernel_dcache_page_addr); EXPORT_SYMBOL(flush_kernel_dcache_page_addr);
void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
struct page *pg)
{
/* Copy using kernel mapping. No coherency is needed (all in
kunmap) for the `to' page. However, the `from' page needs to
be flushed through a mapping equivalent to the user mapping
before it can be accessed through the kernel mapping. */
preempt_disable();
flush_dcache_page_asm(__pa(vfrom), vaddr);
preempt_enable();
copy_page_asm(vto, vfrom);
}
EXPORT_SYMBOL(copy_user_page);
void purge_tlb_entries(struct mm_struct *mm, unsigned long addr) void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)
{ {
unsigned long flags; unsigned long flags;
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* Copyright (C) 2000 Grant Grundler <grundler with parisc-linux.org> * Copyright (C) 2000 Grant Grundler <grundler with parisc-linux.org>
* Copyright (C) 2001 Alan Modra <amodra at parisc-linux.org> * Copyright (C) 2001 Alan Modra <amodra at parisc-linux.org>
* Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org> * Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org>
* Copyright (C) 2001-2007 Helge Deller <deller at parisc-linux.org> * Copyright (C) 2001-2014 Helge Deller <deller@gmx.de>
* Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org>
* *
* *
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
#include <linux/kallsyms.h> #include <linux/kallsyms.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/rcupdate.h> #include <linux/rcupdate.h>
#include <linux/random.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
...@@ -286,3 +287,21 @@ void *dereference_function_descriptor(void *ptr) ...@@ -286,3 +287,21 @@ void *dereference_function_descriptor(void *ptr)
return ptr; return ptr;
} }
#endif #endif
static inline unsigned long brk_rnd(void)
{
/* 8MB for 32bit, 1GB for 64bit */
if (is_32bit_task())
return (get_random_int() & 0x7ffUL) << PAGE_SHIFT;
else
return (get_random_int() & 0x3ffffUL) << PAGE_SHIFT;
}
unsigned long arch_randomize_brk(struct mm_struct *mm)
{
unsigned long ret = PAGE_ALIGN(mm->brk + brk_rnd());
if (ret < mm->brk)
return mm->brk;
return ret;
}
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
* Copyright (C) 1999-2003 Matthew Wilcox <willy at parisc-linux.org> * Copyright (C) 1999-2003 Matthew Wilcox <willy at parisc-linux.org>
* Copyright (C) 2000-2003 Paul Bame <bame at parisc-linux.org> * Copyright (C) 2000-2003 Paul Bame <bame at parisc-linux.org>
* Copyright (C) 2001 Thomas Bogendoerfer <tsbogend at parisc-linux.org> * Copyright (C) 2001 Thomas Bogendoerfer <tsbogend at parisc-linux.org>
* Copyright (C) 1999-2014 Helge Deller <deller@gmx.de>
* *
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -23,6 +24,7 @@ ...@@ -23,6 +24,7 @@
*/ */
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/elf.h>
#include <linux/file.h> #include <linux/file.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/linkage.h> #include <linux/linkage.h>
...@@ -32,78 +34,230 @@ ...@@ -32,78 +34,230 @@
#include <linux/syscalls.h> #include <linux/syscalls.h>
#include <linux/utsname.h> #include <linux/utsname.h>
#include <linux/personality.h> #include <linux/personality.h>
#include <linux/random.h>
static unsigned long get_unshared_area(unsigned long addr, unsigned long len) /* we construct an artificial offset for the mapping based on the physical
* address of the kernel mapping variable */
#define GET_LAST_MMAP(filp) \
(filp ? ((unsigned long) filp->f_mapping) >> 8 : 0UL)
#define SET_LAST_MMAP(filp, val) \
{ /* nothing */ }
static int get_offset(unsigned int last_mmap)
{ {
struct vm_unmapped_area_info info; return (last_mmap & (SHMLBA-1)) >> PAGE_SHIFT;
}
info.flags = 0; static unsigned long shared_align_offset(unsigned int last_mmap,
info.length = len; unsigned long pgoff)
info.low_limit = PAGE_ALIGN(addr); {
info.high_limit = TASK_SIZE; return (get_offset(last_mmap) + pgoff) << PAGE_SHIFT;
info.align_mask = 0;
info.align_offset = 0;
return vm_unmapped_area(&info);
} }
/* static inline unsigned long COLOR_ALIGN(unsigned long addr,
* We need to know the offset to use. Old scheme was to look for unsigned int last_mmap, unsigned long pgoff)
* existing mapping and use the same offset. New scheme is to use the
* address of the kernel data structure as the seed for the offset.
* We'll see how that works...
*
* The mapping is cacheline aligned, so there's no information in the bottom
* few bits of the address. We're looking for 10 bits (4MB / 4k), so let's
* drop the bottom 8 bits and use bits 8-17.
*/
static int get_offset(struct address_space *mapping)
{ {
return (unsigned long) mapping >> 8; unsigned long base = (addr+SHMLBA-1) & ~(SHMLBA-1);
unsigned long off = (SHMLBA-1) &
(shared_align_offset(last_mmap, pgoff) << PAGE_SHIFT);
return base + off;
} }
static unsigned long shared_align_offset(struct file *filp, unsigned long pgoff) /*
* Top of mmap area (just below the process stack).
*/
static unsigned long mmap_upper_limit(void)
{ {
struct address_space *mapping = filp ? filp->f_mapping : NULL; unsigned long stack_base;
/* Limit stack size to 1GB - see setup_arg_pages() in fs/exec.c */
stack_base = rlimit_max(RLIMIT_STACK);
if (stack_base > (1 << 30))
stack_base = 1 << 30;
return (get_offset(mapping) + pgoff) << PAGE_SHIFT; return PAGE_ALIGN(STACK_TOP - stack_base);
} }
static unsigned long get_shared_area(struct file *filp, unsigned long addr,
unsigned long len, unsigned long pgoff) unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
unsigned long len, unsigned long pgoff, unsigned long flags)
{ {
struct mm_struct *mm = current->mm;
struct vm_area_struct *vma;
unsigned long task_size = TASK_SIZE;
int do_color_align, last_mmap;
struct vm_unmapped_area_info info; struct vm_unmapped_area_info info;
if (len > task_size)
return -ENOMEM;
do_color_align = 0;
if (filp || (flags & MAP_SHARED))
do_color_align = 1;
last_mmap = GET_LAST_MMAP(filp);
if (flags & MAP_FIXED) {
if ((flags & MAP_SHARED) && last_mmap &&
(addr - shared_align_offset(last_mmap, pgoff))
& (SHMLBA - 1))
return -EINVAL;
goto found_addr;
}
if (addr) {
if (do_color_align && last_mmap)
addr = COLOR_ALIGN(addr, last_mmap, pgoff);
else
addr = PAGE_ALIGN(addr);
vma = find_vma(mm, addr);
if (task_size - len >= addr &&
(!vma || addr + len <= vma->vm_start))
goto found_addr;
}
info.flags = 0; info.flags = 0;
info.length = len; info.length = len;
info.low_limit = PAGE_ALIGN(addr); info.low_limit = mm->mmap_legacy_base;
info.high_limit = TASK_SIZE; info.high_limit = mmap_upper_limit();
info.align_mask = PAGE_MASK & (SHMLBA - 1); info.align_mask = last_mmap ? (PAGE_MASK & (SHMLBA - 1)) : 0;
info.align_offset = shared_align_offset(filp, pgoff); info.align_offset = shared_align_offset(last_mmap, pgoff);
return vm_unmapped_area(&info); addr = vm_unmapped_area(&info);
found_addr:
if (do_color_align && !last_mmap && !(addr & ~PAGE_MASK))
SET_LAST_MMAP(filp, addr - (pgoff << PAGE_SHIFT));
return addr;
} }
unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsigned long
unsigned long len, unsigned long pgoff, unsigned long flags) arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
const unsigned long len, const unsigned long pgoff,
const unsigned long flags)
{ {
struct vm_area_struct *vma;
struct mm_struct *mm = current->mm;
unsigned long addr = addr0;
int do_color_align, last_mmap;
struct vm_unmapped_area_info info;
#ifdef CONFIG_64BIT
/* This should only ever run for 32-bit processes. */
BUG_ON(!test_thread_flag(TIF_32BIT));
#endif
/* requested length too big for entire address space */
if (len > TASK_SIZE) if (len > TASK_SIZE)
return -ENOMEM; return -ENOMEM;
do_color_align = 0;
if (filp || (flags & MAP_SHARED))
do_color_align = 1;
last_mmap = GET_LAST_MMAP(filp);
if (flags & MAP_FIXED) { if (flags & MAP_FIXED) {
if ((flags & MAP_SHARED) && if ((flags & MAP_SHARED) && last_mmap &&
(addr - shared_align_offset(filp, pgoff)) & (SHMLBA - 1)) (addr - shared_align_offset(last_mmap, pgoff))
& (SHMLBA - 1))
return -EINVAL; return -EINVAL;
return addr; goto found_addr;
} }
if (!addr)
addr = TASK_UNMAPPED_BASE;
if (filp || (flags & MAP_SHARED)) /* requesting a specific address */
addr = get_shared_area(filp, addr, len, pgoff); if (addr) {
if (do_color_align && last_mmap)
addr = COLOR_ALIGN(addr, last_mmap, pgoff);
else else
addr = get_unshared_area(addr, len); addr = PAGE_ALIGN(addr);
vma = find_vma(mm, addr);
if (TASK_SIZE - len >= addr &&
(!vma || addr + len <= vma->vm_start))
goto found_addr;
}
info.flags = VM_UNMAPPED_AREA_TOPDOWN;
info.length = len;
info.low_limit = PAGE_SIZE;
info.high_limit = mm->mmap_base;
info.align_mask = last_mmap ? (PAGE_MASK & (SHMLBA - 1)) : 0;
info.align_offset = shared_align_offset(last_mmap, pgoff);
addr = vm_unmapped_area(&info);
if (!(addr & ~PAGE_MASK))
goto found_addr;
VM_BUG_ON(addr != -ENOMEM);
/*
* A failed mmap() very likely causes application failure,
* so fall back to the bottom-up function here. This scenario
* can happen with large stack limits and large mmap()
* allocations.
*/
return arch_get_unmapped_area(filp, addr0, len, pgoff, flags);
found_addr:
if (do_color_align && !last_mmap && !(addr & ~PAGE_MASK))
SET_LAST_MMAP(filp, addr - (pgoff << PAGE_SHIFT));
return addr; return addr;
} }
static int mmap_is_legacy(void)
{
if (current->personality & ADDR_COMPAT_LAYOUT)
return 1;
/* parisc stack always grows up - so a unlimited stack should
* not be an indicator to use the legacy memory layout.
* if (rlimit(RLIMIT_STACK) == RLIM_INFINITY)
* return 1;
*/
return sysctl_legacy_va_layout;
}
static unsigned long mmap_rnd(void)
{
unsigned long rnd = 0;
/*
* 8 bits of randomness in 32bit mmaps, 20 address space bits
* 28 bits of randomness in 64bit mmaps, 40 address space bits
*/
if (current->flags & PF_RANDOMIZE) {
if (is_32bit_task())
rnd = get_random_int() % (1<<8);
else
rnd = get_random_int() % (1<<28);
}
return rnd << PAGE_SHIFT;
}
static unsigned long mmap_legacy_base(void)
{
return TASK_UNMAPPED_BASE + mmap_rnd();
}
/*
* This function, called very early during the creation of a new
* process VM image, sets up which VM layout function to use:
*/
void arch_pick_mmap_layout(struct mm_struct *mm)
{
mm->mmap_legacy_base = mmap_legacy_base();
mm->mmap_base = mmap_upper_limit();
if (mmap_is_legacy()) {
mm->mmap_base = mm->mmap_legacy_base;
mm->get_unmapped_area = arch_get_unmapped_area;
} else {
mm->get_unmapped_area = arch_get_unmapped_area_topdown;
}
}
asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len, asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len,
unsigned long prot, unsigned long flags, unsigned long fd, unsigned long prot, unsigned long flags, unsigned long fd,
unsigned long pgoff) unsigned long pgoff)
......
...@@ -429,6 +429,8 @@ ...@@ -429,6 +429,8 @@
ENTRY_COMP(process_vm_writev) ENTRY_COMP(process_vm_writev)
ENTRY_SAME(kcmp) ENTRY_SAME(kcmp)
ENTRY_SAME(finit_module) ENTRY_SAME(finit_module)
ENTRY_SAME(sched_setattr)
ENTRY_SAME(sched_getattr) /* 335 */
/* Nothing yet */ /* Nothing yet */
......
...@@ -488,7 +488,7 @@ static int sti_init_glob_cfg(struct sti_struct *sti, unsigned long rom_address, ...@@ -488,7 +488,7 @@ static int sti_init_glob_cfg(struct sti_struct *sti, unsigned long rom_address,
return 0; return 0;
} }
#ifdef CONFIG_FONTS #ifdef CONFIG_FONT_SUPPORT
static struct sti_cooked_font * static struct sti_cooked_font *
sti_select_fbfont(struct sti_cooked_rom *cooked_rom, const char *fbfont_name) sti_select_fbfont(struct sti_cooked_rom *cooked_rom, const char *fbfont_name)
{ {
......
...@@ -9,7 +9,7 @@ if FONT_SUPPORT ...@@ -9,7 +9,7 @@ if FONT_SUPPORT
config FONTS config FONTS
bool "Select compiled-in fonts" bool "Select compiled-in fonts"
depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE depends on FRAMEBUFFER_CONSOLE
help help
Say Y here if you would like to use fonts other than the default Say Y here if you would like to use fonts other than the default
your frame buffer console usually use. your frame buffer console usually use.
...@@ -22,7 +22,7 @@ config FONTS ...@@ -22,7 +22,7 @@ config FONTS
config FONT_8x8 config FONT_8x8
bool "VGA 8x8 font" if FONTS bool "VGA 8x8 font" if FONTS
depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE depends on FRAMEBUFFER_CONSOLE
default y if !SPARC && !FONTS default y if !SPARC && !FONTS
help help
This is the "high resolution" font for the VGA frame buffer (the one This is the "high resolution" font for the VGA frame buffer (the one
...@@ -45,7 +45,7 @@ config FONT_8x16 ...@@ -45,7 +45,7 @@ config FONT_8x16
config FONT_6x11 config FONT_6x11
bool "Mac console 6x11 font (not supported by all drivers)" if FONTS bool "Mac console 6x11 font (not supported by all drivers)" if FONTS
depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE depends on FRAMEBUFFER_CONSOLE
default y if !SPARC && !FONTS && MAC default y if !SPARC && !FONTS && MAC
help help
Small console font with Macintosh-style high-half glyphs. Some Mac Small console font with Macintosh-style high-half glyphs. Some Mac
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment