rtems_status_code rtems_port_delete( rtems_id id ) { register Dual_ported_memory_Control *the_port; Objects_Locations location; the_port = _Dual_ported_memory_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: _Objects_Close( &_Dual_ported_memory_Information, &the_port->Object ); _Dual_ported_memory_Free( the_port ); _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; #if defined(RTEMS_MULTIPROCESSING) case OBJECTS_REMOTE: /* this error cannot be returned */ #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; }
rtems_status_code rtems_port_internal_to_external( rtems_id id, void *internal, void **external ) { register Dual_ported_memory_Control *the_port; Objects_Locations location; uint32_t ending; if ( !external ) return RTEMS_INVALID_ADDRESS; the_port = _Dual_ported_memory_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: ending = _Addresses_Subtract( internal, the_port->internal_base ); if ( ending > the_port->length ) *external = internal; else *external = _Addresses_Add_offset( the_port->external_base, ending ); _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; #if defined(RTEMS_MULTIPROCESSING) case OBJECTS_REMOTE: /* this error cannot be returned */ #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; }
rtems_status_code rtems_port_internal_to_external( rtems_id id, void *internal, void **external ) { Dual_ported_memory_Control *the_port; ISR_lock_Context lock_context; uint32_t ending; if ( external == NULL ) { return RTEMS_INVALID_ADDRESS; } the_port = _Dual_ported_memory_Get( id, &lock_context ); if ( the_port == NULL ) { return RTEMS_INVALID_ID; } ending = _Addresses_Subtract( internal, the_port->internal_base ); if ( ending > the_port->length ) { *external = internal; } else { *external = _Addresses_Add_offset( the_port->external_base, ending ); } _ISR_lock_ISR_enable( &lock_context ); return RTEMS_SUCCESSFUL; }