source: rtems/bsps/shared/irq/irq-handler-install.c @ e518323

Last change on this file since e518323 was e518323, checked in by Sebastian Huber <sebastian.huber@…>, on 06/25/21 at 13:52:16

bsps/irq: Add rtems_interrupt_entry_install()

Add rtems_interrupt_entry_remove(). Split up irq-generic.c into several files.
In particular, place all functions which use dynamic memory into their own
file.

Add optional macros to let the BSP customize the vector installation after
installing the first entry and the vector removal before removing the last
entry:

  • bsp_interrupt_vector_install()
  • bsp_interrupt_vector_remove()

Use these new customization options in the m68k/genmcf548x BSP so re-use the
generic interrupt controller support.

Update #3269.

  • Property mode set to 100644
File size: 3.2 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/**
4 * @file
5 *
6 * @ingroup bsp_interrupt
7 *
8 * @brief This source file contains the rtems_interrupt_handler_install()
9 *   implementation.
10 */
11
12/*
13 * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 *    notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 *    notice, this list of conditions and the following disclaimer in the
22 *    documentation and/or other materials provided with the distribution.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 * POSSIBILITY OF SUCH DAMAGE.
35 */
36
37#include <bsp/irq-generic.h>
38#include <rtems/malloc.h>
39
40#include <stdlib.h>
41
42static rtems_status_code bsp_interrupt_handler_do_replace(
43  rtems_vector_number     vector,
44  const char             *info,
45  rtems_interrupt_handler routine,
46  void                   *arg
47)
48{
49  rtems_interrupt_entry  *entry;
50  rtems_interrupt_entry **unused;
51
52  entry = bsp_interrupt_entry_find( vector, routine, arg, &unused );
53
54  if ( entry == NULL ) {
55    return RTEMS_UNSATISFIED;
56  }
57
58  entry->handler = routine;
59  entry->info = info;
60
61  return RTEMS_SUCCESSFUL;
62}
63
64static rtems_status_code bsp_interrupt_handler_replace(
65  rtems_vector_number     vector,
66  const char             *info,
67  rtems_interrupt_handler routine,
68  void                   *arg
69)
70{
71  rtems_status_code sc;
72
73  sc = bsp_interrupt_check_and_lock( vector, routine );
74
75  if ( sc != RTEMS_SUCCESSFUL ) {
76    return sc;
77  }
78
79  sc = bsp_interrupt_handler_do_replace( vector, info, routine, arg );
80  bsp_interrupt_unlock();
81
82  return sc;
83}
84
85rtems_status_code rtems_interrupt_handler_install(
86  rtems_vector_number     vector,
87  const char             *info,
88  rtems_option            options,
89  rtems_interrupt_handler routine,
90  void                   *arg
91)
92{
93  rtems_interrupt_entry *entry;
94  rtems_status_code      sc;
95
96  if ( RTEMS_INTERRUPT_IS_REPLACE( options ) ) {
97    return bsp_interrupt_handler_replace( vector, info, routine, arg );
98  }
99
100  entry = rtems_malloc( sizeof( *entry ) );
101
102  if ( entry == NULL ) {
103    return RTEMS_NO_MEMORY;
104  }
105
106  rtems_interrupt_entry_initialize( entry, routine, arg, info );
107  sc = rtems_interrupt_entry_install( vector, options, entry );
108
109  if ( sc != RTEMS_SUCCESSFUL ) {
110    free( entry );
111  }
112
113  return sc;
114}
Note: See TracBrowser for help on using the repository browser.