commit 68b498d251d97de9adda518fda42cfe1451063b7
Author: David S. Miller <[EMAIL PROTECTED]>
Date:   Thu Mar 6 14:47:20 2008 -0800

    SPARC64: Loosen checks in exception table handling.
    
    Upstream commits: 622eaec613130e6ea78f2a5d5070e3278b21cd8f
                      be71716e464f4ea38f08034dc666f2feb55535d9
    
    Some parts of the kernel now do things like do *_user() accesses while
    set_fs(KERNEL_DS) that fault on purpose.
    
    See, for example, the code added by changeset
    a0c1e9073ef7428a14309cba010633a6cd6719ea ("futex: runtime enable pi
    and robust functionality").
    
    That trips up the ASI sanity checking we make in do_kernel_fault().
    
    Just remove it for now.  Maybe we can add it back later with an added
    conditional which looks at the current get_fs() value.
    
    Also, because of the new futex validation init handler, we have
    to accept faults in init section text as well as the normal
    kernel text.
    
    Thanks to Tom Callaway for the bug report.
    
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
    Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
    Signed-off-by: Chris Wright <[EMAIL PROTECTED]>

diff --git a/arch/sparc64/mm/fault.c b/arch/sparc64/mm/fault.c
index e2027f2..2650d0d 100644
--- a/arch/sparc64/mm/fault.c
+++ b/arch/sparc64/mm/fault.c
@@ -244,16 +244,8 @@ static void do_kernel_fault(struct pt_regs *regs, int 
si_code, int fault_code,
        if (regs->tstate & TSTATE_PRIV) {
                const struct exception_table_entry *entry;
 
-               if (asi == ASI_P && (insn & 0xc0800000) == 0xc0800000) {
-                       if (insn & 0x2000)
-                               asi = (regs->tstate >> 24);
-                       else
-                               asi = (insn >> 5);
-               }
-       
-               /* Look in asi.h: All _S asis have LS bit set */
-               if ((asi & 0x1) &&
-                   (entry = search_exception_tables(regs->tpc))) {
+               entry = search_exception_tables(regs->tpc);
+               if (entry) {
                        regs->tpc = entry->fixup;
                        regs->tnpc = regs->tpc + 4;
                        return;
@@ -294,7 +286,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs 
*regs)
                unsigned long tpc = regs->tpc;
 
                /* Sanity check the PC. */
-               if ((tpc >= KERNBASE && tpc < (unsigned long) _etext) ||
+               if ((tpc >= KERNBASE && tpc < (unsigned long) __init_end) ||
                    (tpc >= MODULES_VADDR && tpc < MODULES_END)) {
                        /* Valid, no problems... */
                } else {
_______________________________________________
unionfs-cvs mailing list: http://unionfs.filesystems.org/
[email protected]
http://www.fsl.cs.sunysb.edu/mailman/listinfo/unionfs-cvs

Reply via email to