protect access to exec intr's.
[AROS.git] / rom / exec / setintvector.c
blob2250e13ecd0f36bc0ff0d770fe19468610a14d3d
1 /*
2 Copyright © 1995-2017, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: Install an interrupt handler.
6 Lang: english
7 */
8 #include <exec/execbase.h>
9 #include <exec/interrupts.h>
10 #include <proto/exec.h>
11 #include <aros/libcall.h>
13 #include "exec_intern.h"
14 #include "exec_debug.h"
16 /*****************************************************************************
18 NAME */
20 AROS_LH2(struct Interrupt *, SetIntVector,
22 /* SYNOPSIS */
23 AROS_LHA(ULONG, intNumber, D0),
24 AROS_LHA(struct Interrupt *, interrupt, A1),
26 /* LOCATION */
27 struct ExecBase *, SysBase, 27, Exec)
29 /* FUNCTION
31 INPUTS
33 RESULT
35 NOTES
37 EXAMPLE
39 BUGS
41 SEE ALSO
43 INTERNALS
45 ******************************************************************************/
47 AROS_LIBFUNC_INIT
48 struct Interrupt *oldint;
49 BOOL ishandler = intNumber <= 2 || (intNumber >= 6 && intNumber <= 12);
51 ExecLog(SysBase, EXECDEBUGF_EXCEPTHANDLER, "SetIntVector: Int %d, Interrupt %p\n", intNumber, interrupt);
53 Disable ();
54 #if defined(__AROSEXEC_SMP__)
55 EXEC_SPINLOCK_LOCK(&PrivExecBase(SysBase)->IntrListSpinLock, SPINLOCK_MODE_WRITE);
56 #endif
57 oldint = (struct Interrupt *)SysBase->IntVects[intNumber].iv_Node;
58 SysBase->IntVects[intNumber].iv_Node = ishandler ? (struct Node *)interrupt : NULL;
60 if (interrupt)
62 SysBase->IntVects[intNumber].iv_Data = interrupt->is_Data;
63 SysBase->IntVects[intNumber].iv_Code = interrupt->is_Code;
65 else
67 SysBase->IntVects[intNumber].iv_Data = (APTR)~0;
68 SysBase->IntVects[intNumber].iv_Code = (void *)~0;
70 #if defined(__AROSEXEC_SMP__)
71 EXEC_SPINLOCK_UNLOCK(&PrivExecBase(SysBase)->IntrListSpinLock);
72 #endif
73 Enable ();
75 return oldint;
77 AROS_LIBFUNC_EXIT
78 } /* SetIntVector */