From: Ralf Baechle <ralf@linux-mips.org>
To: David Daney <ddaney@caviumnetworks.com>
Cc: linux-mips@linux-mips.org,
Tomaso Paoletti <tpaoletti@caviumnetworks.com>,
Paul Gortmaker <Paul.Gortmaker@windriver.com>
Subject: Re: [PATCH 29/36] Cavium OCTEON FPU EMU exception as TLB exception
Date: Tue, 28 Oct 2008 16:06:38 +0000 [thread overview]
Message-ID: <20081028160638.GA11152@linux-mips.org> (raw)
In-Reply-To: <1225152181-3221-29-git-send-email-ddaney@caviumnetworks.com>
On Mon, Oct 27, 2008 at 05:03:01PM -0700, David Daney wrote:
> The FPU exceptions come in as TLB exceptions -- see if this is
> one of them, and act accordingly.
> +#ifdef CONFIG_CAVIUM_OCTEON_HW_FIX_UNALIGNED
> + /*
> + * Normally the FPU emulator uses a load word from address one
> + * to retake control of the CPU after executing the
> + * instruction in the delay slot of an emulated branch. The
> + * Octeon hardware unaligned access fix changes this from an
> + * address exception into a TLB exception. This code checks to
> + * see if this page fault was caused by an FPU emulation.
> + *
> + * Terminate if exception was recognized as a delay slot return.
> + */
> + if (do_dsemulret(regs))
> + return;
> +#endif
There is absolutely no need to use any particular type of exception for
this; the choice of the address error exception back in history was totally
arbitrary - and arguably ugly. There was even the hook to use the CU
exception instead but I think this is more what the break instruction was
intended for, so I propose to use a break instruction and allocate a new
break code for this. See below patch. Untested. It may compile. It
may even work ;-)
Ralf
PS: You may have noticed a pattern - I hunt down most #ifdefs to generic
code you submit. Evil stuff :-)
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/include/asm/break.h | 1 +
arch/mips/include/asm/fpu_emulator.h | 16 ++++++++++++++++
arch/mips/kernel/traps.c | 16 ++++++++++++++++
arch/mips/kernel/unaligned.c | 12 ------------
arch/mips/math-emu/cp1emu.c | 4 ----
arch/mips/math-emu/dsemul.c | 7 +++----
arch/mips/math-emu/dsemul.h | 17 -----------------
7 files changed, 36 insertions(+), 37 deletions(-)
diff --git a/arch/mips/include/asm/break.h b/arch/mips/include/asm/break.h
index 25b980c..44437ed 100644
--- a/arch/mips/include/asm/break.h
+++ b/arch/mips/include/asm/break.h
@@ -29,6 +29,7 @@
#define _BRK_THREADBP 11 /* For threads, user bp (used by debuggers) */
#define BRK_BUG 512 /* Used by BUG() */
#define BRK_KDB 513 /* Used in KDB_ENTER() */
+#define BRK_MEMU 514 /* Used by FPU emulator */
#define BRK_MULOVF 1023 /* Multiply overflow */
#endif /* __ASM_BREAK_H */
diff --git a/arch/mips/include/asm/fpu_emulator.h b/arch/mips/include/asm/fpu_emulator.h
index 2731c38..a66f25e 100644
--- a/arch/mips/include/asm/fpu_emulator.h
+++ b/arch/mips/include/asm/fpu_emulator.h
@@ -23,6 +23,8 @@
#ifndef _ASM_FPU_EMULATOR_H
#define _ASM_FPU_EMULATOR_H
+#include <asm/inst.h>
+
struct mips_fpu_emulator_stats {
unsigned int emulated;
unsigned int loads;
@@ -34,4 +36,18 @@ struct mips_fpu_emulator_stats {
extern struct mips_fpu_emulator_stats fpuemustats;
+extern int mips_dsemul(struct pt_regs *regs, mips_instruction ir,
+ unsigned long cpc);
+extern int do_dsemulret(struct pt_regs *xcp);
+
+/*
+ * Instruction inserted following the badinst to further tag the sequence
+ */
+#define BD_COOKIE 0x0000bd36 /* tne $0, $0 with baggage */
+
+/*
+ * Break instruction with special math emu break code set
+ */
+#define BREAK_MATH (0x0000000d | (BRK_MEMU << 16))
+
#endif /* _ASM_FPU_EMULATOR_H */
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
index 3f6de76..3530561 100644
--- a/arch/mips/kernel/traps.c
+++ b/arch/mips/kernel/traps.c
@@ -32,6 +32,7 @@
#include <asm/cpu.h>
#include <asm/dsp.h>
#include <asm/fpu.h>
+#include <asm/fpu_emulator.h>
#include <asm/mipsregs.h>
#include <asm/mipsmtregs.h>
#include <asm/module.h>
@@ -722,6 +723,21 @@ static void do_trap_or_bp(struct pt_regs *regs, unsigned int code,
die_if_kernel("Kernel bug detected", regs);
force_sig(SIGTRAP, current);
break;
+ case BRK_MEMU:
+ /*
+ * Address errors may be deliberately induced by the FPU
+ * emulator to retake control of the CPU after executing the
+ * instruction in the delay slot of an emulated branch.
+ *
+ * Terminate if exception was recognized as a delay slot return
+ * otherwise handle as normal.
+ */
+ if (do_dsemulret(regs))
+ return;
+
+ die_if_kernel("Math emu break/trap", regs);
+ force_sig(SIGTRAP, current);
+ break;
default:
scnprintf(b, sizeof(b), "%s instruction in kernel code", str);
die_if_kernel(b, regs);
diff --git a/arch/mips/kernel/unaligned.c b/arch/mips/kernel/unaligned.c
index 2070966..bf4c4a9 100644
--- a/arch/mips/kernel/unaligned.c
+++ b/arch/mips/kernel/unaligned.c
@@ -499,22 +499,10 @@ sigill:
asmlinkage void do_ade(struct pt_regs *regs)
{
- extern int do_dsemulret(struct pt_regs *);
unsigned int __user *pc;
mm_segment_t seg;
/*
- * Address errors may be deliberately induced by the FPU emulator to
- * retake control of the CPU after executing the instruction in the
- * delay slot of an emulated branch.
- */
- /* Terminate if exception was recognized as a delay slot return */
- if (do_dsemulret(regs))
- return;
-
- /* Otherwise handle as normal */
-
- /*
* Did we catch a fault trying to load an instruction?
* Or are we running in MIPS16 mode?
*/
diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c
index 7ec0b21..890f779 100644
--- a/arch/mips/math-emu/cp1emu.c
+++ b/arch/mips/math-emu/cp1emu.c
@@ -48,7 +48,6 @@
#include <asm/branch.h>
#include "ieee754.h"
-#include "dsemul.h"
/* Strap kernel emulator for full MIPS IV emulation */
@@ -346,9 +345,6 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_struct *ctx)
/* cop control register rd -> gpr[rt] */
u32 value;
- if (ir == CP1UNDEF) {
- return do_dsemulret(xcp);
- }
if (MIPSInst_RD(ir) == FPCREG_CSR) {
value = ctx->fcr31;
value = (value & ~0x3) | mips_rm[value & 0x3];
diff --git a/arch/mips/math-emu/dsemul.c b/arch/mips/math-emu/dsemul.c
index 653e325..df7b9d9 100644
--- a/arch/mips/math-emu/dsemul.c
+++ b/arch/mips/math-emu/dsemul.c
@@ -18,7 +18,6 @@
#include <asm/fpu_emulator.h>
#include "ieee754.h"
-#include "dsemul.h"
/* Strap kernel emulator for full MIPS IV emulation */
@@ -94,7 +93,7 @@ int mips_dsemul(struct pt_regs *regs, mips_instruction ir, unsigned long cpc)
return SIGBUS;
err = __put_user(ir, &fr->emul);
- err |= __put_user((mips_instruction)BADINST, &fr->badinst);
+ err |= __put_user((mips_instruction)BREAK_MATH, &fr->badinst);
err |= __put_user((mips_instruction)BD_COOKIE, &fr->cookie);
err |= __put_user(cpc, &fr->epc);
@@ -130,13 +129,13 @@ int do_dsemulret(struct pt_regs *xcp)
/*
* Do some sanity checking on the stackframe:
*
- * - Is the instruction pointed to by the EPC an BADINST?
+ * - Is the instruction pointed to by the EPC an BREAK_MATH?
* - Is the following memory word the BD_COOKIE?
*/
err = __get_user(insn, &fr->badinst);
err |= __get_user(cookie, &fr->cookie);
- if (unlikely(err || (insn != BADINST) || (cookie != BD_COOKIE))) {
+ if (unlikely(err || (insn != BREAK_MATH) || (cookie != BD_COOKIE))) {
fpuemustats.errors++;
return 0;
}
diff --git a/arch/mips/math-emu/dsemul.h b/arch/mips/math-emu/dsemul.h
deleted file mode 100644
index 091f0e7..0000000
--- a/arch/mips/math-emu/dsemul.h
+++ /dev/null
@@ -1,17 +0,0 @@
-extern int mips_dsemul(struct pt_regs *regs, mips_instruction ir, unsigned long cpc);
-extern int do_dsemulret(struct pt_regs *xcp);
-
-/* Instruction which will always cause an address error */
-#define AdELOAD 0x8c000001 /* lw $0,1($0) */
-/* Instruction which will plainly cause a CP1 exception when FPU is disabled */
-#define CP1UNDEF 0x44400001 /* cfc1 $0,$0 undef */
-
-/* Instruction inserted following the badinst to further tag the sequence */
-#define BD_COOKIE 0x0000bd36 /* tne $0,$0 with baggage */
-
-/* Setup which instruction to use for trampoline */
-#ifdef STANDALONE_EMULATOR
-#define BADINST CP1UNDEF
-#else
-#define BADINST AdELOAD
-#endif
next prev parent reply other threads:[~2008-10-28 16:06 UTC|newest]
Thread overview: 85+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-27 23:58 [PATCH 00/36] Add Cavium OCTEON processor support (v2) David Daney
2008-10-28 0:02 ` [PATCH 01/36] Add Cavium OCTEON processor support files to arch/mips/cavium-octeon David Daney
2008-10-28 0:02 ` [PATCH 02/36] Add Cavium OCTEON files to arch/mips/include/asm/mach-cavium-octeon David Daney
2008-10-28 0:02 ` [PATCH 03/36] Add Cavium OCTEON processor support files to arch/mips/kernel David Daney
2008-10-28 0:02 ` [PATCH 04/36] Add Cavium OCTEON processor support files to arch/mips/mm David Daney
2008-10-28 0:02 ` [PATCH 05/36] Add Cavium OCTEON processor support files to and arch/mips/cavium-octeon/executive David Daney
2008-10-28 0:02 ` [PATCH 06/36] Add Cavium OCTEON processor CSR definitions David Daney
2008-10-28 0:02 ` [PATCH 07/36] Don't assume boot CPU is CPU0 if MIPS_DISABLE_BOOT_CPU_ZERO set David Daney
2008-10-28 0:02 ` [PATCH 08/36] For Cavium OCTEON handle hazards as per the R10000 handling David Daney
2008-10-28 0:02 ` [PATCH 09/36] Enable mips32 style bitops for Cavium OCTEON David Daney
2008-10-28 0:02 ` [PATCH 10/36] Cavium OCTEON: Set hwrena and lazily restore CP2 state David Daney
2008-10-28 0:02 ` [PATCH 11/36] MIPSR2 ebase isn't just CAC_BASE David Daney
2008-10-28 0:02 ` [PATCH 12/36] Add Cavium OCTEON to arch/mips/Kconfig David Daney
2008-10-28 0:02 ` [PATCH 13/36] Add Cavium OCTEON processor constants David Daney
2008-10-28 0:02 ` [PATCH 14/36] Rewrite cpu_to_name so it has one statement per line David Daney
2008-10-28 0:02 ` [PATCH 15/36] Probe for Cavium OCTEON CPUs David Daney
2008-10-28 0:02 ` [PATCH 16/36] MIPS: Hook Cavium OCTEON cache init into cache.c David Daney
2008-10-28 0:02 ` [PATCH 17/36] cavium: Hook Cavium specifics into main arch/mips dir David Daney
2008-10-28 0:02 ` [PATCH 18/36] Cavium OCTEON modify core io.h macros to account for the Octeon Errata Core-301 David Daney
2008-10-28 0:02 ` [PATCH 19/36] Cavium OCTEON: increase MAX_DMA address David Daney
2008-10-28 0:02 ` [PATCH 20/36] Cavium OCTEON: add in icache and dcache error functions David Daney
2008-10-28 0:02 ` [PATCH 21/36] Cavium OCTEON: Add cop2/cvmseg state entries to processor.h David Daney
2008-10-28 0:02 ` [PATCH 22/36] Add Cavium OCTEON specific registers to ptrace.h and asm-offsets.c David Daney
2008-10-28 0:02 ` [PATCH 23/36] Add SMP_ICACHE_FLUSH for the Cavium CPU family David Daney
2008-10-28 0:02 ` [PATCH 24/36] Cavium OCTEON: PT vs MFC0 reorder, multiplier state preservation David Daney
2008-10-28 0:02 ` [PATCH 25/36] Add Cavium OCTEON irq hazard in asmmacro.h David Daney
2008-10-28 0:02 ` [PATCH 26/36] Compute branch returns for Cavium OCTEON specific branch instructions David Daney
2008-10-28 0:02 ` [PATCH 27/36] Add Cavium OCTEON slot into proper tlb category David Daney
2008-10-28 0:03 ` [PATCH 28/36] MIPS: move FPU emulator externs to fpu_emulator.h David Daney
2008-10-28 0:03 ` [PATCH 29/36] Cavium OCTEON FPU EMU exception as TLB exception David Daney
2008-10-28 16:06 ` Ralf Baechle [this message]
2008-10-30 11:44 ` [PATCH 17/36] cavium: Hook Cavium specifics into main arch/mips dir Ralf Baechle
2008-10-29 12:17 ` [PATCH 15/36] Probe for Cavium OCTEON CPUs Ralf Baechle
2008-10-29 16:18 ` David Daney
2008-10-29 16:26 ` Ralf Baechle
2008-10-29 16:31 ` David Daney
2008-10-29 17:10 ` Ralf Baechle
2008-10-29 19:24 ` Maciej W. Rozycki
2008-10-29 17:38 ` Sergei Shtylyov
2008-10-28 9:56 ` [PATCH 11/36] MIPSR2 ebase isn't just CAC_BASE Ralf Baechle
2008-10-28 16:05 ` Maciej W. Rozycki
2008-10-28 16:13 ` Chad Reese
2008-10-28 16:13 ` Chad Reese
2008-10-28 16:27 ` Ralf Baechle
2008-10-28 17:29 ` Maciej W. Rozycki
2008-10-29 7:38 ` Brian Foster
2008-10-28 16:21 ` Ralf Baechle
2008-10-28 17:30 ` Maciej W. Rozycki
2008-10-28 7:30 ` [PATCH 09/36] Enable mips32 style bitops for Cavium OCTEON Ralf Baechle
2008-10-28 6:47 ` [PATCH 07/36] Don't assume boot CPU is CPU0 if MIPS_DISABLE_BOOT_CPU_ZERO set Ralf Baechle
2008-10-28 16:43 ` David Daney
2008-10-28 17:28 ` Ralf Baechle
2008-10-29 18:45 ` [PATCH 06/36] Add Cavium OCTEON processor CSR definitions Christoph Hellwig
2008-10-29 19:18 ` David Daney
2008-10-29 19:27 ` Christoph Hellwig
2008-10-29 20:53 ` Chad Reese
2008-10-30 11:13 ` Ralf Baechle
2008-10-30 18:21 ` David Daney
2008-10-30 18:45 ` Chad Reese
2008-10-29 18:45 ` [PATCH 05/36] Add Cavium OCTEON processor support files to and arch/mips/cavium-octeon/executive Christoph Hellwig
2008-10-29 23:03 ` Sergei Shtylyov
2008-10-30 17:19 ` Christoph Hellwig
2008-10-30 18:23 ` Sergei Shtylyov
2008-10-30 22:16 ` Christoph Hellwig
2008-10-29 16:07 ` [PATCH 04/36] Add Cavium OCTEON processor support files to arch/mips/mm Ralf Baechle
2008-10-29 16:25 ` David Daney
2008-10-29 18:09 ` Ralf Baechle
2008-10-30 21:17 ` David Daney
2008-10-28 7:57 ` [PATCH 02/36] Add Cavium OCTEON files to arch/mips/include/asm/mach-cavium-octeon Ralf Baechle
2008-10-28 10:36 ` Sergei Shtylyov
2008-10-28 16:02 ` Maciej W. Rozycki
2008-10-28 16:17 ` Ralf Baechle
2008-10-28 17:24 ` Maciej W. Rozycki
2008-10-28 23:51 ` David Daney
2008-10-29 1:29 ` Ralf Baechle
2008-10-28 0:04 ` [PATCH 30/36] Don't clobber spinlocks in 8250 David Daney
2008-10-28 0:04 ` [PATCH 31/36] Generic 8250 serial driver changes to support future OCTEON serial patches David Daney
2008-10-28 0:04 ` [PATCH 32/36] Allow port type to be specified when calling serial8250_register_port David Daney
2008-10-28 0:04 ` [PATCH 33/36] Allow port type to specify bugs that are not probed for David Daney
2008-10-28 0:04 ` [PATCH 34/36] 8250 serial driver changes for Cavium OCTEON David Daney
2008-10-28 0:04 ` [PATCH 35/36] Adjust the dma-common.c platform hooks David Daney
2008-10-28 0:04 ` [PATCH 36/36] Add defconfig for Cavium OCTEON David Daney
2008-10-29 19:15 ` [PATCH 00/36] Add Cavium OCTEON processor support (v2) Maciej W. Rozycki
2008-10-30 15:01 ` Chris Friesen
2008-11-04 14:48 ` Maciej W. Rozycki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20081028160638.GA11152@linux-mips.org \
--to=ralf@linux-mips.org \
--cc=Paul.Gortmaker@windriver.com \
--cc=ddaney@caviumnetworks.com \
--cc=linux-mips@linux-mips.org \
--cc=tpaoletti@caviumnetworks.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.