diff options
Diffstat (limited to 'arch/sh/kernel')
| -rw-r--r-- | arch/sh/kernel/cpu/sh4a/setup-sh7757.c | 1 | ||||
| -rw-r--r-- | arch/sh/kernel/idle.c | 2 | ||||
| -rw-r--r-- | arch/sh/kernel/syscalls_32.S | 2 | ||||
| -rw-r--r-- | arch/sh/kernel/syscalls_64.S | 2 | ||||
| -rw-r--r-- | arch/sh/kernel/traps_32.c | 37 | 
5 files changed, 41 insertions, 3 deletions
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c index e915deafac8..05559295d2c 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c @@ -15,6 +15,7 @@  #include <linux/serial_sci.h>  #include <linux/io.h>  #include <linux/mm.h> +#include <linux/dma-mapping.h>  #include <linux/sh_timer.h>  #include <linux/sh_dma.h> diff --git a/arch/sh/kernel/idle.c b/arch/sh/kernel/idle.c index 32114e0941a..db4ecd731a0 100644 --- a/arch/sh/kernel/idle.c +++ b/arch/sh/kernel/idle.c @@ -22,7 +22,7 @@  #include <linux/atomic.h>  #include <asm/smp.h> -static void (*pm_idle)(void); +void (*pm_idle)(void);  static int hlt_counter; diff --git a/arch/sh/kernel/syscalls_32.S b/arch/sh/kernel/syscalls_32.S index 39b051de4c7..293e39c59c0 100644 --- a/arch/sh/kernel/syscalls_32.S +++ b/arch/sh/kernel/syscalls_32.S @@ -185,7 +185,7 @@ ENTRY(sys_call_table)  	.long sys_ni_syscall	/* vm86 */  	.long sys_ni_syscall	/* old "query_module" */  	.long sys_poll -	.long sys_nfsservctl +	.long sys_ni_syscall	/* was nfsservctl */  	.long sys_setresgid16	/* 170 */  	.long sys_getresgid16  	.long sys_prctl diff --git a/arch/sh/kernel/syscalls_64.S b/arch/sh/kernel/syscalls_64.S index 089c4d825d0..ceb34b94afa 100644 --- a/arch/sh/kernel/syscalls_64.S +++ b/arch/sh/kernel/syscalls_64.S @@ -189,7 +189,7 @@ sys_call_table:  	.long sys_ni_syscall	/* vm86 */  	.long sys_ni_syscall	/* old "query_module" */  	.long sys_poll -	.long sys_nfsservctl +	.long sys_ni_syscall	/* was nfsservctl */  	.long sys_setresgid16		/* 170 */  	.long sys_getresgid16  	.long sys_prctl diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c index d9006f8ffc1..7bbef95c9d1 100644 --- a/arch/sh/kernel/traps_32.c +++ b/arch/sh/kernel/traps_32.c @@ -316,6 +316,35 @@ static int handle_unaligned_ins(insn_size_t instruction, struct pt_regs *regs,  			break;  		}  		break; + +	case 9: /* mov.w @(disp,PC),Rn */ +		srcu = (unsigned char __user *)regs->pc; +		srcu += 4; +		srcu += (instruction & 0x00FF) << 1; +		dst = (unsigned char *)rn; +		*(unsigned long *)dst = 0; + +#if !defined(__LITTLE_ENDIAN__) +		dst += 2; +#endif + +		if (ma->from(dst, srcu, 2)) +			goto fetch_fault; +		sign_extend(2, dst); +		ret = 0; +		break; + +	case 0xd: /* mov.l @(disp,PC),Rn */ +		srcu = (unsigned char __user *)(regs->pc & ~0x3); +		srcu += 4; +		srcu += (instruction & 0x00FF) << 2; +		dst = (unsigned char *)rn; +		*(unsigned long *)dst = 0; + +		if (ma->from(dst, srcu, 4)) +			goto fetch_fault; +		ret = 0; +		break;  	}  	return ret; @@ -466,6 +495,7 @@ int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs,  		case 0x0500: /* mov.w @(disp,Rm),R0 */  			goto simple;  		case 0x0B00: /* bf   lab - no delayslot*/ +			ret = 0;  			break;  		case 0x0F00: /* bf/s lab */  			ret = handle_delayslot(regs, instruction, ma); @@ -479,6 +509,7 @@ int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs,  			}  			break;  		case 0x0900: /* bt   lab - no delayslot */ +			ret = 0;  			break;  		case 0x0D00: /* bt/s lab */  			ret = handle_delayslot(regs, instruction, ma); @@ -494,6 +525,9 @@ int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs,  		}  		break; +	case 0x9000: /* mov.w @(disp,Rm),Rn */ +		goto simple; +  	case 0xA000: /* bra label */  		ret = handle_delayslot(regs, instruction, ma);  		if (ret==0) @@ -507,6 +541,9 @@ int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs,  			regs->pc += SH_PC_12BIT_OFFSET(instruction);  		}  		break; + +	case 0xD000: /* mov.l @(disp,Rm),Rn */ +		goto simple;  	}  	return ret;  |