diff options
Diffstat (limited to 'arch/sparc64')
-rw-r--r-- | arch/sparc64/kernel/sparc64_ksyms.c | 3 | ||||
-rw-r--r-- | arch/sparc64/kernel/sys_sparc.c | 24 | ||||
-rw-r--r-- | arch/sparc64/kernel/sys_sparc32.c | 10 | ||||
-rw-r--r-- | arch/sparc64/kernel/sys_sunos32.c | 2 | ||||
-rw-r--r-- | arch/sparc64/kernel/traps.c | 14 | ||||
-rw-r--r-- | arch/sparc64/mm/init.c | 13 | ||||
-rw-r--r-- | arch/sparc64/solaris/ioctl.c | 2 | ||||
-rw-r--r-- | arch/sparc64/solaris/socket.c | 2 |
8 files changed, 53 insertions, 17 deletions
diff --git a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c index e1ae982bf..a0311626e 100644 --- a/arch/sparc64/kernel/sparc64_ksyms.c +++ b/arch/sparc64/kernel/sparc64_ksyms.c @@ -1,4 +1,4 @@ -/* $Id: sparc64_ksyms.c,v 1.98 2000/11/13 10:03:32 davem Exp $ +/* $Id: sparc64_ksyms.c,v 1.99 2000/12/09 04:15:24 anton Exp $ * arch/sparc64/kernel/sparc64_ksyms.c: Sparc64 specific ksyms support. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -179,6 +179,7 @@ EXPORT_SYMBOL(disable_irq); EXPORT_SYMBOL(__flushw_user); +EXPORT_SYMBOL(flush_icache_range); EXPORT_SYMBOL(__flush_dcache_page); EXPORT_SYMBOL(mstk48t02_regs); diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c index 235d34889..391979c87 100644 --- a/arch/sparc64/kernel/sys_sparc.c +++ b/arch/sparc64/kernel/sys_sparc.c @@ -1,4 +1,4 @@ -/* $Id: sys_sparc.c,v 1.46 2000/08/29 07:01:54 davem Exp $ +/* $Id: sys_sparc.c,v 1.47 2000/11/29 05:56:12 anton Exp $ * linux/arch/sparc64/kernel/sys_sparc.c * * This file contains various random system calls that @@ -40,6 +40,8 @@ asmlinkage unsigned long sys_getpagesize(void) return PAGE_SIZE; } +#define COLOUR_ALIGN(addr) (((addr)+SHMLBA-1)&~(SHMLBA-1)) + unsigned long get_unmapped_area(unsigned long addr, unsigned long len) { struct vm_area_struct * vmm; @@ -51,7 +53,11 @@ unsigned long get_unmapped_area(unsigned long addr, unsigned long len) return 0; if (!addr) addr = TASK_UNMAPPED_BASE; - addr = PAGE_ALIGN(addr); + + if (current->thread.flags & SPARC_FLAG_MMAPSHARED) + addr = COLOUR_ALIGN(addr); + else + addr = PAGE_ALIGN(addr); task_size -= len; @@ -66,6 +72,8 @@ unsigned long get_unmapped_area(unsigned long addr, unsigned long len) if (!vmm || addr + len <= vmm->vm_start) return addr; addr = vmm->vm_end; + if (current->thread.flags & SPARC_FLAG_MMAPSHARED) + addr = COLOUR_ALIGN(addr); } } @@ -232,10 +240,15 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len, goto out_putf; } + if (flags & MAP_SHARED) + current->thread.flags |= SPARC_FLAG_MMAPSHARED; + down(¤t->mm->mmap_sem); retval = do_mmap(file, addr, len, prot, flags, off); up(¤t->mm->mmap_sem); + current->thread.flags &= ~(SPARC_FLAG_MMAPSHARED); + out_putf: if (file) fput(file); @@ -264,6 +277,7 @@ asmlinkage unsigned long sys64_mremap(unsigned long addr, unsigned long old_len, unsigned long new_len, unsigned long flags, unsigned long new_addr) { + struct vm_area_struct *vma; unsigned long ret = -EINVAL; if (current->thread.flags & SPARC_FLAG_32BIT) goto out; @@ -272,6 +286,9 @@ asmlinkage unsigned long sys64_mremap(unsigned long addr, if (addr < PAGE_OFFSET && addr + old_len > -PAGE_OFFSET) goto out; down(¤t->mm->mmap_sem); + vma = find_vma(current->mm, addr); + if (vma && (vma->vm_flags & VM_SHARED)) + current->thread.flags |= SPARC_FLAG_MMAPSHARED; if (flags & MREMAP_FIXED) { if (new_addr < PAGE_OFFSET && new_addr + new_len > -PAGE_OFFSET) @@ -280,13 +297,14 @@ asmlinkage unsigned long sys64_mremap(unsigned long addr, ret = -ENOMEM; if (!(flags & MREMAP_MAYMOVE)) goto out_sem; - new_addr = get_unmapped_area (addr, new_len); + new_addr = get_unmapped_area(addr, new_len); if (!new_addr) goto out_sem; flags |= MREMAP_FIXED; } ret = do_mremap(addr, old_len, new_len, flags, new_addr); out_sem: + current->thread.flags &= ~(SPARC_FLAG_MMAPSHARED); up(¤t->mm->mmap_sem); out: return ret; diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c index 9b211d86d..0964409c9 100644 --- a/arch/sparc64/kernel/sys_sparc32.c +++ b/arch/sparc64/kernel/sys_sparc32.c @@ -1,4 +1,4 @@ -/* $Id: sys_sparc32.c,v 1.166 2000/11/10 04:49:56 davem Exp $ +/* $Id: sys_sparc32.c,v 1.168 2000/12/11 18:59:35 davem Exp $ * sys_sparc32.c: Conversion between 32bit and 64bit native syscalls. * * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) @@ -2966,6 +2966,7 @@ static int copy_strings32(int argc, u32 * argv, struct linux_binprm *bprm) err = copy_from_user(kaddr + offset, (char *)A(str), bytes_to_copy); + flush_dcache_page(page); flush_page_to_ram(page); kunmap(page); @@ -4133,6 +4134,7 @@ asmlinkage unsigned long sys32_mremap(unsigned long addr, unsigned long old_len, unsigned long new_len, unsigned long flags, u32 __new_addr) { + struct vm_area_struct *vma; unsigned long ret = -EINVAL; unsigned long new_addr = AA(__new_addr); @@ -4141,6 +4143,9 @@ asmlinkage unsigned long sys32_mremap(unsigned long addr, if (addr > 0xf0000000UL - old_len) goto out; down(¤t->mm->mmap_sem); + vma = find_vma(current->mm, addr); + if (vma && (vma->vm_flags & VM_SHARED)) + current->thread.flags |= SPARC_FLAG_MMAPSHARED; if (flags & MREMAP_FIXED) { if (new_addr > 0xf0000000UL - new_len) goto out_sem; @@ -4148,13 +4153,14 @@ asmlinkage unsigned long sys32_mremap(unsigned long addr, ret = -ENOMEM; if (!(flags & MREMAP_MAYMOVE)) goto out_sem; - new_addr = get_unmapped_area (addr, new_len); + new_addr = get_unmapped_area(addr, new_len); if (!new_addr) goto out_sem; flags |= MREMAP_FIXED; } ret = do_mremap(addr, old_len, new_len, flags, new_addr); out_sem: + current->thread.flags &= ~(SPARC_FLAG_MMAPSHARED); up(¤t->mm->mmap_sem); out: return ret; diff --git a/arch/sparc64/kernel/sys_sunos32.c b/arch/sparc64/kernel/sys_sunos32.c index a5f5411f5..a9d143759 100644 --- a/arch/sparc64/kernel/sys_sunos32.c +++ b/arch/sparc64/kernel/sys_sunos32.c @@ -1,4 +1,4 @@ -/* $Id: sys_sunos32.c,v 1.54 2000/08/12 13:25:41 davem Exp $ +/* $Id: sys_sunos32.c,v 1.55 2000/11/18 02:10:59 davem Exp $ * sys_sunos32.c: SunOS binary compatability layer on sparc64. * * Copyright (C) 1995, 1996, 1997 David S. Miller (davem@caip.rutgers.edu) diff --git a/arch/sparc64/kernel/traps.c b/arch/sparc64/kernel/traps.c index de4968ac4..2562df1f3 100644 --- a/arch/sparc64/kernel/traps.c +++ b/arch/sparc64/kernel/traps.c @@ -1,4 +1,4 @@ -/* $Id: traps.c,v 1.67 2000/07/30 23:12:24 davem Exp $ +/* $Id: traps.c,v 1.68 2000/11/22 06:50:37 davem Exp $ * arch/sparc64/kernel/traps.c * * Copyright (C) 1995,1997 David S. Miller (davem@caip.rutgers.edu) @@ -551,7 +551,7 @@ void do_fpe_common(struct pt_regs *regs) else if (fsr & 0x01) info.si_code = FPE_FLTRES; } - send_sig_info(SIGFPE, &info, current); + force_sig_info(SIGFPE, &info, current); } } @@ -594,7 +594,7 @@ void do_tof(struct pt_regs *regs) info.si_code = EMT_TAGOVF; info.si_addr = (void *)regs->tpc; info.si_trapno = 0; - send_sig_info(SIGEMT, &info, current); + force_sig_info(SIGEMT, &info, current); } void do_div0(struct pt_regs *regs) @@ -606,7 +606,7 @@ void do_div0(struct pt_regs *regs) info.si_code = FPE_INTDIV; info.si_addr = (void *)regs->tpc; info.si_trapno = 0; - send_sig_info(SIGFPE, &info, current); + force_sig_info(SIGFPE, &info, current); } void instruction_dump (unsigned int *pc) @@ -715,7 +715,7 @@ void do_illegal_instruction(struct pt_regs *regs) info.si_code = ILL_ILLOPC; info.si_addr = (void *)pc; info.si_trapno = 0; - send_sig_info(SIGILL, &info, current); + force_sig_info(SIGILL, &info, current); } void mem_address_unaligned(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr) @@ -734,7 +734,7 @@ void mem_address_unaligned(struct pt_regs *regs, unsigned long sfar, unsigned lo info.si_code = BUS_ADRALN; info.si_addr = (void *)sfar; info.si_trapno = 0; - send_sig_info(SIGBUS, &info, current); + force_sig_info(SIGBUS, &info, current); } void do_privop(struct pt_regs *regs) @@ -746,7 +746,7 @@ void do_privop(struct pt_regs *regs) info.si_code = ILL_PRVOPC; info.si_addr = (void *)regs->tpc; info.si_trapno = 0; - send_sig_info(SIGILL, &info, current); + force_sig_info(SIGILL, &info, current); } void do_privact(struct pt_regs *regs) diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index 6da2d0b85..289092756 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c @@ -1,4 +1,4 @@ -/* $Id: init.c,v 1.159 2000/11/06 06:59:04 davem Exp $ +/* $Id: init.c,v 1.161 2000/12/09 20:16:58 davem Exp $ * arch/sparc64/mm/init.c * * Copyright (C) 1996-1999 David S. Miller (davem@caip.rutgers.edu) @@ -113,6 +113,17 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t p __update_mmu_cache(vma, address, pte); } +/* In arch/sparc64/mm/ultra.S */ +extern void __flush_icache_page(unsigned long); + +void flush_icache_range(unsigned long start, unsigned long end) +{ + unsigned long kaddr; + + for (kaddr = start; kaddr < end; kaddr += PAGE_SIZE) + __flush_icache_page(__get_phys(kaddr)); +} + /* * BAD_PAGE is the page that is used for page faults when linux * is out-of-memory. Older versions of linux just did a diff --git a/arch/sparc64/solaris/ioctl.c b/arch/sparc64/solaris/ioctl.c index 4a10c1b4c..72c8f3405 100644 --- a/arch/sparc64/solaris/ioctl.c +++ b/arch/sparc64/solaris/ioctl.c @@ -1,4 +1,4 @@ -/* $Id: ioctl.c,v 1.15 2000/07/28 12:15:02 davem Exp $ +/* $Id: ioctl.c,v 1.16 2000/11/18 02:10:59 davem Exp $ * ioctl.c: Solaris ioctl emulation. * * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) diff --git a/arch/sparc64/solaris/socket.c b/arch/sparc64/solaris/socket.c index 9b910a633..e016e4b1a 100644 --- a/arch/sparc64/solaris/socket.c +++ b/arch/sparc64/solaris/socket.c @@ -1,4 +1,4 @@ -/* $Id: socket.c,v 1.3 2000/08/14 23:50:31 anton Exp $ +/* $Id: socket.c,v 1.4 2000/11/18 02:11:00 davem Exp $ * socket.c: Socket syscall emulation for Solaris 2.6+ * * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz) |