All of lore.kernel.org
 help / color / mirror / Atom feed
* [ammarfaizi2-block:viro/vfs/fixes 5/10] arch/microblaze/mm/fault.c:224:25: error: label 'no_context' used but not defined
@ 2023-02-25  8:59 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2023-02-25  8:59 UTC (permalink / raw)
  To: Al Viro; +Cc: oe-kbuild-all, Ammar Faizi, GNU/Weeb Mailing List

tree:   https://github.com/ammarfaizi2/linux-block viro/vfs/fixes
head:   b260379a90a440564d4c0196ec52f621b1c05020
commit: 8820100806d82abf47169f2ac4a1a1d64d83b220 [5/10] microblaze: fix livelock in uaccess
config: microblaze-randconfig-r011-20230222 (https://download.01.org/0day-ci/archive/20230225/202302251612.lARjPOWJ-lkp@intel.com/config)
compiler: microblaze-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/ammarfaizi2/linux-block/commit/8820100806d82abf47169f2ac4a1a1d64d83b220
        git remote add ammarfaizi2-block https://github.com/ammarfaizi2/linux-block
        git fetch --no-tags ammarfaizi2-block viro/vfs/fixes
        git checkout 8820100806d82abf47169f2ac4a1a1d64d83b220
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=microblaze olddefconfig
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=microblaze SHELL=/bin/bash arch/microblaze/mm/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>
| Link: https://lore.kernel.org/oe-kbuild-all/202302251612.lARjPOWJ-lkp@intel.com/

All errors (new ones prefixed by >>):

   arch/microblaze/mm/fault.c: In function 'do_page_fault':
>> arch/microblaze/mm/fault.c:224:25: error: label 'no_context' used but not defined
     224 |                         goto no_context;
         |                         ^~~~


vim +/no_context +224 arch/microblaze/mm/fault.c

    81	
    82	/*
    83	 * The error_code parameter is ESR for a data fault,
    84	 * 0 for an instruction fault.
    85	 */
    86	void do_page_fault(struct pt_regs *regs, unsigned long address,
    87			   unsigned long error_code)
    88	{
    89		struct vm_area_struct *vma;
    90		struct mm_struct *mm = current->mm;
    91		int code = SEGV_MAPERR;
    92		int is_write = error_code & ESR_S;
    93		vm_fault_t fault;
    94		unsigned int flags = FAULT_FLAG_DEFAULT;
    95	
    96		regs->ear = address;
    97		regs->esr = error_code;
    98	
    99		/* On a kernel SLB miss we can only check for a valid exception entry */
   100		if (unlikely(kernel_mode(regs) && (address >= TASK_SIZE))) {
   101			pr_warn("kernel task_size exceed");
   102			_exception(SIGSEGV, regs, code, address);
   103		}
   104	
   105		/* for instr TLB miss and instr storage exception ESR_S is undefined */
   106		if ((error_code & 0x13) == 0x13 || (error_code & 0x11) == 0x11)
   107			is_write = 0;
   108	
   109		if (unlikely(faulthandler_disabled() || !mm)) {
   110			if (kernel_mode(regs))
   111				goto bad_area_nosemaphore;
   112	
   113			/* faulthandler_disabled() in user mode is really bad,
   114			   as is current->mm == NULL. */
   115			pr_emerg("Page fault in user mode with faulthandler_disabled(), mm = %p\n",
   116				 mm);
   117			pr_emerg("r15 = %lx  MSR = %lx\n",
   118			       regs->r15, regs->msr);
   119			die("Weird page fault", regs, SIGSEGV);
   120		}
   121	
   122		if (user_mode(regs))
   123			flags |= FAULT_FLAG_USER;
   124	
   125		perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
   126	
   127		/* When running in the kernel we expect faults to occur only to
   128		 * addresses in user space.  All other faults represent errors in the
   129		 * kernel and should generate an OOPS.  Unfortunately, in the case of an
   130		 * erroneous fault occurring in a code path which already holds mmap_lock
   131		 * we will deadlock attempting to validate the fault against the
   132		 * address space.  Luckily the kernel only validly references user
   133		 * space from well defined areas of code, which are listed in the
   134		 * exceptions table.
   135		 *
   136		 * As the vast majority of faults will be valid we will only perform
   137		 * the source reference check when there is a possibility of a deadlock.
   138		 * Attempt to lock the address space, if we cannot we then validate the
   139		 * source.  If this is invalid we can skip the address space check,
   140		 * thus avoiding the deadlock.
   141		 */
   142		if (unlikely(!mmap_read_trylock(mm))) {
   143			if (kernel_mode(regs) && !search_exception_tables(regs->pc))
   144				goto bad_area_nosemaphore;
   145	
   146	retry:
   147			mmap_read_lock(mm);
   148		}
   149	
   150		vma = find_vma(mm, address);
   151		if (unlikely(!vma))
   152			goto bad_area;
   153	
   154		if (vma->vm_start <= address)
   155			goto good_area;
   156	
   157		if (unlikely(!(vma->vm_flags & VM_GROWSDOWN)))
   158			goto bad_area;
   159	
   160		if (unlikely(!is_write))
   161			goto bad_area;
   162	
   163		/*
   164		 * N.B. The ABI allows programs to access up to
   165		 * a few hundred bytes below the stack pointer (TBD).
   166		 * The kernel signal delivery code writes up to about 1.5kB
   167		 * below the stack pointer (r1) before decrementing it.
   168		 * The exec code can write slightly over 640kB to the stack
   169		 * before setting the user r1.  Thus we allow the stack to
   170		 * expand to 1MB without further checks.
   171		 */
   172		if (unlikely(address + 0x100000 < vma->vm_end)) {
   173	
   174			/* get user regs even if this fault is in kernel mode */
   175			struct pt_regs *uregs = current->thread.regs;
   176			if (uregs == NULL)
   177				goto bad_area;
   178	
   179			/*
   180			 * A user-mode access to an address a long way below
   181			 * the stack pointer is only valid if the instruction
   182			 * is one which would update the stack pointer to the
   183			 * address accessed if the instruction completed,
   184			 * i.e. either stwu rs,n(r1) or stwux rs,r1,rb
   185			 * (or the byte, halfword, float or double forms).
   186			 *
   187			 * If we don't check this then any write to the area
   188			 * between the last mapped region and the stack will
   189			 * expand the stack rather than segfaulting.
   190			 */
   191			if (address + 2048 < uregs->r1
   192				&& (kernel_mode(regs) || !store_updates_sp(regs)))
   193					goto bad_area;
   194		}
   195		if (expand_stack(vma, address))
   196			goto bad_area;
   197	
   198	good_area:
   199		code = SEGV_ACCERR;
   200	
   201		/* a write */
   202		if (unlikely(is_write)) {
   203			if (unlikely(!(vma->vm_flags & VM_WRITE)))
   204				goto bad_area;
   205			flags |= FAULT_FLAG_WRITE;
   206		/* a read */
   207		} else {
   208			/* protection fault */
   209			if (unlikely(error_code & 0x08000000))
   210				goto bad_area;
   211			if (unlikely(!(vma->vm_flags & (VM_READ | VM_EXEC))))
   212				goto bad_area;
   213		}
   214	
   215		/*
   216		 * If for any reason at all we couldn't handle the fault,
   217		 * make sure we exit gracefully rather than endlessly redo
   218		 * the fault.
   219		 */
   220		fault = handle_mm_fault(vma, address, flags, regs);
   221	
   222		if (fault_signal_pending(fault, regs)) {
   223			if (!user_mode(regs))
 > 224				goto no_context;
   225			return;
   226		}
   227	
   228		/* The fault is fully completed (including releasing mmap lock) */
   229		if (fault & VM_FAULT_COMPLETED)
   230			return;
   231	
   232		if (unlikely(fault & VM_FAULT_ERROR)) {
   233			if (fault & VM_FAULT_OOM)
   234				goto out_of_memory;
   235			else if (fault & VM_FAULT_SIGSEGV)
   236				goto bad_area;
   237			else if (fault & VM_FAULT_SIGBUS)
   238				goto do_sigbus;
   239			BUG();
   240		}
   241	
   242		if (fault & VM_FAULT_RETRY) {
   243			flags |= FAULT_FLAG_TRIED;
   244	
   245			/*
   246			 * No need to mmap_read_unlock(mm) as we would
   247			 * have already released it in __lock_page_or_retry
   248			 * in mm/filemap.c.
   249			 */
   250	
   251			goto retry;
   252		}
   253	
   254		mmap_read_unlock(mm);
   255	
   256		/*
   257		 * keep track of tlb+htab misses that are good addrs but
   258		 * just need pte's created via handle_mm_fault()
   259		 * -- Cort
   260		 */
   261		pte_misses++;
   262		return;
   263	
   264	bad_area:
   265		mmap_read_unlock(mm);
   266	
   267	bad_area_nosemaphore:
   268		pte_errors++;
   269	
   270		/* User mode accesses cause a SIGSEGV */
   271		if (user_mode(regs)) {
   272			_exception(SIGSEGV, regs, code, address);
   273			return;
   274		}
   275	
   276		bad_page_fault(regs, address, SIGSEGV);
   277		return;
   278	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-02-25  9:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-02-25  8:59 [ammarfaizi2-block:viro/vfs/fixes 5/10] arch/microblaze/mm/fault.c:224:25: error: label 'no_context' used but not defined kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.