diff options
Diffstat (limited to 'c/src/lib/libbsp/unix')
-rw-r--r-- | c/src/lib/libbsp/unix/posix/clock/clock.c | 61 | ||||
-rw-r--r-- | c/src/lib/libbsp/unix/posix/console/console.c | 1 | ||||
-rw-r--r-- | c/src/lib/libbsp/unix/posix/include/bsp.h | 19 | ||||
-rw-r--r-- | c/src/lib/libbsp/unix/posix/shmsupp/addrconv.c | 2 | ||||
-rw-r--r-- | c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c | 130 | ||||
-rw-r--r-- | c/src/lib/libbsp/unix/posix/shmsupp/intr.c | 11 | ||||
-rw-r--r-- | c/src/lib/libbsp/unix/posix/shmsupp/lock.c | 60 | ||||
-rw-r--r-- | c/src/lib/libbsp/unix/posix/shmsupp/mpisr.c | 11 | ||||
-rw-r--r-- | c/src/lib/libbsp/unix/posix/startup/bspclean.c | 15 | ||||
-rw-r--r-- | c/src/lib/libbsp/unix/posix/startup/bspstart.c | 2 | ||||
-rw-r--r-- | c/src/lib/libbsp/unix/posix/startup/exit.c | 1 | ||||
-rw-r--r-- | c/src/lib/libbsp/unix/posix/startup/setvec.c | 1 | ||||
-rw-r--r-- | c/src/lib/libbsp/unix/posix/timer/timer.c | 2 |
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> |