diff options
| -rw-r--r-- | arch/mips/include/asm/mipsregs.h | 9 | ||||
| -rw-r--r-- | arch/mips/kernel/scall64-n32.S | 2 | ||||
| -rw-r--r-- | arch/mips/math-emu/cp1emu.c | 15 | ||||
| -rw-r--r-- | arch/mips/oprofile/op_model_loongson2.c | 2 | 
4 files changed, 21 insertions, 7 deletions
| diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h index 49382d5e891..c6e3c93ce7c 100644 --- a/arch/mips/include/asm/mipsregs.h +++ b/arch/mips/include/asm/mipsregs.h @@ -135,6 +135,12 @@  #define FPU_CSR_COND7   0x80000000      /* $fcc7 */  /* + * Bits 18 - 20 of the FPU Status Register will be read as 0, + * and should be written as zero. + */ +#define FPU_CSR_RSVD	0x001c0000 + +/*   * X the exception cause indicator   * E the exception enable   * S the sticky/flag bit @@ -161,7 +167,8 @@  #define FPU_CSR_UDF_S   0x00000008  #define FPU_CSR_INE_S   0x00000004 -/* rounding mode */ +/* Bits 0 and 1 of FPU Status Register specify the rounding mode */ +#define FPU_CSR_RM	0x00000003  #define FPU_CSR_RN      0x0     /* nearest */  #define FPU_CSR_RZ      0x1     /* towards zero */  #define FPU_CSR_RU      0x2     /* towards +Infinity */ diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 44337ba0371..a5297e2a353 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S @@ -385,7 +385,7 @@ EXPORT(sysn32_call_table)  	PTR	sys_fchmodat  	PTR	sys_faccessat  	PTR	compat_sys_pselect6 -	PTR	sys_ppoll			/* 6265 */ +	PTR	compat_sys_ppoll		/* 6265 */  	PTR	sys_unshare  	PTR	sys_splice  	PTR	sys_sync_file_range diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c index 8f2f8e9d8b2..f2338d1c0b4 100644 --- a/arch/mips/math-emu/cp1emu.c +++ b/arch/mips/math-emu/cp1emu.c @@ -78,6 +78,9 @@ DEFINE_PER_CPU(struct mips_fpu_emulator_stats, fpuemustats);  #define FPCREG_RID	0	/* $0  = revision id */  #define FPCREG_CSR	31	/* $31 = csr */ +/* Determine rounding mode from the RM bits of the FCSR */ +#define modeindex(v) ((v) & FPU_CSR_RM) +  /* Convert Mips rounding mode (0..3) to IEEE library modes. */  static const unsigned char ieee_rm[4] = {  	[FPU_CSR_RN] = IEEE754_RN, @@ -384,10 +387,14 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_struct *ctx)  					(void *) (xcp->cp0_epc),  					MIPSInst_RT(ir), value);  #endif -				value &= (FPU_CSR_FLUSH | FPU_CSR_ALL_E | FPU_CSR_ALL_S | 0x03); -				ctx->fcr31 &= ~(FPU_CSR_FLUSH | FPU_CSR_ALL_E | FPU_CSR_ALL_S | 0x03); -				/* convert to ieee library modes */ -				ctx->fcr31 |= (value & ~0x3) | ieee_rm[value & 0x3]; + +				/* +				 * Don't write reserved bits, +				 * and convert to ieee library modes +				 */ +				ctx->fcr31 = (value & +						~(FPU_CSR_RSVD | FPU_CSR_RM)) | +						ieee_rm[modeindex(value)];  			}  			if ((ctx->fcr31 >> 5) & ctx->fcr31 & FPU_CSR_ALL_E) {  				return SIGFPE; diff --git a/arch/mips/oprofile/op_model_loongson2.c b/arch/mips/oprofile/op_model_loongson2.c index 29e2326b625..fa3bf661ae2 100644 --- a/arch/mips/oprofile/op_model_loongson2.c +++ b/arch/mips/oprofile/op_model_loongson2.c @@ -122,7 +122,7 @@ static irqreturn_t loongson2_perfcount_handler(int irq, void *dev_id)  	 */  	/* Check whether the irq belongs to me */ -	enabled = read_c0_perfcnt() & LOONGSON2_PERFCNT_INT_EN; +	enabled = read_c0_perfctrl() & LOONGSON2_PERFCNT_INT_EN;  	if (!enabled)  		return IRQ_NONE;  	enabled = reg.cnt1_enabled | reg.cnt2_enabled; | 
