summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/unix/posix/shmsupp
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
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 'c/src/lib/libbsp/unix/posix/shmsupp')
-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
5 files changed, 35 insertions, 179 deletions
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 );
}