RTEMS-5
Annotated Report
Fri Aug 10 12:56:31 2018

4000639c <pthread_getspecific>:
                                      
    ISR_Level level;
                                                 

                                                                     
    _ISR_Local_disable( level );
                                     
  #endif
                                                             

                                                                     
  executing = _Thread_Executing;
                                     
4000639c:	c6 01 a0 20 	ld  [ %g6 + 0x20 ], %g3
                       <== NOT EXECUTED
  __asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));

400063a0:	91 d0 20 09 	ta  9
                                         <== NOT EXECUTED
 */
                                                                  
RTEMS_INLINE_ROUTINE RBTree_Node * const *_RBTree_Root_const_reference(

  const RBTree_Control *the_rbtree
                                   
)
                                                                    
{
                                                                    
  return &RB_ROOT( the_rbtree );
                                     
400063a4:	86 00 e1 60 	add  %g3, 0x160, %g3
                          
  RBTree_Node         *parent;
                                       

                                                                     
  link = _RBTree_Root_const_reference( the_rbtree );
                 
  parent = NULL;
                                                     

                                                                     
  while ( *link != NULL ) {
                                          
400063a8:	c4 00 c0 00 	ld  [ %g3 ], %g2
                              
400063ac:	80 a0 a0 00 	cmp  %g2, 0
                                   
400063b0:	02 80 00 0d 	be  400063e4 <pthread_getspecific+0x48>
       <== ALWAYS TAKEN
400063b4:	86 00 bf f8 	add  %g2, -8, %g3
                             
  const POSIX_Keys_Key_value_pair *the_right;
                        

                                                                     
  the_left = left;
                                                   
  the_right = POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( right );
     

                                                                     
  return *the_left == the_right->key;
                                
400063b8:	c8 00 e0 18 	ld  [ %g3 + 0x18 ], %g4
                       <== NOT EXECUTED
    parent = *link;
                                                  

                                                                     
    if ( ( *equal )( key, parent ) ) {
                               
400063bc:	80 a2 00 04 	cmp  %o0, %g4
                                 <== NOT EXECUTED
400063c0:	22 80 00 0e 	be,a   400063f8 <pthread_getspecific+0x5c>
    <== NOT EXECUTED
400063c4:	d0 00 e0 20 	ld  [ %g3 + 0x20 ], %o0
                       <== NOT EXECUTED
      return ( *map )( parent );
                                     
    } else if ( ( *less )( key, parent ) ) {
                         
400063c8:	1a bf ff f8 	bcc  400063a8 <pthread_getspecific+0xc>
       <== NOT EXECUTED
400063cc:	86 00 a0 04 	add  %g2, 4, %g3
                              <== NOT EXECUTED
  return &RB_LEFT( the_node, Node );
                                 
400063d0:	86 10 00 02 	mov  %g2, %g3
                                 <== NOT EXECUTED
  while ( *link != NULL ) {
                                          
400063d4:	c4 00 c0 00 	ld  [ %g3 ], %g2
                              <== NOT EXECUTED
400063d8:	80 a0 a0 00 	cmp  %g2, 0
                                   <== NOT EXECUTED
400063dc:	12 bf ff f7 	bne  400063b8 <pthread_getspecific+0x1c>
      <== NOT EXECUTED
400063e0:	86 00 bf f8 	add  %g2, -8, %g3
                             <== NOT EXECUTED
  key_value_pair = _POSIX_Keys_Key_value_find( key, executing );
     

                                                                     
  if ( key_value_pair != NULL ) {
                                    
    value = key_value_pair->value;
                                   
  } else {
                                                           
    value = NULL;
                                                    
400063e4:	90 10 20 00 	clr  %o0
                                      <== NOT EXECUTED
  __asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));

400063e8:	91 d0 20 0a 	ta  0xa
                                       <== NOT EXECUTED
400063ec:	01 00 00 00 	nop 
                                          
  }
                                                                  

                                                                     
  _POSIX_Keys_Key_value_release( executing, &lock_context );
         

                                                                     
  return value;
                                                      
}
                                                                    
400063f0:	81 c3 e0 08 	retl 
                                         
400063f4:	01 00 00 00 	nop 
                                          
400063f8:	91 d0 20 0a 	ta  0xa
                                       <== NOT EXECUTED
400063fc:	01 00 00 00 	nop 
                                          <== NOT EXECUTED
40006400:	81 c3 e0 08 	retl 
                                         <== NOT EXECUTED
40006404:	01 00 00 00 	nop 
                                          <== NOT EXECUTED

                                                                     

4000632c <pthread_key_create>: */ int pthread_key_create( pthread_key_t *key, void (*destructor)( void * ) ) {
4000632c:	9d e3 bf a0 	save  %sp, -96, %sp
                           
 * the inactive chain of free keys control blocks.
                   
 */
                                                                  

                                                                     
RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Allocate( void )

{
                                                                    
  return (POSIX_Keys_Control *) _Objects_Allocate( &_POSIX_Keys_Information );

40006330:	3b 10 00 4f 	sethi  %hi(0x40013c00), %i5
                   
40006334:	40 00 0b ab 	call  400091e0 <_Objects_Allocate>
            
40006338:	90 17 61 64 	or  %i5, 0x164, %o0	! 40013d64 <_POSIX_Keys_Information>

  POSIX_Keys_Control  *the_key;
                                      

                                                                     
  the_key = _POSIX_Keys_Allocate();
                                  

                                                                     
  if ( !the_key ) {
                                                  
4000633c:	80 a2 20 00 	cmp  %o0, 0
                                   
40006340:	02 80 00 13 	be  4000638c <pthread_key_create+0x60>
        <== NEVER TAKEN
40006344:	86 02 20 14 	add  %o0, 0x14, %g3
                           
  #if defined(RTEMS_DEBUG)
                                           
    if ( index > information->maximum )
                              
      return;
                                                        
  #endif
                                                             

                                                                     
  information->local_table[ index ] = the_object;
                    
40006348:	c2 12 20 0a 	lduh  [ %o0 + 0xa ], %g1
                      
  tail->previous = head;
                                             
4000634c:	c6 22 20 1c 	st  %g3, [ %o0 + 0x1c ]
                       
  return &the_chain->Tail.Node;
                                      
40006350:	84 02 20 18 	add  %o0, 0x18, %g2
                           
    _Objects_Allocator_unlock();
                                     
    return EAGAIN;
                                                   
  }
                                                                  

                                                                     
  the_key->destructor = destructor;
                                  
40006354:	f2 22 20 10 	st  %i1, [ %o0 + 0x10 ]
                       
40006358:	ba 17 61 64 	or  %i5, 0x164, %i5
                           
  head->next = tail;
                                                 
4000635c:	c4 22 20 14 	st  %g2, [ %o0 + 0x14 ]
                       
40006360:	83 28 60 02 	sll  %g1, 2, %g1
                              
  head->previous = NULL;
                                             
40006364:	c0 22 20 18 	clr  [ %o0 + 0x18 ]
                           
  Objects_Control     *the_object,
                                   
  uint32_t             name
                                          
)
                                                                    
{
                                                                    
  /* ASSERT: information->is_string == false */
                      
  the_object->name.name_u32 = name;
                                  
40006368:	c0 22 20 0c 	clr  [ %o0 + 0xc ]
                            
  information->local_table[ index ] = the_object;
                    
4000636c:	c6 07 60 1c 	ld  [ %i5 + 0x1c ], %g3
                       
40006370:	c4 02 20 08 	ld  [ %o0 + 8 ], %g2
                          
40006374:	d0 20 c0 01 	st  %o0, [ %g3 + %g1 ]
                        
  _Chain_Initialize_empty( &the_key->Key_value_pairs );
              
  _Objects_Open_u32( &_POSIX_Keys_Information, &the_key->Object, 0 );

  *key = the_key->Object.id;
                                         
40006378:	c4 26 00 00 	st  %g2, [ %i0 ]
                              
 * previous thread life protection state and thus may not return if the

 * executing thread was restarted or deleted in the mean-time.
       
 */
                                                                  
RTEMS_INLINE_ROUTINE void _Objects_Allocator_unlock( void )
          
{
                                                                    
  _RTEMS_Unlock_allocator();
                                         
4000637c:	40 00 05 39 	call  40007860 <_RTEMS_Unlock_allocator>
      
40006380:	b0 10 20 00 	clr  %i0
                                      
  _Objects_Allocator_unlock();
                                       
  return 0;
                                                          
}
                                                                    
40006384:	81 c7 e0 08 	ret 
                                          
40006388:	81 e8 00 00 	restore 
                                      
4000638c:	40 00 05 35 	call  40007860 <_RTEMS_Unlock_allocator>
      <== NOT EXECUTED
40006390:	b0 10 20 0b 	mov  0xb, %i0
                                 <== NOT EXECUTED
    return EAGAIN;
                                                   
40006394:	81 c7 e0 08 	ret 
                                          <== NOT EXECUTED
40006398:	81 e8 00 00 	restore 
                                      <== NOT EXECUTED