diff options
Diffstat (limited to 'c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c')
-rw-r--r-- | c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c | 130 |
1 files changed, 17 insertions, 113 deletions
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; } |