Commit 18789fb1 authored by Andre Detsch's avatar Andre Detsch Committed by Paul Mackerras

[POWERPC] spufs: DMA Restart after SIGSEGV

This fixes the behavior of spufs when a spu tries a DMA operation
based on a wrong / unavailable address.

Instead of just generating a SIGBUS signal, spufs now
generates a SIGSEGV signal and restarts the problematic DMA operation
after the execution of the application's signal handler.  This allows
applications to employ user-level paging systems.

Although the restart_dma function is called before the application's
signal handler, the operation is not actually performed at this time,
since the spu context is already stopped.  The operation only takes
place when spu_run is restarted (which happens automatically).
Signed-off-by: default avatarAndre Detsch <adetsch@br.ibm.com>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarJeremy Kerr <jk@ozlabs.org>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 90608a29
...@@ -373,7 +373,7 @@ static int spu_backing_send_mfc_command(struct spu_context *ctx, ...@@ -373,7 +373,7 @@ static int spu_backing_send_mfc_command(struct spu_context *ctx,
static void spu_backing_restart_dma(struct spu_context *ctx) static void spu_backing_restart_dma(struct spu_context *ctx)
{ {
/* nothing to do here */ ctx->csa.priv2.mfc_control_RW |= MFC_CNTL_RESTART_DMA_COMMAND;
} }
struct spu_context_ops spu_backing_ops = { struct spu_context_ops spu_backing_ops = {
......
...@@ -53,9 +53,10 @@ static void spufs_handle_event(struct spu_context *ctx, ...@@ -53,9 +53,10 @@ static void spufs_handle_event(struct spu_context *ctx,
info.si_code = BUS_OBJERR; info.si_code = BUS_OBJERR;
break; break;
case SPE_EVENT_SPE_DATA_STORAGE: case SPE_EVENT_SPE_DATA_STORAGE:
info.si_signo = SIGBUS; info.si_signo = SIGSEGV;
info.si_addr = (void __user *)ea; info.si_addr = (void __user *)ea;
info.si_code = BUS_ADRERR; info.si_code = SEGV_ACCERR;
ctx->ops->restart_dma(ctx);
break; break;
case SPE_EVENT_DMA_ALIGNMENT: case SPE_EVENT_DMA_ALIGNMENT:
info.si_signo = SIGBUS; info.si_signo = SIGBUS;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment