Thanks Brad, Andreas,
I won't rely on ARAnyM for these tests any longer then.
I would be much obliged if one of the m68k kernel crowd with access to a
68040 could apply the two attached patches, on top of Eric's
'refactoring exit' series for preference, and check that any program
attempting a simple sin() or exp() operation exits with SEGV.
If you know of a way to trace said program and set a breakpoint in
do_exit(), please also try to inspect saved registers at that point
(though I'm not sure how to create a dump of the actual registers from
inside the exception handler to compare with).
Cheers,
Michael
On 25/07/21 10:12 pm, Brad Boyer wrote:
On Sun, Jul 25, 2021 at 07:44:11PM +1200, Michael Schmitz wrote:
Am 25.07.2021 um 00:05 schrieb Andreas Schwab:
On Jul 24 2021, Michael Schmitz wrote:
According to my understanding, you can't get a F-line exception on
68040.
The F-line exception vector is used for all FPU illegal and
unimplemented insns.
Thanks - now from my reading of the fpsp040 code (which has mislead me in
the past), it would seem that operations like sin() and exp() ought to raise
that exception then. I don't see that in ARAnyM.
Yes, according to the 68040 user's manual, unimplemented and illegal F-line
instructions trigger the standard F-line exception vector (11) but have
separate stack frame formats so the fpsp040 code gets some extra data.
The CPU does a bunch of the prep work so that part doesn't need to be
emulated in software.
The ARAnyM docs appear to claim a strange combination that wouldn't
exist in hardware by implementing a full 68882 instead of the limited
subset found on a real 68040. Strangely, that might have been easier to
implement. However, it would also completely bypass any use of fpsp040.
Brad Boyer
flar@xxxxxxxxxxxxx
>From 3df3164dd0f34f3ef7cfaccd079e83a7d146ee5f Mon Sep 17 00:00:00 2001
From: Michael Schmitz <schmitzmic@xxxxxxxxx>
Date: Sat, 24 Jul 2021 15:22:58 +1200
Subject: [PATCH 2/2] m68k/fpsp040 - test changes to copyin/out exception
handling
Call the exception handler in fpsp040/skeleton.S on each f-line
trap. This ought to allow verifying that the added stack frame
is accessible and contains useful data by just tracing a simple
program using one of the floating point operations not supported
by the 68040 FPU.
Signed-off-By: Michael Schmitz <schmitzmic@xxxxxxxxx>
---
arch/m68k/fpsp040/skeleton.S | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/arch/m68k/fpsp040/skeleton.S b/arch/m68k/fpsp040/skeleton.S
index 1cbc52b..1ca04bd 100644
--- a/arch/m68k/fpsp040/skeleton.S
+++ b/arch/m68k/fpsp040/skeleton.S
@@ -302,7 +302,8 @@ real_bsun:
.global real_fline
.global fline
fline:
- jmp fpsp_fline
+ jmp test_fpsp040_die
+ |jmp fpsp_fline
real_fline:
SAVE_ALL_INT
@@ -501,6 +502,7 @@ in_ea:
.section .fixup,#alloc,#execinstr
.even
+test_fpsp040_die:
1:
SAVE_ALL_INT
--
2.7.4
>From 737b74a376f0b3da09ba7cb088e99c2c85b7405c Mon Sep 17 00:00:00 2001
From: Michael Schmitz <schmitzmic@xxxxxxxxx>
Date: Sun, 18 Jul 2021 10:31:42 +1200
Subject: [PATCH 1/2] m68k/fpsp040 - save full stack frame before calling
fpsp040_die
The FPSP040 floating point support code does not know how to
handle user space access faults gracefully, and just calls
do_exit(SIGSEGV) indirectly on these faults to abort.
do_exit() may stop if traced, and needs a full stack frame
available to avoid exposing kernel data.
Add the current stack frame before calling do_exit() from the
fpsp040 user access exception handler. Top of stack frame saved
to task->thread.esp0 as is done for system calls.
Unwind the stack frame and return to caller once done, in case
do_exit() is replaced by force_sig() later on. Note that this
will allow the current exception handler to continue with
incorrect state, but the results will never make it to the
calling user program which is terminated by SYSSIGV upon return
from exception.
CC: Eric W. Biederman <ebiederm@xxxxxxxxxxxx>
Signed-off-by: Michael Schmitz <schmitzmic@xxxxxxxxx>
---
arch/m68k/fpsp040/skeleton.S | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/arch/m68k/fpsp040/skeleton.S b/arch/m68k/fpsp040/skeleton.S
index a8f4161..1cbc52b 100644
--- a/arch/m68k/fpsp040/skeleton.S
+++ b/arch/m68k/fpsp040/skeleton.S
@@ -502,7 +502,14 @@ in_ea:
.section .fixup,#alloc,#execinstr
.even
1:
+
+ SAVE_ALL_INT
+ | save top of frame
+ movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0)
+ SAVE_SWITCH_STACK
jbra fpsp040_die
+ lea 44(%sp),%sp
+ rts
.section __ex_table,#alloc
.align 4
--
2.7.4