diff options
Diffstat (limited to 'arch/tile/kernel/module.c')
| -rw-r--r-- | arch/tile/kernel/module.c | 67 | 
1 files changed, 21 insertions, 46 deletions
diff --git a/arch/tile/kernel/module.c b/arch/tile/kernel/module.c index e2ab82b7c7e..4918d91bc3a 100644 --- a/arch/tile/kernel/module.c +++ b/arch/tile/kernel/module.c @@ -20,18 +20,9 @@  #include <linux/fs.h>  #include <linux/string.h>  #include <linux/kernel.h> -#include <asm/opcode-tile.h>  #include <asm/pgtable.h> - -#ifdef __tilegx__ -# define Elf_Rela Elf64_Rela -# define ELF_R_SYM ELF64_R_SYM -# define ELF_R_TYPE ELF64_R_TYPE -#else -# define Elf_Rela Elf32_Rela -# define ELF_R_SYM ELF32_R_SYM -# define ELF_R_TYPE ELF32_R_TYPE -#endif +#include <asm/homecache.h> +#include <arch/opcode.h>  #ifdef MODULE_DEBUG  #define DEBUGP printk @@ -51,8 +42,6 @@ void *module_alloc(unsigned long size)  	int i = 0;  	int npages; -	if (size == 0) -		return NULL;  	npages = (size + PAGE_SIZE - 1) / PAGE_SIZE;  	pages = kmalloc(npages * sizeof(struct page *), GFP_KERNEL);  	if (pages == NULL) @@ -66,6 +55,8 @@ void *module_alloc(unsigned long size)  	area = __get_vm_area(size, VM_ALLOC, MEM_MODULE_START, MEM_MODULE_END);  	if (!area)  		goto error; +	area->nr_pages = npages; +	area->pages = pages;  	if (map_vm_area(area, prot_rwx, &pages)) {  		vunmap(area->addr); @@ -86,31 +77,17 @@ error:  void module_free(struct module *mod, void *module_region)  {  	vfree(module_region); + +	/* Globally flush the L1 icache. */ +	flush_remote(0, HV_FLUSH_EVICT_L1I, cpu_online_mask, +		     0, 0, 0, NULL, NULL, 0); +  	/* -	 * FIXME: If module_region == mod->init_region, trim exception +	 * FIXME: If module_region == mod->module_init, trim exception  	 * table entries.  	 */  } -/* We don't need anything special. */ -int module_frob_arch_sections(Elf_Ehdr *hdr, -			      Elf_Shdr *sechdrs, -			      char *secstrings, -			      struct module *mod) -{ -	return 0; -} - -int apply_relocate(Elf_Shdr *sechdrs, -		   const char *strtab, -		   unsigned int symindex, -		   unsigned int relsec, -		   struct module *me) -{ -	pr_err("module %s: .rel relocation unsupported\n", me->name); -	return -ENOEXEC; -} -  #ifdef __tilegx__  /*   * Validate that the high 16 bits of "value" is just the sign-extension of @@ -170,7 +147,17 @@ int apply_relocate_add(Elf_Shdr *sechdrs,  		switch (ELF_R_TYPE(rel[i].r_info)) { -#define MUNGE(func) (*location = ((*location & ~func(-1)) | func(value))) +#ifdef __LITTLE_ENDIAN +# define MUNGE(func) \ +	(*location = ((*location & ~func(-1)) | func(value))) +#else +/* + * Instructions are always little-endian, so when we read them as data, + * we have to swap them around before and after modifying them. + */ +# define MUNGE(func) \ +	(*location = swab64((swab64(*location) & ~func(-1)) | func(value))) +#endif  #ifndef __tilegx__  		case R_TILE_32: @@ -243,15 +230,3 @@ int apply_relocate_add(Elf_Shdr *sechdrs,  	}  	return 0;  } - -int module_finalize(const Elf_Ehdr *hdr, -		    const Elf_Shdr *sechdrs, -		    struct module *me) -{ -	/* FIXME: perhaps remove the "writable" bit from the TLB? */ -	return 0; -} - -void module_arch_cleanup(struct module *mod) -{ -}  | 
