2 Copyright © 1995-2017, The AROS Development Team. All rights reserved.
5 Desc: Install an interrupt handler.
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 /*****************************************************************************
20 AROS_LH2(struct Interrupt
*, SetIntVector
,
23 AROS_LHA(ULONG
, intNumber
, D0
),
24 AROS_LHA(struct Interrupt
*, interrupt
, A1
),
27 struct ExecBase
*, SysBase
, 27, Exec
)
45 ******************************************************************************/
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
);
54 #if defined(__AROSEXEC_SMP__)
55 EXEC_SPINLOCK_LOCK(&PrivExecBase(SysBase
)->IntrListSpinLock
, SPINLOCK_MODE_WRITE
);
57 oldint
= (struct Interrupt
*)SysBase
->IntVects
[intNumber
].iv_Node
;
58 SysBase
->IntVects
[intNumber
].iv_Node
= ishandler
? (struct Node
*)interrupt
: NULL
;
62 SysBase
->IntVects
[intNumber
].iv_Data
= interrupt
->is_Data
;
63 SysBase
->IntVects
[intNumber
].iv_Code
= interrupt
->is_Code
;
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
);