Merge tag 'arc-5.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 16 Jul 2019 22:07:51 +0000 (15:07 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 16 Jul 2019 22:07:51 +0000 (15:07 -0700)
Pull ARC updates from Vineet Gupta:

 - long due rewrite of do_page_fault

 - refactoring of entry/exit code to utilize the double load/store
   instructions

 - hsdk platform updates

* tag 'arc-5.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc:
  ARC: [plat-hsdk]: Enable AXI DW DMAC in defconfig
  ARC: [plat-hsdk]: enable DW SPI controller
  ARC: hide unused function unw_hdr_alloc
  ARC: [haps] Add Virtio support
  ARCv2: entry: simplify return to Delay Slot via interrupt
  ARC: entry: EV_Trap expects r10 (vs. r9) to have exception cause
  ARCv2: entry: rewrite to enable use of double load/stores LDD/STD
  ARCv2: entry: avoid a branch
  ARCv2: entry: push out the Z flag unclobber from common EXCEPTION_PROLOGUE
  ARCv2: entry: comments about hardware auto-save on taken interrupts
  ARC: mm: do_page_fault refactor #8: release mmap_sem sooner
  ARC: mm: do_page_fault refactor #7: fold the various error handling
  ARC: mm: do_page_fault refactor #6: error handlers to use same pattern
  ARC: mm: do_page_fault refactor #5: scoot no_context to end
  ARC: mm: do_page_fault refactor #4: consolidate retry related logic
  ARC: mm: do_page_fault refactor #3: tidyup vma access permission code
  ARC: mm: do_page_fault refactor #2: remove short lived variable
  ARC: mm: do_page_fault refactor #1: remove label @good_area

1  2 
arch/arc/mm/fault.c

@@@ -222,14 -184,21 +184,21 @@@ bad_area
                return;
        }
  
-       goto no_context;
+       if (fault & VM_FAULT_SIGBUS) {
+               sig = SIGBUS;
+               si_code = BUS_ADRERR;
+       }
+       else {
+               sig = SIGSEGV;
+       }
  
- do_sigbus:
-       up_read(&mm->mmap_sem);
+       tsk->thread.fault_address = address;
 -      force_sig_fault(sig, si_code, (void __user *)address, tsk);
++      force_sig_fault(sig, si_code, (void __user *)address);
+       return;
  
-       if (!user_mode(regs))
-               goto no_context;
+ no_context:
+       if (fixup_exception(regs))
+               return;
  
-       tsk->thread.fault_address = address;
-       force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address);
+       die("Oops", regs, address);
  }