mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	[PATCH] flush icache in correct context
flush_icache_range() is used in two different situation - in binfmt_elf.c & co for user space mappings and module.c for kernel modules. On m68k flush_icache_range() doesn't know which data to flush, as it has separate address spaces and the pointer argument can be valid in either address space. First I considered splitting flush_icache_range(), but this patch is simpler. Setting the correct context gives flush_icache_range() enough information to flush the correct data. Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
		
							parent
							
								
									f50734569c
								
							
						
					
					
						commit
						ae92ef8a44
					
				
					 1 changed files with 6 additions and 0 deletions
				
			
		| 
						 | 
					@ -1758,6 +1758,7 @@ sys_init_module(void __user *umod,
 | 
				
			||||||
		const char __user *uargs)
 | 
							const char __user *uargs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct module *mod;
 | 
						struct module *mod;
 | 
				
			||||||
 | 
						mm_segment_t old_fs = get_fs();
 | 
				
			||||||
	int ret = 0;
 | 
						int ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Must have permission */
 | 
						/* Must have permission */
 | 
				
			||||||
| 
						 | 
					@ -1775,6 +1776,9 @@ sys_init_module(void __user *umod,
 | 
				
			||||||
		return PTR_ERR(mod);
 | 
							return PTR_ERR(mod);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* flush the icache in correct context */
 | 
				
			||||||
 | 
						set_fs(KERNEL_DS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Flush the instruction cache, since we've played with text */
 | 
						/* Flush the instruction cache, since we've played with text */
 | 
				
			||||||
	if (mod->module_init)
 | 
						if (mod->module_init)
 | 
				
			||||||
		flush_icache_range((unsigned long)mod->module_init,
 | 
							flush_icache_range((unsigned long)mod->module_init,
 | 
				
			||||||
| 
						 | 
					@ -1783,6 +1787,8 @@ sys_init_module(void __user *umod,
 | 
				
			||||||
	flush_icache_range((unsigned long)mod->module_core,
 | 
						flush_icache_range((unsigned long)mod->module_core,
 | 
				
			||||||
			   (unsigned long)mod->module_core + mod->core_size);
 | 
								   (unsigned long)mod->module_core + mod->core_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						set_fs(old_fs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Now sew it into the lists.  They won't access us, since
 | 
						/* Now sew it into the lists.  They won't access us, since
 | 
				
			||||||
           strong_try_module_get() will fail. */
 | 
					           strong_try_module_get() will fail. */
 | 
				
			||||||
	stop_machine_run(__link_module, mod, NR_CPUS);
 | 
						stop_machine_run(__link_module, mod, NR_CPUS);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue