diff options
Diffstat (limited to 'arch/mips/kernel/vpe.c')
| -rw-r--r-- | arch/mips/kernel/vpe.c | 103 | 
1 files changed, 47 insertions, 56 deletions
diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c index 147cec19621..1765bab000a 100644 --- a/arch/mips/kernel/vpe.c +++ b/arch/mips/kernel/vpe.c @@ -254,7 +254,7 @@ static void __maybe_unused dump_mtregs(void)  	       val & MVPCONF0_PTC, (val & MVPCONF0_M) >> MVPCONF0_M_SHIFT);  } -/* Find some VPE program space  */ +/* Find some VPE program space	*/  static void *alloc_progmem(unsigned long len)  {  	void *addr; @@ -292,7 +292,7 @@ static long get_offset(unsigned long *size, Elf_Shdr * sechdr)  }  /* Lay out the SHF_ALLOC sections in a way not dissimilar to how ld -   might -- code, read-only data, read-write data, small data.  Tally +   might -- code, read-only data, read-write data, small data.	Tally     sizes, and place the offsets into sh_entsize fields: high bit means it     belongs in init. */  static void layout_sections(struct module *mod, const Elf_Ehdr * hdr, @@ -386,7 +386,7 @@ static int apply_r_mips_pc16(struct module *me, uint32_t *location,  	if( (rel > 32768) || (rel < -32768) ) {  		printk(KERN_DEBUG "VPE loader: " - 		       "apply_r_mips_pc16: relative address out of range 0x%x\n", rel); +		       "apply_r_mips_pc16: relative address out of range 0x%x\n", rel);  		return -ENOEXEC;  	} @@ -458,7 +458,7 @@ static int apply_r_mips_lo16(struct module *me, uint32_t *location,  	Elf32_Addr val, vallo;  	struct mips_hi16 *l, *next; -	/* Sign extend the addend we extract from the lo insn.  */ +	/* Sign extend the addend we extract from the lo insn.	*/  	vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000;  	if (mips_hi16_list != NULL) { @@ -470,7 +470,7 @@ static int apply_r_mips_lo16(struct module *me, uint32_t *location,  			/*  			 * The value for the HI16 had best be the same.  			 */ - 			if (v != l->value) { +			if (v != l->value) {  				printk(KERN_DEBUG "VPE loader: "  				       "apply_r_mips_lo16/hi16: \t"  				       "inconsistent value information\n"); @@ -505,7 +505,7 @@ static int apply_r_mips_lo16(struct module *me, uint32_t *location,  	}  	/* -	 * Ok, we're done with the HI16 relocs.  Now deal with the LO16. +	 * Ok, we're done with the HI16 relocs.	 Now deal with the LO16.  	 */  	val = v + vallo;  	insnlo = (insnlo & ~0xffff) | (val & 0xffff); @@ -579,7 +579,7 @@ static int apply_relocations(Elf32_Shdr *sechdrs,  		res = reloc_handlers[ELF32_R_TYPE(r_info)](me, location, v);  		if( res ) {  			char *r = rstrs[ELF32_R_TYPE(r_info)]; -		    	printk(KERN_WARNING "VPE loader: .text+0x%x " +			printk(KERN_WARNING "VPE loader: .text+0x%x "  			       "relocation type %s for symbol \"%s\" failed\n",  			       rel[i].r_offset, r ? r : "UNKNOWN",  			       strtab + sym->st_name); @@ -697,18 +697,7 @@ static int vpe_run(struct vpe * v)  	dmt_flag = dmt();  	vpeflags = dvpe(); -	if (!list_empty(&v->tc)) { -		if ((t = list_entry(v->tc.next, struct tc, tc)) == NULL) { -			evpe(vpeflags); -			emt(dmt_flag); -			local_irq_restore(flags); - -			printk(KERN_WARNING -			       "VPE loader: TC %d is already in use.\n", -			       v->tc->index); -			return -ENOEXEC; -		} -	} else { +	if (list_empty(&v->tc)) {  		evpe(vpeflags);  		emt(dmt_flag);  		local_irq_restore(flags); @@ -720,6 +709,8 @@ static int vpe_run(struct vpe * v)  		return -ENOEXEC;  	} +	t = list_first_entry(&v->tc, struct tc, tc); +  	/* Put MVPE's into 'configuration state' */  	set_c0_mvpcontrol(MVPCONTROL_VPC); @@ -772,7 +763,7 @@ static int vpe_run(struct vpe * v)  	/* Set up the XTC bit in vpeconf0 to point at our tc */  	write_vpe_c0_vpeconf0( (read_vpe_c0_vpeconf0() & ~(VPECONF0_XTC)) -	                      | (t->index << VPECONF0_XTC_SHIFT)); +			      | (t->index << VPECONF0_XTC_SHIFT));  	back_to_back_c0_hazard(); @@ -926,34 +917,34 @@ static int vpe_elfload(struct vpe * v)  			       secstrings + sechdrs[i].sh_name, sechdrs[i].sh_addr);  		} - 		/* Fix up syms, so that st_value is a pointer to location. */ - 		simplify_symbols(sechdrs, symindex, strtab, secstrings, - 				 hdr->e_shnum, &mod); +		/* Fix up syms, so that st_value is a pointer to location. */ +		simplify_symbols(sechdrs, symindex, strtab, secstrings, +				 hdr->e_shnum, &mod); - 		/* Now do relocations. */ - 		for (i = 1; i < hdr->e_shnum; i++) { - 			const char *strtab = (char *)sechdrs[strindex].sh_addr; - 			unsigned int info = sechdrs[i].sh_info; +		/* Now do relocations. */ +		for (i = 1; i < hdr->e_shnum; i++) { +			const char *strtab = (char *)sechdrs[strindex].sh_addr; +			unsigned int info = sechdrs[i].sh_info; - 			/* Not a valid relocation section? */ - 			if (info >= hdr->e_shnum) - 				continue; +			/* Not a valid relocation section? */ +			if (info >= hdr->e_shnum) +				continue; - 			/* Don't bother with non-allocated sections */ - 			if (!(sechdrs[info].sh_flags & SHF_ALLOC)) - 				continue; +			/* Don't bother with non-allocated sections */ +			if (!(sechdrs[info].sh_flags & SHF_ALLOC)) +				continue; - 			if (sechdrs[i].sh_type == SHT_REL) - 				err = apply_relocations(sechdrs, strtab, symindex, i, - 							&mod); - 			else if (sechdrs[i].sh_type == SHT_RELA) - 				err = apply_relocate_add(sechdrs, strtab, symindex, i, - 							 &mod); - 			if (err < 0) - 				return err; +			if (sechdrs[i].sh_type == SHT_REL) +				err = apply_relocations(sechdrs, strtab, symindex, i, +							&mod); +			else if (sechdrs[i].sh_type == SHT_RELA) +				err = apply_relocate_add(sechdrs, strtab, symindex, i, +							 &mod); +			if (err < 0) +				return err; -  		} -  	} else { +		} +	} else {  		struct elf_phdr *phdr = (struct elf_phdr *) ((char *)hdr + hdr->e_phoff);  		for (i = 0; i < hdr->e_phnum; i++) { @@ -968,16 +959,16 @@ static int vpe_elfload(struct vpe * v)  		}  		for (i = 0; i < hdr->e_shnum; i++) { - 			/* Internal symbols and strings. */ - 			if (sechdrs[i].sh_type == SHT_SYMTAB) { - 				symindex = i; - 				strindex = sechdrs[i].sh_link; - 				strtab = (char *)hdr + sechdrs[strindex].sh_offset; +			/* Internal symbols and strings. */ +			if (sechdrs[i].sh_type == SHT_SYMTAB) { +				symindex = i; +				strindex = sechdrs[i].sh_link; +				strtab = (char *)hdr + sechdrs[strindex].sh_offset; - 				/* mark the symtab's address for when we try to find the - 				   magic symbols */ - 				sechdrs[i].sh_addr = (size_t) hdr + sechdrs[i].sh_offset; - 			} +				/* mark the symtab's address for when we try to find the +				   magic symbols */ +				sechdrs[i].sh_addr = (size_t) hdr + sechdrs[i].sh_offset; +			}  		}  	} @@ -1049,7 +1040,7 @@ static int getcwd(char *buff, int size)  	return ret;  } -/* checks VPE is unused and gets ready to load program  */ +/* checks VPE is unused and gets ready to load program	*/  static int vpe_open(struct inode *inode, struct file *filp)  {  	enum vpe_state state; @@ -1121,11 +1112,11 @@ static int vpe_release(struct inode *inode, struct file *filp)  		if (vpe_elfload(v) >= 0) {  			vpe_run(v);  		} else { - 			printk(KERN_WARNING "VPE loader: ELF load failed.\n"); +			printk(KERN_WARNING "VPE loader: ELF load failed.\n");  			ret = -ENOEXEC;  		}  	} else { - 		printk(KERN_WARNING "VPE loader: only elf files are supported\n"); +		printk(KERN_WARNING "VPE loader: only elf files are supported\n");  		ret = -ENOEXEC;  	} @@ -1149,7 +1140,7 @@ static ssize_t vpe_write(struct file *file, const char __user * buffer,  	size_t ret = count;  	struct vpe *v; -	if (iminor(file->f_path.dentry->d_inode) != minor) +	if (iminor(file_inode(file)) != minor)  		return -ENODEV;  	v = get_vpe(tclimit);  |