bsps/sparc: Remove set_vector() usage and implementation

Removed all uses and implementations of set_vector() function across ERC32,
LEON2, and LEON3 BSPs. Replaced with rtems_interrupt_handler_install() and
rtems_interrupt_entry_install().

- Added ERC32_Clear_and_unmask_interrupt() and LEON_Clear_and_unmask_interrupt()
  for unmasking logic previously in set_vector().
- Deleted set_vector() definitions and implementations in each BSP.
- Updated related obj.yml files.
- Replaced set_vector() with rtems_interrupt_catch() in shared/gnatcommon.c.
This commit is contained in:
Sunil-Hegde
2025-05-16 01:43:20 +05:30
committed by Sunil Hegde
parent 3e1a73d634
commit a899cdd57d
17 changed files with 250 additions and 298 deletions

View File

@@ -31,6 +31,7 @@
#define CONSOLE_UART_A_TRAP ERC32_TRAP_TYPE(ERC32_INTERRUPT_UART_A_RX_TX) #define CONSOLE_UART_A_TRAP ERC32_TRAP_TYPE(ERC32_INTERRUPT_UART_A_RX_TX)
#define CONSOLE_UART_B_TRAP ERC32_TRAP_TYPE(ERC32_INTERRUPT_UART_B_RX_TX) #define CONSOLE_UART_B_TRAP ERC32_TRAP_TYPE(ERC32_INTERRUPT_UART_B_RX_TX)
#define CONSOLE_UART_ERROR_TRAP ERC32_TRAP_TYPE(ERC32_INTERRUPT_UART_ERROR)
static uint8_t erc32_console_get_register(uintptr_t addr, uint8_t i) static uint8_t erc32_console_get_register(uintptr_t addr, uint8_t i)
{ {
@@ -47,17 +48,21 @@ static void erc32_console_set_register(uintptr_t addr, uint8_t i, uint8_t val)
static int erc32_console_first_open(int major, int minor, void *arg); static int erc32_console_first_open(int major, int minor, void *arg);
#if (CONSOLE_USE_INTERRUPTS) #if (CONSOLE_USE_INTERRUPTS)
static ssize_t erc32_console_write_support_int( static ssize_t erc32_console_write_support_int(
int minor, const char *buf, size_t len); int minor, const char *buf, size_t len);
static rtems_interrupt_entry erc32_UART_A;
static rtems_interrupt_entry erc32_UART_B;
static rtems_interrupt_entry erc32_UART_ERROR;
#else #else
int console_inbyte_nonblocking( int port ); int console_inbyte_nonblocking( int port );
static ssize_t erc32_console_write_support_polled( static ssize_t erc32_console_write_support_polled(
int minor, const char *buf, size_t len); int minor, const char *buf, size_t len);
#endif #endif
static void erc32_console_initialize(int minor); static void erc32_console_initialize(int minor);
#if (CONSOLE_USE_INTERRUPTS) #if (CONSOLE_USE_INTERRUPTS)
const console_fns erc32_fns = { const console_fns erc32_fns = {
libchip_serial_default_probe, /* deviceProbe */ libchip_serial_default_probe, /* deviceProbe */
erc32_console_first_open, /* deviceFirstOpen */ erc32_console_first_open, /* deviceFirstOpen */
NULL, /* deviceLastClose */ NULL, /* deviceLastClose */
@@ -67,9 +72,9 @@ static void erc32_console_initialize(int minor);
NULL, /* deviceWritePolled */ NULL, /* deviceWritePolled */
NULL, /* deviceSetAttributes */ NULL, /* deviceSetAttributes */
true /* deviceOutputUsesInterrupts */ true /* deviceOutputUsesInterrupts */
}; };
#else #else
const console_fns erc32_fns = { const console_fns erc32_fns = {
libchip_serial_default_probe, /* deviceProbe */ libchip_serial_default_probe, /* deviceProbe */
erc32_console_first_open, /* deviceFirstOpen */ erc32_console_first_open, /* deviceFirstOpen */
NULL, /* deviceLastClose */ NULL, /* deviceLastClose */
@@ -79,7 +84,7 @@ static void erc32_console_initialize(int minor);
NULL, /* deviceWritePolled */ NULL, /* deviceWritePolled */
NULL, /* deviceSetAttributes */ NULL, /* deviceSetAttributes */
false /* deviceOutputUsesInterrupts */ false /* deviceOutputUsesInterrupts */
}; };
#endif #endif
console_tbl Console_Configuration_Ports [] = { console_tbl Console_Configuration_Ports [] = {
@@ -177,9 +182,7 @@ static ssize_t erc32_console_write_support_int(
return 0; return 0;
} }
static void erc32_console_isr_error( static rtems_isr erc32_console_isr_error( void *vector )
rtems_vector_number vector
)
{ {
int UStat; int UStat;
@@ -198,9 +201,7 @@ static void erc32_console_isr_error(
ERC32_Clear_interrupt( ERC32_INTERRUPT_UART_ERROR ); ERC32_Clear_interrupt( ERC32_INTERRUPT_UART_ERROR );
} }
static void erc32_console_isr_a( static rtems_isr erc32_console_isr_a( void *vector )
rtems_vector_number vector
)
{ {
console_data *cd = &Console_Port_Data[0]; console_data *cd = &Console_Port_Data[0];
@@ -239,9 +240,7 @@ static void erc32_console_isr_a(
} while (ERC32_Is_interrupt_pending (ERC32_INTERRUPT_UART_A_RX_TX)); } while (ERC32_Is_interrupt_pending (ERC32_INTERRUPT_UART_A_RX_TX));
} }
static void erc32_console_isr_b( static rtems_isr erc32_console_isr_b( void *vector )
rtems_vector_number vector
)
{ {
console_data *cd = &Console_Port_Data[1]; console_data *cd = &Console_Port_Data[1];
@@ -300,17 +299,16 @@ static ssize_t erc32_console_write_support_polled(
#endif #endif
/* /*
* Console Device Driver Entry Points * Console Device Driver Entry Points
*
*/ */
static void erc32_console_initialize( static void erc32_console_initialize( int minor )
int minor
)
{ {
console_data *cd = &Console_Port_Data [minor]; console_data *cd = &Console_Port_Data [minor];
#if (CONSOLE_USE_INTERRUPTS)
static bool interrupts_installed = false;
#endif
cd->bActive = false; cd->bActive = false;
cd->pDeviceContext = 0; cd->pDeviceContext = 0;
@@ -326,9 +324,47 @@ static void erc32_console_initialize(
* Initialize Hardware * Initialize Hardware
*/ */
#if (CONSOLE_USE_INTERRUPTS) #if (CONSOLE_USE_INTERRUPTS)
set_vector(erc32_console_isr_a, CONSOLE_UART_A_TRAP, 1); if (!interrupts_installed) {
set_vector(erc32_console_isr_b, CONSOLE_UART_B_TRAP, 1); rtems_interrupt_entry_initialize(
set_vector(erc32_console_isr_error, CONSOLE_UART_ERROR_TRAP, 1); &erc32_UART_A,
erc32_console_isr_a,
NULL,
"process UART A"
);
rtems_interrupt_entry_install(
ERC32_INTERRUPT_UART_A_RX_TX,
RTEMS_INTERRUPT_UNIQUE,
&erc32_UART_A
);
SPARC_Clear_and_unmask_interrupt(CONSOLE_UART_A_TRAP);
rtems_interrupt_entry_initialize(
&erc32_UART_B,
erc32_console_isr_b,
NULL,
"process UART B"
);
rtems_interrupt_entry_install(
ERC32_INTERRUPT_UART_B_RX_TX,
RTEMS_INTERRUPT_UNIQUE,
&erc32_UART_B
);
SPARC_Clear_and_unmask_interrupt(CONSOLE_UART_B_TRAP);
rtems_interrupt_entry_initialize(
&erc32_UART_ERROR,
erc32_console_isr_error,
NULL,
"process UART Error"
);
rtems_interrupt_entry_install(
ERC32_INTERRUPT_UART_ERROR,
RTEMS_INTERRUPT_UNIQUE,
&erc32_UART_ERROR
);
SPARC_Clear_and_unmask_interrupt(CONSOLE_UART_ERROR_TRAP);
interrupts_installed = true;
}
#endif #endif
/* Clear any previous error flags */ /* Clear any previous error flags */

View File

@@ -84,11 +84,7 @@ extern int end; /* last address in the program */
/* functions */ /* functions */
rtems_isr_entry set_vector( /* returns old vector */ void SPARC_Clear_and_unmask_interrupt(rtems_vector_number vector);
rtems_isr_entry handler, /* isr routine */
rtems_vector_number vector, /* vector number */
int type /* RTEMS or RAW intr */
);
void BSP_fatal_exit(uint32_t error); void BSP_fatal_exit(uint32_t error);

View File

@@ -62,7 +62,14 @@
#define TM27_USE_VECTOR_HANDLER #define TM27_USE_VECTOR_HANDLER
#define Install_tm27_vector( handler ) \ #define Install_tm27_vector( handler ) \
set_vector( (handler), TEST_VECTOR, 1 ); rtems_interrupt_handler_install( \
TEST_VECTOR, \
"test tm27 interrupt", \
RTEMS_INTERRUPT_UNIQUE, \
handler, \
NULL \
); \
SPARC_Clear_and_unmask_interrupt(TEST_VECTOR);
#define Cause_tm27_intr() \ #define Cause_tm27_intr() \
__asm__ volatile( "ta 0x10; nop " ); __asm__ volatile( "ta 0x10; nop " );

View File

@@ -66,7 +66,7 @@ void _CPU_SMP_Send_interrupt( uint32_t target_processor_index )
} }
static rtems_isr bsp_inter_processor_interrupt( static rtems_isr bsp_inter_processor_interrupt(
rtems_vector_number vector void *vector
) )
{ {
_SMP_Inter_processor_interrupt_handler( _Per_CPU_Get() ); _SMP_Inter_processor_interrupt_handler( _Per_CPU_Get() );
@@ -74,7 +74,21 @@ static rtems_isr bsp_inter_processor_interrupt(
static void erc32_install_inter_processor_interrupt( void ) static void erc32_install_inter_processor_interrupt( void )
{ {
set_vector( bsp_inter_processor_interrupt, IPI_VECTOR, 1 ); rtems_interrupt_entry erc32_handle_ipi;
rtems_interrupt_entry_initialize(
&erc32_handle_ipi,
bsp_inter_processor_interrupt,
NULL,
"process IPI Interrupt"
);
rtems_interrupt_entry_install(
IPI_VECTOR,
RTEMS_INTERRUPT_UNIQUE,
&erc32_handle_ipi
);
SPARC_Clear_and_unmask_interrupt(IPI_VECTOR);
} }
RTEMS_SYSINIT_ITEM( RTEMS_SYSINIT_ITEM(

View File

@@ -1,61 +0,0 @@
/* set_vector
*
* This routine installs an interrupt vector on the SPARC simulator.
*
* INPUT PARAMETERS:
* handler - interrupt handler entry point
* vector - vector number
* type - 0 indicates raw hardware connect
* 1 indicates RTEMS interrupt connect
*
* OUTPUT PARAMETERS: NONE
*
* RETURNS:
* address of previous interrupt handler
*
* COPYRIGHT (c) 1989-1999.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*
* Ported to ERC32 implementation of the SPARC by On-Line Applications
* Research Corporation (OAR) under contract to the European Space
* Agency (ESA).
*
* ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
* European Space Agency.
*/
#include <bsp.h>
rtems_isr_entry set_vector( /* returns old vector */
rtems_isr_entry handler, /* isr routine */
rtems_vector_number vector, /* vector number */
int type /* RTEMS or RAW intr */
)
{
rtems_isr_entry previous_isr;
if ( type ) {
rtems_interrupt_catch( handler, vector, &previous_isr );
} else {
_CPU_ISR_install_raw_handler(
vector,
(void *)handler,
(void *)&previous_isr
);
}
if ( SPARC_IS_INTERRUPT_TRAP( vector ) ) {
uint32_t source;
source = SPARC_INTERRUPT_TRAP_TO_SOURCE( vector );
ERC32_Clear_interrupt( source );
ERC32_Unmask_interrupt( source );
}
return previous_isr;
}

View File

@@ -39,6 +39,9 @@ bool Is_TX_active[ 2 ];
void *console_termios_data[ 2 ]; void *console_termios_data[ 2 ];
static rtems_interrupt_entry leon_UART_1;
static rtems_interrupt_entry leon_UART_2;
/* /*
* console_isr_a * console_isr_a
* *
@@ -204,11 +207,35 @@ void console_initialize_interrupts( void )
LEON_REG.UART_Control_1 |= LEON_REG_UART_CTRL_RI | LEON_REG_UART_CTRL_TI; LEON_REG.UART_Control_1 |= LEON_REG_UART_CTRL_RI | LEON_REG_UART_CTRL_TI;
LEON_REG.UART_Control_2 |= LEON_REG_UART_CTRL_RI | LEON_REG_UART_CTRL_TI; LEON_REG.UART_Control_2 |= LEON_REG_UART_CTRL_RI | LEON_REG_UART_CTRL_TI;
set_vector( console_isr_a, CONSOLE_UART_1_TRAP, 1 ); rtems_interrupt_entry_initialize(
#ifdef RDB_BREAK_IN &leon_UART_1,
console_isr_a,
NULL,
"process UART 1"
);
rtems_interrupt_entry_install(
LEON_INTERRUPT_UART_1_RX_TX,
RTEMS_INTERRUPT_UNIQUE,
&leon_UART_1
);
SPARC_Clear_and_unmask_interrupt(CONSOLE_UART_1_TRAP);
rtems_interrupt_entry_initialize(
&leon_UART_2,
console_isr_b,
NULL,
"process UART 2"
);
#ifdef RDB_BREAK_IN
if (trap_table[0x150/4] == 0x91d02000) if (trap_table[0x150/4] == 0x91d02000)
#endif #endif
set_vector( console_isr_b, CONSOLE_UART_2_TRAP, 1 ); rtems_interrupt_entry_install(
LEON_INTERRUPT_UART_2_RX_TX,
RTEMS_INTERRUPT_UNIQUE,
&leon_UART_2
);
SPARC_Clear_and_unmask_interrupt(CONSOLE_UART_2_TRAP);
} }
/* /*

View File

@@ -106,13 +106,7 @@ extern int CLOCK_SPEED;
extern int end; /* last address in the program */ extern int end; /* last address in the program */
/* miscellaneous stuff assumed to exist */ void SPARC_Clear_and_unmask_interrupt(rtems_vector_number vector);
rtems_isr_entry set_vector( /* returns old vector */
rtems_isr_entry handler, /* isr routine */
rtems_vector_number vector, /* vector number */
int type /* RTEMS or RAW intr */
);
void BSP_fatal_exit(uint32_t error); void BSP_fatal_exit(uint32_t error);

View File

@@ -62,7 +62,15 @@
#define TM27_USE_VECTOR_HANDLER #define TM27_USE_VECTOR_HANDLER
#define Install_tm27_vector( handler ) \ #define Install_tm27_vector( handler ) \
set_vector( (handler), TEST_VECTOR, 1 ); rtems_interrupt_handler_install( \
TEST_VECTOR, \
"test tm27 interrupt", \
RTEMS_INTERRUPT_UNIQUE, \
handler, \
NULL \
); \
SPARC_Clear_and_unmask_interrupt(TEST_VECTOR);
#define Cause_tm27_intr() \ #define Cause_tm27_intr() \
__asm__ volatile( "ta 0x10; nop " ); __asm__ volatile( "ta 0x10; nop " );

View File

@@ -1,62 +0,0 @@
/**
* @file
* @ingroup RTEMSBSPsSPARCLEON2
* @brief Installs an interrupt vector on the SPARC simulator
*/
/* set_vector
*
* This routine installs an interrupt vector on the SPARC simulator.
*
* INPUT PARAMETERS:
* handler - interrupt handler entry point
* vector - vector number
* type - 0 indicates raw hardware connect
* 1 indicates RTEMS interrupt connect
*
* OUTPUT PARAMETERS: NONE
*
* RETURNS:
* address of previous interrupt handler
*
* COPYRIGHT (c) 1989-1998.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*
* Ported to LEON implementation of the SPARC by On-Line Applications
* Research Corporation (OAR) under contract to the European Space
* Agency (ESA).
*
* LEON modifications of respective RTEMS file: COPYRIGHT (c) 1995.
* European Space Agency.
*/
#include <bsp.h>
rtems_isr_entry set_vector( /* returns old vector */
rtems_isr_entry handler, /* isr routine */
rtems_vector_number vector, /* vector number */
int type /* RTEMS or RAW intr */
)
{
rtems_isr_entry previous_isr;
if ( type )
rtems_interrupt_catch( handler, vector, &previous_isr );
else
_CPU_ISR_install_raw_handler( vector, handler, (void *)&previous_isr );
if ( SPARC_IS_INTERRUPT_TRAP( vector ) ) {
uint32_t source;
source = SPARC_INTERRUPT_TRAP_TO_SOURCE( vector );
LEON_Clear_interrupt( source );
LEON_Unmask_interrupt( source );
}
return previous_isr;
}

View File

@@ -122,13 +122,7 @@ extern int CLOCK_SPEED;
extern int end; /* last address in the program */ extern int end; /* last address in the program */
/* miscellaneous stuff assumed to exist */ void SPARC_Clear_and_unmask_interrupt(rtems_vector_number vector);
rtems_isr_entry set_vector( /* returns old vector */
rtems_isr_entry handler, /* isr routine */
rtems_vector_number vector, /* vector number */
int type /* RTEMS or RAW intr */
);
void BSP_fatal_exit(uint32_t error); void BSP_fatal_exit(uint32_t error);

View File

@@ -69,7 +69,14 @@
#define TM27_USE_VECTOR_HANDLER #define TM27_USE_VECTOR_HANDLER
#define Install_tm27_vector( handler ) \ #define Install_tm27_vector( handler ) \
set_vector( (handler), TEST_VECTOR, 1 ); rtems_interrupt_handler_install( \
TEST_VECTOR, \
"test tm27 interrupt", \
RTEMS_INTERRUPT_UNIQUE, \
handler, \
NULL \
); \
SPARC_Clear_and_unmask_interrupt(TEST_VECTOR);
#define Cause_tm27_intr() \ #define Cause_tm27_intr() \
__asm__ volatile( "ta 0x10; nop " ); __asm__ volatile( "ta 0x10; nop " );

View File

@@ -1,62 +0,0 @@
/**
* @file
* @ingroup RTEMSBSPsSPARCLEON3
* @brief Install an interrupt vector on SPARC
*/
/* This routine installs an interrupt vector on the SPARC simulator.
*
* INPUT PARAMETERS:
* handler - interrupt handler entry point
* vector - vector number
* type - 0 indicates raw hardware connect
* 1 indicates RTEMS interrupt connect
*
* OUTPUT PARAMETERS: NONE
*
* RETURNS:
* address of previous interrupt handler
*/
/* COPYRIGHT (c) 1989-1998.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*
* Ported to LEON implementation of the SPARC by On-Line Applications
* Research Corporation (OAR) under contract to the European Space
* Agency (ESA).
*
* LEON modifications of respective RTEMS file: COPYRIGHT (c) 1995.
* European Space Agency.
*/
#include <bsp.h>
#include <leon.h>
rtems_isr_entry set_vector( /* returns old vector */
rtems_isr_entry handler, /* isr routine */
rtems_vector_number vector, /* vector number */
int type /* RTEMS or RAW intr */
)
{
rtems_isr_entry previous_isr;
if ( type )
rtems_interrupt_catch( handler, vector, &previous_isr );
else
_CPU_ISR_install_raw_handler( vector, (void *)handler, (void *)&previous_isr );
if ( SPARC_IS_INTERRUPT_TRAP( vector ) ) {
uint32_t source;
source = SPARC_INTERRUPT_TRAP_TO_SOURCE( vector );
LEON_Clear_interrupt( source );
LEON_Unmask_interrupt( source );
}
return previous_isr;
}

View File

@@ -17,8 +17,9 @@
* Synchronous trap handler. Map the trap number of SIGFPE, SIGSEGV * Synchronous trap handler. Map the trap number of SIGFPE, SIGSEGV
* or SIGILL to generate the corresponding Ada exception. * or SIGILL to generate the corresponding Ada exception.
*/ */
static rtems_isr static rtems_isr __gnat_exception_handler(
__gnat_exception_handler(rtems_vector_number trap) rtems_vector_number trap
)
{ {
uint32_t real_trap; uint32_t real_trap;
uint32_t signal; uint32_t signal;
@@ -46,23 +47,22 @@ __gnat_exception_handler(rtems_vector_number trap)
* Asynchronous trap handler. As it happens, the interrupt trap numbers for * Asynchronous trap handler. As it happens, the interrupt trap numbers for
* SPARC is 17 - 31, so we just map then directly on the same signal number. * SPARC is 17 - 31, so we just map then directly on the same signal number.
*/ */
static rtems_isr static rtems_isr __gnat_interrupt_handler (
__gnat_interrupt_handler (rtems_vector_number trap) rtems_vector_number trap
)
{ {
uint32_t real_trap; uint32_t real_trap;
real_trap = SPARC_REAL_TRAP_NUMBER (trap); real_trap = SPARC_REAL_TRAP_NUMBER (trap);
kill (getpid (), real_trap); kill (getpid (), real_trap);
} }
/* /*
* Default signal handler with error reporting * Default signal handler with error reporting
*/ */
static void static void __gnat_signals_Abnormal_termination_handler (
__gnat_signals_Abnormal_termination_handler (int signo) int signo
)
{ {
switch (signo) switch (signo)
{ {
@@ -76,18 +76,20 @@ __gnat_signals_Abnormal_termination_handler (int signo)
printk("\nProgram_Error\n"); printk("\nProgram_Error\n");
break; break;
} }
exit (1); exit(1);
} }
const struct sigaction __gnat_error_vector = const struct sigaction __gnat_error_vector =
{0, -1, {0, -1,
{__gnat_signals_Abnormal_termination_handler}}; {__gnat_signals_Abnormal_termination_handler}};
void void __gnat_install_handler_common (
__gnat_install_handler_common (int t1, int t2) int t1, int t2
)
{ {
uint32_t trap; uint32_t trap;
rtems_isr_entry previous_isr; rtems_isr_entry previous_isr_a;
rtems_isr_entry previous_isr_b;
sigaction (SIGSEGV, &__gnat_error_vector, NULL); sigaction (SIGSEGV, &__gnat_error_vector, NULL);
sigaction (SIGFPE, &__gnat_error_vector, NULL); sigaction (SIGFPE, &__gnat_error_vector, NULL);
@@ -95,12 +97,11 @@ __gnat_install_handler_common (int t1, int t2)
for (trap = 0; trap < 256; trap++) for (trap = 0; trap < 256; trap++)
{ {
/* /*
* Skip window overflow, underflow, and flush as well as software * Skip window overflow, underflow, and flush as well as software
* trap 0 which we will use as a shutdown. Also avoid trap 0x70 - 0x7f * trap 0 which we will use as a shutdown. Also avoid trap 0x70 - 0x7f
* which cannot happen and where some of the space is used to pass * which cannot happen and where some of the space is used to pass
* paramaters to the program. 0x80 for system traps and * parameters to the program. 0x80 for system traps and
* 0x81 - 0x83 by the remote debugging stub. * 0x81 - 0x83 by the remote debugging stub.
* Avoid two bsp specific interrupts which normally are used * Avoid two bsp specific interrupts which normally are used
* by the real-time clock and UART B. * by the real-time clock and UART B.
@@ -109,9 +110,14 @@ __gnat_install_handler_common (int t1, int t2)
if ((trap >= 0x11) && (trap <= 0x1f)) if ((trap >= 0x11) && (trap <= 0x1f))
{ {
if ((trap != t1) && (trap != t2)) if ((trap != t1) && (trap != t2))
rtems_interrupt_catch (__gnat_interrupt_handler, trap, &previous_isr); {
rtems_interrupt_catch (__gnat_interrupt_handler, trap, &previous_isr_a);
}
} }
else if ((trap != 5 && trap != 6) && ((trap < 0x70) || (trap > 0x83))) else if ((trap != 5 && trap != 6) && ((trap < 0x70) || (trap > 0x83)))
set_vector (__gnat_exception_handler, SPARC_SYNCHRONOUS_TRAP (trap), 1); {
rtems_interrupt_catch (__gnat_exception_handler, SPARC_SYNCHRONOUS_TRAP (trap), &previous_isr_b);
SPARC_Clear_and_unmask_interrupt(SPARC_SYNCHRONOUS_TRAP (trap));
}
} }
} }

View File

@@ -0,0 +1,48 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/**
* @file leontrap.c
* @ingroup RTEMSBSPsSPARCERC32
* @ingroup RTEMSBSPsLEON2
* @ingroup RTEMSBSPsLEON3
* @ingroup RTEMSBSPsSPARCShared
* @brief Clears and unmasks a SPARC interrupt on LEON.
*/
/*
* Copyright (c) 2025 On-Line Applications Research Corporation (OAR)
* Copyright (c) 2025 Sunil Hegde <sunil1hegde@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <bsp.h>
void SPARC_Clear_and_unmask_interrupt(rtems_vector_number vector)
{
if (SPARC_IS_INTERRUPT_TRAP(vector)) {
uint32_t source = SPARC_INTERRUPT_TRAP_TO_SOURCE(vector);
BSP_Clear_interrupt(source);
BSP_Unmask_interrupt(source);
}
}

View File

@@ -63,7 +63,7 @@ source:
- bsps/sparc/erc32/start/bspidle.c - bsps/sparc/erc32/start/bspidle.c
- bsps/sparc/erc32/start/bspstart.c - bsps/sparc/erc32/start/bspstart.c
- bsps/sparc/erc32/start/erc32mec.c - bsps/sparc/erc32/start/erc32mec.c
- bsps/sparc/erc32/start/setvec.c - bsps/sparc/shared/start/sparctrap.c
- bsps/sparc/shared/gnatcommon.c - bsps/sparc/shared/gnatcommon.c
- bsps/sparc/shared/irq/bsp_isr_handler.c - bsps/sparc/shared/irq/bsp_isr_handler.c
- bsps/sparc/shared/irq/irq-shared.c - bsps/sparc/shared/irq/irq-shared.c

View File

@@ -29,6 +29,7 @@ source:
- bsps/shared/irq/irq-default-handler.c - bsps/shared/irq/irq-default-handler.c
- bsps/shared/start/gettargethash-default.c - bsps/shared/start/gettargethash-default.c
- bsps/shared/start/sbrk.c - bsps/shared/start/sbrk.c
- bsps/sparc/shared/start/sparctrap.c
- bsps/sparc/leon2/btimer/btimer.c - bsps/sparc/leon2/btimer/btimer.c
- bsps/sparc/leon2/clock/ckinit.c - bsps/sparc/leon2/clock/ckinit.c
- bsps/sparc/leon2/console/console.c - bsps/sparc/leon2/console/console.c
@@ -39,7 +40,6 @@ source:
- bsps/sparc/leon2/start/bspidle.c - bsps/sparc/leon2/start/bspidle.c
- bsps/sparc/leon2/start/bspstart.c - bsps/sparc/leon2/start/bspstart.c
- bsps/sparc/leon2/start/cache.c - bsps/sparc/leon2/start/cache.c
- bsps/sparc/leon2/start/setvec.c
- bsps/sparc/shared/drvmgr/ambapp_bus_leon2.c - bsps/sparc/shared/drvmgr/ambapp_bus_leon2.c
- bsps/sparc/shared/drvmgr/leon2_amba_bus.c - bsps/sparc/shared/drvmgr/leon2_amba_bus.c
- bsps/sparc/shared/gnatcommon.c - bsps/sparc/shared/gnatcommon.c

View File

@@ -36,6 +36,7 @@ source:
- bsps/shared/dev/serial/console-termios.c - bsps/shared/dev/serial/console-termios.c
- bsps/shared/irq/irq-default-handler.c - bsps/shared/irq/irq-default-handler.c
- bsps/shared/start/sbrk.c - bsps/shared/start/sbrk.c
- bsps/sparc/shared/start/sparctrap.c
- bsps/sparc/leon3/btimer/btimer.c - bsps/sparc/leon3/btimer/btimer.c
- bsps/sparc/leon3/btimer/watchdog.c - bsps/sparc/leon3/btimer/watchdog.c
- bsps/sparc/leon3/clock/ckinit.c - bsps/sparc/leon3/clock/ckinit.c
@@ -51,7 +52,6 @@ source:
- bsps/sparc/leon3/start/drvmgr_def_drivers.c - bsps/sparc/leon3/start/drvmgr_def_drivers.c
- bsps/sparc/leon3/start/eirq.c - bsps/sparc/leon3/start/eirq.c
- bsps/sparc/leon3/start/gettargethash.c - bsps/sparc/leon3/start/gettargethash.c
- bsps/sparc/leon3/start/setvec.c
- bsps/sparc/shared/gnatcommon.c - bsps/sparc/shared/gnatcommon.c
- bsps/sparc/shared/irq/bsp_isr_handler.c - bsps/sparc/shared/irq/bsp_isr_handler.c
- bsps/sparc/shared/pci/gr_cpci_gr740.c - bsps/sparc/shared/pci/gr_cpci_gr740.c