diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2008-10-28 13:38:42 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2008-10-30 10:44:34 -0400 |
commit | ba3049ed4086737dab200b6087138a4b8e06915d (patch) | |
tree | 78a665064e6cc288bb34ef20cd543c2feb204838 /arch/mips/include/asm | |
parent | 076c6e4f4d81113615f50e5bc2c569f628bcd54a (diff) |
MIPS: Switch FPU emulator trap to BREAK instruction.
Arguably using the address error handler has always been ugly. But with
processors that handle unaligned loads and stores in hardware the
current mechanism ceases to work so switch it to a BREAK instruction and
allocate break code 514 to the FPU emulator.
Yoichi Yuasa provided a build fix for CONFIG_BUG=n.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
Diffstat (limited to 'arch/mips/include/asm')
-rw-r--r-- | arch/mips/include/asm/break.h | 1 | ||||
-rw-r--r-- | arch/mips/include/asm/fpu_emulator.h | 17 |
2 files changed, 18 insertions, 0 deletions
diff --git a/arch/mips/include/asm/break.h b/arch/mips/include/asm/break.h index 25b980c91e7e..44437ed765e8 100644 --- a/arch/mips/include/asm/break.h +++ b/arch/mips/include/asm/break.h | |||
@@ -29,6 +29,7 @@ | |||
29 | #define _BRK_THREADBP 11 /* For threads, user bp (used by debuggers) */ | 29 | #define _BRK_THREADBP 11 /* For threads, user bp (used by debuggers) */ |
30 | #define BRK_BUG 512 /* Used by BUG() */ | 30 | #define BRK_BUG 512 /* Used by BUG() */ |
31 | #define BRK_KDB 513 /* Used in KDB_ENTER() */ | 31 | #define BRK_KDB 513 /* Used in KDB_ENTER() */ |
32 | #define BRK_MEMU 514 /* Used by FPU emulator */ | ||
32 | #define BRK_MULOVF 1023 /* Multiply overflow */ | 33 | #define BRK_MULOVF 1023 /* Multiply overflow */ |
33 | 34 | ||
34 | #endif /* __ASM_BREAK_H */ | 35 | #endif /* __ASM_BREAK_H */ |
diff --git a/arch/mips/include/asm/fpu_emulator.h b/arch/mips/include/asm/fpu_emulator.h index 2731c38bd7ae..e5189572956c 100644 --- a/arch/mips/include/asm/fpu_emulator.h +++ b/arch/mips/include/asm/fpu_emulator.h | |||
@@ -23,6 +23,9 @@ | |||
23 | #ifndef _ASM_FPU_EMULATOR_H | 23 | #ifndef _ASM_FPU_EMULATOR_H |
24 | #define _ASM_FPU_EMULATOR_H | 24 | #define _ASM_FPU_EMULATOR_H |
25 | 25 | ||
26 | #include <asm/break.h> | ||
27 | #include <asm/inst.h> | ||
28 | |||
26 | struct mips_fpu_emulator_stats { | 29 | struct mips_fpu_emulator_stats { |
27 | unsigned int emulated; | 30 | unsigned int emulated; |
28 | unsigned int loads; | 31 | unsigned int loads; |
@@ -34,4 +37,18 @@ struct mips_fpu_emulator_stats { | |||
34 | 37 | ||
35 | extern struct mips_fpu_emulator_stats fpuemustats; | 38 | extern struct mips_fpu_emulator_stats fpuemustats; |
36 | 39 | ||
40 | extern int mips_dsemul(struct pt_regs *regs, mips_instruction ir, | ||
41 | unsigned long cpc); | ||
42 | extern int do_dsemulret(struct pt_regs *xcp); | ||
43 | |||
44 | /* | ||
45 | * Instruction inserted following the badinst to further tag the sequence | ||
46 | */ | ||
47 | #define BD_COOKIE 0x0000bd36 /* tne $0, $0 with baggage */ | ||
48 | |||
49 | /* | ||
50 | * Break instruction with special math emu break code set | ||
51 | */ | ||
52 | #define BREAK_MATH (0x0000000d | (BRK_MEMU << 16)) | ||
53 | |||
37 | #endif /* _ASM_FPU_EMULATOR_H */ | 54 | #endif /* _ASM_FPU_EMULATOR_H */ |