vserver 1.9.3
[linux-2.6.git] / arch / arm / kernel / traps.c
index 3f28167..d0f9837 100644 (file)
@@ -263,7 +263,7 @@ asmlinkage void do_undefinstr(struct pt_regs *regs)
        unsigned int instr;
        struct undef_hook *hook;
        siginfo_t info;
-       void *pc;
+       void __user *pc;
 
        /*
         * According to the ARM ARM, PC is 2 or 4 bytes ahead,
@@ -272,11 +272,11 @@ asmlinkage void do_undefinstr(struct pt_regs *regs)
         */
        regs->ARM_pc -= correction;
 
-       pc = (void *)instruction_pointer(regs);
+       pc = (void __user *)instruction_pointer(regs);
        if (thumb_mode(regs)) {
-               get_user(instr, (u16 *)pc);
+               get_user(instr, (u16 __user *)pc);
        } else {
-               get_user(instr, (u32 *)pc);
+               get_user(instr, (u32 __user *)pc);
        }
 
        spin_lock_irq(&undef_lock);
@@ -368,7 +368,7 @@ static int bad_syscall(int n, struct pt_regs *regs)
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code  = ILL_ILLTRP;
-       info.si_addr  = (void *)instruction_pointer(regs) -
+       info.si_addr  = (void __user *)instruction_pointer(regs) -
                         (thumb_mode(regs) ? 2 : 4);
 
        force_sig_info(SIGILL, &info, current);
@@ -381,7 +381,7 @@ do_cache_op(unsigned long start, unsigned long end, int flags)
 {
        struct vm_area_struct *vma;
 
-       if (end < start)
+       if (end < start || flags)
                return;
 
        vma = find_vma(current->active_mm, start);
@@ -391,7 +391,7 @@ do_cache_op(unsigned long start, unsigned long end, int flags)
                if (end > vma->vm_end)
                        end = vma->vm_end;
 
-               flush_cache_range(vma, start, end);
+               flush_cache_user_range(vma, start, end);
        }
 }
 
@@ -426,7 +426,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
 
        /*
         * Flush a region from virtual address 'r0' to virtual address 'r1'
-        * _inclusive_.  There is no alignment requirement on either address;
+        * _exclusive_.  There is no alignment requirement on either address;
         * user space does not need to know the hardware cache layout.
         *
         * r2 contains flags.  It should ALWAYS be passed as ZERO until it
@@ -481,7 +481,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code  = ILL_ILLTRP;
-       info.si_addr  = (void *)instruction_pointer(regs) -
+       info.si_addr  = (void __user *)instruction_pointer(regs) -
                         (thumb_mode(regs) ? 2 : 4);
 
        force_sig_info(SIGILL, &info, current);
@@ -519,7 +519,7 @@ baddataabort(int code, unsigned long instr, struct pt_regs *regs)
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code  = ILL_ILLOPC;
-       info.si_addr  = (void *)addr;
+       info.si_addr  = (void __user *)addr;
 
        force_sig_info(SIGILL, &info, current);
        die_if_kernel("unknown data abort code", regs, instr);
@@ -562,7 +562,7 @@ asmlinkage void __div0(void)
        printk("Division by zero in kernel.\n");
        dump_stack();
 }
-EXPORT_SYMBOL_NOVERS(__div0);
+EXPORT_SYMBOL(__div0);
 
 void abort(void)
 {