diff options
Diffstat (limited to 'arch/sparc')
| -rw-r--r-- | arch/sparc/Kconfig | 2 | ||||
| -rw-r--r-- | arch/sparc/include/asm/page_64.h | 3 | ||||
| -rw-r--r-- | arch/sparc/include/asm/pgtable_64.h | 16 | ||||
| -rw-r--r-- | arch/sparc/include/asm/processor_32.h | 6 | ||||
| -rw-r--r-- | arch/sparc/include/asm/processor_64.h | 4 | ||||
| -rw-r--r-- | arch/sparc/kernel/head_64.S | 4 | ||||
| -rw-r--r-- | arch/sparc/kernel/misctrap.S | 1 | ||||
| -rw-r--r-- | arch/sparc/kernel/ptrace_64.c | 2 | ||||
| -rw-r--r-- | arch/sparc/kernel/rtrap_64.S | 1 | ||||
| -rw-r--r-- | arch/sparc/kernel/spiterrs.S | 1 | ||||
| -rw-r--r-- | arch/sparc/kernel/sun4v_tlb_miss.S | 1 | ||||
| -rw-r--r-- | arch/sparc/kernel/urtt_fill.S | 1 | ||||
| -rw-r--r-- | arch/sparc/kernel/winfixup.S | 2 | ||||
| -rw-r--r-- | arch/sparc/lib/NG2memcpy.S | 4 | ||||
| -rw-r--r-- | arch/sparc/lib/NG4memcpy.S | 1 | ||||
| -rw-r--r-- | arch/sparc/lib/NG4memset.S | 1 | ||||
| -rw-r--r-- | arch/sparc/lib/NGmemcpy.S | 1 | ||||
| -rw-r--r-- | arch/sparc/mm/hugetlbpage.c | 25 | ||||
| -rw-r--r-- | arch/sparc/mm/init_64.c | 6 | ||||
| -rw-r--r-- | arch/sparc/mm/srmmu.c | 1 | ||||
| -rw-r--r-- | arch/sparc/mm/tlb.c | 6 | ||||
| -rw-r--r-- | arch/sparc/mm/tsb.c | 4 | 
22 files changed, 66 insertions, 27 deletions
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 68ac5c7cd982..a59deaef21e5 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -43,7 +43,7 @@ config SPARC  	select ARCH_HAS_SG_CHAIN  	select CPU_NO_EFFICIENT_FFS  	select HAVE_ARCH_HARDENED_USERCOPY -	select PROVE_LOCKING_SMALL if PROVE_LOCKING +	select LOCKDEP_SMALL if LOCKDEP  	select ARCH_WANT_RELAX_ORDER  config SPARC32 diff --git a/arch/sparc/include/asm/page_64.h b/arch/sparc/include/asm/page_64.h index f294dd42fc7d..5961b2d8398a 100644 --- a/arch/sparc/include/asm/page_64.h +++ b/arch/sparc/include/asm/page_64.h @@ -17,6 +17,7 @@  #define HPAGE_SHIFT		23  #define REAL_HPAGE_SHIFT	22 +#define HPAGE_2GB_SHIFT		31  #define HPAGE_256MB_SHIFT	28  #define HPAGE_64K_SHIFT		16  #define REAL_HPAGE_SIZE		(_AC(1,UL) << REAL_HPAGE_SHIFT) @@ -27,7 +28,7 @@  #define HUGETLB_PAGE_ORDER	(HPAGE_SHIFT - PAGE_SHIFT)  #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA  #define REAL_HPAGE_PER_HPAGE	(_AC(1,UL) << (HPAGE_SHIFT - REAL_HPAGE_SHIFT)) -#define HUGE_MAX_HSTATE		3 +#define HUGE_MAX_HSTATE		4  #endif  #ifndef __ASSEMBLY__ diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h index 56e49c8f770d..6fbd931f0570 100644 --- a/arch/sparc/include/asm/pgtable_64.h +++ b/arch/sparc/include/asm/pgtable_64.h @@ -12,6 +12,7 @@   * the SpitFire page tables.   */ +#include <asm-generic/5level-fixup.h>  #include <linux/compiler.h>  #include <linux/const.h>  #include <asm/types.h> @@ -678,26 +679,27 @@ static inline unsigned long pmd_pfn(pmd_t pmd)  	return pte_pfn(pte);  } -#ifdef CONFIG_TRANSPARENT_HUGEPAGE -static inline unsigned long pmd_dirty(pmd_t pmd) +#define __HAVE_ARCH_PMD_WRITE +static inline unsigned long pmd_write(pmd_t pmd)  {  	pte_t pte = __pte(pmd_val(pmd)); -	return pte_dirty(pte); +	return pte_write(pte);  } -static inline unsigned long pmd_young(pmd_t pmd) +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +static inline unsigned long pmd_dirty(pmd_t pmd)  {  	pte_t pte = __pte(pmd_val(pmd)); -	return pte_young(pte); +	return pte_dirty(pte);  } -static inline unsigned long pmd_write(pmd_t pmd) +static inline unsigned long pmd_young(pmd_t pmd)  {  	pte_t pte = __pte(pmd_val(pmd)); -	return pte_write(pte); +	return pte_young(pte);  }  static inline unsigned long pmd_trans_huge(pmd_t pmd) diff --git a/arch/sparc/include/asm/processor_32.h b/arch/sparc/include/asm/processor_32.h index 365d4cb267b4..dd27159819eb 100644 --- a/arch/sparc/include/asm/processor_32.h +++ b/arch/sparc/include/asm/processor_32.h @@ -18,12 +18,6 @@  #include <asm/signal.h>  #include <asm/page.h> -/* - * The sparc has no problems with write protection - */ -#define wp_works_ok 1 -#define wp_works_ok__is_a_macro /* for versions in ksyms.c */ -  /* Whee, this is STACK_TOP + PAGE_SIZE and the lowest kernel address too...   * That one page is used to protect kernel from intruders, so that   * we can make our access_ok test faster diff --git a/arch/sparc/include/asm/processor_64.h b/arch/sparc/include/asm/processor_64.h index 6448cfc8292f..b58ee9018433 100644 --- a/arch/sparc/include/asm/processor_64.h +++ b/arch/sparc/include/asm/processor_64.h @@ -18,10 +18,6 @@  #include <asm/ptrace.h>  #include <asm/page.h> -/* The sparc has no problems with write protection */ -#define wp_works_ok 1 -#define wp_works_ok__is_a_macro /* for versions in ksyms.c */ -  /*   * User lives in his very own context, and cannot reference us. Note   * that TASK_SIZE is a misnomer, it really gives maximum user virtual diff --git a/arch/sparc/kernel/head_64.S b/arch/sparc/kernel/head_64.S index 6aa3da152c20..44101196d02b 100644 --- a/arch/sparc/kernel/head_64.S +++ b/arch/sparc/kernel/head_64.S @@ -96,6 +96,7 @@ sparc64_boot:  	andn	%g1, PSTATE_AM, %g1  	wrpr	%g1, 0x0, %pstate  	ba,a,pt	%xcc, 1f +	 nop  	.globl	prom_finddev_name, prom_chosen_path, prom_root_node  	.globl	prom_getprop_name, prom_mmu_name, prom_peer_name @@ -613,6 +614,7 @@ niagara_tlb_fixup:  	 nop  	ba,a,pt	%xcc, 80f +	 nop  niagara4_patch:  	call	niagara4_patch_copyops  	 nop @@ -622,6 +624,7 @@ niagara4_patch:  	 nop  	ba,a,pt	%xcc, 80f +	 nop  niagara2_patch:  	call	niagara2_patch_copyops @@ -632,6 +635,7 @@ niagara2_patch:  	 nop  	ba,a,pt	%xcc, 80f +	 nop  niagara_patch:  	call	niagara_patch_copyops diff --git a/arch/sparc/kernel/misctrap.S b/arch/sparc/kernel/misctrap.S index 34b4933900bf..9276d2f0dd86 100644 --- a/arch/sparc/kernel/misctrap.S +++ b/arch/sparc/kernel/misctrap.S @@ -82,6 +82,7 @@ do_stdfmna:  	call		handle_stdfmna  	 add		%sp, PTREGS_OFF, %o0  	ba,a,pt		%xcc, rtrap +	 nop  	.size		do_stdfmna,.-do_stdfmna  	.type		breakpoint_trap,#function diff --git a/arch/sparc/kernel/ptrace_64.c b/arch/sparc/kernel/ptrace_64.c index df9e731a76f5..fc5124ccdb53 100644 --- a/arch/sparc/kernel/ptrace_64.c +++ b/arch/sparc/kernel/ptrace_64.c @@ -351,7 +351,7 @@ static int genregs64_set(struct task_struct *target,  	}  	if (!ret) { -		unsigned long y; +		unsigned long y = regs->y;  		ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,  					 &y, diff --git a/arch/sparc/kernel/rtrap_64.S b/arch/sparc/kernel/rtrap_64.S index 216948ca4382..709a82ebd294 100644 --- a/arch/sparc/kernel/rtrap_64.S +++ b/arch/sparc/kernel/rtrap_64.S @@ -237,6 +237,7 @@ rt_continue:	ldx			[%sp + PTREGS_OFF + PT_V9_G1], %g1  		bne,pt			%xcc, user_rtt_fill_32bit  		 wrpr			%g1, %cwp  		ba,a,pt			%xcc, user_rtt_fill_64bit +		 nop  user_rtt_fill_fixup_dax:  		ba,pt	%xcc, user_rtt_fill_fixup_common diff --git a/arch/sparc/kernel/spiterrs.S b/arch/sparc/kernel/spiterrs.S index 4a73009f66a5..d7e540842809 100644 --- a/arch/sparc/kernel/spiterrs.S +++ b/arch/sparc/kernel/spiterrs.S @@ -86,6 +86,7 @@ __spitfire_cee_trap_continue:  	 rd		%pc, %g7  	ba,a,pt		%xcc, 2f +	 nop  1:	ba,pt		%xcc, etrap_irq  	 rd		%pc, %g7 diff --git a/arch/sparc/kernel/sun4v_tlb_miss.S b/arch/sparc/kernel/sun4v_tlb_miss.S index 6179e19bc9b9..c19f352f46c7 100644 --- a/arch/sparc/kernel/sun4v_tlb_miss.S +++ b/arch/sparc/kernel/sun4v_tlb_miss.S @@ -352,6 +352,7 @@ sun4v_mna:  	call	sun4v_do_mna  	 add	%sp, PTREGS_OFF, %o0  	ba,a,pt	%xcc, rtrap +	 nop  	/* Privileged Action.  */  sun4v_privact: diff --git a/arch/sparc/kernel/urtt_fill.S b/arch/sparc/kernel/urtt_fill.S index 5604a2b051d4..364af3250646 100644 --- a/arch/sparc/kernel/urtt_fill.S +++ b/arch/sparc/kernel/urtt_fill.S @@ -92,6 +92,7 @@ user_rtt_fill_fixup_common:  		call	sun4v_data_access_exception  		 nop  		ba,a,pt	%xcc, rtrap +		 nop  1:		call	spitfire_data_access_exception  		 nop diff --git a/arch/sparc/kernel/winfixup.S b/arch/sparc/kernel/winfixup.S index 855019a8590e..1ee173cc3c39 100644 --- a/arch/sparc/kernel/winfixup.S +++ b/arch/sparc/kernel/winfixup.S @@ -152,6 +152,8 @@ fill_fixup_dax:  	call	sun4v_data_access_exception  	 nop  	ba,a,pt	%xcc, rtrap +	 nop  1:	call	spitfire_data_access_exception  	 nop  	ba,a,pt	%xcc, rtrap +	 nop diff --git a/arch/sparc/lib/NG2memcpy.S b/arch/sparc/lib/NG2memcpy.S index c629dbd121b6..64dcd6cdb606 100644 --- a/arch/sparc/lib/NG2memcpy.S +++ b/arch/sparc/lib/NG2memcpy.S @@ -326,11 +326,13 @@ FUNC_NAME:	/* %o0=dst, %o1=src, %o2=len */  	blu		170f  	 nop  	ba,a,pt		%xcc, 180f +	 nop  4:	/* 32 <= low bits < 48 */  	blu		150f  	 nop  	ba,a,pt		%xcc, 160f +	 nop  5:	/* 0 < low bits < 32 */  	blu,a		6f  	 cmp		%g2, 8 @@ -338,6 +340,7 @@ FUNC_NAME:	/* %o0=dst, %o1=src, %o2=len */  	blu		130f  	 nop  	ba,a,pt		%xcc, 140f +	 nop  6:	/* 0 < low bits < 16 */  	bgeu		120f  	 nop @@ -475,6 +478,7 @@ FUNC_NAME:	/* %o0=dst, %o1=src, %o2=len */  	brz,pt		%o2, 85f  	 sub		%o0, %o1, GLOBAL_SPARE  	ba,a,pt		%XCC, 90f +	 nop  	.align		64  75: /* 16 < len <= 64 */ diff --git a/arch/sparc/lib/NG4memcpy.S b/arch/sparc/lib/NG4memcpy.S index 75bb93b1437f..78ea962edcbe 100644 --- a/arch/sparc/lib/NG4memcpy.S +++ b/arch/sparc/lib/NG4memcpy.S @@ -530,4 +530,5 @@ FUNC_NAME:	/* %o0=dst, %o1=src, %o2=len */  	bne,pt		%icc, 1b  	 EX_ST(STORE(stb, %g1, %o0 - 0x01), NG4_retl_o2_plus_1)  	ba,a,pt		%icc, .Lexit +	 nop  	.size		FUNC_NAME, .-FUNC_NAME diff --git a/arch/sparc/lib/NG4memset.S b/arch/sparc/lib/NG4memset.S index 41da4bdd95cb..7c0c81f18837 100644 --- a/arch/sparc/lib/NG4memset.S +++ b/arch/sparc/lib/NG4memset.S @@ -102,4 +102,5 @@ NG4bzero:  	bne,pt		%icc, 1b  	 add		%o0, 0x30, %o0  	ba,a,pt		%icc, .Lpostloop +	 nop  	.size		NG4bzero,.-NG4bzero diff --git a/arch/sparc/lib/NGmemcpy.S b/arch/sparc/lib/NGmemcpy.S index d88c4ed50a00..cd654a719b27 100644 --- a/arch/sparc/lib/NGmemcpy.S +++ b/arch/sparc/lib/NGmemcpy.S @@ -394,6 +394,7 @@ FUNC_NAME:	/* %i0=dst, %i1=src, %i2=len */  	brz,pt		%i2, 85f  	 sub		%o0, %i1, %i3  	ba,a,pt		%XCC, 90f +	 nop  	.align		64  70: /* 16 < len <= 64 */ diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c index 323bc6b6e3ad..7c29d38e6b99 100644 --- a/arch/sparc/mm/hugetlbpage.c +++ b/arch/sparc/mm/hugetlbpage.c @@ -143,6 +143,10 @@ static pte_t sun4v_hugepage_shift_to_tte(pte_t entry, unsigned int shift)  	pte_val(entry) = pte_val(entry) & ~_PAGE_SZALL_4V;  	switch (shift) { +	case HPAGE_2GB_SHIFT: +		hugepage_size = _PAGE_SZ2GB_4V; +		pte_val(entry) |= _PAGE_PMD_HUGE; +		break;  	case HPAGE_256MB_SHIFT:  		hugepage_size = _PAGE_SZ256MB_4V;  		pte_val(entry) |= _PAGE_PMD_HUGE; @@ -183,6 +187,9 @@ static unsigned int sun4v_huge_tte_to_shift(pte_t entry)  	unsigned int shift;  	switch (tte_szbits) { +	case _PAGE_SZ2GB_4V: +		shift = HPAGE_2GB_SHIFT; +		break;  	case _PAGE_SZ256MB_4V:  		shift = HPAGE_256MB_SHIFT;  		break; @@ -261,7 +268,7 @@ pte_t *huge_pte_alloc(struct mm_struct *mm,  		if (!pmd)  			return NULL; -		if (sz == PMD_SHIFT) +		if (sz >= PMD_SIZE)  			pte = (pte_t *)pmd;  		else  			pte = pte_alloc_map(mm, pmd, addr); @@ -454,6 +461,22 @@ void hugetlb_free_pgd_range(struct mmu_gather *tlb,  	pgd_t *pgd;  	unsigned long next; +	addr &= PMD_MASK; +	if (addr < floor) { +		addr += PMD_SIZE; +		if (!addr) +			return; +	} +	if (ceiling) { +		ceiling &= PMD_MASK; +		if (!ceiling) +			return; +	} +	if (end - 1 > ceiling - 1) +		end -= PMD_SIZE; +	if (addr > end - 1) +		return; +  	pgd = pgd_offset(tlb->mm, addr);  	do {  		next = pgd_addr_end(addr, end); diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index ccd455328989..0cda653ae007 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c @@ -337,6 +337,10 @@ static int __init setup_hugepagesz(char *string)  	hugepage_shift = ilog2(hugepage_size);  	switch (hugepage_shift) { +	case HPAGE_2GB_SHIFT: +		hv_pgsz_mask = HV_PGSZ_MASK_2GB; +		hv_pgsz_idx = HV_PGSZ_IDX_2GB; +		break;  	case HPAGE_256MB_SHIFT:  		hv_pgsz_mask = HV_PGSZ_MASK_256MB;  		hv_pgsz_idx = HV_PGSZ_IDX_256MB; @@ -1563,7 +1567,7 @@ bool kern_addr_valid(unsigned long addr)  	if ((long)addr < 0L) {  		unsigned long pa = __pa(addr); -		if ((addr >> max_phys_bits) != 0UL) +		if ((pa >> max_phys_bits) != 0UL)  			return false;  		return pfn_valid(pa >> PAGE_SHIFT); diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index def82f6d626f..8e76ebba2986 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c @@ -54,6 +54,7 @@  enum mbus_module srmmu_modtype;  static unsigned int hwbug_bitmask;  int vac_cache_size; +EXPORT_SYMBOL(vac_cache_size);  int vac_line_size;  extern struct resource sparc_iomap; diff --git a/arch/sparc/mm/tlb.c b/arch/sparc/mm/tlb.c index afda3bbf7854..ee8066c3d96c 100644 --- a/arch/sparc/mm/tlb.c +++ b/arch/sparc/mm/tlb.c @@ -154,7 +154,7 @@ static void tlb_batch_pmd_scan(struct mm_struct *mm, unsigned long vaddr,  		if (pte_val(*pte) & _PAGE_VALID) {  			bool exec = pte_exec(*pte); -			tlb_batch_add_one(mm, vaddr, exec, false); +			tlb_batch_add_one(mm, vaddr, exec, PAGE_SHIFT);  		}  		pte++;  		vaddr += PAGE_SIZE; @@ -209,9 +209,9 @@ void set_pmd_at(struct mm_struct *mm, unsigned long addr,  			pte_t orig_pte = __pte(pmd_val(orig));  			bool exec = pte_exec(orig_pte); -			tlb_batch_add_one(mm, addr, exec, true); +			tlb_batch_add_one(mm, addr, exec, REAL_HPAGE_SHIFT);  			tlb_batch_add_one(mm, addr + REAL_HPAGE_SIZE, exec, -					true); +					  REAL_HPAGE_SHIFT);  		} else {  			tlb_batch_pmd_scan(mm, addr, orig);  		} diff --git a/arch/sparc/mm/tsb.c b/arch/sparc/mm/tsb.c index 0a04811f06b7..bedf08b22a47 100644 --- a/arch/sparc/mm/tsb.c +++ b/arch/sparc/mm/tsb.c @@ -122,7 +122,7 @@ void flush_tsb_user(struct tlb_batch *tb)  	spin_lock_irqsave(&mm->context.lock, flags); -	if (tb->hugepage_shift < HPAGE_SHIFT) { +	if (tb->hugepage_shift < REAL_HPAGE_SHIFT) {  		base = (unsigned long) mm->context.tsb_block[MM_TSB_BASE].tsb;  		nentries = mm->context.tsb_block[MM_TSB_BASE].tsb_nentries;  		if (tlb_type == cheetah_plus || tlb_type == hypervisor) @@ -155,7 +155,7 @@ void flush_tsb_user_page(struct mm_struct *mm, unsigned long vaddr,  	spin_lock_irqsave(&mm->context.lock, flags); -	if (hugepage_shift < HPAGE_SHIFT) { +	if (hugepage_shift < REAL_HPAGE_SHIFT) {  		base = (unsigned long) mm->context.tsb_block[MM_TSB_BASE].tsb;  		nentries = mm->context.tsb_block[MM_TSB_BASE].tsb_nentries;  		if (tlb_type == cheetah_plus || tlb_type == hypervisor)  | 
