blob: 25f5176967d93e1546090c035fe36811643b6879 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
/*
* Interrupt Manager
*
*
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
* On-Line Applications Research Corporation (OAR).
* All rights assigned to U.S. Government, 1994.
*
* This material may be reproduced by or for the U.S. Government pursuant
* to the copyright license under the clause at DFARS 252.227-7013. This
* notice must appear in all copies of this file and its derivatives.
*
* $Id$
*/
#include <rtems/system.h>
#include <rtems/isr.h>
#include <rtems/stack.h>
#include <rtems/intr.h>
#include <rtems/wkspace.h>
/* _Interrupt_Manager_initialization
*
* This routine initializes the interrupt manager.
*
* Input parameters: NONE
*
* Output parameters: NONE
*/
void _Interrupt_Manager_initialization( void )
{
#if ( CPU_ALLOCATE_INTERRUPT_STACK == TRUE )
if ( _CPU_Table.interrupt_stack_size < RTEMS_MINIMUM_STACK_SIZE )
rtems_fatal_error_occurred( RTEMS_INVALID_SIZE );
_CPU_Interrupt_stack_low =
_Workspace_Allocate_or_fatal_error( _CPU_Table.interrupt_stack_size );
_CPU_Interrupt_stack_high = _Addresses_Add_offset(
_CPU_Interrupt_stack_low,
_CPU_Table.interrupt_stack_size
);
#endif
#if ( CPU_HAS_HARDWARE_INTERRUPT_STACK == TRUE )
_CPU_Install_interrupt_stack();
#endif
}
/* rtems_interrupt_catch
*
* This directive allows a thread to specify what action to take when
* catching signals.
*
* Input parameters:
* new_isr_handler - address of interrupt service routine (isr)
* vector - interrupt vector number
* old_isr_handler - address at which to store previous ISR address
*
* Output parameters:
* RTEMS_SUCCESSFUL - always succeeds
* *old_isr_handler - previous ISR address
*/
rtems_status_code rtems_interrupt_catch(
rtems_isr_entry new_isr_handler,
rtems_vector_number vector,
rtems_isr_entry *old_isr_handler
)
{
if ( !_ISR_Is_vector_number_valid( vector ) )
return( RTEMS_INVALID_NUMBER );
if ( !_ISR_Is_valid_user_handler( new_isr_handler ) )
return( RTEMS_INVALID_ADDRESS );
_ISR_Install_vector(
vector, (proc_ptr)new_isr_handler, (proc_ptr *)old_isr_handler );
return( RTEMS_SUCCESSFUL );
}
|