diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1999-09-28 22:25:29 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1999-09-28 22:25:29 +0000 |
commit | 0ae8dceaebe3659ee0c3352c08125f403e77ebca (patch) | |
tree | 5085c389f09da78182b899d19fe1068b619a69dd /arch/sparc | |
parent | 273767781288c35c9d679e908672b9996cda4c34 (diff) |
Merge with 2.3.10.
Diffstat (limited to 'arch/sparc')
-rw-r--r-- | arch/sparc/ap1000/aplib.c | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/pcic.c | 2 | ||||
-rw-r--r-- | arch/sparc/kernel/process.c | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/ptrace.c | 292 | ||||
-rw-r--r-- | arch/sparc/kernel/sparc-stub.c | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/sparc_ksyms.c | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/sun4d_smp.c | 2 | ||||
-rw-r--r-- | arch/sparc/kernel/sun4m_smp.c | 2 | ||||
-rw-r--r-- | arch/sparc/kernel/sunos_ioctl.c | 3 | ||||
-rw-r--r-- | arch/sparc/kernel/sys_sunos.c | 1 | ||||
-rw-r--r-- | arch/sparc/mm/asyncd.c | 2 | ||||
-rw-r--r-- | arch/sparc/mm/fault.c | 3 | ||||
-rw-r--r-- | arch/sparc/mm/srmmu.c | 2 | ||||
-rw-r--r-- | arch/sparc/mm/sun4c.c | 5 |
14 files changed, 35 insertions, 283 deletions
diff --git a/arch/sparc/ap1000/aplib.c b/arch/sparc/ap1000/aplib.c index 2c36a5ae1..4e476aba3 100644 --- a/arch/sparc/ap1000/aplib.c +++ b/arch/sparc/ap1000/aplib.c @@ -27,7 +27,6 @@ #include <asm/segment.h> #include <asm/io.h> #include <asm/pgtable.h> -#include <asm/segment.h> #include <asm/uaccess.h> #include <asm/ap1000/pgtapmmu.h> diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c index a4ae9497e..461773e96 100644 --- a/arch/sparc/kernel/pcic.c +++ b/arch/sparc/kernel/pcic.c @@ -20,7 +20,6 @@ #include <asm/ebus.h> #include <asm/sbus.h> /* for sanity check... */ #include <asm/swift.h> /* for cache flushing. */ - #include <asm/io.h> #undef PROM_DEBUG @@ -39,7 +38,6 @@ #include <linux/timex.h> #include <linux/interrupt.h> -#include <asm/io.h> #include <asm/irq.h> #include <asm/oplib.h> #include <asm/pcic.h> diff --git a/arch/sparc/kernel/process.c b/arch/sparc/kernel/process.c index 301747c22..f6a6315a4 100644 --- a/arch/sparc/kernel/process.c +++ b/arch/sparc/kernel/process.c @@ -37,7 +37,6 @@ #include <asm/delay.h> #include <asm/processor.h> #include <asm/psr.h> -#include <asm/system.h> #include <asm/elf.h> extern void fpsave(unsigned long *, unsigned long *, void *, unsigned long *); diff --git a/arch/sparc/kernel/ptrace.c b/arch/sparc/kernel/ptrace.c index 92c8c464f..f7b6cdfd0 100644 --- a/arch/sparc/kernel/ptrace.c +++ b/arch/sparc/kernel/ptrace.c @@ -24,202 +24,6 @@ #define MAGIC_CONSTANT 0x80000000 -/* - * This routine gets a long from any process space by following the page - * tables. NOTE! You should check that the long isn't on a page boundary, - * and that it is in the task area before calling this: this routine does - * no checking. - */ -static unsigned long get_long(struct task_struct * tsk, - struct vm_area_struct * vma, unsigned long addr) -{ - pgd_t * pgdir; - pmd_t * pgmiddle; - pte_t * pgtable; - unsigned long page, retval; - -repeat: - pgdir = pgd_offset(vma->vm_mm, addr); - if (pgd_none(*pgdir)) { - handle_mm_fault(tsk, vma, addr, 0); - goto repeat; - } - if (pgd_bad(*pgdir)) { - printk("ptrace: bad page directory %08lx\n", pgd_val(*pgdir)); - pgd_clear(pgdir); - return 0; - } - pgmiddle = pmd_offset(pgdir, addr); - if (pmd_none(*pgmiddle)) { - handle_mm_fault(tsk, vma, addr, 0); - goto repeat; - } - if (pmd_bad(*pgmiddle)) { - printk("ptrace: bad page middle %08lx\n", pmd_val(*pgmiddle)); - pmd_clear(pgmiddle); - return 0; - } - pgtable = pte_offset(pgmiddle, addr); - if (!pte_present(*pgtable)) { - handle_mm_fault(tsk, vma, addr, 0); - goto repeat; - } - page = pte_page(*pgtable); -/* this is a hack for non-kernel-mapped video buffers and similar */ - if (MAP_NR(page) >= max_mapnr) - return 0; - page += addr & ~PAGE_MASK; - retval = *(unsigned long *) page; - flush_page_to_ram(page); - return retval; -} - -/* - * This routine puts a long into any process space by following the page - * tables. NOTE! You should check that the long isn't on a page boundary, - * and that it is in the task area before calling this: this routine does - * no checking. - * - * Now keeps R/W state of page so that a text page stays readonly - * even if a debugger scribbles breakpoints into it. -M.U- - */ -static void put_long(struct task_struct * tsk, struct vm_area_struct * vma, - unsigned long addr, unsigned long data) -{ - pgd_t *pgdir; - pmd_t *pgmiddle; - pte_t *pgtable; - unsigned long page; - -repeat: - pgdir = pgd_offset(vma->vm_mm, addr); - if (!pgd_present(*pgdir)) { - handle_mm_fault(tsk, vma, addr, 1); - goto repeat; - } - if (pgd_bad(*pgdir)) { - printk("ptrace: bad page directory %08lx\n", pgd_val(*pgdir)); - pgd_clear(pgdir); - return; - } - pgmiddle = pmd_offset(pgdir, addr); - if (pmd_none(*pgmiddle)) { - handle_mm_fault(tsk, vma, addr, 1); - goto repeat; - } - if (pmd_bad(*pgmiddle)) { - printk("ptrace: bad page middle %08lx\n", pmd_val(*pgmiddle)); - pmd_clear(pgmiddle); - return; - } - pgtable = pte_offset(pgmiddle, addr); - if (!pte_present(*pgtable)) { - handle_mm_fault(tsk, vma, addr, 1); - goto repeat; - } - page = pte_page(*pgtable); - if (!pte_write(*pgtable)) { - handle_mm_fault(tsk, vma, addr, 1); - goto repeat; - } -/* this is a hack for non-kernel-mapped video buffers and similar */ - flush_cache_page(vma, addr); - if (MAP_NR(page) < max_mapnr) { - *(unsigned long *) (page + (addr & ~PAGE_MASK)) = data; - flush_page_to_ram(page); - } -/* we're bypassing pagetables, so we have to set the dirty bit ourselves */ -/* this should also re-instate whatever read-only mode there was before */ - set_pte(pgtable, pte_mkdirty(mk_pte(page, vma->vm_page_prot))); - flush_tlb_page(vma, addr); -} - -/* - * This routine checks the page boundaries, and that the offset is - * within the task area. It then calls get_long() to read a long. - */ -static int read_long(struct task_struct * tsk, unsigned long addr, - unsigned long * result) -{ - struct vm_area_struct * vma = find_extend_vma(tsk, addr); - - if (!vma) - return -EIO; - *result = get_long(tsk, vma, addr); - return 0; -} - -static int read_byte(struct task_struct *tsk, unsigned long addr, - unsigned char *result) -{ - struct vm_area_struct *vma = find_extend_vma(tsk, addr&~3); - unsigned long tmp; - - if(!vma) - return -EIO; - tmp = get_long(tsk, vma, (addr & ~3)); - switch(addr & 3) { - case 0: - *result = (tmp & 0xff000000)>>24; - break; - case 1: - *result = (tmp & 0x00ff0000)>>16; - break; - case 2: - *result = (tmp & 0x0000ff00)>>8; - break; - case 3: - *result = (tmp & 0x000000ff); - break; - } - return 0; -} - -/* - * This routine checks the page boundaries, and that the offset is - * within the task area. It then calls put_long() to write a long. - */ -static int write_long(struct task_struct * tsk, unsigned long addr, - unsigned long data) -{ - struct vm_area_struct * vma = find_extend_vma(tsk, addr); - - if (!vma) - return -EIO; - put_long(tsk, vma, addr, data); - return 0; -} - -static int write_byte(struct task_struct * tsk, unsigned long addr, - unsigned char data) -{ - struct vm_area_struct * vma = find_extend_vma(tsk, (addr & ~3)); - unsigned long tmp; - - if (!vma) - return -EIO; - tmp = get_long(tsk, vma, (addr & ~3)); - switch(addr & 3) { - case 0: - tmp &= 0x00ffffff; - tmp |= (data << 24); - break; - case 1: - tmp &= 0xff00ffff; - tmp |= ((data << 16) & 0x00ff0000); - break; - case 2: - tmp &= 0xffff00ff; - tmp |= ((data << 8) & 0x0000ff00); - break; - case 3: - tmp &= 0xffffff00; - tmp |= (data & 0x000000ff); - break; - } - put_long(tsk, vma, (addr & ~3), tmp); - return 0; -} /* Returning from ptrace is a bit tricky because the syscall return * low level code assumes any value returned which is negative and @@ -565,24 +369,12 @@ asmlinkage void do_ptrace(struct pt_regs *regs) case PTRACE_PEEKTEXT: /* read word at location addr. */ case PTRACE_PEEKDATA: { unsigned long tmp; - int res; - - /* XXX Find out what is really going on. */ - flush_cache_all(); - /* Non-word alignment _not_ allowed on Sparc. */ - if(addr & (sizeof(unsigned long) - 1)) { - pt_error_return(regs, EINVAL); - goto out; - } - down(&child->mm->mmap_sem); - res = read_long(child, addr, &tmp); - up(&child->mm->mmap_sem); - if (res < 0) { - pt_error_return(regs, -res); - goto out; - } - pt_os_succ_return(regs, tmp, (long *) data); + if (access_process_vm(child, addr, + &tmp, sizeof(tmp), 0) == sizeof(tmp)) + pt_os_succ_return(regs, tmp, (long *)data); + else + pt_error_return(regs, EIO); goto out; } @@ -596,22 +388,11 @@ asmlinkage void do_ptrace(struct pt_regs *regs) case PTRACE_POKETEXT: /* write the word at location addr. */ case PTRACE_POKEDATA: { - struct vm_area_struct *vma; - int res; - - /* Non-word alignment _not_ allowed on Sparc. */ - if(addr & (sizeof(unsigned long) - 1)) { - pt_error_return(regs, EINVAL); - goto out; - } - down(&child->mm->mmap_sem); - vma = find_extend_vma(child, addr); - res = write_long(child, addr, data); - up(&child->mm->mmap_sem); - if(res < 0) - pt_error_return(regs, -res); + if (access_process_vm(child, addr, + &data, sizeof(data), 1) == sizeof(data)) + pt_succ_return(regs, 0); else - pt_succ_return(regs, res); + pt_error_return(regs, EIO); goto out; } @@ -737,56 +518,31 @@ asmlinkage void do_ptrace(struct pt_regs *regs) case PTRACE_READTEXT: case PTRACE_READDATA: { - unsigned char *dest = (unsigned char *) addr2; - unsigned long src = addr; - unsigned char tmp; - int res, len = data; - - res = verify_area(VERIFY_WRITE, dest, len); - if(res) { - pt_error_return(regs, -res); + int res = ptrace_readdata(child, addr, (void *) addr2, data); + + if (res == data) { + pt_succ_return(regs, 0); goto out; } - while(len) { - down(&child->mm->mmap_sem); - res = read_byte(child, src, &tmp); - up(&child->mm->mmap_sem); - if(res < 0) { - pt_error_return(regs, -res); - goto out; - } - __put_user(tmp, dest); - src++; dest++; len--; - } - pt_succ_return(regs, 0); + /* Partial read is an IO failure */ + if (res >= 0) + res = -EIO; + pt_error_return(regs, -res); goto out; } case PTRACE_WRITETEXT: case PTRACE_WRITEDATA: { - unsigned char *src = (unsigned char *) addr2; - unsigned long dest = addr; - int res, len = data; + int res = ptrace_writedata(child, (void *) addr2, addr, data); - res = verify_area(VERIFY_READ, src, len); - if(res) { - pt_error_return(regs, -res); + if (res == data) { + pt_succ_return(regs, 0); goto out; } - while(len) { - unsigned long tmp; - - __get_user(tmp, src); - down(&child->mm->mmap_sem); - res = write_byte(child, dest, tmp); - up(&child->mm->mmap_sem); - if(res < 0) { - pt_error_return(regs, -res); - goto out; - } - src++; dest++; len--; - } - pt_succ_return(regs, 0); + /* Partial write is an IO failure */ + if (res >= 0) + res = -EIO; + pt_error_return(regs, -res); goto out; } diff --git a/arch/sparc/kernel/sparc-stub.c b/arch/sparc/kernel/sparc-stub.c index 9426ec0d9..a78b16f57 100644 --- a/arch/sparc/kernel/sparc-stub.c +++ b/arch/sparc/kernel/sparc-stub.c @@ -105,7 +105,6 @@ #include <asm/oplib.h> #include <asm/head.h> #include <asm/traps.h> -#include <asm/system.h> #include <asm/vac-ops.h> #include <asm/kgdb.h> #include <asm/pgtable.h> diff --git a/arch/sparc/kernel/sparc_ksyms.c b/arch/sparc/kernel/sparc_ksyms.c index b043d647d..99a1f9242 100644 --- a/arch/sparc/kernel/sparc_ksyms.c +++ b/arch/sparc/kernel/sparc_ksyms.c @@ -40,7 +40,6 @@ #include <asm/dma.h> #endif #include <asm/a.out.h> -#include <asm/spinlock.h> #include <asm/io-unit.h> struct poll { diff --git a/arch/sparc/kernel/sun4d_smp.c b/arch/sparc/kernel/sun4d_smp.c index edd736b41..64ef31bbb 100644 --- a/arch/sparc/kernel/sun4d_smp.c +++ b/arch/sparc/kernel/sun4d_smp.c @@ -473,7 +473,7 @@ void smp4d_percpu_timer_interrupt(struct pt_regs *regs) if(current->pid) { update_one_process(current, 1, user, !user, cpu); - if(--current->counter < 0) { + if(--current->counter <= 0) { current->counter = 0; current->need_resched = 1; } diff --git a/arch/sparc/kernel/sun4m_smp.c b/arch/sparc/kernel/sun4m_smp.c index c9acf609c..3fb1044f4 100644 --- a/arch/sparc/kernel/sun4m_smp.c +++ b/arch/sparc/kernel/sun4m_smp.c @@ -454,7 +454,7 @@ void smp4m_percpu_timer_interrupt(struct pt_regs *regs) if(current->pid) { update_one_process(current, 1, user, !user, cpu); - if(--current->counter < 0) { + if(--current->counter <= 0) { current->counter = 0; current->need_resched = 1; } diff --git a/arch/sparc/kernel/sunos_ioctl.c b/arch/sparc/kernel/sunos_ioctl.c index 2f0fe9ed7..d85bbe2d9 100644 --- a/arch/sparc/kernel/sunos_ioctl.c +++ b/arch/sparc/kernel/sunos_ioctl.c @@ -36,11 +36,10 @@ extern asmlinkage int sys_setsid(void); asmlinkage int sunos_ioctl (int fd, unsigned long cmd, unsigned long arg) { - struct file *filp; int ret = -EBADF; lock_kernel(); - if (fd >= SUNOS_NR_OPEN || !(filp = current->files->fd [fd])) + if (fd >= SUNOS_NR_OPEN || !fcheck(fd)) goto out; /* First handle an easy compat. case for tty ldisc. */ diff --git a/arch/sparc/kernel/sys_sunos.c b/arch/sparc/kernel/sys_sunos.c index e8475ffeb..0e276362e 100644 --- a/arch/sparc/kernel/sys_sunos.c +++ b/arch/sparc/kernel/sys_sunos.c @@ -26,7 +26,6 @@ #include <linux/signal.h> #include <linux/uio.h> #include <linux/utsname.h> -#include <linux/fs.h> #include <linux/major.h> #include <linux/stat.h> #include <linux/malloc.h> diff --git a/arch/sparc/mm/asyncd.c b/arch/sparc/mm/asyncd.c index 1ae532b7c..300f5aa0a 100644 --- a/arch/sparc/mm/asyncd.c +++ b/arch/sparc/mm/asyncd.c @@ -1,4 +1,4 @@ -/* $Id: asyncd.c,v 1.13 1999/05/12 11:11:34 davem Exp $ +/* $Id: asyncd.c,v 1.15 1999/07/04 04:35:50 davem Exp $ * The asyncd kernel daemon. This handles paging on behalf of * processes that receive page faults due to remote (async) memory * accesses. diff --git a/arch/sparc/mm/fault.c b/arch/sparc/mm/fault.c index a6110b886..0f1f3d983 100644 --- a/arch/sparc/mm/fault.c +++ b/arch/sparc/mm/fault.c @@ -1,4 +1,4 @@ -/* $Id: fault.c,v 1.101 1999/01/04 06:24:52 jj Exp $ +/* $Id: fault.c,v 1.103 1999/07/04 04:35:51 davem Exp $ * fault.c: Page fault handlers for the Sparc. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -14,7 +14,6 @@ #include <linux/mman.h> #include <linux/tasks.h> #include <linux/kernel.h> -#include <linux/smp.h> #include <linux/signal.h> #include <linux/mm.h> #include <linux/smp.h> diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index 5b63aa11a..66d3c535d 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c @@ -2076,6 +2076,7 @@ static void srmmu_vac_update_mmu_cache(struct vm_area_struct * vma, goto done; inode = file->f_dentry->d_inode; offset = (address & PAGE_MASK) - vma->vm_start; + spin_lock(&inode->i_shared_lock); vmaring = inode->i_mmap; do { /* Do not mistake ourselves as another mapping. */ @@ -2109,6 +2110,7 @@ static void srmmu_vac_update_mmu_cache(struct vm_area_struct * vma, } } } while ((vmaring = vmaring->vm_next_share) != NULL); + spin_unlock(&inode->i_shared_lock); if(alias_found && ((pte_val(pte) & SRMMU_CACHE) != 0)) { pgdp = srmmu_pgd_offset(vma->vm_mm, address); diff --git a/arch/sparc/mm/sun4c.c b/arch/sparc/mm/sun4c.c index d6387d473..c6bf02fc0 100644 --- a/arch/sparc/mm/sun4c.c +++ b/arch/sparc/mm/sun4c.c @@ -2682,8 +2682,10 @@ static void sun4c_vac_alias_fixup(struct vm_area_struct *vma, unsigned long addr inode = dentry->d_inode; if(inode) { unsigned long offset = (address & PAGE_MASK) - vma->vm_start; - struct vm_area_struct *vmaring = inode->i_mmap; + struct vm_area_struct *vmaring; int alias_found = 0; + spin_lock(&inode->i_shared_lock); + vmaring = inode->i_mmap; do { unsigned long vaddr = vmaring->vm_start + offset; unsigned long start; @@ -2712,6 +2714,7 @@ static void sun4c_vac_alias_fixup(struct vm_area_struct *vma, unsigned long addr } } } while ((vmaring = vmaring->vm_next_share) != NULL); + spin_unlock(&inode->i_shared_lock); if(alias_found && !(pte_val(pte) & _SUN4C_PAGE_NOCACHE)) { pgdp = sun4c_pgd_offset(vma->vm_mm, address); |