summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1995-09-27 20:53:58 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1995-09-27 20:53:58 +0000
commit37f4c2d99fbf09142aeafe3a9908a81e283f8186 (patch)
tree04dc487b28113dc17f1c3c9ab2241390b4ed95ea /c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c
parentFixed typo (diff)
downloadrtems-37f4c2d99fbf09142aeafe3a9908a81e283f8186.tar.bz2
Modified UNIX simulator port so all references to native unix
stuff is in the executive source proper in the file cpu.c. This should help avoid conflicts between RTEMS POSIX files and UNIX files.
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c130
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;
}