Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'nios2-5.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/lftan/nios2

Pull arch/nios2 updates from Ley Foon Tan:

- don't use _end for calculating min_low_pfn

- fix broken sys_clone syscall

- take mmap lock in cacheflush syscall

* tag 'nios2-5.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/lftan/nios2:
nios2: Don't use _end for calculating min_low_pfn
nios2: fixed broken sys_clone syscall
Take mmap lock in cacheflush syscall

+24 -11
+3
arch/nios2/kernel/entry.S
··· 389 389 */ 390 390 ENTRY(sys_clone) 391 391 SAVE_SWITCH_STACK 392 + subi sp, sp, 4 /* make space for tls pointer */ 393 + stw r8, 0(sp) /* pass tls pointer (r8) via stack (5th argument) */ 392 394 call nios2_clone 395 + addi sp, sp, 4 393 396 RESTORE_SWITCH_STACK 394 397 ret 395 398
+12 -9
arch/nios2/kernel/setup.c
··· 32 32 unsigned long memory_end; 33 33 EXPORT_SYMBOL(memory_end); 34 34 35 - unsigned long memory_size; 36 - 37 35 static struct pt_regs fake_regs = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38 36 0, 0, 0, 0, 0, 0, 39 37 0}; ··· 139 141 parse_early_param(); 140 142 } 141 143 144 + static void __init find_limits(unsigned long *min, unsigned long *max_low, 145 + unsigned long *max_high) 146 + { 147 + *max_low = PFN_DOWN(memblock_get_current_limit()); 148 + *min = PFN_UP(memblock_start_of_DRAM()); 149 + *max_high = PFN_DOWN(memblock_end_of_DRAM()); 150 + } 151 + 142 152 void __init setup_arch(char **cmdline_p) 143 153 { 144 154 int dram_start; 145 155 146 156 console_verbose(); 147 157 148 - dram_start = memblock_start_of_DRAM(); 149 - memory_size = memblock_phys_mem_size(); 150 - memory_start = PAGE_ALIGN((unsigned long)__pa(_end)); 151 - memory_end = (unsigned long) CONFIG_NIOS2_MEM_BASE + memory_size; 158 + memory_start = memblock_start_of_DRAM(); 159 + memory_end = memblock_end_of_DRAM(); 152 160 153 161 init_mm.start_code = (unsigned long) _stext; 154 162 init_mm.end_code = (unsigned long) _etext; ··· 165 161 /* Keep a copy of command line */ 166 162 *cmdline_p = boot_command_line; 167 163 168 - min_low_pfn = PFN_UP(memory_start); 169 - max_low_pfn = PFN_DOWN(memory_end); 164 + find_limits(&min_low_pfn, &max_low_pfn, &max_pfn); 170 165 max_mapnr = max_low_pfn; 171 166 172 - memblock_reserve(dram_start, memory_start - dram_start); 167 + memblock_reserve(__pa_symbol(_stext), _end - _stext); 173 168 #ifdef CONFIG_BLK_DEV_INITRD 174 169 if (initrd_start) { 175 170 memblock_reserve(virt_to_phys((void *)initrd_start),
+9 -2
arch/nios2/kernel/sys_nios2.c
··· 22 22 unsigned int op) 23 23 { 24 24 struct vm_area_struct *vma; 25 + struct mm_struct *mm = current->mm; 25 26 26 27 if (len == 0) 27 28 return 0; ··· 35 34 if (addr + len < addr) 36 35 return -EFAULT; 37 36 37 + if (mmap_read_lock_killable(mm)) 38 + return -EINTR; 39 + 38 40 /* 39 41 * Verify that the specified address region actually belongs 40 42 * to this process. 41 43 */ 42 - vma = find_vma(current->mm, addr); 43 - if (vma == NULL || addr < vma->vm_start || addr + len > vma->vm_end) 44 + vma = find_vma(mm, addr); 45 + if (vma == NULL || addr < vma->vm_start || addr + len > vma->vm_end) { 46 + mmap_read_unlock(mm); 44 47 return -EFAULT; 48 + } 45 49 46 50 flush_cache_range(vma, addr, addr + len); 47 51 52 + mmap_read_unlock(mm); 48 53 return 0; 49 54 } 50 55