Changeset 37f4c2d in rtems for c/src/lib/libbsp/unix/posix/shmsupp
- Timestamp:
- 09/27/95 20:53:58 (28 years ago)
- Branches:
- 4.10, 4.11, 4.8, 4.9, 5, master
- Children:
- 07058e7
- Parents:
- c701f197
- Location:
- c/src/lib/libbsp/unix/posix/shmsupp
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
c/src/lib/libbsp/unix/posix/shmsupp/addrconv.c
rc701f197 r37f4c2d 20 20 */ 21 21 22 #include <rtems.h>23 24 22 #include <bsp.h> 25 23 #include <shm.h> -
c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c
rc701f197 r37f4c2d 26 26 */ 27 27 28 #include <rtems.h> 29 28 #include <bsp.h> 30 29 #include <shm.h> 31 #include <bsp.h>32 33 #include <sys/types.h>34 #include <stdio.h>35 #include <errno.h>36 #include <unistd.h>37 #include <stdlib.h>38 #include <sys/ipc.h>39 #include <sys/shm.h>40 #include <sys/sem.h>41 30 42 31 shm_config_table BSP_shm_cfgtbl; … … 48 37 ); 49 38 50 void fix_semaphores( void )51 {52 rtems_unsigned32 maximum_nodes;53 int i;54 55 int shmid;56 char *shm_addr;57 key_t shm_key;58 key_t sem_key;59 int status;60 int shm_size;61 62 if (getenv("RTEMS_SHM_KEY"))63 shm_key = strtol(getenv("RTEMS_SHM_KEY"), 0, 0);64 else65 #ifdef RTEMS_SHM_KEY66 shm_key = RTEMS_SHM_KEY;67 #else68 shm_key = 0xa000;69 #endif70 71 if (getenv("RTEMS_SHM_SIZE"))72 shm_size = strtol(getenv("RTEMS_SHM_SIZE"), 0, 0);73 else74 #ifdef RTEMS_SHM_SIZE75 shm_size = RTEMS_SHM_SIZE;76 #else77 shm_size = 64 * KILOBYTE;78 #endif79 80 if (getenv("RTEMS_SHM_SEMAPHORE_KEY"))81 sem_key = strtol(getenv("RTEMS_SHM_SEMAPHORE_KEY"), 0, 0);82 else83 #ifdef RTEMS_SHM_SEMAPHORE_KEY84 sem_key = RTEMS_SHM_SEMAPHORE_KEY;85 #else86 sem_key = 0xa001;87 #endif88 89 shmid = shmget(shm_key, shm_size, IPC_CREAT | 0660);90 if ( shmid == -1 ) {91 fix_syscall_errno(); /* in case of newlib */92 perror( "shmget" );93 rtems_fatal_error_occurred(RTEMS_UNSATISFIED);94 }95 96 shm_addr = shmat(shmid, (char *)0, SHM_RND);97 if ( shm_addr == (void *)-1 ) {98 fix_syscall_errno(); /* in case of newlib */99 perror( "shmat" );100 rtems_fatal_error_occurred(RTEMS_UNSATISFIED);101 }102 103 maximum_nodes = Shm_RTEMS_MP_Configuration->maximum_nodes;104 semid = semget(sem_key, maximum_nodes + 1, IPC_CREAT | 0660);105 if ( semid == -1 ) {106 fix_syscall_errno(); /* in case of newlib */107 perror( "semget" );108 rtems_fatal_error_occurred(RTEMS_UNSATISFIED);109 }110 111 if ( Shm_Is_master_node() ) {112 for ( i=0 ; i <= maximum_nodes ; i++ ) {113 114 #if defined(solaris2)115 union semun {116 int val;117 struct semid_ds *buf;118 ushort *array;119 } help;120 121 help.val = 1;122 semctl( semid, i, SETVAL, help );123 #endif124 #if defined(hpux)125 semctl( semid, i, SETVAL, 1 );126 #endif127 128 fix_syscall_errno(); /* in case of newlib */129 if ( status == -1 ) {130 fprintf( stderr, "Sem init failed %d\n", errno ); fflush( stderr );131 rtems_fatal_error_occurred(RTEMS_UNSATISFIED);132 }133 }134 }135 136 BSP_shm_cfgtbl.base = (vol_u32 *)shm_addr;137 BSP_shm_cfgtbl.length = shm_size;138 }139 140 39 void Shm_Get_configuration( 141 40 rtems_unsigned32 localnode, … … 143 42 ) 144 43 { 145 fix_semaphores(); 44 _CPU_SHM_Init( 45 Shm_Maximum_nodes, 46 Shm_Is_master_node(), 47 (void **)&BSP_shm_cfgtbl.base, 48 (unsigned32 *)&BSP_shm_cfgtbl.length 49 ); 146 50 147 51 BSP_shm_cfgtbl.format = SHM_BIG; 148 52 149 53 BSP_shm_cfgtbl.cause_intr = Shm_Cause_interrupt_unix; 150 54 151 55 #ifdef NEUTRAL_BIG 152 56 BSP_shm_cfgtbl.convert = NULL_CONVERT; 153 57 #else 154 58 BSP_shm_cfgtbl.convert = CPU_swap_u32; 155 59 #endif 156 60 157 #ifdef INTERRUPT_EXTERNAL_MPCI 61 if ( _CPU_SHM_Get_vector() ) { 158 62 BSP_shm_cfgtbl.poll_intr = INTR_MODE; 159 BSP_shm_cfgtbl.Intr.address = (vol_u32 *) getpid();/* process id */160 BSP_shm_cfgtbl.Intr.value = INTERRUPT_EXTERNAL_MPCI;/* signal to send */63 BSP_shm_cfgtbl.Intr.address = (vol_u32 *) _CPU_Get_pid(); /* process id */ 64 BSP_shm_cfgtbl.Intr.value = _CPU_SHM_Get_vector(); /* signal to send */ 161 65 BSP_shm_cfgtbl.Intr.length = LONG; 162 #else 66 } else { 163 67 BSP_shm_cfgtbl.poll_intr = POLLED_MODE; 164 68 BSP_shm_cfgtbl.Intr.address = NO_INTERRUPT; 165 69 BSP_shm_cfgtbl.Intr.value = NO_INTERRUPT; 166 70 BSP_shm_cfgtbl.Intr.length = NO_INTERRUPT; 167 #endif 71 } 168 72 169 73 *shmcfg = &BSP_shm_cfgtbl; 170 74 } -
c/src/lib/libbsp/unix/posix/shmsupp/intr.c
rc701f197 r37f4c2d 20 20 */ 21 21 22 #include < rtems.h>22 #include <bsp.h> 23 23 #include <shm.h> 24 24 25 #include <stdio.h>26 #include <signal.h>27 28 25 void Shm_Cause_interrupt_unix( 29 26 rtems_unsigned32 node 30 27 ) 31 28 { 32 33 29 Shm_Interrupt_information *intr; 30 intr = &Shm_Interrupt_table[node]; 34 31 35 kill((pid_t) intr->address, intr->value);32 _CPU_SHM_Send_interrupt( (int) intr->address, (int) intr->value ); 36 33 } -
c/src/lib/libbsp/unix/posix/shmsupp/lock.c
rc701f197 r37f4c2d 18 18 */ 19 19 20 #include <rtems.h>21 22 20 #include <bsp.h> 23 21 #include <shm.h> 24 25 #include <errno.h>26 #include <stdio.h>27 #include <unistd.h>28 #include <sys/ipc.h>29 #include <sys/shm.h>30 #include <sys/sem.h>31 22 32 23 extern int semid; … … 56 47 ) 57 48 { 58 rtems_unsigned32 isr_level; 59 struct sembuf sb; 60 int status; 49 rtems_unsigned32 isr_level; 61 50 62 sb.sem_num = lq_cb->lock; 63 sb.sem_op = -1; 64 sb.sem_flg = 0; 51 rtems_interrupt_disable( isr_level ); 65 52 66 rtems_interrupt_disable( isr_level );53 Shm_isrstat = isr_level; 67 54 68 Shm_isrstat = isr_level; 69 70 while (1) { 71 status = semop(semid, &sb, 1); 72 if ( status >= 0 ) 73 break; 74 if ( status == -1 ) { 75 fix_syscall_errno(); /* in case of newlib */ 76 if (errno == EINTR) 77 continue; 78 perror("shm lock"); 79 rtems_fatal_error_occurred(RTEMS_UNSATISFIED); 80 } 81 } 55 _CPU_SHM_Lock( lq_cb->lock ); 82 56 } 83 57 … … 92 66 ) 93 67 { 94 rtems_unsigned32 isr_level; 95 struct sembuf sb; 96 int status; 68 rtems_unsigned32 isr_level; 97 69 98 sb.sem_num = lq_cb->lock; 99 sb.sem_op = 1; 100 sb.sem_flg = 0; 70 _CPU_SHM_Unlock( lq_cb->lock ); 101 71 102 while (1) { 103 status = semop(semid, &sb, 1); 104 if ( status >= 0 ) 105 break; 106 107 if ( status == -1 ) { 108 fix_syscall_errno(); /* in case of newlib */ 109 if (errno == EINTR) 110 continue; 111 perror("shm unlock"); 112 rtems_fatal_error_occurred(RTEMS_UNSATISFIED); 113 } 114 } 115 116 isr_level = Shm_isrstat; 117 rtems_interrupt_enable( isr_level ); 72 isr_level = Shm_isrstat; 73 rtems_interrupt_enable( isr_level ); 118 74 } -
c/src/lib/libbsp/unix/posix/shmsupp/mpisr.c
rc701f197 r37f4c2d 19 19 */ 20 20 21 #include <rtems.h>22 23 21 #include <bsp.h> 24 22 #include <shm.h> … … 26 24 void Shm_setvec( void ) 27 25 { 28 #ifdef INTERRUPT_EXTERNAL_MPCI 29 set_vector( Shm_isr, INTERRUPT_EXTERNAL_MPCI, 1 ); 30 #endif 26 int vector; 27 28 vector = _CPU_SHM_Get_vector(); 29 30 if ( vector ) 31 set_vector( Shm_isr, vector, 1 ); 31 32 }
Note: See TracChangeset
for help on using the changeset viewer.