diff options
Diffstat (limited to 'arch/arm/mm')
| -rw-r--r-- | arch/arm/mm/alignment.c | 24 | ||||
| -rw-r--r-- | arch/arm/mm/cache-v6.S | 17 | ||||
| -rw-r--r-- | arch/arm/mm/cache-v7.S | 4 | ||||
| -rw-r--r-- | arch/arm/mm/init.c | 14 | ||||
| -rw-r--r-- | arch/arm/mm/nommu.c | 13 | ||||
| -rw-r--r-- | arch/arm/mm/proc-sa1100.S | 2 | ||||
| -rw-r--r-- | arch/arm/mm/tlb-v7.S | 8 | 
7 files changed, 53 insertions, 29 deletions
diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index edddd66faac..a2ab51fa73e 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c @@ -166,15 +166,15 @@ union offset_union {   THUMB(	"1:	"ins"	%1, [%2]\n"	)		\   THUMB(	"	add	%2, %2, #1\n"	)		\  	"2:\n"						\ -	"	.section .fixup,\"ax\"\n"		\ +	"	.pushsection .fixup,\"ax\"\n"		\  	"	.align	2\n"				\  	"3:	mov	%0, #1\n"			\  	"	b	2b\n"				\ -	"	.previous\n"				\ -	"	.section __ex_table,\"a\"\n"		\ +	"	.popsection\n"				\ +	"	.pushsection __ex_table,\"a\"\n"	\  	"	.align	3\n"				\  	"	.long	1b, 3b\n"			\ -	"	.previous\n"				\ +	"	.popsection\n"				\  	: "=r" (err), "=&r" (val), "=r" (addr)		\  	: "0" (err), "2" (addr)) @@ -226,16 +226,16 @@ union offset_union {  		"	mov	%1, %1, "NEXT_BYTE"\n"		\  		"2:	"ins"	%1, [%2]\n"			\  		"3:\n"						\ -		"	.section .fixup,\"ax\"\n"		\ +		"	.pushsection .fixup,\"ax\"\n"		\  		"	.align	2\n"				\  		"4:	mov	%0, #1\n"			\  		"	b	3b\n"				\ -		"	.previous\n"				\ -		"	.section __ex_table,\"a\"\n"		\ +		"	.popsection\n"				\ +		"	.pushsection __ex_table,\"a\"\n"	\  		"	.align	3\n"				\  		"	.long	1b, 4b\n"			\  		"	.long	2b, 4b\n"			\ -		"	.previous\n"				\ +		"	.popsection\n"				\  		: "=r" (err), "=&r" (v), "=&r" (a)		\  		: "0" (err), "1" (v), "2" (a));			\  		if (err)					\ @@ -266,18 +266,18 @@ union offset_union {  		"	mov	%1, %1, "NEXT_BYTE"\n"		\  		"4:	"ins"	%1, [%2]\n"			\  		"5:\n"						\ -		"	.section .fixup,\"ax\"\n"		\ +		"	.pushsection .fixup,\"ax\"\n"		\  		"	.align	2\n"				\  		"6:	mov	%0, #1\n"			\  		"	b	5b\n"				\ -		"	.previous\n"				\ -		"	.section __ex_table,\"a\"\n"		\ +		"	.popsection\n"				\ +		"	.pushsection __ex_table,\"a\"\n"	\  		"	.align	3\n"				\  		"	.long	1b, 6b\n"			\  		"	.long	2b, 6b\n"			\  		"	.long	3b, 6b\n"			\  		"	.long	4b, 6b\n"			\ -		"	.previous\n"				\ +		"	.popsection\n"				\  		: "=r" (err), "=&r" (v), "=&r" (a)		\  		: "0" (err), "1" (v), "2" (a));			\  		if (err)					\ diff --git a/arch/arm/mm/cache-v6.S b/arch/arm/mm/cache-v6.S index 9d89c67a1cc..e46ecd84713 100644 --- a/arch/arm/mm/cache-v6.S +++ b/arch/arm/mm/cache-v6.S @@ -211,6 +211,9 @@ v6_dma_inv_range:  	mcrne	p15, 0, r1, c7, c15, 1		@ clean & invalidate unified line  #endif  1: +#ifdef CONFIG_SMP +	str	r0, [r0]			@ write for ownership +#endif  #ifdef HARVARD_CACHE  	mcr	p15, 0, r0, c7, c6, 1		@ invalidate D line  #else @@ -231,6 +234,9 @@ v6_dma_inv_range:  v6_dma_clean_range:  	bic	r0, r0, #D_CACHE_LINE_SIZE - 1  1: +#ifdef CONFIG_SMP +	ldr	r2, [r0]			@ read for ownership +#endif  #ifdef HARVARD_CACHE  	mcr	p15, 0, r0, c7, c10, 1		@ clean D line  #else @@ -251,6 +257,10 @@ v6_dma_clean_range:  ENTRY(v6_dma_flush_range)  	bic	r0, r0, #D_CACHE_LINE_SIZE - 1  1: +#ifdef CONFIG_SMP +	ldr	r2, [r0]			@ read for ownership +	str	r2, [r0]			@ write for ownership +#endif  #ifdef HARVARD_CACHE  	mcr	p15, 0, r0, c7, c14, 1		@ clean & invalidate D line  #else @@ -273,7 +283,9 @@ ENTRY(v6_dma_map_area)  	add	r1, r1, r0  	teq	r2, #DMA_FROM_DEVICE  	beq	v6_dma_inv_range -	b	v6_dma_clean_range +	teq	r2, #DMA_TO_DEVICE +	beq	v6_dma_clean_range +	b	v6_dma_flush_range  ENDPROC(v6_dma_map_area)  /* @@ -283,9 +295,6 @@ ENDPROC(v6_dma_map_area)   *	- dir	- DMA direction   */  ENTRY(v6_dma_unmap_area) -	add	r1, r1, r0 -	teq	r2, #DMA_TO_DEVICE -	bne	v6_dma_inv_range  	mov	pc, lr  ENDPROC(v6_dma_unmap_area) diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S index bcd64f26587..06a90dcfc60 100644 --- a/arch/arm/mm/cache-v7.S +++ b/arch/arm/mm/cache-v7.S @@ -167,7 +167,11 @@ ENTRY(v7_coherent_user_range)  	cmp	r0, r1  	blo	1b  	mov	r0, #0 +#ifdef CONFIG_SMP +	mcr	p15, 0, r0, c7, c1, 6		@ invalidate BTB Inner Shareable +#else  	mcr	p15, 0, r0, c7, c5, 6		@ invalidate BTB +#endif  	dsb  	isb  	mov	pc, lr diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 83db12a68d5..0ed29bfeba1 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -86,9 +86,6 @@ void show_mem(void)  	printk("Mem-info:\n");  	show_free_areas();  	for_each_online_node(node) { -		pg_data_t *n = NODE_DATA(node); -		struct page *map = pgdat_page_nr(n, 0) - n->node_start_pfn; -  		for_each_nodebank (i,mi,node) {  			struct membank *bank = &mi->bank[i];  			unsigned int pfn1, pfn2; @@ -97,8 +94,8 @@ void show_mem(void)  			pfn1 = bank_pfn_start(bank);  			pfn2 = bank_pfn_end(bank); -			page = map + pfn1; -			end  = map + pfn2; +			page = pfn_to_page(pfn1); +			end  = pfn_to_page(pfn2 - 1) + 1;  			do {  				total++; @@ -603,9 +600,6 @@ void __init mem_init(void)  	reserved_pages = free_pages = 0;  	for_each_online_node(node) { -		pg_data_t *n = NODE_DATA(node); -		struct page *map = pgdat_page_nr(n, 0) - n->node_start_pfn; -  		for_each_nodebank(i, &meminfo, node) {  			struct membank *bank = &meminfo.bank[i];  			unsigned int pfn1, pfn2; @@ -614,8 +608,8 @@ void __init mem_init(void)  			pfn1 = bank_pfn_start(bank);  			pfn2 = bank_pfn_end(bank); -			page = map + pfn1; -			end  = map + pfn2; +			page = pfn_to_page(pfn1); +			end  = pfn_to_page(pfn2 - 1) + 1;  			do {  				if (PageReserved(page)) diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c index 9bfeb6b9509..33b327379f0 100644 --- a/arch/arm/mm/nommu.c +++ b/arch/arm/mm/nommu.c @@ -65,6 +65,15 @@ void flush_dcache_page(struct page *page)  }  EXPORT_SYMBOL(flush_dcache_page); +void copy_to_user_page(struct vm_area_struct *vma, struct page *page, +		       unsigned long uaddr, void *dst, const void *src, +		       unsigned long len) +{ +	memcpy(dst, src, len); +	if (vma->vm_flags & VM_EXEC) +		__cpuc_coherent_user_range(uaddr, uaddr + len); +} +  void __iomem *__arm_ioremap_pfn(unsigned long pfn, unsigned long offset,  				size_t size, unsigned int mtype)  { @@ -87,8 +96,8 @@ void __iomem *__arm_ioremap(unsigned long phys_addr, size_t size,  }  EXPORT_SYMBOL(__arm_ioremap); -void __iomem *__arm_ioremap(unsigned long phys_addr, size_t size, -			    unsigned int mtype, void *caller) +void __iomem *__arm_ioremap_caller(unsigned long phys_addr, size_t size, +				   unsigned int mtype, void *caller)  {  	return __arm_ioremap(phys_addr, size, mtype);  } diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S index ee7700242c1..5c47760c206 100644 --- a/arch/arm/mm/proc-sa1100.S +++ b/arch/arm/mm/proc-sa1100.S @@ -45,7 +45,7 @@ ENTRY(cpu_sa1100_proc_init)  	mcr	p15, 0, r0, c9, c0, 5		@ Allow read-buffer operations from userland  	mov	pc, lr -	.previous +	.section .text  /*   * cpu_sa1100_proc_fin() diff --git a/arch/arm/mm/tlb-v7.S b/arch/arm/mm/tlb-v7.S index 0cb1848bd87..f3f288a9546 100644 --- a/arch/arm/mm/tlb-v7.S +++ b/arch/arm/mm/tlb-v7.S @@ -50,7 +50,11 @@ ENTRY(v7wbi_flush_user_tlb_range)  	cmp	r0, r1  	blo	1b  	mov	ip, #0 +#ifdef CONFIG_SMP +	mcr	p15, 0, ip, c7, c1, 6		@ flush BTAC/BTB Inner Shareable +#else  	mcr	p15, 0, ip, c7, c5, 6		@ flush BTAC/BTB +#endif  	dsb  	mov	pc, lr  ENDPROC(v7wbi_flush_user_tlb_range) @@ -79,7 +83,11 @@ ENTRY(v7wbi_flush_kern_tlb_range)  	cmp	r0, r1  	blo	1b  	mov	r2, #0 +#ifdef CONFIG_SMP +	mcr	p15, 0, r2, c7, c1, 6		@ flush BTAC/BTB Inner Shareable +#else  	mcr	p15, 0, r2, c7, c5, 6		@ flush BTAC/BTB +#endif  	dsb  	isb  	mov	pc, lr  |