mirror of
https://github.com/apache/nuttx.git
synced 2026-06-02 01:21:26 +08:00
Fix an PIC32 error in scheduling of signal handlers
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4229 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* arch/mips/src.common/up_exit.c
|
* arch/mips/src/common/up_exit.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@@ -41,6 +41,7 @@
|
|||||||
|
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
|
#include <assert.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <nuttx/arch.h>
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
@@ -171,5 +172,11 @@ void _exit(int status)
|
|||||||
/* Then switch contexts */
|
/* Then switch contexts */
|
||||||
|
|
||||||
up_fullcontextrestore(tcb->xcp.regs);
|
up_fullcontextrestore(tcb->xcp.regs);
|
||||||
|
|
||||||
|
/* up_fullcontextrestore() should not return but could if the software
|
||||||
|
* interrupts are disabled.
|
||||||
|
*/
|
||||||
|
|
||||||
|
PANIC(OSERR_INTERNAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* arch/mips/src/mips32/up_schedulesigaction.c
|
* arch/mips/src/mips32/up_schedulesigaction.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@@ -150,9 +150,9 @@ void up_schedule_sigaction(_TCB *tcb, sig_deliver_t sigdeliver)
|
|||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Save the return lr and cpsr and one scratch register
|
/* Save the return EPC and STATUS registers. These will be
|
||||||
* These will be restored by the signal trampoline after
|
* restored by the signal trampoline after the signals have
|
||||||
* the signals have been delivered.
|
* been delivered.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
tcb->xcp.sigdeliver = sigdeliver;
|
tcb->xcp.sigdeliver = sigdeliver;
|
||||||
@@ -174,6 +174,10 @@ void up_schedule_sigaction(_TCB *tcb, sig_deliver_t sigdeliver)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
up_savestate(tcb->xcp.regs);
|
up_savestate(tcb->xcp.regs);
|
||||||
|
|
||||||
|
svdbg("PC/STATUS Saved: %08x/%08x New: %08x/%08x\n",
|
||||||
|
tcb->xcp.saved_epc, tcb->xcp.saved_status,
|
||||||
|
current_regs[REG_EPC], current_regs[REG_STATUS]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,9 +189,9 @@ void up_schedule_sigaction(_TCB *tcb, sig_deliver_t sigdeliver)
|
|||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Save the return lr and cpsr and one scratch register
|
/* Save the return EPC and STATUS registers. These will be
|
||||||
* These will be restored by the signal trampoline after
|
* restored by the signal trampoline after the signals have
|
||||||
* the signals have been delivered.
|
* been delivered.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
tcb->xcp.sigdeliver = sigdeliver;
|
tcb->xcp.sigdeliver = sigdeliver;
|
||||||
@@ -199,10 +203,14 @@ void up_schedule_sigaction(_TCB *tcb, sig_deliver_t sigdeliver)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
tcb->xcp.regs[REG_EPC] = (uint32_t)up_sigdeliver;
|
tcb->xcp.regs[REG_EPC] = (uint32_t)up_sigdeliver;
|
||||||
status = current_regs[REG_STATUS];
|
status = tcb->xcp.regs[REG_STATUS];
|
||||||
status &= ~CP0_STATUS_IM_MASK;
|
status &= ~CP0_STATUS_IM_MASK;
|
||||||
status |= CP0_STATUS_IM_SWINTS;
|
status |= CP0_STATUS_IM_SWINTS;
|
||||||
tcb->xcp.regs[REG_STATUS] = status;
|
tcb->xcp.regs[REG_STATUS] = status;
|
||||||
|
|
||||||
|
svdbg("PC/STATUS Saved: %08x/%08x New: %08x/%08x\n",
|
||||||
|
tcb->xcp.saved_epc, tcb->xcp.saved_status,
|
||||||
|
tcb->xcp.regs[REG_EPC], tcb->xcp.regs[REG_STATUS]);
|
||||||
}
|
}
|
||||||
|
|
||||||
irqrestore(flags);
|
irqrestore(flags);
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* arch/mips/src/mips32/up_sigdeliver.c
|
* arch/mips/src/mips32/up_sigdeliver.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@@ -126,7 +126,8 @@ void up_sigdeliver(void)
|
|||||||
* errno that is needed by the user logic (it is probably EINTR).
|
* errno that is needed by the user logic (it is probably EINTR).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
sdbg("Resuming\n");
|
svdbg("Resuming EPC: %08x STATUS: %08x\n", regs[REG_EPC], regs[REG_STATUS]);
|
||||||
|
|
||||||
(void)irqsave();
|
(void)irqsave();
|
||||||
rtcb->pterrno = saved_errno;
|
rtcb->pterrno = saved_errno;
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/************************************************************************
|
/************************************************************************
|
||||||
* sched/pthread_completejoin.c
|
* sched/pthread_completejoin.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@@ -83,7 +83,7 @@ static bool pthread_notifywaiters(FAR join_t *pjoin)
|
|||||||
int ntasks_waiting;
|
int ntasks_waiting;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
sdbg("pjoin=0x%p\n", pjoin);
|
svdbg("pjoin=0x%p\n", pjoin);
|
||||||
|
|
||||||
/* Are any tasks waiting for our exit value? */
|
/* Are any tasks waiting for our exit value? */
|
||||||
|
|
||||||
@@ -148,7 +148,7 @@ int pthread_completejoin(pid_t pid, FAR void *exit_value)
|
|||||||
{
|
{
|
||||||
FAR join_t *pjoin;
|
FAR join_t *pjoin;
|
||||||
|
|
||||||
sdbg("process_id=%d exit_value=%p\n", pid, exit_value);
|
svdbg("pid=%d exit_value=%p\n", pid, exit_value);
|
||||||
|
|
||||||
/* First, find thread's structure in the private data set. */
|
/* First, find thread's structure in the private data set. */
|
||||||
|
|
||||||
@@ -156,7 +156,7 @@ int pthread_completejoin(pid_t pid, FAR void *exit_value)
|
|||||||
pjoin = pthread_findjoininfo(pid);
|
pjoin = pthread_findjoininfo(pid);
|
||||||
if (!pjoin)
|
if (!pjoin)
|
||||||
{
|
{
|
||||||
|
sdbg("Could not find join info, pid=%d\n", pid);
|
||||||
(void)pthread_givesemaphore(&g_join_semaphore);
|
(void)pthread_givesemaphore(&g_join_semaphore);
|
||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/************************************************************************
|
/************************************************************************
|
||||||
* sched/pthread_exit.c
|
* sched/pthread_exit.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@@ -45,7 +45,9 @@
|
|||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
#include <nuttx/arch.h>
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
#include "pthread_internal.h"
|
#include "pthread_internal.h"
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
@@ -111,7 +113,7 @@ void pthread_exit(FAR void *exit_value)
|
|||||||
status = pthread_completejoin(getpid(), exit_value);
|
status = pthread_completejoin(getpid(), exit_value);
|
||||||
if (status != OK)
|
if (status != OK)
|
||||||
{
|
{
|
||||||
/* Assume that the join completion failured becuase this
|
/* Assume that the join completion failured because this
|
||||||
* not really a pthread. Exit by calling exit() to flush
|
* not really a pthread. Exit by calling exit() to flush
|
||||||
* and close all file descriptors and calling atexit()
|
* and close all file descriptors and calling atexit()
|
||||||
* functions.
|
* functions.
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* pthread_join.c
|
* pthread_join.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/************************************************************************
|
/************************************************************************
|
||||||
* sched/pthread_kill.c
|
* sched/pthread_kill.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@@ -83,11 +83,11 @@ int pthread_kill(pthread_t thread, int signo)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
*get_errno_ptr() = EINVAL;
|
set_errno(EINVAL);
|
||||||
ret = kill((pid_t)thread, signo);
|
ret = kill((pid_t)thread, signo);
|
||||||
if (ret != OK)
|
if (ret != OK)
|
||||||
{
|
{
|
||||||
ret = *get_errno_ptr();
|
ret = get_errno();
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
* sched/sig_kill.c
|
* sched/sig_kill.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* sched/sig_received.c
|
* sched/sig_received.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
|
|||||||
Reference in New Issue
Block a user