summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/unix
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/unix')
-rw-r--r--c/src/lib/libbsp/unix/posix/clock/clock.c61
-rw-r--r--c/src/lib/libbsp/unix/posix/console/console.c1
-rw-r--r--c/src/lib/libbsp/unix/posix/include/bsp.h19
-rw-r--r--c/src/lib/libbsp/unix/posix/shmsupp/addrconv.c2
-rw-r--r--c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c130
-rw-r--r--c/src/lib/libbsp/unix/posix/shmsupp/intr.c11
-rw-r--r--c/src/lib/libbsp/unix/posix/shmsupp/lock.c60
-rw-r--r--c/src/lib/libbsp/unix/posix/shmsupp/mpisr.c11
-rw-r--r--c/src/lib/libbsp/unix/posix/startup/bspclean.c15
-rw-r--r--c/src/lib/libbsp/unix/posix/startup/bspstart.c2
-rw-r--r--c/src/lib/libbsp/unix/posix/startup/exit.c1
-rw-r--r--c/src/lib/libbsp/unix/posix/startup/setvec.c1
-rw-r--r--c/src/lib/libbsp/unix/posix/timer/timer.c2
13 files changed, 54 insertions, 262 deletions
diff --git a/c/src/lib/libbsp/unix/posix/clock/clock.c b/c/src/lib/libbsp/unix/posix/clock/clock.c
index 7b22424251..da0dd46807 100644
--- a/c/src/lib/libbsp/unix/posix/clock/clock.c
+++ b/c/src/lib/libbsp/unix/posix/clock/clock.c
@@ -14,33 +14,16 @@
* $Id$
*/
-#include <rtems.h>
-#include <rtems/libio.h>
#include <bsp.h>
-
-/*
- * In order to get the types and prototypes used in this file under
- * Solaris 2.3, it is necessary to pull the following magic.
- */
-
-#if defined(solaris)
-#warning "Ignore the undefining __STDC__ warning"
-#undef __STDC__
-#define __STDC__ 0
-#undef _POSIX_C_SOURCE
-#endif
-
+#include <rtems/libio.h>
#include <stdlib.h>
-#include <stdio.h>
-#include <signal.h>
-#include <time.h>
-
-extern rtems_configuration_table Configuration;
void Clock_exit(void);
volatile rtems_unsigned32 Clock_driver_ticks;
+rtems_unsigned32 Clock_driver_vector;
+
/*
* These are set by clock driver during its init
*/
@@ -51,18 +34,11 @@ rtems_device_minor_number rtems_clock_minor;
void
Install_clock(rtems_isr_entry clock_isr)
{
- struct itimerval new;
-
Clock_driver_ticks = 0;
- new.it_value.tv_sec = 0;
- new.it_value.tv_usec = Configuration.microseconds_per_tick;
- new.it_interval.tv_sec = 0;
- new.it_interval.tv_usec = Configuration.microseconds_per_tick;
+ (void)set_vector(clock_isr, Clock_driver_vector, 1);
- (void)set_vector(clock_isr, SIGALRM, 1);
-
- setitimer(ITIMER_REAL, &new, 0);
+ _CPU_Start_clock( BSP_Configuration.microseconds_per_tick );
atexit(Clock_exit);
}
@@ -73,7 +49,7 @@ ReInstall_clock(rtems_isr_entry new_clock_isr)
rtems_unsigned32 isrlevel = 0;
rtems_interrupt_disable(isrlevel);
- (void)set_vector(new_clock_isr, SIGALRM, 1);
+ (void)set_vector(new_clock_isr, Clock_driver_vector, 1);
rtems_interrupt_enable(isrlevel);
}
@@ -92,26 +68,9 @@ Clock_isr(int vector)
void
Clock_exit(void)
{
- struct itimerval new;
- struct sigaction act;
-
- /*
- * Set the SIGALRM signal to ignore any last
- * signals that might come in while we are
- * disarming the timer and removing the interrupt
- * vector.
- */
-
- act.sa_handler = SIG_IGN;
-
- sigaction(SIGALRM, &act, 0);
+ _CPU_Stop_clock();
- new.it_value.tv_sec = 0;
- new.it_value.tv_usec = 0;
-
- setitimer(ITIMER_REAL, &new, 0);
-
- (void)set_vector(0, SIGALRM, 1);
+ (void)set_vector(0, Clock_driver_vector, 1);
}
rtems_device_driver
@@ -121,6 +80,8 @@ Clock_initialize(
void *pargp
)
{
+ Clock_driver_vector = _CPU_Get_clock_vector();
+
Install_clock((rtems_isr_entry) Clock_isr);
/*
@@ -150,7 +111,7 @@ rtems_device_driver Clock_control(
if (args->command == rtems_build_name('I', 'S', 'R', ' '))
{
- Clock_isr(SIGALRM);
+ Clock_isr(Clock_driver_vector);
}
else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
{
diff --git a/c/src/lib/libbsp/unix/posix/console/console.c b/c/src/lib/libbsp/unix/posix/console/console.c
index 61bbe08c78..de478328bb 100644
--- a/c/src/lib/libbsp/unix/posix/console/console.c
+++ b/c/src/lib/libbsp/unix/posix/console/console.c
@@ -21,7 +21,6 @@
* $Id$
*/
-#include <rtems.h>
#include <bsp.h>
#include <unistd.h>
diff --git a/c/src/lib/libbsp/unix/posix/include/bsp.h b/c/src/lib/libbsp/unix/posix/include/bsp.h
index 6ebec41276..0b3556c80f 100644
--- a/c/src/lib/libbsp/unix/posix/include/bsp.h
+++ b/c/src/lib/libbsp/unix/posix/include/bsp.h
@@ -25,7 +25,6 @@ extern "C" {
#include <console.h>
#include <iosupp.h>
#include <libcsupport.h>
-#include <signal.h>
/*
* Define the time limits for RTEMS Test Suite test durations.
@@ -63,24 +62,6 @@ extern "C" {
extern rtems_configuration_table BSP_Configuration;
/*
- * Define this to use signals for MPCI shared memory driver.
- * If undefined, the shared memory driver will poll from the
- * clock interrupt.
- * Ref: ../shmsupp/getcfg.c
- *
- * BEWARE:: many UN*X kernels and debuggers become severely confused when
- * debugging programs which use signals. The problem is *much*
- * worse when using multiple signals, since ptrace(2) tends to
- * drop all signals except 1 in the case of multiples.
- * On hpux9, this problem was so bad, we couldn't use interrupts
- * with the shared memory driver if we ever hoped to debug
- * RTEMS programs.
- * Maybe systems that use /proc don't have this problem...
- */
-
-/* #define INTERRUPT_EXTERNAL_MPCI SIGUSR1 */
-
-/*
* Device Driver Table Entries
*/
diff --git a/c/src/lib/libbsp/unix/posix/shmsupp/addrconv.c b/c/src/lib/libbsp/unix/posix/shmsupp/addrconv.c
index fd3ba689bd..8af7498b64 100644
--- a/c/src/lib/libbsp/unix/posix/shmsupp/addrconv.c
+++ b/c/src/lib/libbsp/unix/posix/shmsupp/addrconv.c
@@ -19,8 +19,6 @@
* $Id$
*/
-#include <rtems.h>
-
#include <bsp.h>
#include <shm.h>
diff --git a/c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c b/c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c
index b66e3c2287..c912447631 100644
--- a/c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c
+++ b/c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c
@@ -25,19 +25,8 @@
* $Id$
*/
-#include <rtems.h>
-
-#include <shm.h>
#include <bsp.h>
-
-#include <sys/types.h>
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/ipc.h>
-#include <sys/shm.h>
-#include <sys/sem.h>
+#include <shm.h>
shm_config_table BSP_shm_cfgtbl;
@@ -47,124 +36,39 @@ void Shm_Cause_interrupt_unix(
rtems_unsigned32 node
);
-void fix_semaphores( void )
-{
- rtems_unsigned32 maximum_nodes;
- int i;
-
- int shmid;
- char *shm_addr;
- key_t shm_key;
- key_t sem_key;
- int status;
- int shm_size;
-
- if (getenv("RTEMS_SHM_KEY"))
- shm_key = strtol(getenv("RTEMS_SHM_KEY"), 0, 0);
- else
-#ifdef RTEMS_SHM_KEY
- shm_key = RTEMS_SHM_KEY;
-#else
- shm_key = 0xa000;
-#endif
-
- if (getenv("RTEMS_SHM_SIZE"))
- shm_size = strtol(getenv("RTEMS_SHM_SIZE"), 0, 0);
- else
-#ifdef RTEMS_SHM_SIZE
- shm_size = RTEMS_SHM_SIZE;
-#else
- shm_size = 64 * KILOBYTE;
-#endif
-
- if (getenv("RTEMS_SHM_SEMAPHORE_KEY"))
- sem_key = strtol(getenv("RTEMS_SHM_SEMAPHORE_KEY"), 0, 0);
- else
-#ifdef RTEMS_SHM_SEMAPHORE_KEY
- sem_key = RTEMS_SHM_SEMAPHORE_KEY;
-#else
- sem_key = 0xa001;
-#endif
-
- shmid = shmget(shm_key, shm_size, IPC_CREAT | 0660);
- if ( shmid == -1 ) {
- fix_syscall_errno(); /* in case of newlib */
- perror( "shmget" );
- rtems_fatal_error_occurred(RTEMS_UNSATISFIED);
- }
-
- shm_addr = shmat(shmid, (char *)0, SHM_RND);
- if ( shm_addr == (void *)-1 ) {
- fix_syscall_errno(); /* in case of newlib */
- perror( "shmat" );
- rtems_fatal_error_occurred(RTEMS_UNSATISFIED);
- }
-
- maximum_nodes = Shm_RTEMS_MP_Configuration->maximum_nodes;
- semid = semget(sem_key, maximum_nodes + 1, IPC_CREAT | 0660);
- if ( semid == -1 ) {
- fix_syscall_errno(); /* in case of newlib */
- perror( "semget" );
- rtems_fatal_error_occurred(RTEMS_UNSATISFIED);
- }
-
- if ( Shm_Is_master_node() ) {
- for ( i=0 ; i <= maximum_nodes ; i++ ) {
-
-#if defined(solaris2)
- union semun {
- int val;
- struct semid_ds *buf;
- ushort *array;
- } help;
-
- help.val = 1;
- semctl( semid, i, SETVAL, help );
-#endif
-#if defined(hpux)
- semctl( semid, i, SETVAL, 1 );
-#endif
-
- fix_syscall_errno(); /* in case of newlib */
- if ( status == -1 ) {
- fprintf( stderr, "Sem init failed %d\n", errno ); fflush( stderr );
- rtems_fatal_error_occurred(RTEMS_UNSATISFIED);
- }
- }
- }
-
- BSP_shm_cfgtbl.base = (vol_u32 *)shm_addr;
- BSP_shm_cfgtbl.length = shm_size;
-}
-
void Shm_Get_configuration(
rtems_unsigned32 localnode,
shm_config_table **shmcfg
)
{
- fix_semaphores();
+ _CPU_SHM_Init(
+ Shm_Maximum_nodes,
+ Shm_Is_master_node(),
+ (void **)&BSP_shm_cfgtbl.base,
+ (unsigned32 *)&BSP_shm_cfgtbl.length
+ );
- BSP_shm_cfgtbl.format = SHM_BIG;
+ BSP_shm_cfgtbl.format = SHM_BIG;
- BSP_shm_cfgtbl.cause_intr = Shm_Cause_interrupt_unix;
+ BSP_shm_cfgtbl.cause_intr = Shm_Cause_interrupt_unix;
#ifdef NEUTRAL_BIG
- BSP_shm_cfgtbl.convert = NULL_CONVERT;
+ BSP_shm_cfgtbl.convert = NULL_CONVERT;
#else
- BSP_shm_cfgtbl.convert = CPU_swap_u32;
+ BSP_shm_cfgtbl.convert = CPU_swap_u32;
#endif
-#ifdef INTERRUPT_EXTERNAL_MPCI
+ if ( _CPU_SHM_Get_vector() ) {
BSP_shm_cfgtbl.poll_intr = INTR_MODE;
- BSP_shm_cfgtbl.Intr.address = (vol_u32 *) getpid(); /* process id */
- BSP_shm_cfgtbl.Intr.value = INTERRUPT_EXTERNAL_MPCI; /* signal to send */
+ BSP_shm_cfgtbl.Intr.address = (vol_u32 *) _CPU_Get_pid(); /* process id */
+ BSP_shm_cfgtbl.Intr.value = _CPU_SHM_Get_vector(); /* signal to send */
BSP_shm_cfgtbl.Intr.length = LONG;
-#else
+ } else {
BSP_shm_cfgtbl.poll_intr = POLLED_MODE;
BSP_shm_cfgtbl.Intr.address = NO_INTERRUPT;
BSP_shm_cfgtbl.Intr.value = NO_INTERRUPT;
BSP_shm_cfgtbl.Intr.length = NO_INTERRUPT;
-#endif
+ }
- *shmcfg = &BSP_shm_cfgtbl;
+ *shmcfg = &BSP_shm_cfgtbl;
}
diff --git a/c/src/lib/libbsp/unix/posix/shmsupp/intr.c b/c/src/lib/libbsp/unix/posix/shmsupp/intr.c
index 2f8cd6db11..243af403d9 100644
--- a/c/src/lib/libbsp/unix/posix/shmsupp/intr.c
+++ b/c/src/lib/libbsp/unix/posix/shmsupp/intr.c
@@ -19,18 +19,15 @@
* $Id$
*/
-#include <rtems.h>
+#include <bsp.h>
#include <shm.h>
-#include <stdio.h>
-#include <signal.h>
-
void Shm_Cause_interrupt_unix(
rtems_unsigned32 node
)
{
- Shm_Interrupt_information *intr;
- intr = &Shm_Interrupt_table[node];
+ Shm_Interrupt_information *intr;
+ intr = &Shm_Interrupt_table[node];
- kill((pid_t) intr->address, intr->value);
+ _CPU_SHM_Send_interrupt( (int) intr->address, (int) intr->value );
}
diff --git a/c/src/lib/libbsp/unix/posix/shmsupp/lock.c b/c/src/lib/libbsp/unix/posix/shmsupp/lock.c
index 0dd0cbd8b3..76a57d0a06 100644
--- a/c/src/lib/libbsp/unix/posix/shmsupp/lock.c
+++ b/c/src/lib/libbsp/unix/posix/shmsupp/lock.c
@@ -17,18 +17,9 @@
* $Id$
*/
-#include <rtems.h>
-
#include <bsp.h>
#include <shm.h>
-#include <errno.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/ipc.h>
-#include <sys/shm.h>
-#include <sys/sem.h>
-
extern int semid;
/*
@@ -55,30 +46,13 @@ void Shm_Lock(
Shm_Locked_queue_Control *lq_cb
)
{
- rtems_unsigned32 isr_level;
- struct sembuf sb;
- int status;
-
- sb.sem_num = lq_cb->lock;
- sb.sem_op = -1;
- sb.sem_flg = 0;
+ rtems_unsigned32 isr_level;
- rtems_interrupt_disable( isr_level );
+ rtems_interrupt_disable( isr_level );
- Shm_isrstat = isr_level;
+ Shm_isrstat = isr_level;
- while (1) {
- status = semop(semid, &sb, 1);
- if ( status >= 0 )
- break;
- if ( status == -1 ) {
- fix_syscall_errno(); /* in case of newlib */
- if (errno == EINTR)
- continue;
- perror("shm lock");
- rtems_fatal_error_occurred(RTEMS_UNSATISFIED);
- }
- }
+ _CPU_SHM_Lock( lq_cb->lock );
}
/*
@@ -91,28 +65,10 @@ void Shm_Unlock(
Shm_Locked_queue_Control *lq_cb
)
{
- rtems_unsigned32 isr_level;
- struct sembuf sb;
- int status;
-
- sb.sem_num = lq_cb->lock;
- sb.sem_op = 1;
- sb.sem_flg = 0;
-
- while (1) {
- status = semop(semid, &sb, 1);
- if ( status >= 0 )
- break;
+ rtems_unsigned32 isr_level;
- if ( status == -1 ) {
- fix_syscall_errno(); /* in case of newlib */
- if (errno == EINTR)
- continue;
- perror("shm unlock");
- rtems_fatal_error_occurred(RTEMS_UNSATISFIED);
- }
- }
+ _CPU_SHM_Unlock( lq_cb->lock );
- isr_level = Shm_isrstat;
- rtems_interrupt_enable( isr_level );
+ isr_level = Shm_isrstat;
+ rtems_interrupt_enable( isr_level );
}
diff --git a/c/src/lib/libbsp/unix/posix/shmsupp/mpisr.c b/c/src/lib/libbsp/unix/posix/shmsupp/mpisr.c
index ff24bfa31c..a047edf2f2 100644
--- a/c/src/lib/libbsp/unix/posix/shmsupp/mpisr.c
+++ b/c/src/lib/libbsp/unix/posix/shmsupp/mpisr.c
@@ -18,14 +18,15 @@
* $Id$
*/
-#include <rtems.h>
-
#include <bsp.h>
#include <shm.h>
void Shm_setvec( void )
{
-#ifdef INTERRUPT_EXTERNAL_MPCI
- set_vector( Shm_isr, INTERRUPT_EXTERNAL_MPCI, 1 );
-#endif
+ int vector;
+
+ vector = _CPU_SHM_Get_vector();
+
+ if ( vector )
+ set_vector( Shm_isr, vector, 1 );
}
diff --git a/c/src/lib/libbsp/unix/posix/startup/bspclean.c b/c/src/lib/libbsp/unix/posix/startup/bspclean.c
index 47d9548694..1fe2de4439 100644
--- a/c/src/lib/libbsp/unix/posix/startup/bspclean.c
+++ b/c/src/lib/libbsp/unix/posix/startup/bspclean.c
@@ -19,7 +19,6 @@
* $Id$
*/
-#include <rtems.h>
#include <bsp.h>
#include <stdio.h>
@@ -30,13 +29,13 @@
void bsp_cleanup( void )
{
- /*
- * Invoke any fatal error extension and "halt"
- * By definition, rtems_fatal_error_occurred does not return.
- */
+ /*
+ * Invoke any fatal error extension and "halt"
+ * By definition, rtems_fatal_error_occurred does not return.
+ */
-fflush(stdout);
-fflush(stderr);
+ fflush(stdout);
+ fflush(stderr);
- rtems_fatal_error_occurred(0);
+ rtems_fatal_error_occurred(0);
}
diff --git a/c/src/lib/libbsp/unix/posix/startup/bspstart.c b/c/src/lib/libbsp/unix/posix/startup/bspstart.c
index ed687f7319..f948d5a038 100644
--- a/c/src/lib/libbsp/unix/posix/startup/bspstart.c
+++ b/c/src/lib/libbsp/unix/posix/startup/bspstart.c
@@ -27,8 +27,6 @@
* $Id$
*/
-#include <rtems.h>
-
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
diff --git a/c/src/lib/libbsp/unix/posix/startup/exit.c b/c/src/lib/libbsp/unix/posix/startup/exit.c
index ac3c840832..8e07dc0577 100644
--- a/c/src/lib/libbsp/unix/posix/startup/exit.c
+++ b/c/src/lib/libbsp/unix/posix/startup/exit.c
@@ -14,7 +14,6 @@
* $Id$
*/
-#include <rtems.h>
#include <bsp.h>
#include <clockdrv.h>
diff --git a/c/src/lib/libbsp/unix/posix/startup/setvec.c b/c/src/lib/libbsp/unix/posix/startup/setvec.c
index 8d3aedceb9..6be1e50555 100644
--- a/c/src/lib/libbsp/unix/posix/startup/setvec.c
+++ b/c/src/lib/libbsp/unix/posix/startup/setvec.c
@@ -24,7 +24,6 @@
* $Id$
*/
-#include <rtems.h>
#include <bsp.h>
/*
diff --git a/c/src/lib/libbsp/unix/posix/timer/timer.c b/c/src/lib/libbsp/unix/posix/timer/timer.c
index 223a82a5d6..e1b9704072 100644
--- a/c/src/lib/libbsp/unix/posix/timer/timer.c
+++ b/c/src/lib/libbsp/unix/posix/timer/timer.c
@@ -16,8 +16,8 @@
* $Id$
*/
-#include <rtems.h>
+#include <bsp.h>
#include <time.h>
#include <sys/time.h>