RTEMS 4.11Annotated Report
Wed Jan 26 18:48:28 2011
0010f0b8 <IMFS_Set_handlers>:
#define MAXSYMLINK 5
int IMFS_Set_handlers(
rtems_filesystem_location_info_t *loc
)
{
10f0b8: 55 push %ebp
10f0b9: 89 e5 mov %esp,%ebp
10f0bb: 8b 45 08 mov 0x8(%ebp),%eax
IMFS_jnode_t *node = loc->node_access;
IMFS_fs_info_t *fs_info;
fs_info = loc->mt_entry->fs_info;
10f0be: 8b 50 10 mov 0x10(%eax),%edx
10f0c1: 8b 4a 34 mov 0x34(%edx),%ecx
switch( node->type ) {
10f0c4: 8b 10 mov (%eax),%edx
10f0c6: 83 7a 4c 07 cmpl $0x7,0x4c(%edx)
10f0ca: 77 12 ja 10f0de <IMFS_Set_handlers+0x26><== NEVER TAKEN
10f0cc: 8b 52 4c mov 0x4c(%edx),%edx
10f0cf: ff 24 95 90 18 12 00 jmp *0x121890(,%edx,4)
10f0d6: 66 90 xchg %ax,%ax
case IMFS_DIRECTORY:
loc->handlers = fs_info->directory_handlers;
10f0d8: 8b 51 0c mov 0xc(%ecx),%edx
10f0db: 89 50 08 mov %edx,0x8(%eax)
loc->handlers = fs_info->fifo_handlers;
break;
}
return 0;
}
10f0de: 31 c0 xor %eax,%eax
10f0e0: c9 leave
10f0e1: c3 ret
10f0e2: 66 90 xchg %ax,%ax
break;
case IMFS_LINEAR_FILE:
loc->handlers = fs_info->memfile_handlers;
break;
case IMFS_MEMORY_FILE:
loc->handlers = fs_info->memfile_handlers;
10f0e4: 8b 51 08 mov 0x8(%ecx),%edx
10f0e7: 89 50 08 mov %edx,0x8(%eax)
loc->handlers = fs_info->fifo_handlers;
break;
}
return 0;
}
10f0ea: 31 c0 xor %eax,%eax
10f0ec: c9 leave
10f0ed: c3 ret
10f0ee: 66 90 xchg %ax,%ax
case IMFS_DEVICE:
loc->handlers = &IMFS_device_handlers;
break;
case IMFS_SYM_LINK:
case IMFS_HARD_LINK:
loc->handlers = &IMFS_link_handlers;
10f0f0: c7 40 08 40 19 12 00 movl $0x121940,0x8(%eax)
loc->handlers = fs_info->fifo_handlers;
break;
}
return 0;
}
10f0f7: 31 c0 xor %eax,%eax
10f0f9: c9 leave
10f0fa: c3 ret
10f0fb: 90 nop
break;
case IMFS_MEMORY_FILE:
loc->handlers = fs_info->memfile_handlers;
break;
case IMFS_FIFO:
loc->handlers = fs_info->fifo_handlers;
10f0fc: 8b 51 10 mov 0x10(%ecx),%edx
10f0ff: 89 50 08 mov %edx,0x8(%eax)
break;
}
return 0;
}
10f102: 31 c0 xor %eax,%eax
10f104: c9 leave
10f105: c3 ret
10f106: 66 90 xchg %ax,%ax
switch( node->type ) {
case IMFS_DIRECTORY:
loc->handlers = fs_info->directory_handlers;
break;
case IMFS_DEVICE:
loc->handlers = &IMFS_device_handlers;
10f108: c7 40 08 c0 18 12 00 movl $0x1218c0,0x8(%eax)
loc->handlers = fs_info->fifo_handlers;
break;
}
return 0;
}
10f10f: 31 c0 xor %eax,%eax
10f111: c9 leave
10f112: c3 ret
0010fa30 <IMFS_check_node_remove>:
void IMFS_check_node_remove( IMFS_jnode_t *jnode )
{
10fa30: 55 push %ebp
10fa31: 89 e5 mov %esp,%ebp
10fa33: 53 push %ebx
10fa34: 83 ec 10 sub $0x10,%esp
10fa37: 8b 5d 08 mov 0x8(%ebp),%ebx
if ( !rtems_libio_is_file_open( jnode ) && jnode->st_nlink < 1 ) {
10fa3a: 53 push %ebx
10fa3b: e8 f8 04 00 00 call 10ff38 <rtems_libio_is_file_open>
10fa40: 83 c4 10 add $0x10,%esp
10fa43: 85 c0 test %eax,%eax
10fa45: 75 2d jne 10fa74 <IMFS_check_node_remove+0x44>
10fa47: 66 83 7b 34 00 cmpw $0x0,0x34(%ebx)
10fa4c: 75 26 jne 10fa74 <IMFS_check_node_remove+0x44>
if ( rtems_filesystem_current.node_access == jnode )
10fa4e: a1 30 5a 12 00 mov 0x125a30,%eax
10fa53: 39 58 04 cmp %ebx,0x4(%eax)
10fa56: 74 58 je 10fab0 <IMFS_check_node_remove+0x80>
rtems_filesystem_current.node_access = NULL;
switch ( jnode->type ) {
10fa58: 8b 43 4c mov 0x4c(%ebx),%eax
10fa5b: 83 f8 04 cmp $0x4,%eax
10fa5e: 74 34 je 10fa94 <IMFS_check_node_remove+0x64>
10fa60: 83 f8 05 cmp $0x5,%eax
10fa63: 74 17 je 10fa7c <IMFS_check_node_remove+0x4c>
break;
default:
break;
}
free( jnode );
10fa65: 89 5d 08 mov %ebx,0x8(%ebp)
}
}
10fa68: 8b 5d fc mov -0x4(%ebp),%ebx
10fa6b: c9 leave
break;
default:
break;
}
free( jnode );
10fa6c: e9 43 86 ff ff jmp 1080b4 <free>
10fa71: 8d 76 00 lea 0x0(%esi),%esi
}
}
10fa74: 8b 5d fc mov -0x4(%ebp),%ebx
10fa77: c9 leave
10fa78: c3 ret
10fa79: 8d 76 00 lea 0x0(%esi),%esi
if ( rtems_filesystem_current.node_access == jnode )
rtems_filesystem_current.node_access = NULL;
switch ( jnode->type ) {
case IMFS_MEMORY_FILE:
IMFS_memfile_remove( jnode );
10fa7c: 83 ec 0c sub $0xc,%esp
10fa7f: 53 push %ebx
10fa80: e8 9f 24 00 00 call 111f24 <IMFS_memfile_remove>
break;
10fa85: 83 c4 10 add $0x10,%esp
break;
default:
break;
}
free( jnode );
10fa88: 89 5d 08 mov %ebx,0x8(%ebp)
}
}
10fa8b: 8b 5d fc mov -0x4(%ebp),%ebx
10fa8e: c9 leave
break;
default:
break;
}
free( jnode );
10fa8f: e9 20 86 ff ff jmp 1080b4 <free>
switch ( jnode->type ) {
case IMFS_MEMORY_FILE:
IMFS_memfile_remove( jnode );
break;
case IMFS_SYM_LINK:
free( jnode->info.sym_link.name );
10fa94: 83 ec 0c sub $0xc,%esp
10fa97: ff 73 50 pushl 0x50(%ebx)
10fa9a: e8 15 86 ff ff call 1080b4 <free>
break;
10fa9f: 83 c4 10 add $0x10,%esp
default:
break;
}
free( jnode );
10faa2: 89 5d 08 mov %ebx,0x8(%ebp)
}
}
10faa5: 8b 5d fc mov -0x4(%ebp),%ebx
10faa8: c9 leave
break;
default:
break;
}
free( jnode );
10faa9: e9 06 86 ff ff jmp 1080b4 <free>
10faae: 66 90 xchg %ax,%ax
void IMFS_check_node_remove( IMFS_jnode_t *jnode )
{
if ( !rtems_libio_is_file_open( jnode ) && jnode->st_nlink < 1 ) {
if ( rtems_filesystem_current.node_access == jnode )
rtems_filesystem_current.node_access = NULL;
10fab0: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)
10fab7: eb 9f jmp 10fa58 <IMFS_check_node_remove+0x28>
0010ee78 <IMFS_chown>:
int IMFS_chown(
rtems_filesystem_location_info_t *pathloc, /* IN */
uid_t owner, /* IN */
gid_t group /* IN */
)
{
10ee78: 55 push %ebp
10ee79: 89 e5 mov %esp,%ebp
10ee7b: 57 push %edi
10ee7c: 56 push %esi
10ee7d: 53 push %ebx
10ee7e: 83 ec 1c sub $0x1c,%esp
10ee81: 8b 7d 0c mov 0xc(%ebp),%edi
10ee84: 8b 75 10 mov 0x10(%ebp),%esi
IMFS_jnode_t *jnode;
#if defined(RTEMS_POSIX_API)
uid_t st_uid;
#endif
jnode = (IMFS_jnode_t *) pathloc->node_access;
10ee87: 8b 45 08 mov 0x8(%ebp),%eax
10ee8a: 8b 18 mov (%eax),%ebx
/*
* Verify I am the owner of the node or the super user.
*/
#if defined(RTEMS_POSIX_API)
st_uid = geteuid();
10ee8c: e8 bb 0e 00 00 call 10fd4c <geteuid>
if ( ( st_uid != jnode->st_uid ) && ( st_uid != 0 ) )
10ee91: 66 39 43 3c cmp %ax,0x3c(%ebx)
10ee95: 74 05 je 10ee9c <IMFS_chown+0x24>
10ee97: 66 85 c0 test %ax,%ax
10ee9a: 75 2c jne 10eec8 <IMFS_chown+0x50> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EPERM );
#endif
jnode->st_uid = owner;
10ee9c: 66 89 7b 3c mov %di,0x3c(%ebx)
jnode->st_gid = group;
10eea0: 66 89 73 3e mov %si,0x3e(%ebx)
IMFS_update_ctime( jnode );
10eea4: 83 ec 08 sub $0x8,%esp
10eea7: 6a 00 push $0x0
10eea9: 8d 45 e0 lea -0x20(%ebp),%eax
10eeac: 50 push %eax
10eead: e8 7e 92 ff ff call 108130 <gettimeofday>
10eeb2: 8b 45 e0 mov -0x20(%ebp),%eax
10eeb5: 89 43 48 mov %eax,0x48(%ebx)
return 0;
10eeb8: 83 c4 10 add $0x10,%esp
10eebb: 31 c0 xor %eax,%eax
}
10eebd: 8d 65 f4 lea -0xc(%ebp),%esp
10eec0: 5b pop %ebx
10eec1: 5e pop %esi
10eec2: 5f pop %edi
10eec3: c9 leave
10eec4: c3 ret
10eec5: 8d 76 00 lea 0x0(%esi),%esi
#if defined(RTEMS_POSIX_API)
st_uid = geteuid();
if ( ( st_uid != jnode->st_uid ) && ( st_uid != 0 ) )
rtems_set_errno_and_return_minus_one( EPERM );
10eec8: e8 47 44 00 00 call 113314 <__errno>
10eecd: c7 00 01 00 00 00 movl $0x1,(%eax)
10eed3: b8 ff ff ff ff mov $0xffffffff,%eax
10eed8: eb e3 jmp 10eebd <IMFS_chown+0x45>
0010ef4c <IMFS_create_node>:
IMFS_jnode_types_t type,
const char *name,
mode_t mode,
const IMFS_types_union *info
)
{
10ef4c: 55 push %ebp
10ef4d: 89 e5 mov %esp,%ebp
10ef4f: 57 push %edi
10ef50: 56 push %esi
10ef51: 53 push %ebx
10ef52: 83 ec 1c sub $0x1c,%esp
10ef55: 8b 45 08 mov 0x8(%ebp),%eax
10ef58: 8b 5d 0c mov 0xc(%ebp),%ebx
IMFS_fs_info_t *fs_info;
/*
* MUST have a parent node to call this routine.
*/
if ( parent_loc == NULL )
10ef5b: 85 c0 test %eax,%eax
10ef5d: 0f 84 ba 00 00 00 je 10f01d <IMFS_create_node+0xd1> <== NEVER TAKEN
return NULL;
parent = parent_loc->node_access;
10ef63: 8b 38 mov (%eax),%edi
fs_info = parent_loc->mt_entry->fs_info;
10ef65: 8b 40 10 mov 0x10(%eax),%eax
10ef68: 8b 70 34 mov 0x34(%eax),%esi
/*
* Reject creation of FIFOs if support is disabled.
*/
if ( type == IMFS_FIFO &&
10ef6b: 83 fb 07 cmp $0x7,%ebx
10ef6e: 0f 84 9c 00 00 00 je 10f010 <IMFS_create_node+0xc4>
return NULL;
/*
* Allocate filesystem node and fill in basic information
*/
node = IMFS_allocate_node( type, name, mode & ~rtems_filesystem_umask );
10ef74: 50 push %eax
10ef75: a1 30 5a 12 00 mov 0x125a30,%eax
10ef7a: 8b 40 2c mov 0x2c(%eax),%eax
10ef7d: f7 d0 not %eax
10ef7f: 23 45 14 and 0x14(%ebp),%eax
10ef82: 50 push %eax
10ef83: ff 75 10 pushl 0x10(%ebp)
10ef86: 53 push %ebx
10ef87: e8 50 ff ff ff call 10eedc <IMFS_allocate_node>
if ( !node )
10ef8c: 83 c4 10 add $0x10,%esp
10ef8f: 85 c0 test %eax,%eax
10ef91: 74 73 je 10f006 <IMFS_create_node+0xba>
return NULL;
/*
* Set the type specific information
*/
if ( type == IMFS_DIRECTORY ) {
10ef93: 83 fb 01 cmp $0x1,%ebx
10ef96: 74 38 je 10efd0 <IMFS_create_node+0x84>
rtems_chain_initialize_empty(&node->info.directory.Entries);
} else if ( type == IMFS_HARD_LINK ) {
10ef98: 83 fb 03 cmp $0x3,%ebx
10ef9b: 0f 84 97 00 00 00 je 10f038 <IMFS_create_node+0xec>
node->info.hard_link.link_node = info->hard_link.link_node;
} else if ( type == IMFS_SYM_LINK ) {
10efa1: 83 fb 04 cmp $0x4,%ebx
10efa4: 0f 84 8e 00 00 00 je 10f038 <IMFS_create_node+0xec>
node->info.sym_link.name = info->sym_link.name;
} else if ( type == IMFS_DEVICE ) {
10efaa: 83 fb 02 cmp $0x2,%ebx
10efad: 74 79 je 10f028 <IMFS_create_node+0xdc>
node->info.device.major = info->device.major;
node->info.device.minor = info->device.minor;
} else if ( type == IMFS_LINEAR_FILE ) {
10efaf: 83 fb 06 cmp $0x6,%ebx
10efb2: 0f 84 8c 00 00 00 je 10f044 <IMFS_create_node+0xf8>
node->info.linearfile.size = 0;
node->info.linearfile.direct = 0;
} else if ( type == IMFS_MEMORY_FILE ) {
10efb8: 83 fb 05 cmp $0x5,%ebx
10efbb: 0f 84 9b 00 00 00 je 10f05c <IMFS_create_node+0x110>
node->info.file.size = 0;
node->info.file.indirect = 0;
node->info.file.doubly_indirect = 0;
node->info.file.triply_indirect = 0;
} else if ( type == IMFS_FIFO ) {
10efc1: 83 fb 07 cmp $0x7,%ebx
10efc4: 75 1d jne 10efe3 <IMFS_create_node+0x97> <== NEVER TAKEN
node->info.fifo.pipe = NULL;
10efc6: c7 40 50 00 00 00 00 movl $0x0,0x50(%eax)
10efcd: eb 14 jmp 10efe3 <IMFS_create_node+0x97>
10efcf: 90 nop
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
10efd0: 8d 50 54 lea 0x54(%eax),%edx
10efd3: 89 50 50 mov %edx,0x50(%eax)
head->next = tail;
head->previous = NULL;
10efd6: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
10efdd: 8d 50 50 lea 0x50(%eax),%edx
10efe0: 89 50 58 mov %edx,0x58(%eax)
}
/*
* This node MUST have a parent, so put it in that directory list.
*/
node->Parent = parent;
10efe3: 89 78 08 mov %edi,0x8(%eax)
node->st_ino = ++fs_info->ino_count;
10efe6: 8b 56 04 mov 0x4(%esi),%edx
10efe9: 42 inc %edx
10efea: 89 56 04 mov %edx,0x4(%esi)
10efed: 89 50 38 mov %edx,0x38(%eax)
10eff0: 83 ec 08 sub $0x8,%esp
10eff3: 50 push %eax
rtems_chain_append( &parent->info.directory.Entries, &node->Node );
10eff4: 83 c7 50 add $0x50,%edi
10eff7: 57 push %edi
10eff8: 89 45 e4 mov %eax,-0x1c(%ebp)
10effb: e8 dc cf ff ff call 10bfdc <_Chain_Append>
return node;
10f000: 83 c4 10 add $0x10,%esp
10f003: 8b 45 e4 mov -0x1c(%ebp),%eax
}
10f006: 8d 65 f4 lea -0xc(%ebp),%esp
10f009: 5b pop %ebx
10f00a: 5e pop %esi
10f00b: 5f pop %edi
10f00c: c9 leave
10f00d: c3 ret
10f00e: 66 90 xchg %ax,%ax
fs_info = parent_loc->mt_entry->fs_info;
/*
* Reject creation of FIFOs if support is disabled.
*/
if ( type == IMFS_FIFO &&
10f010: 81 7e 10 20 18 12 00 cmpl $0x121820,0x10(%esi)
10f017: 0f 85 57 ff ff ff jne 10ef74 <IMFS_create_node+0x28>
fs_info->fifo_handlers == &rtems_filesystem_handlers_default )
return NULL;
10f01d: 31 c0 xor %eax,%eax
node->st_ino = ++fs_info->ino_count;
rtems_chain_append( &parent->info.directory.Entries, &node->Node );
return node;
}
10f01f: 8d 65 f4 lea -0xc(%ebp),%esp
10f022: 5b pop %ebx
10f023: 5e pop %esi
10f024: 5f pop %edi
10f025: c9 leave
10f026: c3 ret
10f027: 90 nop
} else if ( type == IMFS_HARD_LINK ) {
node->info.hard_link.link_node = info->hard_link.link_node;
} else if ( type == IMFS_SYM_LINK ) {
node->info.sym_link.name = info->sym_link.name;
} else if ( type == IMFS_DEVICE ) {
node->info.device.major = info->device.major;
10f028: 8b 4d 18 mov 0x18(%ebp),%ecx
10f02b: 8b 11 mov (%ecx),%edx
10f02d: 89 50 50 mov %edx,0x50(%eax)
node->info.device.minor = info->device.minor;
10f030: 8b 51 04 mov 0x4(%ecx),%edx
10f033: 89 50 54 mov %edx,0x54(%eax)
10f036: eb ab jmp 10efe3 <IMFS_create_node+0x97>
if ( type == IMFS_DIRECTORY ) {
rtems_chain_initialize_empty(&node->info.directory.Entries);
} else if ( type == IMFS_HARD_LINK ) {
node->info.hard_link.link_node = info->hard_link.link_node;
} else if ( type == IMFS_SYM_LINK ) {
node->info.sym_link.name = info->sym_link.name;
10f038: 8b 4d 18 mov 0x18(%ebp),%ecx
10f03b: 8b 11 mov (%ecx),%edx
10f03d: 89 50 50 mov %edx,0x50(%eax)
10f040: eb a1 jmp 10efe3 <IMFS_create_node+0x97>
10f042: 66 90 xchg %ax,%ax
} else if ( type == IMFS_DEVICE ) {
node->info.device.major = info->device.major;
node->info.device.minor = info->device.minor;
} else if ( type == IMFS_LINEAR_FILE ) {
node->info.linearfile.size = 0;
10f044: c7 40 50 00 00 00 00 movl $0x0,0x50(%eax)
10f04b: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
node->info.linearfile.direct = 0;
10f052: c7 40 58 00 00 00 00 movl $0x0,0x58(%eax)
10f059: eb 88 jmp 10efe3 <IMFS_create_node+0x97>
10f05b: 90 nop
} else if ( type == IMFS_MEMORY_FILE ) {
node->info.file.size = 0;
10f05c: c7 40 50 00 00 00 00 movl $0x0,0x50(%eax)
10f063: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
node->info.file.indirect = 0;
10f06a: c7 40 58 00 00 00 00 movl $0x0,0x58(%eax)
node->info.file.doubly_indirect = 0;
10f071: c7 40 5c 00 00 00 00 movl $0x0,0x5c(%eax)
node->info.file.triply_indirect = 0;
10f078: c7 40 60 00 00 00 00 movl $0x0,0x60(%eax)
10f07f: e9 5f ff ff ff jmp 10efe3 <IMFS_create_node+0x97>
0010a4e8 <IMFS_dump_directory>:
*/
void IMFS_dump_directory(
IMFS_jnode_t *the_directory,
int level
)
{
10a4e8: 55 push %ebp
10a4e9: 89 e5 mov %esp,%ebp
10a4eb: 57 push %edi
10a4ec: 56 push %esi
10a4ed: 53 push %ebx
10a4ee: 83 ec 1c sub $0x1c,%esp
10a4f1: 8b 45 08 mov 0x8(%ebp),%eax
10a4f4: 8b 75 0c mov 0xc(%ebp),%esi
*
*/
int IMFS_memfile_maximum_size( void )
{
return IMFS_MEMFILE_MAXIMUM_SIZE;
}
10a4f7: 8b 78 50 mov 0x50(%eax),%edi
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
10a4fa: 83 c0 54 add $0x54,%eax
10a4fd: 89 45 e4 mov %eax,-0x1c(%ebp)
IMFS_assert( level >= 0 );
IMFS_assert( the_directory->type == IMFS_DIRECTORY );
the_chain = &the_directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
10a500: 39 c7 cmp %eax,%edi
10a502: 74 47 je 10a54b <IMFS_dump_directory+0x63>
for ( i=0 ; i<=level ; i++ )
fprintf(stdout, "...." );
IMFS_print_jnode( the_jnode );
if ( the_jnode->type == IMFS_DIRECTORY )
IMFS_dump_directory( the_jnode, level + 1 );
10a504: 8d 46 01 lea 0x1(%esi),%eax
10a507: 89 45 e0 mov %eax,-0x20(%ebp)
10a50a: 66 90 xchg %ax,%ax
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
the_jnode = (IMFS_jnode_t *) the_node;
for ( i=0 ; i<=level ; i++ )
10a50c: 85 f6 test %esi,%esi
10a50e: 78 22 js 10a532 <IMFS_dump_directory+0x4a><== NEVER TAKEN
10a510: 31 db xor %ebx,%ebx
10a512: 66 90 xchg %ax,%ax
fprintf(stdout, "...." );
10a514: a1 c0 c4 12 00 mov 0x12c4c0,%eax
10a519: ff 70 08 pushl 0x8(%eax)
10a51c: 6a 04 push $0x4
10a51e: 6a 01 push $0x1
10a520: 68 52 72 12 00 push $0x127252
10a525: e8 3a e1 00 00 call 118664 <fwrite>
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
the_jnode = (IMFS_jnode_t *) the_node;
for ( i=0 ; i<=level ; i++ )
10a52a: 43 inc %ebx
10a52b: 83 c4 10 add $0x10,%esp
10a52e: 39 de cmp %ebx,%esi
10a530: 7d e2 jge 10a514 <IMFS_dump_directory+0x2c>
fprintf(stdout, "...." );
IMFS_print_jnode( the_jnode );
10a532: 83 ec 0c sub $0xc,%esp
10a535: 57 push %edi
10a536: e8 75 fe ff ff call 10a3b0 <IMFS_print_jnode>
if ( the_jnode->type == IMFS_DIRECTORY )
10a53b: 83 c4 10 add $0x10,%esp
10a53e: 83 7f 4c 01 cmpl $0x1,0x4c(%edi)
10a542: 74 10 je 10a554 <IMFS_dump_directory+0x6c>
the_chain = &the_directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
10a544: 8b 3f mov (%edi),%edi
IMFS_assert( level >= 0 );
IMFS_assert( the_directory->type == IMFS_DIRECTORY );
the_chain = &the_directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
10a546: 3b 7d e4 cmp -0x1c(%ebp),%edi
10a549: 75 c1 jne 10a50c <IMFS_dump_directory+0x24>
fprintf(stdout, "...." );
IMFS_print_jnode( the_jnode );
if ( the_jnode->type == IMFS_DIRECTORY )
IMFS_dump_directory( the_jnode, level + 1 );
}
}
10a54b: 8d 65 f4 lea -0xc(%ebp),%esp
10a54e: 5b pop %ebx
10a54f: 5e pop %esi
10a550: 5f pop %edi
10a551: c9 leave
10a552: c3 ret
10a553: 90 nop
for ( i=0 ; i<=level ; i++ )
fprintf(stdout, "...." );
IMFS_print_jnode( the_jnode );
if ( the_jnode->type == IMFS_DIRECTORY )
IMFS_dump_directory( the_jnode, level + 1 );
10a554: 83 ec 08 sub $0x8,%esp
10a557: ff 75 e0 pushl -0x20(%ebp)
10a55a: 57 push %edi
10a55b: e8 88 ff ff ff call 10a4e8 <IMFS_dump_directory>
10a560: 83 c4 10 add $0x10,%esp
10a563: eb df jmp 10a544 <IMFS_dump_directory+0x5c>
0010f1c4 <IMFS_eval_path>:
const char *pathname, /* IN */
size_t pathnamelen, /* IN */
int flags, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN/OUT */
)
{
10f1c4: 55 push %ebp
10f1c5: 89 e5 mov %esp,%ebp
10f1c7: 57 push %edi
10f1c8: 56 push %esi
10f1c9: 53 push %ebx
10f1ca: 83 ec 5c sub $0x5c,%esp
char token[ IMFS_NAME_MAX + 1 ];
rtems_filesystem_location_info_t newloc;
IMFS_jnode_t *node;
int result;
if ( !rtems_libio_is_valid_perms( flags ) ) {
10f1cd: f7 45 10 f8 ff ff ff testl $0xfffffff8,0x10(%ebp)
10f1d4: 0f 85 ee 01 00 00 jne 10f3c8 <IMFS_eval_path+0x204> <== NEVER TAKEN
/*
* This was filled in by the caller and is valid in the
* mount table.
*/
node = pathloc->node_access;
10f1da: 8b 45 14 mov 0x14(%ebp),%eax
10f1dd: 8b 38 mov (%eax),%edi
size_t pathnamelen, /* IN */
int flags, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN/OUT */
)
{
int i = 0;
10f1df: c7 45 a4 00 00 00 00 movl $0x0,-0x5c(%ebp)
10f1e6: 8d 75 af lea -0x51(%ebp),%esi
* Evaluate all tokens until we are done or an error occurs.
*/
while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {
type = IMFS_get_token( &pathname[i], pathnamelen, token, &len );
10f1e9: 8d 55 e4 lea -0x1c(%ebp),%edx
10f1ec: 52 push %edx
10f1ed: 56 push %esi
10f1ee: ff 75 0c pushl 0xc(%ebp)
10f1f1: 8b 45 08 mov 0x8(%ebp),%eax
10f1f4: 03 45 a4 add -0x5c(%ebp),%eax
10f1f7: 50 push %eax
10f1f8: e8 17 07 00 00 call 10f914 <IMFS_get_token>
10f1fd: 89 c3 mov %eax,%ebx
pathnamelen -= len;
10f1ff: 8b 55 e4 mov -0x1c(%ebp),%edx
i += len;
if ( !pathloc->node_access )
10f202: 8b 4d 14 mov 0x14(%ebp),%ecx
10f205: 8b 01 mov (%ecx),%eax
10f207: 83 c4 10 add $0x10,%esp
10f20a: 85 c0 test %eax,%eax
10f20c: 0f 84 e6 00 00 00 je 10f2f8 <IMFS_eval_path+0x134> <== NEVER TAKEN
*/
while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {
type = IMFS_get_token( &pathname[i], pathnamelen, token, &len );
pathnamelen -= len;
10f212: 29 55 0c sub %edx,0xc(%ebp)
i += len;
10f215: 01 55 a4 add %edx,-0x5c(%ebp)
rtems_set_errno_and_return_minus_one( ENOENT );
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
10f218: 85 db test %ebx,%ebx
10f21a: 75 44 jne 10f260 <IMFS_eval_path+0x9c>
* new fs root node and let let the mounted filesystem set the handlers.
*
* NOTE: The behavior of stat() on a mount point appears to be questionable.
*/
if ( node->type == IMFS_DIRECTORY ) {
10f21c: 83 78 4c 01 cmpl $0x1,0x4c(%eax)
10f220: 0f 84 26 01 00 00 je 10f34c <IMFS_eval_path+0x188>
flags, pathloc );
} else {
result = IMFS_Set_handlers( pathloc );
}
} else {
result = IMFS_Set_handlers( pathloc );
10f226: 83 ec 0c sub $0xc,%esp
10f229: ff 75 14 pushl 0x14(%ebp)
10f22c: e8 87 fe ff ff call 10f0b8 <IMFS_Set_handlers>
10f231: 89 c3 mov %eax,%ebx
10f233: 5a pop %edx
10f234: 59 pop %ecx
/*
* Verify we have the correct permissions for this node.
*/
if ( !IMFS_evaluate_permission( pathloc, flags ) )
10f235: ff 75 10 pushl 0x10(%ebp)
10f238: ff 75 14 pushl 0x14(%ebp)
10f23b: e8 d4 fe ff ff call 10f114 <IMFS_evaluate_permission>
10f240: 83 c4 10 add $0x10,%esp
10f243: 85 c0 test %eax,%eax
10f245: 0f 85 d1 00 00 00 jne 10f31c <IMFS_eval_path+0x158>
rtems_set_errno_and_return_minus_one( EACCES );
10f24b: e8 c4 40 00 00 call 113314 <__errno>
10f250: c7 00 0d 00 00 00 movl $0xd,(%eax)
10f256: bb ff ff ff ff mov $0xffffffff,%ebx
10f25b: e9 bc 00 00 00 jmp 10f31c <IMFS_eval_path+0x158>
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
10f260: 83 7f 4c 01 cmpl $0x1,0x4c(%edi)
10f264: 0f 84 be 00 00 00 je 10f328 <IMFS_eval_path+0x164>
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
rtems_set_errno_and_return_minus_one( EACCES );
node = pathloc->node_access;
10f26a: 89 c7 mov %eax,%edi
switch( type ) {
10f26c: 83 fb 03 cmp $0x3,%ebx
10f26f: 74 1b je 10f28c <IMFS_eval_path+0xc8>
10f271: 83 fb 04 cmp $0x4,%ebx
10f274: 0f 84 92 00 00 00 je 10f30c <IMFS_eval_path+0x148>
10f27a: 83 fb 02 cmp $0x2,%ebx
10f27d: 74 51 je 10f2d0 <IMFS_eval_path+0x10c>
/*
* Evaluate all tokens until we are done or an error occurs.
*/
while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {
10f27f: 83 fb 04 cmp $0x4,%ebx
10f282: 0f 85 61 ff ff ff jne 10f1e9 <IMFS_eval_path+0x25> <== ALWAYS TAKEN
10f288: eb 92 jmp 10f21c <IMFS_eval_path+0x58> <== NOT EXECUTED
10f28a: 66 90 xchg %ax,%ax <== NOT EXECUTED
case IMFS_NAME:
/*
* If we are at a link follow it.
*/
if ( node->type == IMFS_HARD_LINK ) {
10f28c: 8b 40 4c mov 0x4c(%eax),%eax
10f28f: 83 f8 03 cmp $0x3,%eax
10f292: 0f 84 08 01 00 00 je 10f3a0 <IMFS_eval_path+0x1dc>
* It would be a design error if we evaluated the link and
* was broken.
*/
IMFS_assert( node );
} else if ( node->type == IMFS_SYM_LINK ) {
10f298: 83 f8 04 cmp $0x4,%eax
10f29b: 0f 84 51 01 00 00 je 10f3f2 <IMFS_eval_path+0x22e>
}
/*
* Only a directory can be decended into.
*/
if ( node->type != IMFS_DIRECTORY )
10f2a1: 48 dec %eax
10f2a2: 0f 85 35 01 00 00 jne 10f3dd <IMFS_eval_path+0x219>
/*
* If we are at a node that is a mount point. Set loc to the
* new fs root node and let them finish evaluating the path.
*/
if ( node->info.directory.mt_fs != NULL ) {
10f2a8: 8b 47 5c mov 0x5c(%edi),%eax
10f2ab: 85 c0 test %eax,%eax
10f2ad: 0f 85 a4 00 00 00 jne 10f357 <IMFS_eval_path+0x193>
}
/*
* Otherwise find the token name in the present location.
*/
node = IMFS_find_match_in_dir( node, token );
10f2b3: 83 ec 08 sub $0x8,%esp
10f2b6: 56 push %esi
10f2b7: 57 push %edi
10f2b8: e8 eb 05 00 00 call 10f8a8 <IMFS_find_match_in_dir>
10f2bd: 89 c7 mov %eax,%edi
if ( !node )
10f2bf: 83 c4 10 add $0x10,%esp
10f2c2: 85 c0 test %eax,%eax
10f2c4: 74 32 je 10f2f8 <IMFS_eval_path+0x134>
/*
* Set the node access to the point we have found.
*/
pathloc->node_access = node;
10f2c6: 8b 45 14 mov 0x14(%ebp),%eax
10f2c9: 89 38 mov %edi,(%eax)
10f2cb: e9 19 ff ff ff jmp 10f1e9 <IMFS_eval_path+0x25>
case IMFS_UP_DIR:
/*
* Am I at the root of all filesystems? (chroot'ed?)
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access )
10f2d0: 8b 15 30 5a 12 00 mov 0x125a30,%edx
10f2d6: 39 42 18 cmp %eax,0x18(%edx)
10f2d9: 0f 84 0a ff ff ff je 10f1e9 <IMFS_eval_path+0x25>
/*
* Am I at the root of this mounted filesystem?
*/
if (pathloc->node_access ==
pathloc->mt_entry->mt_fs_root.node_access) {
10f2df: 8b 4d 14 mov 0x14(%ebp),%ecx
10f2e2: 8b 51 10 mov 0x10(%ecx),%edx
/*
* Am I at the root of this mounted filesystem?
*/
if (pathloc->node_access ==
10f2e5: 39 42 1c cmp %eax,0x1c(%edx)
10f2e8: 0f 84 d2 00 00 00 je 10f3c0 <IMFS_eval_path+0x1fc>
pathnamelen+len,
flags,pathloc);
}
} else {
if ( !node->Parent )
10f2ee: 8b 78 08 mov 0x8(%eax),%edi
10f2f1: 85 ff test %edi,%edi
10f2f3: 75 d1 jne 10f2c6 <IMFS_eval_path+0x102>
10f2f5: 8d 76 00 lea 0x0(%esi),%esi
/*
* Otherwise find the token name in the present location.
*/
node = IMFS_find_match_in_dir( node, token );
if ( !node )
rtems_set_errno_and_return_minus_one( ENOENT );
10f2f8: e8 17 40 00 00 call 113314 <__errno>
10f2fd: c7 00 02 00 00 00 movl $0x2,(%eax)
10f303: bb ff ff ff ff mov $0xffffffff,%ebx
10f308: eb 12 jmp 10f31c <IMFS_eval_path+0x158>
10f30a: 66 90 xchg %ax,%ax
case IMFS_NO_MORE_PATH:
case IMFS_CURRENT_DIR:
break;
case IMFS_INVALID_TOKEN:
rtems_set_errno_and_return_minus_one( ENAMETOOLONG );
10f30c: e8 03 40 00 00 call 113314 <__errno>
10f311: c7 00 5b 00 00 00 movl $0x5b,(%eax)
10f317: bb ff ff ff ff mov $0xffffffff,%ebx
if ( !IMFS_evaluate_permission( pathloc, flags ) )
rtems_set_errno_and_return_minus_one( EACCES );
return result;
}
10f31c: 89 d8 mov %ebx,%eax
10f31e: 8d 65 f4 lea -0xc(%ebp),%esp
10f321: 5b pop %ebx
10f322: 5e pop %esi
10f323: 5f pop %edi
10f324: c9 leave
10f325: c3 ret
10f326: 66 90 xchg %ax,%ax
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
10f328: 83 ec 08 sub $0x8,%esp
10f32b: 6a 01 push $0x1
10f32d: ff 75 14 pushl 0x14(%ebp)
10f330: e8 df fd ff ff call 10f114 <IMFS_evaluate_permission>
10f335: 83 c4 10 add $0x10,%esp
10f338: 85 c0 test %eax,%eax
10f33a: 0f 84 0b ff ff ff je 10f24b <IMFS_eval_path+0x87>
10f340: 8b 55 14 mov 0x14(%ebp),%edx
10f343: 8b 02 mov (%edx),%eax
10f345: e9 20 ff ff ff jmp 10f26a <IMFS_eval_path+0xa6>
10f34a: 66 90 xchg %ax,%ax
*
* NOTE: The behavior of stat() on a mount point appears to be questionable.
*/
if ( node->type == IMFS_DIRECTORY ) {
if ( node->info.directory.mt_fs != NULL ) {
10f34c: 8b 40 5c mov 0x5c(%eax),%eax
10f34f: 85 c0 test %eax,%eax
10f351: 0f 84 cf fe ff ff je 10f226 <IMFS_eval_path+0x62>
newloc = node->info.directory.mt_fs->mt_fs_root;
10f357: 8d 7d d0 lea -0x30(%ebp),%edi
10f35a: 8d 70 1c lea 0x1c(%eax),%esi
10f35d: b9 05 00 00 00 mov $0x5,%ecx
10f362: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
*pathloc = newloc;
10f364: 8d 75 d0 lea -0x30(%ebp),%esi
10f367: b1 05 mov $0x5,%cl
10f369: 8b 7d 14 mov 0x14(%ebp),%edi
10f36c: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return (*pathloc->ops->evalpath_h)( &pathname[i-len],
10f36e: 8b 55 e4 mov -0x1c(%ebp),%edx
10f371: 8b 4d 14 mov 0x14(%ebp),%ecx
10f374: 8b 41 0c mov 0xc(%ecx),%eax
10f377: 51 push %ecx
10f378: ff 75 10 pushl 0x10(%ebp)
10f37b: 8b 4d 0c mov 0xc(%ebp),%ecx
10f37e: 01 d1 add %edx,%ecx
10f380: 51 push %ecx
10f381: 8b 4d a4 mov -0x5c(%ebp),%ecx
10f384: 29 d1 sub %edx,%ecx
10f386: 8b 55 08 mov 0x8(%ebp),%edx
10f389: 01 ca add %ecx,%edx
10f38b: 52 push %edx
10f38c: ff 10 call *(%eax)
10f38e: 89 c3 mov %eax,%ebx
10f390: 83 c4 10 add $0x10,%esp
if ( !IMFS_evaluate_permission( pathloc, flags ) )
rtems_set_errno_and_return_minus_one( EACCES );
return result;
}
10f393: 89 d8 mov %ebx,%eax
10f395: 8d 65 f4 lea -0xc(%ebp),%esp
10f398: 5b pop %ebx
10f399: 5e pop %esi
10f39a: 5f pop %edi
10f39b: c9 leave
10f39c: c3 ret
10f39d: 8d 76 00 lea 0x0(%esi),%esi
case IMFS_NAME:
/*
* If we are at a link follow it.
*/
if ( node->type == IMFS_HARD_LINK ) {
IMFS_evaluate_hard_link( pathloc, 0 );
10f3a0: 83 ec 08 sub $0x8,%esp
10f3a3: 6a 00 push $0x0
10f3a5: ff 75 14 pushl 0x14(%ebp)
10f3a8: e8 d3 fd ff ff call 10f180 <IMFS_evaluate_hard_link>
node = pathloc->node_access;
10f3ad: 8b 55 14 mov 0x14(%ebp),%edx
10f3b0: 8b 3a mov (%edx),%edi
10f3b2: 8b 47 4c mov 0x4c(%edi),%eax
10f3b5: 83 c4 10 add $0x10,%esp
10f3b8: e9 e4 fe ff ff jmp 10f2a1 <IMFS_eval_path+0xdd>
10f3bd: 8d 76 00 lea 0x0(%esi),%esi
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access ) {
break; /* Throw out the .. in this case */
} else {
newloc = pathloc->mt_entry->mt_point_node;
10f3c0: 8d 7d d0 lea -0x30(%ebp),%edi
10f3c3: 8d 72 08 lea 0x8(%edx),%esi
10f3c6: eb 95 jmp 10f35d <IMFS_eval_path+0x199>
rtems_filesystem_location_info_t newloc;
IMFS_jnode_t *node;
int result;
if ( !rtems_libio_is_valid_perms( flags ) ) {
rtems_set_errno_and_return_minus_one( EIO );
10f3c8: e8 47 3f 00 00 call 113314 <__errno> <== NOT EXECUTED
10f3cd: c7 00 05 00 00 00 movl $0x5,(%eax) <== NOT EXECUTED
10f3d3: bb ff ff ff ff mov $0xffffffff,%ebx <== NOT EXECUTED
10f3d8: e9 3f ff ff ff jmp 10f31c <IMFS_eval_path+0x158> <== NOT EXECUTED
/*
* Only a directory can be decended into.
*/
if ( node->type != IMFS_DIRECTORY )
rtems_set_errno_and_return_minus_one( ENOTDIR );
10f3dd: e8 32 3f 00 00 call 113314 <__errno>
10f3e2: c7 00 14 00 00 00 movl $0x14,(%eax)
10f3e8: bb ff ff ff ff mov $0xffffffff,%ebx
10f3ed: e9 2a ff ff ff jmp 10f31c <IMFS_eval_path+0x158>
* was broken.
*/
IMFS_assert( node );
} else if ( node->type == IMFS_SYM_LINK ) {
result = IMFS_evaluate_sym_link( pathloc, 0 );
10f3f2: 83 ec 08 sub $0x8,%esp
10f3f5: 6a 00 push $0x0
10f3f7: ff 75 14 pushl 0x14(%ebp)
10f3fa: e8 1d 00 00 00 call 10f41c <IMFS_evaluate_sym_link>
10f3ff: 89 c3 mov %eax,%ebx
/*
* In contrast to a hard link, it is possible to have a broken
* symbolic link.
*/
node = pathloc->node_access;
10f401: 8b 4d 14 mov 0x14(%ebp),%ecx
10f404: 8b 39 mov (%ecx),%edi
if ( result == -1 )
10f406: 83 c4 10 add $0x10,%esp
10f409: 83 f8 ff cmp $0xffffffff,%eax
10f40c: 0f 84 0a ff ff ff je 10f31c <IMFS_eval_path+0x158> <== NEVER TAKEN
/*
* In contrast to a hard link, it is possible to have a broken
* symbolic link.
*/
node = pathloc->node_access;
10f412: 8b 47 4c mov 0x4c(%edi),%eax
10f415: e9 87 fe ff ff jmp 10f2a1 <IMFS_eval_path+0xdd>
0010f544 <IMFS_evaluate_for_make>:
int IMFS_evaluate_for_make(
const char *path, /* IN */
rtems_filesystem_location_info_t *pathloc, /* IN/OUT */
const char **name /* OUT */
)
{
10f544: 55 push %ebp
10f545: 89 e5 mov %esp,%ebp
10f547: 57 push %edi
10f548: 56 push %esi
10f549: 53 push %ebx
10f54a: 83 ec 5c sub $0x5c,%esp
/*
* This was filled in by the caller and is valid in the
* mount table.
*/
node = pathloc->node_access;
10f54d: 8b 45 0c mov 0xc(%ebp),%eax
10f550: 8b 18 mov (%eax),%ebx
/*
* Get the path length.
*/
pathlen = strlen( path );
10f552: 31 c0 xor %eax,%eax
10f554: b9 ff ff ff ff mov $0xffffffff,%ecx
10f559: 8b 7d 08 mov 0x8(%ebp),%edi
10f55c: f2 ae repnz scas %es:(%edi),%al
10f55e: f7 d1 not %ecx
10f560: 8d 71 ff lea -0x1(%ecx),%esi
const char *path, /* IN */
rtems_filesystem_location_info_t *pathloc, /* IN/OUT */
const char **name /* OUT */
)
{
int i = 0;
10f563: c7 45 a4 00 00 00 00 movl $0x0,-0x5c(%ebp)
* Evaluate all tokens until we are done or an error occurs.
*/
while( !done ) {
type = IMFS_get_token( &path[i], pathlen, token, &len );
10f56a: 8d 55 e4 lea -0x1c(%ebp),%edx
10f56d: 52 push %edx
10f56e: 8d 4d af lea -0x51(%ebp),%ecx
10f571: 51 push %ecx
10f572: 56 push %esi
10f573: 8b 45 08 mov 0x8(%ebp),%eax
10f576: 03 45 a4 add -0x5c(%ebp),%eax
10f579: 50 push %eax
10f57a: e8 95 03 00 00 call 10f914 <IMFS_get_token>
10f57f: 89 c7 mov %eax,%edi
pathlen -= len;
10f581: 8b 55 e4 mov -0x1c(%ebp),%edx
10f584: 29 d6 sub %edx,%esi
i += len;
if ( !pathloc->node_access )
10f586: 8b 4d 0c mov 0xc(%ebp),%ecx
10f589: 8b 01 mov (%ecx),%eax
10f58b: 83 c4 10 add $0x10,%esp
10f58e: 85 c0 test %eax,%eax
10f590: 0f 84 55 01 00 00 je 10f6eb <IMFS_evaluate_for_make+0x1a7><== NEVER TAKEN
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
10f596: 85 ff test %edi,%edi
10f598: 75 1a jne 10f5b4 <IMFS_evaluate_for_make+0x70>
pathloc->node_access = node;
break;
case IMFS_NO_MORE_PATH:
rtems_set_errno_and_return_minus_one( EEXIST );
10f59a: e8 75 3d 00 00 call 113314 <__errno>
10f59f: c7 00 11 00 00 00 movl $0x11,(%eax)
10f5a5: bb ff ff ff ff mov $0xffffffff,%ebx
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_WX ) )
rtems_set_errno_and_return_minus_one( EACCES );
return result;
}
10f5aa: 89 d8 mov %ebx,%eax
10f5ac: 8d 65 f4 lea -0xc(%ebp),%esp
10f5af: 5b pop %ebx
10f5b0: 5e pop %esi
10f5b1: 5f pop %edi
10f5b2: c9 leave
10f5b3: c3 ret
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
10f5b4: 83 7b 4c 01 cmpl $0x1,0x4c(%ebx)
10f5b8: 0f 84 c6 00 00 00 je 10f684 <IMFS_evaluate_for_make+0x140>
while( !done ) {
type = IMFS_get_token( &path[i], pathlen, token, &len );
pathlen -= len;
i += len;
10f5be: 01 55 a4 add %edx,-0x5c(%ebp)
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
rtems_set_errno_and_return_minus_one( EACCES );
node = pathloc->node_access;
10f5c1: 89 c3 mov %eax,%ebx
switch( type ) {
10f5c3: 83 ff 02 cmp $0x2,%edi
10f5c6: 0f 84 88 00 00 00 je 10f654 <IMFS_evaluate_for_make+0x110>
10f5cc: 76 26 jbe 10f5f4 <IMFS_evaluate_for_make+0xb0>
10f5ce: 83 ff 03 cmp $0x3,%edi
10f5d1: 74 2d je 10f600 <IMFS_evaluate_for_make+0xbc>
10f5d3: 83 ff 04 cmp $0x4,%edi
10f5d6: 75 92 jne 10f56a <IMFS_evaluate_for_make+0x26><== NEVER TAKEN
case IMFS_NO_MORE_PATH:
rtems_set_errno_and_return_minus_one( EEXIST );
break;
case IMFS_INVALID_TOKEN:
rtems_set_errno_and_return_minus_one( ENAMETOOLONG );
10f5d8: e8 37 3d 00 00 call 113314 <__errno>
10f5dd: c7 00 5b 00 00 00 movl $0x5b,(%eax)
10f5e3: bb ff ff ff ff mov $0xffffffff,%ebx
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_WX ) )
rtems_set_errno_and_return_minus_one( EACCES );
return result;
}
10f5e8: 89 d8 mov %ebx,%eax
10f5ea: 8d 65 f4 lea -0xc(%ebp),%esp
10f5ed: 5b pop %ebx
10f5ee: 5e pop %esi
10f5ef: 5f pop %edi
10f5f0: c9 leave
10f5f1: c3 ret
10f5f2: 66 90 xchg %ax,%ax
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
rtems_set_errno_and_return_minus_one( EACCES );
node = pathloc->node_access;
switch( type ) {
10f5f4: 85 ff test %edi,%edi
10f5f6: 74 a2 je 10f59a <IMFS_evaluate_for_make+0x56><== NEVER TAKEN
10f5f8: e9 6d ff ff ff jmp 10f56a <IMFS_evaluate_for_make+0x26>
10f5fd: 8d 76 00 lea 0x0(%esi),%esi
pathloc->node_access = node;
break;
case IMFS_NAME:
if ( node->type == IMFS_HARD_LINK ) {
10f600: 8b 40 4c mov 0x4c(%eax),%eax
10f603: 83 f8 03 cmp $0x3,%eax
10f606: 0f 84 b4 01 00 00 je 10f7c0 <IMFS_evaluate_for_make+0x27c>
result = IMFS_evaluate_link( pathloc, 0 );
if ( result == -1 )
return -1;
} else if ( node->type == IMFS_SYM_LINK ) {
10f60c: 83 f8 04 cmp $0x4,%eax
10f60f: 0f 84 ca 01 00 00 je 10f7df <IMFS_evaluate_for_make+0x29b>
if ( result == -1 )
return -1;
}
node = pathloc->node_access;
if ( !node )
10f615: 85 db test %ebx,%ebx
10f617: 0f 84 67 01 00 00 je 10f784 <IMFS_evaluate_for_make+0x240><== NEVER TAKEN
/*
* Only a directory can be decended into.
*/
if ( node->type != IMFS_DIRECTORY )
10f61d: 83 7b 4c 01 cmpl $0x1,0x4c(%ebx)
10f621: 0f 85 5d 01 00 00 jne 10f784 <IMFS_evaluate_for_make+0x240>
/*
* If we are at a node that is a mount point. Set loc to the
* new fs root node and let them finish evaluating the path.
*/
if ( node->info.directory.mt_fs != NULL ) {
10f627: 8b 43 5c mov 0x5c(%ebx),%eax
10f62a: 85 c0 test %eax,%eax
10f62c: 0f 85 67 01 00 00 jne 10f799 <IMFS_evaluate_for_make+0x255>
/*
* Otherwise find the token name in the present location.
*/
node = IMFS_find_match_in_dir( node, token );
10f632: 83 ec 08 sub $0x8,%esp
10f635: 8d 45 af lea -0x51(%ebp),%eax
10f638: 50 push %eax
10f639: 53 push %ebx
10f63a: e8 69 02 00 00 call 10f8a8 <IMFS_find_match_in_dir>
10f63f: 89 c3 mov %eax,%ebx
/*
* If there is no node we have found the name of the node we
* wish to create.
*/
if ( ! node )
10f641: 83 c4 10 add $0x10,%esp
10f644: 85 c0 test %eax,%eax
10f646: 74 64 je 10f6ac <IMFS_evaluate_for_make+0x168>
done = true;
else
pathloc->node_access = node;
10f648: 8b 55 0c mov 0xc(%ebp),%edx
10f64b: 89 02 mov %eax,(%edx)
10f64d: e9 18 ff ff ff jmp 10f56a <IMFS_evaluate_for_make+0x26>
10f652: 66 90 xchg %ax,%ax
case IMFS_UP_DIR:
/*
* Am I at the root of all filesystems? (chroot'ed?)
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access )
10f654: 8b 15 30 5a 12 00 mov 0x125a30,%edx
10f65a: 3b 42 18 cmp 0x18(%edx),%eax
10f65d: 0f 84 07 ff ff ff je 10f56a <IMFS_evaluate_for_make+0x26>
/*
* Am I at the root of this mounted filesystem?
*/
if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access){
10f663: 8b 4d 0c mov 0xc(%ebp),%ecx
10f666: 8b 51 10 mov 0x10(%ecx),%edx
10f669: 3b 42 1c cmp 0x1c(%edx),%eax
10f66c: 0f 84 8e 00 00 00 je 10f700 <IMFS_evaluate_for_make+0x1bc>
*pathloc = newloc;
return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
}
} else {
if ( !node->Parent )
10f672: 8b 58 08 mov 0x8(%eax),%ebx
10f675: 85 db test %ebx,%ebx
10f677: 74 72 je 10f6eb <IMFS_evaluate_for_make+0x1a7>
rtems_set_errno_and_return_minus_one( ENOENT );
node = node->Parent;
}
pathloc->node_access = node;
10f679: 8b 4d 0c mov 0xc(%ebp),%ecx
10f67c: 89 19 mov %ebx,(%ecx)
break;
10f67e: e9 e7 fe ff ff jmp 10f56a <IMFS_evaluate_for_make+0x26>
10f683: 90 nop
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
10f684: 83 ec 08 sub $0x8,%esp
10f687: 6a 01 push $0x1
10f689: ff 75 0c pushl 0xc(%ebp)
10f68c: 89 55 a0 mov %edx,-0x60(%ebp)
10f68f: e8 80 fa ff ff call 10f114 <IMFS_evaluate_permission>
10f694: 83 c4 10 add $0x10,%esp
10f697: 85 c0 test %eax,%eax
10f699: 8b 55 a0 mov -0x60(%ebp),%edx
10f69c: 0f 84 cd 00 00 00 je 10f76f <IMFS_evaluate_for_make+0x22b>
10f6a2: 8b 4d 0c mov 0xc(%ebp),%ecx
10f6a5: 8b 01 mov (%ecx),%eax
10f6a7: e9 12 ff ff ff jmp 10f5be <IMFS_evaluate_for_make+0x7a>
case IMFS_CURRENT_DIR:
break;
}
}
*name = &path[ i - len ];
10f6ac: 8b 45 a4 mov -0x5c(%ebp),%eax
10f6af: 2b 45 e4 sub -0x1c(%ebp),%eax
10f6b2: 03 45 08 add 0x8(%ebp),%eax
10f6b5: 8b 4d 10 mov 0x10(%ebp),%ecx
10f6b8: 89 01 mov %eax,(%ecx)
/*
* We have evaluated the path as far as we can.
* Verify there is not any invalid stuff at the end of the name.
*/
for( ; path[i] != '\0'; i++) {
10f6ba: 8b 4d 08 mov 0x8(%ebp),%ecx
10f6bd: 8b 55 a4 mov -0x5c(%ebp),%edx
10f6c0: 8a 04 11 mov (%ecx,%edx,1),%al
10f6c3: 84 c0 test %al,%al
10f6c5: 74 75 je 10f73c <IMFS_evaluate_for_make+0x1f8>
10f6c7: 89 d3 mov %edx,%ebx
10f6c9: 89 ce mov %ecx,%esi
10f6cb: eb 0b jmp 10f6d8 <IMFS_evaluate_for_make+0x194>
10f6cd: 8d 76 00 lea 0x0(%esi),%esi
10f6d0: 43 inc %ebx
10f6d1: 8a 04 1e mov (%esi,%ebx,1),%al
10f6d4: 84 c0 test %al,%al
10f6d6: 74 64 je 10f73c <IMFS_evaluate_for_make+0x1f8>
if ( !IMFS_is_separator( path[ i ] ) )
10f6d8: 83 ec 0c sub $0xc,%esp
10f6db: 0f be c0 movsbl %al,%eax
10f6de: 50 push %eax
10f6df: e8 34 98 ff ff call 108f18 <rtems_filesystem_is_separator>
10f6e4: 83 c4 10 add $0x10,%esp
10f6e7: 85 c0 test %eax,%eax
10f6e9: 75 e5 jne 10f6d0 <IMFS_evaluate_for_make+0x18c>
rtems_set_errno_and_return_minus_one( ENOENT );
10f6eb: e8 24 3c 00 00 call 113314 <__errno>
10f6f0: c7 00 02 00 00 00 movl $0x2,(%eax)
10f6f6: bb ff ff ff ff mov $0xffffffff,%ebx
10f6fb: e9 aa fe ff ff jmp 10f5aa <IMFS_evaluate_for_make+0x66>
if ( pathloc->node_access == rtems_filesystem_root.node_access ) {
break;
} else {
newloc = pathloc->mt_entry->mt_point_node;
10f700: 8d 7d d0 lea -0x30(%ebp),%edi
10f703: 8d 72 08 lea 0x8(%edx),%esi
10f706: b9 05 00 00 00 mov $0x5,%ecx
10f70b: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
*pathloc = newloc;
10f70d: 8d 75 d0 lea -0x30(%ebp),%esi
10f710: b1 05 mov $0x5,%cl
10f712: 8b 7d 0c mov 0xc(%ebp),%edi
10f715: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
10f717: 53 push %ebx
10f718: 8b 55 0c mov 0xc(%ebp),%edx
10f71b: 8b 42 0c mov 0xc(%edx),%eax
10f71e: ff 75 10 pushl 0x10(%ebp)
10f721: 52 push %edx
*/
if ( node->info.directory.mt_fs != NULL ) {
newloc = node->info.directory.mt_fs->mt_fs_root;
*pathloc = newloc;
return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
10f722: 8b 55 a4 mov -0x5c(%ebp),%edx
10f725: 2b 55 e4 sub -0x1c(%ebp),%edx
10f728: 03 55 08 add 0x8(%ebp),%edx
10f72b: 52 push %edx
10f72c: ff 50 04 call *0x4(%eax)
10f72f: 89 c3 mov %eax,%ebx
10f731: 83 c4 10 add $0x10,%esp
10f734: e9 71 fe ff ff jmp 10f5aa <IMFS_evaluate_for_make+0x66>
10f739: 8d 76 00 lea 0x0(%esi),%esi
/*
* Verify we can execute and write to this directory.
*/
result = IMFS_Set_handlers( pathloc );
10f73c: 83 ec 0c sub $0xc,%esp
10f73f: ff 75 0c pushl 0xc(%ebp)
10f742: e8 71 f9 ff ff call 10f0b8 <IMFS_Set_handlers>
10f747: 89 c3 mov %eax,%ebx
/*
* The returned node must be a directory
*/
node = pathloc->node_access;
if ( node->type != IMFS_DIRECTORY )
10f749: 8b 55 0c mov 0xc(%ebp),%edx
10f74c: 8b 02 mov (%edx),%eax
10f74e: 83 c4 10 add $0x10,%esp
10f751: 83 78 4c 01 cmpl $0x1,0x4c(%eax)
10f755: 75 2d jne 10f784 <IMFS_evaluate_for_make+0x240><== NEVER TAKEN
/*
* We must have Write and execute permission on the returned node.
*/
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_WX ) )
10f757: 83 ec 08 sub $0x8,%esp
10f75a: 6a 03 push $0x3
10f75c: ff 75 0c pushl 0xc(%ebp)
10f75f: e8 b0 f9 ff ff call 10f114 <IMFS_evaluate_permission>
10f764: 83 c4 10 add $0x10,%esp
10f767: 85 c0 test %eax,%eax
10f769: 0f 85 3b fe ff ff jne 10f5aa <IMFS_evaluate_for_make+0x66>
rtems_set_errno_and_return_minus_one( EACCES );
10f76f: e8 a0 3b 00 00 call 113314 <__errno>
10f774: c7 00 0d 00 00 00 movl $0xd,(%eax)
10f77a: bb ff ff ff ff mov $0xffffffff,%ebx
10f77f: e9 26 fe ff ff jmp 10f5aa <IMFS_evaluate_for_make+0x66>
/*
* The returned node must be a directory
*/
node = pathloc->node_access;
if ( node->type != IMFS_DIRECTORY )
rtems_set_errno_and_return_minus_one( ENOTDIR );
10f784: e8 8b 3b 00 00 call 113314 <__errno>
10f789: c7 00 14 00 00 00 movl $0x14,(%eax)
10f78f: bb ff ff ff ff mov $0xffffffff,%ebx
10f794: e9 11 fe ff ff jmp 10f5aa <IMFS_evaluate_for_make+0x66>
* If we are at a node that is a mount point. Set loc to the
* new fs root node and let them finish evaluating the path.
*/
if ( node->info.directory.mt_fs != NULL ) {
newloc = node->info.directory.mt_fs->mt_fs_root;
10f799: 8d 7d d0 lea -0x30(%ebp),%edi
10f79c: 8d 70 1c lea 0x1c(%eax),%esi
10f79f: b9 05 00 00 00 mov $0x5,%ecx
10f7a4: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
*pathloc = newloc;
10f7a6: 8d 75 d0 lea -0x30(%ebp),%esi
10f7a9: b1 05 mov $0x5,%cl
10f7ab: 8b 7d 0c mov 0xc(%ebp),%edi
10f7ae: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
10f7b0: 51 push %ecx
10f7b1: 8b 4d 0c mov 0xc(%ebp),%ecx
10f7b4: 8b 41 0c mov 0xc(%ecx),%eax
10f7b7: ff 75 10 pushl 0x10(%ebp)
10f7ba: 51 push %ecx
10f7bb: e9 62 ff ff ff jmp 10f722 <IMFS_evaluate_for_make+0x1de>
case IMFS_NAME:
if ( node->type == IMFS_HARD_LINK ) {
result = IMFS_evaluate_link( pathloc, 0 );
10f7c0: 83 ec 08 sub $0x8,%esp
10f7c3: 6a 00 push $0x0
10f7c5: ff 75 0c pushl 0xc(%ebp)
10f7c8: e8 cb fc ff ff call 10f498 <IMFS_evaluate_link>
if ( result == -1 )
10f7cd: 83 c4 10 add $0x10,%esp
10f7d0: 83 f8 ff cmp $0xffffffff,%eax
10f7d3: 74 29 je 10f7fe <IMFS_evaluate_for_make+0x2ba><== NEVER TAKEN
10f7d5: 8b 45 0c mov 0xc(%ebp),%eax
10f7d8: 8b 18 mov (%eax),%ebx
10f7da: e9 36 fe ff ff jmp 10f615 <IMFS_evaluate_for_make+0xd1>
return -1;
} else if ( node->type == IMFS_SYM_LINK ) {
result = IMFS_evaluate_link( pathloc, 0 );
10f7df: 83 ec 08 sub $0x8,%esp
10f7e2: 6a 00 push $0x0
10f7e4: ff 75 0c pushl 0xc(%ebp)
10f7e7: e8 ac fc ff ff call 10f498 <IMFS_evaluate_link>
if ( result == -1 )
10f7ec: 83 c4 10 add $0x10,%esp
10f7ef: 83 f8 ff cmp $0xffffffff,%eax
10f7f2: 74 0a je 10f7fe <IMFS_evaluate_for_make+0x2ba><== NEVER TAKEN
10f7f4: 8b 55 0c mov 0xc(%ebp),%edx
10f7f7: 8b 1a mov (%edx),%ebx
10f7f9: e9 17 fe ff ff jmp 10f615 <IMFS_evaluate_for_make+0xd1>
10f7fe: 89 c3 mov %eax,%ebx <== NOT EXECUTED
10f800: e9 a5 fd ff ff jmp 10f5aa <IMFS_evaluate_for_make+0x66><== NOT EXECUTED
0010f498 <IMFS_evaluate_link>:
*/
int IMFS_evaluate_link(
rtems_filesystem_location_info_t *node, /* IN/OUT */
int flags /* IN */
)
{
10f498: 55 push %ebp
10f499: 89 e5 mov %esp,%ebp
10f49b: 57 push %edi
10f49c: 56 push %esi
10f49d: 53 push %ebx
10f49e: 83 ec 0c sub $0xc,%esp
10f4a1: 8b 75 08 mov 0x8(%ebp),%esi
10f4a4: 8b 7d 0c mov 0xc(%ebp),%edi
*/
rtems_filesystem_link_counts ++;
if ( rtems_filesystem_link_counts > MAXSYMLINK ) {
rtems_filesystem_link_counts = 0;
rtems_set_errno_and_return_minus_one( ELOOP );
10f4a7: 8b 15 30 5a 12 00 mov 0x125a30,%edx
10f4ad: eb 0e jmp 10f4bd <IMFS_evaluate_link+0x25>
10f4af: 90 nop
*/
if ( jnode->type == IMFS_HARD_LINK )
result = IMFS_evaluate_hard_link( node, flags );
else if (jnode->type == IMFS_SYM_LINK )
10f4b0: 83 f8 04 cmp $0x4,%eax
10f4b3: 74 53 je 10f508 <IMFS_evaluate_link+0x70>
result = IMFS_evaluate_sym_link( node, flags );
} while ( ( result == 0 ) && ( ( jnode->type == IMFS_SYM_LINK ) ||
10f4b5: 83 e8 03 sub $0x3,%eax
10f4b8: 83 f8 01 cmp $0x1,%eax
10f4bb: 77 3a ja 10f4f7 <IMFS_evaluate_link+0x5f><== ALWAYS TAKEN
{
IMFS_jnode_t *jnode;
int result = 0;
do {
jnode = node->node_access;
10f4bd: 8b 1e mov (%esi),%ebx
/*
* Increment and check the link counter.
*/
rtems_filesystem_link_counts ++;
10f4bf: 8b 42 30 mov 0x30(%edx),%eax
10f4c2: 40 inc %eax
10f4c3: 66 89 42 30 mov %ax,0x30(%edx)
if ( rtems_filesystem_link_counts > MAXSYMLINK ) {
10f4c7: 66 83 f8 05 cmp $0x5,%ax
10f4cb: 77 57 ja 10f524 <IMFS_evaluate_link+0x8c><== NEVER TAKEN
/*
* Follow the Link node.
*/
if ( jnode->type == IMFS_HARD_LINK )
10f4cd: 8b 43 4c mov 0x4c(%ebx),%eax
10f4d0: 83 f8 03 cmp $0x3,%eax
10f4d3: 75 db jne 10f4b0 <IMFS_evaluate_link+0x18>
result = IMFS_evaluate_hard_link( node, flags );
10f4d5: 83 ec 08 sub $0x8,%esp
10f4d8: 57 push %edi
10f4d9: 56 push %esi
10f4da: e8 a1 fc ff ff call 10f180 <IMFS_evaluate_hard_link>
10f4df: 83 c4 10 add $0x10,%esp
else if (jnode->type == IMFS_SYM_LINK )
result = IMFS_evaluate_sym_link( node, flags );
} while ( ( result == 0 ) && ( ( jnode->type == IMFS_SYM_LINK ) ||
( jnode->type == IMFS_HARD_LINK ) ) );
10f4e2: 85 c0 test %eax,%eax
10f4e4: 75 33 jne 10f519 <IMFS_evaluate_link+0x81>
10f4e6: 8b 43 4c mov 0x4c(%ebx),%eax
10f4e9: 8b 15 30 5a 12 00 mov 0x125a30,%edx
result = IMFS_evaluate_hard_link( node, flags );
else if (jnode->type == IMFS_SYM_LINK )
result = IMFS_evaluate_sym_link( node, flags );
} while ( ( result == 0 ) && ( ( jnode->type == IMFS_SYM_LINK ) ||
10f4ef: 83 e8 03 sub $0x3,%eax
10f4f2: 83 f8 01 cmp $0x1,%eax
10f4f5: 76 c6 jbe 10f4bd <IMFS_evaluate_link+0x25><== ALWAYS TAKEN
10f4f7: 31 c0 xor %eax,%eax
/*
* Clear link counter.
*/
rtems_filesystem_link_counts = 0;
10f4f9: 66 c7 42 30 00 00 movw $0x0,0x30(%edx)
return result;
}
10f4ff: 8d 65 f4 lea -0xc(%ebp),%esp
10f502: 5b pop %ebx
10f503: 5e pop %esi
10f504: 5f pop %edi
10f505: c9 leave
10f506: c3 ret
10f507: 90 nop
if ( jnode->type == IMFS_HARD_LINK )
result = IMFS_evaluate_hard_link( node, flags );
else if (jnode->type == IMFS_SYM_LINK )
result = IMFS_evaluate_sym_link( node, flags );
10f508: 83 ec 08 sub $0x8,%esp
10f50b: 57 push %edi
10f50c: 56 push %esi
10f50d: e8 0a ff ff ff call 10f41c <IMFS_evaluate_sym_link>
10f512: 83 c4 10 add $0x10,%esp
} while ( ( result == 0 ) && ( ( jnode->type == IMFS_SYM_LINK ) ||
( jnode->type == IMFS_HARD_LINK ) ) );
10f515: 85 c0 test %eax,%eax
10f517: 74 cd je 10f4e6 <IMFS_evaluate_link+0x4e>
10f519: 8b 15 30 5a 12 00 mov 0x125a30,%edx
10f51f: eb d8 jmp 10f4f9 <IMFS_evaluate_link+0x61>
10f521: 8d 76 00 lea 0x0(%esi),%esi
* Increment and check the link counter.
*/
rtems_filesystem_link_counts ++;
if ( rtems_filesystem_link_counts > MAXSYMLINK ) {
rtems_filesystem_link_counts = 0;
10f524: 66 c7 42 30 00 00 movw $0x0,0x30(%edx)
rtems_set_errno_and_return_minus_one( ELOOP );
10f52a: e8 e5 3d 00 00 call 113314 <__errno>
10f52f: c7 00 5c 00 00 00 movl $0x5c,(%eax)
10f535: b8 ff ff ff ff mov $0xffffffff,%eax
*/
rtems_filesystem_link_counts = 0;
return result;
}
10f53a: 8d 65 f4 lea -0xc(%ebp),%esp
10f53d: 5b pop %ebx
10f53e: 5e pop %esi
10f53f: 5f pop %edi
10f540: c9 leave
10f541: c3 ret
0010f114 <IMFS_evaluate_permission>:
*/
int IMFS_evaluate_permission(
rtems_filesystem_location_info_t *node,
int flags
)
{
10f114: 55 push %ebp
10f115: 89 e5 mov %esp,%ebp
10f117: 57 push %edi
10f118: 56 push %esi
10f119: 53 push %ebx
10f11a: 83 ec 0c sub $0xc,%esp
10f11d: 8b 75 0c mov 0xc(%ebp),%esi
uid_t st_uid;
gid_t st_gid;
IMFS_jnode_t *jnode;
int flags_to_test;
if ( !rtems_libio_is_valid_perms( flags ) )
10f120: f7 c6 f8 ff ff ff test $0xfffffff8,%esi
10f126: 75 44 jne 10f16c <IMFS_evaluate_permission+0x58><== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EPERM );
jnode = node->node_access;
10f128: 8b 45 08 mov 0x8(%ebp),%eax
10f12b: 8b 18 mov (%eax),%ebx
#if defined(RTEMS_POSIX_API)
st_uid = geteuid();
10f12d: e8 1a 0c 00 00 call 10fd4c <geteuid>
10f132: 89 c7 mov %eax,%edi
st_gid = getegid();
10f134: e8 03 0c 00 00 call 10fd3c <getegid>
* Check if I am owner or a group member or someone else.
*/
flags_to_test = flags;
if ( st_uid == jnode->st_uid )
10f139: 66 39 7b 3c cmp %di,0x3c(%ebx)
10f13d: 74 1d je 10f15c <IMFS_evaluate_permission+0x48>
flags_to_test <<= 6;
else if ( st_gid == jnode->st_gid )
10f13f: 66 39 43 3e cmp %ax,0x3e(%ebx)
10f143: 74 1f je 10f164 <IMFS_evaluate_permission+0x50><== ALWAYS TAKEN
/*
* If all of the flags are set we have permission
* to do this.
*/
if ( ( flags_to_test & jnode->st_mode) == flags_to_test )
10f145: 8b 43 30 mov 0x30(%ebx),%eax
10f148: 21 f0 and %esi,%eax
gid_t st_gid;
IMFS_jnode_t *jnode;
int flags_to_test;
if ( !rtems_libio_is_valid_perms( flags ) )
rtems_set_errno_and_return_minus_one( EPERM );
10f14a: 39 c6 cmp %eax,%esi
10f14c: 0f 94 c0 sete %al
10f14f: 0f b6 c0 movzbl %al,%eax
*/
if ( ( flags_to_test & jnode->st_mode) == flags_to_test )
return 1;
return 0;
}
10f152: 83 c4 0c add $0xc,%esp
10f155: 5b pop %ebx
10f156: 5e pop %esi
10f157: 5f pop %edi
10f158: c9 leave
10f159: c3 ret
10f15a: 66 90 xchg %ax,%ax
*/
flags_to_test = flags;
if ( st_uid == jnode->st_uid )
flags_to_test <<= 6;
10f15c: c1 e6 06 shl $0x6,%esi
10f15f: eb e4 jmp 10f145 <IMFS_evaluate_permission+0x31>
10f161: 8d 76 00 lea 0x0(%esi),%esi
else if ( st_gid == jnode->st_gid )
flags_to_test <<= 3;
10f164: c1 e6 03 shl $0x3,%esi
10f167: eb dc jmp 10f145 <IMFS_evaluate_permission+0x31>
10f169: 8d 76 00 lea 0x0(%esi),%esi
gid_t st_gid;
IMFS_jnode_t *jnode;
int flags_to_test;
if ( !rtems_libio_is_valid_perms( flags ) )
rtems_set_errno_and_return_minus_one( EPERM );
10f16c: e8 a3 41 00 00 call 113314 <__errno> <== NOT EXECUTED
10f171: c7 00 01 00 00 00 movl $0x1,(%eax) <== NOT EXECUTED
10f177: b8 ff ff ff ff mov $0xffffffff,%eax <== NOT EXECUTED
10f17c: eb d4 jmp 10f152 <IMFS_evaluate_permission+0x3e><== NOT EXECUTED
0010f41c <IMFS_evaluate_sym_link>:
int IMFS_evaluate_sym_link(
rtems_filesystem_location_info_t *node, /* IN/OUT */
int flags /* IN */
)
{
10f41c: 55 push %ebp
10f41d: 89 e5 mov %esp,%ebp
10f41f: 57 push %edi
10f420: 56 push %esi
10f421: 53 push %ebx
10f422: 83 ec 20 sub $0x20,%esp
10f425: 8b 5d 08 mov 0x8(%ebp),%ebx
10f428: 8b 75 0c mov 0xc(%ebp),%esi
IMFS_jnode_t *jnode = node->node_access;
10f42b: 8b 3b mov (%ebx),%edi
/*
* Move the node_access to either the symbolic links parent or
* root depending on the symbolic links path.
*/
node->node_access = jnode->Parent;
10f42d: 8b 47 08 mov 0x8(%edi),%eax
10f430: 89 03 mov %eax,(%ebx)
rtems_filesystem_get_sym_start_loc(
10f432: 53 push %ebx
10f433: 8d 45 e4 lea -0x1c(%ebp),%eax
10f436: 50 push %eax
10f437: ff 77 50 pushl 0x50(%edi)
10f43a: e8 f9 0d 00 00 call 110238 <rtems_filesystem_get_sym_start_loc>
);
/*
* Use eval path to evaluate the path of the symbolic link.
*/
result = IMFS_eval_path(
10f43f: 8b 57 50 mov 0x50(%edi),%edx
10f442: 03 55 e4 add -0x1c(%ebp),%edx
10f445: 31 c0 xor %eax,%eax
10f447: b9 ff ff ff ff mov $0xffffffff,%ecx
10f44c: 89 d7 mov %edx,%edi
10f44e: f2 ae repnz scas %es:(%edi),%al
10f450: f7 d1 not %ecx
10f452: 49 dec %ecx
10f453: 53 push %ebx
10f454: 56 push %esi
10f455: 51 push %ecx
10f456: 52 push %edx
10f457: e8 68 fd ff ff call 10f1c4 <IMFS_eval_path>
10f45c: 89 c7 mov %eax,%edi
strlen( &jnode->info.sym_link.name[i] ),
flags,
node
);
IMFS_Set_handlers( node );
10f45e: 83 c4 14 add $0x14,%esp
10f461: 53 push %ebx
10f462: e8 51 fc ff ff call 10f0b8 <IMFS_Set_handlers>
/*
* Verify we have the correct permissions for this node.
*/
if ( !IMFS_evaluate_permission( node, flags ) )
10f467: 58 pop %eax
10f468: 5a pop %edx
10f469: 56 push %esi
10f46a: 53 push %ebx
10f46b: e8 a4 fc ff ff call 10f114 <IMFS_evaluate_permission>
10f470: 83 c4 10 add $0x10,%esp
10f473: 85 c0 test %eax,%eax
10f475: 74 0d je 10f484 <IMFS_evaluate_sym_link+0x68>
rtems_set_errno_and_return_minus_one( EACCES );
return result;
}
10f477: 89 f8 mov %edi,%eax
10f479: 8d 65 f4 lea -0xc(%ebp),%esp
10f47c: 5b pop %ebx
10f47d: 5e pop %esi
10f47e: 5f pop %edi
10f47f: c9 leave
10f480: c3 ret
10f481: 8d 76 00 lea 0x0(%esi),%esi
/*
* Verify we have the correct permissions for this node.
*/
if ( !IMFS_evaluate_permission( node, flags ) )
rtems_set_errno_and_return_minus_one( EACCES );
10f484: e8 8b 3e 00 00 call 113314 <__errno>
10f489: c7 00 0d 00 00 00 movl $0xd,(%eax)
10f48f: bf ff ff ff ff mov $0xffffffff,%edi
10f494: eb e1 jmp 10f477 <IMFS_evaluate_sym_link+0x5b>
00112a94 <IMFS_fchmod>:
int IMFS_fchmod(
rtems_filesystem_location_info_t *loc,
mode_t mode
)
{
112a94: 55 push %ebp
112a95: 89 e5 mov %esp,%ebp
112a97: 53 push %ebx
112a98: 83 ec 14 sub $0x14,%esp
IMFS_jnode_t *jnode;
#if defined(RTEMS_POSIX_API)
uid_t st_uid;
#endif
jnode = loc->node_access;
112a9b: 8b 45 08 mov 0x8(%ebp),%eax
112a9e: 8b 18 mov (%eax),%ebx
/*
* Verify I am the owner of the node or the super user.
*/
#if defined(RTEMS_POSIX_API)
st_uid = geteuid();
112aa0: e8 a7 d2 ff ff call 10fd4c <geteuid>
if ( ( st_uid != jnode->st_uid ) && ( st_uid != 0 ) )
112aa5: 66 39 43 3c cmp %ax,0x3c(%ebx)
112aa9: 74 05 je 112ab0 <IMFS_fchmod+0x1c>
112aab: 66 85 c0 test %ax,%ax
112aae: 75 34 jne 112ae4 <IMFS_fchmod+0x50> <== ALWAYS TAKEN
/*
* Change only the RWX permissions on the jnode to mode.
*/
jnode->st_mode &= ~(S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX);
jnode->st_mode |= mode & (S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX);
112ab0: 8b 45 0c mov 0xc(%ebp),%eax
112ab3: 25 ff 0f 00 00 and $0xfff,%eax
/*
* Change only the RWX permissions on the jnode to mode.
*/
jnode->st_mode &= ~(S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX);
112ab8: 8b 53 30 mov 0x30(%ebx),%edx
112abb: 81 e2 00 f0 ff ff and $0xfffff000,%edx
jnode->st_mode |= mode & (S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX);
112ac1: 09 d0 or %edx,%eax
112ac3: 89 43 30 mov %eax,0x30(%ebx)
IMFS_update_ctime( jnode );
112ac6: 83 ec 08 sub $0x8,%esp
112ac9: 6a 00 push $0x0
112acb: 8d 45 f0 lea -0x10(%ebp),%eax
112ace: 50 push %eax
112acf: e8 5c 56 ff ff call 108130 <gettimeofday>
112ad4: 8b 45 f0 mov -0x10(%ebp),%eax
112ad7: 89 43 48 mov %eax,0x48(%ebx)
return 0;
112ada: 83 c4 10 add $0x10,%esp
112add: 31 c0 xor %eax,%eax
}
112adf: 8b 5d fc mov -0x4(%ebp),%ebx
112ae2: c9 leave
112ae3: c3 ret
*/
#if defined(RTEMS_POSIX_API)
st_uid = geteuid();
if ( ( st_uid != jnode->st_uid ) && ( st_uid != 0 ) )
rtems_set_errno_and_return_minus_one( EPERM );
112ae4: e8 2b 08 00 00 call 113314 <__errno>
112ae9: c7 00 01 00 00 00 movl $0x1,(%eax)
112aef: b8 ff ff ff ff mov $0xffffffff,%eax
112af4: eb e9 jmp 112adf <IMFS_fchmod+0x4b>
00108a84 <IMFS_fifo_ioctl>:
int IMFS_fifo_ioctl(
rtems_libio_t *iop,
uint32_t command,
void *buffer
)
{
108a84: 55 push %ebp
108a85: 89 e5 mov %esp,%ebp
108a87: 53 push %ebx
108a88: 83 ec 04 sub $0x4,%esp
108a8b: 8b 45 08 mov 0x8(%ebp),%eax
108a8e: 8b 55 0c mov 0xc(%ebp),%edx
108a91: 8b 4d 10 mov 0x10(%ebp),%ecx
int err;
if (command == FIONBIO) {
108a94: 81 fa 7e 66 04 80 cmp $0x8004667e,%edx
108a9a: 74 1c je 108ab8 <IMFS_fifo_ioctl+0x34>
iop->flags &= ~LIBIO_FLAGS_NO_DELAY;
return 0;
}
}
else
err = pipe_ioctl(LIBIO2PIPE(iop), command, buffer, iop);
108a9c: 50 push %eax
108a9d: 51 push %ecx
108a9e: 52 push %edx
108a9f: 8b 40 18 mov 0x18(%eax),%eax
108aa2: ff 70 50 pushl 0x50(%eax)
108aa5: e8 f6 97 00 00 call 1122a0 <pipe_ioctl>
IMFS_FIFO_RETURN(err);
108aaa: 83 c4 10 add $0x10,%esp
108aad: 85 c0 test %eax,%eax
108aaf: 78 3e js 108aef <IMFS_fifo_ioctl+0x6b>
}
108ab1: 8b 5d fc mov -0x4(%ebp),%ebx
108ab4: c9 leave
108ab5: c3 ret
108ab6: 66 90 xchg %ax,%ax
)
{
int err;
if (command == FIONBIO) {
if (buffer == NULL)
108ab8: 85 c9 test %ecx,%ecx
108aba: 74 20 je 108adc <IMFS_fifo_ioctl+0x58>
err = -EFAULT;
else {
if (*(int *)buffer)
108abc: 8b 11 mov (%ecx),%edx
108abe: 85 d2 test %edx,%edx
108ac0: 74 0e je 108ad0 <IMFS_fifo_ioctl+0x4c>
iop->flags |= LIBIO_FLAGS_NO_DELAY;
108ac2: 83 48 14 01 orl $0x1,0x14(%eax)
else
iop->flags &= ~LIBIO_FLAGS_NO_DELAY;
return 0;
108ac6: 31 c0 xor %eax,%eax
}
else
err = pipe_ioctl(LIBIO2PIPE(iop), command, buffer, iop);
IMFS_FIFO_RETURN(err);
}
108ac8: 8b 5d fc mov -0x4(%ebp),%ebx
108acb: c9 leave
108acc: c3 ret
108acd: 8d 76 00 lea 0x0(%esi),%esi
err = -EFAULT;
else {
if (*(int *)buffer)
iop->flags |= LIBIO_FLAGS_NO_DELAY;
else
iop->flags &= ~LIBIO_FLAGS_NO_DELAY;
108ad0: 83 60 14 fe andl $0xfffffffe,0x14(%eax)
return 0;
108ad4: 31 c0 xor %eax,%eax
}
else
err = pipe_ioctl(LIBIO2PIPE(iop), command, buffer, iop);
IMFS_FIFO_RETURN(err);
}
108ad6: 8b 5d fc mov -0x4(%ebp),%ebx
108ad9: c9 leave
108ada: c3 ret
108adb: 90 nop
)
{
int err;
if (command == FIONBIO) {
if (buffer == NULL)
108adc: bb 0e 00 00 00 mov $0xe,%ebx
}
}
else
err = pipe_ioctl(LIBIO2PIPE(iop), command, buffer, iop);
IMFS_FIFO_RETURN(err);
108ae1: e8 26 ca 00 00 call 11550c <__errno>
108ae6: 89 18 mov %ebx,(%eax)
108ae8: b8 ff ff ff ff mov $0xffffffff,%eax
108aed: eb c2 jmp 108ab1 <IMFS_fifo_ioctl+0x2d>
108aef: 89 c3 mov %eax,%ebx
108af1: f7 db neg %ebx
108af3: eb ec jmp 108ae1 <IMFS_fifo_ioctl+0x5d>
00108a40 <IMFS_fifo_lseek>:
rtems_off64_t IMFS_fifo_lseek(
rtems_libio_t *iop,
rtems_off64_t offset,
int whence
)
{
108a40: 55 push %ebp
108a41: 89 e5 mov %esp,%ebp
108a43: 53 push %ebx
108a44: 83 ec 10 sub $0x10,%esp
108a47: 8b 45 08 mov 0x8(%ebp),%eax
off_t err = pipe_lseek(LIBIO2PIPE(iop), offset, whence, iop);
108a4a: 50 push %eax
108a4b: ff 75 14 pushl 0x14(%ebp)
108a4e: ff 75 10 pushl 0x10(%ebp)
108a51: ff 75 0c pushl 0xc(%ebp)
108a54: 8b 40 18 mov 0x18(%eax),%eax
108a57: ff 70 50 pushl 0x50(%eax)
108a5a: e8 a1 98 00 00 call 112300 <pipe_lseek>
108a5f: 89 c3 mov %eax,%ebx
108a61: 99 cltd
IMFS_FIFO_RETURN(err);
108a62: 83 c4 20 add $0x20,%esp
108a65: 85 d2 test %edx,%edx
108a67: 78 05 js 108a6e <IMFS_fifo_lseek+0x2e> <== ALWAYS TAKEN
}
108a69: 8b 5d fc mov -0x4(%ebp),%ebx
108a6c: c9 leave
108a6d: c3 ret
rtems_off64_t offset,
int whence
)
{
off_t err = pipe_lseek(LIBIO2PIPE(iop), offset, whence, iop);
IMFS_FIFO_RETURN(err);
108a6e: e8 99 ca 00 00 call 11550c <__errno>
108a73: f7 db neg %ebx
108a75: 89 18 mov %ebx,(%eax)
108a77: b8 ff ff ff ff mov $0xffffffff,%eax
108a7c: ba ff ff ff ff mov $0xffffffff,%edx
108a81: eb e6 jmp 108a69 <IMFS_fifo_lseek+0x29>
00108af8 <IMFS_fifo_write>:
ssize_t IMFS_fifo_write(
rtems_libio_t *iop,
const void *buffer,
size_t count
)
{
108af8: 55 push %ebp
108af9: 89 e5 mov %esp,%ebp
108afb: 56 push %esi
108afc: 53 push %ebx
108afd: 83 ec 10 sub $0x10,%esp
108b00: 8b 45 08 mov 0x8(%ebp),%eax
IMFS_jnode_t *jnode = iop->pathinfo.node_access;
108b03: 8b 58 18 mov 0x18(%eax),%ebx
int err = pipe_write(JNODE2PIPE(jnode), buffer, count, iop);
108b06: 50 push %eax
108b07: ff 75 10 pushl 0x10(%ebp)
108b0a: ff 75 0c pushl 0xc(%ebp)
108b0d: ff 73 50 pushl 0x50(%ebx)
108b10: e8 8b 95 00 00 call 1120a0 <pipe_write>
108b15: 89 c6 mov %eax,%esi
if (err > 0) {
108b17: 83 c4 10 add $0x10,%esp
108b1a: 83 f8 00 cmp $0x0,%eax
108b1d: 7e 25 jle 108b44 <IMFS_fifo_write+0x4c>
IMFS_mtime_ctime_update(jnode);
108b1f: 83 ec 08 sub $0x8,%esp
108b22: 6a 00 push $0x0
108b24: 8d 45 f0 lea -0x10(%ebp),%eax
108b27: 50 push %eax
108b28: e8 3f 0f 00 00 call 109a6c <gettimeofday>
108b2d: 8b 45 f0 mov -0x10(%ebp),%eax
108b30: 89 43 44 mov %eax,0x44(%ebx)
108b33: 89 43 48 mov %eax,0x48(%ebx)
108b36: 83 c4 10 add $0x10,%esp
108b39: 89 f0 mov %esi,%eax
}
IMFS_FIFO_RETURN(err);
}
108b3b: 8d 65 f8 lea -0x8(%ebp),%esp
108b3e: 5b pop %ebx
108b3f: 5e pop %esi
108b40: c9 leave
108b41: c3 ret
108b42: 66 90 xchg %ax,%ax
int err = pipe_write(JNODE2PIPE(jnode), buffer, count, iop);
if (err > 0) {
IMFS_mtime_ctime_update(jnode);
}
IMFS_FIFO_RETURN(err);
108b44: 75 09 jne 108b4f <IMFS_fifo_write+0x57> <== ALWAYS TAKEN
108b46: 31 c0 xor %eax,%eax
}
108b48: 8d 65 f8 lea -0x8(%ebp),%esp
108b4b: 5b pop %ebx <== NOT EXECUTED
108b4c: 5e pop %esi <== NOT EXECUTED
108b4d: c9 leave <== NOT EXECUTED
108b4e: c3 ret <== NOT EXECUTED
int err = pipe_write(JNODE2PIPE(jnode), buffer, count, iop);
if (err > 0) {
IMFS_mtime_ctime_update(jnode);
}
IMFS_FIFO_RETURN(err);
108b4f: e8 b8 c9 00 00 call 11550c <__errno>
108b54: f7 de neg %esi
108b56: 89 30 mov %esi,(%eax)
108b58: b8 ff ff ff ff mov $0xffffffff,%eax
108b5d: eb dc jmp 108b3b <IMFS_fifo_write+0x43>
0010f8a8 <IMFS_find_match_in_dir>:
IMFS_jnode_t *IMFS_find_match_in_dir(
IMFS_jnode_t *directory,
char *name
)
{
10f8a8: 55 push %ebp
10f8a9: 89 e5 mov %esp,%ebp
10f8ab: 57 push %edi
10f8ac: 56 push %esi
10f8ad: 53 push %ebx
10f8ae: 83 ec 0c sub $0xc,%esp
10f8b1: 8b 45 08 mov 0x8(%ebp),%eax
10f8b4: 8b 5d 0c mov 0xc(%ebp),%ebx
/*
* Check for "." and ".."
*/
if ( !strcmp( name, dotname ) )
10f8b7: bf b0 18 12 00 mov $0x1218b0,%edi
10f8bc: b9 02 00 00 00 mov $0x2,%ecx
10f8c1: 89 de mov %ebx,%esi
10f8c3: f3 a6 repz cmpsb %es:(%edi),%ds:(%esi)
10f8c5: 74 13 je 10f8da <IMFS_find_match_in_dir+0x32><== NEVER TAKEN
return directory;
if ( !strcmp( name, dotdotname ) )
10f8c7: bf b2 18 12 00 mov $0x1218b2,%edi
10f8cc: b9 03 00 00 00 mov $0x3,%ecx
10f8d1: 89 de mov %ebx,%esi
10f8d3: f3 a6 repz cmpsb %es:(%edi),%ds:(%esi)
10f8d5: 75 0d jne 10f8e4 <IMFS_find_match_in_dir+0x3c><== ALWAYS TAKEN
return directory->Parent;
10f8d7: 8b 40 08 mov 0x8(%eax),%eax
if ( !strcmp( name, the_jnode->name ) )
return the_jnode;
}
return 0;
}
10f8da: 8d 65 f4 lea -0xc(%ebp),%esp
10f8dd: 5b pop %ebx
10f8de: 5e pop %esi
10f8df: 5f pop %edi
10f8e0: c9 leave
10f8e1: c3 ret
10f8e2: 66 90 xchg %ax,%ax
10f8e4: 8b 70 50 mov 0x50(%eax),%esi
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
10f8e7: 8d 78 54 lea 0x54(%eax),%edi
if ( !strcmp( name, dotdotname ) )
return directory->Parent;
the_chain = &directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
10f8ea: 39 fe cmp %edi,%esi
10f8ec: 75 08 jne 10f8f6 <IMFS_find_match_in_dir+0x4e>
10f8ee: eb 20 jmp 10f910 <IMFS_find_match_in_dir+0x68>
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
10f8f0: 8b 36 mov (%esi),%esi
if ( !strcmp( name, dotdotname ) )
return directory->Parent;
the_chain = &directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
10f8f2: 39 fe cmp %edi,%esi
10f8f4: 74 1a je 10f910 <IMFS_find_match_in_dir+0x68>
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
the_jnode = (IMFS_jnode_t *) the_node;
if ( !strcmp( name, the_jnode->name ) )
10f8f6: 8d 46 0c lea 0xc(%esi),%eax
10f8f9: 83 ec 08 sub $0x8,%esp
10f8fc: 50 push %eax
10f8fd: 53 push %ebx
10f8fe: e8 89 46 00 00 call 113f8c <strcmp>
10f903: 83 c4 10 add $0x10,%esp
10f906: 85 c0 test %eax,%eax
10f908: 75 e6 jne 10f8f0 <IMFS_find_match_in_dir+0x48>
for ( the_node = rtems_chain_first( the_chain );
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
the_jnode = (IMFS_jnode_t *) the_node;
10f90a: 89 f0 mov %esi,%eax
10f90c: eb cc jmp 10f8da <IMFS_find_match_in_dir+0x32>
10f90e: 66 90 xchg %ax,%ax
if ( !strcmp( name, the_jnode->name ) )
return the_jnode;
}
return 0;
10f910: 31 c0 xor %eax,%eax
10f912: eb c6 jmp 10f8da <IMFS_find_match_in_dir+0x32>
0010f808 <IMFS_fsunmount>:
((IMFS_jnode_t *)( rtems_chain_head( jnode_get_control( jnode ) )->next))
int IMFS_fsunmount(
rtems_filesystem_mount_table_entry_t *temp_mt_entry
)
{
10f808: 55 push %ebp
10f809: 89 e5 mov %esp,%ebp
10f80b: 57 push %edi
10f80c: 56 push %esi
10f80d: 53 push %ebx
10f80e: 83 ec 3c sub $0x3c,%esp
10f811: 8b 45 08 mov 0x8(%ebp),%eax
/*
* Traverse tree that starts at the mt_fs_root and deallocate memory
* associated memory space
*/
jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access;
10f814: 8b 58 1c mov 0x1c(%eax),%ebx
loc = temp_mt_entry->mt_fs_root;
10f817: 8d 55 d4 lea -0x2c(%ebp),%edx
10f81a: 89 55 c4 mov %edx,-0x3c(%ebp)
10f81d: 8d 70 1c lea 0x1c(%eax),%esi
10f820: b9 05 00 00 00 mov $0x5,%ecx
10f825: 89 d7 mov %edx,%edi
10f827: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/*
* Set this to null to indicate that it is being unmounted.
*/
temp_mt_entry->mt_fs_root.node_access = NULL;
10f829: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax)
do {
next = jnode->Parent;
10f830: 8b 73 08 mov 0x8(%ebx),%esi
loc.node_access = (void *)jnode;
10f833: 89 5d d4 mov %ebx,-0x2c(%ebp)
IMFS_Set_handlers( &loc );
10f836: 83 ec 0c sub $0xc,%esp
10f839: 8d 45 d4 lea -0x2c(%ebp),%eax
10f83c: 50 push %eax
10f83d: e8 76 f8 ff ff call 10f0b8 <IMFS_Set_handlers>
if ( jnode->type != IMFS_DIRECTORY ) {
10f842: 83 c4 10 add $0x10,%esp
10f845: 83 7b 4c 01 cmpl $0x1,0x4c(%ebx)
10f849: 75 31 jne 10f87c <IMFS_fsunmount+0x74>
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10f84b: 8d 43 54 lea 0x54(%ebx),%eax
result = IMFS_unlink( NULL, &loc );
if (result != 0)
return -1;
jnode = next;
} else if ( jnode_has_no_children( jnode ) ) {
10f84e: 39 43 50 cmp %eax,0x50(%ebx)
10f851: 74 42 je 10f895 <IMFS_fsunmount+0x8d>
result = IMFS_unlink( NULL, &loc );
if (result != 0)
return -1;
jnode = next;
}
if ( jnode != NULL ) {
10f853: 85 db test %ebx,%ebx
10f855: 74 19 je 10f870 <IMFS_fsunmount+0x68>
if ( jnode->type == IMFS_DIRECTORY ) {
10f857: 83 7b 4c 01 cmpl $0x1,0x4c(%ebx)
10f85b: 75 d3 jne 10f830 <IMFS_fsunmount+0x28> <== NEVER TAKEN
}
}
} while (jnode != NULL);
return 0;
}
10f85d: 8b 43 50 mov 0x50(%ebx),%eax
10f860: 8d 53 54 lea 0x54(%ebx),%edx
return -1;
jnode = next;
}
if ( jnode != NULL ) {
if ( jnode->type == IMFS_DIRECTORY ) {
if ( jnode_has_children( jnode ) )
10f863: 39 d0 cmp %edx,%eax
10f865: 74 c9 je 10f830 <IMFS_fsunmount+0x28>
jnode = jnode_get_first_child( jnode );
10f867: 89 c3 mov %eax,%ebx
}
}
} while (jnode != NULL);
10f869: 85 c0 test %eax,%eax
10f86b: 75 c3 jne 10f830 <IMFS_fsunmount+0x28> <== ALWAYS TAKEN
10f86d: 8d 76 00 lea 0x0(%esi),%esi
return 0;
10f870: 31 c0 xor %eax,%eax
}
10f872: 8d 65 f4 lea -0xc(%ebp),%esp
10f875: 5b pop %ebx
10f876: 5e pop %esi
10f877: 5f pop %edi
10f878: c9 leave
10f879: c3 ret
10f87a: 66 90 xchg %ax,%ax
next = jnode->Parent;
loc.node_access = (void *)jnode;
IMFS_Set_handlers( &loc );
if ( jnode->type != IMFS_DIRECTORY ) {
result = IMFS_unlink( NULL, &loc );
10f87c: 83 ec 08 sub $0x8,%esp
10f87f: 8d 55 d4 lea -0x2c(%ebp),%edx
10f882: 52 push %edx
if (result != 0)
return -1;
jnode = next;
} else if ( jnode_has_no_children( jnode ) ) {
result = IMFS_unlink( NULL, &loc );
10f883: 6a 00 push $0x0
10f885: e8 72 83 ff ff call 107bfc <IMFS_unlink>
if (result != 0)
10f88a: 83 c4 10 add $0x10,%esp
10f88d: 85 c0 test %eax,%eax
10f88f: 75 0d jne 10f89e <IMFS_fsunmount+0x96> <== NEVER TAKEN
return -1;
jnode = next;
10f891: 89 f3 mov %esi,%ebx
10f893: eb be jmp 10f853 <IMFS_fsunmount+0x4b>
result = IMFS_unlink( NULL, &loc );
if (result != 0)
return -1;
jnode = next;
} else if ( jnode_has_no_children( jnode ) ) {
result = IMFS_unlink( NULL, &loc );
10f895: 83 ec 08 sub $0x8,%esp
10f898: 8d 45 d4 lea -0x2c(%ebp),%eax
10f89b: 50 push %eax
10f89c: eb e5 jmp 10f883 <IMFS_fsunmount+0x7b>
if (result != 0)
return -1;
10f89e: b8 ff ff ff ff mov $0xffffffff,%eax <== NOT EXECUTED
10f8a3: eb cd jmp 10f872 <IMFS_fsunmount+0x6a> <== NOT EXECUTED
0010f914 <IMFS_get_token>:
const char *path,
int pathlen,
char *token,
int *token_len
)
{
10f914: 55 push %ebp
10f915: 89 e5 mov %esp,%ebp
10f917: 57 push %edi
10f918: 56 push %esi
10f919: 53 push %ebx
10f91a: 83 ec 1c sub $0x1c,%esp
10f91d: 8b 7d 08 mov 0x8(%ebp),%edi
10f920: 8b 5d 10 mov 0x10(%ebp),%ebx
register char c;
/*
* Copy a name into token. (Remember NULL is a token.)
*/
c = path[i];
10f923: 8a 17 mov (%edi),%dl
int pathlen,
char *token,
int *token_len
)
{
register int i = 0;
10f925: 31 f6 xor %esi,%esi
10f927: 89 7d e4 mov %edi,-0x1c(%ebp)
10f92a: 89 df mov %ebx,%edi
10f92c: 88 d3 mov %dl,%bl
/*
* Copy a name into token. (Remember NULL is a token.)
*/
c = path[i];
while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) {
10f92e: eb 07 jmp 10f937 <IMFS_get_token+0x23>
return IMFS_INVALID_TOKEN;
if ( !IMFS_is_valid_name_char(c) )
type = IMFS_INVALID_TOKEN;
c = path [++i];
10f930: 46 inc %esi
10f931: 8b 45 e4 mov -0x1c(%ebp),%eax
10f934: 8a 1c 30 mov (%eax,%esi,1),%bl
/*
* Copy a name into token. (Remember NULL is a token.)
*/
c = path[i];
while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) {
10f937: 83 ec 0c sub $0xc,%esp
10f93a: 0f be c3 movsbl %bl,%eax
10f93d: 50 push %eax
10f93e: e8 d5 95 ff ff call 108f18 <rtems_filesystem_is_separator>
10f943: 83 c4 10 add $0x10,%esp
10f946: 85 c0 test %eax,%eax
10f948: 75 1a jne 10f964 <IMFS_get_token+0x50>
10f94a: 3b 75 0c cmp 0xc(%ebp),%esi
10f94d: 7d 15 jge 10f964 <IMFS_get_token+0x50>
token[i] = c;
10f94f: 88 1c 37 mov %bl,(%edi,%esi,1)
if ( i == IMFS_NAME_MAX )
10f952: 83 fe 20 cmp $0x20,%esi
10f955: 75 d9 jne 10f930 <IMFS_get_token+0x1c>
return IMFS_INVALID_TOKEN;
10f957: b8 04 00 00 00 mov $0x4,%eax
else if ( strcmp( token, "." ) == 0 )
type = IMFS_CURRENT_DIR;
}
return type;
}
10f95c: 8d 65 f4 lea -0xc(%ebp),%esp
10f95f: 5b pop %ebx
10f960: 5e pop %esi
10f961: 5f pop %edi
10f962: c9 leave
10f963: c3 ret
10f964: 88 da mov %bl,%dl
10f966: 89 fb mov %edi,%ebx
/*
* Copy a seperator into token.
*/
if ( i == 0 ) {
10f968: 85 f6 test %esi,%esi
10f96a: 75 25 jne 10f991 <IMFS_get_token+0x7d>
token[i] = c;
10f96c: 88 17 mov %dl,(%edi)
if ( (token[i] != '\0') && pathlen ) {
10f96e: 84 d2 test %dl,%dl
10f970: 74 16 je 10f988 <IMFS_get_token+0x74>
10f972: 8b 45 0c mov 0xc(%ebp),%eax
10f975: 85 c0 test %eax,%eax
10f977: 74 0f je 10f988 <IMFS_get_token+0x74>
i++;
type = IMFS_CURRENT_DIR;
10f979: b8 01 00 00 00 mov $0x1,%eax
if ( i == 0 ) {
token[i] = c;
if ( (token[i] != '\0') && pathlen ) {
i++;
10f97e: be 01 00 00 00 mov $0x1,%esi
10f983: eb 05 jmp 10f98a <IMFS_get_token+0x76>
10f985: 8d 76 00 lea 0x0(%esi),%esi
type = IMFS_CURRENT_DIR;
} else {
type = IMFS_NO_MORE_PATH;
10f988: 31 c0 xor %eax,%eax
/*
* Set token_len to the number of characters copied.
*/
*token_len = i;
10f98a: 8b 55 14 mov 0x14(%ebp),%edx
10f98d: 89 32 mov %esi,(%edx)
10f98f: eb cb jmp 10f95c <IMFS_get_token+0x48>
i++;
type = IMFS_CURRENT_DIR;
} else {
type = IMFS_NO_MORE_PATH;
}
} else if (token[ i-1 ] != '\0') {
10f991: 80 7c 37 ff 00 cmpb $0x0,-0x1(%edi,%esi,1)
10f996: 74 04 je 10f99c <IMFS_get_token+0x88> <== NEVER TAKEN
token[i] = '\0';
10f998: c6 04 37 00 movb $0x0,(%edi,%esi,1)
/*
* Set token_len to the number of characters copied.
*/
*token_len = i;
10f99c: 8b 45 14 mov 0x14(%ebp),%eax
10f99f: 89 30 mov %esi,(%eax)
* If we copied something that was not a seperator see if
* it was a special name.
*/
if ( type == IMFS_NAME ) {
if ( strcmp( token, "..") == 0 )
10f9a1: bf b5 18 12 00 mov $0x1218b5,%edi
10f9a6: b9 03 00 00 00 mov $0x3,%ecx
10f9ab: 89 de mov %ebx,%esi
10f9ad: f3 a6 repz cmpsb %es:(%edi),%ds:(%esi)
10f9af: 75 0f jne 10f9c0 <IMFS_get_token+0xac>
type = IMFS_UP_DIR;
10f9b1: b8 02 00 00 00 mov $0x2,%eax
else if ( strcmp( token, "." ) == 0 )
type = IMFS_CURRENT_DIR;
}
return type;
}
10f9b6: 8d 65 f4 lea -0xc(%ebp),%esp
10f9b9: 5b pop %ebx
10f9ba: 5e pop %esi
10f9bb: 5f pop %edi
10f9bc: c9 leave
10f9bd: c3 ret
10f9be: 66 90 xchg %ax,%ax
*/
if ( type == IMFS_NAME ) {
if ( strcmp( token, "..") == 0 )
type = IMFS_UP_DIR;
else if ( strcmp( token, "." ) == 0 )
10f9c0: bf b6 18 12 00 mov $0x1218b6,%edi
10f9c5: b9 02 00 00 00 mov $0x2,%ecx
10f9ca: 89 de mov %ebx,%esi
10f9cc: f3 a6 repz cmpsb %es:(%edi),%ds:(%esi)
10f9ce: 0f 97 c0 seta %al
10f9d1: 0f 92 c2 setb %dl
10f9d4: 28 d0 sub %dl,%al
10f9d6: 0f be c0 movsbl %al,%eax
10f9d9: 83 f8 01 cmp $0x1,%eax
10f9dc: 19 c0 sbb %eax,%eax
10f9de: 83 e0 fe and $0xfffffffe,%eax
10f9e1: 83 c0 03 add $0x3,%eax
type = IMFS_CURRENT_DIR;
}
return type;
}
10f9e4: 8d 65 f4 lea -0xc(%ebp),%esp
10f9e7: 5b pop %ebx
10f9e8: 5e pop %esi
10f9e9: 5f pop %edi
10f9ea: c9 leave
10f9eb: c3 ret
00107844 <IMFS_initialize_support>:
const rtems_filesystem_operations_table *op_table,
const rtems_filesystem_file_handlers_r *memfile_handlers,
const rtems_filesystem_file_handlers_r *directory_handlers,
const rtems_filesystem_file_handlers_r *fifo_handlers
)
{
107844: 55 push %ebp
107845: 89 e5 mov %esp,%ebp
107847: 57 push %edi
107848: 56 push %esi
107849: 53 push %ebx
10784a: 83 ec 1c sub $0x1c,%esp
10784d: 8b 5d 08 mov 0x8(%ebp),%ebx
IMFS_jnode_t *jnode;
/*
* determine/check value for imfs_memfile_bytes_per_block
*/
IMFS_determine_bytes_per_block(&imfs_memfile_bytes_per_block,
107850: 8b 0d 30 3a 12 00 mov 0x123a30,%ecx
/*
* check, whether requested bytes per block is valid
*/
for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) {
if (bit_mask == requested_bytes_per_block) {
107856: 83 f9 10 cmp $0x10,%ecx
107859: 74 1f je 10787a <IMFS_initialize_support+0x36>
is_valid = true;
break;
}
if(bit_mask > requested_bytes_per_block)
10785b: 83 f9 0f cmp $0xf,%ecx
10785e: 7e 15 jle 107875 <IMFS_initialize_support+0x31>
107860: ba 05 00 00 00 mov $0x5,%edx
107865: b8 20 00 00 00 mov $0x20,%eax
/*
* check, whether requested bytes per block is valid
*/
for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) {
if (bit_mask == requested_bytes_per_block) {
10786a: 39 c1 cmp %eax,%ecx
10786c: 74 0c je 10787a <IMFS_initialize_support+0x36>
is_valid = true;
break;
}
if(bit_mask > requested_bytes_per_block)
10786e: 7c 05 jl 107875 <IMFS_initialize_support+0x31><== NEVER TAKEN
int bit_mask;
/*
* check, whether requested bytes per block is valid
*/
for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) {
107870: d1 e0 shl %eax
107872: 4a dec %edx
107873: 75 f5 jne 10786a <IMFS_initialize_support+0x26><== ALWAYS TAKEN
if(bit_mask > requested_bytes_per_block)
break;
}
*dest_bytes_per_block = ((is_valid)
? requested_bytes_per_block
: default_bytes_per_block);
107875: b9 80 00 00 00 mov $0x80,%ecx
break;
}
if(bit_mask > requested_bytes_per_block)
break;
}
*dest_bytes_per_block = ((is_valid)
10787a: 89 0d 80 79 12 00 mov %ecx,0x127980
/*
* Create the root node
*
* NOTE: UNIX root is 755 and owned by root/root (0/0).
*/
temp_mt_entry->mt_fs_root.node_access = IMFS_create_root_node();
107880: e8 ff 77 00 00 call 10f084 <IMFS_create_root_node>
107885: 89 c2 mov %eax,%edx
107887: 89 43 1c mov %eax,0x1c(%ebx)
temp_mt_entry->mt_fs_root.handlers = directory_handlers;
10788a: 8b 45 14 mov 0x14(%ebp),%eax
10788d: 89 43 24 mov %eax,0x24(%ebx)
temp_mt_entry->mt_fs_root.ops = op_table;
107890: 8b 45 0c mov 0xc(%ebp),%eax
107893: 89 43 28 mov %eax,0x28(%ebx)
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
107896: 8d 7b 38 lea 0x38(%ebx),%edi
107899: be 60 18 12 00 mov $0x121860,%esi
10789e: b9 0c 00 00 00 mov $0xc,%ecx
1078a3: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/*
* Create custom file system data.
*/
fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) );
1078a5: 83 ec 08 sub $0x8,%esp
1078a8: 6a 14 push $0x14
1078aa: 6a 01 push $0x1
1078ac: 89 55 e4 mov %edx,-0x1c(%ebp)
1078af: e8 70 06 00 00 call 107f24 <calloc>
if ( !fs_info ) {
1078b4: 83 c4 10 add $0x10,%esp
1078b7: 85 c0 test %eax,%eax
1078b9: 8b 55 e4 mov -0x1c(%ebp),%edx
1078bc: 74 3c je 1078fa <IMFS_initialize_support+0xb6>
free(temp_mt_entry->mt_fs_root.node_access);
rtems_set_errno_and_return_minus_one(ENOMEM);
}
temp_mt_entry->fs_info = fs_info;
1078be: 89 43 34 mov %eax,0x34(%ebx)
/*
* Set st_ino for the root to 1.
*/
fs_info->instance = imfs_instance++;
1078c1: 8b 0d 84 79 12 00 mov 0x127984,%ecx
1078c7: 89 08 mov %ecx,(%eax)
1078c9: 41 inc %ecx
1078ca: 89 0d 84 79 12 00 mov %ecx,0x127984
fs_info->ino_count = 1;
1078d0: c7 40 04 01 00 00 00 movl $0x1,0x4(%eax)
fs_info->memfile_handlers = memfile_handlers;
1078d7: 8b 4d 10 mov 0x10(%ebp),%ecx
1078da: 89 48 08 mov %ecx,0x8(%eax)
fs_info->directory_handlers = directory_handlers;
1078dd: 8b 4d 14 mov 0x14(%ebp),%ecx
1078e0: 89 48 0c mov %ecx,0xc(%eax)
fs_info->fifo_handlers = fifo_handlers;
1078e3: 8b 4d 18 mov 0x18(%ebp),%ecx
1078e6: 89 48 10 mov %ecx,0x10(%eax)
jnode = temp_mt_entry->mt_fs_root.node_access;
jnode->st_ino = fs_info->ino_count;
1078e9: c7 42 38 01 00 00 00 movl $0x1,0x38(%edx)
return 0;
1078f0: 31 c0 xor %eax,%eax
}
1078f2: 8d 65 f4 lea -0xc(%ebp),%esp
1078f5: 5b pop %ebx
1078f6: 5e pop %esi
1078f7: 5f pop %edi
1078f8: c9 leave
1078f9: c3 ret
/*
* Create custom file system data.
*/
fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) );
if ( !fs_info ) {
free(temp_mt_entry->mt_fs_root.node_access);
1078fa: 83 ec 0c sub $0xc,%esp
1078fd: 52 push %edx
1078fe: e8 b1 07 00 00 call 1080b4 <free>
rtems_set_errno_and_return_minus_one(ENOMEM);
107903: e8 0c ba 00 00 call 113314 <__errno>
107908: c7 00 0c 00 00 00 movl $0xc,(%eax)
10790e: 83 c4 10 add $0x10,%esp
107911: 83 c8 ff or $0xffffffff,%eax
107914: eb dc jmp 1078f2 <IMFS_initialize_support+0xae>
00107918 <IMFS_link>:
int IMFS_link(
rtems_filesystem_location_info_t *to_loc, /* IN */
rtems_filesystem_location_info_t *parent_loc, /* IN */
const char *token /* IN */
)
{
107918: 55 push %ebp
107919: 89 e5 mov %esp,%ebp
10791b: 57 push %edi
10791c: 53 push %ebx
10791d: 83 ec 50 sub $0x50,%esp
107920: 8b 55 10 mov 0x10(%ebp),%edx
int i;
/*
* Verify this node can be linked to.
*/
info.hard_link.link_node = to_loc->node_access;
107923: 8b 45 08 mov 0x8(%ebp),%eax
107926: 8b 00 mov (%eax),%eax
107928: 89 45 d8 mov %eax,-0x28(%ebp)
if ( info.hard_link.link_node->st_nlink >= LINK_MAX )
10792b: 66 83 78 34 07 cmpw $0x7,0x34(%eax)
107930: 77 66 ja 107998 <IMFS_link+0x80>
rtems_set_errno_and_return_minus_one( EMLINK );
/*
* Remove any separators at the end of the string.
*/
IMFS_get_token( token, strlen( token ), new_name, &i );
107932: 31 c0 xor %eax,%eax
107934: b9 ff ff ff ff mov $0xffffffff,%ecx
107939: 89 d7 mov %edx,%edi
10793b: f2 ae repnz scas %es:(%edi),%al
10793d: f7 d1 not %ecx
10793f: 49 dec %ecx
107940: 8d 45 f4 lea -0xc(%ebp),%eax
107943: 50 push %eax
107944: 8d 5d b7 lea -0x49(%ebp),%ebx
107947: 53 push %ebx
107948: 51 push %ecx
107949: 52 push %edx
10794a: e8 c5 7f 00 00 call 10f914 <IMFS_get_token>
new_node = IMFS_create_node(
parent_loc,
IMFS_HARD_LINK,
new_name,
( S_IFLNK | ( S_IRWXU | S_IRWXG | S_IRWXO )),
&info
10794f: 8d 45 d8 lea -0x28(%ebp),%eax
* was ONLY passed a NULL when we created the root node. We
* added a new IMFS_create_root_node() so this path no longer
* existed. The result was simpler code which should not have
* this path.
*/
new_node = IMFS_create_node(
107952: 89 04 24 mov %eax,(%esp)
107955: 68 ff a1 00 00 push $0xa1ff
10795a: 53 push %ebx
10795b: 6a 03 push $0x3
10795d: ff 75 0c pushl 0xc(%ebp)
107960: e8 e7 75 00 00 call 10ef4c <IMFS_create_node>
new_name,
( S_IFLNK | ( S_IRWXU | S_IRWXG | S_IRWXO )),
&info
);
if ( !new_node )
107965: 83 c4 20 add $0x20,%esp
107968: 85 c0 test %eax,%eax
10796a: 74 3e je 1079aa <IMFS_link+0x92>
rtems_set_errno_and_return_minus_one( ENOMEM );
/*
* Increment the link count of the node being pointed to.
*/
info.hard_link.link_node->st_nlink++;
10796c: 8b 45 d8 mov -0x28(%ebp),%eax
10796f: 66 ff 40 34 incw 0x34(%eax)
IMFS_update_ctime( info.hard_link.link_node );
107973: 83 ec 08 sub $0x8,%esp
107976: 6a 00 push $0x0
107978: 8d 45 ec lea -0x14(%ebp),%eax
10797b: 50 push %eax
10797c: e8 af 07 00 00 call 108130 <gettimeofday>
107981: 8b 55 ec mov -0x14(%ebp),%edx
107984: 8b 45 d8 mov -0x28(%ebp),%eax
107987: 89 50 48 mov %edx,0x48(%eax)
return 0;
10798a: 83 c4 10 add $0x10,%esp
10798d: 31 c0 xor %eax,%eax
}
10798f: 8d 65 f8 lea -0x8(%ebp),%esp
107992: 5b pop %ebx
107993: 5f pop %edi
107994: c9 leave
107995: c3 ret
107996: 66 90 xchg %ax,%ax
/*
* Verify this node can be linked to.
*/
info.hard_link.link_node = to_loc->node_access;
if ( info.hard_link.link_node->st_nlink >= LINK_MAX )
rtems_set_errno_and_return_minus_one( EMLINK );
107998: e8 77 b9 00 00 call 113314 <__errno>
10799d: c7 00 1f 00 00 00 movl $0x1f,(%eax)
1079a3: b8 ff ff ff ff mov $0xffffffff,%eax
1079a8: eb e5 jmp 10798f <IMFS_link+0x77>
( S_IFLNK | ( S_IRWXU | S_IRWXG | S_IRWXO )),
&info
);
if ( !new_node )
rtems_set_errno_and_return_minus_one( ENOMEM );
1079aa: e8 65 b9 00 00 call 113314 <__errno>
1079af: c7 00 0c 00 00 00 movl $0xc,(%eax)
1079b5: b8 ff ff ff ff mov $0xffffffff,%eax
1079ba: eb d3 jmp 10798f <IMFS_link+0x77>
00111e6c <IMFS_memfile_addblock>:
*/
MEMFILE_STATIC int IMFS_memfile_addblock(
IMFS_jnode_t *the_jnode,
unsigned int block
)
{
111e6c: 55 push %ebp
111e6d: 89 e5 mov %esp,%ebp
111e6f: 53 push %ebx
111e70: 83 ec 08 sub $0x8,%esp
IMFS_assert( the_jnode->type == IMFS_MEMORY_FILE );
/*
* Obtain the pointer for the specified block number
*/
block_entry_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 1 );
111e73: 6a 01 push $0x1
111e75: ff 75 0c pushl 0xc(%ebp)
111e78: ff 75 08 pushl 0x8(%ebp)
111e7b: e8 28 fc ff ff call 111aa8 <IMFS_memfile_get_block_pointer>
111e80: 89 c3 mov %eax,%ebx
if ( *block_entry_ptr )
111e82: 83 c4 10 add $0x10,%esp
111e85: 8b 00 mov (%eax),%eax
111e87: 85 c0 test %eax,%eax
111e89: 74 09 je 111e94 <IMFS_memfile_addblock+0x28>
return 0;
111e8b: 31 c0 xor %eax,%eax
if ( !memory )
return 1;
*block_entry_ptr = memory;
return 0;
}
111e8d: 8b 5d fc mov -0x4(%ebp),%ebx
111e90: c9 leave
111e91: c3 ret
111e92: 66 90 xchg %ax,%ax
return 0;
/*
* There is no memory for this block number so allocate it.
*/
memory = memfile_alloc_block();
111e94: e8 eb fb ff ff call 111a84 <memfile_alloc_block>
if ( !memory )
111e99: 85 c0 test %eax,%eax
111e9b: 74 07 je 111ea4 <IMFS_memfile_addblock+0x38>
return 1;
*block_entry_ptr = memory;
111e9d: 89 03 mov %eax,(%ebx)
return 0;
111e9f: 31 c0 xor %eax,%eax
111ea1: eb ea jmp 111e8d <IMFS_memfile_addblock+0x21>
111ea3: 90 nop
/*
* There is no memory for this block number so allocate it.
*/
memory = memfile_alloc_block();
if ( !memory )
return 1;
111ea4: b8 01 00 00 00 mov $0x1,%eax
111ea9: eb e2 jmp 111e8d <IMFS_memfile_addblock+0x21>
001120ac <IMFS_memfile_extend>:
*/
MEMFILE_STATIC int IMFS_memfile_extend(
IMFS_jnode_t *the_jnode,
off_t new_length
)
{
1120ac: 55 push %ebp
1120ad: 89 e5 mov %esp,%ebp
1120af: 57 push %edi
1120b0: 56 push %esi
1120b1: 53 push %ebx
1120b2: 83 ec 2c sub $0x2c,%esp
1120b5: 8b 5d 08 mov 0x8(%ebp),%ebx
1120b8: 8b 45 0c mov 0xc(%ebp),%eax
1120bb: 8b 55 10 mov 0x10(%ebp),%edx
1120be: 89 45 d8 mov %eax,-0x28(%ebp)
1120c1: 89 55 dc mov %edx,-0x24(%ebp)
IMFS_assert( the_jnode->type == IMFS_MEMORY_FILE );
/*
* Verify new file size is supported
*/
if ( new_length >= IMFS_MEMFILE_MAXIMUM_SIZE )
1120c4: a1 80 79 12 00 mov 0x127980,%eax
1120c9: 89 c1 mov %eax,%ecx
1120cb: c1 e9 02 shr $0x2,%ecx
1120ce: 8d 51 01 lea 0x1(%ecx),%edx
1120d1: 0f af d1 imul %ecx,%edx
1120d4: 42 inc %edx
1120d5: 0f af d1 imul %ecx,%edx
1120d8: 4a dec %edx
1120d9: 0f af d0 imul %eax,%edx
1120dc: 31 c9 xor %ecx,%ecx
1120de: 3b 4d dc cmp -0x24(%ebp),%ecx
1120e1: 7f 1a jg 1120fd <IMFS_memfile_extend+0x51><== NEVER TAKEN
1120e3: 7d 13 jge 1120f8 <IMFS_memfile_extend+0x4c><== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
1120e5: e8 2a 12 00 00 call 113314 <__errno>
1120ea: c7 00 16 00 00 00 movl $0x16,(%eax)
1120f0: b8 ff ff ff ff mov $0xffffffff,%eax
1120f5: eb 19 jmp 112110 <IMFS_memfile_extend+0x64>
1120f7: 90 nop
IMFS_assert( the_jnode->type == IMFS_MEMORY_FILE );
/*
* Verify new file size is supported
*/
if ( new_length >= IMFS_MEMFILE_MAXIMUM_SIZE )
1120f8: 3b 55 d8 cmp -0x28(%ebp),%edx
1120fb: 76 e8 jbe 1120e5 <IMFS_memfile_extend+0x39>
rtems_set_errno_and_return_minus_one( EINVAL );
/*
* Verify new file size is actually larger than current size
*/
if ( new_length <= the_jnode->info.file.size )
1120fd: 8b 53 50 mov 0x50(%ebx),%edx
112100: 8b 4b 54 mov 0x54(%ebx),%ecx
112103: 89 55 e0 mov %edx,-0x20(%ebp)
112106: 89 4d e4 mov %ecx,-0x1c(%ebp)
112109: 39 4d dc cmp %ecx,-0x24(%ebp)
11210c: 7d 0a jge 112118 <IMFS_memfile_extend+0x6c><== ALWAYS TAKEN
return 0;
11210e: 31 c0 xor %eax,%eax
/*
* Set the new length of the file.
*/
the_jnode->info.file.size = new_length;
return 0;
}
112110: 8d 65 f4 lea -0xc(%ebp),%esp
112113: 5b pop %ebx
112114: 5e pop %esi
112115: 5f pop %edi
112116: c9 leave
112117: c3 ret
rtems_set_errno_and_return_minus_one( EINVAL );
/*
* Verify new file size is actually larger than current size
*/
if ( new_length <= the_jnode->info.file.size )
112118: 7f 05 jg 11211f <IMFS_memfile_extend+0x73><== NEVER TAKEN
11211a: 39 55 d8 cmp %edx,-0x28(%ebp)
11211d: 76 ef jbe 11210e <IMFS_memfile_extend+0x62>
return 0;
/*
* Calculate the number of range of blocks to allocate
*/
new_blocks = new_length / IMFS_MEMFILE_BYTES_PER_BLOCK;
11211f: 89 45 d0 mov %eax,-0x30(%ebp)
112122: 89 c1 mov %eax,%ecx
112124: c1 f9 1f sar $0x1f,%ecx
112127: 89 4d d4 mov %ecx,-0x2c(%ebp)
11212a: ff 75 d4 pushl -0x2c(%ebp)
11212d: ff 75 d0 pushl -0x30(%ebp)
112130: ff 75 dc pushl -0x24(%ebp)
112133: ff 75 d8 pushl -0x28(%ebp)
112136: e8 e5 c9 00 00 call 11eb20 <__divdi3>
11213b: 83 c4 10 add $0x10,%esp
11213e: 89 c6 mov %eax,%esi
old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK;
112140: ff 75 d4 pushl -0x2c(%ebp)
112143: ff 75 d0 pushl -0x30(%ebp)
112146: ff 75 e4 pushl -0x1c(%ebp)
112149: ff 75 e0 pushl -0x20(%ebp)
11214c: e8 cf c9 00 00 call 11eb20 <__divdi3>
112151: 83 c4 10 add $0x10,%esp
112154: 89 45 e0 mov %eax,-0x20(%ebp)
/*
* Now allocate each of those blocks.
*/
for ( block=old_blocks ; block<=new_blocks ; block++ ) {
112157: 39 c6 cmp %eax,%esi
112159: 72 51 jb 1121ac <IMFS_memfile_extend+0x100><== NEVER TAKEN
11215b: 89 c7 mov %eax,%edi
11215d: eb 06 jmp 112165 <IMFS_memfile_extend+0xb9>
11215f: 90 nop
112160: 47 inc %edi
112161: 39 fe cmp %edi,%esi
112163: 72 47 jb 1121ac <IMFS_memfile_extend+0x100>
if ( IMFS_memfile_addblock( the_jnode, block ) ) {
112165: 83 ec 08 sub $0x8,%esp
112168: 57 push %edi
112169: 53 push %ebx
11216a: e8 fd fc ff ff call 111e6c <IMFS_memfile_addblock>
11216f: 83 c4 10 add $0x10,%esp
112172: 85 c0 test %eax,%eax
112174: 74 ea je 112160 <IMFS_memfile_extend+0xb4>
for ( ; block>=old_blocks ; block-- ) {
112176: 39 7d e0 cmp %edi,-0x20(%ebp)
112179: 77 17 ja 112192 <IMFS_memfile_extend+0xe6><== NEVER TAKEN
11217b: 8b 75 e0 mov -0x20(%ebp),%esi
11217e: 66 90 xchg %ax,%ax
IMFS_memfile_remove_block( the_jnode, block );
112180: 83 ec 08 sub $0x8,%esp
112183: 57 push %edi
112184: 53 push %ebx
112185: e8 f6 fe ff ff call 112080 <IMFS_memfile_remove_block>
/*
* Now allocate each of those blocks.
*/
for ( block=old_blocks ; block<=new_blocks ; block++ ) {
if ( IMFS_memfile_addblock( the_jnode, block ) ) {
for ( ; block>=old_blocks ; block-- ) {
11218a: 4f dec %edi
11218b: 83 c4 10 add $0x10,%esp
11218e: 39 fe cmp %edi,%esi
112190: 76 ee jbe 112180 <IMFS_memfile_extend+0xd4>
IMFS_memfile_remove_block( the_jnode, block );
}
rtems_set_errno_and_return_minus_one( ENOSPC );
112192: e8 7d 11 00 00 call 113314 <__errno>
112197: c7 00 1c 00 00 00 movl $0x1c,(%eax)
11219d: b8 ff ff ff ff mov $0xffffffff,%eax
/*
* Set the new length of the file.
*/
the_jnode->info.file.size = new_length;
return 0;
}
1121a2: 8d 65 f4 lea -0xc(%ebp),%esp
1121a5: 5b pop %ebx
1121a6: 5e pop %esi
1121a7: 5f pop %edi
1121a8: c9 leave
1121a9: c3 ret
1121aa: 66 90 xchg %ax,%ax
}
/*
* Set the new length of the file.
*/
the_jnode->info.file.size = new_length;
1121ac: 8b 45 d8 mov -0x28(%ebp),%eax
1121af: 8b 55 dc mov -0x24(%ebp),%edx
1121b2: 89 43 50 mov %eax,0x50(%ebx)
1121b5: 89 53 54 mov %edx,0x54(%ebx)
return 0;
1121b8: 31 c0 xor %eax,%eax
}
1121ba: 8d 65 f4 lea -0xc(%ebp),%esp
1121bd: 5b pop %ebx
1121be: 5e pop %esi
1121bf: 5f pop %edi
1121c0: c9 leave
1121c1: c3 ret
00111aa8 <IMFS_memfile_get_block_pointer>:
#endif
IMFS_jnode_t *the_jnode,
unsigned int block,
int malloc_it
)
{
111aa8: 55 push %ebp
111aa9: 89 e5 mov %esp,%ebp
111aab: 57 push %edi
111aac: 56 push %esi
111aad: 53 push %ebx
111aae: 83 ec 1c sub $0x1c,%esp
111ab1: 8b 5d 08 mov 0x8(%ebp),%ebx
111ab4: 8b 75 0c mov 0xc(%ebp),%esi
111ab7: 8b 7d 10 mov 0x10(%ebp),%edi
my_block = block;
/*
* Is the block number in the simple indirect portion?
*/
if ( my_block <= LAST_INDIRECT ) {
111aba: 8b 0d 80 79 12 00 mov 0x127980,%ecx
111ac0: c1 e9 02 shr $0x2,%ecx
111ac3: 8d 41 ff lea -0x1(%ecx),%eax
111ac6: 39 c6 cmp %eax,%esi
111ac8: 77 1a ja 111ae4 <IMFS_memfile_get_block_pointer+0x3c>
p = info->indirect;
111aca: 8b 43 58 mov 0x58(%ebx),%eax
if ( malloc_it ) {
111acd: 85 ff test %edi,%edi
111acf: 74 53 je 111b24 <IMFS_memfile_get_block_pointer+0x7c>
if ( !p ) {
111ad1: 85 c0 test %eax,%eax
111ad3: 0f 84 b6 00 00 00 je 111b8f <IMFS_memfile_get_block_pointer+0xe7>
}
if ( !p )
return 0;
return &info->indirect[ my_block ];
111ad9: 8d 04 b0 lea (%eax,%esi,4),%eax
/*
* This means the requested block number is out of range.
*/
return 0;
}
111adc: 83 c4 1c add $0x1c,%esp
111adf: 5b pop %ebx
111ae0: 5e pop %esi
111ae1: 5f pop %edi
111ae2: c9 leave
111ae3: c3 ret
/*
* Is the block number in the doubly indirect portion?
*/
if ( my_block <= LAST_DOUBLY_INDIRECT ) {
111ae4: 8d 41 01 lea 0x1(%ecx),%eax
111ae7: 0f af c1 imul %ecx,%eax
111aea: 8d 50 ff lea -0x1(%eax),%edx
111aed: 39 d6 cmp %edx,%esi
111aef: 77 3b ja 111b2c <IMFS_memfile_get_block_pointer+0x84>
my_block -= FIRST_DOUBLY_INDIRECT;
111af1: 29 ce sub %ecx,%esi
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
111af3: 89 f0 mov %esi,%eax
111af5: 31 d2 xor %edx,%edx
111af7: f7 f1 div %ecx
111af9: 89 c6 mov %eax,%esi
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
p = info->doubly_indirect;
111afb: 8b 43 5c mov 0x5c(%ebx),%eax
if ( malloc_it ) {
111afe: 85 ff test %edi,%edi
111b00: 74 7e je 111b80 <IMFS_memfile_get_block_pointer+0xd8>
if ( !p ) {
111b02: 85 c0 test %eax,%eax
111b04: 0f 84 96 00 00 00 je 111ba0 <IMFS_memfile_get_block_pointer+0xf8>
if ( !p )
return 0;
info->doubly_indirect = p;
}
p1 = (block_p *)p[ doubly ];
111b0a: 8d 1c b0 lea (%eax,%esi,4),%ebx
111b0d: 8b 03 mov (%ebx),%eax
if ( !p1 ) {
111b0f: 85 c0 test %eax,%eax
111b11: 0f 84 a4 00 00 00 je 111bbb <IMFS_memfile_get_block_pointer+0x113>
p = (block_p *)p[ doubly ];
if ( !p )
return 0;
return (block_p *)&p[ singly ];
111b17: 8d 04 90 lea (%eax,%edx,4),%eax
/*
* This means the requested block number is out of range.
*/
return 0;
}
111b1a: 83 c4 1c add $0x1c,%esp
111b1d: 5b pop %ebx
111b1e: 5e pop %esi
111b1f: 5f pop %edi
111b20: c9 leave
111b21: c3 ret
111b22: 66 90 xchg %ax,%ax
info->indirect = p;
}
return &info->indirect[ my_block ];
}
if ( !p )
111b24: 85 c0 test %eax,%eax
111b26: 75 b1 jne 111ad9 <IMFS_memfile_get_block_pointer+0x31><== ALWAYS TAKEN
if ( !p )
return 0;
p1 = (block_p *) p[ triply ];
if ( !p1 )
return 0;
111b28: 31 c0 xor %eax,%eax
111b2a: eb ee jmp 111b1a <IMFS_memfile_get_block_pointer+0x72><== NOT EXECUTED
}
/*
* Is the block number in the triply indirect portion?
*/
if ( my_block <= LAST_TRIPLY_INDIRECT ) {
111b2c: 8d 50 01 lea 0x1(%eax),%edx
111b2f: 0f af d1 imul %ecx,%edx
111b32: 4a dec %edx
111b33: 39 d6 cmp %edx,%esi
111b35: 77 f1 ja 111b28 <IMFS_memfile_get_block_pointer+0x80><== NEVER TAKEN
my_block -= FIRST_TRIPLY_INDIRECT;
111b37: 29 c6 sub %eax,%esi
111b39: 89 f0 mov %esi,%eax
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
111b3b: 31 d2 xor %edx,%edx
111b3d: f7 f1 div %ecx
111b3f: 89 55 e4 mov %edx,-0x1c(%ebp)
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS;
111b42: 31 d2 xor %edx,%edx
111b44: f7 f1 div %ecx
111b46: 89 c6 mov %eax,%esi
doubly %= IMFS_MEMFILE_BLOCK_SLOTS;
p = info->triply_indirect;
111b48: 8b 4b 60 mov 0x60(%ebx),%ecx
if ( malloc_it ) {
111b4b: 85 ff test %edi,%edi
111b4d: 0f 84 82 00 00 00 je 111bd5 <IMFS_memfile_get_block_pointer+0x12d>
if ( !p ) {
111b53: 85 c9 test %ecx,%ecx
111b55: 0f 84 9b 00 00 00 je 111bf6 <IMFS_memfile_get_block_pointer+0x14e>
if ( !p )
return 0;
info->triply_indirect = p;
}
p1 = (block_p *) p[ triply ];
111b5b: 8d 1c b1 lea (%ecx,%esi,4),%ebx
111b5e: 8b 0b mov (%ebx),%ecx
if ( !p1 ) {
111b60: 85 c9 test %ecx,%ecx
111b62: 0f 84 c5 00 00 00 je 111c2d <IMFS_memfile_get_block_pointer+0x185>
if ( !p1 )
return 0;
p[ triply ] = (block_p) p1;
}
p2 = (block_p *)p1[ doubly ];
111b68: 8d 1c 91 lea (%ecx,%edx,4),%ebx
111b6b: 8b 13 mov (%ebx),%edx
if ( !p2 ) {
111b6d: 85 d2 test %edx,%edx
111b6f: 0f 84 a0 00 00 00 je 111c15 <IMFS_memfile_get_block_pointer+0x16d>
p2 = (block_p *)p1[ doubly ];
if ( !p2 )
return 0;
return (block_p *)&p2[ singly ];
111b75: 8b 4d e4 mov -0x1c(%ebp),%ecx
111b78: 8d 04 8a lea (%edx,%ecx,4),%eax
111b7b: eb 9d jmp 111b1a <IMFS_memfile_get_block_pointer+0x72>
111b7d: 8d 76 00 lea 0x0(%esi),%esi
}
return (block_p *)&p1[ singly ];
}
if ( !p )
111b80: 85 c0 test %eax,%eax
111b82: 74 a4 je 111b28 <IMFS_memfile_get_block_pointer+0x80><== NEVER TAKEN
return 0;
p = (block_p *)p[ doubly ];
111b84: 8b 04 b0 mov (%eax,%esi,4),%eax
if ( !p )
111b87: 85 c0 test %eax,%eax
111b89: 75 8c jne 111b17 <IMFS_memfile_get_block_pointer+0x6f><== ALWAYS TAKEN
if ( !p )
return 0;
p1 = (block_p *) p[ triply ];
if ( !p1 )
return 0;
111b8b: 31 c0 xor %eax,%eax
111b8d: eb 8b jmp 111b1a <IMFS_memfile_get_block_pointer+0x72><== NOT EXECUTED
p = info->indirect;
if ( malloc_it ) {
if ( !p ) {
p = memfile_alloc_block();
111b8f: e8 f0 fe ff ff call 111a84 <memfile_alloc_block>
if ( !p )
111b94: 85 c0 test %eax,%eax
111b96: 74 90 je 111b28 <IMFS_memfile_get_block_pointer+0x80><== NEVER TAKEN
return 0;
info->indirect = p;
111b98: 89 43 58 mov %eax,0x58(%ebx)
111b9b: e9 39 ff ff ff jmp 111ad9 <IMFS_memfile_get_block_pointer+0x31>
p = info->doubly_indirect;
if ( malloc_it ) {
if ( !p ) {
p = memfile_alloc_block();
111ba0: 89 55 e0 mov %edx,-0x20(%ebp)
111ba3: e8 dc fe ff ff call 111a84 <memfile_alloc_block>
if ( !p )
111ba8: 85 c0 test %eax,%eax
111baa: 8b 55 e0 mov -0x20(%ebp),%edx
111bad: 0f 84 75 ff ff ff je 111b28 <IMFS_memfile_get_block_pointer+0x80><== NEVER TAKEN
return 0;
info->doubly_indirect = p;
111bb3: 89 43 5c mov %eax,0x5c(%ebx)
111bb6: e9 4f ff ff ff jmp 111b0a <IMFS_memfile_get_block_pointer+0x62>
}
p1 = (block_p *)p[ doubly ];
if ( !p1 ) {
p1 = memfile_alloc_block();
111bbb: 89 55 e0 mov %edx,-0x20(%ebp)
111bbe: e8 c1 fe ff ff call 111a84 <memfile_alloc_block>
if ( !p1 )
111bc3: 85 c0 test %eax,%eax
111bc5: 8b 55 e0 mov -0x20(%ebp),%edx
111bc8: 0f 84 5a ff ff ff je 111b28 <IMFS_memfile_get_block_pointer+0x80><== NEVER TAKEN
return 0;
p[ doubly ] = (block_p) p1;
111bce: 89 03 mov %eax,(%ebx)
111bd0: e9 42 ff ff ff jmp 111b17 <IMFS_memfile_get_block_pointer+0x6f>
p1[ doubly ] = (block_p) p2;
}
return (block_p *)&p2[ singly ];
}
if ( !p )
111bd5: 85 c9 test %ecx,%ecx
111bd7: 0f 84 4b ff ff ff je 111b28 <IMFS_memfile_get_block_pointer+0x80><== NEVER TAKEN
return 0;
p1 = (block_p *) p[ triply ];
111bdd: 8b 04 81 mov (%ecx,%eax,4),%eax
if ( !p1 )
111be0: 85 c0 test %eax,%eax
111be2: 0f 84 40 ff ff ff je 111b28 <IMFS_memfile_get_block_pointer+0x80><== NEVER TAKEN
return 0;
p2 = (block_p *)p1[ doubly ];
111be8: 8b 14 90 mov (%eax,%edx,4),%edx
if ( !p2 )
return 0;
111beb: 31 c0 xor %eax,%eax
p1 = (block_p *) p[ triply ];
if ( !p1 )
return 0;
p2 = (block_p *)p1[ doubly ];
if ( !p2 )
111bed: 85 d2 test %edx,%edx
111bef: 75 84 jne 111b75 <IMFS_memfile_get_block_pointer+0xcd><== ALWAYS TAKEN
111bf1: e9 24 ff ff ff jmp 111b1a <IMFS_memfile_get_block_pointer+0x72><== NOT EXECUTED
p = info->triply_indirect;
if ( malloc_it ) {
if ( !p ) {
p = memfile_alloc_block();
111bf6: 89 55 e0 mov %edx,-0x20(%ebp)
111bf9: e8 86 fe ff ff call 111a84 <memfile_alloc_block>
111bfe: 89 c1 mov %eax,%ecx
if ( !p )
return 0;
111c00: 31 c0 xor %eax,%eax
p = info->triply_indirect;
if ( malloc_it ) {
if ( !p ) {
p = memfile_alloc_block();
if ( !p )
111c02: 85 c9 test %ecx,%ecx
111c04: 8b 55 e0 mov -0x20(%ebp),%edx
111c07: 0f 84 0d ff ff ff je 111b1a <IMFS_memfile_get_block_pointer+0x72><== NEVER TAKEN
return 0;
info->triply_indirect = p;
111c0d: 89 4b 60 mov %ecx,0x60(%ebx)
111c10: e9 46 ff ff ff jmp 111b5b <IMFS_memfile_get_block_pointer+0xb3>
p[ triply ] = (block_p) p1;
}
p2 = (block_p *)p1[ doubly ];
if ( !p2 ) {
p2 = memfile_alloc_block();
111c15: e8 6a fe ff ff call 111a84 <memfile_alloc_block>
111c1a: 89 c2 mov %eax,%edx
if ( !p2 )
return 0;
111c1c: 31 c0 xor %eax,%eax
}
p2 = (block_p *)p1[ doubly ];
if ( !p2 ) {
p2 = memfile_alloc_block();
if ( !p2 )
111c1e: 85 d2 test %edx,%edx
111c20: 0f 84 f4 fe ff ff je 111b1a <IMFS_memfile_get_block_pointer+0x72><== NEVER TAKEN
return 0;
p1[ doubly ] = (block_p) p2;
111c26: 89 13 mov %edx,(%ebx)
111c28: e9 48 ff ff ff jmp 111b75 <IMFS_memfile_get_block_pointer+0xcd>
info->triply_indirect = p;
}
p1 = (block_p *) p[ triply ];
if ( !p1 ) {
p1 = memfile_alloc_block();
111c2d: 89 55 e0 mov %edx,-0x20(%ebp)
111c30: e8 4f fe ff ff call 111a84 <memfile_alloc_block>
111c35: 89 c1 mov %eax,%ecx
if ( !p1 )
return 0;
111c37: 31 c0 xor %eax,%eax
}
p1 = (block_p *) p[ triply ];
if ( !p1 ) {
p1 = memfile_alloc_block();
if ( !p1 )
111c39: 85 c9 test %ecx,%ecx
111c3b: 8b 55 e0 mov -0x20(%ebp),%edx
111c3e: 0f 84 d6 fe ff ff je 111b1a <IMFS_memfile_get_block_pointer+0x72><== NEVER TAKEN
return 0;
p[ triply ] = (block_p) p1;
111c44: 89 0b mov %ecx,(%ebx)
111c46: e9 1d ff ff ff jmp 111b68 <IMFS_memfile_get_block_pointer+0xc0>
00111c4c <IMFS_memfile_read>:
IMFS_jnode_t *the_jnode,
off_t start,
unsigned char *destination,
unsigned int length
)
{
111c4c: 55 push %ebp
111c4d: 89 e5 mov %esp,%ebp
111c4f: 57 push %edi
111c50: 56 push %esi
111c51: 53 push %ebx
111c52: 83 ec 3c sub $0x3c,%esp
111c55: 8b 75 0c mov 0xc(%ebp),%esi
111c58: 8b 7d 10 mov 0x10(%ebp),%edi
* Linear files (as created from a tar file are easier to handle
* than block files).
*/
my_length = length;
if (the_jnode->type == IMFS_LINEAR_FILE) {
111c5b: 8b 45 08 mov 0x8(%ebp),%eax
111c5e: 83 78 4c 06 cmpl $0x6,0x4c(%eax)
111c62: 0f 84 60 01 00 00 je 111dc8 <IMFS_memfile_read+0x17c>
/*
* If the last byte we are supposed to read is past the end of this
* in memory file, then shorten the length to read.
*/
last_byte = start + length;
111c68: 89 f0 mov %esi,%eax
if ( last_byte > the_jnode->info.file.size )
111c6a: 8b 55 08 mov 0x8(%ebp),%edx
111c6d: 8b 4a 50 mov 0x50(%edx),%ecx
/*
* If the last byte we are supposed to read is past the end of this
* in memory file, then shorten the length to read.
*/
last_byte = start + length;
111c70: 8b 5d 18 mov 0x18(%ebp),%ebx
111c73: 01 f3 add %esi,%ebx
111c75: 89 5d d0 mov %ebx,-0x30(%ebp)
if ( last_byte > the_jnode->info.file.size )
111c78: 31 d2 xor %edx,%edx
111c7a: 8b 5d 08 mov 0x8(%ebp),%ebx
111c7d: 3b 53 54 cmp 0x54(%ebx),%edx
111c80: 0f 8d d2 00 00 00 jge 111d58 <IMFS_memfile_read+0x10c><== ALWAYS TAKEN
/*
* Linear files (as created from a tar file are easier to handle
* than block files).
*/
my_length = length;
111c86: 8b 45 18 mov 0x18(%ebp),%eax
111c89: 89 45 cc mov %eax,-0x34(%ebp)
*/
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
111c8c: 8b 15 80 79 12 00 mov 0x127980,%edx
111c92: 89 55 d0 mov %edx,-0x30(%ebp)
111c95: 89 d0 mov %edx,%eax
111c97: 99 cltd
111c98: 89 d3 mov %edx,%ebx
111c9a: 52 push %edx
111c9b: 50 push %eax
111c9c: 57 push %edi
111c9d: 56 push %esi
111c9e: 89 45 c0 mov %eax,-0x40(%ebp)
111ca1: e8 c6 cf 00 00 call 11ec6c <__moddi3>
111ca6: 83 c4 10 add $0x10,%esp
111ca9: 89 45 c8 mov %eax,-0x38(%ebp)
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
111cac: 8b 4d c0 mov -0x40(%ebp),%ecx
111caf: 53 push %ebx
111cb0: 51 push %ecx
111cb1: 57 push %edi
111cb2: 56 push %esi
111cb3: e8 68 ce 00 00 call 11eb20 <__divdi3>
111cb8: 83 c4 10 add $0x10,%esp
111cbb: 89 c3 mov %eax,%ebx
if ( start_offset ) {
111cbd: 8b 7d c8 mov -0x38(%ebp),%edi
111cc0: 85 ff test %edi,%edi
111cc2: 0f 84 a0 00 00 00 je 111d68 <IMFS_memfile_read+0x11c>
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK - start_offset;
if ( to_copy > my_length )
to_copy = my_length;
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
111cc8: 56 push %esi
111cc9: 6a 00 push $0x0
111ccb: 50 push %eax
111ccc: ff 75 08 pushl 0x8(%ebp)
111ccf: e8 d4 fd ff ff call 111aa8 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
111cd4: 83 c4 10 add $0x10,%esp
111cd7: 85 c0 test %eax,%eax
111cd9: 0f 84 65 01 00 00 je 111e44 <IMFS_memfile_read+0x1f8><== NEVER TAKEN
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
if ( start_offset ) {
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK - start_offset;
111cdf: 8b 4d d0 mov -0x30(%ebp),%ecx
111ce2: 2b 4d c8 sub -0x38(%ebp),%ecx
111ce5: 8b 55 cc mov -0x34(%ebp),%edx
111ce8: 39 ca cmp %ecx,%edx
111cea: 0f 87 3c 01 00 00 ja 111e2c <IMFS_memfile_read+0x1e0>
if ( to_copy > my_length )
to_copy = my_length;
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
if ( !block_ptr )
return copied;
memcpy( dest, &(*block_ptr)[ start_offset ], to_copy );
111cf0: 8b 75 c8 mov -0x38(%ebp),%esi
111cf3: 03 30 add (%eax),%esi
dest += to_copy;
111cf5: 8b 7d 14 mov 0x14(%ebp),%edi
111cf8: 89 d1 mov %edx,%ecx
111cfa: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
111cfc: 89 7d c8 mov %edi,-0x38(%ebp)
block++;
111cff: 43 inc %ebx
my_length -= to_copy;
111d00: 29 55 cc sub %edx,-0x34(%ebp)
111d03: a1 80 79 12 00 mov 0x127980,%eax
111d08: 89 45 d0 mov %eax,-0x30(%ebp)
copied += to_copy;
111d0b: 89 55 c4 mov %edx,-0x3c(%ebp)
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
111d0e: 8b 4d d0 mov -0x30(%ebp),%ecx
111d11: 39 4d cc cmp %ecx,-0x34(%ebp)
111d14: 73 24 jae 111d3a <IMFS_memfile_read+0xee>
111d16: eb 60 jmp 111d78 <IMFS_memfile_read+0x12c>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
if ( !block_ptr )
return copied;
memcpy( dest, &(*block_ptr)[ 0 ], to_copy );
111d18: 8b 30 mov (%eax),%esi
111d1a: 8b 7d c8 mov -0x38(%ebp),%edi
111d1d: 8b 4d d0 mov -0x30(%ebp),%ecx
111d20: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
dest += to_copy;
111d22: 89 7d c8 mov %edi,-0x38(%ebp)
block++;
111d25: 43 inc %ebx
my_length -= to_copy;
111d26: 8b 7d d0 mov -0x30(%ebp),%edi
111d29: 29 7d cc sub %edi,-0x34(%ebp)
copied += to_copy;
111d2c: 01 7d c4 add %edi,-0x3c(%ebp)
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
111d2f: 8b 45 cc mov -0x34(%ebp),%eax
111d32: 39 05 80 79 12 00 cmp %eax,0x127980
111d38: 77 3e ja 111d78 <IMFS_memfile_read+0x12c>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
111d3a: 51 push %ecx
111d3b: 6a 00 push $0x0
111d3d: 53 push %ebx
111d3e: ff 75 08 pushl 0x8(%ebp)
111d41: e8 62 fd ff ff call 111aa8 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
111d46: 83 c4 10 add $0x10,%esp
111d49: 85 c0 test %eax,%eax
111d4b: 75 cb jne 111d18 <IMFS_memfile_read+0xcc><== ALWAYS TAKEN
IMFS_assert( my_length < IMFS_MEMFILE_BYTES_PER_BLOCK );
if ( my_length ) {
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
if ( !block_ptr )
return copied;
111d4d: 8b 45 c4 mov -0x3c(%ebp),%eax <== NOT EXECUTED
}
IMFS_update_atime( the_jnode );
return copied;
}
111d50: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
111d53: 5b pop %ebx <== NOT EXECUTED
111d54: 5e pop %esi <== NOT EXECUTED
111d55: 5f pop %edi <== NOT EXECUTED
111d56: c9 leave <== NOT EXECUTED
111d57: c3 ret <== NOT EXECUTED
/*
* If the last byte we are supposed to read is past the end of this
* in memory file, then shorten the length to read.
*/
last_byte = start + length;
if ( last_byte > the_jnode->info.file.size )
111d58: 0f 8e be 00 00 00 jle 111e1c <IMFS_memfile_read+0x1d0><== ALWAYS TAKEN
my_length = the_jnode->info.file.size - start;
111d5e: 29 c1 sub %eax,%ecx
111d60: 89 4d cc mov %ecx,-0x34(%ebp)
111d63: e9 24 ff ff ff jmp 111c8c <IMFS_memfile_read+0x40>
unsigned int last_byte;
unsigned int copied;
unsigned int start_offset;
unsigned char *dest;
dest = destination;
111d68: 8b 55 14 mov 0x14(%ebp),%edx
111d6b: 89 55 c8 mov %edx,-0x38(%ebp)
*/
last_byte = start + length;
if ( last_byte > the_jnode->info.file.size )
my_length = the_jnode->info.file.size - start;
copied = 0;
111d6e: c7 45 c4 00 00 00 00 movl $0x0,-0x3c(%ebp)
111d75: eb 97 jmp 111d0e <IMFS_memfile_read+0xc2>
111d77: 90 nop
/*
* Phase 3: possibly the first part of one block
*/
IMFS_assert( my_length < IMFS_MEMFILE_BYTES_PER_BLOCK );
if ( my_length ) {
111d78: 8b 55 cc mov -0x34(%ebp),%edx
111d7b: 85 d2 test %edx,%edx
111d7d: 74 23 je 111da2 <IMFS_memfile_read+0x156>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
111d7f: 50 push %eax
111d80: 6a 00 push $0x0
111d82: 53 push %ebx
111d83: ff 75 08 pushl 0x8(%ebp)
111d86: e8 1d fd ff ff call 111aa8 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
111d8b: 83 c4 10 add $0x10,%esp
111d8e: 85 c0 test %eax,%eax
111d90: 74 bb je 111d4d <IMFS_memfile_read+0x101><== NEVER TAKEN
return copied;
memcpy( dest, &(*block_ptr)[ 0 ], my_length );
111d92: 8b 30 mov (%eax),%esi
111d94: 8b 7d c8 mov -0x38(%ebp),%edi
111d97: 8b 4d cc mov -0x34(%ebp),%ecx
111d9a: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
copied += my_length;
111d9c: 8b 55 cc mov -0x34(%ebp),%edx
111d9f: 01 55 c4 add %edx,-0x3c(%ebp)
}
IMFS_update_atime( the_jnode );
111da2: 83 ec 08 sub $0x8,%esp
111da5: 6a 00 push $0x0
111da7: 8d 45 e0 lea -0x20(%ebp),%eax
111daa: 50 push %eax
111dab: e8 80 63 ff ff call 108130 <gettimeofday>
111db0: 8b 45 e0 mov -0x20(%ebp),%eax
111db3: 8b 4d 08 mov 0x8(%ebp),%ecx
111db6: 89 41 40 mov %eax,0x40(%ecx)
return copied;
111db9: 8b 45 c4 mov -0x3c(%ebp),%eax
111dbc: 83 c4 10 add $0x10,%esp
}
111dbf: 8d 65 f4 lea -0xc(%ebp),%esp
111dc2: 5b pop %ebx
111dc3: 5e pop %esi
111dc4: 5f pop %edi
111dc5: c9 leave
111dc6: c3 ret
111dc7: 90 nop
my_length = length;
if (the_jnode->type == IMFS_LINEAR_FILE) {
unsigned char *file_ptr;
file_ptr = (unsigned char *)the_jnode->info.linearfile.direct;
111dc8: 8b 50 58 mov 0x58(%eax),%edx
111dcb: 89 55 cc mov %edx,-0x34(%ebp)
if (my_length > (the_jnode->info.linearfile.size - start))
111dce: 89 c1 mov %eax,%ecx
111dd0: 8b 40 50 mov 0x50(%eax),%eax
111dd3: 8b 51 54 mov 0x54(%ecx),%edx
111dd6: 89 c1 mov %eax,%ecx
111dd8: 89 d3 mov %edx,%ebx
111dda: 29 f1 sub %esi,%ecx
111ddc: 19 fb sbb %edi,%ebx
111dde: 89 4d d0 mov %ecx,-0x30(%ebp)
111de1: 89 5d d4 mov %ebx,-0x2c(%ebp)
111de4: 31 c9 xor %ecx,%ecx
111de6: 39 d9 cmp %ebx,%ecx
111de8: 7d 4a jge 111e34 <IMFS_memfile_read+0x1e8><== ALWAYS TAKEN
/*
* Linear files (as created from a tar file are easier to handle
* than block files).
*/
my_length = length;
111dea: 8b 5d 18 mov 0x18(%ebp),%ebx <== NOT EXECUTED
file_ptr = (unsigned char *)the_jnode->info.linearfile.direct;
if (my_length > (the_jnode->info.linearfile.size - start))
my_length = the_jnode->info.linearfile.size - start;
memcpy(dest, &file_ptr[start], my_length);
111ded: 03 75 cc add -0x34(%ebp),%esi
111df0: 8b 7d 14 mov 0x14(%ebp),%edi
111df3: 89 d9 mov %ebx,%ecx
111df5: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
IMFS_update_atime( the_jnode );
111df7: 83 ec 08 sub $0x8,%esp
111dfa: 6a 00 push $0x0
111dfc: 8d 45 e0 lea -0x20(%ebp),%eax
111dff: 50 push %eax
111e00: e8 2b 63 ff ff call 108130 <gettimeofday>
111e05: 8b 45 e0 mov -0x20(%ebp),%eax
111e08: 8b 7d 08 mov 0x8(%ebp),%edi
111e0b: 89 47 40 mov %eax,0x40(%edi)
return my_length;
111e0e: 89 d8 mov %ebx,%eax
111e10: 83 c4 10 add $0x10,%esp
}
IMFS_update_atime( the_jnode );
return copied;
}
111e13: 8d 65 f4 lea -0xc(%ebp),%esp
111e16: 5b pop %ebx
111e17: 5e pop %esi
111e18: 5f pop %edi
111e19: c9 leave
111e1a: c3 ret
111e1b: 90 nop
/*
* If the last byte we are supposed to read is past the end of this
* in memory file, then shorten the length to read.
*/
last_byte = start + length;
if ( last_byte > the_jnode->info.file.size )
111e1c: 39 4d d0 cmp %ecx,-0x30(%ebp)
111e1f: 0f 86 61 fe ff ff jbe 111c86 <IMFS_memfile_read+0x3a>
111e25: e9 34 ff ff ff jmp 111d5e <IMFS_memfile_read+0x112>
111e2a: 66 90 xchg %ax,%ax
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
if ( start_offset ) {
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK - start_offset;
111e2c: 89 ca mov %ecx,%edx
111e2e: e9 bd fe ff ff jmp 111cf0 <IMFS_memfile_read+0xa4>
111e33: 90 nop
if (the_jnode->type == IMFS_LINEAR_FILE) {
unsigned char *file_ptr;
file_ptr = (unsigned char *)the_jnode->info.linearfile.direct;
if (my_length > (the_jnode->info.linearfile.size - start))
111e34: 7f 08 jg 111e3e <IMFS_memfile_read+0x1f2><== NEVER TAKEN
111e36: 8b 5d d0 mov -0x30(%ebp),%ebx
111e39: 39 5d 18 cmp %ebx,0x18(%ebp)
111e3c: 76 ac jbe 111dea <IMFS_memfile_read+0x19e><== NEVER TAKEN
my_length = the_jnode->info.linearfile.size - start;
111e3e: 89 c3 mov %eax,%ebx
111e40: 29 f3 sub %esi,%ebx
111e42: eb a9 jmp 111ded <IMFS_memfile_read+0x1a1>
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK - start_offset;
if ( to_copy > my_length )
to_copy = my_length;
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
if ( !block_ptr )
return copied;
111e44: 31 c0 xor %eax,%eax
111e46: e9 05 ff ff ff jmp 111d50 <IMFS_memfile_read+0x104><== NOT EXECUTED
00111f24 <IMFS_memfile_remove>:
* is better to stick to simple, easy to understand algorithms.
*/
int IMFS_memfile_remove(
IMFS_jnode_t *the_jnode
)
{
111f24: 55 push %ebp
111f25: 89 e5 mov %esp,%ebp
111f27: 57 push %edi
111f28: 56 push %esi
111f29: 53 push %ebx
111f2a: 83 ec 1c sub $0x1c,%esp
/*
* Eventually this could be set smarter at each call to
* memfile_free_blocks_in_table to greatly speed this up.
*/
to_free = IMFS_MEMFILE_BLOCK_SLOTS;
111f2d: 8b 3d 80 79 12 00 mov 0x127980,%edi
111f33: c1 ef 02 shr $0x2,%edi
* + doubly indirect
* + triply indirect
*/
info = &the_jnode->info.file;
if ( info->indirect ) {
111f36: 8b 45 08 mov 0x8(%ebp),%eax
111f39: 8b 50 58 mov 0x58(%eax),%edx
111f3c: 85 d2 test %edx,%edx
111f3e: 74 10 je 111f50 <IMFS_memfile_remove+0x2c>
memfile_free_blocks_in_table( &info->indirect, to_free );
111f40: 83 ec 08 sub $0x8,%esp
111f43: 57 push %edi
111f44: 83 c0 58 add $0x58,%eax
111f47: 50 push %eax
111f48: e8 7b ff ff ff call 111ec8 <memfile_free_blocks_in_table>
111f4d: 83 c4 10 add $0x10,%esp
}
if ( info->doubly_indirect ) {
111f50: 8b 4d 08 mov 0x8(%ebp),%ecx
111f53: 8b 51 5c mov 0x5c(%ecx),%edx
111f56: 85 d2 test %edx,%edx
111f58: 74 55 je 111faf <IMFS_memfile_remove+0x8b>
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
111f5a: a1 80 79 12 00 mov 0x127980,%eax
111f5f: 89 c1 mov %eax,%ecx
111f61: c1 e9 02 shr $0x2,%ecx
111f64: 74 36 je 111f9c <IMFS_memfile_remove+0x78><== NEVER TAKEN
111f66: 31 c9 xor %ecx,%ecx
111f68: 31 db xor %ebx,%ebx
111f6a: 8b 75 08 mov 0x8(%ebp),%esi
111f6d: eb 04 jmp 111f73 <IMFS_memfile_remove+0x4f>
111f6f: 90 nop
111f70: 8b 56 5c mov 0x5c(%esi),%edx
if ( info->doubly_indirect[i] ) {
111f73: c1 e1 02 shl $0x2,%ecx
111f76: 83 3c 0a 00 cmpl $0x0,(%edx,%ecx,1)
111f7a: 74 14 je 111f90 <IMFS_memfile_remove+0x6c><== NEVER TAKEN
memfile_free_blocks_in_table(
111f7c: 83 ec 08 sub $0x8,%esp
111f7f: 57 push %edi
111f80: 01 ca add %ecx,%edx
111f82: 52 push %edx
111f83: e8 40 ff ff ff call 111ec8 <memfile_free_blocks_in_table>
111f88: 83 c4 10 add $0x10,%esp
111f8b: a1 80 79 12 00 mov 0x127980,%eax
if ( info->indirect ) {
memfile_free_blocks_in_table( &info->indirect, to_free );
}
if ( info->doubly_indirect ) {
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
111f90: 43 inc %ebx
111f91: 89 d9 mov %ebx,%ecx
111f93: 89 c2 mov %eax,%edx
111f95: c1 ea 02 shr $0x2,%edx
111f98: 39 da cmp %ebx,%edx
111f9a: 77 d4 ja 111f70 <IMFS_memfile_remove+0x4c>
if ( info->doubly_indirect[i] ) {
memfile_free_blocks_in_table(
(block_p **)&info->doubly_indirect[i], to_free );
}
}
memfile_free_blocks_in_table( &info->doubly_indirect, to_free );
111f9c: 83 ec 08 sub $0x8,%esp
111f9f: 57 push %edi
111fa0: 8b 45 08 mov 0x8(%ebp),%eax
111fa3: 83 c0 5c add $0x5c,%eax
111fa6: 50 push %eax
111fa7: e8 1c ff ff ff call 111ec8 <memfile_free_blocks_in_table>
111fac: 83 c4 10 add $0x10,%esp
}
if ( info->triply_indirect ) {
111faf: 8b 45 08 mov 0x8(%ebp),%eax
111fb2: 8b 50 60 mov 0x60(%eax),%edx
111fb5: 85 d2 test %edx,%edx
111fb7: 0f 84 b6 00 00 00 je 112073 <IMFS_memfile_remove+0x14f>
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
111fbd: a1 80 79 12 00 mov 0x127980,%eax
111fc2: 89 c1 mov %eax,%ecx
111fc4: c1 e9 02 shr $0x2,%ecx
111fc7: 0f 84 93 00 00 00 je 112060 <IMFS_memfile_remove+0x13c><== NEVER TAKEN
p = (block_p *) info->triply_indirect[i];
111fcd: 8b 32 mov (%edx),%esi
if ( !p ) /* ensure we have a valid pointer */
111fcf: 85 f6 test %esi,%esi
111fd1: 0f 84 89 00 00 00 je 112060 <IMFS_memfile_remove+0x13c><== NEVER TAKEN
}
if ( info->triply_indirect ) {
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
p = (block_p *) info->triply_indirect[i];
111fd7: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
if ( !p ) /* ensure we have a valid pointer */
111fde: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
111fe5: 8d 76 00 lea 0x0(%esi),%esi
break;
for ( j=0 ; j<IMFS_MEMFILE_BLOCK_SLOTS ; j++ ) {
111fe8: 89 c2 mov %eax,%edx
111fea: c1 ea 02 shr $0x2,%edx
111fed: 74 30 je 11201f <IMFS_memfile_remove+0xfb><== NEVER TAKEN
111fef: 31 d2 xor %edx,%edx
111ff1: 31 db xor %ebx,%ebx
111ff3: 90 nop
if ( p[j] ) {
111ff4: c1 e2 02 shl $0x2,%edx
111ff7: 8b 0c 16 mov (%esi,%edx,1),%ecx
111ffa: 85 c9 test %ecx,%ecx
111ffc: 74 15 je 112013 <IMFS_memfile_remove+0xef><== NEVER TAKEN
memfile_free_blocks_in_table( (block_p **)&p[j], to_free);
111ffe: 83 ec 08 sub $0x8,%esp
112001: 57 push %edi
112002: 8d 14 16 lea (%esi,%edx,1),%edx
112005: 52 push %edx
112006: e8 bd fe ff ff call 111ec8 <memfile_free_blocks_in_table>
11200b: 83 c4 10 add $0x10,%esp
11200e: a1 80 79 12 00 mov 0x127980,%eax
if ( info->triply_indirect ) {
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
p = (block_p *) info->triply_indirect[i];
if ( !p ) /* ensure we have a valid pointer */
break;
for ( j=0 ; j<IMFS_MEMFILE_BLOCK_SLOTS ; j++ ) {
112013: 43 inc %ebx
112014: 89 da mov %ebx,%edx
112016: 89 c1 mov %eax,%ecx
112018: c1 e9 02 shr $0x2,%ecx
11201b: 39 cb cmp %ecx,%ebx
11201d: 72 d5 jb 111ff4 <IMFS_memfile_remove+0xd0>
if ( p[j] ) {
memfile_free_blocks_in_table( (block_p **)&p[j], to_free);
}
}
memfile_free_blocks_in_table(
11201f: 83 ec 08 sub $0x8,%esp
112022: 57 push %edi
112023: 8b 45 e0 mov -0x20(%ebp),%eax
112026: 8b 4d 08 mov 0x8(%ebp),%ecx
112029: 03 41 60 add 0x60(%ecx),%eax
11202c: 50 push %eax
11202d: e8 96 fe ff ff call 111ec8 <memfile_free_blocks_in_table>
memfile_free_blocks_in_table( &info->doubly_indirect, to_free );
}
if ( info->triply_indirect ) {
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
112032: ff 45 e4 incl -0x1c(%ebp)
112035: a1 80 79 12 00 mov 0x127980,%eax
11203a: 89 c2 mov %eax,%edx
11203c: c1 ea 02 shr $0x2,%edx
11203f: 83 c4 10 add $0x10,%esp
112042: 3b 55 e4 cmp -0x1c(%ebp),%edx
112045: 76 19 jbe 112060 <IMFS_memfile_remove+0x13c>
p = (block_p *) info->triply_indirect[i];
if ( !p ) /* ensure we have a valid pointer */
112047: 8b 55 e4 mov -0x1c(%ebp),%edx
11204a: c1 e2 02 shl $0x2,%edx
11204d: 89 55 e0 mov %edx,-0x20(%ebp)
}
if ( info->triply_indirect ) {
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
p = (block_p *) info->triply_indirect[i];
112050: 8b 4d 08 mov 0x8(%ebp),%ecx
112053: 8b 51 60 mov 0x60(%ecx),%edx
112056: 8b 4d e0 mov -0x20(%ebp),%ecx
112059: 8b 34 0a mov (%edx,%ecx,1),%esi
if ( !p ) /* ensure we have a valid pointer */
11205c: 85 f6 test %esi,%esi
11205e: 75 88 jne 111fe8 <IMFS_memfile_remove+0xc4><== ALWAYS TAKEN
}
}
memfile_free_blocks_in_table(
(block_p **)&info->triply_indirect[i], to_free );
}
memfile_free_blocks_in_table(
112060: 83 ec 08 sub $0x8,%esp
112063: 57 push %edi
(block_p **)&info->triply_indirect, to_free );
112064: 8b 45 08 mov 0x8(%ebp),%eax
112067: 83 c0 60 add $0x60,%eax
}
}
memfile_free_blocks_in_table(
(block_p **)&info->triply_indirect[i], to_free );
}
memfile_free_blocks_in_table(
11206a: 50 push %eax
11206b: e8 58 fe ff ff call 111ec8 <memfile_free_blocks_in_table>
112070: 83 c4 10 add $0x10,%esp
(block_p **)&info->triply_indirect, to_free );
}
return 0;
}
112073: 31 c0 xor %eax,%eax
112075: 8d 65 f4 lea -0xc(%ebp),%esp
112078: 5b pop %ebx
112079: 5e pop %esi
11207a: 5f pop %edi
11207b: c9 leave
11207c: c3 ret
001121c4 <IMFS_memfile_write>:
IMFS_jnode_t *the_jnode,
off_t start,
const unsigned char *source,
unsigned int length
)
{
1121c4: 55 push %ebp
1121c5: 89 e5 mov %esp,%ebp
1121c7: 57 push %edi
1121c8: 56 push %esi
1121c9: 53 push %ebx
1121ca: 83 ec 3c sub $0x3c,%esp
1121cd: 8b 5d 0c mov 0xc(%ebp),%ebx
1121d0: 8b 75 10 mov 0x10(%ebp),%esi
/*
* If the last byte we are supposed to write is past the end of this
* in memory file, then extend the length.
*/
last_byte = start + my_length;
1121d3: 8b 4d 18 mov 0x18(%ebp),%ecx
1121d6: 01 d9 add %ebx,%ecx
if ( last_byte > the_jnode->info.file.size ) {
1121d8: 89 c8 mov %ecx,%eax
1121da: 31 d2 xor %edx,%edx
1121dc: 8b 7d 08 mov 0x8(%ebp),%edi
1121df: 3b 57 54 cmp 0x54(%edi),%edx
1121e2: 7c 1c jl 112200 <IMFS_memfile_write+0x3c><== NEVER TAKEN
1121e4: 0f 8e f2 00 00 00 jle 1122dc <IMFS_memfile_write+0x118><== ALWAYS TAKEN
status = IMFS_memfile_extend( the_jnode, last_byte );
1121ea: 51 push %ecx
1121eb: 52 push %edx
1121ec: 50 push %eax
1121ed: ff 75 08 pushl 0x8(%ebp)
1121f0: e8 b7 fe ff ff call 1120ac <IMFS_memfile_extend>
if ( status )
1121f5: 83 c4 10 add $0x10,%esp
1121f8: 85 c0 test %eax,%eax
1121fa: 0f 85 52 01 00 00 jne 112352 <IMFS_memfile_write+0x18e>
*/
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
112200: a1 80 79 12 00 mov 0x127980,%eax
112205: 89 45 d4 mov %eax,-0x2c(%ebp)
112208: 99 cltd
112209: 89 45 c8 mov %eax,-0x38(%ebp)
11220c: 89 55 cc mov %edx,-0x34(%ebp)
11220f: 52 push %edx
112210: 50 push %eax
112211: 56 push %esi
112212: 53 push %ebx
112213: e8 54 ca 00 00 call 11ec6c <__moddi3>
112218: 83 c4 10 add $0x10,%esp
11221b: 89 c7 mov %eax,%edi
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
11221d: ff 75 cc pushl -0x34(%ebp)
112220: ff 75 c8 pushl -0x38(%ebp)
112223: 56 push %esi
112224: 53 push %ebx
112225: e8 f6 c8 00 00 call 11eb20 <__divdi3>
11222a: 83 c4 10 add $0x10,%esp
11222d: 89 c3 mov %eax,%ebx
if ( start_offset ) {
11222f: 85 ff test %edi,%edi
112231: 75 5d jne 112290 <IMFS_memfile_write+0xcc>
unsigned int last_byte;
unsigned int start_offset;
int copied;
const unsigned char *src;
src = source;
112233: 8b 75 14 mov 0x14(%ebp),%esi
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
if ( start_offset ) {
112236: 8b 55 18 mov 0x18(%ebp),%edx
status = IMFS_memfile_extend( the_jnode, last_byte );
if ( status )
rtems_set_errno_and_return_minus_one( ENOSPC );
}
copied = 0;
112239: c7 45 c8 00 00 00 00 movl $0x0,-0x38(%ebp)
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
112240: 3b 55 d4 cmp -0x2c(%ebp),%edx
112243: 73 26 jae 11226b <IMFS_memfile_write+0xa7>
112245: e9 a2 00 00 00 jmp 1122ec <IMFS_memfile_write+0x128>
11224a: 66 90 xchg %ax,%ax
if ( !block_ptr )
return copied;
#if 0
fprintf(stdout, "write %d in %d: %*s\n", to_copy, block, to_copy, src );
#endif
memcpy( &(*block_ptr)[ 0 ], src, to_copy );
11224c: 8b 00 mov (%eax),%eax
src += to_copy;
11224e: 89 c7 mov %eax,%edi
112250: 8b 4d d4 mov -0x2c(%ebp),%ecx
112253: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
block++;
112255: 43 inc %ebx
my_length -= to_copy;
112256: 2b 55 d4 sub -0x2c(%ebp),%edx
* IMFS_memfile_write
*
* This routine writes the specified data buffer into the in memory
* file pointed to by the_jnode. The file is extended as needed.
*/
MEMFILE_STATIC ssize_t IMFS_memfile_write(
112259: 8b 45 d4 mov -0x2c(%ebp),%eax
11225c: 01 45 c8 add %eax,-0x38(%ebp)
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
11225f: 39 15 80 79 12 00 cmp %edx,0x127980
112265: 0f 87 81 00 00 00 ja 1122ec <IMFS_memfile_write+0x128>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
11226b: 57 push %edi
11226c: 6a 00 push $0x0
11226e: 53 push %ebx
11226f: ff 75 08 pushl 0x8(%ebp)
112272: 89 55 c4 mov %edx,-0x3c(%ebp)
112275: e8 2e f8 ff ff call 111aa8 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
11227a: 83 c4 10 add $0x10,%esp
11227d: 85 c0 test %eax,%eax
11227f: 8b 55 c4 mov -0x3c(%ebp),%edx
112282: 75 c8 jne 11224c <IMFS_memfile_write+0x88><== ALWAYS TAKEN
IMFS_assert( my_length < IMFS_MEMFILE_BYTES_PER_BLOCK );
to_copy = my_length;
if ( my_length ) {
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
if ( !block_ptr )
112284: 8b 45 c8 mov -0x38(%ebp),%eax <== NOT EXECUTED
}
IMFS_mtime_ctime_update( the_jnode );
return copied;
}
112287: 8d 65 f4 lea -0xc(%ebp),%esp
11228a: 5b pop %ebx
11228b: 5e pop %esi
11228c: 5f pop %edi
11228d: c9 leave
11228e: c3 ret
11228f: 90 nop
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
if ( start_offset ) {
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK - start_offset;
if ( to_copy > my_length )
to_copy = my_length;
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
112290: 50 push %eax
112291: 6a 00 push $0x0
112293: 53 push %ebx
112294: ff 75 08 pushl 0x8(%ebp)
112297: e8 0c f8 ff ff call 111aa8 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
11229c: 83 c4 10 add $0x10,%esp
11229f: 85 c0 test %eax,%eax
1122a1: 0f 84 a1 00 00 00 je 112348 <IMFS_memfile_write+0x184><== NEVER TAKEN
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
if ( start_offset ) {
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK - start_offset;
1122a7: 8b 55 d4 mov -0x2c(%ebp),%edx
1122aa: 29 fa sub %edi,%edx
1122ac: 89 55 c8 mov %edx,-0x38(%ebp)
1122af: 8b 55 18 mov 0x18(%ebp),%edx
1122b2: 39 55 c8 cmp %edx,-0x38(%ebp)
1122b5: 0f 87 85 00 00 00 ja 112340 <IMFS_memfile_write+0x17c>
block,
to_copy,
src
);
#endif
memcpy( &(*block_ptr)[ start_offset ], src, to_copy );
1122bb: 03 38 add (%eax),%edi
src += to_copy;
1122bd: 8b 75 14 mov 0x14(%ebp),%esi
1122c0: 8b 4d c8 mov -0x38(%ebp),%ecx
1122c3: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
block++;
1122c5: 43 inc %ebx
my_length -= to_copy;
1122c6: 8b 55 18 mov 0x18(%ebp),%edx
1122c9: 2b 55 c8 sub -0x38(%ebp),%edx
copied += to_copy;
1122cc: 8b 3d 80 79 12 00 mov 0x127980,%edi
1122d2: 89 7d d4 mov %edi,-0x2c(%ebp)
1122d5: e9 66 ff ff ff jmp 112240 <IMFS_memfile_write+0x7c>
1122da: 66 90 xchg %ax,%ax
* If the last byte we are supposed to write is past the end of this
* in memory file, then extend the length.
*/
last_byte = start + my_length;
if ( last_byte > the_jnode->info.file.size ) {
1122dc: 3b 4f 50 cmp 0x50(%edi),%ecx
1122df: 0f 86 1b ff ff ff jbe 112200 <IMFS_memfile_write+0x3c><== NEVER TAKEN
1122e5: e9 00 ff ff ff jmp 1121ea <IMFS_memfile_write+0x26>
1122ea: 66 90 xchg %ax,%ax
* Phase 3: possibly the first part of one block
*/
IMFS_assert( my_length < IMFS_MEMFILE_BYTES_PER_BLOCK );
to_copy = my_length;
if ( my_length ) {
1122ec: 85 d2 test %edx,%edx
1122ee: 74 28 je 112318 <IMFS_memfile_write+0x154>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
1122f0: 51 push %ecx
1122f1: 6a 00 push $0x0
1122f3: 53 push %ebx
1122f4: ff 75 08 pushl 0x8(%ebp)
1122f7: 89 55 c4 mov %edx,-0x3c(%ebp)
1122fa: e8 a9 f7 ff ff call 111aa8 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
1122ff: 83 c4 10 add $0x10,%esp
112302: 85 c0 test %eax,%eax
112304: 8b 55 c4 mov -0x3c(%ebp),%edx
112307: 0f 84 77 ff ff ff je 112284 <IMFS_memfile_write+0xc0><== NEVER TAKEN
return copied;
#if 0
fprintf(stdout, "write %d in %d: %*s\n", to_copy, block, to_copy, src );
#endif
memcpy( &(*block_ptr)[ 0 ], src, my_length );
11230d: 8b 00 mov (%eax),%eax
11230f: 89 c7 mov %eax,%edi
112311: 89 d1 mov %edx,%ecx
112313: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
my_length = 0;
copied += to_copy;
112315: 01 55 c8 add %edx,-0x38(%ebp)
}
IMFS_mtime_ctime_update( the_jnode );
112318: 83 ec 08 sub $0x8,%esp
11231b: 6a 00 push $0x0
11231d: 8d 45 e0 lea -0x20(%ebp),%eax
112320: 50 push %eax
112321: e8 0a 5e ff ff call 108130 <gettimeofday>
112326: 8b 45 e0 mov -0x20(%ebp),%eax
112329: 8b 55 08 mov 0x8(%ebp),%edx
11232c: 89 42 44 mov %eax,0x44(%edx)
11232f: 89 42 48 mov %eax,0x48(%edx)
return copied;
112332: 83 c4 10 add $0x10,%esp
112335: 8b 45 c8 mov -0x38(%ebp),%eax
}
112338: 8d 65 f4 lea -0xc(%ebp),%esp
11233b: 5b pop %ebx
11233c: 5e pop %esi
11233d: 5f pop %edi
11233e: c9 leave
11233f: c3 ret
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
if ( start_offset ) {
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK - start_offset;
112340: 89 55 c8 mov %edx,-0x38(%ebp)
112343: e9 73 ff ff ff jmp 1122bb <IMFS_memfile_write+0xf7>
if ( to_copy > my_length )
to_copy = my_length;
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
if ( !block_ptr )
return copied;
112348: 31 c0 xor %eax,%eax
}
IMFS_mtime_ctime_update( the_jnode );
return copied;
}
11234a: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
11234d: 5b pop %ebx <== NOT EXECUTED
11234e: 5e pop %esi <== NOT EXECUTED
11234f: 5f pop %edi <== NOT EXECUTED
112350: c9 leave <== NOT EXECUTED
112351: c3 ret <== NOT EXECUTED
last_byte = start + my_length;
if ( last_byte > the_jnode->info.file.size ) {
status = IMFS_memfile_extend( the_jnode, last_byte );
if ( status )
rtems_set_errno_and_return_minus_one( ENOSPC );
112352: e8 bd 0f 00 00 call 113314 <__errno>
112357: c7 00 1c 00 00 00 movl $0x1c,(%eax)
11235d: 83 c8 ff or $0xffffffff,%eax
112360: e9 22 ff ff ff jmp 112287 <IMFS_memfile_write+0xc3>
001079bc <IMFS_mknod>:
const char *token, /* IN */
mode_t mode, /* IN */
dev_t dev, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN/OUT */
)
{
1079bc: 55 push %ebp
1079bd: 89 e5 mov %esp,%ebp
1079bf: 57 push %edi
1079c0: 56 push %esi
1079c1: 53 push %ebx
1079c2: 83 ec 5c sub $0x5c,%esp
1079c5: 8b 55 08 mov 0x8(%ebp),%edx
1079c8: 8b 5d 0c mov 0xc(%ebp),%ebx
1079cb: 8b 75 10 mov 0x10(%ebp),%esi
1079ce: 8b 45 14 mov 0x14(%ebp),%eax
1079d1: 89 45 a4 mov %eax,-0x5c(%ebp)
IMFS_jnode_t *new_node;
int result;
char new_name[ IMFS_NAME_MAX + 1 ];
IMFS_types_union info;
IMFS_get_token( token, strlen( token ), new_name, &result );
1079d4: 31 c0 xor %eax,%eax
1079d6: b9 ff ff ff ff mov $0xffffffff,%ecx
1079db: 89 d7 mov %edx,%edi
1079dd: f2 ae repnz scas %es:(%edi),%al
1079df: f7 d1 not %ecx
1079e1: 49 dec %ecx
1079e2: 8d 45 e4 lea -0x1c(%ebp),%eax
1079e5: 50 push %eax
1079e6: 8d 7d af lea -0x51(%ebp),%edi
1079e9: 57 push %edi
1079ea: 51 push %ecx
1079eb: 52 push %edx
1079ec: e8 23 7f 00 00 call 10f914 <IMFS_get_token>
/*
* Figure out what type of IMFS node this is.
*/
if ( S_ISDIR(mode) )
1079f1: 89 d8 mov %ebx,%eax
1079f3: 25 00 f0 00 00 and $0xf000,%eax
1079f8: 83 c4 10 add $0x10,%esp
1079fb: 3d 00 40 00 00 cmp $0x4000,%eax
107a00: 74 56 je 107a58 <IMFS_mknod+0x9c>
type = IMFS_DIRECTORY;
else if ( S_ISREG(mode) )
107a02: 3d 00 80 00 00 cmp $0x8000,%eax
107a07: 74 57 je 107a60 <IMFS_mknod+0xa4>
type = IMFS_MEMORY_FILE;
else if ( S_ISBLK(mode) || S_ISCHR(mode) ) {
107a09: 3d 00 60 00 00 cmp $0x6000,%eax
107a0e: 74 14 je 107a24 <IMFS_mknod+0x68>
107a10: 3d 00 20 00 00 cmp $0x2000,%eax
107a15: 74 0d je 107a24 <IMFS_mknod+0x68>
type = IMFS_DEVICE;
rtems_filesystem_split_dev_t( dev, info.device.major, info.device.minor );
} else if (S_ISFIFO(mode))
107a17: 3d 00 10 00 00 cmp $0x1000,%eax
107a1c: 74 4a je 107a68 <IMFS_mknod+0xac> <== ALWAYS TAKEN
mode_t mode, /* IN */
dev_t dev, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN/OUT */
)
{
IMFS_token_types type = 0;
107a1e: 31 d2 xor %edx,%edx <== NOT EXECUTED
107a20: eb 10 jmp 107a32 <IMFS_mknod+0x76> <== NOT EXECUTED
107a22: 66 90 xchg %ax,%ax <== NOT EXECUTED
type = IMFS_DIRECTORY;
else if ( S_ISREG(mode) )
type = IMFS_MEMORY_FILE;
else if ( S_ISBLK(mode) || S_ISCHR(mode) ) {
type = IMFS_DEVICE;
rtems_filesystem_split_dev_t( dev, info.device.major, info.device.minor );
107a24: 89 75 d0 mov %esi,-0x30(%ebp)
dev_t device
)
{
union __rtems_dev_t temp;
temp.device = device;
107a27: 8b 45 a4 mov -0x5c(%ebp),%eax
107a2a: 89 45 d4 mov %eax,-0x2c(%ebp)
if ( S_ISDIR(mode) )
type = IMFS_DIRECTORY;
else if ( S_ISREG(mode) )
type = IMFS_MEMORY_FILE;
else if ( S_ISBLK(mode) || S_ISCHR(mode) ) {
type = IMFS_DEVICE;
107a2d: ba 02 00 00 00 mov $0x2,%edx
* was ONLY passed a NULL when we created the root node. We
* added a new IMFS_create_root_node() so this path no longer
* existed. The result was simpler code which should not have
* this path.
*/
new_node = IMFS_create_node( pathloc, type, new_name, mode, &info );
107a32: 83 ec 0c sub $0xc,%esp
107a35: 8d 45 d0 lea -0x30(%ebp),%eax
107a38: 50 push %eax
107a39: 53 push %ebx
107a3a: 57 push %edi
107a3b: 52 push %edx
107a3c: ff 75 18 pushl 0x18(%ebp)
107a3f: e8 08 75 00 00 call 10ef4c <IMFS_create_node>
if ( !new_node )
107a44: 83 c4 20 add $0x20,%esp
107a47: 85 c0 test %eax,%eax
107a49: 74 24 je 107a6f <IMFS_mknod+0xb3>
rtems_set_errno_and_return_minus_one( ENOMEM );
return 0;
107a4b: 31 c0 xor %eax,%eax
}
107a4d: 8d 65 f4 lea -0xc(%ebp),%esp
107a50: 5b pop %ebx
107a51: 5e pop %esi
107a52: 5f pop %edi
107a53: c9 leave
107a54: c3 ret
107a55: 8d 76 00 lea 0x0(%esi),%esi
/*
* Figure out what type of IMFS node this is.
*/
if ( S_ISDIR(mode) )
type = IMFS_DIRECTORY;
107a58: ba 01 00 00 00 mov $0x1,%edx
107a5d: eb d3 jmp 107a32 <IMFS_mknod+0x76>
107a5f: 90 nop
else if ( S_ISREG(mode) )
type = IMFS_MEMORY_FILE;
107a60: ba 05 00 00 00 mov $0x5,%edx
107a65: eb cb jmp 107a32 <IMFS_mknod+0x76>
107a67: 90 nop
else if ( S_ISBLK(mode) || S_ISCHR(mode) ) {
type = IMFS_DEVICE;
rtems_filesystem_split_dev_t( dev, info.device.major, info.device.minor );
} else if (S_ISFIFO(mode))
type = IMFS_FIFO;
107a68: ba 07 00 00 00 mov $0x7,%edx
107a6d: eb c3 jmp 107a32 <IMFS_mknod+0x76>
* existed. The result was simpler code which should not have
* this path.
*/
new_node = IMFS_create_node( pathloc, type, new_name, mode, &info );
if ( !new_node )
rtems_set_errno_and_return_minus_one( ENOMEM );
107a6f: e8 a0 b8 00 00 call 113314 <__errno>
107a74: c7 00 0c 00 00 00 movl $0xc,(%eax)
107a7a: b8 ff ff ff ff mov $0xffffffff,%eax
107a7f: eb cc jmp 107a4d <IMFS_mknod+0x91>
00107a84 <IMFS_mount>:
#include <rtems/seterr.h>
int IMFS_mount(
rtems_filesystem_mount_table_entry_t *mt_entry
)
{
107a84: 55 push %ebp
107a85: 89 e5 mov %esp,%ebp
107a87: 83 ec 08 sub $0x8,%esp
107a8a: 8b 55 08 mov 0x8(%ebp),%edx
IMFS_jnode_t *node;
node = mt_entry->mt_point_node.node_access;
107a8d: 8b 42 08 mov 0x8(%edx),%eax
/*
* Is the node that we are mounting onto a directory node ?
*/
if ( node->type != IMFS_DIRECTORY )
107a90: 83 78 4c 01 cmpl $0x1,0x4c(%eax)
107a94: 75 0a jne 107aa0 <IMFS_mount+0x1c> <== NEVER TAKEN
/*
* Set mt_fs pointer to point to the mount table entry for
* the mounted file system.
*/
node->info.directory.mt_fs = mt_entry;
107a96: 89 50 5c mov %edx,0x5c(%eax)
return 0;
107a99: 31 c0 xor %eax,%eax
}
107a9b: c9 leave
107a9c: c3 ret
107a9d: 8d 76 00 lea 0x0(%esi),%esi
/*
* Is the node that we are mounting onto a directory node ?
*/
if ( node->type != IMFS_DIRECTORY )
rtems_set_errno_and_return_minus_one( ENOTDIR );
107aa0: e8 6f b8 00 00 call 113314 <__errno> <== NOT EXECUTED
107aa5: c7 00 14 00 00 00 movl $0x14,(%eax) <== NOT EXECUTED
107aab: b8 ff ff ff ff mov $0xffffffff,%eax <== NOT EXECUTED
* the mounted file system.
*/
node->info.directory.mt_fs = mt_entry;
return 0;
}
107ab0: c9 leave <== NOT EXECUTED
107ab1: c3 ret <== NOT EXECUTED
0010a3b0 <IMFS_print_jnode>:
* This routine prints the contents of the specified jnode.
*/
void IMFS_print_jnode(
IMFS_jnode_t *the_jnode
)
{
10a3b0: 55 push %ebp
10a3b1: 89 e5 mov %esp,%ebp
10a3b3: 53 push %ebx
10a3b4: 83 ec 0c sub $0xc,%esp
10a3b7: 8b 5d 08 mov 0x8(%ebp),%ebx
IMFS_assert( the_jnode );
fprintf(stdout, "%s", the_jnode->name );
10a3ba: a1 c0 c4 12 00 mov 0x12c4c0,%eax
10a3bf: ff 70 08 pushl 0x8(%eax)
10a3c2: 8d 43 0c lea 0xc(%ebx),%eax
10a3c5: 50 push %eax
10a3c6: e8 75 d6 00 00 call 117a40 <fputs>
switch( the_jnode->type ) {
10a3cb: 8b 43 4c mov 0x4c(%ebx),%eax
10a3ce: 83 c4 10 add $0x10,%esp
10a3d1: 83 f8 07 cmp $0x7,%eax
10a3d4: 76 1e jbe 10a3f4 <IMFS_print_jnode+0x44> <== ALWAYS TAKEN
case IMFS_FIFO:
fprintf(stdout, " FIFO not printed\n" );
return;
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
10a3d6: 52 push %edx <== NOT EXECUTED
10a3d7: 50 push %eax <== NOT EXECUTED
10a3d8: 68 44 72 12 00 push $0x127244 <== NOT EXECUTED
10a3dd: a1 c0 c4 12 00 mov 0x12c4c0,%eax <== NOT EXECUTED
10a3e2: ff 70 08 pushl 0x8(%eax) <== NOT EXECUTED
10a3e5: e8 4a d5 00 00 call 117934 <fprintf> <== NOT EXECUTED
return;
10a3ea: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
puts("");
}
10a3ed: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
10a3f0: c9 leave <== NOT EXECUTED
10a3f1: c3 ret <== NOT EXECUTED
10a3f2: 66 90 xchg %ax,%ax <== NOT EXECUTED
)
{
IMFS_assert( the_jnode );
fprintf(stdout, "%s", the_jnode->name );
switch( the_jnode->type ) {
10a3f4: ff 24 85 5c 72 12 00 jmp *0x12725c(,%eax,4)
10a3fb: 90 nop
case IMFS_HARD_LINK:
fprintf(stdout, " links not printed\n" );
return;
case IMFS_SYM_LINK:
fprintf(stdout, " links not printed\n" );
10a3fc: a1 c0 c4 12 00 mov 0x12c4c0,%eax
10a401: ff 70 08 pushl 0x8(%eax)
10a404: 6a 13 push $0x13
10a406: 6a 01 push $0x1
10a408: 68 1d 72 12 00 push $0x12721d
10a40d: e8 52 e2 00 00 call 118664 <fwrite>
return;
10a412: 83 c4 10 add $0x10,%esp
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
return;
}
puts("");
}
10a415: 8b 5d fc mov -0x4(%ebp),%ebx
10a418: c9 leave
10a419: c3 ret
10a41a: 66 90 xchg %ax,%ax
case IMFS_SYM_LINK:
fprintf(stdout, " links not printed\n" );
return;
case IMFS_FIFO:
fprintf(stdout, " FIFO not printed\n" );
10a41c: a1 c0 c4 12 00 mov 0x12c4c0,%eax
10a421: ff 70 08 pushl 0x8(%eax)
10a424: 6a 12 push $0x12
10a426: 6a 01 push $0x1
10a428: 68 31 72 12 00 push $0x127231
10a42d: e8 32 e2 00 00 call 118664 <fwrite>
return;
10a432: 83 c4 10 add $0x10,%esp
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
return;
}
puts("");
}
10a435: 8b 5d fc mov -0x4(%ebp),%ebx
10a438: c9 leave
10a439: c3 ret
10a43a: 66 90 xchg %ax,%ax
the_jnode->info.file.indirect,
the_jnode->info.file.doubly_indirect,
the_jnode->info.file.triply_indirect
);
#else
fprintf(stdout, " (file %" PRId32 ")",
10a43c: 51 push %ecx
10a43d: ff 73 50 pushl 0x50(%ebx)
10a440: 68 11 72 12 00 push $0x127211
10a445: a1 c0 c4 12 00 mov 0x12c4c0,%eax
10a44a: ff 70 08 pushl 0x8(%eax)
10a44d: e8 e2 d4 00 00 call 117934 <fprintf>
(uint32_t)the_jnode->info.file.size );
#endif
break;
10a452: 83 c4 10 add $0x10,%esp
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
return;
}
puts("");
10a455: c7 45 08 49 75 12 00 movl $0x127549,0x8(%ebp)
}
10a45c: 8b 5d fc mov -0x4(%ebp),%ebx
10a45f: c9 leave
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
return;
}
puts("");
10a460: e9 f3 ed 00 00 jmp 119258 <puts>
10a465: 8d 76 00 lea 0x0(%esi),%esi
fprintf(stdout, " (device %" PRId32 ", %" PRId32 ")",
the_jnode->info.device.major, the_jnode->info.device.minor );
break;
case IMFS_LINEAR_FILE:
fprintf(stdout, " (file %" PRId32 " %p)",
10a468: ff 73 58 pushl 0x58(%ebx)
10a46b: ff 73 50 pushl 0x50(%ebx)
10a46e: 68 02 72 12 00 push $0x127202
10a473: a1 c0 c4 12 00 mov 0x12c4c0,%eax
10a478: ff 70 08 pushl 0x8(%eax)
10a47b: e8 b4 d4 00 00 call 117934 <fprintf>
(uint32_t)the_jnode->info.linearfile.size,
the_jnode->info.linearfile.direct
);
break;
10a480: 83 c4 10 add $0x10,%esp
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
return;
}
puts("");
10a483: c7 45 08 49 75 12 00 movl $0x127549,0x8(%ebp)
}
10a48a: 8b 5d fc mov -0x4(%ebp),%ebx
10a48d: c9 leave
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
return;
}
puts("");
10a48e: e9 c5 ed 00 00 jmp 119258 <puts>
10a493: 90 nop
IMFS_assert( the_jnode );
fprintf(stdout, "%s", the_jnode->name );
switch( the_jnode->type ) {
case IMFS_DIRECTORY:
fprintf(stdout, "/" );
10a494: 83 ec 08 sub $0x8,%esp
10a497: a1 c0 c4 12 00 mov 0x12c4c0,%eax
10a49c: ff 70 08 pushl 0x8(%eax)
10a49f: 6a 2f push $0x2f
10a4a1: e8 ee d4 00 00 call 117994 <fputc>
break;
10a4a6: 83 c4 10 add $0x10,%esp
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
return;
}
puts("");
10a4a9: c7 45 08 49 75 12 00 movl $0x127549,0x8(%ebp)
}
10a4b0: 8b 5d fc mov -0x4(%ebp),%ebx
10a4b3: c9 leave
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
return;
}
puts("");
10a4b4: e9 9f ed 00 00 jmp 119258 <puts>
10a4b9: 8d 76 00 lea 0x0(%esi),%esi
case IMFS_DIRECTORY:
fprintf(stdout, "/" );
break;
case IMFS_DEVICE:
fprintf(stdout, " (device %" PRId32 ", %" PRId32 ")",
10a4bc: ff 73 54 pushl 0x54(%ebx)
10a4bf: ff 73 50 pushl 0x50(%ebx)
10a4c2: 68 ef 71 12 00 push $0x1271ef
10a4c7: a1 c0 c4 12 00 mov 0x12c4c0,%eax
10a4cc: ff 70 08 pushl 0x8(%eax)
10a4cf: e8 60 d4 00 00 call 117934 <fprintf>
the_jnode->info.device.major, the_jnode->info.device.minor );
break;
10a4d4: 83 c4 10 add $0x10,%esp
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
return;
}
puts("");
10a4d7: c7 45 08 49 75 12 00 movl $0x127549,0x8(%ebp)
}
10a4de: 8b 5d fc mov -0x4(%ebp),%ebx
10a4e1: c9 leave
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
return;
}
puts("");
10a4e2: e9 71 ed 00 00 jmp 119258 <puts>
00107ac4 <IMFS_readlink>:
ssize_t IMFS_readlink(
rtems_filesystem_location_info_t *loc,
char *buf, /* OUT */
size_t bufsize
)
{
107ac4: 55 push %ebp
107ac5: 89 e5 mov %esp,%ebp
107ac7: 57 push %edi
107ac8: 56 push %esi
107ac9: 53 push %ebx
107aca: 8b 7d 0c mov 0xc(%ebp),%edi
107acd: 8b 5d 10 mov 0x10(%ebp),%ebx
IMFS_jnode_t *node;
ssize_t i;
node = loc->node_access;
107ad0: 8b 45 08 mov 0x8(%ebp),%eax
107ad3: 8b 30 mov (%eax),%esi
IMFS_assert( node->type == IMFS_SYM_LINK );
for( i=0; ((i<bufsize) && (node->info.sym_link.name[i] != '\0')); i++ )
107ad5: 85 db test %ebx,%ebx
107ad7: 74 28 je 107b01 <IMFS_readlink+0x3d> <== NEVER TAKEN
107ad9: 8b 46 50 mov 0x50(%esi),%eax
107adc: 8a 10 mov (%eax),%dl
107ade: 84 d2 test %dl,%dl
107ae0: 74 1f je 107b01 <IMFS_readlink+0x3d> <== NEVER TAKEN
107ae2: 31 c9 xor %ecx,%ecx
107ae4: 31 c0 xor %eax,%eax
107ae6: eb 0a jmp 107af2 <IMFS_readlink+0x2e>
107ae8: 8b 56 50 mov 0x50(%esi),%edx
107aeb: 8a 14 02 mov (%edx,%eax,1),%dl
107aee: 84 d2 test %dl,%dl
107af0: 74 0a je 107afc <IMFS_readlink+0x38>
buf[i] = node->info.sym_link.name[i];
107af2: 88 14 0f mov %dl,(%edi,%ecx,1)
node = loc->node_access;
IMFS_assert( node->type == IMFS_SYM_LINK );
for( i=0; ((i<bufsize) && (node->info.sym_link.name[i] != '\0')); i++ )
107af5: 40 inc %eax
107af6: 89 c1 mov %eax,%ecx
107af8: 39 d8 cmp %ebx,%eax
107afa: 72 ec jb 107ae8 <IMFS_readlink+0x24>
buf[i] = node->info.sym_link.name[i];
return i;
}
107afc: 5b pop %ebx
107afd: 5e pop %esi
107afe: 5f pop %edi
107aff: c9 leave
107b00: c3 ret
node = loc->node_access;
IMFS_assert( node->type == IMFS_SYM_LINK );
for( i=0; ((i<bufsize) && (node->info.sym_link.name[i] != '\0')); i++ )
107b01: 31 c0 xor %eax,%eax
107b03: eb f7 jmp 107afc <IMFS_readlink+0x38> <== NOT EXECUTED
00107b08 <IMFS_rename>:
rtems_filesystem_location_info_t *old_parent_loc, /* IN */
rtems_filesystem_location_info_t *old_loc, /* IN */
rtems_filesystem_location_info_t *new_parent_loc, /* IN */
const char *new_name /* IN */
)
{
107b08: 55 push %ebp
107b09: 89 e5 mov %esp,%ebp
107b0b: 53 push %ebx
107b0c: 83 ec 18 sub $0x18,%esp
IMFS_jnode_t *the_jnode;
IMFS_jnode_t *new_parent;
the_jnode = old_loc->node_access;
107b0f: 8b 45 0c mov 0xc(%ebp),%eax
107b12: 8b 18 mov (%eax),%ebx
strncpy( the_jnode->name, new_name, IMFS_NAME_MAX );
107b14: 6a 20 push $0x20
107b16: ff 75 14 pushl 0x14(%ebp)
107b19: 8d 43 0c lea 0xc(%ebx),%eax
107b1c: 50 push %eax
107b1d: e8 ea c5 00 00 call 11410c <strncpy>
if ( the_jnode->Parent != NULL )
107b22: 83 c4 10 add $0x10,%esp
107b25: 8b 4b 08 mov 0x8(%ebx),%ecx
107b28: 85 c9 test %ecx,%ecx
107b2a: 74 0c je 107b38 <IMFS_rename+0x30> <== NEVER TAKEN
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
107b2c: 83 ec 0c sub $0xc,%esp
107b2f: 53 push %ebx
107b30: e8 cb 44 00 00 call 10c000 <_Chain_Extract>
107b35: 83 c4 10 add $0x10,%esp
rtems_chain_extract( (rtems_chain_node *) the_jnode );
new_parent = new_parent_loc->node_access;
107b38: 8b 45 10 mov 0x10(%ebp),%eax
107b3b: 8b 00 mov (%eax),%eax
the_jnode->Parent = new_parent;
107b3d: 89 43 08 mov %eax,0x8(%ebx)
RTEMS_INLINE_ROUTINE void rtems_chain_append(
rtems_chain_control *the_chain,
rtems_chain_node *the_node
)
{
_Chain_Append( the_chain, the_node );
107b40: 83 ec 08 sub $0x8,%esp
107b43: 53 push %ebx
rtems_chain_append( &new_parent->info.directory.Entries, &the_jnode->Node );
107b44: 83 c0 50 add $0x50,%eax
107b47: 50 push %eax
107b48: e8 8f 44 00 00 call 10bfdc <_Chain_Append>
/*
* Update the time.
*/
IMFS_update_ctime( the_jnode );
107b4d: 58 pop %eax
107b4e: 5a pop %edx
107b4f: 6a 00 push $0x0
107b51: 8d 45 f0 lea -0x10(%ebp),%eax
107b54: 50 push %eax
107b55: e8 d6 05 00 00 call 108130 <gettimeofday>
107b5a: 8b 45 f0 mov -0x10(%ebp),%eax
107b5d: 89 43 48 mov %eax,0x48(%ebx)
return 0;
}
107b60: 31 c0 xor %eax,%eax
107b62: 8b 5d fc mov -0x4(%ebp),%ebx
107b65: c9 leave
107b66: c3 ret
0010fae0 <IMFS_stat>:
int IMFS_stat(
rtems_filesystem_location_info_t *loc,
struct stat *buf
)
{
10fae0: 55 push %ebp
10fae1: 89 e5 mov %esp,%ebp
10fae3: 56 push %esi
10fae4: 53 push %ebx
10fae5: 8b 4d 08 mov 0x8(%ebp),%ecx
10fae8: 8b 45 0c mov 0xc(%ebp),%eax
IMFS_fs_info_t *fs_info;
IMFS_jnode_t *the_jnode;
IMFS_device_t *io;
the_jnode = loc->node_access;
10faeb: 8b 11 mov (%ecx),%edx
switch ( the_jnode->type ) {
10faed: 83 7a 4c 07 cmpl $0x7,0x4c(%edx)
10faf1: 76 15 jbe 10fb08 <IMFS_stat+0x28> <== ALWAYS TAKEN
case IMFS_FIFO:
buf->st_size = 0;
break;
default:
rtems_set_errno_and_return_minus_one( ENOTSUP );
10faf3: e8 1c 38 00 00 call 113314 <__errno>
10faf8: c7 00 86 00 00 00 movl $0x86,(%eax)
10fafe: b8 ff ff ff ff mov $0xffffffff,%eax
buf->st_atime = the_jnode->stat_atime;
buf->st_mtime = the_jnode->stat_mtime;
buf->st_ctime = the_jnode->stat_ctime;
return 0;
}
10fb03: 5b pop %ebx
10fb04: 5e pop %esi
10fb05: c9 leave
10fb06: c3 ret
10fb07: 90 nop
IMFS_device_t *io;
the_jnode = loc->node_access;
switch ( the_jnode->type ) {
10fb08: 8b 5a 4c mov 0x4c(%edx),%ebx
10fb0b: ff 24 9d b8 19 12 00 jmp *0x1219b8(,%ebx,4)
10fb12: 66 90 xchg %ax,%ax
case IMFS_SYM_LINK:
buf->st_size = 0;
break;
case IMFS_FIFO:
buf->st_size = 0;
10fb14: c7 40 20 00 00 00 00 movl $0x0,0x20(%eax)
10fb1b: c7 40 24 00 00 00 00 movl $0x0,0x24(%eax)
/*
* The device number of the IMFS is the major number and the minor is the
* instance.
*/
fs_info = loc->mt_entry->fs_info;
10fb22: 8b 49 10 mov 0x10(%ecx),%ecx
buf->st_dev =
rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance );
10fb25: 8b 49 34 mov 0x34(%ecx),%ecx
10fb28: 8b 09 mov (%ecx),%ecx
/*
* The device number of the IMFS is the major number and the minor is the
* instance.
*/
fs_info = loc->mt_entry->fs_info;
buf->st_dev =
10fb2a: c7 00 fe ff 00 00 movl $0xfffe,(%eax)
10fb30: 89 48 04 mov %ecx,0x4(%eax)
rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance );
buf->st_mode = the_jnode->st_mode;
10fb33: 8b 4a 30 mov 0x30(%edx),%ecx
10fb36: 89 48 0c mov %ecx,0xc(%eax)
buf->st_nlink = the_jnode->st_nlink;
10fb39: 8b 4a 34 mov 0x34(%edx),%ecx
10fb3c: 66 89 48 10 mov %cx,0x10(%eax)
buf->st_ino = the_jnode->st_ino;
10fb40: 8b 4a 38 mov 0x38(%edx),%ecx
10fb43: 89 48 08 mov %ecx,0x8(%eax)
buf->st_uid = the_jnode->st_uid;
10fb46: 8b 4a 3c mov 0x3c(%edx),%ecx
10fb49: 66 89 48 12 mov %cx,0x12(%eax)
buf->st_gid = the_jnode->st_gid;
10fb4d: 66 8b 4a 3e mov 0x3e(%edx),%cx
10fb51: 66 89 48 14 mov %cx,0x14(%eax)
buf->st_atime = the_jnode->stat_atime;
10fb55: 8b 4a 40 mov 0x40(%edx),%ecx
10fb58: 89 48 28 mov %ecx,0x28(%eax)
buf->st_mtime = the_jnode->stat_mtime;
10fb5b: 8b 4a 44 mov 0x44(%edx),%ecx
10fb5e: 89 48 30 mov %ecx,0x30(%eax)
buf->st_ctime = the_jnode->stat_ctime;
10fb61: 8b 52 48 mov 0x48(%edx),%edx
10fb64: 89 50 38 mov %edx,0x38(%eax)
return 0;
10fb67: 31 c0 xor %eax,%eax
}
10fb69: 5b pop %ebx
10fb6a: 5e pop %esi
10fb6b: c9 leave
10fb6c: c3 ret
10fb6d: 8d 76 00 lea 0x0(%esi),%esi
switch ( the_jnode->type ) {
case IMFS_DEVICE:
io = &the_jnode->info.device;
buf->st_rdev = rtems_filesystem_make_dev_t( io->major, io->minor );
10fb70: 8b 5a 54 mov 0x54(%edx),%ebx
rtems_device_minor_number _minor
)
{
union __rtems_dev_t temp;
temp.__overlay.major = _major;
10fb73: 8b 72 50 mov 0x50(%edx),%esi
10fb76: 89 70 18 mov %esi,0x18(%eax)
10fb79: 89 58 1c mov %ebx,0x1c(%eax)
break;
10fb7c: eb a4 jmp 10fb22 <IMFS_stat+0x42>
10fb7e: 66 90 xchg %ax,%ax
case IMFS_LINEAR_FILE:
case IMFS_MEMORY_FILE:
buf->st_size = the_jnode->info.file.size;
10fb80: 8b 5a 50 mov 0x50(%edx),%ebx
10fb83: 8b 72 54 mov 0x54(%edx),%esi
10fb86: 89 58 20 mov %ebx,0x20(%eax)
10fb89: 89 70 24 mov %esi,0x24(%eax)
break;
10fb8c: eb 94 jmp 10fb22 <IMFS_stat+0x42>
00107bfc <IMFS_unlink>:
int IMFS_unlink(
rtems_filesystem_location_info_t *parentloc, /* IN */
rtems_filesystem_location_info_t *loc /* IN */
)
{
107bfc: 55 push %ebp
107bfd: 89 e5 mov %esp,%ebp
107bff: 57 push %edi
107c00: 56 push %esi
107c01: 53 push %ebx
107c02: 83 ec 3c sub $0x3c,%esp
107c05: 8b 5d 0c mov 0xc(%ebp),%ebx
IMFS_jnode_t *node;
rtems_filesystem_location_info_t the_link;
int result = 0;
node = loc->node_access;
107c08: 8b 13 mov (%ebx),%edx
/*
* If this is the last last pointer to the node
* free the node.
*/
if ( node->type == IMFS_HARD_LINK ) {
107c0a: 83 7a 4c 03 cmpl $0x3,0x4c(%edx)
107c0e: 74 18 je 107c28 <IMFS_unlink+0x2c>
/*
* Now actually free the node we were asked to free.
*/
result = (*loc->handlers->rmnod_h)( parentloc, loc );
107c10: 83 ec 08 sub $0x8,%esp
107c13: 8b 43 08 mov 0x8(%ebx),%eax
107c16: 53 push %ebx
107c17: ff 75 08 pushl 0x8(%ebp)
107c1a: ff 50 34 call *0x34(%eax)
return result;
107c1d: 83 c4 10 add $0x10,%esp
}
107c20: 8d 65 f4 lea -0xc(%ebp),%esp
107c23: 5b pop %ebx
107c24: 5e pop %esi
107c25: 5f pop %edi
107c26: c9 leave
107c27: c3 ret
* free the node.
*/
if ( node->type == IMFS_HARD_LINK ) {
if ( !node->info.hard_link.link_node )
107c28: 8b 42 50 mov 0x50(%edx),%eax
107c2b: 85 c0 test %eax,%eax
107c2d: 74 79 je 107ca8 <IMFS_unlink+0xac> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
the_link = *loc;
107c2f: 8d 7d cc lea -0x34(%ebp),%edi
107c32: b9 05 00 00 00 mov $0x5,%ecx
107c37: 89 de mov %ebx,%esi
107c39: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
the_link.node_access = node->info.hard_link.link_node;
107c3b: 89 45 cc mov %eax,-0x34(%ebp)
IMFS_Set_handlers( &the_link );
107c3e: 83 ec 0c sub $0xc,%esp
107c41: 8d 75 cc lea -0x34(%ebp),%esi
107c44: 56 push %esi
107c45: 89 55 c4 mov %edx,-0x3c(%ebp)
107c48: e8 6b 74 00 00 call 10f0b8 <IMFS_Set_handlers>
/*
* If removing the last hard link to a node, then we need
* to remove the node that is a link and the node itself.
*/
if ( node->info.hard_link.link_node->st_nlink == 1)
107c4d: 8b 55 c4 mov -0x3c(%ebp),%edx
107c50: 8b 42 50 mov 0x50(%edx),%eax
107c53: 8b 48 34 mov 0x34(%eax),%ecx
107c56: 83 c4 10 add $0x10,%esp
107c59: 66 83 f9 01 cmp $0x1,%cx
107c5d: 74 27 je 107c86 <IMFS_unlink+0x8a>
if ( result != 0 )
return -1;
}
else
{
node->info.hard_link.link_node->st_nlink --;
107c5f: 49 dec %ecx
107c60: 66 89 48 34 mov %cx,0x34(%eax)
IMFS_update_ctime( node->info.hard_link.link_node );
107c64: 83 ec 08 sub $0x8,%esp
107c67: 6a 00 push $0x0
107c69: 8d 45 e0 lea -0x20(%ebp),%eax
107c6c: 50 push %eax
107c6d: 89 55 c4 mov %edx,-0x3c(%ebp)
107c70: e8 bb 04 00 00 call 108130 <gettimeofday>
107c75: 8b 55 c4 mov -0x3c(%ebp),%edx
107c78: 8b 42 50 mov 0x50(%edx),%eax
107c7b: 8b 55 e0 mov -0x20(%ebp),%edx
107c7e: 89 50 48 mov %edx,0x48(%eax)
107c81: 83 c4 10 add $0x10,%esp
107c84: eb 8a jmp 107c10 <IMFS_unlink+0x14>
* to remove the node that is a link and the node itself.
*/
if ( node->info.hard_link.link_node->st_nlink == 1)
{
result = (*the_link.handlers->rmnod_h)( parentloc, &the_link );
107c86: 83 ec 08 sub $0x8,%esp
107c89: 56 push %esi
107c8a: ff 75 08 pushl 0x8(%ebp)
107c8d: 8b 45 d4 mov -0x2c(%ebp),%eax
107c90: ff 50 34 call *0x34(%eax)
if ( result != 0 )
107c93: 83 c4 10 add $0x10,%esp
107c96: 85 c0 test %eax,%eax
107c98: 0f 84 72 ff ff ff je 107c10 <IMFS_unlink+0x14>
return -1;
107c9e: b8 ff ff ff ff mov $0xffffffff,%eax
107ca3: e9 78 ff ff ff jmp 107c20 <IMFS_unlink+0x24>
*/
if ( node->type == IMFS_HARD_LINK ) {
if ( !node->info.hard_link.link_node )
rtems_set_errno_and_return_minus_one( EINVAL );
107ca8: e8 67 b6 00 00 call 113314 <__errno> <== NOT EXECUTED
107cad: c7 00 16 00 00 00 movl $0x16,(%eax) <== NOT EXECUTED
107cb3: b8 ff ff ff ff mov $0xffffffff,%eax <== NOT EXECUTED
107cb8: e9 63 ff ff ff jmp 107c20 <IMFS_unlink+0x24> <== NOT EXECUTED
00107cc0 <IMFS_unmount>:
#include <rtems/seterr.h>
int IMFS_unmount(
rtems_filesystem_mount_table_entry_t *mt_entry
)
{
107cc0: 55 push %ebp
107cc1: 89 e5 mov %esp,%ebp
107cc3: 83 ec 08 sub $0x8,%esp
IMFS_jnode_t *node;
node = mt_entry->mt_point_node.node_access;
107cc6: 8b 45 08 mov 0x8(%ebp),%eax
107cc9: 8b 40 08 mov 0x8(%eax),%eax
/*
* Is the node that we are mounting onto a directory node ?
*/
if ( node->type != IMFS_DIRECTORY )
107ccc: 83 78 4c 01 cmpl $0x1,0x4c(%eax)
107cd0: 75 12 jne 107ce4 <IMFS_unmount+0x24> <== NEVER TAKEN
/*
* Did the node indicate that there was a directory mounted here?
*/
if ( node->info.directory.mt_fs == NULL )
107cd2: 8b 50 5c mov 0x5c(%eax),%edx
107cd5: 85 d2 test %edx,%edx
107cd7: 74 1d je 107cf6 <IMFS_unmount+0x36> <== NEVER TAKEN
/*
* Set the mt_fs pointer to indicate that there is no longer
* a file system mounted to this point.
*/
node->info.directory.mt_fs = NULL;
107cd9: c7 40 5c 00 00 00 00 movl $0x0,0x5c(%eax)
return 0;
107ce0: 31 c0 xor %eax,%eax
}
107ce2: c9 leave
107ce3: c3 ret
/*
* Is the node that we are mounting onto a directory node ?
*/
if ( node->type != IMFS_DIRECTORY )
rtems_set_errno_and_return_minus_one( ENOTDIR );
107ce4: e8 2b b6 00 00 call 113314 <__errno> <== NOT EXECUTED
107ce9: c7 00 14 00 00 00 movl $0x14,(%eax) <== NOT EXECUTED
107cef: b8 ff ff ff ff mov $0xffffffff,%eax <== NOT EXECUTED
*/
node->info.directory.mt_fs = NULL;
return 0;
}
107cf4: c9 leave <== NOT EXECUTED
107cf5: c3 ret <== NOT EXECUTED
/*
* Did the node indicate that there was a directory mounted here?
*/
if ( node->info.directory.mt_fs == NULL )
rtems_set_errno_and_return_minus_one( EINVAL ); /* XXX */
107cf6: e8 19 b6 00 00 call 113314 <__errno> <== NOT EXECUTED
107cfb: c7 00 16 00 00 00 movl $0x16,(%eax) <== NOT EXECUTED
107d01: b8 ff ff ff ff mov $0xffffffff,%eax <== NOT EXECUTED
*/
node->info.directory.mt_fs = NULL;
return 0;
}
107d06: c9 leave <== NOT EXECUTED
107d07: c3 ret <== NOT EXECUTED
001082dc <RTEMS_Malloc_Initialize>:
void RTEMS_Malloc_Initialize(
void *heap_begin,
uintptr_t heap_size,
size_t sbrk_amount
)
{
1082dc: 55 push %ebp
1082dd: 89 e5 mov %esp,%ebp
1082df: 57 push %edi
1082e0: 56 push %esi
1082e1: 53 push %ebx
1082e2: 83 ec 0c sub $0xc,%esp
1082e5: 8b 5d 08 mov 0x8(%ebp),%ebx
1082e8: 8b 75 0c mov 0xc(%ebp),%esi
1082eb: 8b 7d 10 mov 0x10(%ebp),%edi
/*
* If configured, initialize the statistics support
*/
if ( rtems_malloc_statistics_helpers != NULL ) {
1082ee: a1 88 60 12 00 mov 0x126088,%eax
1082f3: 85 c0 test %eax,%eax
1082f5: 74 02 je 1082f9 <RTEMS_Malloc_Initialize+0x1d>
(*rtems_malloc_statistics_helpers->initialize)();
1082f7: ff 10 call *(%eax)
}
/*
* Initialize the garbage collection list to start with nothing on it.
*/
malloc_deferred_frees_initialize();
1082f9: e8 76 ff ff ff call 108274 <malloc_deferred_frees_initialize>
/*
* Initialize the optional sbrk support for extending the heap
*/
if ( rtems_malloc_sbrk_helpers != NULL ) {
1082fe: a1 8c 60 12 00 mov 0x12608c,%eax
108303: 85 c0 test %eax,%eax
108305: 74 0e je 108315 <RTEMS_Malloc_Initialize+0x39>
heap_begin = (*rtems_malloc_sbrk_helpers->initialize)(
108307: 83 ec 08 sub $0x8,%esp
10830a: 57 push %edi
10830b: 53 push %ebx
10830c: ff 10 call *(%eax)
10830e: 89 c3 mov %eax,%ebx
108310: 83 c4 10 add $0x10,%esp
heap_begin,
sbrk_amount
);
heap_size = (uintptr_t) sbrk_amount;
108313: 89 fe mov %edi,%esi
* of the time under UNIX because zero'ing memory when it is first
* given to a process eliminates the chance of a process seeing data
* left over from another process. This would be a security violation.
*/
if (
108315: 80 3d 84 60 12 00 00 cmpb $0x0,0x126084
10831c: 75 1f jne 10833d <RTEMS_Malloc_Initialize+0x61>
!rtems_unified_work_area
&& rtems_configuration_get_do_zero_of_workspace()
10831e: 80 3d 2c 3b 12 00 00 cmpb $0x0,0x123b2c
108325: 75 41 jne 108368 <RTEMS_Malloc_Initialize+0x8c>
void *area_begin,
uintptr_t area_size,
uintptr_t page_size
)
{
return _Heap_Initialize( heap, area_begin, area_size, page_size );
108327: 6a 04 push $0x4
108329: 56 push %esi
10832a: 53 push %ebx
10832b: ff 35 38 3a 12 00 pushl 0x123a38
108331: e8 ba 43 00 00 call 10c6f0 <_Heap_Initialize>
RTEMS_Malloc_Heap,
heap_begin,
heap_size,
CPU_HEAP_ALIGNMENT
);
if ( status == 0 ) {
108336: 83 c4 10 add $0x10,%esp
108339: 85 c0 test %eax,%eax
10833b: 74 3e je 10837b <RTEMS_Malloc_Initialize+0x9f>
rtems_fatal_error_occurred( RTEMS_NO_MEMORY );
}
}
MSBUMP( space_available, _Protected_heap_Get_size(RTEMS_Malloc_Heap) );
10833d: 8b 1d e0 7c 12 00 mov 0x127ce0,%ebx
108343: 83 ec 0c sub $0xc,%esp
108346: ff 35 38 3a 12 00 pushl 0x123a38
10834c: e8 23 4e 00 00 call 10d174 <_Protected_heap_Get_size>
108351: 8d 1c 18 lea (%eax,%ebx,1),%ebx
108354: 89 1d e0 7c 12 00 mov %ebx,0x127ce0
10835a: 83 c4 10 add $0x10,%esp
}
10835d: 8d 65 f4 lea -0xc(%ebp),%esp
108360: 5b pop %ebx
108361: 5e pop %esi
108362: 5f pop %edi
108363: c9 leave
108364: c3 ret
108365: 8d 76 00 lea 0x0(%esi),%esi
if (
!rtems_unified_work_area
&& rtems_configuration_get_do_zero_of_workspace()
) {
memset( heap_begin, 0, heap_size );
108368: 31 c0 xor %eax,%eax
10836a: 89 df mov %ebx,%edi
10836c: 89 f1 mov %esi,%ecx
10836e: f3 aa rep stos %al,%es:(%edi)
* Unfortunately we cannot use assert if this fails because if this
* has failed we do not have a heap and if we do not have a heap
* STDIO cannot work because there will be no buffers.
*/
if ( !rtems_unified_work_area ) {
108370: 80 3d 84 60 12 00 00 cmpb $0x0,0x126084
108377: 74 ae je 108327 <RTEMS_Malloc_Initialize+0x4b><== ALWAYS TAKEN
108379: eb c2 jmp 10833d <RTEMS_Malloc_Initialize+0x61><== NOT EXECUTED
heap_begin,
heap_size,
CPU_HEAP_ALIGNMENT
);
if ( status == 0 ) {
rtems_fatal_error_occurred( RTEMS_NO_MEMORY );
10837b: 83 ec 0c sub $0xc,%esp
10837e: 6a 1a push $0x1a
108380: e8 7b 39 00 00 call 10bd00 <rtems_fatal_error_occurred>
00107df0 <Stack_check_Dump_threads_usage>:
static rtems_printk_plugin_t print_handler;
void Stack_check_Dump_threads_usage(
Thread_Control *the_thread
)
{
107df0: 55 push %ebp <== NOT EXECUTED
107df1: 89 e5 mov %esp,%ebp <== NOT EXECUTED
107df3: 57 push %edi <== NOT EXECUTED
107df4: 56 push %esi <== NOT EXECUTED
107df5: 53 push %ebx <== NOT EXECUTED
107df6: 83 ec 2c sub $0x2c,%esp <== NOT EXECUTED
107df9: 8b 5d 08 mov 0x8(%ebp),%ebx <== NOT EXECUTED
/*
* Obtain interrupt stack information
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (the_thread == (Thread_Control *) -1) {
107dfc: 83 fb ff cmp $0xffffffff,%ebx <== NOT EXECUTED
107dff: 0f 84 37 01 00 00 je 107f3c <Stack_check_Dump_threads_usage+0x14c><== NOT EXECUTED
the_thread = 0;
current = 0;
} else
#endif
{
stack = &the_thread->Start.Initial_stack;
107e05: 8d b3 b8 00 00 00 lea 0xb8(%ebx),%esi <== NOT EXECUTED
current = (void *)_CPU_Context_Get_SP( &the_thread->Registers );
107e0b: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax <== NOT EXECUTED
107e11: 89 45 d0 mov %eax,-0x30(%ebp) <== NOT EXECUTED
107e14: 8b 8b bc 00 00 00 mov 0xbc(%ebx),%ecx <== NOT EXECUTED
}
low = Stack_check_usable_stack_start(stack);
107e1a: 8d 51 10 lea 0x10(%ecx),%edx <== NOT EXECUTED
107e1d: 89 55 d4 mov %edx,-0x2c(%ebp) <== NOT EXECUTED
size = Stack_check_usable_stack_size(stack);
107e20: 8b 3e mov (%esi),%edi <== NOT EXECUTED
107e22: 83 ef 10 sub $0x10,%edi <== NOT EXECUTED
/*
* start at lower memory and find first word that does not
* match pattern
*/
base += PATTERN_SIZE_WORDS;
107e25: 8d 41 20 lea 0x20(%ecx),%eax <== NOT EXECUTED
for (ebase = base + length; base < ebase; base++)
107e28: 89 fa mov %edi,%edx <== NOT EXECUTED
107e2a: 83 e2 fc and $0xfffffffc,%edx <== NOT EXECUTED
107e2d: 8d 14 10 lea (%eax,%edx,1),%edx <== NOT EXECUTED
107e30: 39 d0 cmp %edx,%eax <== NOT EXECUTED
107e32: 73 23 jae 107e57 <Stack_check_Dump_threads_usage+0x67><== NOT EXECUTED
if (*base != U32_PATTERN)
107e34: 81 79 20 a5 a5 a5 a5 cmpl $0xa5a5a5a5,0x20(%ecx) <== NOT EXECUTED
107e3b: 74 13 je 107e50 <Stack_check_Dump_threads_usage+0x60><== NOT EXECUTED
107e3d: e9 a2 00 00 00 jmp 107ee4 <Stack_check_Dump_threads_usage+0xf4><== NOT EXECUTED
107e42: 66 90 xchg %ax,%ax <== NOT EXECUTED
107e44: 81 38 a5 a5 a5 a5 cmpl $0xa5a5a5a5,(%eax) <== NOT EXECUTED
107e4a: 0f 85 94 00 00 00 jne 107ee4 <Stack_check_Dump_threads_usage+0xf4><== NOT EXECUTED
* start at lower memory and find first word that does not
* match pattern
*/
base += PATTERN_SIZE_WORDS;
for (ebase = base + length; base < ebase; base++)
107e50: 83 c0 04 add $0x4,%eax <== NOT EXECUTED
107e53: 39 c2 cmp %eax,%edx <== NOT EXECUTED
107e55: 77 ed ja 107e44 <Stack_check_Dump_threads_usage+0x54><== NOT EXECUTED
high_water_mark = Stack_check_find_high_water_mark(low, size);
if ( high_water_mark )
used = Stack_check_Calculate_used( low, size, high_water_mark );
else
used = 0;
107e57: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp) <== NOT EXECUTED
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if ( the_thread )
107e5e: 85 db test %ebx,%ebx <== NOT EXECUTED
107e60: 0f 84 98 00 00 00 je 107efe <Stack_check_Dump_threads_usage+0x10e><== NOT EXECUTED
#endif
{
(*print_handler)(
107e66: a1 44 a6 12 00 mov 0x12a644,%eax <== NOT EXECUTED
107e6b: 89 45 cc mov %eax,-0x34(%ebp) <== NOT EXECUTED
107e6e: 50 push %eax <== NOT EXECUTED
107e6f: 8d 45 e3 lea -0x1d(%ebp),%eax <== NOT EXECUTED
107e72: 50 push %eax <== NOT EXECUTED
107e73: 6a 05 push $0x5 <== NOT EXECUTED
107e75: ff 73 08 pushl 0x8(%ebx) <== NOT EXECUTED
107e78: e8 27 5f 00 00 call 10dda4 <rtems_object_get_name> <== NOT EXECUTED
107e7d: 50 push %eax <== NOT EXECUTED
107e7e: ff 73 08 pushl 0x8(%ebx) <== NOT EXECUTED
107e81: 68 13 3e 12 00 push $0x123e13 <== NOT EXECUTED
107e86: ff 35 40 a6 12 00 pushl 0x12a640 <== NOT EXECUTED
107e8c: ff 55 cc call *-0x34(%ebp) <== NOT EXECUTED
107e8f: 83 c4 20 add $0x20,%esp <== NOT EXECUTED
(*print_handler)(
print_context,
" %010p - %010p %010p %8" PRId32 " ",
stack->area,
stack->area + stack->size - 1,
107e92: 8b 46 04 mov 0x4(%esi),%eax <== NOT EXECUTED
else {
(*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 );
}
#endif
(*print_handler)(
107e95: 83 ec 08 sub $0x8,%esp <== NOT EXECUTED
107e98: 57 push %edi <== NOT EXECUTED
107e99: ff 75 d0 pushl -0x30(%ebp) <== NOT EXECUTED
print_context,
" %010p - %010p %010p %8" PRId32 " ",
stack->area,
stack->area + stack->size - 1,
107e9c: 8b 16 mov (%esi),%edx <== NOT EXECUTED
else {
(*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 );
}
#endif
(*print_handler)(
107e9e: 8d 54 10 ff lea -0x1(%eax,%edx,1),%edx <== NOT EXECUTED
107ea2: 52 push %edx <== NOT EXECUTED
107ea3: 50 push %eax <== NOT EXECUTED
107ea4: 68 2e 3e 12 00 push $0x123e2e <== NOT EXECUTED
107ea9: ff 35 40 a6 12 00 pushl 0x12a640 <== NOT EXECUTED
107eaf: ff 15 44 a6 12 00 call *0x12a644 <== NOT EXECUTED
stack->area + stack->size - 1,
current,
size
);
if (Stack_check_Initialized == 0) {
107eb5: 83 c4 20 add $0x20,%esp <== NOT EXECUTED
107eb8: 8b 15 48 a6 12 00 mov 0x12a648,%edx <== NOT EXECUTED
107ebe: 85 d2 test %edx,%edx <== NOT EXECUTED
107ec0: 74 5a je 107f1c <Stack_check_Dump_threads_usage+0x12c><== NOT EXECUTED
(*print_handler)( print_context, "Unavailable\n" );
} else {
(*print_handler)( print_context, "%8" PRId32 "\n", used );
107ec2: 50 push %eax <== NOT EXECUTED
107ec3: ff 75 d4 pushl -0x2c(%ebp) <== NOT EXECUTED
107ec6: 68 59 3e 12 00 push $0x123e59 <== NOT EXECUTED
107ecb: ff 35 40 a6 12 00 pushl 0x12a640 <== NOT EXECUTED
107ed1: ff 15 44 a6 12 00 call *0x12a644 <== NOT EXECUTED
107ed7: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
}
107eda: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
107edd: 5b pop %ebx <== NOT EXECUTED
107ede: 5e pop %esi <== NOT EXECUTED
107edf: 5f pop %edi <== NOT EXECUTED
107ee0: c9 leave <== NOT EXECUTED
107ee1: c3 ret <== NOT EXECUTED
107ee2: 66 90 xchg %ax,%ax <== NOT EXECUTED
low = Stack_check_usable_stack_start(stack);
size = Stack_check_usable_stack_size(stack);
high_water_mark = Stack_check_find_high_water_mark(low, size);
if ( high_water_mark )
107ee4: 85 c0 test %eax,%eax <== NOT EXECUTED
107ee6: 0f 84 6b ff ff ff je 107e57 <Stack_check_Dump_threads_usage+0x67><== NOT EXECUTED
used = Stack_check_Calculate_used( low, size, high_water_mark );
107eec: 8b 55 d4 mov -0x2c(%ebp),%edx <== NOT EXECUTED
107eef: 01 fa add %edi,%edx <== NOT EXECUTED
107ef1: 29 c2 sub %eax,%edx <== NOT EXECUTED
107ef3: 89 55 d4 mov %edx,-0x2c(%ebp) <== NOT EXECUTED
else
used = 0;
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if ( the_thread )
107ef6: 85 db test %ebx,%ebx <== NOT EXECUTED
107ef8: 0f 85 68 ff ff ff jne 107e66 <Stack_check_Dump_threads_usage+0x76><== NOT EXECUTED
rtems_object_get_name( the_thread->Object.id, sizeof(name), name )
);
}
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
else {
(*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 );
107efe: 51 push %ecx <== NOT EXECUTED
107eff: 6a ff push $0xffffffff <== NOT EXECUTED
107f01: 68 20 3e 12 00 push $0x123e20 <== NOT EXECUTED
107f06: ff 35 40 a6 12 00 pushl 0x12a640 <== NOT EXECUTED
107f0c: ff 15 44 a6 12 00 call *0x12a644 <== NOT EXECUTED
107f12: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
107f15: e9 78 ff ff ff jmp 107e92 <Stack_check_Dump_threads_usage+0xa2><== NOT EXECUTED
107f1a: 66 90 xchg %ax,%ax <== NOT EXECUTED
current,
size
);
if (Stack_check_Initialized == 0) {
(*print_handler)( print_context, "Unavailable\n" );
107f1c: 83 ec 08 sub $0x8,%esp <== NOT EXECUTED
107f1f: 68 4c 3e 12 00 push $0x123e4c <== NOT EXECUTED
107f24: ff 35 40 a6 12 00 pushl 0x12a640 <== NOT EXECUTED
107f2a: ff 15 44 a6 12 00 call *0x12a644 <== NOT EXECUTED
107f30: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
} else {
(*print_handler)( print_context, "%8" PRId32 "\n", used );
}
}
107f33: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
107f36: 5b pop %ebx <== NOT EXECUTED
107f37: 5e pop %esi <== NOT EXECUTED
107f38: 5f pop %edi <== NOT EXECUTED
107f39: c9 leave <== NOT EXECUTED
107f3a: c3 ret <== NOT EXECUTED
107f3b: 90 nop <== NOT EXECUTED
/*
* Obtain interrupt stack information
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (the_thread == (Thread_Control *) -1) {
if (!Stack_check_Interrupt_stack.area)
107f3c: 8b 0d b4 a9 12 00 mov 0x12a9b4,%ecx <== NOT EXECUTED
107f42: 85 c9 test %ecx,%ecx <== NOT EXECUTED
107f44: 74 94 je 107eda <Stack_check_Dump_threads_usage+0xea><== NOT EXECUTED
return;
stack = &Stack_check_Interrupt_stack;
107f46: be b0 a9 12 00 mov $0x12a9b0,%esi <== NOT EXECUTED
the_thread = 0;
current = 0;
107f4b: c7 45 d0 00 00 00 00 movl $0x0,-0x30(%ebp) <== NOT EXECUTED
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (the_thread == (Thread_Control *) -1) {
if (!Stack_check_Interrupt_stack.area)
return;
stack = &Stack_check_Interrupt_stack;
the_thread = 0;
107f52: 31 db xor %ebx,%ebx <== NOT EXECUTED
107f54: e9 c1 fe ff ff jmp 107e1a <Stack_check_Dump_threads_usage+0x2a><== NOT EXECUTED
00107f5c <Stack_check_Initialize>:
/*
* Stack_check_Initialize
*/
void Stack_check_Initialize( void )
{
107f5c: 55 push %ebp
107f5d: 89 e5 mov %esp,%ebp
107f5f: 57 push %edi
static uint32_t pattern[ 4 ] = {
0xFEEDF00D, 0x0BAD0D06, /* FEED FOOD to BAD DOG */
0xDEADF00D, 0x600D0D06 /* DEAD FOOD but GOOD DOG */
};
if ( Stack_check_Initialized )
107f60: 8b 15 48 a6 12 00 mov 0x12a648,%edx
107f66: 85 d2 test %edx,%edx
107f68: 75 5a jne 107fc4 <Stack_check_Initialize+0x68>
/*
* Dope the pattern and fill areas
*/
p = Stack_check_Pattern.pattern;
for ( i = 0; i < PATTERN_SIZE_WORDS; i++ ) {
p[i] = pattern[ i%4 ];
107f6a: c7 05 a0 a9 12 00 0d movl $0xfeedf00d,0x12a9a0
107f71: f0 ed fe
107f74: c7 05 a4 a9 12 00 06 movl $0xbad0d06,0x12a9a4
107f7b: 0d ad 0b
107f7e: c7 05 a8 a9 12 00 0d movl $0xdeadf00d,0x12a9a8
107f85: f0 ad de
107f88: c7 05 ac a9 12 00 06 movl $0x600d0d06,0x12a9ac
107f8f: 0d 0d 60
/*
* If appropriate, setup the interrupt stack for high water testing
* also.
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (_CPU_Interrupt_stack_low && _CPU_Interrupt_stack_high) {
107f92: 8b 15 8c b1 12 00 mov 0x12b18c,%edx
107f98: 85 d2 test %edx,%edx
107f9a: 74 1e je 107fba <Stack_check_Initialize+0x5e><== NEVER TAKEN
107f9c: 8b 0d 90 b1 12 00 mov 0x12b190,%ecx
107fa2: 85 c9 test %ecx,%ecx
107fa4: 74 14 je 107fba <Stack_check_Initialize+0x5e><== NEVER TAKEN
Stack_check_Interrupt_stack.area = _CPU_Interrupt_stack_low;
107fa6: 89 15 b4 a9 12 00 mov %edx,0x12a9b4
Stack_check_Interrupt_stack.size = (char *) _CPU_Interrupt_stack_high -
107fac: 29 d1 sub %edx,%ecx
107fae: 89 0d b0 a9 12 00 mov %ecx,0x12a9b0
(char *) _CPU_Interrupt_stack_low;
Stack_check_Dope_stack(&Stack_check_Interrupt_stack);
107fb4: b0 a5 mov $0xa5,%al
107fb6: 89 d7 mov %edx,%edi
107fb8: f3 aa rep stos %al,%es:(%edi)
}
#endif
Stack_check_Initialized = 1;
107fba: c7 05 48 a6 12 00 01 movl $0x1,0x12a648
107fc1: 00 00 00
}
107fc4: 5f pop %edi
107fc5: c9 leave
107fc6: c3 ret
00108018 <Stack_check_report_blown_task>:
Thread_Control *running,
bool pattern_ok
) RTEMS_COMPILER_NO_RETURN_ATTRIBUTE;
void Stack_check_report_blown_task(Thread_Control *running, bool pattern_ok)
{
108018: 55 push %ebp <== NOT EXECUTED
108019: 89 e5 mov %esp,%ebp <== NOT EXECUTED
10801b: 56 push %esi <== NOT EXECUTED
10801c: 53 push %ebx <== NOT EXECUTED
10801d: 83 ec 3c sub $0x3c,%esp <== NOT EXECUTED
108020: 8b 5d 08 mov 0x8(%ebp),%ebx <== NOT EXECUTED
108023: 8a 55 0c mov 0xc(%ebp),%dl <== NOT EXECUTED
Stack_Control *stack = &running->Start.Initial_stack;
void *pattern_area = Stack_check_Get_pattern(stack);
108026: 8b b3 bc 00 00 00 mov 0xbc(%ebx),%esi <== NOT EXECUTED
char name[32];
printk("BLOWN STACK!!!\n");
10802c: 68 5f 3e 12 00 push $0x123e5f <== NOT EXECUTED
108031: 88 55 d4 mov %dl,-0x2c(%ebp) <== NOT EXECUTED
108034: e8 cb 1b 00 00 call 109c04 <printk> <== NOT EXECUTED
printk("task control block: 0x%08" PRIxPTR "\n", running);
108039: 5a pop %edx <== NOT EXECUTED
10803a: 59 pop %ecx <== NOT EXECUTED
10803b: 53 push %ebx <== NOT EXECUTED
10803c: 68 6f 3e 12 00 push $0x123e6f <== NOT EXECUTED
108041: e8 be 1b 00 00 call 109c04 <printk> <== NOT EXECUTED
printk("task ID: 0x%08lx\n", (unsigned long) running->Object.id);
108046: 59 pop %ecx <== NOT EXECUTED
108047: 58 pop %eax <== NOT EXECUTED
108048: ff 73 08 pushl 0x8(%ebx) <== NOT EXECUTED
10804b: 68 8c 3e 12 00 push $0x123e8c <== NOT EXECUTED
108050: e8 af 1b 00 00 call 109c04 <printk> <== NOT EXECUTED
printk(
108055: 58 pop %eax <== NOT EXECUTED
108056: 5a pop %edx <== NOT EXECUTED
108057: ff 73 0c pushl 0xc(%ebx) <== NOT EXECUTED
10805a: 68 9e 3e 12 00 push $0x123e9e <== NOT EXECUTED
10805f: e8 a0 1b 00 00 call 109c04 <printk> <== NOT EXECUTED
"task name: 0x%08" PRIx32 "\n",
running->Object.name.name_u32
);
printk(
108064: 83 c4 0c add $0xc,%esp <== NOT EXECUTED
108067: 8d 45 d8 lea -0x28(%ebp),%eax <== NOT EXECUTED
10806a: 50 push %eax <== NOT EXECUTED
10806b: 6a 20 push $0x20 <== NOT EXECUTED
10806d: ff 73 08 pushl 0x8(%ebx) <== NOT EXECUTED
108070: e8 2f 5d 00 00 call 10dda4 <rtems_object_get_name> <== NOT EXECUTED
108075: 5a pop %edx <== NOT EXECUTED
108076: 59 pop %ecx <== NOT EXECUTED
108077: 50 push %eax <== NOT EXECUTED
108078: 68 b2 3e 12 00 push $0x123eb2 <== NOT EXECUTED
10807d: e8 82 1b 00 00 call 109c04 <printk> <== NOT EXECUTED
);
printk(
"task stack area (%lu Bytes): 0x%08" PRIxPTR " .. 0x%08" PRIxPTR "\n",
(unsigned long) stack->size,
stack->area,
((char *) stack->area + stack->size)
108082: 8b 8b bc 00 00 00 mov 0xbc(%ebx),%ecx <== NOT EXECUTED
108088: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
);
printk(
"task name string: %s\n",
rtems_object_get_name(running->Object.id, sizeof(name), name)
);
printk(
10808e: 8d 1c 01 lea (%ecx,%eax,1),%ebx <== NOT EXECUTED
108091: 53 push %ebx <== NOT EXECUTED
108092: 51 push %ecx <== NOT EXECUTED
108093: 50 push %eax <== NOT EXECUTED
108094: 68 e0 3e 12 00 push $0x123ee0 <== NOT EXECUTED
108099: e8 66 1b 00 00 call 109c04 <printk> <== NOT EXECUTED
"task stack area (%lu Bytes): 0x%08" PRIxPTR " .. 0x%08" PRIxPTR "\n",
(unsigned long) stack->size,
stack->area,
((char *) stack->area + stack->size)
);
if (!pattern_ok) {
10809e: 83 c4 20 add $0x20,%esp <== NOT EXECUTED
1080a1: 8a 55 d4 mov -0x2c(%ebp),%dl <== NOT EXECUTED
1080a4: 84 d2 test %dl,%dl <== NOT EXECUTED
1080a6: 74 10 je 1080b8 <Stack_check_report_blown_task+0xa0><== NOT EXECUTED
rtems_configuration_get_user_multiprocessing_table()->node
);
}
#endif
rtems_fatal_error_occurred(0x81);
1080a8: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
1080ab: 68 81 00 00 00 push $0x81 <== NOT EXECUTED
1080b0: e8 0b 65 00 00 call 10e5c0 <rtems_fatal_error_occurred><== NOT EXECUTED
1080b5: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
) RTEMS_COMPILER_NO_RETURN_ATTRIBUTE;
void Stack_check_report_blown_task(Thread_Control *running, bool pattern_ok)
{
Stack_Control *stack = &running->Start.Initial_stack;
void *pattern_area = Stack_check_Get_pattern(stack);
1080b8: 8d 46 08 lea 0x8(%esi),%eax <== NOT EXECUTED
(unsigned long) stack->size,
stack->area,
((char *) stack->area + stack->size)
);
if (!pattern_ok) {
printk(
1080bb: 83 c6 18 add $0x18,%esi <== NOT EXECUTED
1080be: 56 push %esi <== NOT EXECUTED
1080bf: 50 push %eax <== NOT EXECUTED
1080c0: 6a 10 push $0x10 <== NOT EXECUTED
1080c2: 68 14 3f 12 00 push $0x123f14 <== NOT EXECUTED
1080c7: e8 38 1b 00 00 call 109c04 <printk> <== NOT EXECUTED
1080cc: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
1080cf: eb d7 jmp 1080a8 <Stack_check_report_blown_task+0x90><== NOT EXECUTED
0010bea8 <_API_extensions_Run_postdriver>:
*
* _API_extensions_Run_postdriver
*/
void _API_extensions_Run_postdriver( void )
{
10bea8: 55 push %ebp
10bea9: 89 e5 mov %esp,%ebp
10beab: 53 push %ebx
10beac: 83 ec 04 sub $0x4,%esp
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
10beaf: 8b 1d 98 80 12 00 mov 0x128098,%ebx
void _API_extensions_Run_postdriver( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
10beb5: 81 fb 9c 80 12 00 cmp $0x12809c,%ebx
10bebb: 74 10 je 10becd <_API_extensions_Run_postdriver+0x25><== NEVER TAKEN
10bebd: 8d 76 00 lea 0x0(%esi),%esi
* Currently all APIs configure this hook so it is always non-NULL.
*/
#if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
if ( the_extension->postdriver_hook )
#endif
(*the_extension->postdriver_hook)();
10bec0: ff 53 08 call *0x8(%ebx)
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
10bec3: 8b 1b mov (%ebx),%ebx
void _API_extensions_Run_postdriver( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
10bec5: 81 fb 9c 80 12 00 cmp $0x12809c,%ebx
10becb: 75 f3 jne 10bec0 <_API_extensions_Run_postdriver+0x18>
#if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
if ( the_extension->postdriver_hook )
#endif
(*the_extension->postdriver_hook)();
}
}
10becd: 58 pop %eax
10bece: 5b pop %ebx
10becf: c9 leave
10bed0: c3 ret
0010bed4 <_API_extensions_Run_postswitch>:
*
* _API_extensions_Run_postswitch
*/
void _API_extensions_Run_postswitch( void )
{
10bed4: 55 push %ebp
10bed5: 89 e5 mov %esp,%ebp
10bed7: 53 push %ebx
10bed8: 83 ec 04 sub $0x4,%esp
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
10bedb: 8b 1d 98 80 12 00 mov 0x128098,%ebx
void _API_extensions_Run_postswitch( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
10bee1: 81 fb 9c 80 12 00 cmp $0x12809c,%ebx
10bee7: 74 1c je 10bf05 <_API_extensions_Run_postswitch+0x31><== NEVER TAKEN
10bee9: 8d 76 00 lea 0x0(%esi),%esi
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
10beec: 83 ec 0c sub $0xc,%esp
10beef: ff 35 18 84 12 00 pushl 0x128418
10bef5: ff 53 0c call *0xc(%ebx)
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
10bef8: 8b 1b mov (%ebx),%ebx
void _API_extensions_Run_postswitch( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
10befa: 83 c4 10 add $0x10,%esp
10befd: 81 fb 9c 80 12 00 cmp $0x12809c,%ebx
10bf03: 75 e7 jne 10beec <_API_extensions_Run_postswitch+0x18>
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
10bf05: 8b 5d fc mov -0x4(%ebp),%ebx
10bf08: c9 leave
10bf09: c3 ret
0010e3e4 <_CORE_RWLock_Obtain_for_reading>:
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_RWLock_API_mp_support_callout api_rwlock_mp_support
)
{
10e3e4: 55 push %ebp
10e3e5: 89 e5 mov %esp,%ebp
10e3e7: 57 push %edi
10e3e8: 56 push %esi
10e3e9: 53 push %ebx
10e3ea: 83 ec 1c sub $0x1c,%esp
10e3ed: 8b 5d 08 mov 0x8(%ebp),%ebx
10e3f0: 8b 7d 0c mov 0xc(%ebp),%edi
10e3f3: 8b 4d 14 mov 0x14(%ebp),%ecx
10e3f6: 8a 55 10 mov 0x10(%ebp),%dl
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
10e3f9: 8b 35 98 bd 12 00 mov 0x12bd98,%esi
* If unlocked, then OK to read.
* If locked for reading and no waiters, then OK to read.
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
10e3ff: 9c pushf
10e400: fa cli
10e401: 8f 45 e4 popl -0x1c(%ebp)
switch ( the_rwlock->current_state ) {
10e404: 8b 43 44 mov 0x44(%ebx),%eax
10e407: 85 c0 test %eax,%eax
10e409: 75 1d jne 10e428 <_CORE_RWLock_Obtain_for_reading+0x44>
case CORE_RWLOCK_UNLOCKED:
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
10e40b: c7 43 44 01 00 00 00 movl $0x1,0x44(%ebx)
the_rwlock->number_of_readers += 1;
10e412: ff 43 48 incl 0x48(%ebx)
_ISR_Enable( level );
10e415: ff 75 e4 pushl -0x1c(%ebp)
10e418: 9d popf
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e419: c7 46 34 00 00 00 00 movl $0x0,0x34(%esi)
timeout,
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
10e420: 8d 65 f4 lea -0xc(%ebp),%esp
10e423: 5b pop %ebx
10e424: 5e pop %esi
10e425: 5f pop %edi
10e426: c9 leave
10e427: c3 ret
* If locked for reading and no waiters, then OK to read.
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
switch ( the_rwlock->current_state ) {
10e428: 48 dec %eax
10e429: 74 51 je 10e47c <_CORE_RWLock_Obtain_for_reading+0x98>
/*
* If the thread is not willing to wait, then return immediately.
*/
if ( !wait ) {
10e42b: 84 d2 test %dl,%dl
10e42d: 75 15 jne 10e444 <_CORE_RWLock_Obtain_for_reading+0x60>
_ISR_Enable( level );
10e42f: ff 75 e4 pushl -0x1c(%ebp)
10e432: 9d popf
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
10e433: c7 46 34 02 00 00 00 movl $0x2,0x34(%esi)
timeout,
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
10e43a: 8d 65 f4 lea -0xc(%ebp),%esp
10e43d: 5b pop %ebx
10e43e: 5e pop %esi
10e43f: 5f pop %edi
10e440: c9 leave
10e441: c3 ret
10e442: 66 90 xchg %ax,%ax
10e444: c7 43 30 01 00 00 00 movl $0x1,0x30(%ebx)
/*
* We need to wait to enter this critical section
*/
_Thread_queue_Enter_critical_section( &the_rwlock->Wait_queue );
executing->Wait.queue = &the_rwlock->Wait_queue;
10e44b: 89 5e 44 mov %ebx,0x44(%esi)
executing->Wait.id = id;
10e44e: 89 7e 20 mov %edi,0x20(%esi)
executing->Wait.option = CORE_RWLOCK_THREAD_WAITING_FOR_READ;
10e451: c7 46 30 00 00 00 00 movl $0x0,0x30(%esi)
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e458: c7 46 34 00 00 00 00 movl $0x0,0x34(%esi)
_ISR_Enable( level );
10e45f: ff 75 e4 pushl -0x1c(%ebp)
10e462: 9d popf
_Thread_queue_Enqueue_with_handler(
10e463: c7 45 10 e8 e5 10 00 movl $0x10e5e8,0x10(%ebp)
10e46a: 89 4d 0c mov %ecx,0xc(%ebp)
10e46d: 89 5d 08 mov %ebx,0x8(%ebp)
timeout,
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
10e470: 8d 65 f4 lea -0xc(%ebp),%esp
10e473: 5b pop %ebx
10e474: 5e pop %esi
10e475: 5f pop %edi
10e476: c9 leave
executing->Wait.id = id;
executing->Wait.option = CORE_RWLOCK_THREAD_WAITING_FOR_READ;
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
_ISR_Enable( level );
_Thread_queue_Enqueue_with_handler(
10e477: e9 94 1b 00 00 jmp 110010 <_Thread_queue_Enqueue_with_handler>
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
return;
case CORE_RWLOCK_LOCKED_FOR_READING: {
Thread_Control *waiter;
waiter = _Thread_queue_First( &the_rwlock->Wait_queue );
10e47c: 83 ec 0c sub $0xc,%esp
10e47f: 53 push %ebx
10e480: 88 55 e0 mov %dl,-0x20(%ebp)
10e483: 89 4d dc mov %ecx,-0x24(%ebp)
10e486: e8 ad 1e 00 00 call 110338 <_Thread_queue_First>
if ( !waiter ) {
10e48b: 83 c4 10 add $0x10,%esp
10e48e: 85 c0 test %eax,%eax
10e490: 8a 55 e0 mov -0x20(%ebp),%dl
10e493: 8b 4d dc mov -0x24(%ebp),%ecx
10e496: 75 93 jne 10e42b <_CORE_RWLock_Obtain_for_reading+0x47>
the_rwlock->number_of_readers += 1;
10e498: ff 43 48 incl 0x48(%ebx)
_ISR_Enable( level );
10e49b: ff 75 e4 pushl -0x1c(%ebp)
10e49e: 9d popf
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e49f: c7 46 34 00 00 00 00 movl $0x0,0x34(%esi)
return;
10e4a6: e9 75 ff ff ff jmp 10e420 <_CORE_RWLock_Obtain_for_reading+0x3c>
0010e4ac <_CORE_RWLock_Obtain_for_writing>:
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_RWLock_API_mp_support_callout api_rwlock_mp_support
)
{
10e4ac: 55 push %ebp
10e4ad: 89 e5 mov %esp,%ebp
10e4af: 57 push %edi
10e4b0: 56 push %esi
10e4b1: 53 push %ebx
10e4b2: 83 ec 0c sub $0xc,%esp
10e4b5: 8b 45 08 mov 0x8(%ebp),%eax
10e4b8: 8b 7d 0c mov 0xc(%ebp),%edi
10e4bb: 8b 75 14 mov 0x14(%ebp),%esi
10e4be: 8a 5d 10 mov 0x10(%ebp),%bl
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
10e4c1: 8b 15 98 bd 12 00 mov 0x12bd98,%edx
* Otherwise, we have to block.
* If locked for reading and no waiters, then OK to read.
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
10e4c7: 9c pushf
10e4c8: fa cli
10e4c9: 59 pop %ecx
switch ( the_rwlock->current_state ) {
10e4ca: 83 78 44 00 cmpl $0x0,0x44(%eax)
10e4ce: 75 18 jne 10e4e8 <_CORE_RWLock_Obtain_for_writing+0x3c>
case CORE_RWLOCK_UNLOCKED:
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING;
10e4d0: c7 40 44 02 00 00 00 movl $0x2,0x44(%eax)
_ISR_Enable( level );
10e4d7: 51 push %ecx
10e4d8: 9d popf
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e4d9: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
10e4e0: 83 c4 0c add $0xc,%esp
10e4e3: 5b pop %ebx
10e4e4: 5e pop %esi
10e4e5: 5f pop %edi
10e4e6: c9 leave
10e4e7: c3 ret
/*
* If the thread is not willing to wait, then return immediately.
*/
if ( !wait ) {
10e4e8: 84 db test %bl,%bl
10e4ea: 75 14 jne 10e500 <_CORE_RWLock_Obtain_for_writing+0x54>
_ISR_Enable( level );
10e4ec: 51 push %ecx
10e4ed: 9d popf
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
10e4ee: c7 42 34 02 00 00 00 movl $0x2,0x34(%edx)
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
10e4f5: 83 c4 0c add $0xc,%esp
10e4f8: 5b pop %ebx
10e4f9: 5e pop %esi
10e4fa: 5f pop %edi
10e4fb: c9 leave
10e4fc: c3 ret
10e4fd: 8d 76 00 lea 0x0(%esi),%esi
10e500: c7 40 30 01 00 00 00 movl $0x1,0x30(%eax)
/*
* We need to wait to enter this critical section
*/
_Thread_queue_Enter_critical_section( &the_rwlock->Wait_queue );
executing->Wait.queue = &the_rwlock->Wait_queue;
10e507: 89 42 44 mov %eax,0x44(%edx)
executing->Wait.id = id;
10e50a: 89 7a 20 mov %edi,0x20(%edx)
executing->Wait.option = CORE_RWLOCK_THREAD_WAITING_FOR_WRITE;
10e50d: c7 42 30 01 00 00 00 movl $0x1,0x30(%edx)
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e514: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
_ISR_Enable( level );
10e51b: 51 push %ecx
10e51c: 9d popf
_Thread_queue_Enqueue_with_handler(
10e51d: c7 45 10 e8 e5 10 00 movl $0x10e5e8,0x10(%ebp)
10e524: 89 75 0c mov %esi,0xc(%ebp)
10e527: 89 45 08 mov %eax,0x8(%ebp)
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
10e52a: 83 c4 0c add $0xc,%esp
10e52d: 5b pop %ebx
10e52e: 5e pop %esi
10e52f: 5f pop %edi
10e530: c9 leave
executing->Wait.id = id;
executing->Wait.option = CORE_RWLOCK_THREAD_WAITING_FOR_WRITE;
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
_ISR_Enable( level );
_Thread_queue_Enqueue_with_handler(
10e531: e9 da 1a 00 00 jmp 110010 <_Thread_queue_Enqueue_with_handler>
0010e538 <_CORE_RWLock_Release>:
*/
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
10e538: 55 push %ebp
10e539: 89 e5 mov %esp,%ebp
10e53b: 53 push %ebx
10e53c: 83 ec 04 sub $0x4,%esp
10e53f: 8b 5d 08 mov 0x8(%ebp),%ebx
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
10e542: 8b 0d 98 bd 12 00 mov 0x12bd98,%ecx
* Otherwise, we have to block.
* If locked for reading and no waiters, then OK to read.
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
10e548: 9c pushf
10e549: fa cli
10e54a: 5a pop %edx
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
10e54b: 8b 43 44 mov 0x44(%ebx),%eax
10e54e: 85 c0 test %eax,%eax
10e550: 74 7a je 10e5cc <_CORE_RWLock_Release+0x94>
_ISR_Enable( level );
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
return CORE_RWLOCK_SUCCESSFUL;
}
if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) {
10e552: 48 dec %eax
10e553: 74 63 je 10e5b8 <_CORE_RWLock_Release+0x80>
return CORE_RWLOCK_SUCCESSFUL;
}
}
/* CORE_RWLOCK_LOCKED_FOR_WRITING or READING with readers */
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e555: c7 41 34 00 00 00 00 movl $0x0,0x34(%ecx)
/*
* Implicitly transition to "unlocked" and find another thread interested
* in obtaining this rwlock.
*/
the_rwlock->current_state = CORE_RWLOCK_UNLOCKED;
10e55c: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx)
_ISR_Enable( level );
10e563: 52 push %edx
10e564: 9d popf
next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue );
10e565: 83 ec 0c sub $0xc,%esp
10e568: 53 push %ebx
10e569: e8 7a 19 00 00 call 10fee8 <_Thread_queue_Dequeue>
if ( next ) {
10e56e: 83 c4 10 add $0x10,%esp
10e571: 85 c0 test %eax,%eax
10e573: 74 39 je 10e5ae <_CORE_RWLock_Release+0x76>
if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) {
10e575: 83 78 30 01 cmpl $0x1,0x30(%eax)
10e579: 74 61 je 10e5dc <_CORE_RWLock_Release+0xa4>
}
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
10e57b: ff 43 48 incl 0x48(%ebx)
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
10e57e: c7 43 44 01 00 00 00 movl $0x1,0x44(%ebx)
10e585: eb 17 jmp 10e59e <_CORE_RWLock_Release+0x66>
10e587: 90 nop
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
if ( !next ||
10e588: 83 78 30 01 cmpl $0x1,0x30(%eax)
10e58c: 74 20 je 10e5ae <_CORE_RWLock_Release+0x76><== NEVER TAKEN
next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE )
return CORE_RWLOCK_SUCCESSFUL;
the_rwlock->number_of_readers += 1;
10e58e: ff 43 48 incl 0x48(%ebx)
_Thread_queue_Extract( &the_rwlock->Wait_queue, next );
10e591: 83 ec 08 sub $0x8,%esp
10e594: 50 push %eax
10e595: 53 push %ebx
10e596: e8 85 1c 00 00 call 110220 <_Thread_queue_Extract>
}
10e59b: 83 c4 10 add $0x10,%esp
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
10e59e: 83 ec 0c sub $0xc,%esp
10e5a1: 53 push %ebx
10e5a2: e8 91 1d 00 00 call 110338 <_Thread_queue_First>
if ( !next ||
10e5a7: 83 c4 10 add $0x10,%esp
10e5aa: 85 c0 test %eax,%eax
10e5ac: 75 da jne 10e588 <_CORE_RWLock_Release+0x50>
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
10e5ae: 31 c0 xor %eax,%eax
10e5b0: 8b 5d fc mov -0x4(%ebp),%ebx
10e5b3: c9 leave
10e5b4: c3 ret
10e5b5: 8d 76 00 lea 0x0(%esi),%esi
_ISR_Enable( level );
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
return CORE_RWLOCK_SUCCESSFUL;
}
if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) {
the_rwlock->number_of_readers -= 1;
10e5b8: 8b 43 48 mov 0x48(%ebx),%eax
10e5bb: 48 dec %eax
10e5bc: 89 43 48 mov %eax,0x48(%ebx)
if ( the_rwlock->number_of_readers != 0 ) {
10e5bf: 85 c0 test %eax,%eax
10e5c1: 74 92 je 10e555 <_CORE_RWLock_Release+0x1d>
/* must be unlocked again */
_ISR_Enable( level );
10e5c3: 52 push %edx
10e5c4: 9d popf
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
10e5c5: 31 c0 xor %eax,%eax
10e5c7: 8b 5d fc mov -0x4(%ebp),%ebx
10e5ca: c9 leave
10e5cb: c3 ret
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
_ISR_Enable( level );
10e5cc: 52 push %edx
10e5cd: 9d popf
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
10e5ce: c7 41 34 02 00 00 00 movl $0x2,0x34(%ecx)
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
10e5d5: 31 c0 xor %eax,%eax
10e5d7: 8b 5d fc mov -0x4(%ebp),%ebx
10e5da: c9 leave
10e5db: c3 ret
next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue );
if ( next ) {
if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) {
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING;
10e5dc: c7 43 44 02 00 00 00 movl $0x2,0x44(%ebx)
return CORE_RWLOCK_SUCCESSFUL;
10e5e3: eb c9 jmp 10e5ae <_CORE_RWLock_Release+0x76>
0010e5e8 <_CORE_RWLock_Timeout>:
void _CORE_RWLock_Timeout(
Objects_Id id,
void *ignored
)
{
10e5e8: 55 push %ebp
10e5e9: 89 e5 mov %esp,%ebp
10e5eb: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10e5ee: 8d 45 f4 lea -0xc(%ebp),%eax
10e5f1: 50 push %eax
10e5f2: ff 75 08 pushl 0x8(%ebp)
10e5f5: e8 5e 15 00 00 call 10fb58 <_Thread_Get>
switch ( location ) {
10e5fa: 83 c4 10 add $0x10,%esp
10e5fd: 8b 55 f4 mov -0xc(%ebp),%edx
10e600: 85 d2 test %edx,%edx
10e602: 75 17 jne 10e61b <_CORE_RWLock_Timeout+0x33><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
10e604: 83 ec 0c sub $0xc,%esp
10e607: 50 push %eax
10e608: e8 0b 1e 00 00 call 110418 <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10e60d: a1 b0 b7 12 00 mov 0x12b7b0,%eax
10e612: 48 dec %eax
10e613: a3 b0 b7 12 00 mov %eax,0x12b7b0
10e618: 83 c4 10 add $0x10,%esp
_Thread_Unnest_dispatch();
break;
}
}
10e61b: c9 leave
10e61c: c3 ret
001198e0 <_CORE_message_queue_Broadcast>:
Objects_Id id __attribute__((unused)),
CORE_message_queue_API_mp_support_callout api_message_queue_mp_support __attribute__((unused)),
#endif
uint32_t *count
)
{
1198e0: 55 push %ebp
1198e1: 89 e5 mov %esp,%ebp
1198e3: 57 push %edi
1198e4: 56 push %esi
1198e5: 53 push %ebx
1198e6: 83 ec 1c sub $0x1c,%esp
1198e9: 8b 5d 08 mov 0x8(%ebp),%ebx
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
1198ec: 8b 45 10 mov 0x10(%ebp),%eax
1198ef: 39 43 4c cmp %eax,0x4c(%ebx)
1198f2: 72 60 jb 119954 <_CORE_message_queue_Broadcast+0x74><== NEVER TAKEN
* NOTE: This check is critical because threads can block on
* send and receive and this ensures that we are broadcasting
* the message to threads waiting to receive -- not to send.
*/
if ( the_message_queue->number_of_pending_messages != 0 ) {
1198f4: 8b 43 48 mov 0x48(%ebx),%eax
1198f7: 85 c0 test %eax,%eax
1198f9: 75 45 jne 119940 <_CORE_message_queue_Broadcast+0x60>
1198fb: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
119902: eb 18 jmp 11991c <_CORE_message_queue_Broadcast+0x3c>
*/
number_broadcasted = 0;
while ((the_thread =
_Thread_queue_Dequeue(&the_message_queue->Wait_queue))) {
waitp = &the_thread->Wait;
number_broadcasted += 1;
119904: ff 45 e4 incl -0x1c(%ebp)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
119907: 8b 42 2c mov 0x2c(%edx),%eax
11990a: 89 c7 mov %eax,%edi
11990c: 8b 75 0c mov 0xc(%ebp),%esi
11990f: 8b 4d 10 mov 0x10(%ebp),%ecx
119912: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
buffer,
waitp->return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
119914: 8b 42 28 mov 0x28(%edx),%eax
119917: 8b 55 10 mov 0x10(%ebp),%edx
11991a: 89 10 mov %edx,(%eax)
/*
* There must be no pending messages if there is a thread waiting to
* receive a message.
*/
number_broadcasted = 0;
while ((the_thread =
11991c: 83 ec 0c sub $0xc,%esp
11991f: 53 push %ebx
119920: e8 27 28 00 00 call 11c14c <_Thread_queue_Dequeue>
119925: 89 c2 mov %eax,%edx
119927: 83 c4 10 add $0x10,%esp
11992a: 85 c0 test %eax,%eax
11992c: 75 d6 jne 119904 <_CORE_message_queue_Broadcast+0x24>
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_message_queue_mp_support) ( the_thread, id );
#endif
}
*count = number_broadcasted;
11992e: 8b 55 e4 mov -0x1c(%ebp),%edx
119931: 8b 45 1c mov 0x1c(%ebp),%eax
119934: 89 10 mov %edx,(%eax)
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
119936: 31 c0 xor %eax,%eax
}
119938: 8d 65 f4 lea -0xc(%ebp),%esp
11993b: 5b pop %ebx
11993c: 5e pop %esi
11993d: 5f pop %edi
11993e: c9 leave
11993f: c3 ret
* send and receive and this ensures that we are broadcasting
* the message to threads waiting to receive -- not to send.
*/
if ( the_message_queue->number_of_pending_messages != 0 ) {
*count = 0;
119940: 8b 55 1c mov 0x1c(%ebp),%edx
119943: c7 02 00 00 00 00 movl $0x0,(%edx)
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
119949: 31 c0 xor %eax,%eax
#endif
}
*count = number_broadcasted;
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
11994b: 8d 65 f4 lea -0xc(%ebp),%esp
11994e: 5b pop %ebx
11994f: 5e pop %esi
119950: 5f pop %edi
119951: c9 leave
119952: c3 ret
119953: 90 nop
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
return CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE;
119954: b8 01 00 00 00 mov $0x1,%eax <== NOT EXECUTED
#endif
}
*count = number_broadcasted;
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
119959: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
11995c: 5b pop %ebx <== NOT EXECUTED
11995d: 5e pop %esi <== NOT EXECUTED
11995e: 5f pop %edi <== NOT EXECUTED
11995f: c9 leave <== NOT EXECUTED
119960: c3 ret <== NOT EXECUTED
00114a20 <_CORE_message_queue_Initialize>:
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Attributes *the_message_queue_attributes,
uint32_t maximum_pending_messages,
size_t maximum_message_size
)
{
114a20: 55 push %ebp
114a21: 89 e5 mov %esp,%ebp
114a23: 57 push %edi
114a24: 56 push %esi
114a25: 53 push %ebx
114a26: 83 ec 0c sub $0xc,%esp
114a29: 8b 5d 08 mov 0x8(%ebp),%ebx
114a2c: 8b 75 10 mov 0x10(%ebp),%esi
114a2f: 8b 45 14 mov 0x14(%ebp),%eax
size_t message_buffering_required;
size_t allocated_message_size;
the_message_queue->maximum_pending_messages = maximum_pending_messages;
114a32: 89 73 44 mov %esi,0x44(%ebx)
the_message_queue->number_of_pending_messages = 0;
114a35: c7 43 48 00 00 00 00 movl $0x0,0x48(%ebx)
the_message_queue->maximum_message_size = maximum_message_size;
114a3c: 89 43 4c mov %eax,0x4c(%ebx)
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Notify_Handler the_handler,
void *the_argument
)
{
the_message_queue->notify_handler = the_handler;
114a3f: c7 43 60 00 00 00 00 movl $0x0,0x60(%ebx)
the_message_queue->notify_argument = the_argument;
114a46: c7 43 64 00 00 00 00 movl $0x0,0x64(%ebx)
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
114a4d: a8 03 test $0x3,%al
114a4f: 74 17 je 114a68 <_CORE_message_queue_Initialize+0x48>
allocated_message_size += sizeof(uint32_t);
114a51: 8d 50 04 lea 0x4(%eax),%edx
allocated_message_size &= ~(sizeof(uint32_t) - 1);
114a54: 83 e2 fc and $0xfffffffc,%edx
}
if (allocated_message_size < maximum_message_size)
114a57: 39 d0 cmp %edx,%eax
114a59: 76 0f jbe 114a6a <_CORE_message_queue_Initialize+0x4a><== ALWAYS TAKEN
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
_Workspace_Allocate( message_buffering_required );
if (the_message_queue->message_buffers == 0)
return false;
114a5b: 31 c0 xor %eax,%eax
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
}
114a5d: 8d 65 f4 lea -0xc(%ebp),%esp
114a60: 5b pop %ebx
114a61: 5e pop %esi
114a62: 5f pop %edi
114a63: c9 leave
114a64: c3 ret
114a65: 8d 76 00 lea 0x0(%esi),%esi
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
114a68: 89 c2 mov %eax,%edx
/*
* Calculate how much total memory is required for message buffering and
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
114a6a: 8d 7a 14 lea 0x14(%edx),%edi
/*
* Calculate how much total memory is required for message buffering and
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
114a6d: 89 f8 mov %edi,%eax
114a6f: 0f af c6 imul %esi,%eax
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
if (message_buffering_required < allocated_message_size)
114a72: 39 d0 cmp %edx,%eax
114a74: 72 e5 jb 114a5b <_CORE_message_queue_Initialize+0x3b><== NEVER TAKEN
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
_Workspace_Allocate( message_buffering_required );
114a76: 83 ec 0c sub $0xc,%esp
114a79: 50 push %eax
114a7a: e8 21 2b 00 00 call 1175a0 <_Workspace_Allocate>
return false;
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
114a7f: 89 43 5c mov %eax,0x5c(%ebx)
_Workspace_Allocate( message_buffering_required );
if (the_message_queue->message_buffers == 0)
114a82: 83 c4 10 add $0x10,%esp
114a85: 85 c0 test %eax,%eax
114a87: 74 d2 je 114a5b <_CORE_message_queue_Initialize+0x3b>
/*
* Initialize the pool of inactive messages, pending messages,
* and set of waiting threads.
*/
_Chain_Initialize (
114a89: 57 push %edi
114a8a: 56 push %esi
114a8b: 50 push %eax
114a8c: 8d 43 68 lea 0x68(%ebx),%eax
114a8f: 50 push %eax
114a90: e8 13 52 00 00 call 119ca8 <_Chain_Initialize>
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
114a95: 8d 43 54 lea 0x54(%ebx),%eax
114a98: 89 43 50 mov %eax,0x50(%ebx)
head->next = tail;
head->previous = NULL;
114a9b: c7 43 54 00 00 00 00 movl $0x0,0x54(%ebx)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
114aa2: 8d 43 50 lea 0x50(%ebx),%eax
114aa5: 89 43 58 mov %eax,0x58(%ebx)
allocated_message_size + sizeof( CORE_message_queue_Buffer_control )
);
_Chain_Initialize_empty( &the_message_queue->Pending_messages );
_Thread_queue_Initialize(
114aa8: 6a 06 push $0x6
114aaa: 68 80 00 00 00 push $0x80
114aaf: 8b 45 0c mov 0xc(%ebp),%eax
114ab2: 83 38 01 cmpl $0x1,(%eax)
114ab5: 0f 94 c0 sete %al
114ab8: 0f b6 c0 movzbl %al,%eax
114abb: 50 push %eax
114abc: 53 push %ebx
114abd: e8 b6 21 00 00 call 116c78 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
114ac2: 83 c4 20 add $0x20,%esp
114ac5: b0 01 mov $0x1,%al
}
114ac7: 8d 65 f4 lea -0xc(%ebp),%esp
114aca: 5b pop %ebx
114acb: 5e pop %esi
114acc: 5f pop %edi
114acd: c9 leave
114ace: c3 ret
001110b0 <_CORE_message_queue_Insert_message>:
void _CORE_message_queue_Insert_message(
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Buffer_control *the_message,
CORE_message_queue_Submit_types submit_type
)
{
1110b0: 55 push %ebp
1110b1: 89 e5 mov %esp,%ebp
1110b3: 56 push %esi
1110b4: 53 push %ebx
1110b5: 83 ec 10 sub $0x10,%esp
1110b8: 8b 45 08 mov 0x8(%ebp),%eax
1110bb: 8b 55 0c mov 0xc(%ebp),%edx
1110be: 8b 4d 10 mov 0x10(%ebp),%ecx
1110c1: 89 4a 08 mov %ecx,0x8(%edx)
_CORE_message_queue_Append_unprotected(the_message_queue, the_message);
else
_CORE_message_queue_Prepend_unprotected(the_message_queue, the_message);
_ISR_Enable( level );
#else
if ( submit_type == CORE_MESSAGE_QUEUE_SEND_REQUEST ) {
1110c4: 81 f9 ff ff ff 7f cmp $0x7fffffff,%ecx
1110ca: 74 70 je 11113c <_CORE_message_queue_Insert_message+0x8c>
_ISR_Disable( level );
SET_NOTIFY();
the_message_queue->number_of_pending_messages++;
_CORE_message_queue_Append_unprotected(the_message_queue, the_message);
_ISR_Enable( level );
} else if ( submit_type == CORE_MESSAGE_QUEUE_URGENT_REQUEST ) {
1110cc: 81 f9 00 00 00 80 cmp $0x80000000,%ecx
1110d2: 0f 84 88 00 00 00 je 111160 <_CORE_message_queue_Insert_message+0xb0>
* the message is actually in the queue at this point.
*/
if ( notify && the_message_queue->notify_handler )
(*the_message_queue->notify_handler)(the_message_queue->notify_argument);
#endif
}
1110d8: 8b 58 50 mov 0x50(%eax),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
1110db: 8d 70 54 lea 0x54(%eax),%esi
int the_priority;
the_priority = _CORE_message_queue_Get_message_priority(the_message);
the_header = &the_message_queue->Pending_messages;
the_node = _Chain_First( the_header );
while ( !_Chain_Is_tail( the_header, the_node ) ) {
1110de: 39 de cmp %ebx,%esi
1110e0: 74 05 je 1110e7 <_CORE_message_queue_Insert_message+0x37>
this_message = (CORE_message_queue_Buffer_control *) the_node;
this_priority = _CORE_message_queue_Get_message_priority(this_message);
if ( this_priority <= the_priority ) {
1110e2: 3b 4b 08 cmp 0x8(%ebx),%ecx
1110e5: 7d 45 jge 11112c <_CORE_message_queue_Insert_message+0x7c>
the_node = the_node->next;
continue;
}
break;
}
_ISR_Disable( level );
1110e7: 9c pushf
1110e8: fa cli
1110e9: 5e pop %esi
SET_NOTIFY();
1110ea: 8b 48 48 mov 0x48(%eax),%ecx
*
* INTERRUPT LATENCY:
* insert
*/
void _CORE_message_queue_Insert_message(
1110ed: 85 c9 test %ecx,%ecx
1110ef: 0f 94 45 f7 sete -0x9(%ebp)
}
break;
}
_ISR_Disable( level );
SET_NOTIFY();
the_message_queue->number_of_pending_messages++;
1110f3: 41 inc %ecx
1110f4: 89 48 48 mov %ecx,0x48(%eax)
_Chain_Insert_unprotected( the_node->previous, &the_message->Node );
1110f7: 8b 4b 04 mov 0x4(%ebx),%ecx
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
1110fa: 89 4a 04 mov %ecx,0x4(%edx)
before_node = after_node->next;
1110fd: 8b 19 mov (%ecx),%ebx
after_node->next = the_node;
1110ff: 89 11 mov %edx,(%ecx)
the_node->next = before_node;
111101: 89 1a mov %ebx,(%edx)
before_node->previous = the_node;
111103: 89 53 04 mov %edx,0x4(%ebx)
_ISR_Enable( level );
111106: 56 push %esi
111107: 9d popf
/*
* According to POSIX, does this happen before or after the message
* is actually enqueued. It is logical to think afterwards, because
* the message is actually in the queue at this point.
*/
if ( notify && the_message_queue->notify_handler )
111108: 80 7d f7 00 cmpb $0x0,-0x9(%ebp)
11110c: 74 16 je 111124 <_CORE_message_queue_Insert_message+0x74>
11110e: 8b 50 60 mov 0x60(%eax),%edx
111111: 85 d2 test %edx,%edx
111113: 74 0f je 111124 <_CORE_message_queue_Insert_message+0x74>
(*the_message_queue->notify_handler)(the_message_queue->notify_argument);
111115: 8b 40 64 mov 0x64(%eax),%eax
111118: 89 45 08 mov %eax,0x8(%ebp)
#endif
}
11111b: 83 c4 10 add $0x10,%esp
11111e: 5b pop %ebx
11111f: 5e pop %esi
111120: c9 leave
* According to POSIX, does this happen before or after the message
* is actually enqueued. It is logical to think afterwards, because
* the message is actually in the queue at this point.
*/
if ( notify && the_message_queue->notify_handler )
(*the_message_queue->notify_handler)(the_message_queue->notify_argument);
111121: ff e2 jmp *%edx
111123: 90 nop
#endif
}
111124: 83 c4 10 add $0x10,%esp
111127: 5b pop %ebx
111128: 5e pop %esi
111129: c9 leave
11112a: c3 ret
11112b: 90 nop
this_message = (CORE_message_queue_Buffer_control *) the_node;
this_priority = _CORE_message_queue_Get_message_priority(this_message);
if ( this_priority <= the_priority ) {
the_node = the_node->next;
11112c: 8b 1b mov (%ebx),%ebx
int the_priority;
the_priority = _CORE_message_queue_Get_message_priority(the_message);
the_header = &the_message_queue->Pending_messages;
the_node = _Chain_First( the_header );
while ( !_Chain_Is_tail( the_header, the_node ) ) {
11112e: 39 de cmp %ebx,%esi
111130: 74 b5 je 1110e7 <_CORE_message_queue_Insert_message+0x37>
this_message = (CORE_message_queue_Buffer_control *) the_node;
this_priority = _CORE_message_queue_Get_message_priority(this_message);
if ( this_priority <= the_priority ) {
111132: 3b 4b 08 cmp 0x8(%ebx),%ecx
111135: 7c b0 jl 1110e7 <_CORE_message_queue_Insert_message+0x37>
111137: eb f3 jmp 11112c <_CORE_message_queue_Insert_message+0x7c>
111139: 8d 76 00 lea 0x0(%esi),%esi
else
_CORE_message_queue_Prepend_unprotected(the_message_queue, the_message);
_ISR_Enable( level );
#else
if ( submit_type == CORE_MESSAGE_QUEUE_SEND_REQUEST ) {
_ISR_Disable( level );
11113c: 9c pushf
11113d: fa cli
11113e: 5b pop %ebx
SET_NOTIFY();
11113f: 8b 48 48 mov 0x48(%eax),%ecx
*
* INTERRUPT LATENCY:
* insert
*/
void _CORE_message_queue_Insert_message(
111142: 85 c9 test %ecx,%ecx
111144: 0f 94 45 f7 sete -0x9(%ebp)
_ISR_Enable( level );
#else
if ( submit_type == CORE_MESSAGE_QUEUE_SEND_REQUEST ) {
_ISR_Disable( level );
SET_NOTIFY();
the_message_queue->number_of_pending_messages++;
111148: 41 inc %ecx
111149: 89 48 48 mov %ecx,0x48(%eax)
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
11114c: 8b 48 58 mov 0x58(%eax),%ecx
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
11114f: 8d 70 54 lea 0x54(%eax),%esi
111152: 89 32 mov %esi,(%edx)
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
111154: 89 50 58 mov %edx,0x58(%eax)
old_last->next = the_node;
111157: 89 11 mov %edx,(%ecx)
the_node->previous = old_last;
111159: 89 4a 04 mov %ecx,0x4(%edx)
_CORE_message_queue_Append_unprotected(the_message_queue, the_message);
_ISR_Enable( level );
11115c: 53 push %ebx
11115d: 9d popf
11115e: eb a8 jmp 111108 <_CORE_message_queue_Insert_message+0x58>
} else if ( submit_type == CORE_MESSAGE_QUEUE_URGENT_REQUEST ) {
_ISR_Disable( level );
111160: 9c pushf
111161: fa cli
111162: 5b pop %ebx
SET_NOTIFY();
111163: 8b 48 48 mov 0x48(%eax),%ecx
*
* INTERRUPT LATENCY:
* insert
*/
void _CORE_message_queue_Insert_message(
111166: 85 c9 test %ecx,%ecx
111168: 0f 94 45 f7 sete -0x9(%ebp)
_CORE_message_queue_Append_unprotected(the_message_queue, the_message);
_ISR_Enable( level );
} else if ( submit_type == CORE_MESSAGE_QUEUE_URGENT_REQUEST ) {
_ISR_Disable( level );
SET_NOTIFY();
the_message_queue->number_of_pending_messages++;
11116c: 41 inc %ecx
11116d: 89 48 48 mov %ecx,0x48(%eax)
RTEMS_INLINE_ROUTINE void _Chain_Prepend_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert_unprotected(_Chain_Head(the_chain), the_node);
111170: 8d 48 50 lea 0x50(%eax),%ecx
111173: 89 4a 04 mov %ecx,0x4(%edx)
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
111176: 8b 48 50 mov 0x50(%eax),%ecx
after_node->next = the_node;
111179: 89 50 50 mov %edx,0x50(%eax)
the_node->next = before_node;
11117c: 89 0a mov %ecx,(%edx)
before_node->previous = the_node;
11117e: 89 51 04 mov %edx,0x4(%ecx)
_CORE_message_queue_Prepend_unprotected(the_message_queue, the_message);
_ISR_Enable( level );
111181: 53 push %ebx
111182: 9d popf
111183: eb 83 jmp 111108 <_CORE_message_queue_Insert_message+0x58>
00114ad0 <_CORE_message_queue_Seize>:
void *buffer,
size_t *size_p,
bool wait,
Watchdog_Interval timeout
)
{
114ad0: 55 push %ebp
114ad1: 89 e5 mov %esp,%ebp
114ad3: 57 push %edi
114ad4: 56 push %esi
114ad5: 53 push %ebx
114ad6: 83 ec 2c sub $0x2c,%esp
114ad9: 8b 55 08 mov 0x8(%ebp),%edx
114adc: 8b 45 0c mov 0xc(%ebp),%eax
114adf: 89 45 dc mov %eax,-0x24(%ebp)
114ae2: 8b 4d 10 mov 0x10(%ebp),%ecx
114ae5: 89 4d e0 mov %ecx,-0x20(%ebp)
114ae8: 8b 45 14 mov 0x14(%ebp),%eax
114aeb: 8b 5d 1c mov 0x1c(%ebp),%ebx
114aee: 89 5d d8 mov %ebx,-0x28(%ebp)
114af1: 0f b6 7d 18 movzbl 0x18(%ebp),%edi
ISR_Level level;
CORE_message_queue_Buffer_control *the_message;
Thread_Control *executing;
executing = _Thread_Executing;
114af5: 8b 0d d8 0c 13 00 mov 0x130cd8,%ecx
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
114afb: c7 41 34 00 00 00 00 movl $0x0,0x34(%ecx)
_ISR_Disable( level );
114b02: 9c pushf
114b03: fa cli
114b04: 8f 45 e4 popl -0x1c(%ebp)
executing->Wait.return_argument = size_p;
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
114b07: 8b 5a 50 mov 0x50(%edx),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
114b0a: 8d 72 54 lea 0x54(%edx),%esi
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
114b0d: 39 f3 cmp %esi,%ebx
114b0f: 74 7b je 114b8c <_CORE_message_queue_Seize+0xbc>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
114b11: 8b 0b mov (%ebx),%ecx
head->next = new_first;
114b13: 89 4a 50 mov %ecx,0x50(%edx)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_first_unprotected(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
114b16: 8d 72 50 lea 0x50(%edx),%esi
114b19: 89 71 04 mov %esi,0x4(%ecx)
executing = _Thread_Executing;
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
_ISR_Disable( level );
the_message = _CORE_message_queue_Get_pending_message( the_message_queue );
if ( the_message != NULL ) {
the_message_queue->number_of_pending_messages -= 1;
114b1c: ff 4a 48 decl 0x48(%edx)
_ISR_Enable( level );
114b1f: ff 75 e4 pushl -0x1c(%ebp)
114b22: 9d popf
*size_p = the_message->Contents.size;
114b23: 8b 4b 0c mov 0xc(%ebx),%ecx
114b26: 89 08 mov %ecx,(%eax)
_Thread_Executing->Wait.count =
114b28: 8b 73 08 mov 0x8(%ebx),%esi
114b2b: 8b 0d d8 0c 13 00 mov 0x130cd8,%ecx
114b31: 89 71 24 mov %esi,0x24(%ecx)
_CORE_message_queue_Get_message_priority( the_message );
_CORE_message_queue_Copy_buffer(
the_message->Contents.buffer,
114b34: 8d 4b 10 lea 0x10(%ebx),%ecx
114b37: 89 4d e4 mov %ecx,-0x1c(%ebp)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
114b3a: 8b 08 mov (%eax),%ecx
114b3c: 8b 7d e0 mov -0x20(%ebp),%edi
114b3f: 8b 75 e4 mov -0x1c(%ebp),%esi
114b42: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
* is not, then we can go ahead and free the buffer.
*
* NOTE: If we note that the queue was not full before this receive,
* then we can avoid this dequeue.
*/
the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue );
114b44: 83 ec 0c sub $0xc,%esp
114b47: 52 push %edx
114b48: 89 55 d4 mov %edx,-0x2c(%ebp)
114b4b: e8 98 1d 00 00 call 1168e8 <_Thread_queue_Dequeue>
if ( !the_thread ) {
114b50: 83 c4 10 add $0x10,%esp
114b53: 85 c0 test %eax,%eax
114b55: 8b 55 d4 mov -0x2c(%ebp),%edx
114b58: 0f 84 86 00 00 00 je 114be4 <_CORE_message_queue_Seize+0x114>
CORE_message_queue_Buffer_control *the_message,
int priority
)
{
#if defined(RTEMS_SCORE_COREMSG_ENABLE_MESSAGE_PRIORITY)
the_message->priority = priority;
114b5e: 8b 48 24 mov 0x24(%eax),%ecx
114b61: 89 4b 08 mov %ecx,0x8(%ebx)
*/
_CORE_message_queue_Set_message_priority(
the_message,
the_thread->Wait.count
);
the_message->Contents.size = (size_t) the_thread->Wait.option;
114b64: 8b 48 30 mov 0x30(%eax),%ecx
114b67: 89 4b 0c mov %ecx,0xc(%ebx)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
114b6a: 8b 70 2c mov 0x2c(%eax),%esi
114b6d: 8b 7d e4 mov -0x1c(%ebp),%edi
114b70: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
the_thread->Wait.return_argument_second.immutable_object,
the_message->Contents.buffer,
the_message->Contents.size
);
_CORE_message_queue_Insert_message(
114b72: 8b 43 08 mov 0x8(%ebx),%eax
114b75: 89 45 10 mov %eax,0x10(%ebp)
114b78: 89 5d 0c mov %ebx,0xc(%ebp)
114b7b: 89 55 08 mov %edx,0x8(%ebp)
executing->Wait.return_argument = size_p;
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
114b7e: 8d 65 f4 lea -0xc(%ebp),%esp
114b81: 5b pop %ebx
114b82: 5e pop %esi
114b83: 5f pop %edi
114b84: c9 leave
the_thread->Wait.return_argument_second.immutable_object,
the_message->Contents.buffer,
the_message->Contents.size
);
_CORE_message_queue_Insert_message(
114b85: e9 7a 51 00 00 jmp 119d04 <_CORE_message_queue_Insert_message>
114b8a: 66 90 xchg %ax,%ax
return;
}
#endif
}
if ( !wait ) {
114b8c: 89 fb mov %edi,%ebx
114b8e: 84 db test %bl,%bl
114b90: 75 16 jne 114ba8 <_CORE_message_queue_Seize+0xd8>
_ISR_Enable( level );
114b92: ff 75 e4 pushl -0x1c(%ebp)
114b95: 9d popf
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
114b96: c7 41 34 04 00 00 00 movl $0x4,0x34(%ecx)
executing->Wait.return_argument = size_p;
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
114b9d: 8d 65 f4 lea -0xc(%ebp),%esp
114ba0: 5b pop %ebx
114ba1: 5e pop %esi
114ba2: 5f pop %edi
114ba3: c9 leave
114ba4: c3 ret
114ba5: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
114ba8: c7 42 30 01 00 00 00 movl $0x1,0x30(%edx)
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
return;
}
_Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue );
executing->Wait.queue = &the_message_queue->Wait_queue;
114baf: 89 51 44 mov %edx,0x44(%ecx)
executing->Wait.id = id;
114bb2: 8b 5d dc mov -0x24(%ebp),%ebx
114bb5: 89 59 20 mov %ebx,0x20(%ecx)
executing->Wait.return_argument_second.mutable_object = buffer;
114bb8: 8b 5d e0 mov -0x20(%ebp),%ebx
114bbb: 89 59 2c mov %ebx,0x2c(%ecx)
executing->Wait.return_argument = size_p;
114bbe: 89 41 28 mov %eax,0x28(%ecx)
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
114bc1: ff 75 e4 pushl -0x1c(%ebp)
114bc4: 9d popf
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
114bc5: c7 45 10 3c 6d 11 00 movl $0x116d3c,0x10(%ebp)
114bcc: 8b 45 d8 mov -0x28(%ebp),%eax
114bcf: 89 45 0c mov %eax,0xc(%ebp)
114bd2: 89 55 08 mov %edx,0x8(%ebp)
}
114bd5: 8d 65 f4 lea -0xc(%ebp),%esp
114bd8: 5b pop %ebx
114bd9: 5e pop %esi
114bda: 5f pop %edi
114bdb: c9 leave
executing->Wait.return_argument_second.mutable_object = buffer;
executing->Wait.return_argument = size_p;
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
114bdc: e9 2f 1e 00 00 jmp 116a10 <_Thread_queue_Enqueue_with_handler>
114be1: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _CORE_message_queue_Free_message_buffer (
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Buffer_control *the_message
)
{
_Chain_Append( &the_message_queue->Inactive_messages, &the_message->Node );
114be4: 89 5d 0c mov %ebx,0xc(%ebp)
114be7: 83 c2 68 add $0x68,%edx
114bea: 89 55 08 mov %edx,0x8(%ebp)
}
114bed: 8d 65 f4 lea -0xc(%ebp),%esp
114bf0: 5b pop %ebx
114bf1: 5e pop %esi
114bf2: 5f pop %edi
114bf3: c9 leave
114bf4: e9 a7 fd ff ff jmp 1149a0 <_Chain_Append>
0010c03c <_CORE_message_queue_Submit>:
#endif
CORE_message_queue_Submit_types submit_type,
bool wait,
Watchdog_Interval timeout
)
{
10c03c: 55 push %ebp
10c03d: 89 e5 mov %esp,%ebp
10c03f: 57 push %edi
10c040: 56 push %esi
10c041: 53 push %ebx
10c042: 83 ec 1c sub $0x1c,%esp
10c045: 8b 5d 08 mov 0x8(%ebp),%ebx
10c048: 8b 75 0c mov 0xc(%ebp),%esi
10c04b: 8a 4d 20 mov 0x20(%ebp),%cl
CORE_message_queue_Buffer_control *the_message;
Thread_Control *the_thread;
if ( size > the_message_queue->maximum_message_size ) {
10c04e: 8b 45 10 mov 0x10(%ebp),%eax
10c051: 39 43 4c cmp %eax,0x4c(%ebx)
10c054: 72 32 jb 10c088 <_CORE_message_queue_Submit+0x4c>
}
/*
* Is there a thread currently waiting on this message queue?
*/
if ( the_message_queue->number_of_pending_messages == 0 ) {
10c056: 8b 43 48 mov 0x48(%ebx),%eax
10c059: 85 c0 test %eax,%eax
10c05b: 74 3b je 10c098 <_CORE_message_queue_Submit+0x5c>
/*
* No one waiting on the message queue at this time, so attempt to
* queue the message up for a future receive.
*/
if ( the_message_queue->number_of_pending_messages <
10c05d: 39 43 44 cmp %eax,0x44(%ebx)
10c060: 0f 87 ba 00 00 00 ja 10c120 <_CORE_message_queue_Submit+0xe4>
/*
* No message buffers were available so we may need to return an
* overflow error or block the sender until the message is placed
* on the queue.
*/
if ( !wait ) {
10c066: 84 c9 test %cl,%cl
10c068: 0f 84 ee 00 00 00 je 10c15c <_CORE_message_queue_Submit+0x120>
/*
* Do NOT block on a send if the caller is in an ISR. It is
* deadly to block in an ISR.
*/
if ( _ISR_Is_in_progress() ) {
10c06e: 8b 15 14 84 12 00 mov 0x128414,%edx
10c074: 85 d2 test %edx,%edx
10c076: 74 60 je 10c0d8 <_CORE_message_queue_Submit+0x9c>
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED;
10c078: b8 03 00 00 00 mov $0x3,%eax
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
#endif
}
10c07d: 8d 65 f4 lea -0xc(%ebp),%esp
10c080: 5b pop %ebx
10c081: 5e pop %esi
10c082: 5f pop %edi
10c083: c9 leave
10c084: c3 ret
10c085: 8d 76 00 lea 0x0(%esi),%esi
{
CORE_message_queue_Buffer_control *the_message;
Thread_Control *the_thread;
if ( size > the_message_queue->maximum_message_size ) {
return CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE;
10c088: b8 01 00 00 00 mov $0x1,%eax
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
#endif
}
10c08d: 8d 65 f4 lea -0xc(%ebp),%esp
10c090: 5b pop %ebx
10c091: 5e pop %esi
10c092: 5f pop %edi
10c093: c9 leave
10c094: c3 ret
10c095: 8d 76 00 lea 0x0(%esi),%esi
/*
* Is there a thread currently waiting on this message queue?
*/
if ( the_message_queue->number_of_pending_messages == 0 ) {
the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue );
10c098: 83 ec 0c sub $0xc,%esp
10c09b: 53 push %ebx
10c09c: 88 4d e4 mov %cl,-0x1c(%ebp)
10c09f: e8 04 1c 00 00 call 10dca8 <_Thread_queue_Dequeue>
10c0a4: 89 c2 mov %eax,%edx
if ( the_thread ) {
10c0a6: 83 c4 10 add $0x10,%esp
10c0a9: 85 c0 test %eax,%eax
10c0ab: 8a 4d e4 mov -0x1c(%ebp),%cl
10c0ae: 0f 84 b8 00 00 00 je 10c16c <_CORE_message_queue_Submit+0x130>
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
10c0b4: 8b 40 2c mov 0x2c(%eax),%eax
10c0b7: 89 c7 mov %eax,%edi
10c0b9: 8b 4d 10 mov 0x10(%ebp),%ecx
10c0bc: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
_CORE_message_queue_Copy_buffer(
buffer,
the_thread->Wait.return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
10c0be: 8b 42 28 mov 0x28(%edx),%eax
10c0c1: 8b 4d 10 mov 0x10(%ebp),%ecx
10c0c4: 89 08 mov %ecx,(%eax)
the_thread->Wait.count = (uint32_t) submit_type;
10c0c6: 8b 45 1c mov 0x1c(%ebp),%eax
10c0c9: 89 42 24 mov %eax,0x24(%edx)
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_message_queue_mp_support) ( the_thread, id );
#endif
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
10c0cc: 31 c0 xor %eax,%eax
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
#endif
}
10c0ce: 8d 65 f4 lea -0xc(%ebp),%esp
10c0d1: 5b pop %ebx
10c0d2: 5e pop %esi
10c0d3: 5f pop %edi
10c0d4: c9 leave
10c0d5: c3 ret
10c0d6: 66 90 xchg %ax,%ax
* Thus the unusual choice to open a new scope and declare
* it as a variable. Doing this emphasizes how dangerous it
* would be to use this variable prior to here.
*/
{
Thread_Control *executing = _Thread_Executing;
10c0d8: a1 18 84 12 00 mov 0x128418,%eax
ISR_Level level;
_ISR_Disable( level );
10c0dd: 9c pushf
10c0de: fa cli
10c0df: 59 pop %ecx
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
10c0e0: c7 43 30 01 00 00 00 movl $0x1,0x30(%ebx)
_Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue );
executing->Wait.queue = &the_message_queue->Wait_queue;
10c0e7: 89 58 44 mov %ebx,0x44(%eax)
executing->Wait.id = id;
10c0ea: 8b 55 14 mov 0x14(%ebp),%edx
10c0ed: 89 50 20 mov %edx,0x20(%eax)
executing->Wait.return_argument_second.immutable_object = buffer;
10c0f0: 89 70 2c mov %esi,0x2c(%eax)
executing->Wait.option = (uint32_t) size;
10c0f3: 8b 55 10 mov 0x10(%ebp),%edx
10c0f6: 89 50 30 mov %edx,0x30(%eax)
executing->Wait.count = submit_type;
10c0f9: 8b 55 1c mov 0x1c(%ebp),%edx
10c0fc: 89 50 24 mov %edx,0x24(%eax)
_ISR_Enable( level );
10c0ff: 51 push %ecx
10c100: 9d popf
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
10c101: 50 push %eax
10c102: 68 fc e0 10 00 push $0x10e0fc
10c107: ff 75 24 pushl 0x24(%ebp)
10c10a: 53 push %ebx
10c10b: e8 c0 1c 00 00 call 10ddd0 <_Thread_queue_Enqueue_with_handler>
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
10c110: 83 c4 10 add $0x10,%esp
10c113: b8 07 00 00 00 mov $0x7,%eax
#endif
}
10c118: 8d 65 f4 lea -0xc(%ebp),%esp
10c11b: 5b pop %ebx
10c11c: 5e pop %esi
10c11d: 5f pop %edi
10c11e: c9 leave
10c11f: c3 ret
_CORE_message_queue_Allocate_message_buffer (
CORE_message_queue_Control *the_message_queue
)
{
return (CORE_message_queue_Buffer_control *)
_Chain_Get( &the_message_queue->Inactive_messages );
10c120: 83 ec 0c sub $0xc,%esp
10c123: 8d 43 68 lea 0x68(%ebx),%eax
10c126: 50 push %eax
10c127: e8 ec fe ff ff call 10c018 <_Chain_Get>
10c12c: 89 c2 mov %eax,%edx
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED;
#endif
_CORE_message_queue_Copy_buffer(
buffer,
the_message->Contents.buffer,
10c12e: 8d 40 10 lea 0x10(%eax),%eax
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
10c131: 89 c7 mov %eax,%edi
10c133: 8b 4d 10 mov 0x10(%ebp),%ecx
10c136: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
size
);
the_message->Contents.size = size;
10c138: 8b 4d 10 mov 0x10(%ebp),%ecx
10c13b: 89 4a 0c mov %ecx,0xc(%edx)
CORE_message_queue_Buffer_control *the_message,
int priority
)
{
#if defined(RTEMS_SCORE_COREMSG_ENABLE_MESSAGE_PRIORITY)
the_message->priority = priority;
10c13e: 8b 45 1c mov 0x1c(%ebp),%eax
10c141: 89 42 08 mov %eax,0x8(%edx)
_CORE_message_queue_Set_message_priority( the_message, submit_type );
_CORE_message_queue_Insert_message(
10c144: 83 c4 0c add $0xc,%esp
10c147: 50 push %eax
10c148: 52 push %edx
10c149: 53 push %ebx
10c14a: e8 61 4f 00 00 call 1110b0 <_CORE_message_queue_Insert_message>
the_message_queue,
the_message,
submit_type
);
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
10c14f: 83 c4 10 add $0x10,%esp
10c152: 31 c0 xor %eax,%eax
10c154: e9 34 ff ff ff jmp 10c08d <_CORE_message_queue_Submit+0x51>
10c159: 8d 76 00 lea 0x0(%esi),%esi
* No message buffers were available so we may need to return an
* overflow error or block the sender until the message is placed
* on the queue.
*/
if ( !wait ) {
return CORE_MESSAGE_QUEUE_STATUS_TOO_MANY;
10c15c: b8 02 00 00 00 mov $0x2,%eax
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
#endif
}
10c161: 8d 65 f4 lea -0xc(%ebp),%esp
10c164: 5b pop %ebx
10c165: 5e pop %esi
10c166: 5f pop %edi
10c167: c9 leave
10c168: c3 ret
10c169: 8d 76 00 lea 0x0(%esi),%esi
/*
* Is there a thread currently waiting on this message queue?
*/
if ( the_message_queue->number_of_pending_messages == 0 ) {
the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue );
if ( the_thread ) {
10c16c: 8b 43 48 mov 0x48(%ebx),%eax
10c16f: e9 e9 fe ff ff jmp 10c05d <_CORE_message_queue_Submit+0x21>
0010c180 <_CORE_mutex_Initialize>:
CORE_mutex_Status _CORE_mutex_Initialize(
CORE_mutex_Control *the_mutex,
CORE_mutex_Attributes *the_mutex_attributes,
uint32_t initial_lock
)
{
10c180: 55 push %ebp
10c181: 89 e5 mov %esp,%ebp
10c183: 57 push %edi
10c184: 56 push %esi
10c185: 53 push %ebx
10c186: 83 ec 0c sub $0xc,%esp
10c189: 8b 45 08 mov 0x8(%ebp),%eax
10c18c: 8b 5d 0c mov 0xc(%ebp),%ebx
10c18f: 8b 55 10 mov 0x10(%ebp),%edx
/* Add this to the RTEMS environment later ?????????
rtems_assert( initial_lock == CORE_MUTEX_LOCKED ||
initial_lock == CORE_MUTEX_UNLOCKED );
*/
the_mutex->Attributes = *the_mutex_attributes;
10c192: 8d 78 40 lea 0x40(%eax),%edi
10c195: b9 04 00 00 00 mov $0x4,%ecx
10c19a: 89 de mov %ebx,%esi
10c19c: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
the_mutex->lock = initial_lock;
10c19e: 89 50 50 mov %edx,0x50(%eax)
the_mutex->blocked_count = 0;
10c1a1: c7 40 58 00 00 00 00 movl $0x0,0x58(%eax)
if ( initial_lock == CORE_MUTEX_LOCKED ) {
10c1a8: 85 d2 test %edx,%edx
10c1aa: 75 30 jne 10c1dc <_CORE_mutex_Initialize+0x5c>
the_mutex->nest_count = 1;
10c1ac: c7 40 54 01 00 00 00 movl $0x1,0x54(%eax)
the_mutex->holder = _Thread_Executing;
10c1b3: 8b 15 18 84 12 00 mov 0x128418,%edx
10c1b9: 89 50 5c mov %edx,0x5c(%eax)
the_mutex->holder_id = _Thread_Executing->Object.id;
10c1bc: 8b 4a 08 mov 0x8(%edx),%ecx
10c1bf: 89 48 60 mov %ecx,0x60(%eax)
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
10c1c2: 8b 48 48 mov 0x48(%eax),%ecx
if ( initial_lock == CORE_MUTEX_LOCKED ) {
the_mutex->nest_count = 1;
the_mutex->holder = _Thread_Executing;
the_mutex->holder_id = _Thread_Executing->Object.id;
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
10c1c5: 83 f9 02 cmp $0x2,%ecx
10c1c8: 74 05 je 10c1cf <_CORE_mutex_Initialize+0x4f>
10c1ca: 83 f9 03 cmp $0x3,%ecx
10c1cd: 75 22 jne 10c1f1 <_CORE_mutex_Initialize+0x71>
_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
if ( _Thread_Executing->current_priority <
10c1cf: 8b 48 4c mov 0x4c(%eax),%ecx
10c1d2: 39 4a 14 cmp %ecx,0x14(%edx)
10c1d5: 72 41 jb 10c218 <_CORE_mutex_Initialize+0x98>
_Chain_Prepend_unprotected( &_Thread_Executing->lock_mutex,
&the_mutex->queue.lock_queue );
the_mutex->queue.priority_before = _Thread_Executing->current_priority;
#endif
_Thread_Executing->resource_count++;
10c1d7: ff 42 1c incl 0x1c(%edx)
10c1da: eb 15 jmp 10c1f1 <_CORE_mutex_Initialize+0x71>
}
} else {
the_mutex->nest_count = 0;
10c1dc: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
the_mutex->holder = NULL;
10c1e3: c7 40 5c 00 00 00 00 movl $0x0,0x5c(%eax)
the_mutex->holder_id = 0;
10c1ea: c7 40 60 00 00 00 00 movl $0x0,0x60(%eax)
}
_Thread_queue_Initialize(
10c1f1: 6a 05 push $0x5
10c1f3: 68 00 04 00 00 push $0x400
10c1f8: 31 d2 xor %edx,%edx
10c1fa: 83 7b 08 00 cmpl $0x0,0x8(%ebx)
10c1fe: 0f 95 c2 setne %dl
10c201: 52 push %edx
10c202: 50 push %eax
10c203: e8 30 1e 00 00 call 10e038 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_FIFO : THREAD_QUEUE_DISCIPLINE_PRIORITY,
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
10c208: 83 c4 10 add $0x10,%esp
10c20b: 31 c0 xor %eax,%eax
}
10c20d: 8d 65 f4 lea -0xc(%ebp),%esp
10c210: 5b pop %ebx
10c211: 5e pop %esi
10c212: 5f pop %edi
10c213: c9 leave
10c214: c3 ret
10c215: 8d 76 00 lea 0x0(%esi),%esi
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
if ( _Thread_Executing->current_priority <
the_mutex->Attributes.priority_ceiling )
return CORE_MUTEX_STATUS_CEILING_VIOLATED;
10c218: b8 06 00 00 00 mov $0x6,%eax
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
10c21d: 8d 65 f4 lea -0xc(%ebp),%esp
10c220: 5b pop %ebx
10c221: 5e pop %esi
10c222: 5f pop %edi
10c223: c9 leave
10c224: c3 ret
0010c278 <_CORE_mutex_Seize>:
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
10c278: 55 push %ebp
10c279: 89 e5 mov %esp,%ebp
10c27b: 53 push %ebx
10c27c: 83 ec 14 sub $0x14,%esp
10c27f: 8b 5d 08 mov 0x8(%ebp),%ebx
10c282: 8a 55 10 mov 0x10(%ebp),%dl
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
10c285: a1 30 7e 12 00 mov 0x127e30,%eax
10c28a: 85 c0 test %eax,%eax
10c28c: 74 04 je 10c292 <_CORE_mutex_Seize+0x1a>
10c28e: 84 d2 test %dl,%dl
10c290: 75 36 jne 10c2c8 <_CORE_mutex_Seize+0x50><== ALWAYS TAKEN
10c292: 83 ec 08 sub $0x8,%esp
10c295: 8d 45 18 lea 0x18(%ebp),%eax
10c298: 50 push %eax
10c299: 53 push %ebx
10c29a: 88 55 f4 mov %dl,-0xc(%ebp)
10c29d: e8 e6 4e 00 00 call 111188 <_CORE_mutex_Seize_interrupt_trylock>
10c2a2: 83 c4 10 add $0x10,%esp
10c2a5: 85 c0 test %eax,%eax
10c2a7: 8a 55 f4 mov -0xc(%ebp),%dl
10c2aa: 74 14 je 10c2c0 <_CORE_mutex_Seize+0x48>
10c2ac: 84 d2 test %dl,%dl
10c2ae: 75 30 jne 10c2e0 <_CORE_mutex_Seize+0x68>
10c2b0: ff 75 18 pushl 0x18(%ebp)
10c2b3: 9d popf
10c2b4: a1 18 84 12 00 mov 0x128418,%eax
10c2b9: c7 40 34 01 00 00 00 movl $0x1,0x34(%eax)
}
10c2c0: 8b 5d fc mov -0x4(%ebp),%ebx
10c2c3: c9 leave
10c2c4: c3 ret
10c2c5: 8d 76 00 lea 0x0(%esi),%esi
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
10c2c8: 83 3d 00 80 12 00 01 cmpl $0x1,0x128000
10c2cf: 76 c1 jbe 10c292 <_CORE_mutex_Seize+0x1a>
10c2d1: 53 push %ebx
10c2d2: 6a 12 push $0x12
10c2d4: 6a 00 push $0x0
10c2d6: 6a 00 push $0x0
10c2d8: e8 1b 06 00 00 call 10c8f8 <_Internal_error_Occurred>
10c2dd: 8d 76 00 lea 0x0(%esi),%esi
10c2e0: c7 43 30 01 00 00 00 movl $0x1,0x30(%ebx)
10c2e7: a1 18 84 12 00 mov 0x128418,%eax
10c2ec: 89 58 44 mov %ebx,0x44(%eax)
10c2ef: 8b 55 0c mov 0xc(%ebp),%edx
10c2f2: 89 50 20 mov %edx,0x20(%eax)
10c2f5: a1 30 7e 12 00 mov 0x127e30,%eax
10c2fa: 40 inc %eax
10c2fb: a3 30 7e 12 00 mov %eax,0x127e30
10c300: ff 75 18 pushl 0x18(%ebp)
10c303: 9d popf
10c304: 83 ec 08 sub $0x8,%esp
10c307: ff 75 14 pushl 0x14(%ebp)
10c30a: 53 push %ebx
10c30b: e8 18 ff ff ff call 10c228 <_CORE_mutex_Seize_interrupt_blocking>
10c310: 83 c4 10 add $0x10,%esp
}
10c313: 8b 5d fc mov -0x4(%ebp),%ebx
10c316: c9 leave
10c317: c3 ret
00111188 <_CORE_mutex_Seize_interrupt_trylock>:
#if defined(__RTEMS_DO_NOT_INLINE_CORE_MUTEX_SEIZE__)
int _CORE_mutex_Seize_interrupt_trylock(
CORE_mutex_Control *the_mutex,
ISR_Level *level_p
)
{
111188: 55 push %ebp
111189: 89 e5 mov %esp,%ebp
11118b: 56 push %esi
11118c: 53 push %ebx
11118d: 8b 45 08 mov 0x8(%ebp),%eax
111190: 8b 4d 0c mov 0xc(%ebp),%ecx
{
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
111193: 8b 15 18 84 12 00 mov 0x128418,%edx
executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL;
111199: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
if ( !_CORE_mutex_Is_locked( the_mutex ) ) {
1111a0: 8b 58 50 mov 0x50(%eax),%ebx
1111a3: 85 db test %ebx,%ebx
1111a5: 74 31 je 1111d8 <_CORE_mutex_Seize_interrupt_trylock+0x50>
the_mutex->lock = CORE_MUTEX_LOCKED;
1111a7: c7 40 50 00 00 00 00 movl $0x0,0x50(%eax)
the_mutex->holder = executing;
1111ae: 89 50 5c mov %edx,0x5c(%eax)
the_mutex->holder_id = executing->Object.id;
1111b1: 8b 5a 08 mov 0x8(%edx),%ebx
1111b4: 89 58 60 mov %ebx,0x60(%eax)
the_mutex->nest_count = 1;
1111b7: c7 40 54 01 00 00 00 movl $0x1,0x54(%eax)
return _CORE_mutex_Seize_interrupt_trylock_body( the_mutex, level_p );
}
1111be: 8b 58 48 mov 0x48(%eax),%ebx
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
1111c1: 83 fb 02 cmp $0x2,%ebx
1111c4: 74 26 je 1111ec <_CORE_mutex_Seize_interrupt_trylock+0x64>
1111c6: 83 fb 03 cmp $0x3,%ebx
1111c9: 74 3d je 111208 <_CORE_mutex_Seize_interrupt_trylock+0x80>
executing->resource_count++;
}
if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
_ISR_Enable( *level_p );
1111cb: ff 31 pushl (%ecx)
1111cd: 9d popf
return 0;
1111ce: 31 c0 xor %eax,%eax
1111d0: 8d 65 f8 lea -0x8(%ebp),%esp
1111d3: 5b pop %ebx
1111d4: 5e pop %esi
1111d5: c9 leave
1111d6: c3 ret
1111d7: 90 nop
/*
* At this point, we know the mutex was not available. If this thread
* is the thread that has locked the mutex, let's see if we are allowed
* to nest access.
*/
if ( _Thread_Is_executing( the_mutex->holder ) ) {
1111d8: 3b 50 5c cmp 0x5c(%eax),%edx
1111db: 74 17 je 1111f4 <_CORE_mutex_Seize_interrupt_trylock+0x6c>
/*
* The mutex is not available and the caller must deal with the possibility
* of blocking.
*/
return 1;
1111dd: b8 01 00 00 00 mov $0x1,%eax
1111e2: 8d 65 f8 lea -0x8(%ebp),%esp
1111e5: 5b pop %ebx
1111e6: 5e pop %esi
1111e7: c9 leave
1111e8: c3 ret
1111e9: 8d 76 00 lea 0x0(%esi),%esi
_Chain_Prepend_unprotected( &executing->lock_mutex,
&the_mutex->queue.lock_queue );
the_mutex->queue.priority_before = executing->current_priority;
#endif
executing->resource_count++;
1111ec: ff 42 1c incl 0x1c(%edx)
1111ef: eb da jmp 1111cb <_CORE_mutex_Seize_interrupt_trylock+0x43>
1111f1: 8d 76 00 lea 0x0(%esi),%esi
* At this point, we know the mutex was not available. If this thread
* is the thread that has locked the mutex, let's see if we are allowed
* to nest access.
*/
if ( _Thread_Is_executing( the_mutex->holder ) ) {
switch ( the_mutex->Attributes.lock_nesting_behavior ) {
1111f4: 8b 58 40 mov 0x40(%eax),%ebx
1111f7: 85 db test %ebx,%ebx
1111f9: 75 45 jne 111240 <_CORE_mutex_Seize_interrupt_trylock+0xb8>
case CORE_MUTEX_NESTING_ACQUIRES:
the_mutex->nest_count++;
1111fb: ff 40 54 incl 0x54(%eax)
_ISR_Enable( *level_p );
1111fe: ff 31 pushl (%ecx)
111200: 9d popf
return 0;
111201: 31 c0 xor %eax,%eax
111203: eb dd jmp 1111e2 <_CORE_mutex_Seize_interrupt_trylock+0x5a>
111205: 8d 76 00 lea 0x0(%esi),%esi
_Chain_Prepend_unprotected( &executing->lock_mutex,
&the_mutex->queue.lock_queue );
the_mutex->queue.priority_before = executing->current_priority;
#endif
executing->resource_count++;
111208: 8b 5a 1c mov 0x1c(%edx),%ebx
11120b: 8d 73 01 lea 0x1(%ebx),%esi
11120e: 89 72 1c mov %esi,0x1c(%edx)
Priority_Control ceiling;
Priority_Control current;
ceiling = the_mutex->Attributes.priority_ceiling;
current = executing->current_priority;
if ( current == ceiling ) {
111211: 8b 72 14 mov 0x14(%edx),%esi
111214: 39 70 4c cmp %esi,0x4c(%eax)
111217: 74 6b je 111284 <_CORE_mutex_Seize_interrupt_trylock+0xfc>
_ISR_Enable( *level_p );
return 0;
}
if ( current > ceiling ) {
111219: 72 39 jb 111254 <_CORE_mutex_Seize_interrupt_trylock+0xcc>
);
_Thread_Enable_dispatch();
return 0;
}
/* if ( current < ceiling ) */ {
executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED;
11121b: c7 42 34 06 00 00 00 movl $0x6,0x34(%edx)
the_mutex->lock = CORE_MUTEX_UNLOCKED;
111222: c7 40 50 01 00 00 00 movl $0x1,0x50(%eax)
the_mutex->nest_count = 0; /* undo locking above */
111229: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
executing->resource_count--; /* undo locking above */
111230: 89 5a 1c mov %ebx,0x1c(%edx)
_ISR_Enable( *level_p );
111233: ff 31 pushl (%ecx)
111235: 9d popf
return 0;
111236: 31 c0 xor %eax,%eax
111238: 8d 65 f8 lea -0x8(%ebp),%esp
11123b: 5b pop %ebx
11123c: 5e pop %esi
11123d: c9 leave
11123e: c3 ret
11123f: 90 nop
* At this point, we know the mutex was not available. If this thread
* is the thread that has locked the mutex, let's see if we are allowed
* to nest access.
*/
if ( _Thread_Is_executing( the_mutex->holder ) ) {
switch ( the_mutex->Attributes.lock_nesting_behavior ) {
111240: 4b dec %ebx
111241: 75 9a jne 1111dd <_CORE_mutex_Seize_interrupt_trylock+0x55>
case CORE_MUTEX_NESTING_ACQUIRES:
the_mutex->nest_count++;
_ISR_Enable( *level_p );
return 0;
case CORE_MUTEX_NESTING_IS_ERROR:
executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED;
111243: c7 42 34 02 00 00 00 movl $0x2,0x34(%edx)
_ISR_Enable( *level_p );
11124a: ff 31 pushl (%ecx)
11124c: 9d popf
return 0;
11124d: 31 c0 xor %eax,%eax
11124f: eb 91 jmp 1111e2 <_CORE_mutex_Seize_interrupt_trylock+0x5a>
111251: 8d 76 00 lea 0x0(%esi),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
111254: 8b 15 30 7e 12 00 mov 0x127e30,%edx
11125a: 42 inc %edx
11125b: 89 15 30 7e 12 00 mov %edx,0x127e30
return 0;
}
if ( current > ceiling ) {
_Thread_Disable_dispatch();
_ISR_Enable( *level_p );
111261: ff 31 pushl (%ecx)
111263: 9d popf
_Thread_Change_priority(
111264: 52 push %edx
111265: 6a 00 push $0x0
111267: ff 70 4c pushl 0x4c(%eax)
11126a: ff 70 5c pushl 0x5c(%eax)
11126d: e8 ce c1 ff ff call 10d440 <_Thread_Change_priority>
the_mutex->holder,
the_mutex->Attributes.priority_ceiling,
false
);
_Thread_Enable_dispatch();
111272: e8 7d c6 ff ff call 10d8f4 <_Thread_Enable_dispatch>
111277: 83 c4 10 add $0x10,%esp
return 0;
11127a: 31 c0 xor %eax,%eax
11127c: e9 61 ff ff ff jmp 1111e2 <_CORE_mutex_Seize_interrupt_trylock+0x5a>
111281: 8d 76 00 lea 0x0(%esi),%esi
Priority_Control current;
ceiling = the_mutex->Attributes.priority_ceiling;
current = executing->current_priority;
if ( current == ceiling ) {
_ISR_Enable( *level_p );
111284: ff 31 pushl (%ecx)
111286: 9d popf
return 0;
111287: 31 c0 xor %eax,%eax
111289: e9 54 ff ff ff jmp 1111e2 <_CORE_mutex_Seize_interrupt_trylock+0x5a>
0010c318 <_CORE_mutex_Surrender>:
#else
Objects_Id id __attribute__((unused)),
CORE_mutex_API_mp_support_callout api_mutex_mp_support __attribute__((unused))
#endif
)
{
10c318: 55 push %ebp
10c319: 89 e5 mov %esp,%ebp
10c31b: 53 push %ebx
10c31c: 83 ec 04 sub $0x4,%esp
10c31f: 8b 5d 08 mov 0x8(%ebp),%ebx
Thread_Control *the_thread;
Thread_Control *holder;
holder = the_mutex->holder;
10c322: 8b 43 5c mov 0x5c(%ebx),%eax
* allowed when the mutex in quetion is FIFO or simple Priority
* discipline. But Priority Ceiling or Priority Inheritance mutexes
* must be released by the thread which acquired them.
*/
if ( the_mutex->Attributes.only_owner_release ) {
10c325: 80 7b 44 00 cmpb $0x0,0x44(%ebx)
10c329: 74 15 je 10c340 <_CORE_mutex_Surrender+0x28>
if ( !_Thread_Is_executing( holder ) )
10c32b: 3b 05 18 84 12 00 cmp 0x128418,%eax
10c331: 74 0d je 10c340 <_CORE_mutex_Surrender+0x28>
return CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE;
10c333: b8 03 00 00 00 mov $0x3,%eax
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
10c338: 8b 5d fc mov -0x4(%ebp),%ebx
10c33b: c9 leave
10c33c: c3 ret
10c33d: 8d 76 00 lea 0x0(%esi),%esi
return CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE;
}
/* XXX already unlocked -- not right status */
if ( !the_mutex->nest_count )
10c340: 8b 53 54 mov 0x54(%ebx),%edx
10c343: 85 d2 test %edx,%edx
10c345: 74 51 je 10c398 <_CORE_mutex_Surrender+0x80>
return CORE_MUTEX_STATUS_SUCCESSFUL;
the_mutex->nest_count--;
10c347: 4a dec %edx
10c348: 89 53 54 mov %edx,0x54(%ebx)
if ( the_mutex->nest_count != 0 ) {
10c34b: 85 d2 test %edx,%edx
10c34d: 75 49 jne 10c398 <_CORE_mutex_Surrender+0x80>
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
10c34f: 8b 53 48 mov 0x48(%ebx),%edx
/*
* Formally release the mutex before possibly transferring it to a
* blocked thread.
*/
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
10c352: 83 fa 02 cmp $0x2,%edx
10c355: 74 69 je 10c3c0 <_CORE_mutex_Surrender+0xa8>
10c357: 83 fa 03 cmp $0x3,%edx
10c35a: 74 64 je 10c3c0 <_CORE_mutex_Surrender+0xa8>
if ( holder->resource_count == 0 &&
holder->real_priority != holder->current_priority ) {
_Thread_Change_priority( holder, holder->real_priority, true );
}
}
the_mutex->holder = NULL;
10c35c: c7 43 5c 00 00 00 00 movl $0x0,0x5c(%ebx)
the_mutex->holder_id = 0;
10c363: c7 43 60 00 00 00 00 movl $0x0,0x60(%ebx)
/*
* Now we check if another thread was waiting for this mutex. If so,
* transfer the mutex to that thread.
*/
if ( ( the_thread = _Thread_queue_Dequeue( &the_mutex->Wait_queue ) ) ) {
10c36a: 83 ec 0c sub $0xc,%esp
10c36d: 53 push %ebx
10c36e: e8 35 19 00 00 call 10dca8 <_Thread_queue_Dequeue>
10c373: 83 c4 10 add $0x10,%esp
10c376: 85 c0 test %eax,%eax
10c378: 74 7a je 10c3f4 <_CORE_mutex_Surrender+0xdc>
} else
#endif
{
the_mutex->holder = the_thread;
10c37a: 89 43 5c mov %eax,0x5c(%ebx)
the_mutex->holder_id = the_thread->Object.id;
10c37d: 8b 50 08 mov 0x8(%eax),%edx
10c380: 89 53 60 mov %edx,0x60(%ebx)
the_mutex->nest_count = 1;
10c383: c7 43 54 01 00 00 00 movl $0x1,0x54(%ebx)
switch ( the_mutex->Attributes.discipline ) {
10c38a: 8b 53 48 mov 0x48(%ebx),%edx
10c38d: 83 fa 02 cmp $0x2,%edx
10c390: 74 56 je 10c3e8 <_CORE_mutex_Surrender+0xd0>
10c392: 83 fa 03 cmp $0x3,%edx
10c395: 74 09 je 10c3a0 <_CORE_mutex_Surrender+0x88>
10c397: 90 nop
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
10c398: 31 c0 xor %eax,%eax
}
10c39a: 8b 5d fc mov -0x4(%ebp),%ebx
10c39d: c9 leave
10c39e: c3 ret
10c39f: 90 nop
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
break;
case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
10c3a0: ff 40 1c incl 0x1c(%eax)
if (the_mutex->Attributes.priority_ceiling <
10c3a3: 8b 53 4c mov 0x4c(%ebx),%edx
10c3a6: 3b 50 14 cmp 0x14(%eax),%edx
10c3a9: 73 ed jae 10c398 <_CORE_mutex_Surrender+0x80>
the_thread->current_priority){
_Thread_Change_priority(
10c3ab: 51 push %ecx
10c3ac: 6a 00 push $0x0
10c3ae: 52 push %edx
10c3af: 50 push %eax
10c3b0: e8 8b 10 00 00 call 10d440 <_Thread_Change_priority>
10c3b5: 83 c4 10 add $0x10,%esp
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
10c3b8: 31 c0 xor %eax,%eax
10c3ba: e9 79 ff ff ff jmp 10c338 <_CORE_mutex_Surrender+0x20>
10c3bf: 90 nop
_CORE_mutex_Pop_priority( the_mutex, holder );
if ( pop_status != CORE_MUTEX_STATUS_SUCCESSFUL )
return pop_status;
holder->resource_count--;
10c3c0: 8b 50 1c mov 0x1c(%eax),%edx
10c3c3: 4a dec %edx
10c3c4: 89 50 1c mov %edx,0x1c(%eax)
/*
* Whether or not someone is waiting for the mutex, an
* inherited priority must be lowered if this is the last
* mutex (i.e. resource) this task has.
*/
if ( holder->resource_count == 0 &&
10c3c7: 85 d2 test %edx,%edx
10c3c9: 75 91 jne 10c35c <_CORE_mutex_Surrender+0x44>
holder->real_priority != holder->current_priority ) {
10c3cb: 8b 50 18 mov 0x18(%eax),%edx
/*
* Whether or not someone is waiting for the mutex, an
* inherited priority must be lowered if this is the last
* mutex (i.e. resource) this task has.
*/
if ( holder->resource_count == 0 &&
10c3ce: 3b 50 14 cmp 0x14(%eax),%edx
10c3d1: 74 89 je 10c35c <_CORE_mutex_Surrender+0x44>
holder->real_priority != holder->current_priority ) {
_Thread_Change_priority( holder, holder->real_priority, true );
10c3d3: 51 push %ecx
10c3d4: 6a 01 push $0x1
10c3d6: 52 push %edx
10c3d7: 50 push %eax
10c3d8: e8 63 10 00 00 call 10d440 <_Thread_Change_priority>
10c3dd: 83 c4 10 add $0x10,%esp
10c3e0: e9 77 ff ff ff jmp 10c35c <_CORE_mutex_Surrender+0x44>
10c3e5: 8d 76 00 lea 0x0(%esi),%esi
case CORE_MUTEX_DISCIPLINES_FIFO:
case CORE_MUTEX_DISCIPLINES_PRIORITY:
break;
case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
10c3e8: ff 40 1c incl 0x1c(%eax)
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
10c3eb: 31 c0 xor %eax,%eax
case CORE_MUTEX_DISCIPLINES_PRIORITY:
break;
case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
break;
10c3ed: e9 46 ff ff ff jmp 10c338 <_CORE_mutex_Surrender+0x20>
10c3f2: 66 90 xchg %ax,%ax
}
break;
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
10c3f4: c7 43 50 01 00 00 00 movl $0x1,0x50(%ebx)
return CORE_MUTEX_STATUS_SUCCESSFUL;
10c3fb: 31 c0 xor %eax,%eax
10c3fd: e9 36 ff ff ff jmp 10c338 <_CORE_mutex_Surrender+0x20>
00115298 <_CORE_semaphore_Seize>:
CORE_semaphore_Control *the_semaphore,
Objects_Id id,
bool wait,
Watchdog_Interval timeout
)
{
115298: 55 push %ebp
115299: 89 e5 mov %esp,%ebp
11529b: 57 push %edi
11529c: 56 push %esi
11529d: 53 push %ebx
11529e: 83 ec 1c sub $0x1c,%esp
1152a1: 8b 45 08 mov 0x8(%ebp),%eax
1152a4: 8b 7d 0c mov 0xc(%ebp),%edi
1152a7: 8b 75 14 mov 0x14(%ebp),%esi
1152aa: 8a 5d 10 mov 0x10(%ebp),%bl
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
1152ad: 8b 15 98 e1 12 00 mov 0x12e198,%edx
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
1152b3: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
_ISR_Disable( level );
1152ba: 9c pushf
1152bb: fa cli
1152bc: 8f 45 e4 popl -0x1c(%ebp)
if ( the_semaphore->count != 0 ) {
1152bf: 8b 48 48 mov 0x48(%eax),%ecx
1152c2: 85 c9 test %ecx,%ecx
1152c4: 75 46 jne 11530c <_CORE_semaphore_Seize+0x74>
/*
* If the semaphore was not available and the caller was not willing
* to block, then return immediately with a status indicating that
* the semaphore was not available and the caller never blocked.
*/
if ( !wait ) {
1152c6: 84 db test %bl,%bl
1152c8: 75 16 jne 1152e0 <_CORE_semaphore_Seize+0x48>
_ISR_Enable( level );
1152ca: ff 75 e4 pushl -0x1c(%ebp)
1152cd: 9d popf
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT;
1152ce: c7 42 34 01 00 00 00 movl $0x1,0x34(%edx)
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
executing->Wait.queue = &the_semaphore->Wait_queue;
executing->Wait.id = id;
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
}
1152d5: 83 c4 1c add $0x1c,%esp
1152d8: 5b pop %ebx
1152d9: 5e pop %esi
1152da: 5f pop %edi
1152db: c9 leave
1152dc: c3 ret
1152dd: 8d 76 00 lea 0x0(%esi),%esi
1152e0: c7 40 30 01 00 00 00 movl $0x1,0x30(%eax)
/*
* If the semaphore is not available and the caller is willing to
* block, then we now block the caller with optional timeout.
*/
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
executing->Wait.queue = &the_semaphore->Wait_queue;
1152e7: 89 42 44 mov %eax,0x44(%edx)
executing->Wait.id = id;
1152ea: 89 7a 20 mov %edi,0x20(%edx)
_ISR_Enable( level );
1152ed: ff 75 e4 pushl -0x1c(%ebp)
1152f0: 9d popf
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
1152f1: c7 45 10 20 1b 11 00 movl $0x111b20,0x10(%ebp)
1152f8: 89 75 0c mov %esi,0xc(%ebp)
1152fb: 89 45 08 mov %eax,0x8(%ebp)
}
1152fe: 83 c4 1c add $0x1c,%esp
115301: 5b pop %ebx
115302: 5e pop %esi
115303: 5f pop %edi
115304: c9 leave
*/
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
executing->Wait.queue = &the_semaphore->Wait_queue;
executing->Wait.id = id;
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
115305: e9 ea c4 ff ff jmp 1117f4 <_Thread_queue_Enqueue_with_handler>
11530a: 66 90 xchg %ax,%ax
executing = _Thread_Executing;
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
_ISR_Disable( level );
if ( the_semaphore->count != 0 ) {
the_semaphore->count -= 1;
11530c: 49 dec %ecx
11530d: 89 48 48 mov %ecx,0x48(%eax)
_ISR_Enable( level );
115310: ff 75 e4 pushl -0x1c(%ebp)
115313: 9d popf
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
executing->Wait.queue = &the_semaphore->Wait_queue;
executing->Wait.id = id;
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
}
115314: 83 c4 1c add $0x1c,%esp
115317: 5b pop %ebx
115318: 5e pop %esi
115319: 5f pop %edi
11531a: c9 leave
11531b: c3 ret
0010c450 <_CORE_semaphore_Surrender>:
CORE_semaphore_Status _CORE_semaphore_Surrender(
CORE_semaphore_Control *the_semaphore,
Objects_Id id,
CORE_semaphore_API_mp_support_callout api_semaphore_mp_support
)
{
10c450: 55 push %ebp
10c451: 89 e5 mov %esp,%ebp
10c453: 53 push %ebx
10c454: 83 ec 10 sub $0x10,%esp
10c457: 8b 5d 08 mov 0x8(%ebp),%ebx
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) {
10c45a: 53 push %ebx
10c45b: e8 48 18 00 00 call 10dca8 <_Thread_queue_Dequeue>
10c460: 83 c4 10 add $0x10,%esp
10c463: 85 c0 test %eax,%eax
10c465: 74 09 je 10c470 <_CORE_semaphore_Surrender+0x20>
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
10c467: 31 c0 xor %eax,%eax
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
}
return status;
}
10c469: 8b 5d fc mov -0x4(%ebp),%ebx
10c46c: c9 leave
10c46d: c3 ret
10c46e: 66 90 xchg %ax,%ax
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
10c470: 9c pushf
10c471: fa cli
10c472: 5a pop %edx
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
10c473: 8b 43 48 mov 0x48(%ebx),%eax
10c476: 3b 43 40 cmp 0x40(%ebx),%eax
10c479: 72 0d jb 10c488 <_CORE_semaphore_Surrender+0x38><== ALWAYS TAKEN
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
10c47b: b8 04 00 00 00 mov $0x4,%eax <== NOT EXECUTED
_ISR_Enable( level );
10c480: 52 push %edx
10c481: 9d popf
}
return status;
}
10c482: 8b 5d fc mov -0x4(%ebp),%ebx
10c485: c9 leave
10c486: c3 ret
10c487: 90 nop
#endif
} else {
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
the_semaphore->count += 1;
10c488: 40 inc %eax
10c489: 89 43 48 mov %eax,0x48(%ebx)
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
10c48c: 31 c0 xor %eax,%eax
10c48e: eb f0 jmp 10c480 <_CORE_semaphore_Surrender+0x30>
0010c6b0 <_Chain_Get_with_empty_check>:
bool _Chain_Get_with_empty_check(
Chain_Control *chain,
Chain_Node **node
)
{
10c6b0: 55 push %ebp
10c6b1: 89 e5 mov %esp,%ebp
10c6b3: 57 push %edi
10c6b4: 56 push %esi
10c6b5: 53 push %ebx
10c6b6: 8b 45 08 mov 0x8(%ebp),%eax
10c6b9: 8b 7d 0c mov 0xc(%ebp),%edi
ISR_Level level;
bool is_empty_now;
_ISR_Disable( level );
10c6bc: 9c pushf
10c6bd: fa cli
10c6be: 5e pop %esi
Chain_Node **the_node
)
{
bool is_empty_now = true;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
10c6bf: 8d 58 04 lea 0x4(%eax),%ebx
Chain_Node *old_first = head->next;
10c6c2: 8b 10 mov (%eax),%edx
if ( old_first != tail ) {
10c6c4: 39 d3 cmp %edx,%ebx
10c6c6: 74 18 je 10c6e0 <_Chain_Get_with_empty_check+0x30>
Chain_Node *new_first = old_first->next;
10c6c8: 8b 0a mov (%edx),%ecx
head->next = new_first;
10c6ca: 89 08 mov %ecx,(%eax)
new_first->previous = head;
10c6cc: 89 41 04 mov %eax,0x4(%ecx)
*the_node = old_first;
10c6cf: 89 17 mov %edx,(%edi)
is_empty_now = new_first == tail;
10c6d1: 39 cb cmp %ecx,%ebx
10c6d3: 0f 94 c0 sete %al
is_empty_now = _Chain_Get_with_empty_check_unprotected( chain, node );
_ISR_Enable( level );
10c6d6: 56 push %esi
10c6d7: 9d popf
return is_empty_now;
}
10c6d8: 5b pop %ebx
10c6d9: 5e pop %esi
10c6da: 5f pop %edi
10c6db: c9 leave
10c6dc: c3 ret
10c6dd: 8d 76 00 lea 0x0(%esi),%esi
} else
*the_node = NULL;
10c6e0: c7 07 00 00 00 00 movl $0x0,(%edi)
RTEMS_INLINE_ROUTINE bool _Chain_Get_with_empty_check_unprotected(
Chain_Control *the_chain,
Chain_Node **the_node
)
{
bool is_empty_now = true;
10c6e6: b0 01 mov $0x1,%al
10c6e8: eb ec jmp 10c6d6 <_Chain_Get_with_empty_check+0x26>
00111054 <_Chain_Initialize>:
Chain_Control *the_chain,
void *starting_address,
size_t number_nodes,
size_t node_size
)
{
111054: 55 push %ebp
111055: 89 e5 mov %esp,%ebp
111057: 57 push %edi
111058: 56 push %esi
111059: 53 push %ebx
11105a: 83 ec 08 sub $0x8,%esp
11105d: 8b 7d 08 mov 0x8(%ebp),%edi
111060: 8b 4d 10 mov 0x10(%ebp),%ecx
111063: 8b 75 14 mov 0x14(%ebp),%esi
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
111066: 8d 47 04 lea 0x4(%edi),%eax
111069: 89 45 f0 mov %eax,-0x10(%ebp)
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
11106c: c7 47 04 00 00 00 00 movl $0x0,0x4(%edi)
while ( count-- ) {
111073: 85 c9 test %ecx,%ecx
111075: 74 35 je 1110ac <_Chain_Initialize+0x58><== NEVER TAKEN
111077: 49 dec %ecx
111078: 89 4d ec mov %ecx,-0x14(%ebp)
{
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *current = head;
Chain_Node *next = starting_address;
11107b: 8b 45 0c mov 0xc(%ebp),%eax
)
{
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *current = head;
11107e: 89 fa mov %edi,%edx
111080: eb 07 jmp 111089 <_Chain_Initialize+0x35>
111082: 66 90 xchg %ax,%ax
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
111084: 89 c2 mov %eax,%edx
current->next = next;
next->previous = current;
current = next;
next = (Chain_Node *)
111086: 89 d8 mov %ebx,%eax
111088: 49 dec %ecx
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
current->next = next;
111089: 89 02 mov %eax,(%edx)
next->previous = current;
11108b: 89 50 04 mov %edx,0x4(%eax)
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _Chain_Initialize(
11108e: 8d 1c 30 lea (%eax,%esi,1),%ebx
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
111091: 85 c9 test %ecx,%ecx
111093: 75 ef jne 111084 <_Chain_Initialize+0x30>
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _Chain_Initialize(
111095: 0f af 75 ec imul -0x14(%ebp),%esi
111099: 03 75 0c add 0xc(%ebp),%esi
current = next;
next = (Chain_Node *)
_Addresses_Add_offset( (void *) next, node_size );
}
current->next = tail;
11109c: 8b 45 f0 mov -0x10(%ebp),%eax
11109f: 89 06 mov %eax,(%esi)
tail->previous = current;
1110a1: 89 77 08 mov %esi,0x8(%edi)
}
1110a4: 83 c4 08 add $0x8,%esp
1110a7: 5b pop %ebx
1110a8: 5e pop %esi
1110a9: 5f pop %edi
1110aa: c9 leave
1110ab: c3 ret
)
{
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *current = head;
1110ac: 89 fe mov %edi,%esi <== NOT EXECUTED
1110ae: eb ec jmp 11109c <_Chain_Initialize+0x48><== NOT EXECUTED
0010b070 <_Event_Seize>:
rtems_event_set event_in,
rtems_option option_set,
rtems_interval ticks,
rtems_event_set *event_out
)
{
10b070: 55 push %ebp
10b071: 89 e5 mov %esp,%ebp
10b073: 57 push %edi
10b074: 56 push %esi
10b075: 53 push %ebx
10b076: 83 ec 2c sub $0x2c,%esp
10b079: 8b 45 08 mov 0x8(%ebp),%eax
10b07c: 8b 4d 0c mov 0xc(%ebp),%ecx
10b07f: 8b 55 10 mov 0x10(%ebp),%edx
10b082: 89 55 dc mov %edx,-0x24(%ebp)
10b085: 8b 7d 14 mov 0x14(%ebp),%edi
rtems_event_set pending_events;
ISR_Level level;
RTEMS_API_Control *api;
Thread_blocking_operation_States sync_state;
executing = _Thread_Executing;
10b088: 8b 1d 18 84 12 00 mov 0x128418,%ebx
executing->Wait.return_code = RTEMS_SUCCESSFUL;
10b08e: c7 43 34 00 00 00 00 movl $0x0,0x34(%ebx)
api = executing->API_Extensions[ THREAD_API_RTEMS ];
10b095: 8b b3 e8 00 00 00 mov 0xe8(%ebx),%esi
_ISR_Disable( level );
10b09b: 9c pushf
10b09c: fa cli
10b09d: 8f 45 e0 popl -0x20(%ebp)
pending_events = api->pending_events;
10b0a0: 8b 16 mov (%esi),%edx
10b0a2: 89 55 d4 mov %edx,-0x2c(%ebp)
seized_events = _Event_sets_Get( pending_events, event_in );
if ( !_Event_sets_Is_empty( seized_events ) &&
10b0a5: 21 c2 and %eax,%edx
10b0a7: 89 55 e4 mov %edx,-0x1c(%ebp)
10b0aa: 74 0d je 10b0b9 <_Event_Seize+0x49>
10b0ac: 39 d0 cmp %edx,%eax
10b0ae: 0f 84 84 00 00 00 je 10b138 <_Event_Seize+0xc8>
(seized_events == event_in || _Options_Is_any( option_set )) ) {
10b0b4: f6 c1 02 test $0x2,%cl
10b0b7: 75 7f jne 10b138 <_Event_Seize+0xc8>
_ISR_Enable( level );
*event_out = seized_events;
return;
}
if ( _Options_Is_no_wait( option_set ) ) {
10b0b9: f6 c1 01 test $0x1,%cl
10b0bc: 75 62 jne 10b120 <_Event_Seize+0xb0>
* set properly when we are marked as in the event critical section.
*
* NOTE: Since interrupts are disabled, this isn't that much of an
* issue but better safe than sorry.
*/
executing->Wait.option = (uint32_t) option_set;
10b0be: 89 4b 30 mov %ecx,0x30(%ebx)
executing->Wait.count = (uint32_t) event_in;
10b0c1: 89 43 24 mov %eax,0x24(%ebx)
executing->Wait.return_argument = event_out;
10b0c4: 89 7b 28 mov %edi,0x28(%ebx)
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
10b0c7: c7 05 48 88 12 00 01 movl $0x1,0x128848
10b0ce: 00 00 00
_ISR_Enable( level );
10b0d1: ff 75 e0 pushl -0x20(%ebp)
10b0d4: 9d popf
if ( ticks ) {
10b0d5: 8b 45 dc mov -0x24(%ebp),%eax
10b0d8: 85 c0 test %eax,%eax
10b0da: 0f 85 80 00 00 00 jne 10b160 <_Event_Seize+0xf0>
NULL
);
_Watchdog_Insert_ticks( &executing->Timer, ticks );
}
_Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
10b0e0: 83 ec 08 sub $0x8,%esp
10b0e3: 68 00 01 00 00 push $0x100
10b0e8: 53 push %ebx
10b0e9: e8 6a 30 00 00 call 10e158 <_Thread_Set_state>
_ISR_Disable( level );
10b0ee: 9c pushf
10b0ef: fa cli
10b0f0: 5a pop %edx
sync_state = _Event_Sync_state;
10b0f1: a1 48 88 12 00 mov 0x128848,%eax
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
10b0f6: c7 05 48 88 12 00 00 movl $0x0,0x128848
10b0fd: 00 00 00
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
10b100: 83 c4 10 add $0x10,%esp
10b103: 83 f8 01 cmp $0x1,%eax
10b106: 74 4c je 10b154 <_Event_Seize+0xe4>
* An interrupt completed the thread's blocking request.
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
10b108: 89 55 10 mov %edx,0x10(%ebp)
10b10b: 89 5d 0c mov %ebx,0xc(%ebp)
10b10e: 89 45 08 mov %eax,0x8(%ebp)
}
10b111: 8d 65 f4 lea -0xc(%ebp),%esp
10b114: 5b pop %ebx
10b115: 5e pop %esi
10b116: 5f pop %edi
10b117: c9 leave
* An interrupt completed the thread's blocking request.
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
10b118: e9 d7 22 00 00 jmp 10d3f4 <_Thread_blocking_operation_Cancel>
10b11d: 8d 76 00 lea 0x0(%esi),%esi
*event_out = seized_events;
return;
}
if ( _Options_Is_no_wait( option_set ) ) {
_ISR_Enable( level );
10b120: ff 75 e0 pushl -0x20(%ebp)
10b123: 9d popf
executing->Wait.return_code = RTEMS_UNSATISFIED;
10b124: c7 43 34 0d 00 00 00 movl $0xd,0x34(%ebx)
*event_out = seized_events;
10b12b: 8b 55 e4 mov -0x1c(%ebp),%edx
10b12e: 89 17 mov %edx,(%edi)
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
10b130: 8d 65 f4 lea -0xc(%ebp),%esp
10b133: 5b pop %ebx
10b134: 5e pop %esi
10b135: 5f pop %edi
10b136: c9 leave
10b137: c3 ret
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear(
rtems_event_set the_event_set,
rtems_event_set the_mask
)
{
return ( the_event_set & ~(the_mask) );
10b138: 8b 45 e4 mov -0x1c(%ebp),%eax
10b13b: f7 d0 not %eax
10b13d: 23 45 d4 and -0x2c(%ebp),%eax
10b140: 89 06 mov %eax,(%esi)
if ( !_Event_sets_Is_empty( seized_events ) &&
(seized_events == event_in || _Options_Is_any( option_set )) ) {
api->pending_events =
_Event_sets_Clear( pending_events, seized_events );
_ISR_Enable( level );
10b142: ff 75 e0 pushl -0x20(%ebp)
10b145: 9d popf
*event_out = seized_events;
10b146: 8b 45 e4 mov -0x1c(%ebp),%eax
10b149: 89 07 mov %eax,(%edi)
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
10b14b: 8d 65 f4 lea -0xc(%ebp),%esp
10b14e: 5b pop %ebx
10b14f: 5e pop %esi
10b150: 5f pop %edi
10b151: c9 leave
10b152: c3 ret
10b153: 90 nop
_ISR_Disable( level );
sync_state = _Event_Sync_state;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
_ISR_Enable( level );
10b154: 52 push %edx
10b155: 9d popf
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
10b156: 8d 65 f4 lea -0xc(%ebp),%esp
10b159: 5b pop %ebx
10b15a: 5e pop %esi
10b15b: 5f pop %edi
10b15c: c9 leave
10b15d: c3 ret
10b15e: 66 90 xchg %ax,%ax
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
_ISR_Enable( level );
if ( ticks ) {
_Watchdog_Initialize(
10b160: 8b 43 08 mov 0x8(%ebx),%eax
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10b163: c7 43 50 00 00 00 00 movl $0x0,0x50(%ebx)
the_watchdog->routine = routine;
10b16a: c7 43 64 14 b3 10 00 movl $0x10b314,0x64(%ebx)
the_watchdog->id = id;
10b171: 89 43 68 mov %eax,0x68(%ebx)
the_watchdog->user_data = user_data;
10b174: c7 43 6c 00 00 00 00 movl $0x0,0x6c(%ebx)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10b17b: 8b 45 dc mov -0x24(%ebp),%eax
10b17e: 89 43 54 mov %eax,0x54(%ebx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10b181: 83 ec 08 sub $0x8,%esp
&executing->Timer,
_Event_Timeout,
executing->Object.id,
NULL
);
_Watchdog_Insert_ticks( &executing->Timer, ticks );
10b184: 8d 43 48 lea 0x48(%ebx),%eax
10b187: 50 push %eax
10b188: 68 3c 7f 12 00 push $0x127f3c
10b18d: e8 66 35 00 00 call 10e6f8 <_Watchdog_Insert>
10b192: 83 c4 10 add $0x10,%esp
10b195: e9 46 ff ff ff jmp 10b0e0 <_Event_Seize+0x70>
0010b1f0 <_Event_Surrender>:
*/
void _Event_Surrender(
Thread_Control *the_thread
)
{
10b1f0: 55 push %ebp
10b1f1: 89 e5 mov %esp,%ebp
10b1f3: 57 push %edi
10b1f4: 56 push %esi
10b1f5: 53 push %ebx
10b1f6: 83 ec 2c sub $0x2c,%esp
10b1f9: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_event_set event_condition;
rtems_event_set seized_events;
rtems_option option_set;
RTEMS_API_Control *api;
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
10b1fc: 8b 8b e8 00 00 00 mov 0xe8(%ebx),%ecx
option_set = (rtems_option) the_thread->Wait.option;
10b202: 8b 7b 30 mov 0x30(%ebx),%edi
_ISR_Disable( level );
10b205: 9c pushf
10b206: fa cli
10b207: 8f 45 d4 popl -0x2c(%ebp)
pending_events = api->pending_events;
10b20a: 8b 11 mov (%ecx),%edx
event_condition = (rtems_event_set) the_thread->Wait.count;
10b20c: 8b 43 24 mov 0x24(%ebx),%eax
seized_events = _Event_sets_Get( pending_events, event_condition );
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
10b20f: 89 c6 mov %eax,%esi
10b211: 21 d6 and %edx,%esi
10b213: 89 75 e4 mov %esi,-0x1c(%ebp)
10b216: 74 74 je 10b28c <_Event_Surrender+0x9c>
/*
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
10b218: 8b 35 14 84 12 00 mov 0x128414,%esi
10b21e: 85 f6 test %esi,%esi
10b220: 74 0c je 10b22e <_Event_Surrender+0x3e>
10b222: 3b 1d 18 84 12 00 cmp 0x128418,%ebx
10b228: 0f 84 96 00 00 00 je 10b2c4 <_Event_Surrender+0xd4>
}
/*
* Otherwise, this is a normal send to another thread
*/
if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
10b22e: f6 43 11 01 testb $0x1,0x11(%ebx)
10b232: 74 4c je 10b280 <_Event_Surrender+0x90>
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
10b234: 3b 45 e4 cmp -0x1c(%ebp),%eax
10b237: 74 05 je 10b23e <_Event_Surrender+0x4e>
10b239: 83 e7 02 and $0x2,%edi
10b23c: 74 42 je 10b280 <_Event_Surrender+0x90> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear(
rtems_event_set the_event_set,
rtems_event_set the_mask
)
{
return ( the_event_set & ~(the_mask) );
10b23e: 8b 45 e4 mov -0x1c(%ebp),%eax
10b241: f7 d0 not %eax
10b243: 21 d0 and %edx,%eax
10b245: 89 01 mov %eax,(%ecx)
api->pending_events = _Event_sets_Clear( pending_events, seized_events );
the_thread->Wait.count = 0;
10b247: c7 43 24 00 00 00 00 movl $0x0,0x24(%ebx)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
10b24e: 8b 43 28 mov 0x28(%ebx),%eax
10b251: 8b 75 e4 mov -0x1c(%ebp),%esi
10b254: 89 30 mov %esi,(%eax)
_ISR_Flash( level );
10b256: ff 75 d4 pushl -0x2c(%ebp)
10b259: 9d popf
10b25a: fa cli
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
10b25b: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
10b25f: 74 37 je 10b298 <_Event_Surrender+0xa8>
_ISR_Enable( level );
10b261: ff 75 d4 pushl -0x2c(%ebp)
10b264: 9d popf
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
10b265: 83 ec 08 sub $0x8,%esp
10b268: 68 f8 ff 03 10 push $0x1003fff8
10b26d: 53 push %ebx
10b26e: e8 01 23 00 00 call 10d574 <_Thread_Clear_state>
10b273: 83 c4 10 add $0x10,%esp
}
return;
}
}
_ISR_Enable( level );
}
10b276: 8d 65 f4 lea -0xc(%ebp),%esp
10b279: 5b pop %ebx
10b27a: 5e pop %esi
10b27b: 5f pop %edi
10b27c: c9 leave
10b27d: c3 ret
10b27e: 66 90 xchg %ax,%ax
_Thread_Unblock( the_thread );
}
return;
}
}
_ISR_Enable( level );
10b280: ff 75 d4 pushl -0x2c(%ebp)
10b283: 9d popf
}
10b284: 8d 65 f4 lea -0xc(%ebp),%esp
10b287: 5b pop %ebx
10b288: 5e pop %esi
10b289: 5f pop %edi
10b28a: c9 leave
10b28b: c3 ret
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
_ISR_Enable( level );
10b28c: ff 75 d4 pushl -0x2c(%ebp)
10b28f: 9d popf
}
return;
}
}
_ISR_Enable( level );
}
10b290: 8d 65 f4 lea -0xc(%ebp),%esp
10b293: 5b pop %ebx
10b294: 5e pop %esi
10b295: 5f pop %edi
10b296: c9 leave
10b297: c3 ret
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
10b298: c7 43 50 03 00 00 00 movl $0x3,0x50(%ebx)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
10b29f: ff 75 d4 pushl -0x2c(%ebp)
10b2a2: 9d popf
(void) _Watchdog_Remove( &the_thread->Timer );
10b2a3: 83 ec 0c sub $0xc,%esp
10b2a6: 8d 43 48 lea 0x48(%ebx),%eax
10b2a9: 50 push %eax
10b2aa: e8 89 35 00 00 call 10e838 <_Watchdog_Remove>
10b2af: 58 pop %eax
10b2b0: 5a pop %edx
10b2b1: 68 f8 ff 03 10 push $0x1003fff8
10b2b6: 53 push %ebx
10b2b7: e8 b8 22 00 00 call 10d574 <_Thread_Clear_state>
10b2bc: 83 c4 10 add $0x10,%esp
10b2bf: eb c3 jmp 10b284 <_Event_Surrender+0x94>
10b2c1: 8d 76 00 lea 0x0(%esi),%esi
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
10b2c4: 8b 35 48 88 12 00 mov 0x128848,%esi
/*
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
10b2ca: 83 fe 02 cmp $0x2,%esi
10b2cd: 74 0d je 10b2dc <_Event_Surrender+0xec> <== NEVER TAKEN
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
10b2cf: 8b 35 48 88 12 00 mov 0x128848,%esi
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
10b2d5: 4e dec %esi
10b2d6: 0f 85 52 ff ff ff jne 10b22e <_Event_Surrender+0x3e>
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
10b2dc: 3b 45 e4 cmp -0x1c(%ebp),%eax
10b2df: 74 05 je 10b2e6 <_Event_Surrender+0xf6>
10b2e1: 83 e7 02 and $0x2,%edi
10b2e4: 74 22 je 10b308 <_Event_Surrender+0x118><== NEVER TAKEN
10b2e6: 8b 45 e4 mov -0x1c(%ebp),%eax
10b2e9: f7 d0 not %eax
10b2eb: 21 d0 and %edx,%eax
10b2ed: 89 01 mov %eax,(%ecx)
api->pending_events = _Event_sets_Clear( pending_events,seized_events );
the_thread->Wait.count = 0;
10b2ef: c7 43 24 00 00 00 00 movl $0x0,0x24(%ebx)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
10b2f6: 8b 43 28 mov 0x28(%ebx),%eax
10b2f9: 8b 55 e4 mov -0x1c(%ebp),%edx
10b2fc: 89 10 mov %edx,(%eax)
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
10b2fe: c7 05 48 88 12 00 03 movl $0x3,0x128848
10b305: 00 00 00
}
_ISR_Enable( level );
10b308: ff 75 d4 pushl -0x2c(%ebp)
10b30b: 9d popf
return;
10b30c: e9 73 ff ff ff jmp 10b284 <_Event_Surrender+0x94>
0010b314 <_Event_Timeout>:
void _Event_Timeout(
Objects_Id id,
void *ignored
)
{
10b314: 55 push %ebp
10b315: 89 e5 mov %esp,%ebp
10b317: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
ISR_Level level;
the_thread = _Thread_Get( id, &location );
10b31a: 8d 45 f4 lea -0xc(%ebp),%eax
10b31d: 50 push %eax
10b31e: ff 75 08 pushl 0x8(%ebp)
10b321: e8 f2 25 00 00 call 10d918 <_Thread_Get>
switch ( location ) {
10b326: 83 c4 10 add $0x10,%esp
10b329: 8b 55 f4 mov -0xc(%ebp),%edx
10b32c: 85 d2 test %edx,%edx
10b32e: 75 37 jne 10b367 <_Event_Timeout+0x53> <== NEVER TAKEN
*
* If it is not satisfied, then it is "nothing happened" and
* this is the "timeout" transition. After a request is satisfied,
* a timeout is not allowed to occur.
*/
_ISR_Disable( level );
10b330: 9c pushf
10b331: fa cli
10b332: 5a pop %edx
_ISR_Enable( level );
return;
}
#endif
the_thread->Wait.count = 0;
10b333: c7 40 24 00 00 00 00 movl $0x0,0x24(%eax)
if ( _Thread_Is_executing( the_thread ) ) {
10b33a: 3b 05 18 84 12 00 cmp 0x128418,%eax
10b340: 74 2a je 10b36c <_Event_Timeout+0x58>
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
10b342: c7 40 34 06 00 00 00 movl $0x6,0x34(%eax)
_ISR_Enable( level );
10b349: 52 push %edx
10b34a: 9d popf
10b34b: 83 ec 08 sub $0x8,%esp
10b34e: 68 f8 ff 03 10 push $0x1003fff8
10b353: 50 push %eax
10b354: e8 1b 22 00 00 call 10d574 <_Thread_Clear_state>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10b359: a1 30 7e 12 00 mov 0x127e30,%eax
10b35e: 48 dec %eax
10b35f: a3 30 7e 12 00 mov %eax,0x127e30
_Thread_Unblock( the_thread );
_Thread_Unnest_dispatch();
break;
10b364: 83 c4 10 add $0x10,%esp
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
10b367: c9 leave
10b368: c3 ret
10b369: 8d 76 00 lea 0x0(%esi),%esi
}
#endif
the_thread->Wait.count = 0;
if ( _Thread_Is_executing( the_thread ) ) {
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
10b36c: 8b 0d 48 88 12 00 mov 0x128848,%ecx
10b372: 49 dec %ecx
10b373: 75 cd jne 10b342 <_Event_Timeout+0x2e>
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
10b375: c7 05 48 88 12 00 02 movl $0x2,0x128848
10b37c: 00 00 00
10b37f: eb c1 jmp 10b342 <_Event_Timeout+0x2e>
001112e4 <_Heap_Allocate_aligned_with_boundary>:
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
1112e4: 55 push %ebp
1112e5: 89 e5 mov %esp,%ebp
1112e7: 57 push %edi
1112e8: 56 push %esi
1112e9: 53 push %ebx
1112ea: 83 ec 2c sub $0x2c,%esp
1112ed: 8b 7d 0c mov 0xc(%ebp),%edi
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE
1112f0: 8d 47 04 lea 0x4(%edi),%eax
1112f3: 89 45 dc mov %eax,-0x24(%ebp)
- HEAP_ALLOC_BONUS;
uintptr_t const page_size = heap->page_size;
1112f6: 8b 55 08 mov 0x8(%ebp),%edx
1112f9: 8b 52 10 mov 0x10(%edx),%edx
1112fc: 89 55 cc mov %edx,-0x34(%ebp)
Heap_Block *block = NULL;
uintptr_t alloc_begin = 0;
uint32_t search_count = 0;
bool search_again = false;
if ( block_size_floor < alloc_size ) {
1112ff: 39 c7 cmp %eax,%edi
111301: 0f 87 69 01 00 00 ja 111470 <_Heap_Allocate_aligned_with_boundary+0x18c>
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
111307: 8b 5d 14 mov 0x14(%ebp),%ebx
11130a: 85 db test %ebx,%ebx
11130c: 0f 85 56 01 00 00 jne 111468 <_Heap_Allocate_aligned_with_boundary+0x184>
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
111312: 8b 45 08 mov 0x8(%ebp),%eax
111315: 8b 48 08 mov 0x8(%eax),%ecx
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
111318: 39 c8 cmp %ecx,%eax
11131a: 0f 84 50 01 00 00 je 111470 <_Heap_Allocate_aligned_with_boundary+0x18c>
111320: c7 45 e4 01 00 00 00 movl $0x1,-0x1c(%ebp)
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
111327: 8b 55 cc mov -0x34(%ebp),%edx
11132a: 83 c2 07 add $0x7,%edx
11132d: 89 55 c8 mov %edx,-0x38(%ebp)
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
111330: c7 45 d0 04 00 00 00 movl $0x4,-0x30(%ebp)
111337: 29 7d d0 sub %edi,-0x30(%ebp)
11133a: eb 1e jmp 11135a <_Heap_Allocate_aligned_with_boundary+0x76>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
11133c: 8d 59 08 lea 0x8(%ecx),%ebx
}
/* Statistics */
++search_count;
if ( alloc_begin != 0 ) {
11133f: 85 db test %ebx,%ebx
111341: 0f 85 f1 00 00 00 jne 111438 <_Heap_Allocate_aligned_with_boundary+0x154><== ALWAYS TAKEN
break;
}
block = block->next;
111347: 8b 49 08 mov 0x8(%ecx),%ecx
11134a: 8b 45 e4 mov -0x1c(%ebp),%eax
11134d: 40 inc %eax
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
11134e: 39 4d 08 cmp %ecx,0x8(%ebp)
111351: 0f 84 25 01 00 00 je 11147c <_Heap_Allocate_aligned_with_boundary+0x198>
111357: 89 45 e4 mov %eax,-0x1c(%ebp)
/*
* The HEAP_PREV_BLOCK_USED flag is always set in the block size_and_flag
* field. Thus the value is about one unit larger than the real block
* size. The greater than operator takes this into account.
*/
if ( block->size_and_flag > block_size_floor ) {
11135a: 8b 59 04 mov 0x4(%ecx),%ebx
11135d: 39 5d dc cmp %ebx,-0x24(%ebp)
111360: 73 e5 jae 111347 <_Heap_Allocate_aligned_with_boundary+0x63>
if ( alignment == 0 ) {
111362: 8b 55 10 mov 0x10(%ebp),%edx
111365: 85 d2 test %edx,%edx
111367: 74 d3 je 11133c <_Heap_Allocate_aligned_with_boundary+0x58>
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
111369: 8b 45 08 mov 0x8(%ebp),%eax
11136c: 8b 40 14 mov 0x14(%eax),%eax
11136f: 89 45 d8 mov %eax,-0x28(%ebp)
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
111372: 83 e3 fe and $0xfffffffe,%ebx
uintptr_t const page_size = heap->page_size;
uintptr_t const min_block_size = heap->min_block_size;
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
111375: 8d 1c 19 lea (%ecx,%ebx,1),%ebx
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
111378: 8d 51 08 lea 0x8(%ecx),%edx
11137b: 89 55 d4 mov %edx,-0x2c(%ebp)
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
11137e: 8b 75 c8 mov -0x38(%ebp),%esi
111381: 29 c6 sub %eax,%esi
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
111383: 01 de add %ebx,%esi
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
uintptr_t alloc_begin = alloc_end - alloc_size;
111385: 03 5d d0 add -0x30(%ebp),%ebx
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
111388: 89 d8 mov %ebx,%eax
11138a: 31 d2 xor %edx,%edx
11138c: f7 75 10 divl 0x10(%ebp)
11138f: 29 d3 sub %edx,%ebx
alloc_begin = _Heap_Align_down( alloc_begin, alignment );
/* Ensure that the we have a valid new block at the end */
if ( alloc_begin > alloc_begin_ceiling ) {
111391: 39 de cmp %ebx,%esi
111393: 73 0b jae 1113a0 <_Heap_Allocate_aligned_with_boundary+0xbc>
111395: 89 f0 mov %esi,%eax
111397: 31 d2 xor %edx,%edx
111399: f7 75 10 divl 0x10(%ebp)
11139c: 89 f3 mov %esi,%ebx
11139e: 29 d3 sub %edx,%ebx
}
alloc_end = alloc_begin + alloc_size;
/* Ensure boundary constaint */
if ( boundary != 0 ) {
1113a0: 8b 45 14 mov 0x14(%ebp),%eax
1113a3: 85 c0 test %eax,%eax
1113a5: 74 5b je 111402 <_Heap_Allocate_aligned_with_boundary+0x11e>
/* Ensure that the we have a valid new block at the end */
if ( alloc_begin > alloc_begin_ceiling ) {
alloc_begin = _Heap_Align_down( alloc_begin_ceiling, alignment );
}
alloc_end = alloc_begin + alloc_size;
1113a7: 8d 34 3b lea (%ebx,%edi,1),%esi
1113aa: 89 f0 mov %esi,%eax
1113ac: 31 d2 xor %edx,%edx
1113ae: f7 75 14 divl 0x14(%ebp)
1113b1: 89 f0 mov %esi,%eax
1113b3: 29 d0 sub %edx,%eax
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
1113b5: 39 c3 cmp %eax,%ebx
1113b7: 73 49 jae 111402 <_Heap_Allocate_aligned_with_boundary+0x11e>
1113b9: 39 c6 cmp %eax,%esi
1113bb: 76 45 jbe 111402 <_Heap_Allocate_aligned_with_boundary+0x11e>
alloc_end = alloc_begin + alloc_size;
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
1113bd: 8b 55 d4 mov -0x2c(%ebp),%edx
1113c0: 01 fa add %edi,%edx
1113c2: 89 55 e0 mov %edx,-0x20(%ebp)
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
if ( boundary_line < boundary_floor ) {
1113c5: 39 c2 cmp %eax,%edx
1113c7: 0f 87 7a ff ff ff ja 111347 <_Heap_Allocate_aligned_with_boundary+0x63>
1113cd: 89 ce mov %ecx,%esi
1113cf: eb 10 jmp 1113e1 <_Heap_Allocate_aligned_with_boundary+0xfd>
1113d1: 8d 76 00 lea 0x0(%esi),%esi
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
1113d4: 39 c1 cmp %eax,%ecx
1113d6: 76 28 jbe 111400 <_Heap_Allocate_aligned_with_boundary+0x11c>
if ( boundary_line < boundary_floor ) {
1113d8: 39 45 e0 cmp %eax,-0x20(%ebp)
1113db: 0f 87 9f 00 00 00 ja 111480 <_Heap_Allocate_aligned_with_boundary+0x19c><== NEVER TAKEN
return 0;
}
alloc_begin = boundary_line - alloc_size;
1113e1: 89 c3 mov %eax,%ebx
1113e3: 29 fb sub %edi,%ebx
1113e5: 89 d8 mov %ebx,%eax
1113e7: 31 d2 xor %edx,%edx
1113e9: f7 75 10 divl 0x10(%ebp)
1113ec: 29 d3 sub %edx,%ebx
alloc_begin = _Heap_Align_down( alloc_begin, alignment );
alloc_end = alloc_begin + alloc_size;
1113ee: 8d 0c 3b lea (%ebx,%edi,1),%ecx
1113f1: 89 c8 mov %ecx,%eax
1113f3: 31 d2 xor %edx,%edx
1113f5: f7 75 14 divl 0x14(%ebp)
1113f8: 89 c8 mov %ecx,%eax
1113fa: 29 d0 sub %edx,%eax
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
1113fc: 39 c3 cmp %eax,%ebx
1113fe: 72 d4 jb 1113d4 <_Heap_Allocate_aligned_with_boundary+0xf0>
111400: 89 f1 mov %esi,%ecx
boundary_line = _Heap_Align_down( alloc_end, boundary );
}
}
/* Ensure that the we have a valid new block at the beginning */
if ( alloc_begin >= alloc_begin_floor ) {
111402: 39 5d d4 cmp %ebx,-0x2c(%ebp)
111405: 0f 87 3c ff ff ff ja 111347 <_Heap_Allocate_aligned_with_boundary+0x63>
11140b: be f8 ff ff ff mov $0xfffffff8,%esi
111410: 29 ce sub %ecx,%esi
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
111412: 01 de add %ebx,%esi
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
111414: 89 d8 mov %ebx,%eax
111416: 31 d2 xor %edx,%edx
111418: f7 75 cc divl -0x34(%ebp)
uintptr_t const alloc_block_begin =
(uintptr_t) _Heap_Block_of_alloc_area( alloc_begin, page_size );
uintptr_t const free_size = alloc_block_begin - block_begin;
11141b: 29 d6 sub %edx,%esi
if ( free_size >= min_block_size || free_size == 0 ) {
11141d: 39 75 d8 cmp %esi,-0x28(%ebp)
111420: 0f 86 19 ff ff ff jbe 11133f <_Heap_Allocate_aligned_with_boundary+0x5b>
111426: 85 f6 test %esi,%esi
111428: 0f 85 19 ff ff ff jne 111347 <_Heap_Allocate_aligned_with_boundary+0x63>
}
/* Statistics */
++search_count;
if ( alloc_begin != 0 ) {
11142e: 85 db test %ebx,%ebx
111430: 0f 84 11 ff ff ff je 111347 <_Heap_Allocate_aligned_with_boundary+0x63><== NEVER TAKEN
111436: 66 90 xchg %ax,%ax
search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin );
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
111438: 8b 45 08 mov 0x8(%ebp),%eax
11143b: ff 40 48 incl 0x48(%eax)
stats->searches += search_count;
11143e: 8b 55 e4 mov -0x1c(%ebp),%edx
111441: 01 50 4c add %edx,0x4c(%eax)
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
111444: 57 push %edi
111445: 53 push %ebx
111446: 51 push %ecx
111447: 50 push %eax
111448: e8 b7 b3 ff ff call 10c804 <_Heap_Block_allocate>
11144d: 89 d8 mov %ebx,%eax
11144f: 83 c4 10 add $0x10,%esp
boundary
);
}
/* Statistics */
if ( stats->max_search < search_count ) {
111452: 8b 55 e4 mov -0x1c(%ebp),%edx
111455: 8b 4d 08 mov 0x8(%ebp),%ecx
111458: 39 51 44 cmp %edx,0x44(%ecx)
11145b: 73 15 jae 111472 <_Heap_Allocate_aligned_with_boundary+0x18e>
stats->max_search = search_count;
11145d: 89 51 44 mov %edx,0x44(%ecx)
}
return (void *) alloc_begin;
}
111460: 8d 65 f4 lea -0xc(%ebp),%esp
111463: 5b pop %ebx
111464: 5e pop %esi
111465: 5f pop %edi
111466: c9 leave
111467: c3 ret
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
if ( boundary < alloc_size ) {
111468: 3b 7d 14 cmp 0x14(%ebp),%edi
11146b: 76 1a jbe 111487 <_Heap_Allocate_aligned_with_boundary+0x1a3>
11146d: 8d 76 00 lea 0x0(%esi),%esi
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
111470: 31 c0 xor %eax,%eax
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
111472: 8d 65 f4 lea -0xc(%ebp),%esp
111475: 5b pop %ebx
111476: 5e pop %esi
111477: 5f pop %edi
111478: c9 leave
111479: c3 ret
11147a: 66 90 xchg %ax,%ax
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
11147c: 31 c0 xor %eax,%eax
11147e: eb d2 jmp 111452 <_Heap_Allocate_aligned_with_boundary+0x16e>
111480: 89 f1 mov %esi,%ecx <== NOT EXECUTED
111482: e9 c0 fe ff ff jmp 111347 <_Heap_Allocate_aligned_with_boundary+0x63><== NOT EXECUTED
if ( boundary != 0 ) {
if ( boundary < alloc_size ) {
return NULL;
}
if ( alignment == 0 ) {
111487: 8b 4d 10 mov 0x10(%ebp),%ecx
11148a: 85 c9 test %ecx,%ecx
11148c: 0f 85 80 fe ff ff jne 111312 <_Heap_Allocate_aligned_with_boundary+0x2e>
alignment = page_size;
111492: 89 55 10 mov %edx,0x10(%ebp)
111495: e9 78 fe ff ff jmp 111312 <_Heap_Allocate_aligned_with_boundary+0x2e>
00111888 <_Heap_Extend>:
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
111888: 55 push %ebp
111889: 89 e5 mov %esp,%ebp
11188b: 57 push %edi
11188c: 56 push %esi
11188d: 53 push %ebx
11188e: 83 ec 4c sub $0x4c,%esp
111891: 8b 5d 08 mov 0x8(%ebp),%ebx
111894: 8b 4d 10 mov 0x10(%ebp),%ecx
Heap_Statistics *const stats = &heap->stats;
Heap_Block *const first_block = heap->first_block;
111897: 8b 43 20 mov 0x20(%ebx),%eax
11189a: 89 45 d0 mov %eax,-0x30(%ebp)
Heap_Block *start_block = first_block;
Heap_Block *merge_below_block = NULL;
Heap_Block *merge_above_block = NULL;
Heap_Block *link_below_block = NULL;
Heap_Block *link_above_block = NULL;
Heap_Block *extend_first_block = NULL;
11189d: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
Heap_Block *extend_last_block = NULL;
1118a4: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
uintptr_t const page_size = heap->page_size;
1118ab: 8b 53 10 mov 0x10(%ebx),%edx
1118ae: 89 55 d4 mov %edx,-0x2c(%ebp)
uintptr_t const min_block_size = heap->min_block_size;
1118b1: 8b 43 14 mov 0x14(%ebx),%eax
uintptr_t const extend_area_begin = (uintptr_t) extend_area_begin_ptr;
uintptr_t const extend_area_end = extend_area_begin + extend_area_size;
uintptr_t const free_size = stats->free_size;
1118b4: 8b 73 30 mov 0x30(%ebx),%esi
1118b7: 89 75 c0 mov %esi,-0x40(%ebp)
uintptr_t extend_first_block_size = 0;
uintptr_t extended_size = 0;
bool extend_area_ok = false;
if ( extend_area_end < extend_area_begin ) {
1118ba: 8b 55 0c mov 0xc(%ebp),%edx
1118bd: 01 ca add %ecx,%edx
1118bf: 89 55 cc mov %edx,-0x34(%ebp)
1118c2: 73 0c jae 1118d0 <_Heap_Extend+0x48>
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
1118c4: 31 c0 xor %eax,%eax
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
1118c6: 8d 65 f4 lea -0xc(%ebp),%esp
1118c9: 5b pop %ebx
1118ca: 5e pop %esi
1118cb: 5f pop %edi
1118cc: c9 leave
1118cd: c3 ret
1118ce: 66 90 xchg %ax,%ax
if ( extend_area_end < extend_area_begin ) {
return false;
}
extend_area_ok = _Heap_Get_first_and_last_block(
1118d0: 83 ec 08 sub $0x8,%esp
1118d3: 8d 55 e0 lea -0x20(%ebp),%edx
1118d6: 52 push %edx
1118d7: 8d 55 e4 lea -0x1c(%ebp),%edx
1118da: 52 push %edx
1118db: 50 push %eax
1118dc: ff 75 d4 pushl -0x2c(%ebp)
1118df: 51 push %ecx
1118e0: ff 75 0c pushl 0xc(%ebp)
1118e3: e8 38 b1 ff ff call 10ca20 <_Heap_Get_first_and_last_block>
page_size,
min_block_size,
&extend_first_block,
&extend_last_block
);
if (!extend_area_ok ) {
1118e8: 83 c4 20 add $0x20,%esp
1118eb: 84 c0 test %al,%al
1118ed: 74 d5 je 1118c4 <_Heap_Extend+0x3c>
1118ef: 8b 7d d0 mov -0x30(%ebp),%edi
1118f2: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp)
1118f9: c7 45 b8 00 00 00 00 movl $0x0,-0x48(%ebp)
111900: c7 45 c8 00 00 00 00 movl $0x0,-0x38(%ebp)
111907: c7 45 c4 00 00 00 00 movl $0x0,-0x3c(%ebp)
11190e: 8b 75 cc mov -0x34(%ebp),%esi
111911: 89 5d b4 mov %ebx,-0x4c(%ebp)
111914: eb 30 jmp 111946 <_Heap_Extend+0xbe>
111916: 66 90 xchg %ax,%ax
return false;
}
if ( extend_area_end == sub_area_begin ) {
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
111918: 39 ce cmp %ecx,%esi
11191a: 73 03 jae 11191f <_Heap_Extend+0x97>
11191c: 89 7d b8 mov %edi,-0x48(%ebp)
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
11191f: 8d 59 f8 lea -0x8(%ecx),%ebx
111922: 89 c8 mov %ecx,%eax
111924: 31 d2 xor %edx,%edx
111926: f7 75 d4 divl -0x2c(%ebp)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
111929: 29 d3 sub %edx,%ebx
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
11192b: 3b 4d 0c cmp 0xc(%ebp),%ecx
11192e: 74 3c je 11196c <_Heap_Extend+0xe4>
start_block->prev_size = extend_area_end;
merge_above_block = end_block;
} else if ( sub_area_end < extend_area_begin ) {
111930: 39 4d 0c cmp %ecx,0xc(%ebp)
111933: 76 03 jbe 111938 <_Heap_Extend+0xb0>
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_of_alloc_area(
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
111935: 89 5d bc mov %ebx,-0x44(%ebp)
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
111938: 8b 7b 04 mov 0x4(%ebx),%edi
11193b: 83 e7 fe and $0xfffffffe,%edi
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
11193e: 8d 3c 3b lea (%ebx,%edi,1),%edi
link_above_block = end_block;
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
111941: 39 7d d0 cmp %edi,-0x30(%ebp)
111944: 74 39 je 11197f <_Heap_Extend+0xf7>
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
111946: 3b 7d d0 cmp -0x30(%ebp),%edi
111949: 0f 84 39 01 00 00 je 111a88 <_Heap_Extend+0x200>
11194f: 89 f8 mov %edi,%eax
uintptr_t const sub_area_end = start_block->prev_size;
111951: 8b 0f mov (%edi),%ecx
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
111953: 39 4d 0c cmp %ecx,0xc(%ebp)
111956: 73 08 jae 111960 <_Heap_Extend+0xd8>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
111958: 39 f0 cmp %esi,%eax
11195a: 0f 82 64 ff ff ff jb 1118c4 <_Heap_Extend+0x3c>
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
111960: 39 f0 cmp %esi,%eax
111962: 75 b4 jne 111918 <_Heap_Extend+0x90>
111964: 89 7d c4 mov %edi,-0x3c(%ebp)
111967: eb b6 jmp 11191f <_Heap_Extend+0x97>
111969: 8d 76 00 lea 0x0(%esi),%esi
} else if ( extend_area_end < sub_area_end ) {
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
start_block->prev_size = extend_area_end;
11196c: 89 37 mov %esi,(%edi)
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_of_alloc_area(
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
11196e: 89 5d c8 mov %ebx,-0x38(%ebp)
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
111971: 8b 7b 04 mov 0x4(%ebx),%edi
111974: 83 e7 fe and $0xfffffffe,%edi
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
111977: 8d 3c 3b lea (%ebx,%edi,1),%edi
} else if ( sub_area_end < extend_area_begin ) {
link_above_block = end_block;
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
11197a: 39 7d d0 cmp %edi,-0x30(%ebp)
11197d: 75 c7 jne 111946 <_Heap_Extend+0xbe> <== NEVER TAKEN
11197f: 8b 5d b4 mov -0x4c(%ebp),%ebx
if ( extend_area_begin < heap->area_begin ) {
111982: 8b 75 0c mov 0xc(%ebp),%esi
111985: 3b 73 18 cmp 0x18(%ebx),%esi
111988: 0f 82 06 01 00 00 jb 111a94 <_Heap_Extend+0x20c>
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
11198e: 8b 45 cc mov -0x34(%ebp),%eax
111991: 3b 43 1c cmp 0x1c(%ebx),%eax
111994: 76 03 jbe 111999 <_Heap_Extend+0x111>
heap->area_end = extend_area_end;
111996: 89 43 1c mov %eax,0x1c(%ebx)
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
111999: 8b 55 e0 mov -0x20(%ebp),%edx
11199c: 8b 45 e4 mov -0x1c(%ebp),%eax
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
11199f: 89 d1 mov %edx,%ecx
1119a1: 29 c1 sub %eax,%ecx
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
1119a3: 8b 75 cc mov -0x34(%ebp),%esi
1119a6: 89 30 mov %esi,(%eax)
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
1119a8: 89 ce mov %ecx,%esi
1119aa: 83 ce 01 or $0x1,%esi
1119ad: 89 70 04 mov %esi,0x4(%eax)
_Heap_Protection_block_initialize( heap, extend_first_block );
extend_last_block->prev_size = extend_first_block_size;
1119b0: 89 0a mov %ecx,(%edx)
extend_last_block->size_and_flag = 0;
1119b2: c7 42 04 00 00 00 00 movl $0x0,0x4(%edx)
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
1119b9: 39 43 20 cmp %eax,0x20(%ebx)
1119bc: 0f 86 da 00 00 00 jbe 111a9c <_Heap_Extend+0x214>
heap->first_block = extend_first_block;
1119c2: 89 43 20 mov %eax,0x20(%ebx)
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
heap->last_block = extend_last_block;
}
if ( merge_below_block != NULL ) {
1119c5: 8b 75 c4 mov -0x3c(%ebp),%esi
1119c8: 85 f6 test %esi,%esi
1119ca: 0f 84 10 01 00 00 je 111ae0 <_Heap_Extend+0x258>
Heap_Control *heap,
uintptr_t extend_area_begin,
Heap_Block *first_block
)
{
uintptr_t const page_size = heap->page_size;
1119d0: 8b 73 10 mov 0x10(%ebx),%esi
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
1119d3: 8b 4d 0c mov 0xc(%ebp),%ecx
1119d6: 83 c1 08 add $0x8,%ecx
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
1119d9: 89 c8 mov %ecx,%eax
1119db: 31 d2 xor %edx,%edx
1119dd: f7 f6 div %esi
if ( remainder != 0 ) {
1119df: 85 d2 test %edx,%edx
1119e1: 0f 84 c9 00 00 00 je 111ab0 <_Heap_Extend+0x228> <== ALWAYS TAKEN
return value - remainder + alignment;
1119e7: 8d 04 31 lea (%ecx,%esi,1),%eax <== NOT EXECUTED
1119ea: 29 d0 sub %edx,%eax <== NOT EXECUTED
uintptr_t const new_first_block_begin =
1119ec: 8d 50 f8 lea -0x8(%eax),%edx
uintptr_t const first_block_begin = (uintptr_t) first_block;
uintptr_t const new_first_block_size =
first_block_begin - new_first_block_begin;
Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin;
new_first_block->prev_size = first_block->prev_size;
1119ef: 8b 75 c4 mov -0x3c(%ebp),%esi
1119f2: 8b 0e mov (%esi),%ecx
1119f4: 89 48 f8 mov %ecx,-0x8(%eax)
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
uintptr_t const new_first_block_begin =
new_first_block_alloc_begin - HEAP_BLOCK_HEADER_SIZE;
uintptr_t const first_block_begin = (uintptr_t) first_block;
uintptr_t const new_first_block_size =
1119f7: 89 f0 mov %esi,%eax
1119f9: 29 d0 sub %edx,%eax
first_block_begin - new_first_block_begin;
Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin;
new_first_block->prev_size = first_block->prev_size;
new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED;
1119fb: 83 c8 01 or $0x1,%eax
1119fe: 89 42 04 mov %eax,0x4(%edx)
_Heap_Free_block( heap, new_first_block );
111a01: 89 d8 mov %ebx,%eax
111a03: e8 64 fe ff ff call 11186c <_Heap_Free_block>
link_below_block,
extend_last_block
);
}
if ( merge_above_block != NULL ) {
111a08: 8b 45 c8 mov -0x38(%ebp),%eax
111a0b: 85 c0 test %eax,%eax
111a0d: 0f 84 a5 00 00 00 je 111ab8 <_Heap_Extend+0x230>
)
{
uintptr_t const page_size = heap->page_size;
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const last_block_new_size = _Heap_Align_down(
extend_area_end - last_block_begin - HEAP_BLOCK_HEADER_SIZE,
111a13: 8b 4d cc mov -0x34(%ebp),%ecx
111a16: 83 e9 08 sub $0x8,%ecx
uintptr_t extend_area_end
)
{
uintptr_t const page_size = heap->page_size;
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const last_block_new_size = _Heap_Align_down(
111a19: 2b 4d c8 sub -0x38(%ebp),%ecx
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
111a1c: 89 c8 mov %ecx,%eax
111a1e: 31 d2 xor %edx,%edx
111a20: f7 73 10 divl 0x10(%ebx)
111a23: 29 d1 sub %edx,%ecx
);
Heap_Block *const new_last_block =
_Heap_Block_at( last_block, last_block_new_size );
new_last_block->size_and_flag =
(last_block->size_and_flag - last_block_new_size)
111a25: 8b 55 c8 mov -0x38(%ebp),%edx
111a28: 8b 42 04 mov 0x4(%edx),%eax
111a2b: 29 c8 sub %ecx,%eax
| HEAP_PREV_BLOCK_USED;
111a2d: 83 c8 01 or $0x1,%eax
111a30: 89 44 11 04 mov %eax,0x4(%ecx,%edx,1)
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
111a34: 8b 42 04 mov 0x4(%edx),%eax
111a37: 83 e0 01 and $0x1,%eax
block->size_and_flag = size | flag;
111a3a: 09 c8 or %ecx,%eax
111a3c: 89 42 04 mov %eax,0x4(%edx)
_Heap_Block_set_size( last_block, last_block_new_size );
_Heap_Free_block( heap, last_block );
111a3f: 89 d8 mov %ebx,%eax
111a41: e8 26 fe ff ff call 11186c <_Heap_Free_block>
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
111a46: 8b 75 c4 mov -0x3c(%ebp),%esi
111a49: 85 f6 test %esi,%esi
111a4b: 0f 84 ab 00 00 00 je 111afc <_Heap_Extend+0x274>
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
111a51: 8b 53 24 mov 0x24(%ebx),%edx
* This feature will be used to terminate the scattered heap area list. See
* also _Heap_Extend().
*/
RTEMS_INLINE_ROUTINE void _Heap_Set_last_block_size( Heap_Control *heap )
{
_Heap_Block_set_size(
111a54: 8b 43 20 mov 0x20(%ebx),%eax
111a57: 29 d0 sub %edx,%eax
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
111a59: 8b 4a 04 mov 0x4(%edx),%ecx
111a5c: 83 e1 01 and $0x1,%ecx
block->size_and_flag = size | flag;
111a5f: 09 c8 or %ecx,%eax
111a61: 89 42 04 mov %eax,0x4(%edx)
_Heap_Free_block( heap, extend_first_block );
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
111a64: 8b 43 30 mov 0x30(%ebx),%eax
111a67: 2b 45 c0 sub -0x40(%ebp),%eax
/* Statistics */
stats->size += extended_size;
111a6a: 01 43 2c add %eax,0x2c(%ebx)
if ( extended_size_ptr != NULL )
111a6d: 8b 55 14 mov 0x14(%ebp),%edx
111a70: 85 d2 test %edx,%edx
111a72: 0f 84 a0 00 00 00 je 111b18 <_Heap_Extend+0x290> <== NEVER TAKEN
*extended_size_ptr = extended_size;
111a78: 8b 55 14 mov 0x14(%ebp),%edx
111a7b: 89 02 mov %eax,(%edx)
return true;
111a7d: b0 01 mov $0x1,%al
}
111a7f: 8d 65 f4 lea -0xc(%ebp),%esp
111a82: 5b pop %ebx
111a83: 5e pop %esi
111a84: 5f pop %edi
111a85: c9 leave
111a86: c3 ret
111a87: 90 nop
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
111a88: 8b 55 b4 mov -0x4c(%ebp),%edx
111a8b: 8b 42 18 mov 0x18(%edx),%eax
111a8e: e9 be fe ff ff jmp 111951 <_Heap_Extend+0xc9>
111a93: 90 nop
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
if ( extend_area_begin < heap->area_begin ) {
heap->area_begin = extend_area_begin;
111a94: 89 73 18 mov %esi,0x18(%ebx)
111a97: e9 fd fe ff ff jmp 111999 <_Heap_Extend+0x111>
extend_last_block->size_and_flag = 0;
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
heap->first_block = extend_first_block;
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
111a9c: 39 53 24 cmp %edx,0x24(%ebx)
111a9f: 0f 83 20 ff ff ff jae 1119c5 <_Heap_Extend+0x13d>
heap->last_block = extend_last_block;
111aa5: 89 53 24 mov %edx,0x24(%ebx)
111aa8: e9 18 ff ff ff jmp 1119c5 <_Heap_Extend+0x13d>
111aad: 8d 76 00 lea 0x0(%esi),%esi
uintptr_t remainder = value % alignment;
if ( remainder != 0 ) {
return value - remainder + alignment;
} else {
return value;
111ab0: 89 c8 mov %ecx,%eax
111ab2: e9 35 ff ff ff jmp 1119ec <_Heap_Extend+0x164>
111ab7: 90 nop
);
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
111ab8: 8b 7d bc mov -0x44(%ebp),%edi
111abb: 85 ff test %edi,%edi
111abd: 74 87 je 111a46 <_Heap_Extend+0x1be>
_Heap_Link_above(
111abf: 8b 4d e0 mov -0x20(%ebp),%ecx
)
{
uintptr_t const link_begin = (uintptr_t) link;
uintptr_t const first_block_begin = (uintptr_t) first_block;
_Heap_Block_set_size( link, first_block_begin - link_begin );
111ac2: 8b 45 e4 mov -0x1c(%ebp),%eax
111ac5: 2b 45 bc sub -0x44(%ebp),%eax
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
111ac8: 8b 75 bc mov -0x44(%ebp),%esi
111acb: 8b 56 04 mov 0x4(%esi),%edx
111ace: 83 e2 01 and $0x1,%edx
block->size_and_flag = size | flag;
111ad1: 09 d0 or %edx,%eax
111ad3: 89 46 04 mov %eax,0x4(%esi)
last_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
111ad6: 83 49 04 01 orl $0x1,0x4(%ecx)
111ada: e9 67 ff ff ff jmp 111a46 <_Heap_Extend+0x1be>
111adf: 90 nop
heap->last_block = extend_last_block;
}
if ( merge_below_block != NULL ) {
_Heap_Merge_below( heap, extend_area_begin, merge_below_block );
} else if ( link_below_block != NULL ) {
111ae0: 8b 4d b8 mov -0x48(%ebp),%ecx
111ae3: 85 c9 test %ecx,%ecx
111ae5: 0f 84 1d ff ff ff je 111a08 <_Heap_Extend+0x180>
{
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const link_begin = (uintptr_t) link;
last_block->size_and_flag =
(link_begin - last_block_begin) | HEAP_PREV_BLOCK_USED;
111aeb: 8b 45 b8 mov -0x48(%ebp),%eax
111aee: 29 d0 sub %edx,%eax
111af0: 83 c8 01 or $0x1,%eax
111af3: 89 42 04 mov %eax,0x4(%edx)
111af6: e9 0d ff ff ff jmp 111a08 <_Heap_Extend+0x180>
111afb: 90 nop
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
111afc: 8b 4d c8 mov -0x38(%ebp),%ecx
111aff: 85 c9 test %ecx,%ecx
111b01: 0f 85 4a ff ff ff jne 111a51 <_Heap_Extend+0x1c9>
_Heap_Free_block( heap, extend_first_block );
111b07: 8b 55 e4 mov -0x1c(%ebp),%edx
111b0a: 89 d8 mov %ebx,%eax
111b0c: e8 5b fd ff ff call 11186c <_Heap_Free_block>
111b11: e9 3b ff ff ff jmp 111a51 <_Heap_Extend+0x1c9>
111b16: 66 90 xchg %ax,%ax
stats->size += extended_size;
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
111b18: b0 01 mov $0x1,%al <== NOT EXECUTED
111b1a: e9 a7 fd ff ff jmp 1118c6 <_Heap_Extend+0x3e> <== NOT EXECUTED
0011149c <_Heap_Free>:
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
{
11149c: 55 push %ebp
11149d: 89 e5 mov %esp,%ebp
11149f: 57 push %edi
1114a0: 56 push %esi
1114a1: 53 push %ebx
1114a2: 83 ec 10 sub $0x10,%esp
1114a5: 8b 5d 08 mov 0x8(%ebp),%ebx
1114a8: 8b 45 0c mov 0xc(%ebp),%eax
1114ab: 8d 48 f8 lea -0x8(%eax),%ecx
1114ae: 31 d2 xor %edx,%edx
1114b0: f7 73 10 divl 0x10(%ebx)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
1114b3: 29 d1 sub %edx,%ecx
RTEMS_INLINE_ROUTINE bool _Heap_Is_block_in_heap(
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
1114b5: 8b 43 20 mov 0x20(%ebx),%eax
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
1114b8: 39 c1 cmp %eax,%ecx
1114ba: 72 07 jb 1114c3 <_Heap_Free+0x27>
1114bc: 8b 73 24 mov 0x24(%ebx),%esi
1114bf: 39 f1 cmp %esi,%ecx
1114c1: 76 0d jbe 1114d0 <_Heap_Free+0x34>
/* As we always coalesce free blocks, the block that preceedes prev_block
must have been used. */
if ( !_Heap_Is_prev_used ( prev_block) ) {
_HAssert( false );
return( false );
1114c3: 31 c0 xor %eax,%eax
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
1114c5: 83 c4 10 add $0x10,%esp
1114c8: 5b pop %ebx
1114c9: 5e pop %esi
1114ca: 5f pop %edi
1114cb: c9 leave
1114cc: c3 ret
1114cd: 8d 76 00 lea 0x0(%esi),%esi
1114d0: 8b 51 04 mov 0x4(%ecx),%edx
1114d3: 89 55 f0 mov %edx,-0x10(%ebp)
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
1114d6: 83 e2 fe and $0xfffffffe,%edx
1114d9: 89 55 ec mov %edx,-0x14(%ebp)
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
1114dc: 8d 14 11 lea (%ecx,%edx,1),%edx
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
1114df: 39 d0 cmp %edx,%eax
1114e1: 77 e0 ja 1114c3 <_Heap_Free+0x27> <== NEVER TAKEN
1114e3: 39 d6 cmp %edx,%esi
1114e5: 72 dc jb 1114c3 <_Heap_Free+0x27> <== NEVER TAKEN
1114e7: 8b 7a 04 mov 0x4(%edx),%edi
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
_HAssert( false );
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
1114ea: f7 c7 01 00 00 00 test $0x1,%edi
1114f0: 74 d1 je 1114c3 <_Heap_Free+0x27> <== NEVER TAKEN
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
1114f2: 83 e7 fe and $0xfffffffe,%edi
1114f5: 89 7d e4 mov %edi,-0x1c(%ebp)
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
1114f8: 39 d6 cmp %edx,%esi
1114fa: 0f 84 c8 00 00 00 je 1115c8 <_Heap_Free+0x12c>
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
111500: f6 44 3a 04 01 testb $0x1,0x4(%edx,%edi,1)
111505: 0f 94 45 eb sete -0x15(%ebp)
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
if ( !_Heap_Is_prev_used( block ) ) {
111509: f6 45 f0 01 testb $0x1,-0x10(%ebp)
11150d: 75 45 jne 111554 <_Heap_Free+0xb8>
uintptr_t const prev_size = block->prev_size;
11150f: 8b 39 mov (%ecx),%edi
111511: 89 7d f0 mov %edi,-0x10(%ebp)
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
111514: 29 f9 sub %edi,%ecx
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
111516: 39 c8 cmp %ecx,%eax
111518: 77 a9 ja 1114c3 <_Heap_Free+0x27> <== NEVER TAKEN
11151a: 39 ce cmp %ecx,%esi
11151c: 72 a5 jb 1114c3 <_Heap_Free+0x27> <== NEVER TAKEN
return( false );
}
/* As we always coalesce free blocks, the block that preceedes prev_block
must have been used. */
if ( !_Heap_Is_prev_used ( prev_block) ) {
11151e: f6 41 04 01 testb $0x1,0x4(%ecx)
111522: 74 9f je 1114c3 <_Heap_Free+0x27> <== NEVER TAKEN
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
111524: 80 7d eb 00 cmpb $0x0,-0x15(%ebp)
111528: 0f 84 a6 00 00 00 je 1115d4 <_Heap_Free+0x138>
uintptr_t const size = block_size + prev_size + next_block_size;
11152e: 8b 7d e4 mov -0x1c(%ebp),%edi
111531: 03 7d ec add -0x14(%ebp),%edi
111534: 03 7d f0 add -0x10(%ebp),%edi
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
111537: 8b 42 08 mov 0x8(%edx),%eax
11153a: 8b 52 0c mov 0xc(%edx),%edx
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
Heap_Block *prev = block->prev;
prev->next = next;
11153d: 89 42 08 mov %eax,0x8(%edx)
next->prev = prev;
111540: 89 50 0c mov %edx,0xc(%eax)
}
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
111543: ff 4b 38 decl 0x38(%ebx)
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
111546: 89 f8 mov %edi,%eax
111548: 83 c8 01 or $0x1,%eax
11154b: 89 41 04 mov %eax,0x4(%ecx)
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
11154e: 89 3c 39 mov %edi,(%ecx,%edi,1)
111551: eb 2a jmp 11157d <_Heap_Free+0xe1>
111553: 90 nop
uintptr_t const size = block_size + prev_size;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
111554: 80 7d eb 00 cmpb $0x0,-0x15(%ebp)
111558: 74 3a je 111594 <_Heap_Free+0xf8>
uintptr_t const size = block_size + next_block_size;
11155a: 8b 7d e4 mov -0x1c(%ebp),%edi
11155d: 03 7d ec add -0x14(%ebp),%edi
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
111560: 8b 42 08 mov 0x8(%edx),%eax
111563: 8b 52 0c mov 0xc(%edx),%edx
)
{
Heap_Block *next = old_block->next;
Heap_Block *prev = old_block->prev;
new_block->next = next;
111566: 89 41 08 mov %eax,0x8(%ecx)
new_block->prev = prev;
111569: 89 51 0c mov %edx,0xc(%ecx)
next->prev = new_block;
11156c: 89 48 0c mov %ecx,0xc(%eax)
prev->next = new_block;
11156f: 89 4a 08 mov %ecx,0x8(%edx)
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
uintptr_t const size = block_size + next_block_size;
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
111572: 89 f8 mov %edi,%eax
111574: 83 c8 01 or $0x1,%eax
111577: 89 41 04 mov %eax,0x4(%ecx)
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
11157a: 89 3c 39 mov %edi,(%ecx,%edi,1)
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
11157d: ff 4b 40 decl 0x40(%ebx)
++stats->frees;
111580: ff 43 50 incl 0x50(%ebx)
stats->free_size += block_size;
111583: 8b 55 ec mov -0x14(%ebp),%edx
111586: 01 53 30 add %edx,0x30(%ebx)
return( true );
111589: b0 01 mov $0x1,%al
}
11158b: 83 c4 10 add $0x10,%esp
11158e: 5b pop %ebx
11158f: 5e pop %esi
111590: 5f pop %edi
111591: c9 leave
111592: c3 ret
111593: 90 nop
RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
Heap_Block *block_before,
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
111594: 8b 43 08 mov 0x8(%ebx),%eax
new_block->next = next;
111597: 89 41 08 mov %eax,0x8(%ecx)
new_block->prev = block_before;
11159a: 89 59 0c mov %ebx,0xc(%ecx)
block_before->next = new_block;
11159d: 89 4b 08 mov %ecx,0x8(%ebx)
next->prev = new_block;
1115a0: 89 48 0c mov %ecx,0xc(%eax)
next_block->prev_size = size;
} else { /* no coalesce */
/* Add 'block' to the head of the free blocks list as it tends to
produce less fragmentation than adding to the tail. */
_Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block );
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
1115a3: 8b 45 ec mov -0x14(%ebp),%eax
1115a6: 83 c8 01 or $0x1,%eax
1115a9: 89 41 04 mov %eax,0x4(%ecx)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
1115ac: 83 62 04 fe andl $0xfffffffe,0x4(%edx)
next_block->prev_size = block_size;
1115b0: 8b 45 ec mov -0x14(%ebp),%eax
1115b3: 89 02 mov %eax,(%edx)
/* Statistics */
++stats->free_blocks;
1115b5: 8b 43 38 mov 0x38(%ebx),%eax
1115b8: 40 inc %eax
1115b9: 89 43 38 mov %eax,0x38(%ebx)
if ( stats->max_free_blocks < stats->free_blocks ) {
1115bc: 3b 43 3c cmp 0x3c(%ebx),%eax
1115bf: 76 bc jbe 11157d <_Heap_Free+0xe1>
stats->max_free_blocks = stats->free_blocks;
1115c1: 89 43 3c mov %eax,0x3c(%ebx)
1115c4: eb b7 jmp 11157d <_Heap_Free+0xe1>
1115c6: 66 90 xchg %ax,%ax
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
1115c8: c6 45 eb 00 movb $0x0,-0x15(%ebp)
1115cc: e9 38 ff ff ff jmp 111509 <_Heap_Free+0x6d>
1115d1: 8d 76 00 lea 0x0(%esi),%esi
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
} else { /* coalesce prev */
uintptr_t const size = block_size + prev_size;
1115d4: 8b 45 ec mov -0x14(%ebp),%eax
1115d7: 03 45 f0 add -0x10(%ebp),%eax
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
1115da: 89 c6 mov %eax,%esi
1115dc: 83 ce 01 or $0x1,%esi
1115df: 89 71 04 mov %esi,0x4(%ecx)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
1115e2: 83 62 04 fe andl $0xfffffffe,0x4(%edx)
next_block->prev_size = size;
1115e6: 89 02 mov %eax,(%edx)
1115e8: eb 93 jmp 11157d <_Heap_Free+0xe1>
0010c694 <_Heap_Get_first_and_last_block>:
uintptr_t page_size,
uintptr_t min_block_size,
Heap_Block **first_block_ptr,
Heap_Block **last_block_ptr
)
{
10c694: 55 push %ebp
10c695: 89 e5 mov %esp,%ebp
10c697: 57 push %edi
10c698: 56 push %esi
10c699: 53 push %ebx
10c69a: 8b 4d 08 mov 0x8(%ebp),%ecx
10c69d: 8b 7d 0c mov 0xc(%ebp),%edi
uintptr_t const heap_area_end = heap_area_begin + heap_area_size;
10c6a0: 8d 34 0f lea (%edi,%ecx,1),%esi
uintptr_t const alloc_area_begin =
_Heap_Align_up( heap_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
10c6a3: 8d 59 08 lea 0x8(%ecx),%ebx
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
10c6a6: 89 d8 mov %ebx,%eax
10c6a8: 31 d2 xor %edx,%edx
10c6aa: f7 75 10 divl 0x10(%ebp)
if ( remainder != 0 ) {
10c6ad: 85 d2 test %edx,%edx
10c6af: 74 05 je 10c6b6 <_Heap_Get_first_and_last_block+0x22>
return value - remainder + alignment;
10c6b1: 03 5d 10 add 0x10(%ebp),%ebx
10c6b4: 29 d3 sub %edx,%ebx
_Heap_Align_down( heap_area_size - overhead, page_size );
Heap_Block *const first_block = (Heap_Block *) first_block_begin;
Heap_Block *const last_block =
_Heap_Block_at( first_block, first_block_size );
if (
10c6b6: 39 f1 cmp %esi,%ecx
10c6b8: 77 2e ja 10c6e8 <_Heap_Get_first_and_last_block+0x54>
uintptr_t const alloc_area_begin =
_Heap_Align_up( heap_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
uintptr_t const first_block_begin =
alloc_area_begin - HEAP_BLOCK_HEADER_SIZE;
uintptr_t const overhead =
HEAP_BLOCK_HEADER_SIZE + (first_block_begin - heap_area_begin);
10c6ba: 8d 73 f8 lea -0x8(%ebx),%esi
uintptr_t const heap_area_end = heap_area_begin + heap_area_size;
uintptr_t const alloc_area_begin =
_Heap_Align_up( heap_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
uintptr_t const first_block_begin =
alloc_area_begin - HEAP_BLOCK_HEADER_SIZE;
uintptr_t const overhead =
10c6bd: 29 cb sub %ecx,%ebx
Heap_Block *const last_block =
_Heap_Block_at( first_block, first_block_size );
if (
heap_area_end < heap_area_begin
|| heap_area_size <= overhead
10c6bf: 39 df cmp %ebx,%edi
10c6c1: 76 25 jbe 10c6e8 <_Heap_Get_first_and_last_block+0x54>
uintptr_t const first_block_begin =
alloc_area_begin - HEAP_BLOCK_HEADER_SIZE;
uintptr_t const overhead =
HEAP_BLOCK_HEADER_SIZE + (first_block_begin - heap_area_begin);
uintptr_t const first_block_size =
_Heap_Align_down( heap_area_size - overhead, page_size );
10c6c3: 29 df sub %ebx,%edi
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
10c6c5: 89 f8 mov %edi,%eax
10c6c7: 31 d2 xor %edx,%edx
10c6c9: f7 75 10 divl 0x10(%ebp)
10c6cc: 29 d7 sub %edx,%edi
_Heap_Block_at( first_block, first_block_size );
if (
heap_area_end < heap_area_begin
|| heap_area_size <= overhead
|| first_block_size < min_block_size
10c6ce: 39 7d 14 cmp %edi,0x14(%ebp)
10c6d1: 77 15 ja 10c6e8 <_Heap_Get_first_and_last_block+0x54>
) {
/* Invalid area or area too small */
return false;
}
*first_block_ptr = first_block;
10c6d3: 8b 45 18 mov 0x18(%ebp),%eax
10c6d6: 89 30 mov %esi,(%eax)
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
10c6d8: 01 f7 add %esi,%edi
10c6da: 8b 45 1c mov 0x1c(%ebp),%eax
10c6dd: 89 38 mov %edi,(%eax)
*last_block_ptr = last_block;
return true;
10c6df: b0 01 mov $0x1,%al
}
10c6e1: 5b pop %ebx
10c6e2: 5e pop %esi
10c6e3: 5f pop %edi
10c6e4: c9 leave
10c6e5: c3 ret
10c6e6: 66 90 xchg %ax,%ax
heap_area_end < heap_area_begin
|| heap_area_size <= overhead
|| first_block_size < min_block_size
) {
/* Invalid area or area too small */
return false;
10c6e8: 31 c0 xor %eax,%eax
*first_block_ptr = first_block;
*last_block_ptr = last_block;
return true;
}
10c6ea: 5b pop %ebx
10c6eb: 5e pop %esi
10c6ec: 5f pop %edi
10c6ed: c9 leave
10c6ee: c3 ret
001151b0 <_Heap_Get_free_information>:
void _Heap_Get_free_information(
Heap_Control *the_heap,
Heap_Information *info
)
{
1151b0: 55 push %ebp
1151b1: 89 e5 mov %esp,%ebp
1151b3: 57 push %edi
1151b4: 56 push %esi
1151b5: 53 push %ebx
1151b6: 8b 7d 0c mov 0xc(%ebp),%edi
Heap_Block *the_block;
Heap_Block *const tail = _Heap_Free_list_tail(the_heap);
info->number = 0;
1151b9: c7 07 00 00 00 00 movl $0x0,(%edi)
info->largest = 0;
1151bf: c7 47 04 00 00 00 00 movl $0x0,0x4(%edi)
info->total = 0;
1151c6: c7 47 08 00 00 00 00 movl $0x0,0x8(%edi)
info->number++;
info->total += the_size;
if ( info->largest < the_size )
info->largest = the_size;
}
}
1151cd: 8b 45 08 mov 0x8(%ebp),%eax
1151d0: 8b 50 08 mov 0x8(%eax),%edx
info->number = 0;
info->largest = 0;
info->total = 0;
for(the_block = _Heap_Free_list_first(the_heap);
1151d3: 39 d0 cmp %edx,%eax
1151d5: 74 31 je 115208 <_Heap_Get_free_information+0x58>
1151d7: b9 01 00 00 00 mov $0x1,%ecx
1151dc: 31 f6 xor %esi,%esi
1151de: 31 db xor %ebx,%ebx
1151e0: eb 07 jmp 1151e9 <_Heap_Get_free_information+0x39>
1151e2: 66 90 xchg %ax,%ax
1151e4: 8b 77 04 mov 0x4(%edi),%esi
1151e7: 89 c1 mov %eax,%ecx
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
1151e9: 8b 42 04 mov 0x4(%edx),%eax
1151ec: 83 e0 fe and $0xfffffffe,%eax
/* As we always coalesce free blocks, prev block must have been used. */
_HAssert(_Heap_Is_prev_used(the_block));
info->number++;
info->total += the_size;
1151ef: 01 c3 add %eax,%ebx
if ( info->largest < the_size )
1151f1: 39 f0 cmp %esi,%eax
1151f3: 76 03 jbe 1151f8 <_Heap_Get_free_information+0x48>
info->largest = the_size;
1151f5: 89 47 04 mov %eax,0x4(%edi)
info->largest = 0;
info->total = 0;
for(the_block = _Heap_Free_list_first(the_heap);
the_block != tail;
the_block = the_block->next)
1151f8: 8b 52 08 mov 0x8(%edx),%edx
1151fb: 8d 41 01 lea 0x1(%ecx),%eax
info->number = 0;
info->largest = 0;
info->total = 0;
for(the_block = _Heap_Free_list_first(the_heap);
1151fe: 39 55 08 cmp %edx,0x8(%ebp)
115201: 75 e1 jne 1151e4 <_Heap_Get_free_information+0x34>
115203: 89 0f mov %ecx,(%edi)
115205: 89 5f 08 mov %ebx,0x8(%edi)
info->number++;
info->total += the_size;
if ( info->largest < the_size )
info->largest = the_size;
}
}
115208: 5b pop %ebx
115209: 5e pop %esi
11520a: 5f pop %edi
11520b: c9 leave
11520c: c3 ret
00112014 <_Heap_Get_information>:
void _Heap_Get_information(
Heap_Control *the_heap,
Heap_Information_block *the_info
)
{
112014: 55 push %ebp
112015: 89 e5 mov %esp,%ebp
112017: 57 push %edi
112018: 56 push %esi
112019: 53 push %ebx
11201a: 83 ec 04 sub $0x4,%esp
11201d: 8b 45 08 mov 0x8(%ebp),%eax
112020: 8b 5d 0c mov 0xc(%ebp),%ebx
Heap_Block *the_block = the_heap->first_block;
112023: 8b 50 20 mov 0x20(%eax),%edx
Heap_Block *const end = the_heap->last_block;
112026: 8b 40 24 mov 0x24(%eax),%eax
112029: 89 45 f0 mov %eax,-0x10(%ebp)
memset(the_info, 0, sizeof(*the_info));
11202c: b9 18 00 00 00 mov $0x18,%ecx
112031: 31 c0 xor %eax,%eax
112033: 89 df mov %ebx,%edi
112035: f3 aa rep stos %al,%es:(%edi)
while ( the_block != end ) {
112037: 3b 55 f0 cmp -0x10(%ebp),%edx
11203a: 74 38 je 112074 <_Heap_Get_information+0x60><== NEVER TAKEN
11203c: 8b 7a 04 mov 0x4(%edx),%edi
11203f: eb 18 jmp 112059 <_Heap_Get_information+0x45>
112041: 8d 76 00 lea 0x0(%esi),%esi
uintptr_t const the_size = _Heap_Block_size(the_block);
Heap_Block *const next_block = _Heap_Block_at(the_block, the_size);
Heap_Information *info;
if ( _Heap_Is_prev_used(next_block) )
info = &the_info->Used;
112044: 8d 43 0c lea 0xc(%ebx),%eax
else
info = &the_info->Free;
info->number++;
112047: ff 00 incl (%eax)
info->total += the_size;
112049: 01 48 08 add %ecx,0x8(%eax)
if ( info->largest < the_size )
11204c: 39 48 04 cmp %ecx,0x4(%eax)
11204f: 73 03 jae 112054 <_Heap_Get_information+0x40>
info->largest = the_size;
112051: 89 48 04 mov %ecx,0x4(%eax)
Heap_Block *the_block = the_heap->first_block;
Heap_Block *const end = the_heap->last_block;
memset(the_info, 0, sizeof(*the_info));
while ( the_block != end ) {
112054: 39 75 f0 cmp %esi,-0x10(%ebp)
112057: 74 1b je 112074 <_Heap_Get_information+0x60>
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
112059: 89 f9 mov %edi,%ecx
11205b: 83 e1 fe and $0xfffffffe,%ecx
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
11205e: 8d 34 0a lea (%edx,%ecx,1),%esi
112061: 89 f2 mov %esi,%edx
if ( info->largest < the_size )
info->largest = the_size;
the_block = next_block;
}
}
112063: 8b 7e 04 mov 0x4(%esi),%edi
while ( the_block != end ) {
uintptr_t const the_size = _Heap_Block_size(the_block);
Heap_Block *const next_block = _Heap_Block_at(the_block, the_size);
Heap_Information *info;
if ( _Heap_Is_prev_used(next_block) )
112066: f7 c7 01 00 00 00 test $0x1,%edi
11206c: 75 d6 jne 112044 <_Heap_Get_information+0x30>
info = &the_info->Used;
else
info = &the_info->Free;
11206e: 89 d8 mov %ebx,%eax
112070: eb d5 jmp 112047 <_Heap_Get_information+0x33>
112072: 66 90 xchg %ax,%ax
if ( info->largest < the_size )
info->largest = the_size;
the_block = next_block;
}
}
112074: 58 pop %eax
112075: 5b pop %ebx
112076: 5e pop %esi
112077: 5f pop %edi
112078: c9 leave
112079: c3 ret
0011f5d8 <_Heap_Resize_block>:
void *alloc_begin_ptr,
uintptr_t new_alloc_size,
uintptr_t *old_size,
uintptr_t *new_size
)
{
11f5d8: 55 push %ebp
11f5d9: 89 e5 mov %esp,%ebp
11f5db: 57 push %edi
11f5dc: 56 push %esi
11f5dd: 53 push %ebx
11f5de: 83 ec 2c sub $0x2c,%esp
11f5e1: 8b 5d 08 mov 0x8(%ebp),%ebx
11f5e4: 8b 75 0c mov 0xc(%ebp),%esi
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
11f5e7: 8d 4e f8 lea -0x8(%esi),%ecx
11f5ea: 89 f0 mov %esi,%eax
11f5ec: 31 d2 xor %edx,%edx
11f5ee: f7 73 10 divl 0x10(%ebx)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
11f5f1: 29 d1 sub %edx,%ecx
uintptr_t const alloc_begin = (uintptr_t) alloc_begin_ptr;
Heap_Block *const block = _Heap_Block_of_alloc_area( alloc_begin, page_size );
*old_size = 0;
11f5f3: 8b 45 14 mov 0x14(%ebp),%eax
11f5f6: c7 00 00 00 00 00 movl $0x0,(%eax)
*new_size = 0;
11f5fc: 8b 55 18 mov 0x18(%ebp),%edx
11f5ff: c7 02 00 00 00 00 movl $0x0,(%edx)
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
11f605: 39 4b 20 cmp %ecx,0x20(%ebx)
11f608: 77 05 ja 11f60f <_Heap_Resize_block+0x37>
11f60a: 39 4b 24 cmp %ecx,0x24(%ebx)
11f60d: 73 0d jae 11f61c <_Heap_Resize_block+0x44>
new_alloc_size,
old_size,
new_size
);
} else {
return HEAP_RESIZE_FATAL_ERROR;
11f60f: b8 02 00 00 00 mov $0x2,%eax
}
}
11f614: 8d 65 f4 lea -0xc(%ebp),%esp
11f617: 5b pop %ebx
11f618: 5e pop %esi
11f619: 5f pop %edi
11f61a: c9 leave
11f61b: c3 ret
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
11f61c: 8b 41 04 mov 0x4(%ecx),%eax
11f61f: 83 e0 fe and $0xfffffffe,%eax
{
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t block_size = _Heap_Block_size( block );
uintptr_t block_end = block_begin + block_size;
11f622: 8d 3c 01 lea (%ecx,%eax,1),%edi
11f625: 89 7d d4 mov %edi,-0x2c(%ebp)
uintptr_t alloc_size = block_end - alloc_begin + HEAP_ALLOC_BONUS;
11f628: 89 fa mov %edi,%edx
11f62a: 29 f2 sub %esi,%edx
11f62c: 83 c2 04 add $0x4,%edx
11f62f: 89 55 e0 mov %edx,-0x20(%ebp)
11f632: 8b 57 04 mov 0x4(%edi),%edx
11f635: 83 e2 fe and $0xfffffffe,%edx
11f638: 89 55 d0 mov %edx,-0x30(%ebp)
RTEMS_INLINE_ROUTINE bool _Heap_Is_free(
const Heap_Block *block
)
{
return !_Heap_Is_used( block );
11f63b: f6 44 17 04 01 testb $0x1,0x4(%edi,%edx,1)
11f640: 0f 94 45 df sete -0x21(%ebp)
bool next_block_is_free = _Heap_Is_free( next_block );;
_HAssert( _Heap_Is_block_in_heap( heap, next_block ) );
_HAssert( _Heap_Is_prev_used( next_block ) );
*old_size = alloc_size;
11f644: 8b 55 e0 mov -0x20(%ebp),%edx
11f647: 8b 7d 14 mov 0x14(%ebp),%edi
11f64a: 89 17 mov %edx,(%edi)
if ( next_block_is_free ) {
11f64c: 80 7d df 00 cmpb $0x0,-0x21(%ebp)
11f650: 75 6e jne 11f6c0 <_Heap_Resize_block+0xe8>
block_size += next_block_size;
alloc_size += next_block_size;
}
if ( new_alloc_size > alloc_size ) {
11f652: 8b 55 e0 mov -0x20(%ebp),%edx
11f655: 39 55 10 cmp %edx,0x10(%ebp)
11f658: 77 79 ja 11f6d3 <_Heap_Resize_block+0xfb>
return HEAP_RESIZE_UNSATISFIED;
}
if ( next_block_is_free ) {
11f65a: 80 7d df 00 cmpb $0x0,-0x21(%ebp)
11f65e: 74 31 je 11f691 <_Heap_Resize_block+0xb9>
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
11f660: 8b 79 04 mov 0x4(%ecx),%edi
11f663: 83 e7 01 and $0x1,%edi
block->size_and_flag = size | flag;
11f666: 09 c7 or %eax,%edi
11f668: 89 79 04 mov %edi,0x4(%ecx)
new_size
);
} else {
return HEAP_RESIZE_FATAL_ERROR;
}
}
11f66b: 8b 7d d4 mov -0x2c(%ebp),%edi
11f66e: 8b 7f 08 mov 0x8(%edi),%edi
11f671: 89 7d e4 mov %edi,-0x1c(%ebp)
11f674: 8b 55 d4 mov -0x2c(%ebp),%edx
11f677: 8b 7a 0c mov 0xc(%edx),%edi
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
Heap_Block *prev = block->prev;
prev->next = next;
11f67a: 8b 55 e4 mov -0x1c(%ebp),%edx
11f67d: 89 57 08 mov %edx,0x8(%edi)
next->prev = prev;
11f680: 89 7a 0c mov %edi,0xc(%edx)
_Heap_Block_set_size( block, block_size );
_Heap_Free_list_remove( next_block );
next_block = _Heap_Block_at( block, block_size );
next_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
11f683: 83 4c 01 04 01 orl $0x1,0x4(%ecx,%eax,1)
/* Statistics */
--stats->free_blocks;
11f688: ff 4b 38 decl 0x38(%ebx)
stats->free_size -= next_block_size;
11f68b: 8b 7d d0 mov -0x30(%ebp),%edi
11f68e: 29 7b 30 sub %edi,0x30(%ebx)
}
block = _Heap_Block_allocate( heap, block, alloc_begin, new_alloc_size );
11f691: ff 75 10 pushl 0x10(%ebp)
11f694: 56 push %esi
11f695: 51 push %ecx
11f696: 53 push %ebx
11f697: e8 68 d1 fe ff call 10c804 <_Heap_Block_allocate>
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
11f69c: 8b 50 04 mov 0x4(%eax),%edx
11f69f: 83 e2 fe and $0xfffffffe,%edx
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
*new_size = (uintptr_t) next_block - alloc_begin + HEAP_ALLOC_BONUS;
11f6a2: 29 f0 sub %esi,%eax
11f6a4: 8d 44 10 04 lea 0x4(%eax,%edx,1),%eax
11f6a8: 8b 55 18 mov 0x18(%ebp),%edx
11f6ab: 89 02 mov %eax,(%edx)
/* Statistics */
++stats->resizes;
11f6ad: ff 43 54 incl 0x54(%ebx)
11f6b0: 83 c4 10 add $0x10,%esp
return HEAP_RESIZE_SUCCESSFUL;
11f6b3: 31 c0 xor %eax,%eax
new_size
);
} else {
return HEAP_RESIZE_FATAL_ERROR;
}
}
11f6b5: 8d 65 f4 lea -0xc(%ebp),%esp
11f6b8: 5b pop %ebx
11f6b9: 5e pop %esi
11f6ba: 5f pop %edi
11f6bb: c9 leave
11f6bc: c3 ret
11f6bd: 8d 76 00 lea 0x0(%esi),%esi
_HAssert( _Heap_Is_prev_used( next_block ) );
*old_size = alloc_size;
if ( next_block_is_free ) {
block_size += next_block_size;
11f6c0: 03 45 d0 add -0x30(%ebp),%eax
alloc_size += next_block_size;
11f6c3: 8b 7d d0 mov -0x30(%ebp),%edi
11f6c6: 01 fa add %edi,%edx
11f6c8: 89 55 e0 mov %edx,-0x20(%ebp)
}
if ( new_alloc_size > alloc_size ) {
11f6cb: 8b 55 e0 mov -0x20(%ebp),%edx
11f6ce: 39 55 10 cmp %edx,0x10(%ebp)
11f6d1: 76 87 jbe 11f65a <_Heap_Resize_block+0x82>
return HEAP_RESIZE_UNSATISFIED;
11f6d3: b8 01 00 00 00 mov $0x1,%eax
new_size
);
} else {
return HEAP_RESIZE_FATAL_ERROR;
}
}
11f6d8: 8d 65 f4 lea -0xc(%ebp),%esp
11f6db: 5b pop %ebx
11f6dc: 5e pop %esi
11f6dd: 5f pop %edi
11f6de: c9 leave
11f6df: c3 ret
0011f6e0 <_Heap_Size_of_alloc_area>:
bool _Heap_Size_of_alloc_area(
Heap_Control *heap,
void *alloc_begin_ptr,
uintptr_t *alloc_size
)
{
11f6e0: 55 push %ebp
11f6e1: 89 e5 mov %esp,%ebp
11f6e3: 56 push %esi
11f6e4: 53 push %ebx
11f6e5: 8b 5d 08 mov 0x8(%ebp),%ebx
11f6e8: 8b 75 0c mov 0xc(%ebp),%esi
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
11f6eb: 8d 4e f8 lea -0x8(%esi),%ecx
11f6ee: 89 f0 mov %esi,%eax
11f6f0: 31 d2 xor %edx,%edx
11f6f2: f7 73 10 divl 0x10(%ebx)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
11f6f5: 29 d1 sub %edx,%ecx
RTEMS_INLINE_ROUTINE bool _Heap_Is_block_in_heap(
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
11f6f7: 8b 43 20 mov 0x20(%ebx),%eax
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
11f6fa: 39 c1 cmp %eax,%ecx
11f6fc: 72 07 jb 11f705 <_Heap_Size_of_alloc_area+0x25>
11f6fe: 8b 53 24 mov 0x24(%ebx),%edx
11f701: 39 d1 cmp %edx,%ecx
11f703: 76 07 jbe 11f70c <_Heap_Size_of_alloc_area+0x2c><== ALWAYS TAKEN
if (
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
) {
return false;
11f705: 31 c0 xor %eax,%eax
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
return true;
}
11f707: 5b pop %ebx
11f708: 5e pop %esi
11f709: c9 leave
11f70a: c3 ret
11f70b: 90 nop
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
11f70c: 8b 59 04 mov 0x4(%ecx),%ebx
11f70f: 83 e3 fe and $0xfffffffe,%ebx
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
11f712: 01 d9 add %ebx,%ecx
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
11f714: 39 c8 cmp %ecx,%eax
11f716: 77 ed ja 11f705 <_Heap_Size_of_alloc_area+0x25><== NEVER TAKEN
11f718: 39 ca cmp %ecx,%edx
11f71a: 72 e9 jb 11f705 <_Heap_Size_of_alloc_area+0x25><== NEVER TAKEN
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if (
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
11f71c: f6 41 04 01 testb $0x1,0x4(%ecx)
11f720: 74 e3 je 11f705 <_Heap_Size_of_alloc_area+0x25><== NEVER TAKEN
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
11f722: 29 f1 sub %esi,%ecx
11f724: 8d 51 04 lea 0x4(%ecx),%edx
11f727: 8b 45 10 mov 0x10(%ebp),%eax
11f72a: 89 10 mov %edx,(%eax)
return true;
11f72c: b0 01 mov $0x1,%al
}
11f72e: 5b pop %ebx
11f72f: 5e pop %esi
11f730: c9 leave
11f731: c3 ret
0010d338 <_Heap_Walk>:
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
10d338: 55 push %ebp
10d339: 89 e5 mov %esp,%ebp
10d33b: 57 push %edi
10d33c: 56 push %esi
10d33d: 53 push %ebx
10d33e: 83 ec 4c sub $0x4c,%esp
10d341: 8b 5d 08 mov 0x8(%ebp),%ebx
uintptr_t const page_size = heap->page_size;
10d344: 8b 43 10 mov 0x10(%ebx),%eax
10d347: 89 45 e0 mov %eax,-0x20(%ebp)
uintptr_t const min_block_size = heap->min_block_size;
10d34a: 8b 53 14 mov 0x14(%ebx),%edx
10d34d: 89 55 d0 mov %edx,-0x30(%ebp)
Heap_Block *const first_block = heap->first_block;
10d350: 8b 43 20 mov 0x20(%ebx),%eax
10d353: 89 45 dc mov %eax,-0x24(%ebp)
Heap_Block *const last_block = heap->last_block;
10d356: 8b 53 24 mov 0x24(%ebx),%edx
10d359: 89 55 cc mov %edx,-0x34(%ebp)
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
10d35c: 80 7d 10 00 cmpb $0x0,0x10(%ebp)
10d360: 74 1a je 10d37c <_Heap_Walk+0x44>
10d362: c7 45 d8 f0 d2 10 00 movl $0x10d2f0,-0x28(%ebp)
if ( !_System_state_Is_up( _System_state_Get() ) ) {
10d369: 83 3d 00 a5 12 00 03 cmpl $0x3,0x12a500
10d370: 74 1a je 10d38c <_Heap_Walk+0x54> <== ALWAYS TAKEN
}
block = next_block;
} while ( block != first_block );
return true;
10d372: b0 01 mov $0x1,%al
}
10d374: 8d 65 f4 lea -0xc(%ebp),%esp
10d377: 5b pop %ebx
10d378: 5e pop %esi
10d379: 5f pop %edi
10d37a: c9 leave
10d37b: c3 ret
uintptr_t const min_block_size = heap->min_block_size;
Heap_Block *const first_block = heap->first_block;
Heap_Block *const last_block = heap->last_block;
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
10d37c: c7 45 d8 e8 d2 10 00 movl $0x10d2e8,-0x28(%ebp)
if ( !_System_state_Is_up( _System_state_Get() ) ) {
10d383: 83 3d 00 a5 12 00 03 cmpl $0x3,0x12a500
10d38a: 75 e6 jne 10d372 <_Heap_Walk+0x3a>
Heap_Block *const first_free_block = _Heap_Free_list_first( heap );
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
Heap_Block *const first_block = heap->first_block;
Heap_Block *const last_block = heap->last_block;
(*printer)(
10d38c: 52 push %edx
10d38d: ff 73 0c pushl 0xc(%ebx)
10d390: ff 73 08 pushl 0x8(%ebx)
10d393: ff 75 cc pushl -0x34(%ebp)
10d396: ff 75 dc pushl -0x24(%ebp)
10d399: ff 73 1c pushl 0x1c(%ebx)
10d39c: ff 73 18 pushl 0x18(%ebx)
10d39f: ff 75 d0 pushl -0x30(%ebp)
10d3a2: ff 75 e0 pushl -0x20(%ebp)
10d3a5: 68 54 26 12 00 push $0x122654
10d3aa: 6a 00 push $0x0
10d3ac: ff 75 0c pushl 0xc(%ebp)
10d3af: ff 55 d8 call *-0x28(%ebp)
heap->area_begin, heap->area_end,
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
10d3b2: 83 c4 30 add $0x30,%esp
10d3b5: 8b 45 e0 mov -0x20(%ebp),%eax
10d3b8: 85 c0 test %eax,%eax
10d3ba: 74 70 je 10d42c <_Heap_Walk+0xf4>
(*printer)( source, true, "page size is zero\n" );
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
10d3bc: f6 45 e0 03 testb $0x3,-0x20(%ebp)
10d3c0: 75 72 jne 10d434 <_Heap_Walk+0xfc>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10d3c2: 8b 45 d0 mov -0x30(%ebp),%eax
10d3c5: 31 d2 xor %edx,%edx
10d3c7: f7 75 e0 divl -0x20(%ebp)
);
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
10d3ca: 85 d2 test %edx,%edx
10d3cc: 75 72 jne 10d440 <_Heap_Walk+0x108>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
10d3ce: 8b 45 dc mov -0x24(%ebp),%eax
10d3d1: 83 c0 08 add $0x8,%eax
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10d3d4: 31 d2 xor %edx,%edx
10d3d6: f7 75 e0 divl -0x20(%ebp)
);
return false;
}
if (
10d3d9: 85 d2 test %edx,%edx
10d3db: 75 6f jne 10d44c <_Heap_Walk+0x114>
block = next_block;
} while ( block != first_block );
return true;
}
10d3dd: 8b 45 dc mov -0x24(%ebp),%eax
10d3e0: 8b 40 04 mov 0x4(%eax),%eax
10d3e3: 89 45 e4 mov %eax,-0x1c(%ebp)
);
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
10d3e6: a8 01 test $0x1,%al
10d3e8: 0f 84 ce 02 00 00 je 10d6bc <_Heap_Walk+0x384>
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
10d3ee: 8b 55 cc mov -0x34(%ebp),%edx
10d3f1: 8b 42 04 mov 0x4(%edx),%eax
10d3f4: 83 e0 fe and $0xfffffffe,%eax
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
10d3f7: 01 d0 add %edx,%eax
);
return false;
}
if ( _Heap_Is_free( last_block ) ) {
10d3f9: f6 40 04 01 testb $0x1,0x4(%eax)
10d3fd: 74 25 je 10d424 <_Heap_Walk+0xec>
);
return false;
}
if (
10d3ff: 39 45 dc cmp %eax,-0x24(%ebp)
10d402: 74 54 je 10d458 <_Heap_Walk+0x120> <== ALWAYS TAKEN
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
10d404: 51 push %ecx <== NOT EXECUTED
10d405: 68 70 27 12 00 push $0x122770 <== NOT EXECUTED
10d40a: 66 90 xchg %ax,%ax <== NOT EXECUTED
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
10d40c: 6a 01 push $0x1
10d40e: ff 75 0c pushl 0xc(%ebp)
10d411: ff 55 d8 call *-0x28(%ebp)
10d414: 83 c4 10 add $0x10,%esp
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
10d417: 31 c0 xor %eax,%eax
block = next_block;
} while ( block != first_block );
return true;
}
10d419: 8d 65 f4 lea -0xc(%ebp),%esp
10d41c: 5b pop %ebx
10d41d: 5e pop %esi
10d41e: 5f pop %edi
10d41f: c9 leave
10d420: c3 ret
10d421: 8d 76 00 lea 0x0(%esi),%esi
return false;
}
if ( _Heap_Is_free( last_block ) ) {
(*printer)(
10d424: 53 push %ebx
10d425: 68 0a 26 12 00 push $0x12260a
10d42a: eb e0 jmp 10d40c <_Heap_Walk+0xd4>
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
(*printer)( source, true, "page size is zero\n" );
10d42c: 57 push %edi
10d42d: 68 d9 25 12 00 push $0x1225d9
10d432: eb d8 jmp 10d40c <_Heap_Walk+0xd4>
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
(*printer)(
10d434: ff 75 e0 pushl -0x20(%ebp)
10d437: 68 ec 25 12 00 push $0x1225ec
10d43c: eb ce jmp 10d40c <_Heap_Walk+0xd4>
10d43e: 66 90 xchg %ax,%ax
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
(*printer)(
10d440: ff 75 d0 pushl -0x30(%ebp)
10d443: 68 e8 26 12 00 push $0x1226e8
10d448: eb c2 jmp 10d40c <_Heap_Walk+0xd4>
10d44a: 66 90 xchg %ax,%ax
}
if (
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size )
) {
(*printer)(
10d44c: ff 75 dc pushl -0x24(%ebp)
10d44f: 68 0c 27 12 00 push $0x12270c
10d454: eb b6 jmp 10d40c <_Heap_Walk+0xd4>
10d456: 66 90 xchg %ax,%ax
int source,
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
10d458: 8b 43 10 mov 0x10(%ebx),%eax
10d45b: 89 45 c8 mov %eax,-0x38(%ebp)
block = next_block;
} while ( block != first_block );
return true;
}
10d45e: 8b 73 08 mov 0x8(%ebx),%esi
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *const first_free_block = _Heap_Free_list_first( heap );
const Heap_Block *prev_block = free_list_tail;
const Heap_Block *free_block = first_free_block;
while ( free_block != free_list_tail ) {
10d461: 39 f3 cmp %esi,%ebx
10d463: 74 65 je 10d4ca <_Heap_Walk+0x192>
block = next_block;
} while ( block != first_block );
return true;
}
10d465: 8b 43 20 mov 0x20(%ebx),%eax
10d468: 89 45 d4 mov %eax,-0x2c(%ebp)
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
10d46b: 39 f0 cmp %esi,%eax
10d46d: 0f 87 55 02 00 00 ja 10d6c8 <_Heap_Walk+0x390> <== NEVER TAKEN
10d473: 8b 7b 24 mov 0x24(%ebx),%edi
10d476: 39 f7 cmp %esi,%edi
10d478: 0f 82 4a 02 00 00 jb 10d6c8 <_Heap_Walk+0x390> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
10d47e: 8d 46 08 lea 0x8(%esi),%eax
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10d481: 31 d2 xor %edx,%edx
10d483: f7 75 c8 divl -0x38(%ebp)
);
return false;
}
if (
10d486: 85 d2 test %edx,%edx
10d488: 0f 85 71 02 00 00 jne 10d6ff <_Heap_Walk+0x3c7> <== NEVER TAKEN
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
10d48e: 8b 46 04 mov 0x4(%esi),%eax
10d491: 83 e0 fe and $0xfffffffe,%eax
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
10d494: f6 44 06 04 01 testb $0x1,0x4(%esi,%eax,1)
10d499: 0f 85 6d 02 00 00 jne 10d70c <_Heap_Walk+0x3d4> <== NEVER TAKEN
10d49f: 89 da mov %ebx,%edx
10d4a1: 8d 76 00 lea 0x0(%esi),%esi
);
return false;
}
if ( free_block->prev != prev_block ) {
10d4a4: 8b 46 0c mov 0xc(%esi),%eax
10d4a7: 39 d0 cmp %edx,%eax
10d4a9: 0f 85 6a 02 00 00 jne 10d719 <_Heap_Walk+0x3e1>
return false;
}
prev_block = free_block;
free_block = free_block->next;
10d4af: 8b 4e 08 mov 0x8(%esi),%ecx
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *const first_free_block = _Heap_Free_list_first( heap );
const Heap_Block *prev_block = free_list_tail;
const Heap_Block *free_block = first_free_block;
while ( free_block != free_list_tail ) {
10d4b2: 39 cb cmp %ecx,%ebx
10d4b4: 74 1a je 10d4d0 <_Heap_Walk+0x198>
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
10d4b6: 39 4d d4 cmp %ecx,-0x2c(%ebp)
10d4b9: 0f 86 7d 01 00 00 jbe 10d63c <_Heap_Walk+0x304>
if ( !_Heap_Is_block_in_heap( heap, free_block ) ) {
(*printer)(
10d4bf: 51 push %ecx
10d4c0: 68 a0 27 12 00 push $0x1227a0
10d4c5: e9 42 ff ff ff jmp 10d40c <_Heap_Walk+0xd4>
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *const first_free_block = _Heap_Free_list_first( heap );
const Heap_Block *prev_block = free_list_tail;
const Heap_Block *free_block = first_free_block;
while ( free_block != free_list_tail ) {
10d4ca: 8b 53 20 mov 0x20(%ebx),%edx
10d4cd: 89 55 d4 mov %edx,-0x2c(%ebp)
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
10d4d0: 8b 7d dc mov -0x24(%ebp),%edi
10d4d3: 8b 45 d4 mov -0x2c(%ebp),%eax
10d4d6: 66 90 xchg %ax,%ax
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
10d4d8: 8b 4d e4 mov -0x1c(%ebp),%ecx
10d4db: 83 e1 fe and $0xfffffffe,%ecx
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
10d4de: 8d 34 39 lea (%ecx,%edi,1),%esi
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
10d4e1: 39 f0 cmp %esi,%eax
10d4e3: 76 23 jbe 10d508 <_Heap_Walk+0x1d0> <== ALWAYS TAKEN
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
uintptr_t const next_block_begin = (uintptr_t) next_block;
bool const is_not_last_block = block != last_block;
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
(*printer)(
10d4e5: 83 ec 0c sub $0xc,%esp
10d4e8: 56 push %esi
10d4e9: 57 push %edi
10d4ea: 68 24 28 12 00 push $0x122824
10d4ef: 90 nop
10d4f0: 6a 01 push $0x1
10d4f2: ff 75 0c pushl 0xc(%ebp)
10d4f5: ff 55 d8 call *-0x28(%ebp)
"block 0x%08x: next block 0x%08x not in heap\n",
block,
next_block
);
return false;
10d4f8: 83 c4 20 add $0x20,%esp
10d4fb: 31 c0 xor %eax,%eax
block = next_block;
} while ( block != first_block );
return true;
}
10d4fd: 8d 65 f4 lea -0xc(%ebp),%esp
10d500: 5b pop %ebx
10d501: 5e pop %esi
10d502: 5f pop %edi
10d503: c9 leave
10d504: c3 ret
10d505: 8d 76 00 lea 0x0(%esi),%esi
10d508: 39 73 24 cmp %esi,0x24(%ebx)
10d50b: 72 d8 jb 10d4e5 <_Heap_Walk+0x1ad>
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
bool const prev_used = _Heap_Is_prev_used( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
uintptr_t const next_block_begin = (uintptr_t) next_block;
bool const is_not_last_block = block != last_block;
10d50d: 3b 7d cc cmp -0x34(%ebp),%edi
10d510: 0f 95 45 d4 setne -0x2c(%ebp)
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10d514: 89 c8 mov %ecx,%eax
10d516: 31 d2 xor %edx,%edx
10d518: f7 75 e0 divl -0x20(%ebp)
);
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
10d51b: 85 d2 test %edx,%edx
10d51d: 74 0a je 10d529 <_Heap_Walk+0x1f1>
10d51f: 80 7d d4 00 cmpb $0x0,-0x2c(%ebp)
10d523: 0f 85 a6 01 00 00 jne 10d6cf <_Heap_Walk+0x397>
);
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
10d529: 39 4d d0 cmp %ecx,-0x30(%ebp)
10d52c: 76 0a jbe 10d538 <_Heap_Walk+0x200>
10d52e: 80 7d d4 00 cmpb $0x0,-0x2c(%ebp)
10d532: 0f 85 a6 01 00 00 jne 10d6de <_Heap_Walk+0x3a6> <== ALWAYS TAKEN
);
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
10d538: 39 f7 cmp %esi,%edi
10d53a: 72 0a jb 10d546 <_Heap_Walk+0x20e>
10d53c: 80 7d d4 00 cmpb $0x0,-0x2c(%ebp)
10d540: 0f 85 aa 01 00 00 jne 10d6f0 <_Heap_Walk+0x3b8>
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
10d546: 8b 55 e4 mov -0x1c(%ebp),%edx
10d549: 83 e2 01 and $0x1,%edx
);
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
10d54c: f6 46 04 01 testb $0x1,0x4(%esi)
10d550: 74 4e je 10d5a0 <_Heap_Walk+0x268>
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
10d552: 85 d2 test %edx,%edx
10d554: 74 2e je 10d584 <_Heap_Walk+0x24c>
(*printer)(
10d556: 83 ec 0c sub $0xc,%esp
10d559: 51 push %ecx
10d55a: 57 push %edi
10d55b: 68 3b 26 12 00 push $0x12263b
10d560: 6a 00 push $0x0
10d562: ff 75 0c pushl 0xc(%ebp)
10d565: ff 55 d8 call *-0x28(%ebp)
10d568: 83 c4 20 add $0x20,%esp
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
10d56b: 39 75 dc cmp %esi,-0x24(%ebp)
10d56e: 0f 84 fe fd ff ff je 10d372 <_Heap_Walk+0x3a>
10d574: 8b 56 04 mov 0x4(%esi),%edx
10d577: 89 55 e4 mov %edx,-0x1c(%ebp)
10d57a: 8b 43 20 mov 0x20(%ebx),%eax
10d57d: 89 f7 mov %esi,%edi
10d57f: e9 54 ff ff ff jmp 10d4d8 <_Heap_Walk+0x1a0>
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
10d584: 83 ec 08 sub $0x8,%esp
10d587: ff 37 pushl (%edi)
10d589: 51 push %ecx
10d58a: 57 push %edi
10d58b: 68 88 29 12 00 push $0x122988
10d590: 6a 00 push $0x0
10d592: ff 75 0c pushl 0xc(%ebp)
10d595: ff 55 d8 call *-0x28(%ebp)
10d598: 83 c4 20 add $0x20,%esp
10d59b: eb ce jmp 10d56b <_Heap_Walk+0x233>
10d59d: 8d 76 00 lea 0x0(%esi),%esi
block = next_block;
} while ( block != first_block );
return true;
}
10d5a0: 8b 43 08 mov 0x8(%ebx),%eax
10d5a3: 89 45 b4 mov %eax,-0x4c(%ebp)
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
10d5a6: 8b 47 08 mov 0x8(%edi),%eax
10d5a9: 89 45 e4 mov %eax,-0x1c(%ebp)
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
10d5ac: 39 43 0c cmp %eax,0xc(%ebx)
10d5af: 0f 84 cb 00 00 00 je 10d680 <_Heap_Walk+0x348>
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
10d5b5: 39 c3 cmp %eax,%ebx
10d5b7: 0f 84 db 00 00 00 je 10d698 <_Heap_Walk+0x360>
10d5bd: c7 45 c8 c9 24 12 00 movl $0x1224c9,-0x38(%ebp)
false,
"block 0x%08x: size %u, prev 0x%08x%s, next 0x%08x%s\n",
block,
block_size,
block->prev,
block->prev == first_free_block ?
10d5c4: 8b 47 0c mov 0xc(%edi),%eax
10d5c7: 89 45 d4 mov %eax,-0x2c(%ebp)
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
10d5ca: 39 45 b4 cmp %eax,-0x4c(%ebp)
10d5cd: 0f 84 b9 00 00 00 je 10d68c <_Heap_Walk+0x354>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
10d5d3: 39 c3 cmp %eax,%ebx
10d5d5: 0f 84 c9 00 00 00 je 10d6a4 <_Heap_Walk+0x36c>
10d5db: b8 c9 24 12 00 mov $0x1224c9,%eax
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
10d5e0: 83 ec 0c sub $0xc,%esp
10d5e3: ff 75 c8 pushl -0x38(%ebp)
10d5e6: ff 75 e4 pushl -0x1c(%ebp)
10d5e9: 50 push %eax
10d5ea: ff 75 d4 pushl -0x2c(%ebp)
10d5ed: 51 push %ecx
10d5ee: 57 push %edi
10d5ef: 68 e4 28 12 00 push $0x1228e4
10d5f4: 6a 00 push $0x0
10d5f6: ff 75 0c pushl 0xc(%ebp)
10d5f9: 89 55 c4 mov %edx,-0x3c(%ebp)
10d5fc: 89 4d c0 mov %ecx,-0x40(%ebp)
10d5ff: ff 55 d8 call *-0x28(%ebp)
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
10d602: 8b 06 mov (%esi),%eax
10d604: 83 c4 30 add $0x30,%esp
10d607: 8b 4d c0 mov -0x40(%ebp),%ecx
10d60a: 39 c1 cmp %eax,%ecx
10d60c: 8b 55 c4 mov -0x3c(%ebp),%edx
10d60f: 75 5f jne 10d670 <_Heap_Walk+0x338>
);
return false;
}
if ( !prev_used ) {
10d611: 85 d2 test %edx,%edx
10d613: 0f 84 97 00 00 00 je 10d6b0 <_Heap_Walk+0x378>
block = next_block;
} while ( block != first_block );
return true;
}
10d619: 8b 43 08 mov 0x8(%ebx),%eax
)
{
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *free_block = _Heap_Free_list_first( heap );
while ( free_block != free_list_tail ) {
10d61c: 39 c3 cmp %eax,%ebx
10d61e: 74 0f je 10d62f <_Heap_Walk+0x2f7> <== NEVER TAKEN
if ( free_block == block ) {
10d620: 39 c7 cmp %eax,%edi
10d622: 0f 84 43 ff ff ff je 10d56b <_Heap_Walk+0x233>
return true;
}
free_block = free_block->next;
10d628: 8b 40 08 mov 0x8(%eax),%eax
)
{
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *free_block = _Heap_Free_list_first( heap );
while ( free_block != free_list_tail ) {
10d62b: 39 c3 cmp %eax,%ebx
10d62d: 75 f1 jne 10d620 <_Heap_Walk+0x2e8>
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
10d62f: 57 push %edi
10d630: 68 b0 29 12 00 push $0x1229b0
10d635: e9 d2 fd ff ff jmp 10d40c <_Heap_Walk+0xd4>
10d63a: 66 90 xchg %ax,%ax
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
10d63c: 39 f9 cmp %edi,%ecx
10d63e: 0f 87 7b fe ff ff ja 10d4bf <_Heap_Walk+0x187> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
10d644: 8d 41 08 lea 0x8(%ecx),%eax
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10d647: 31 d2 xor %edx,%edx
10d649: f7 75 c8 divl -0x38(%ebp)
);
return false;
}
if (
10d64c: 85 d2 test %edx,%edx
10d64e: 0f 85 ad 00 00 00 jne 10d701 <_Heap_Walk+0x3c9>
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
10d654: 8b 41 04 mov 0x4(%ecx),%eax
10d657: 83 e0 fe and $0xfffffffe,%eax
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
10d65a: f6 44 01 04 01 testb $0x1,0x4(%ecx,%eax,1)
10d65f: 0f 85 a9 00 00 00 jne 10d70e <_Heap_Walk+0x3d6>
10d665: 89 f2 mov %esi,%edx
10d667: 89 ce mov %ecx,%esi
10d669: e9 36 fe ff ff jmp 10d4a4 <_Heap_Walk+0x16c>
10d66e: 66 90 xchg %ax,%ax
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
(*printer)(
10d670: 52 push %edx
10d671: 56 push %esi
10d672: 50 push %eax
10d673: 51 push %ecx
10d674: 57 push %edi
10d675: 68 1c 29 12 00 push $0x12291c
10d67a: e9 71 fe ff ff jmp 10d4f0 <_Heap_Walk+0x1b8>
10d67f: 90 nop
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
10d680: c7 45 c8 a6 25 12 00 movl $0x1225a6,-0x38(%ebp)
10d687: e9 38 ff ff ff jmp 10d5c4 <_Heap_Walk+0x28c>
10d68c: b8 bf 25 12 00 mov $0x1225bf,%eax
10d691: e9 4a ff ff ff jmp 10d5e0 <_Heap_Walk+0x2a8>
10d696: 66 90 xchg %ax,%ax
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
10d698: c7 45 c8 b5 25 12 00 movl $0x1225b5,-0x38(%ebp)
10d69f: e9 20 ff ff ff jmp 10d5c4 <_Heap_Walk+0x28c>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
10d6a4: b8 cf 25 12 00 mov $0x1225cf,%eax
10d6a9: e9 32 ff ff ff jmp 10d5e0 <_Heap_Walk+0x2a8>
10d6ae: 66 90 xchg %ax,%ax
return false;
}
if ( !prev_used ) {
(*printer)(
10d6b0: 57 push %edi
10d6b1: 68 58 29 12 00 push $0x122958
10d6b6: e9 51 fd ff ff jmp 10d40c <_Heap_Walk+0xd4>
10d6bb: 90 nop
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
(*printer)(
10d6bc: 56 push %esi
10d6bd: 68 40 27 12 00 push $0x122740
10d6c2: e9 45 fd ff ff jmp 10d40c <_Heap_Walk+0xd4>
10d6c7: 90 nop
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
10d6c8: 89 f1 mov %esi,%ecx <== NOT EXECUTED
10d6ca: e9 f0 fd ff ff jmp 10d4bf <_Heap_Walk+0x187> <== NOT EXECUTED
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
(*printer)(
10d6cf: 83 ec 0c sub $0xc,%esp
10d6d2: 51 push %ecx
10d6d3: 57 push %edi
10d6d4: 68 54 28 12 00 push $0x122854
10d6d9: e9 12 fe ff ff jmp 10d4f0 <_Heap_Walk+0x1b8>
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
(*printer)(
10d6de: 83 ec 08 sub $0x8,%esp
10d6e1: ff 75 d0 pushl -0x30(%ebp)
10d6e4: 51 push %ecx
10d6e5: 57 push %edi
10d6e6: 68 84 28 12 00 push $0x122884
10d6eb: e9 00 fe ff ff jmp 10d4f0 <_Heap_Walk+0x1b8>
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
(*printer)(
10d6f0: 83 ec 0c sub $0xc,%esp
10d6f3: 56 push %esi
10d6f4: 57 push %edi
10d6f5: 68 b0 28 12 00 push $0x1228b0
10d6fa: e9 f1 fd ff ff jmp 10d4f0 <_Heap_Walk+0x1b8>
);
return false;
}
if (
10d6ff: 89 f1 mov %esi,%ecx <== NOT EXECUTED
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size )
) {
(*printer)(
10d701: 51 push %ecx
10d702: 68 c0 27 12 00 push $0x1227c0
10d707: e9 00 fd ff ff jmp 10d40c <_Heap_Walk+0xd4>
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
10d70c: 89 f1 mov %esi,%ecx <== NOT EXECUTED
(*printer)(
10d70e: 51 push %ecx
10d70f: 68 1f 26 12 00 push $0x12261f
10d714: e9 f3 fc ff ff jmp 10d40c <_Heap_Walk+0xd4>
return false;
}
if ( free_block->prev != prev_block ) {
(*printer)(
10d719: 83 ec 0c sub $0xc,%esp
10d71c: 50 push %eax
10d71d: 56 push %esi
10d71e: 68 f0 27 12 00 push $0x1227f0
10d723: e9 c8 fd ff ff jmp 10d4f0 <_Heap_Walk+0x1b8>
0010bdac <_IO_Initialize_all_drivers>:
*
* Output Parameters: NONE
*/
void _IO_Initialize_all_drivers( void )
{
10bdac: 55 push %ebp
10bdad: 89 e5 mov %esp,%ebp
10bdaf: 53 push %ebx
10bdb0: 83 ec 04 sub $0x4,%esp
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
10bdb3: 8b 0d e0 88 12 00 mov 0x1288e0,%ecx
10bdb9: 85 c9 test %ecx,%ecx
10bdbb: 74 1a je 10bdd7 <_IO_Initialize_all_drivers+0x2b><== NEVER TAKEN
10bdbd: 31 db xor %ebx,%ebx
10bdbf: 90 nop
(void) rtems_io_initialize( major, 0, NULL );
10bdc0: 52 push %edx
10bdc1: 6a 00 push $0x0
10bdc3: 6a 00 push $0x0
10bdc5: 53 push %ebx
10bdc6: e8 49 52 00 00 call 111014 <rtems_io_initialize>
void _IO_Initialize_all_drivers( void )
{
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
10bdcb: 43 inc %ebx
10bdcc: 83 c4 10 add $0x10,%esp
10bdcf: 39 1d e0 88 12 00 cmp %ebx,0x1288e0
10bdd5: 77 e9 ja 10bdc0 <_IO_Initialize_all_drivers+0x14>
(void) rtems_io_initialize( major, 0, NULL );
}
10bdd7: 8b 5d fc mov -0x4(%ebp),%ebx
10bdda: c9 leave
10bddb: c3 ret
0010bd14 <_IO_Manager_initialization>:
* workspace.
*
*/
void _IO_Manager_initialization(void)
{
10bd14: 55 push %ebp
10bd15: 89 e5 mov %esp,%ebp
10bd17: 57 push %edi
10bd18: 56 push %esi
10bd19: 53 push %ebx
10bd1a: 83 ec 1c sub $0x1c,%esp
uint32_t index;
rtems_driver_address_table *driver_table;
uint32_t drivers_in_table;
uint32_t number_of_drivers;
driver_table = Configuration.Device_driver_table;
10bd1d: 8b 1d 38 3b 12 00 mov 0x123b38,%ebx
drivers_in_table = Configuration.number_of_device_drivers;
10bd23: a1 34 3b 12 00 mov 0x123b34,%eax
10bd28: 89 45 e4 mov %eax,-0x1c(%ebp)
number_of_drivers = Configuration.maximum_drivers;
10bd2b: 8b 35 30 3b 12 00 mov 0x123b30,%esi
/*
* If the user claims there are less drivers than are actually in
* the table, then let's just go with the table's count.
*/
if ( number_of_drivers <= drivers_in_table )
10bd31: 39 f0 cmp %esi,%eax
10bd33: 73 5f jae 10bd94 <_IO_Manager_initialization+0x80>
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
_Workspace_Allocate_or_fatal_error(
10bd35: 8d 0c 76 lea (%esi,%esi,2),%ecx
10bd38: c1 e1 03 shl $0x3,%ecx
10bd3b: 83 ec 0c sub $0xc,%esp
10bd3e: 51 push %ecx
10bd3f: 89 4d dc mov %ecx,-0x24(%ebp)
10bd42: e8 4d 2c 00 00 call 10e994 <_Workspace_Allocate_or_fatal_error>
10bd47: 89 c2 mov %eax,%edx
/*
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
10bd49: a3 e4 88 12 00 mov %eax,0x1288e4
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
10bd4e: 89 35 e0 88 12 00 mov %esi,0x1288e0
memset(
10bd54: 31 c0 xor %eax,%eax
10bd56: 8b 4d dc mov -0x24(%ebp),%ecx
10bd59: 89 d7 mov %edx,%edi
10bd5b: f3 aa rep stos %al,%es:(%edi)
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
10bd5d: 83 c4 10 add $0x10,%esp
10bd60: 8b 45 e4 mov -0x1c(%ebp),%eax
10bd63: 85 c0 test %eax,%eax
10bd65: 74 25 je 10bd8c <_IO_Manager_initialization+0x78><== NEVER TAKEN
10bd67: a1 e4 88 12 00 mov 0x1288e4,%eax
10bd6c: 89 45 e0 mov %eax,-0x20(%ebp)
10bd6f: 31 c0 xor %eax,%eax
10bd71: 31 d2 xor %edx,%edx
10bd73: 90 nop
_IO_Driver_address_table[index] = driver_table[index];
10bd74: 8b 7d e0 mov -0x20(%ebp),%edi
10bd77: 01 c7 add %eax,%edi
10bd79: 8d 34 03 lea (%ebx,%eax,1),%esi
10bd7c: b9 06 00 00 00 mov $0x6,%ecx
10bd81: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
memset(
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
10bd83: 42 inc %edx
10bd84: 83 c0 18 add $0x18,%eax
10bd87: 39 55 e4 cmp %edx,-0x1c(%ebp)
10bd8a: 77 e8 ja 10bd74 <_IO_Manager_initialization+0x60>
_IO_Driver_address_table[index] = driver_table[index];
}
10bd8c: 8d 65 f4 lea -0xc(%ebp),%esp
10bd8f: 5b pop %ebx
10bd90: 5e pop %esi
10bd91: 5f pop %edi
10bd92: c9 leave
10bd93: c3 ret
* If the maximum number of driver is the same as the number in the
* table, then we do not have to copy the driver table. They can't
* register any dynamically.
*/
if ( number_of_drivers == drivers_in_table ) {
_IO_Driver_address_table = driver_table;
10bd94: 89 1d e4 88 12 00 mov %ebx,0x1288e4
_IO_Number_of_drivers = number_of_drivers;
10bd9a: 8b 45 e4 mov -0x1c(%ebp),%eax
10bd9d: a3 e0 88 12 00 mov %eax,0x1288e0
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
_IO_Driver_address_table[index] = driver_table[index];
}
10bda2: 8d 65 f4 lea -0xc(%ebp),%esp
10bda5: 5b pop %ebx
10bda6: 5e pop %esi
10bda7: 5f pop %edi
10bda8: c9 leave
10bda9: c3 ret
0010c8f8 <_Internal_error_Occurred>:
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
10c8f8: 55 push %ebp
10c8f9: 89 e5 mov %esp,%ebp
10c8fb: 53 push %ebx
10c8fc: 83 ec 08 sub $0x8,%esp
10c8ff: 8b 45 08 mov 0x8(%ebp),%eax
10c902: 8b 55 0c mov 0xc(%ebp),%edx
10c905: 8b 5d 10 mov 0x10(%ebp),%ebx
_Internal_errors_What_happened.the_source = the_source;
10c908: a3 10 7f 12 00 mov %eax,0x127f10
_Internal_errors_What_happened.is_internal = is_internal;
10c90d: 88 15 14 7f 12 00 mov %dl,0x127f14
_Internal_errors_What_happened.the_error = the_error;
10c913: 89 1d 18 7f 12 00 mov %ebx,0x127f18
_User_extensions_Fatal( the_source, is_internal, the_error );
10c919: 53 push %ebx
10c91a: 0f b6 d2 movzbl %dl,%edx
10c91d: 52 push %edx
10c91e: 50 push %eax
10c91f: e8 70 1c 00 00 call 10e594 <_User_extensions_Fatal>
RTEMS_INLINE_ROUTINE void _System_state_Set (
System_state_Codes state
)
{
_System_state_Current = state;
10c924: c7 05 00 80 12 00 05 movl $0x5,0x128000 <== NOT EXECUTED
10c92b: 00 00 00
_System_state_Set( SYSTEM_STATE_FAILED );
_CPU_Fatal_halt( the_error );
10c92e: fa cli <== NOT EXECUTED
10c92f: 89 d8 mov %ebx,%eax <== NOT EXECUTED
10c931: f4 hlt <== NOT EXECUTED
10c932: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c935: eb fe jmp 10c935 <_Internal_error_Occurred+0x3d><== NOT EXECUTED
001115ec <_Objects_API_maximum_class>:
#include <rtems/score/object.h>
unsigned int _Objects_API_maximum_class(
uint32_t api
)
{
1115ec: 55 push %ebp
1115ed: 89 e5 mov %esp,%ebp
1115ef: 8b 45 08 mov 0x8(%ebp),%eax
1115f2: 48 dec %eax
1115f3: 83 f8 02 cmp $0x2,%eax
1115f6: 77 0c ja 111604 <_Objects_API_maximum_class+0x18>
1115f8: 8b 04 85 60 1c 12 00 mov 0x121c60(,%eax,4),%eax
case OBJECTS_NO_API:
default:
break;
}
return 0;
}
1115ff: c9 leave
111600: c3 ret
111601: 8d 76 00 lea 0x0(%esi),%esi
#include <rtems/score/object.h>
unsigned int _Objects_API_maximum_class(
uint32_t api
)
{
111604: 31 c0 xor %eax,%eax
case OBJECTS_NO_API:
default:
break;
}
return 0;
}
111606: c9 leave
111607: c3 ret
0010c988 <_Objects_Allocate>:
*/
Objects_Control *_Objects_Allocate(
Objects_Information *information
)
{
10c988: 55 push %ebp
10c989: 89 e5 mov %esp,%ebp
10c98b: 56 push %esi
10c98c: 53 push %ebx
10c98d: 8b 5d 08 mov 0x8(%ebp),%ebx
* If the application is using the optional manager stubs and
* still attempts to create the object, the information block
* should be all zeroed out because it is in the BSS. So let's
* check that code for this manager is even present.
*/
if ( information->size == 0 )
10c990: 8b 43 18 mov 0x18(%ebx),%eax
10c993: 85 c0 test %eax,%eax
10c995: 75 0d jne 10c9a4 <_Objects_Allocate+0x1c><== ALWAYS TAKEN
return NULL;
10c997: 31 c9 xor %ecx,%ecx <== NOT EXECUTED
);
}
#endif
return the_object;
}
10c999: 89 c8 mov %ecx,%eax
10c99b: 8d 65 f8 lea -0x8(%ebp),%esp
10c99e: 5b pop %ebx
10c99f: 5e pop %esi
10c9a0: c9 leave
10c9a1: c3 ret
10c9a2: 66 90 xchg %ax,%ax
/*
* OK. The manager should be initialized and configured to have objects.
* With any luck, it is safe to attempt to allocate an object.
*/
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
10c9a4: 8d 73 20 lea 0x20(%ebx),%esi
10c9a7: 83 ec 0c sub $0xc,%esp
10c9aa: 56 push %esi
10c9ab: e8 68 f6 ff ff call 10c018 <_Chain_Get>
10c9b0: 89 c1 mov %eax,%ecx
if ( information->auto_extend ) {
10c9b2: 83 c4 10 add $0x10,%esp
10c9b5: 80 7b 12 00 cmpb $0x0,0x12(%ebx)
10c9b9: 74 de je 10c999 <_Objects_Allocate+0x11>
/*
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
10c9bb: 85 c0 test %eax,%eax
10c9bd: 74 29 je 10c9e8 <_Objects_Allocate+0x60>
}
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
10c9bf: 0f b7 41 08 movzwl 0x8(%ecx),%eax
10c9c3: 0f b7 53 08 movzwl 0x8(%ebx),%edx
10c9c7: 29 d0 sub %edx,%eax
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
10c9c9: 0f b7 73 14 movzwl 0x14(%ebx),%esi
10c9cd: 31 d2 xor %edx,%edx
10c9cf: f7 f6 div %esi
information->inactive_per_block[ block ]--;
10c9d1: c1 e0 02 shl $0x2,%eax
10c9d4: 03 43 30 add 0x30(%ebx),%eax
10c9d7: ff 08 decl (%eax)
information->inactive--;
10c9d9: 66 ff 4b 2c decw 0x2c(%ebx)
);
}
#endif
return the_object;
}
10c9dd: 89 c8 mov %ecx,%eax
10c9df: 8d 65 f8 lea -0x8(%ebp),%esp
10c9e2: 5b pop %ebx
10c9e3: 5e pop %esi
10c9e4: c9 leave
10c9e5: c3 ret
10c9e6: 66 90 xchg %ax,%ax
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
_Objects_Extend_information( information );
10c9e8: 83 ec 0c sub $0xc,%esp
10c9eb: 53 push %ebx
10c9ec: e8 3b 00 00 00 call 10ca2c <_Objects_Extend_information>
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
10c9f1: 89 34 24 mov %esi,(%esp)
10c9f4: e8 1f f6 ff ff call 10c018 <_Chain_Get>
10c9f9: 89 c1 mov %eax,%ecx
}
if ( the_object ) {
10c9fb: 83 c4 10 add $0x10,%esp
10c9fe: 85 c0 test %eax,%eax
10ca00: 74 97 je 10c999 <_Objects_Allocate+0x11>
10ca02: eb bb jmp 10c9bf <_Objects_Allocate+0x37>
0010ca2c <_Objects_Extend_information>:
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
10ca2c: 55 push %ebp
10ca2d: 89 e5 mov %esp,%ebp
10ca2f: 57 push %edi
10ca30: 56 push %esi
10ca31: 53 push %ebx
10ca32: 83 ec 4c sub $0x4c,%esp
10ca35: 8b 5d 08 mov 0x8(%ebp),%ebx
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
10ca38: 0f b7 43 08 movzwl 0x8(%ebx),%eax
10ca3c: 89 45 cc mov %eax,-0x34(%ebp)
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
10ca3f: 8b 4b 34 mov 0x34(%ebx),%ecx
10ca42: 85 c9 test %ecx,%ecx
10ca44: 0f 84 66 02 00 00 je 10ccb0 <_Objects_Extend_information+0x284>
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
10ca4a: 8b 73 10 mov 0x10(%ebx),%esi
10ca4d: 66 89 75 d0 mov %si,-0x30(%ebp)
10ca51: 8b 7b 14 mov 0x14(%ebx),%edi
10ca54: 89 f0 mov %esi,%eax
10ca56: 31 d2 xor %edx,%edx
10ca58: 66 f7 f7 div %di
10ca5b: 0f b7 f0 movzwl %ax,%esi
for ( ; block < block_count; block++ ) {
10ca5e: 85 f6 test %esi,%esi
10ca60: 0f 84 63 02 00 00 je 10ccc9 <_Objects_Extend_information+0x29d><== NEVER TAKEN
if ( information->object_blocks[ block ] == NULL ) {
10ca66: 8b 01 mov (%ecx),%eax
10ca68: 85 c0 test %eax,%eax
10ca6a: 0f 84 6b 02 00 00 je 10ccdb <_Objects_Extend_information+0x2af><== NEVER TAKEN
10ca70: 0f b7 ff movzwl %di,%edi
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
10ca73: 8b 55 cc mov -0x34(%ebp),%edx
10ca76: 89 55 d4 mov %edx,-0x2c(%ebp)
index_base = minimum_index;
block = 0;
10ca79: 31 d2 xor %edx,%edx
10ca7b: 8b 45 d4 mov -0x2c(%ebp),%eax
10ca7e: eb 0a jmp 10ca8a <_Objects_Extend_information+0x5e>
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
10ca80: 83 3c 91 00 cmpl $0x0,(%ecx,%edx,4)
10ca84: 0f 84 c6 01 00 00 je 10cc50 <_Objects_Extend_information+0x224>
do_extend = false;
break;
} else
index_base += information->allocation_size;
10ca8a: 01 f8 add %edi,%eax
if ( information->object_blocks == NULL )
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
10ca8c: 42 inc %edx
10ca8d: 39 d6 cmp %edx,%esi
10ca8f: 77 ef ja 10ca80 <_Objects_Extend_information+0x54>
10ca91: 89 45 d4 mov %eax,-0x2c(%ebp)
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
10ca94: b1 01 mov $0x1,%cl
} else
index_base += information->allocation_size;
}
}
maximum = (uint32_t) information->maximum + information->allocation_size;
10ca96: 0f b7 45 d0 movzwl -0x30(%ebp),%eax
10ca9a: 01 f8 add %edi,%eax
10ca9c: 89 45 d0 mov %eax,-0x30(%ebp)
/*
* We need to limit the number of objects to the maximum number
* representable in the index portion of the object Id. In the
* case of 16-bit Ids, this is only 256 object instances.
*/
if ( maximum > OBJECTS_ID_FINAL_INDEX ) {
10ca9f: 3d ff ff 00 00 cmp $0xffff,%eax
10caa4: 0f 87 9e 01 00 00 ja 10cc48 <_Objects_Extend_information+0x21c><== NEVER TAKEN
/*
* Allocate the name table, and the objects and if it fails either return or
* generate a fatal error depending on auto-extending being active.
*/
block_size = information->allocation_size * information->size;
10caaa: 0f af 7b 18 imul 0x18(%ebx),%edi
if ( information->auto_extend ) {
10caae: 80 7b 12 00 cmpb $0x0,0x12(%ebx)
10cab2: 0f 84 a4 01 00 00 je 10cc5c <_Objects_Extend_information+0x230>
new_object_block = _Workspace_Allocate( block_size );
10cab8: 83 ec 0c sub $0xc,%esp
10cabb: 57 push %edi
10cabc: 89 55 b8 mov %edx,-0x48(%ebp)
10cabf: 88 4d b4 mov %cl,-0x4c(%ebp)
10cac2: e8 99 1e 00 00 call 10e960 <_Workspace_Allocate>
10cac7: 89 45 c8 mov %eax,-0x38(%ebp)
if ( !new_object_block )
10caca: 83 c4 10 add $0x10,%esp
10cacd: 85 c0 test %eax,%eax
10cacf: 8b 55 b8 mov -0x48(%ebp),%edx
10cad2: 8a 4d b4 mov -0x4c(%ebp),%cl
10cad5: 0f 84 6d 01 00 00 je 10cc48 <_Objects_Extend_information+0x21c>
}
/*
* Do we need to grow the tables?
*/
if ( do_extend ) {
10cadb: 84 c9 test %cl,%cl
10cadd: 0f 84 ea 00 00 00 je 10cbcd <_Objects_Extend_information+0x1a1>
*/
/*
* Up the block count and maximum
*/
block_count++;
10cae3: 8d 7e 01 lea 0x1(%esi),%edi
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
object_blocks = (void**) _Workspace_Allocate( block_size );
10cae6: 83 ec 0c sub $0xc,%esp
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
10cae9: 8d 04 7f lea (%edi,%edi,2),%eax
((maximum + minimum_index) * sizeof(Objects_Control *));
10caec: 03 45 d0 add -0x30(%ebp),%eax
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
10caef: 03 45 cc add -0x34(%ebp),%eax
block_count++;
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
10caf2: c1 e0 02 shl $0x2,%eax
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
object_blocks = (void**) _Workspace_Allocate( block_size );
10caf5: 50 push %eax
10caf6: 89 55 b8 mov %edx,-0x48(%ebp)
10caf9: e8 62 1e 00 00 call 10e960 <_Workspace_Allocate>
10cafe: 89 45 c4 mov %eax,-0x3c(%ebp)
if ( !object_blocks ) {
10cb01: 83 c4 10 add $0x10,%esp
10cb04: 85 c0 test %eax,%eax
10cb06: 8b 55 b8 mov -0x48(%ebp),%edx
10cb09: 0f 84 de 01 00 00 je 10cced <_Objects_Extend_information+0x2c1>
10cb0f: 8b 45 c4 mov -0x3c(%ebp),%eax
10cb12: 8d 04 b8 lea (%eax,%edi,4),%eax
10cb15: 89 45 bc mov %eax,-0x44(%ebp)
10cb18: 8b 4d c4 mov -0x3c(%ebp),%ecx
10cb1b: 8d 04 f9 lea (%ecx,%edi,8),%eax
* Take the block count down. Saves all the (block_count - 1)
* in the copies.
*/
block_count--;
if ( information->maximum > minimum_index ) {
10cb1e: 0f b7 4b 10 movzwl 0x10(%ebx),%ecx
10cb22: 39 4d cc cmp %ecx,-0x34(%ebp)
10cb25: 0f 82 51 01 00 00 jb 10cc7c <_Objects_Extend_information+0x250>
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
10cb2b: 8b 4d cc mov -0x34(%ebp),%ecx
10cb2e: 85 c9 test %ecx,%ecx
10cb30: 74 12 je 10cb44 <_Objects_Extend_information+0x118><== NEVER TAKEN
10cb32: 31 c9 xor %ecx,%ecx
10cb34: 8b 7d cc mov -0x34(%ebp),%edi
10cb37: 90 nop
local_table[ index ] = NULL;
10cb38: c7 04 88 00 00 00 00 movl $0x0,(%eax,%ecx,4)
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
10cb3f: 41 inc %ecx
10cb40: 39 cf cmp %ecx,%edi
10cb42: 77 f4 ja 10cb38 <_Objects_Extend_information+0x10c><== NEVER TAKEN
10cb44: c1 e6 02 shl $0x2,%esi
10cb47: 89 75 c0 mov %esi,-0x40(%ebp)
}
/*
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
10cb4a: 8b 4d c4 mov -0x3c(%ebp),%ecx
10cb4d: 8b 75 c0 mov -0x40(%ebp),%esi
10cb50: c7 04 31 00 00 00 00 movl $0x0,(%ecx,%esi,1)
inactive_per_block[block_count] = 0;
10cb57: 8b 4d bc mov -0x44(%ebp),%ecx
10cb5a: c7 04 31 00 00 00 00 movl $0x0,(%ecx,%esi,1)
for ( index=index_base ;
index < ( information->allocation_size + index_base );
10cb61: 0f b7 73 14 movzwl 0x14(%ebx),%esi
10cb65: 03 75 d4 add -0x2c(%ebp),%esi
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
10cb68: 39 75 d4 cmp %esi,-0x2c(%ebp)
10cb6b: 73 0f jae 10cb7c <_Objects_Extend_information+0x150><== NEVER TAKEN
10cb6d: 8b 4d d4 mov -0x2c(%ebp),%ecx
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
10cb70: c7 04 88 00 00 00 00 movl $0x0,(%eax,%ecx,4)
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
index++ ) {
10cb77: 41 inc %ecx
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
10cb78: 39 f1 cmp %esi,%ecx
10cb7a: 72 f4 jb 10cb70 <_Objects_Extend_information+0x144>
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
}
_ISR_Disable( level );
10cb7c: 9c pushf
10cb7d: fa cli
10cb7e: 5f pop %edi
old_tables = information->object_blocks;
10cb7f: 8b 4b 34 mov 0x34(%ebx),%ecx
information->object_blocks = object_blocks;
10cb82: 8b 75 c4 mov -0x3c(%ebp),%esi
10cb85: 89 73 34 mov %esi,0x34(%ebx)
information->inactive_per_block = inactive_per_block;
10cb88: 8b 75 bc mov -0x44(%ebp),%esi
10cb8b: 89 73 30 mov %esi,0x30(%ebx)
information->local_table = local_table;
10cb8e: 89 43 1c mov %eax,0x1c(%ebx)
information->maximum = (Objects_Maximum) maximum;
10cb91: 8b 45 d0 mov -0x30(%ebp),%eax
10cb94: 66 89 43 10 mov %ax,0x10(%ebx)
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
10cb98: 8b 33 mov (%ebx),%esi
10cb9a: c1 e6 18 shl $0x18,%esi
10cb9d: 81 ce 00 00 01 00 or $0x10000,%esi
information->maximum_id = _Objects_Build_id(
10cba3: 0f b7 43 04 movzwl 0x4(%ebx),%eax
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
10cba7: c1 e0 1b shl $0x1b,%eax
10cbaa: 09 c6 or %eax,%esi
10cbac: 0f b7 45 d0 movzwl -0x30(%ebp),%eax
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
10cbb0: 09 c6 or %eax,%esi
10cbb2: 89 73 0c mov %esi,0xc(%ebx)
information->the_class,
_Objects_Local_node,
information->maximum
);
_ISR_Enable( level );
10cbb5: 57 push %edi
10cbb6: 9d popf
if ( old_tables )
10cbb7: 85 c9 test %ecx,%ecx
10cbb9: 74 12 je 10cbcd <_Objects_Extend_information+0x1a1>
_Workspace_Free( old_tables );
10cbbb: 83 ec 0c sub $0xc,%esp
10cbbe: 51 push %ecx
10cbbf: 89 55 b8 mov %edx,-0x48(%ebp)
10cbc2: e8 b5 1d 00 00 call 10e97c <_Workspace_Free>
10cbc7: 83 c4 10 add $0x10,%esp
10cbca: 8b 55 b8 mov -0x48(%ebp),%edx
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
10cbcd: c1 e2 02 shl $0x2,%edx
10cbd0: 89 55 d0 mov %edx,-0x30(%ebp)
10cbd3: 8b 43 34 mov 0x34(%ebx),%eax
10cbd6: 8b 4d c8 mov -0x38(%ebp),%ecx
10cbd9: 89 0c 10 mov %ecx,(%eax,%edx,1)
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
10cbdc: ff 73 18 pushl 0x18(%ebx)
10cbdf: 0f b7 43 14 movzwl 0x14(%ebx),%eax
10cbe3: 50 push %eax
10cbe4: 51 push %ecx
10cbe5: 8d 7d dc lea -0x24(%ebp),%edi
10cbe8: 57 push %edi
10cbe9: e8 66 44 00 00 call 111054 <_Chain_Initialize>
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
10cbee: 83 c4 10 add $0x10,%esp
10cbf1: 8b 75 d4 mov -0x2c(%ebp),%esi
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
10cbf4: 8d 43 20 lea 0x20(%ebx),%eax
10cbf7: 89 45 d4 mov %eax,-0x2c(%ebp)
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
10cbfa: eb 29 jmp 10cc25 <_Objects_Extend_information+0x1f9>
10cbfc: 8b 13 mov (%ebx),%edx
10cbfe: c1 e2 18 shl $0x18,%edx
10cc01: 81 ca 00 00 01 00 or $0x10000,%edx
the_object->id = _Objects_Build_id(
10cc07: 0f b7 4b 04 movzwl 0x4(%ebx),%ecx
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
10cc0b: c1 e1 1b shl $0x1b,%ecx
10cc0e: 09 ca or %ecx,%edx
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
10cc10: 09 f2 or %esi,%edx
10cc12: 89 50 08 mov %edx,0x8(%eax)
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
10cc15: 83 ec 08 sub $0x8,%esp
10cc18: 50 push %eax
10cc19: ff 75 d4 pushl -0x2c(%ebp)
10cc1c: e8 bb f3 ff ff call 10bfdc <_Chain_Append>
index++;
10cc21: 46 inc %esi
10cc22: 83 c4 10 add $0x10,%esp
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
10cc25: 83 ec 0c sub $0xc,%esp
10cc28: 57 push %edi
10cc29: e8 ea f3 ff ff call 10c018 <_Chain_Get>
10cc2e: 83 c4 10 add $0x10,%esp
10cc31: 85 c0 test %eax,%eax
10cc33: 75 c7 jne 10cbfc <_Objects_Extend_information+0x1d0>
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
10cc35: 8b 43 14 mov 0x14(%ebx),%eax
10cc38: 8b 53 30 mov 0x30(%ebx),%edx
10cc3b: 0f b7 c8 movzwl %ax,%ecx
10cc3e: 8b 75 d0 mov -0x30(%ebp),%esi
10cc41: 89 0c 32 mov %ecx,(%edx,%esi,1)
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
10cc44: 66 01 43 2c add %ax,0x2c(%ebx)
}
10cc48: 8d 65 f4 lea -0xc(%ebp),%esp
10cc4b: 5b pop %ebx
10cc4c: 5e pop %esi
10cc4d: 5f pop %edi
10cc4e: c9 leave
10cc4f: c3 ret
10cc50: 89 45 d4 mov %eax,-0x2c(%ebp)
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
do_extend = false;
10cc53: 31 c9 xor %ecx,%ecx
10cc55: e9 3c fe ff ff jmp 10ca96 <_Objects_Extend_information+0x6a>
10cc5a: 66 90 xchg %ax,%ax
if ( information->auto_extend ) {
new_object_block = _Workspace_Allocate( block_size );
if ( !new_object_block )
return;
} else {
new_object_block = _Workspace_Allocate_or_fatal_error( block_size );
10cc5c: 83 ec 0c sub $0xc,%esp
10cc5f: 57 push %edi
10cc60: 89 55 b8 mov %edx,-0x48(%ebp)
10cc63: 88 4d b4 mov %cl,-0x4c(%ebp)
10cc66: e8 29 1d 00 00 call 10e994 <_Workspace_Allocate_or_fatal_error>
10cc6b: 89 45 c8 mov %eax,-0x38(%ebp)
10cc6e: 83 c4 10 add $0x10,%esp
10cc71: 8a 4d b4 mov -0x4c(%ebp),%cl
10cc74: 8b 55 b8 mov -0x48(%ebp),%edx
10cc77: e9 5f fe ff ff jmp 10cadb <_Objects_Extend_information+0xaf>
/*
* Copy each section of the table over. This has to be performed as
* separate parts as size of each block has changed.
*/
memcpy( object_blocks,
10cc7c: c1 e6 02 shl $0x2,%esi
10cc7f: 89 75 c0 mov %esi,-0x40(%ebp)
10cc82: 8b 73 34 mov 0x34(%ebx),%esi
10cc85: 8b 7d c4 mov -0x3c(%ebp),%edi
10cc88: 8b 4d c0 mov -0x40(%ebp),%ecx
10cc8b: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
10cc8d: 8b 73 30 mov 0x30(%ebx),%esi
10cc90: 8b 7d bc mov -0x44(%ebp),%edi
10cc93: 8b 4d c0 mov -0x40(%ebp),%ecx
10cc96: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
information->local_table,
(information->maximum + minimum_index) * sizeof(Objects_Control *) );
10cc98: 0f b7 4b 10 movzwl 0x10(%ebx),%ecx
10cc9c: 03 4d cc add -0x34(%ebp),%ecx
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
10cc9f: c1 e1 02 shl $0x2,%ecx
10cca2: 8b 73 1c mov 0x1c(%ebx),%esi
10cca5: 89 c7 mov %eax,%edi
10cca7: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
10cca9: e9 9c fe ff ff jmp 10cb4a <_Objects_Extend_information+0x11e>
10ccae: 66 90 xchg %ax,%ax
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
10ccb0: 8b 53 10 mov 0x10(%ebx),%edx
10ccb3: 66 89 55 d0 mov %dx,-0x30(%ebp)
10ccb7: 0f b7 7b 14 movzwl 0x14(%ebx),%edi
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
10ccbb: 89 45 d4 mov %eax,-0x2c(%ebp)
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
10ccbe: b1 01 mov $0x1,%cl
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
10ccc0: 31 d2 xor %edx,%edx
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
block_count = 0;
10ccc2: 31 f6 xor %esi,%esi
10ccc4: e9 cd fd ff ff jmp 10ca96 <_Objects_Extend_information+0x6a>
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
10ccc9: 0f b7 ff movzwl %di,%edi <== NOT EXECUTED
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
10cccc: 8b 45 cc mov -0x34(%ebp),%eax <== NOT EXECUTED
10cccf: 89 45 d4 mov %eax,-0x2c(%ebp) <== NOT EXECUTED
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
10ccd2: b1 01 mov $0x1,%cl <== NOT EXECUTED
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
10ccd4: 31 d2 xor %edx,%edx <== NOT EXECUTED
10ccd6: e9 bb fd ff ff jmp 10ca96 <_Objects_Extend_information+0x6a><== NOT EXECUTED
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
10ccdb: 0f b7 ff movzwl %di,%edi <== NOT EXECUTED
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
10ccde: 8b 4d cc mov -0x34(%ebp),%ecx <== NOT EXECUTED
10cce1: 89 4d d4 mov %ecx,-0x2c(%ebp) <== NOT EXECUTED
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
do_extend = false;
10cce4: 31 c9 xor %ecx,%ecx <== NOT EXECUTED
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
10cce6: 31 d2 xor %edx,%edx <== NOT EXECUTED
10cce8: e9 a9 fd ff ff jmp 10ca96 <_Objects_Extend_information+0x6a><== NOT EXECUTED
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
object_blocks = (void**) _Workspace_Allocate( block_size );
if ( !object_blocks ) {
_Workspace_Free( new_object_block );
10cced: 83 ec 0c sub $0xc,%esp
10ccf0: ff 75 c8 pushl -0x38(%ebp)
10ccf3: e8 84 1c 00 00 call 10e97c <_Workspace_Free>
return;
10ccf8: 83 c4 10 add $0x10,%esp
10ccfb: e9 48 ff ff ff jmp 10cc48 <_Objects_Extend_information+0x21c>
0010cd90 <_Objects_Get_information>:
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
10cd90: 55 push %ebp
10cd91: 89 e5 mov %esp,%ebp
10cd93: 56 push %esi
10cd94: 53 push %ebx
10cd95: 8b 75 08 mov 0x8(%ebp),%esi
10cd98: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
10cd9b: 66 85 db test %bx,%bx
10cd9e: 75 0c jne 10cdac <_Objects_Get_information+0x1c>
the_class_api_maximum = _Objects_API_maximum_class( the_api );
if ( the_class_api_maximum == 0 )
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
return NULL;
10cda0: 31 c0 xor %eax,%eax
if ( info->maximum == 0 )
return NULL;
#endif
return info;
}
10cda2: 8d 65 f8 lea -0x8(%ebp),%esp
10cda5: 5b pop %ebx
10cda6: 5e pop %esi
10cda7: c9 leave
10cda8: c3 ret
10cda9: 8d 76 00 lea 0x0(%esi),%esi
/*
* This call implicitly validates the_api so we do not call
* _Objects_Is_api_valid above here.
*/
the_class_api_maximum = _Objects_API_maximum_class( the_api );
10cdac: 83 ec 0c sub $0xc,%esp
10cdaf: 56 push %esi
10cdb0: e8 37 48 00 00 call 1115ec <_Objects_API_maximum_class>
if ( the_class_api_maximum == 0 )
10cdb5: 83 c4 10 add $0x10,%esp
10cdb8: 85 c0 test %eax,%eax
10cdba: 74 e4 je 10cda0 <_Objects_Get_information+0x10>
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
10cdbc: 0f b7 db movzwl %bx,%ebx
10cdbf: 39 d8 cmp %ebx,%eax
10cdc1: 72 dd jb 10cda0 <_Objects_Get_information+0x10>
return NULL;
if ( !_Objects_Information_table[ the_api ] )
10cdc3: 8b 14 b5 08 7e 12 00 mov 0x127e08(,%esi,4),%edx
return NULL;
10cdca: 31 c0 xor %eax,%eax
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
return NULL;
if ( !_Objects_Information_table[ the_api ] )
10cdcc: 85 d2 test %edx,%edx
10cdce: 74 d2 je 10cda2 <_Objects_Get_information+0x12><== NEVER TAKEN
return NULL;
info = _Objects_Information_table[ the_api ][ the_class ];
10cdd0: 8b 04 9a mov (%edx,%ebx,4),%eax
if ( !info )
10cdd3: 85 c0 test %eax,%eax
10cdd5: 74 cb je 10cda2 <_Objects_Get_information+0x12><== NEVER TAKEN
* Thus we may have 0 local instances and still have a valid object
* pointer.
*/
#if !defined(RTEMS_MULTIPROCESSING)
if ( info->maximum == 0 )
return NULL;
10cdd7: 31 d2 xor %edx,%edx
10cdd9: 66 83 78 10 00 cmpw $0x0,0x10(%eax)
10cdde: 0f 95 c2 setne %dl
10cde1: f7 da neg %edx
10cde3: 21 d0 and %edx,%eax
10cde5: eb bb jmp 10cda2 <_Objects_Get_information+0x12>
0010cde8 <_Objects_Get_isr_disable>:
Objects_Information *information,
Objects_Id id,
Objects_Locations *location,
ISR_Level *level_p
)
{
10cde8: 55 push %ebp
10cde9: 89 e5 mov %esp,%ebp
10cdeb: 56 push %esi
10cdec: 53 push %ebx
10cded: 8b 55 08 mov 0x8(%ebp),%edx
10cdf0: 8b 5d 10 mov 0x10(%ebp),%ebx
Objects_Control *the_object;
uint32_t index;
ISR_Level level;
index = id - information->minimum_id + 1;
10cdf3: b8 01 00 00 00 mov $0x1,%eax
10cdf8: 2b 42 08 sub 0x8(%edx),%eax
10cdfb: 03 45 0c add 0xc(%ebp),%eax
_ISR_Disable( level );
10cdfe: 9c pushf
10cdff: fa cli
10ce00: 5e pop %esi
if ( information->maximum >= index ) {
10ce01: 0f b7 4a 10 movzwl 0x10(%edx),%ecx
10ce05: 39 c8 cmp %ecx,%eax
10ce07: 77 1b ja 10ce24 <_Objects_Get_isr_disable+0x3c>
if ( (the_object = information->local_table[ index ]) != NULL ) {
10ce09: 8b 52 1c mov 0x1c(%edx),%edx
10ce0c: 8b 04 82 mov (%edx,%eax,4),%eax
10ce0f: 85 c0 test %eax,%eax
10ce11: 74 21 je 10ce34 <_Objects_Get_isr_disable+0x4c>
*location = OBJECTS_LOCAL;
10ce13: c7 03 00 00 00 00 movl $0x0,(%ebx)
*level_p = level;
10ce19: 8b 55 14 mov 0x14(%ebp),%edx
10ce1c: 89 32 mov %esi,(%edx)
_Objects_MP_Is_remote( information, id, location, &the_object );
return the_object;
#else
return NULL;
#endif
}
10ce1e: 5b pop %ebx
10ce1f: 5e pop %esi
10ce20: c9 leave
10ce21: c3 ret
10ce22: 66 90 xchg %ax,%ax
}
_ISR_Enable( level );
*location = OBJECTS_ERROR;
return NULL;
}
_ISR_Enable( level );
10ce24: 56 push %esi
10ce25: 9d popf
*location = OBJECTS_ERROR;
10ce26: c7 03 01 00 00 00 movl $0x1,(%ebx)
#if defined(RTEMS_MULTIPROCESSING)
_Objects_MP_Is_remote( information, id, location, &the_object );
return the_object;
#else
return NULL;
10ce2c: 31 c0 xor %eax,%eax
#endif
}
10ce2e: 5b pop %ebx
10ce2f: 5e pop %esi
10ce30: c9 leave
10ce31: c3 ret
10ce32: 66 90 xchg %ax,%ax
if ( (the_object = information->local_table[ index ]) != NULL ) {
*location = OBJECTS_LOCAL;
*level_p = level;
return the_object;
}
_ISR_Enable( level );
10ce34: 56 push %esi
10ce35: 9d popf
*location = OBJECTS_ERROR;
10ce36: c7 03 01 00 00 00 movl $0x1,(%ebx)
return NULL;
10ce3c: eb e0 jmp 10ce1e <_Objects_Get_isr_disable+0x36>
0010e4d8 <_Objects_Get_name_as_string>:
char *_Objects_Get_name_as_string(
Objects_Id id,
size_t length,
char *name
)
{
10e4d8: 55 push %ebp
10e4d9: 89 e5 mov %esp,%ebp
10e4db: 57 push %edi
10e4dc: 56 push %esi
10e4dd: 53 push %ebx
10e4de: 83 ec 2c sub $0x2c,%esp
10e4e1: 8b 55 08 mov 0x8(%ebp),%edx
10e4e4: 8b 75 0c mov 0xc(%ebp),%esi
10e4e7: 8b 5d 10 mov 0x10(%ebp),%ebx
char lname[5];
Objects_Control *the_object;
Objects_Locations location;
Objects_Id tmpId;
if ( length == 0 )
10e4ea: 85 f6 test %esi,%esi
10e4ec: 75 0e jne 10e4fc <_Objects_Get_name_as_string+0x24>
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE:
/* not supported */
#endif
case OBJECTS_ERROR:
return NULL;
10e4ee: 31 db xor %ebx,%ebx
_Thread_Enable_dispatch();
return name;
}
return NULL; /* unreachable path */
}
10e4f0: 89 d8 mov %ebx,%eax
10e4f2: 8d 65 f4 lea -0xc(%ebp),%esp
10e4f5: 5b pop %ebx
10e4f6: 5e pop %esi
10e4f7: 5f pop %edi
10e4f8: c9 leave
10e4f9: c3 ret
10e4fa: 66 90 xchg %ax,%ax
Objects_Id tmpId;
if ( length == 0 )
return NULL;
if ( name == NULL )
10e4fc: 85 db test %ebx,%ebx
10e4fe: 74 f0 je 10e4f0 <_Objects_Get_name_as_string+0x18>
return NULL;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
10e500: 85 d2 test %edx,%edx
10e502: 75 08 jne 10e50c <_Objects_Get_name_as_string+0x34>
10e504: a1 78 3a 13 00 mov 0x133a78,%eax
10e509: 8b 50 08 mov 0x8(%eax),%edx
information = _Objects_Get_information_id( tmpId );
10e50c: 83 ec 0c sub $0xc,%esp
10e50f: 52 push %edx
10e510: 89 55 cc mov %edx,-0x34(%ebp)
10e513: e8 f0 fe ff ff call 10e408 <_Objects_Get_information_id>
10e518: 89 c7 mov %eax,%edi
if ( !information )
10e51a: 83 c4 10 add $0x10,%esp
10e51d: 85 c0 test %eax,%eax
10e51f: 8b 55 cc mov -0x34(%ebp),%edx
10e522: 74 ca je 10e4ee <_Objects_Get_name_as_string+0x16>
return NULL;
the_object = _Objects_Get( information, tmpId, &location );
10e524: 51 push %ecx
10e525: 8d 45 e4 lea -0x1c(%ebp),%eax
10e528: 50 push %eax
10e529: 52 push %edx
10e52a: 57 push %edi
10e52b: e8 90 00 00 00 call 10e5c0 <_Objects_Get>
switch ( location ) {
10e530: 83 c4 10 add $0x10,%esp
10e533: 8b 55 e4 mov -0x1c(%ebp),%edx
10e536: 85 d2 test %edx,%edx
10e538: 75 b4 jne 10e4ee <_Objects_Get_name_as_string+0x16>
return NULL;
case OBJECTS_LOCAL:
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
10e53a: 80 7f 38 00 cmpb $0x0,0x38(%edi)
10e53e: 74 54 je 10e594 <_Objects_Get_name_as_string+0xbc>
s = the_object->name.name_p;
10e540: 8b 78 0c mov 0xc(%eax),%edi
lname[ 4 ] = '\0';
s = lname;
}
d = name;
if ( s ) {
10e543: 85 ff test %edi,%edi
10e545: 74 74 je 10e5bb <_Objects_Get_name_as_string+0xe3>
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
10e547: 4e dec %esi
10e548: 89 75 d4 mov %esi,-0x2c(%ebp)
10e54b: 74 6e je 10e5bb <_Objects_Get_name_as_string+0xe3><== NEVER TAKEN
10e54d: 8a 17 mov (%edi),%dl
10e54f: 84 d2 test %dl,%dl
10e551: 74 68 je 10e5bb <_Objects_Get_name_as_string+0xe3>
10e553: 89 d9 mov %ebx,%ecx
10e555: 31 c0 xor %eax,%eax
10e557: 89 5d d0 mov %ebx,-0x30(%ebp)
10e55a: eb 07 jmp 10e563 <_Objects_Get_name_as_string+0x8b>
10e55c: 8a 14 07 mov (%edi,%eax,1),%dl
10e55f: 84 d2 test %dl,%dl
10e561: 74 21 je 10e584 <_Objects_Get_name_as_string+0xac>
*d = (isprint((unsigned char)*s)) ? *s : '*';
10e563: 0f b6 da movzbl %dl,%ebx
10e566: 8b 35 48 93 12 00 mov 0x129348,%esi
10e56c: 0f be 5c 1e 01 movsbl 0x1(%esi,%ebx,1),%ebx
10e571: 81 e3 97 00 00 00 and $0x97,%ebx
10e577: 75 02 jne 10e57b <_Objects_Get_name_as_string+0xa3>
10e579: b2 2a mov $0x2a,%dl
10e57b: 88 11 mov %dl,(%ecx)
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
10e57d: 40 inc %eax
10e57e: 41 inc %ecx
10e57f: 3b 45 d4 cmp -0x2c(%ebp),%eax
10e582: 72 d8 jb 10e55c <_Objects_Get_name_as_string+0x84>
10e584: 8b 5d d0 mov -0x30(%ebp),%ebx
*d = (isprint((unsigned char)*s)) ? *s : '*';
}
}
*d = '\0';
10e587: c6 01 00 movb $0x0,(%ecx)
_Thread_Enable_dispatch();
10e58a: e8 e5 0a 00 00 call 10f074 <_Thread_Enable_dispatch>
return name;
10e58f: e9 5c ff ff ff jmp 10e4f0 <_Objects_Get_name_as_string+0x18>
if ( information->is_string ) {
s = the_object->name.name_p;
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
10e594: 8b 40 0c mov 0xc(%eax),%eax
lname[ 0 ] = (u32_name >> 24) & 0xff;
10e597: 89 c2 mov %eax,%edx
10e599: c1 ea 18 shr $0x18,%edx
10e59c: 88 55 df mov %dl,-0x21(%ebp)
lname[ 1 ] = (u32_name >> 16) & 0xff;
10e59f: 89 c2 mov %eax,%edx
10e5a1: c1 ea 10 shr $0x10,%edx
10e5a4: 88 55 e0 mov %dl,-0x20(%ebp)
lname[ 2 ] = (u32_name >> 8) & 0xff;
10e5a7: 89 c2 mov %eax,%edx
10e5a9: c1 ea 08 shr $0x8,%edx
10e5ac: 88 55 e1 mov %dl,-0x1f(%ebp)
lname[ 3 ] = (u32_name >> 0) & 0xff;
10e5af: 88 45 e2 mov %al,-0x1e(%ebp)
lname[ 4 ] = '\0';
10e5b2: c6 45 e3 00 movb $0x0,-0x1d(%ebp)
s = lname;
10e5b6: 8d 7d df lea -0x21(%ebp),%edi
10e5b9: eb 8c jmp 10e547 <_Objects_Get_name_as_string+0x6f>
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
10e5bb: 89 d9 mov %ebx,%ecx
10e5bd: eb c8 jmp 10e587 <_Objects_Get_name_as_string+0xaf>
0010cf98 <_Objects_Get_next>:
Objects_Information *information,
Objects_Id id,
Objects_Locations *location_p,
Objects_Id *next_id_p
)
{
10cf98: 55 push %ebp
10cf99: 89 e5 mov %esp,%ebp
10cf9b: 57 push %edi
10cf9c: 56 push %esi
10cf9d: 53 push %ebx
10cf9e: 83 ec 0c sub $0xc,%esp
10cfa1: 8b 5d 08 mov 0x8(%ebp),%ebx
10cfa4: 8b 75 0c mov 0xc(%ebp),%esi
10cfa7: 8b 7d 10 mov 0x10(%ebp),%edi
Objects_Control *object;
Objects_Id next_id;
if ( !information )
10cfaa: 85 db test %ebx,%ebx
10cfac: 75 0a jne 10cfb8 <_Objects_Get_next+0x20>
if ( !location_p )
return NULL;
if ( !next_id_p )
return NULL;
10cfae: 31 c0 xor %eax,%eax
return object;
final:
*next_id_p = OBJECTS_ID_FINAL;
return 0;
}
10cfb0: 8d 65 f4 lea -0xc(%ebp),%esp
10cfb3: 5b pop %ebx
10cfb4: 5e pop %esi
10cfb5: 5f pop %edi
10cfb6: c9 leave
10cfb7: c3 ret
Objects_Id next_id;
if ( !information )
return NULL;
if ( !location_p )
10cfb8: 85 ff test %edi,%edi
10cfba: 74 f2 je 10cfae <_Objects_Get_next+0x16>
return NULL;
if ( !next_id_p )
10cfbc: 8b 45 14 mov 0x14(%ebp),%eax
10cfbf: 85 c0 test %eax,%eax
10cfc1: 74 eb je 10cfae <_Objects_Get_next+0x16>
return NULL;
if (_Objects_Get_index(id) == OBJECTS_ID_INITIAL_INDEX)
10cfc3: 66 85 f6 test %si,%si
10cfc6: 75 04 jne 10cfcc <_Objects_Get_next+0x34>
next_id = information->minimum_id;
10cfc8: 8b 73 08 mov 0x8(%ebx),%esi
10cfcb: 90 nop
else
next_id = id;
do {
/* walked off end of list? */
if (_Objects_Get_index(next_id) > information->maximum)
10cfcc: 66 39 73 10 cmp %si,0x10(%ebx)
10cfd0: 72 22 jb 10cff4 <_Objects_Get_next+0x5c>
*location_p = OBJECTS_ERROR;
goto final;
}
/* try to grab one */
object = _Objects_Get(information, next_id, location_p);
10cfd2: 51 push %ecx
10cfd3: 57 push %edi
10cfd4: 56 push %esi
10cfd5: 53 push %ebx
10cfd6: e8 2d 00 00 00 call 10d008 <_Objects_Get>
next_id++;
10cfdb: 46 inc %esi
} while (*location_p != OBJECTS_LOCAL);
10cfdc: 83 c4 10 add $0x10,%esp
10cfdf: 8b 17 mov (%edi),%edx
10cfe1: 85 d2 test %edx,%edx
10cfe3: 75 e7 jne 10cfcc <_Objects_Get_next+0x34>
*next_id_p = next_id;
10cfe5: 8b 55 14 mov 0x14(%ebp),%edx
10cfe8: 89 32 mov %esi,(%edx)
return object;
final:
*next_id_p = OBJECTS_ID_FINAL;
return 0;
}
10cfea: 8d 65 f4 lea -0xc(%ebp),%esp
10cfed: 5b pop %ebx
10cfee: 5e pop %esi
10cfef: 5f pop %edi
10cff0: c9 leave
10cff1: c3 ret
10cff2: 66 90 xchg %ax,%ax
do {
/* walked off end of list? */
if (_Objects_Get_index(next_id) > information->maximum)
{
*location_p = OBJECTS_ERROR;
10cff4: c7 07 01 00 00 00 movl $0x1,(%edi)
*next_id_p = next_id;
return object;
final:
*next_id_p = OBJECTS_ID_FINAL;
10cffa: 8b 45 14 mov 0x14(%ebp),%eax
10cffd: c7 00 ff ff ff ff movl $0xffffffff,(%eax)
return 0;
10d003: 31 c0 xor %eax,%eax
10d005: eb a9 jmp 10cfb0 <_Objects_Get_next+0x18>
0011b2a8 <_Objects_Get_no_protection>:
Objects_Control *_Objects_Get_no_protection(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
11b2a8: 55 push %ebp
11b2a9: 89 e5 mov %esp,%ebp
11b2ab: 53 push %ebx
11b2ac: 8b 55 08 mov 0x8(%ebp),%edx
11b2af: 8b 5d 10 mov 0x10(%ebp),%ebx
/*
* You can't just extract the index portion or you can get tricked
* by a value between 1 and maximum.
*/
index = id - information->minimum_id + 1;
11b2b2: b8 01 00 00 00 mov $0x1,%eax
11b2b7: 2b 42 08 sub 0x8(%edx),%eax
11b2ba: 03 45 0c add 0xc(%ebp),%eax
if ( information->maximum >= index ) {
11b2bd: 0f b7 4a 10 movzwl 0x10(%edx),%ecx
11b2c1: 39 c8 cmp %ecx,%eax
11b2c3: 77 13 ja 11b2d8 <_Objects_Get_no_protection+0x30>
if ( (the_object = information->local_table[ index ]) != NULL ) {
11b2c5: 8b 52 1c mov 0x1c(%edx),%edx
11b2c8: 8b 04 82 mov (%edx,%eax,4),%eax
11b2cb: 85 c0 test %eax,%eax
11b2cd: 74 09 je 11b2d8 <_Objects_Get_no_protection+0x30><== NEVER TAKEN
*location = OBJECTS_LOCAL;
11b2cf: c7 03 00 00 00 00 movl $0x0,(%ebx)
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
return NULL;
}
11b2d5: 5b pop %ebx
11b2d6: c9 leave
11b2d7: c3 ret
/*
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
11b2d8: c7 03 01 00 00 00 movl $0x1,(%ebx)
return NULL;
11b2de: 31 c0 xor %eax,%eax
}
11b2e0: 5b pop %ebx
11b2e1: c9 leave
11b2e2: c3 ret
0010e0ec <_Objects_Id_to_name>:
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
10e0ec: 55 push %ebp
10e0ed: 89 e5 mov %esp,%ebp
10e0ef: 83 ec 18 sub $0x18,%esp
10e0f2: 8b 55 08 mov 0x8(%ebp),%edx
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
10e0f5: 85 d2 test %edx,%edx
10e0f7: 75 08 jne 10e101 <_Objects_Id_to_name+0x15>
10e0f9: a1 38 b0 12 00 mov 0x12b038,%eax
10e0fe: 8b 50 08 mov 0x8(%eax),%edx
10e101: 89 d0 mov %edx,%eax
10e103: c1 e8 18 shr $0x18,%eax
10e106: 83 e0 07 and $0x7,%eax
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
10e109: 8d 48 ff lea -0x1(%eax),%ecx
10e10c: 83 f9 02 cmp $0x2,%ecx
10e10f: 77 1d ja 10e12e <_Objects_Id_to_name+0x42>
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
if ( !_Objects_Information_table[ the_api ] )
10e111: 8b 04 85 28 aa 12 00 mov 0x12aa28(,%eax,4),%eax
10e118: 85 c0 test %eax,%eax
10e11a: 74 12 je 10e12e <_Objects_Id_to_name+0x42>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
10e11c: 89 d1 mov %edx,%ecx
10e11e: c1 e9 1b shr $0x1b,%ecx
return OBJECTS_INVALID_ID;
the_class = _Objects_Get_class( tmpId );
information = _Objects_Information_table[ the_api ][ the_class ];
10e121: 8b 04 88 mov (%eax,%ecx,4),%eax
if ( !information )
10e124: 85 c0 test %eax,%eax
10e126: 74 06 je 10e12e <_Objects_Id_to_name+0x42><== NEVER TAKEN
return OBJECTS_INVALID_ID;
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
10e128: 80 78 38 00 cmpb $0x0,0x38(%eax)
10e12c: 74 0a je 10e138 <_Objects_Id_to_name+0x4c><== ALWAYS TAKEN
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
if ( !_Objects_Information_table[ the_api ] )
return OBJECTS_INVALID_ID;
10e12e: b8 03 00 00 00 mov $0x3,%eax
return OBJECTS_INVALID_ID;
*name = the_object->name;
_Thread_Enable_dispatch();
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
10e133: c9 leave
10e134: c3 ret
10e135: 8d 76 00 lea 0x0(%esi),%esi
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
return OBJECTS_INVALID_ID;
#endif
the_object = _Objects_Get( information, tmpId, &ignored_location );
10e138: 51 push %ecx
10e139: 8d 4d f4 lea -0xc(%ebp),%ecx
10e13c: 51 push %ecx
10e13d: 52 push %edx
10e13e: 50 push %eax
10e13f: e8 40 ff ff ff call 10e084 <_Objects_Get>
if ( !the_object )
10e144: 83 c4 10 add $0x10,%esp
10e147: 85 c0 test %eax,%eax
10e149: 74 e3 je 10e12e <_Objects_Id_to_name+0x42>
return OBJECTS_INVALID_ID;
*name = the_object->name;
10e14b: 8b 50 0c mov 0xc(%eax),%edx
10e14e: 8b 45 0c mov 0xc(%ebp),%eax
10e151: 89 10 mov %edx,(%eax)
_Thread_Enable_dispatch();
10e153: e8 50 0a 00 00 call 10eba8 <_Thread_Enable_dispatch>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
10e158: 31 c0 xor %eax,%eax
}
10e15a: c9 leave
10e15b: c3 ret
0010cea8 <_Objects_Initialize_information>:
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
10cea8: 55 push %ebp
10cea9: 89 e5 mov %esp,%ebp
10ceab: 57 push %edi
10ceac: 56 push %esi
10cead: 53 push %ebx
10ceae: 83 ec 0c sub $0xc,%esp
10ceb1: 8b 45 08 mov 0x8(%ebp),%eax
10ceb4: 8b 55 0c mov 0xc(%ebp),%edx
10ceb7: 8b 5d 10 mov 0x10(%ebp),%ebx
10ceba: 8b 75 20 mov 0x20(%ebp),%esi
10cebd: 0f b7 7d 18 movzwl 0x18(%ebp),%edi
uint32_t maximum_per_allocation;
#if defined(RTEMS_MULTIPROCESSING)
uint32_t index;
#endif
information->the_api = the_api;
10cec1: 89 10 mov %edx,(%eax)
information->the_class = the_class;
10cec3: 66 89 58 04 mov %bx,0x4(%eax)
information->size = size;
10cec7: 89 78 18 mov %edi,0x18(%eax)
information->local_table = 0;
10ceca: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax)
information->inactive_per_block = 0;
10ced1: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)
information->object_blocks = 0;
10ced8: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
information->inactive = 0;
10cedf: 66 c7 40 2c 00 00 movw $0x0,0x2c(%eax)
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
information->is_string = is_string;
10cee5: 8b 7d 1c mov 0x1c(%ebp),%edi
10cee8: 89 f9 mov %edi,%ecx
10ceea: 88 48 38 mov %cl,0x38(%eax)
/*
* Set the maximum value to 0. It will be updated when objects are
* added to the inactive set from _Objects_Extend_information()
*/
information->maximum = 0;
10ceed: 66 c7 40 10 00 00 movw $0x0,0x10(%eax)
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
10cef3: 0f b7 db movzwl %bx,%ebx
10cef6: 8b 3c 95 08 7e 12 00 mov 0x127e08(,%edx,4),%edi
10cefd: 89 04 9f mov %eax,(%edi,%ebx,4)
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
10cf00: 8b 7d 14 mov 0x14(%ebp),%edi
10cf03: c1 ef 1f shr $0x1f,%edi
_Objects_Information_table[ the_api ][ the_class ] = information;
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
10cf06: 89 f9 mov %edi,%ecx
10cf08: 88 48 12 mov %cl,0x12(%eax)
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS;
10cf0b: 8b 4d 14 mov 0x14(%ebp),%ecx
10cf0e: 81 e1 ff ff ff 7f and $0x7fffffff,%ecx
/*
* Unlimited and maximum of zero is illogical.
*/
if ( information->auto_extend && maximum_per_allocation == 0) {
10cf14: 85 ff test %edi,%edi
10cf16: 74 04 je 10cf1c <_Objects_Initialize_information+0x74>
10cf18: 85 c9 test %ecx,%ecx
10cf1a: 74 67 je 10cf83 <_Objects_Initialize_information+0xdb><== NEVER TAKEN
}
/*
* The allocation unit is the maximum value
*/
information->allocation_size = maximum_per_allocation;
10cf1c: 66 89 48 14 mov %cx,0x14(%eax)
/*
* Provide a null local table entry for the case of any empty table.
*/
information->local_table = &null_local_table;
10cf20: c7 40 1c a4 7a 12 00 movl $0x127aa4,0x1c(%eax)
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
10cf27: c1 e2 18 shl $0x18,%edx
10cf2a: 81 ca 00 00 01 00 or $0x10000,%edx
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
10cf30: c1 e3 1b shl $0x1b,%ebx
10cf33: 09 da or %ebx,%edx
/*
* Calculate minimum and maximum Id's
*/
minimum_index = (maximum_per_allocation == 0) ? 0 : 1;
10cf35: 31 db xor %ebx,%ebx
10cf37: 85 c9 test %ecx,%ecx
10cf39: 0f 95 c3 setne %bl
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
10cf3c: 09 da or %ebx,%edx
10cf3e: 89 50 08 mov %edx,0x8(%eax)
/*
* Calculate the maximum name length
*/
name_length = maximum_name_length;
if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) )
10cf41: f7 c6 03 00 00 00 test $0x3,%esi
10cf47: 75 23 jne 10cf6c <_Objects_Initialize_information+0xc4>
name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
~(OBJECTS_NAME_ALIGNMENT-1);
information->name_length = name_length;
10cf49: 66 89 70 3a mov %si,0x3a(%eax)
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
10cf4d: 8d 50 24 lea 0x24(%eax),%edx
10cf50: 89 50 20 mov %edx,0x20(%eax)
head->next = tail;
head->previous = NULL;
10cf53: c7 40 24 00 00 00 00 movl $0x0,0x24(%eax)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
10cf5a: 8d 50 20 lea 0x20(%eax),%edx
10cf5d: 89 50 28 mov %edx,0x28(%eax)
_Chain_Initialize_empty( &information->Inactive );
/*
* Initialize objects .. if there are any
*/
if ( maximum_per_allocation ) {
10cf60: 85 c9 test %ecx,%ecx
10cf62: 75 10 jne 10cf74 <_Objects_Initialize_information+0xcc>
_Chain_Initialize_empty( &information->global_table[ index ] );
}
else
information->global_table = NULL;
#endif
}
10cf64: 8d 65 f4 lea -0xc(%ebp),%esp
10cf67: 5b pop %ebx
10cf68: 5e pop %esi
10cf69: 5f pop %edi
10cf6a: c9 leave
10cf6b: c3 ret
* Calculate the maximum name length
*/
name_length = maximum_name_length;
if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) )
name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
10cf6c: 83 c6 04 add $0x4,%esi
10cf6f: 83 e6 fc and $0xfffffffc,%esi
10cf72: eb d5 jmp 10cf49 <_Objects_Initialize_information+0xa1>
/*
* Always have the maximum size available so the current performance
* figures are create are met. If the user moves past the maximum
* number then a performance hit is taken.
*/
_Objects_Extend_information( information );
10cf74: 89 45 08 mov %eax,0x8(%ebp)
_Chain_Initialize_empty( &information->global_table[ index ] );
}
else
information->global_table = NULL;
#endif
}
10cf77: 8d 65 f4 lea -0xc(%ebp),%esp
10cf7a: 5b pop %ebx
10cf7b: 5e pop %esi
10cf7c: 5f pop %edi
10cf7d: c9 leave
/*
* Always have the maximum size available so the current performance
* figures are create are met. If the user moves past the maximum
* number then a performance hit is taken.
*/
_Objects_Extend_information( information );
10cf7e: e9 a9 fa ff ff jmp 10ca2c <_Objects_Extend_information>
/*
* Unlimited and maximum of zero is illogical.
*/
if ( information->auto_extend && maximum_per_allocation == 0) {
_Internal_error_Occurred(
10cf83: 50 push %eax
10cf84: 6a 13 push $0x13
10cf86: 6a 01 push $0x1
10cf88: 6a 00 push $0x0
10cf8a: e8 69 f9 ff ff call 10c8f8 <_Internal_error_Occurred>
00117964 <_Objects_Name_to_id_string>:
Objects_Name_or_id_lookup_errors _Objects_Name_to_id_string(
Objects_Information *information,
const char *name,
Objects_Id *id
)
{
117964: 55 push %ebp
117965: 89 e5 mov %esp,%ebp
117967: 57 push %edi
117968: 56 push %esi
117969: 53 push %ebx
11796a: 83 ec 1c sub $0x1c,%esp
11796d: 8b 7d 08 mov 0x8(%ebp),%edi
Objects_Control *the_object;
uint32_t index;
/* ASSERT: information->is_string == true */
if ( !id )
117970: 8b 5d 10 mov 0x10(%ebp),%ebx
117973: 85 db test %ebx,%ebx
117975: 74 75 je 1179ec <_Objects_Name_to_id_string+0x88>
return OBJECTS_INVALID_ADDRESS;
if ( !name )
117977: 8b 4d 0c mov 0xc(%ebp),%ecx
11797a: 85 c9 test %ecx,%ecx
11797c: 74 4b je 1179c9 <_Objects_Name_to_id_string+0x65>
return OBJECTS_INVALID_NAME;
if ( information->maximum != 0 ) {
11797e: 8b 47 10 mov 0x10(%edi),%eax
117981: 66 85 c0 test %ax,%ax
117984: 74 43 je 1179c9 <_Objects_Name_to_id_string+0x65>
for ( index = 1; index <= information->maximum; index++ ) {
117986: 0f b7 c0 movzwl %ax,%eax
117989: 89 45 e4 mov %eax,-0x1c(%ebp)
11798c: 8b 47 1c mov 0x1c(%edi),%eax
11798f: bb 01 00 00 00 mov $0x1,%ebx
117994: 89 7d e0 mov %edi,-0x20(%ebp)
117997: 89 c7 mov %eax,%edi
117999: 8d 76 00 lea 0x0(%esi),%esi
the_object = information->local_table[ index ];
11799c: 8b 34 9f mov (%edi,%ebx,4),%esi
if ( !the_object )
11799f: 85 f6 test %esi,%esi
1179a1: 74 20 je 1179c3 <_Objects_Name_to_id_string+0x5f>
continue;
if ( !the_object->name.name_p )
1179a3: 8b 46 0c mov 0xc(%esi),%eax
1179a6: 85 c0 test %eax,%eax
1179a8: 74 19 je 1179c3 <_Objects_Name_to_id_string+0x5f>
continue;
if (!strncmp( name, the_object->name.name_p, information->name_length)) {
1179aa: 52 push %edx
1179ab: 8b 4d e0 mov -0x20(%ebp),%ecx
1179ae: 0f b7 51 3a movzwl 0x3a(%ecx),%edx
1179b2: 52 push %edx
1179b3: 50 push %eax
1179b4: ff 75 0c pushl 0xc(%ebp)
1179b7: e8 70 35 00 00 call 11af2c <strncmp>
1179bc: 83 c4 10 add $0x10,%esp
1179bf: 85 c0 test %eax,%eax
1179c1: 74 15 je 1179d8 <_Objects_Name_to_id_string+0x74>
if ( !name )
return OBJECTS_INVALID_NAME;
if ( information->maximum != 0 ) {
for ( index = 1; index <= information->maximum; index++ ) {
1179c3: 43 inc %ebx
1179c4: 3b 5d e4 cmp -0x1c(%ebp),%ebx
1179c7: 76 d3 jbe 11799c <_Objects_Name_to_id_string+0x38>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
}
}
return OBJECTS_INVALID_NAME;
1179c9: b8 01 00 00 00 mov $0x1,%eax
}
1179ce: 8d 65 f4 lea -0xc(%ebp),%esp
1179d1: 5b pop %ebx
1179d2: 5e pop %esi
1179d3: 5f pop %edi
1179d4: c9 leave
1179d5: c3 ret
1179d6: 66 90 xchg %ax,%ax
if ( !the_object->name.name_p )
continue;
if (!strncmp( name, the_object->name.name_p, information->name_length)) {
*id = the_object->id;
1179d8: 8b 46 08 mov 0x8(%esi),%eax
1179db: 8b 55 10 mov 0x10(%ebp),%edx
1179de: 89 02 mov %eax,(%edx)
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
1179e0: 31 c0 xor %eax,%eax
}
}
}
return OBJECTS_INVALID_NAME;
}
1179e2: 8d 65 f4 lea -0xc(%ebp),%esp
1179e5: 5b pop %ebx
1179e6: 5e pop %esi
1179e7: 5f pop %edi
1179e8: c9 leave
1179e9: c3 ret
1179ea: 66 90 xchg %ax,%ax
uint32_t index;
/* ASSERT: information->is_string == true */
if ( !id )
return OBJECTS_INVALID_ADDRESS;
1179ec: b8 02 00 00 00 mov $0x2,%eax
}
}
}
return OBJECTS_INVALID_NAME;
}
1179f1: 8d 65 f4 lea -0xc(%ebp),%esp
1179f4: 5b pop %ebx
1179f5: 5e pop %esi
1179f6: 5f pop %edi
1179f7: c9 leave
1179f8: c3 ret
0010cfc4 <_Objects_Name_to_id_u32>:
Objects_Information *information,
uint32_t name,
uint32_t node,
Objects_Id *id
)
{
10cfc4: 55 push %ebp
10cfc5: 89 e5 mov %esp,%ebp
10cfc7: 57 push %edi
10cfc8: 56 push %esi
10cfc9: 53 push %ebx
10cfca: 8b 45 08 mov 0x8(%ebp),%eax
10cfcd: 8b 4d 0c mov 0xc(%ebp),%ecx
10cfd0: 8b 55 10 mov 0x10(%ebp),%edx
10cfd3: 8b 7d 14 mov 0x14(%ebp),%edi
Objects_Name name_for_mp;
#endif
/* ASSERT: information->is_string == false */
if ( !id )
10cfd6: 85 ff test %edi,%edi
10cfd8: 74 56 je 10d030 <_Objects_Name_to_id_u32+0x6c>
return OBJECTS_INVALID_ADDRESS;
if ( name == 0 )
10cfda: 85 c9 test %ecx,%ecx
10cfdc: 74 08 je 10cfe6 <_Objects_Name_to_id_u32+0x22>
return OBJECTS_INVALID_NAME;
search_local_node = false;
if ( information->maximum != 0 &&
10cfde: 8b 70 10 mov 0x10(%eax),%esi
10cfe1: 66 85 f6 test %si,%si
10cfe4: 75 0a jne 10cff0 <_Objects_Name_to_id_u32+0x2c>
return OBJECTS_INVALID_NAME;
name_for_mp.name_u32 = name;
return _Objects_MP_Global_name_search( information, name_for_mp, node, id );
#else
return OBJECTS_INVALID_NAME;
10cfe6: b8 01 00 00 00 mov $0x1,%eax
#endif
}
10cfeb: 5b pop %ebx
10cfec: 5e pop %esi
10cfed: 5f pop %edi
10cfee: c9 leave
10cfef: c3 ret
if ( name == 0 )
return OBJECTS_INVALID_NAME;
search_local_node = false;
if ( information->maximum != 0 &&
10cff0: 85 d2 test %edx,%edx
10cff2: 75 20 jne 10d014 <_Objects_Name_to_id_u32+0x50>
_Objects_Is_local_node( node )
))
search_local_node = true;
if ( search_local_node ) {
for ( index = 1; index <= information->maximum; index++ ) {
10cff4: 0f b7 f6 movzwl %si,%esi
10cff7: 8b 58 1c mov 0x1c(%eax),%ebx
10cffa: b8 01 00 00 00 mov $0x1,%eax
10cfff: 90 nop
the_object = information->local_table[ index ];
10d000: 8b 14 83 mov (%ebx,%eax,4),%edx
if ( !the_object )
10d003: 85 d2 test %edx,%edx
10d005: 74 05 je 10d00c <_Objects_Name_to_id_u32+0x48>
continue;
if ( name == the_object->name.name_u32 ) {
10d007: 39 4a 0c cmp %ecx,0xc(%edx)
10d00a: 74 18 je 10d024 <_Objects_Name_to_id_u32+0x60>
_Objects_Is_local_node( node )
))
search_local_node = true;
if ( search_local_node ) {
for ( index = 1; index <= information->maximum; index++ ) {
10d00c: 40 inc %eax
10d00d: 39 c6 cmp %eax,%esi
10d00f: 73 ef jae 10d000 <_Objects_Name_to_id_u32+0x3c>
10d011: eb d3 jmp 10cfe6 <_Objects_Name_to_id_u32+0x22>
10d013: 90 nop
return OBJECTS_INVALID_NAME;
search_local_node = false;
if ( information->maximum != 0 &&
(node == OBJECTS_SEARCH_ALL_NODES ||
10d014: 81 fa ff ff ff 7f cmp $0x7fffffff,%edx
10d01a: 74 d8 je 10cff4 <_Objects_Name_to_id_u32+0x30>
node == OBJECTS_SEARCH_LOCAL_NODE ||
10d01c: 4a dec %edx
10d01d: 75 c7 jne 10cfe6 <_Objects_Name_to_id_u32+0x22>
10d01f: eb d3 jmp 10cff4 <_Objects_Name_to_id_u32+0x30>
10d021: 8d 76 00 lea 0x0(%esi),%esi
the_object = information->local_table[ index ];
if ( !the_object )
continue;
if ( name == the_object->name.name_u32 ) {
*id = the_object->id;
10d024: 8b 42 08 mov 0x8(%edx),%eax
10d027: 89 07 mov %eax,(%edi)
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
10d029: 31 c0 xor %eax,%eax
name_for_mp.name_u32 = name;
return _Objects_MP_Global_name_search( information, name_for_mp, node, id );
#else
return OBJECTS_INVALID_NAME;
#endif
}
10d02b: 5b pop %ebx
10d02c: 5e pop %esi
10d02d: 5f pop %edi
10d02e: c9 leave
10d02f: c3 ret
#endif
/* ASSERT: information->is_string == false */
if ( !id )
return OBJECTS_INVALID_ADDRESS;
10d030: b8 02 00 00 00 mov $0x2,%eax
name_for_mp.name_u32 = name;
return _Objects_MP_Global_name_search( information, name_for_mp, node, id );
#else
return OBJECTS_INVALID_NAME;
#endif
}
10d035: 5b pop %ebx
10d036: 5e pop %esi
10d037: 5f pop %edi
10d038: c9 leave
10d039: c3 ret
0010d6ac <_Objects_Set_name>:
bool _Objects_Set_name(
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
10d6ac: 55 push %ebp
10d6ad: 89 e5 mov %esp,%ebp
10d6af: 57 push %edi
10d6b0: 56 push %esi
10d6b1: 53 push %ebx
10d6b2: 83 ec 14 sub $0x14,%esp
10d6b5: 8b 7d 08 mov 0x8(%ebp),%edi
10d6b8: 8b 5d 10 mov 0x10(%ebp),%ebx
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
10d6bb: 0f b7 47 3a movzwl 0x3a(%edi),%eax
10d6bf: 50 push %eax
10d6c0: 53 push %ebx
10d6c1: e8 22 7a 00 00 call 1150e8 <strnlen>
10d6c6: 89 c6 mov %eax,%esi
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
10d6c8: 83 c4 10 add $0x10,%esp
10d6cb: 80 7f 38 00 cmpb $0x0,0x38(%edi)
10d6cf: 75 57 jne 10d728 <_Objects_Set_name+0x7c>
d[length] = '\0';
the_object->name.name_p = d;
} else
#endif
{
the_object->name.name_u32 = _Objects_Build_name(
10d6d1: 0f be 13 movsbl (%ebx),%edx
10d6d4: c1 e2 18 shl $0x18,%edx
10d6d7: 83 f8 01 cmp $0x1,%eax
10d6da: 76 38 jbe 10d714 <_Objects_Set_name+0x68>
10d6dc: 0f be 43 01 movsbl 0x1(%ebx),%eax
10d6e0: c1 e0 10 shl $0x10,%eax
10d6e3: 09 d0 or %edx,%eax
10d6e5: 83 fe 02 cmp $0x2,%esi
10d6e8: 74 31 je 10d71b <_Objects_Set_name+0x6f>
10d6ea: 0f be 53 02 movsbl 0x2(%ebx),%edx
10d6ee: c1 e2 08 shl $0x8,%edx
10d6f1: 09 c2 or %eax,%edx
10d6f3: 83 fe 03 cmp $0x3,%esi
10d6f6: 0f 84 88 00 00 00 je 10d784 <_Objects_Set_name+0xd8>
10d6fc: 0f be 43 03 movsbl 0x3(%ebx),%eax
10d700: 09 c2 or %eax,%edx
10d702: 8b 45 0c mov 0xc(%ebp),%eax
10d705: 89 50 0c mov %edx,0xc(%eax)
((3 < length) ? s[ 3 ] : ' ')
);
}
return true;
10d708: b0 01 mov $0x1,%al
}
10d70a: 8d 65 f4 lea -0xc(%ebp),%esp
10d70d: 5b pop %ebx
10d70e: 5e pop %esi
10d70f: 5f pop %edi
10d710: c9 leave
10d711: c3 ret
10d712: 66 90 xchg %ax,%ax
d[length] = '\0';
the_object->name.name_p = d;
} else
#endif
{
the_object->name.name_u32 = _Objects_Build_name(
10d714: 89 d0 mov %edx,%eax
10d716: 0d 00 00 20 00 or $0x200000,%eax
10d71b: 89 c2 mov %eax,%edx
10d71d: 80 ce 20 or $0x20,%dh
10d720: b8 20 00 00 00 mov $0x20,%eax
10d725: eb d9 jmp 10d700 <_Objects_Set_name+0x54>
10d727: 90 nop
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
char *d;
d = _Workspace_Allocate( length + 1 );
10d728: 83 ec 0c sub $0xc,%esp
10d72b: 8d 40 01 lea 0x1(%eax),%eax
10d72e: 50 push %eax
10d72f: e8 80 19 00 00 call 10f0b4 <_Workspace_Allocate>
10d734: 89 c7 mov %eax,%edi
if ( !d )
10d736: 83 c4 10 add $0x10,%esp
10d739: 85 c0 test %eax,%eax
10d73b: 74 43 je 10d780 <_Objects_Set_name+0xd4>
return false;
if ( the_object->name.name_p ) {
10d73d: 8b 55 0c mov 0xc(%ebp),%edx
10d740: 8b 42 0c mov 0xc(%edx),%eax
10d743: 85 c0 test %eax,%eax
10d745: 74 16 je 10d75d <_Objects_Set_name+0xb1>
_Workspace_Free( (void *)the_object->name.name_p );
10d747: 83 ec 0c sub $0xc,%esp
10d74a: 50 push %eax
10d74b: e8 80 19 00 00 call 10f0d0 <_Workspace_Free>
the_object->name.name_p = NULL;
10d750: 8b 45 0c mov 0xc(%ebp),%eax
10d753: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
10d75a: 83 c4 10 add $0x10,%esp
}
strncpy( d, name, length );
10d75d: 50 push %eax
10d75e: 56 push %esi
10d75f: 53 push %ebx
10d760: 57 push %edi
10d761: e8 06 79 00 00 call 11506c <strncpy>
d[length] = '\0';
10d766: c6 04 37 00 movb $0x0,(%edi,%esi,1)
the_object->name.name_p = d;
10d76a: 8b 55 0c mov 0xc(%ebp),%edx
10d76d: 89 7a 0c mov %edi,0xc(%edx)
10d770: 83 c4 10 add $0x10,%esp
((3 < length) ? s[ 3 ] : ' ')
);
}
return true;
10d773: b0 01 mov $0x1,%al
}
10d775: 8d 65 f4 lea -0xc(%ebp),%esp
10d778: 5b pop %ebx
10d779: 5e pop %esi
10d77a: 5f pop %edi
10d77b: c9 leave
10d77c: c3 ret
10d77d: 8d 76 00 lea 0x0(%esi),%esi
if ( information->is_string ) {
char *d;
d = _Workspace_Allocate( length + 1 );
if ( !d )
return false;
10d780: 31 c0 xor %eax,%eax
10d782: eb 86 jmp 10d70a <_Objects_Set_name+0x5e>
d[length] = '\0';
the_object->name.name_p = d;
} else
#endif
{
the_object->name.name_u32 = _Objects_Build_name(
10d784: b8 20 00 00 00 mov $0x20,%eax
10d789: e9 72 ff ff ff jmp 10d700 <_Objects_Set_name+0x54>
0010d03c <_Objects_Shrink_information>:
*/
void _Objects_Shrink_information(
Objects_Information *information
)
{
10d03c: 55 push %ebp
10d03d: 89 e5 mov %esp,%ebp
10d03f: 57 push %edi
10d040: 56 push %esi
10d041: 53 push %ebx
10d042: 83 ec 1c sub $0x1c,%esp
/*
* Search the list to find block or chunk with all objects inactive.
*/
index_base = _Objects_Get_index( information->minimum_id );
10d045: 8b 45 08 mov 0x8(%ebp),%eax
10d048: 0f b7 58 08 movzwl 0x8(%eax),%ebx
block_count = (information->maximum - index_base) /
10d04c: 0f b7 48 14 movzwl 0x14(%eax),%ecx
10d050: 0f b7 40 10 movzwl 0x10(%eax),%eax
10d054: 29 d8 sub %ebx,%eax
10d056: 31 d2 xor %edx,%edx
10d058: f7 f1 div %ecx
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
10d05a: 85 c0 test %eax,%eax
10d05c: 74 21 je 10d07f <_Objects_Shrink_information+0x43><== NEVER TAKEN
if ( information->inactive_per_block[ block ] ==
10d05e: 8b 55 08 mov 0x8(%ebp),%edx
10d061: 8b 7a 30 mov 0x30(%edx),%edi
10d064: 3b 0f cmp (%edi),%ecx
10d066: 74 1f je 10d087 <_Objects_Shrink_information+0x4b><== NEVER TAKEN
10d068: 31 d2 xor %edx,%edx
10d06a: eb 0e jmp 10d07a <_Objects_Shrink_information+0x3e>
information->inactive -= information->allocation_size;
return;
}
index_base += information->allocation_size;
10d06c: 01 cb add %ecx,%ebx
10d06e: 8d 34 95 00 00 00 00 lea 0x0(,%edx,4),%esi
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
if ( information->inactive_per_block[ block ] ==
10d075: 3b 0c 97 cmp (%edi,%edx,4),%ecx
10d078: 74 12 je 10d08c <_Objects_Shrink_information+0x50>
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
10d07a: 42 inc %edx
10d07b: 39 d0 cmp %edx,%eax
10d07d: 77 ed ja 10d06c <_Objects_Shrink_information+0x30>
return;
}
index_base += information->allocation_size;
}
}
10d07f: 8d 65 f4 lea -0xc(%ebp),%esp
10d082: 5b pop %ebx
10d083: 5e pop %esi
10d084: 5f pop %edi
10d085: c9 leave
10d086: c3 ret
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
if ( information->inactive_per_block[ block ] ==
10d087: 31 f6 xor %esi,%esi
10d089: 8d 76 00 lea 0x0(%esi),%esi
information->allocation_size ) {
/*
* Assume the Inactive chain is never empty at this point
*/
the_object = (Objects_Control *) _Chain_First( &information->Inactive );
10d08c: 8b 55 08 mov 0x8(%ebp),%edx
10d08f: 8b 42 20 mov 0x20(%edx),%eax
10d092: 89 75 e4 mov %esi,-0x1c(%ebp)
10d095: eb 07 jmp 10d09e <_Objects_Shrink_information+0x62>
10d097: 90 nop
if ((index >= index_base) &&
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
}
}
while ( the_object );
10d098: 85 ff test %edi,%edi
10d09a: 74 2c je 10d0c8 <_Objects_Shrink_information+0x8c>
index = _Objects_Get_index( the_object->id );
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
10d09c: 89 f8 mov %edi,%eax
* Assume the Inactive chain is never empty at this point
*/
the_object = (Objects_Control *) _Chain_First( &information->Inactive );
do {
index = _Objects_Get_index( the_object->id );
10d09e: 0f b7 50 08 movzwl 0x8(%eax),%edx
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
10d0a2: 8b 38 mov (%eax),%edi
if ((index >= index_base) &&
10d0a4: 39 da cmp %ebx,%edx
10d0a6: 72 f0 jb 10d098 <_Objects_Shrink_information+0x5c>
(index < (index_base + information->allocation_size))) {
10d0a8: 8b 75 08 mov 0x8(%ebp),%esi
10d0ab: 0f b7 4e 14 movzwl 0x14(%esi),%ecx
10d0af: 8d 0c 0b lea (%ebx,%ecx,1),%ecx
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
if ((index >= index_base) &&
10d0b2: 39 ca cmp %ecx,%edx
10d0b4: 73 e2 jae 10d098 <_Objects_Shrink_information+0x5c>
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
10d0b6: 83 ec 0c sub $0xc,%esp
10d0b9: 50 push %eax
10d0ba: e8 41 ef ff ff call 10c000 <_Chain_Extract>
10d0bf: 83 c4 10 add $0x10,%esp
}
}
while ( the_object );
10d0c2: 85 ff test %edi,%edi
10d0c4: 75 d6 jne 10d09c <_Objects_Shrink_information+0x60>
10d0c6: 66 90 xchg %ax,%ax
10d0c8: 8b 75 e4 mov -0x1c(%ebp),%esi
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
10d0cb: 83 ec 0c sub $0xc,%esp
10d0ce: 8b 55 08 mov 0x8(%ebp),%edx
10d0d1: 8b 42 34 mov 0x34(%edx),%eax
10d0d4: ff 34 30 pushl (%eax,%esi,1)
10d0d7: e8 a0 18 00 00 call 10e97c <_Workspace_Free>
information->object_blocks[ block ] = NULL;
10d0dc: 8b 55 08 mov 0x8(%ebp),%edx
10d0df: 8b 42 34 mov 0x34(%edx),%eax
10d0e2: c7 04 30 00 00 00 00 movl $0x0,(%eax,%esi,1)
information->inactive_per_block[ block ] = 0;
10d0e9: 8b 42 30 mov 0x30(%edx),%eax
10d0ec: c7 04 30 00 00 00 00 movl $0x0,(%eax,%esi,1)
information->inactive -= information->allocation_size;
10d0f3: 8b 42 14 mov 0x14(%edx),%eax
10d0f6: 66 29 42 2c sub %ax,0x2c(%edx)
return;
10d0fa: 83 c4 10 add $0x10,%esp
}
index_base += information->allocation_size;
}
}
10d0fd: 8d 65 f4 lea -0xc(%ebp),%esp
10d100: 5b pop %ebx
10d101: 5e pop %esi
10d102: 5f pop %edi
10d103: c9 leave
10d104: c3 ret
0010d524 <_POSIX_Absolute_timeout_to_ticks>:
*/
POSIX_Absolute_timeout_conversion_results_t _POSIX_Absolute_timeout_to_ticks(
const struct timespec *abstime,
Watchdog_Interval *ticks_out
)
{
10d524: 55 push %ebp
10d525: 89 e5 mov %esp,%ebp
10d527: 57 push %edi
10d528: 56 push %esi
10d529: 53 push %ebx
10d52a: 83 ec 38 sub $0x38,%esp
10d52d: 8b 5d 08 mov 0x8(%ebp),%ebx
10d530: 8b 75 0c mov 0xc(%ebp),%esi
/*
* Make sure there is always a value returned.
*/
*ticks_out = 0;
10d533: c7 06 00 00 00 00 movl $0x0,(%esi)
/*
* Is the absolute time even valid?
*/
if ( !_Timespec_Is_valid(abstime) )
10d539: 53 push %ebx
10d53a: e8 99 3d 00 00 call 1112d8 <_Timespec_Is_valid>
10d53f: 83 c4 10 add $0x10,%esp
10d542: 84 c0 test %al,%al
10d544: 75 0a jne 10d550 <_POSIX_Absolute_timeout_to_ticks+0x2c>
return POSIX_ABSOLUTE_TIMEOUT_INVALID;
10d546: 31 c0 xor %eax,%eax
/*
* This is the case we were expecting and it took this long to
* get here.
*/
return POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE;
}
10d548: 8d 65 f4 lea -0xc(%ebp),%esp
10d54b: 5b pop %ebx
10d54c: 5e pop %esi
10d54d: 5f pop %edi
10d54e: c9 leave
10d54f: c3 ret
return POSIX_ABSOLUTE_TIMEOUT_INVALID;
/*
* Is the absolute time in the past?
*/
_TOD_Get( ¤t_time );
10d550: 83 ec 0c sub $0xc,%esp
10d553: 8d 7d e0 lea -0x20(%ebp),%edi
10d556: 57 push %edi
10d557: e8 88 1d 00 00 call 10f2e4 <_TOD_Get>
if ( _Timespec_Less_than( abstime, ¤t_time ) )
10d55c: 5a pop %edx
10d55d: 59 pop %ecx
10d55e: 57 push %edi
10d55f: 53 push %ebx
10d560: e8 9b 3d 00 00 call 111300 <_Timespec_Less_than>
10d565: 83 c4 10 add $0x10,%esp
10d568: 84 c0 test %al,%al
10d56a: 74 10 je 10d57c <_POSIX_Absolute_timeout_to_ticks+0x58>
return POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST;
10d56c: b8 01 00 00 00 mov $0x1,%eax
/*
* This is the case we were expecting and it took this long to
* get here.
*/
return POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE;
}
10d571: 8d 65 f4 lea -0xc(%ebp),%esp
10d574: 5b pop %ebx
10d575: 5e pop %esi
10d576: 5f pop %edi
10d577: c9 leave
10d578: c3 ret
10d579: 8d 76 00 lea 0x0(%esi),%esi
return POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST;
/*
* How long until the requested absolute time?
*/
_Timespec_Subtract( ¤t_time, abstime, &difference );
10d57c: 50 push %eax
10d57d: 8d 45 d8 lea -0x28(%ebp),%eax
10d580: 50 push %eax
10d581: 53 push %ebx
10d582: 57 push %edi
10d583: 89 45 d4 mov %eax,-0x2c(%ebp)
10d586: e8 99 3d 00 00 call 111324 <_Timespec_Subtract>
/*
* Internally the SuperCore uses ticks, so convert to them.
*/
*ticks_out = _Timespec_To_ticks( &difference );
10d58b: 8b 45 d4 mov -0x2c(%ebp),%eax
10d58e: 89 04 24 mov %eax,(%esp)
10d591: e8 ce 3d 00 00 call 111364 <_Timespec_To_ticks>
10d596: 89 06 mov %eax,(%esi)
/*
* If the difference was 0, then the future is now. It is so bright
* we better wear shades.
*/
if ( !*ticks_out )
10d598: 83 c4 10 add $0x10,%esp
return POSIX_ABSOLUTE_TIMEOUT_IS_NOW;
10d59b: 83 f8 01 cmp $0x1,%eax
10d59e: 19 c0 sbb %eax,%eax
10d5a0: 83 c0 03 add $0x3,%eax
/*
* This is the case we were expecting and it took this long to
* get here.
*/
return POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE;
}
10d5a3: 8d 65 f4 lea -0xc(%ebp),%esp
10d5a6: 5b pop %ebx
10d5a7: 5e pop %esi
10d5a8: 5f pop %edi
10d5a9: c9 leave
10d5aa: c3 ret
0010c0cc <_POSIX_Condition_variables_Get>:
POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get (
pthread_cond_t *cond,
Objects_Locations *location
)
{
10c0cc: 55 push %ebp
10c0cd: 89 e5 mov %esp,%ebp
10c0cf: 56 push %esi
10c0d0: 53 push %ebx
10c0d1: 8b 5d 08 mov 0x8(%ebp),%ebx
10c0d4: 8b 75 0c mov 0xc(%ebp),%esi
int status;
if ( !cond ) {
10c0d7: 85 db test %ebx,%ebx
10c0d9: 74 39 je 10c114 <_POSIX_Condition_variables_Get+0x48>
*location = OBJECTS_ERROR;
return (POSIX_Condition_variables_Control *) 0;
}
if ( *cond == PTHREAD_COND_INITIALIZER ) {
10c0db: 8b 03 mov (%ebx),%eax
10c0dd: 83 f8 ff cmp $0xffffffff,%eax
10c0e0: 74 1a je 10c0fc <_POSIX_Condition_variables_Get+0x30>
}
/*
* Now call Objects_Get()
*/
return (POSIX_Condition_variables_Control *)_Objects_Get(
10c0e2: 52 push %edx
10c0e3: 56 push %esi
10c0e4: 50 push %eax
10c0e5: 68 80 aa 12 00 push $0x12aa80
10c0ea: e8 7d 2b 00 00 call 10ec6c <_Objects_Get>
10c0ef: 83 c4 10 add $0x10,%esp
&_POSIX_Condition_variables_Information,
(Objects_Id) *cond,
location
);
}
10c0f2: 8d 65 f8 lea -0x8(%ebp),%esp
10c0f5: 5b pop %ebx
10c0f6: 5e pop %esi
10c0f7: c9 leave
10c0f8: c3 ret
10c0f9: 8d 76 00 lea 0x0(%esi),%esi
if ( *cond == PTHREAD_COND_INITIALIZER ) {
/*
* Do an "auto-create" here.
*/
status = pthread_cond_init( cond, 0 );
10c0fc: 83 ec 08 sub $0x8,%esp
10c0ff: 6a 00 push $0x0
10c101: 53 push %ebx
10c102: e8 19 00 00 00 call 10c120 <pthread_cond_init>
if ( status ) {
10c107: 83 c4 10 add $0x10,%esp
10c10a: 85 c0 test %eax,%eax
10c10c: 75 06 jne 10c114 <_POSIX_Condition_variables_Get+0x48>
10c10e: 8b 03 mov (%ebx),%eax
10c110: eb d0 jmp 10c0e2 <_POSIX_Condition_variables_Get+0x16>
10c112: 66 90 xchg %ax,%ax
*location = OBJECTS_ERROR;
10c114: c7 06 01 00 00 00 movl $0x1,(%esi)
return (POSIX_Condition_variables_Control *) 0;
10c11a: 31 c0 xor %eax,%eax
10c11c: eb d4 jmp 10c0f2 <_POSIX_Condition_variables_Get+0x26>
0010c1e8 <_POSIX_Condition_variables_Signal_support>:
int _POSIX_Condition_variables_Signal_support(
pthread_cond_t *cond,
bool is_broadcast
)
{
10c1e8: 55 push %ebp
10c1e9: 89 e5 mov %esp,%ebp
10c1eb: 57 push %edi
10c1ec: 56 push %esi
10c1ed: 53 push %ebx
10c1ee: 83 ec 24 sub $0x24,%esp
10c1f1: 8a 5d 0c mov 0xc(%ebp),%bl
register POSIX_Condition_variables_Control *the_cond;
Objects_Locations location;
Thread_Control *the_thread;
the_cond = _POSIX_Condition_variables_Get( cond, &location );
10c1f4: 8d 45 e4 lea -0x1c(%ebp),%eax
10c1f7: 50 push %eax
10c1f8: ff 75 08 pushl 0x8(%ebp)
10c1fb: e8 cc fe ff ff call 10c0cc <_POSIX_Condition_variables_Get>
10c200: 89 c7 mov %eax,%edi
switch ( location ) {
10c202: 83 c4 10 add $0x10,%esp
10c205: 8b 45 e4 mov -0x1c(%ebp),%eax
10c208: 85 c0 test %eax,%eax
10c20a: 74 10 je 10c21c <_POSIX_Condition_variables_Signal_support+0x34>
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10c20c: b8 16 00 00 00 mov $0x16,%eax
}
10c211: 8d 65 f4 lea -0xc(%ebp),%esp
10c214: 5b pop %ebx
10c215: 5e pop %esi
10c216: 5f pop %edi
10c217: c9 leave
10c218: c3 ret
10c219: 8d 76 00 lea 0x0(%esi),%esi
10c21c: 8d 77 18 lea 0x18(%edi),%esi
10c21f: eb 0b jmp 10c22c <_POSIX_Condition_variables_Signal_support+0x44>
10c221: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_LOCAL:
do {
the_thread = _Thread_queue_Dequeue( &the_cond->Wait_queue );
if ( !the_thread )
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
} while ( is_broadcast && the_thread );
10c224: 84 db test %bl,%bl
10c226: 74 20 je 10c248 <_POSIX_Condition_variables_Signal_support+0x60>
10c228: 85 c0 test %eax,%eax
10c22a: 74 1c je 10c248 <_POSIX_Condition_variables_Signal_support+0x60>
the_cond = _POSIX_Condition_variables_Get( cond, &location );
switch ( location ) {
case OBJECTS_LOCAL:
do {
the_thread = _Thread_queue_Dequeue( &the_cond->Wait_queue );
10c22c: 83 ec 0c sub $0xc,%esp
10c22f: 56 push %esi
10c230: e8 9f 38 00 00 call 10fad4 <_Thread_queue_Dequeue>
if ( !the_thread )
10c235: 83 c4 10 add $0x10,%esp
10c238: 85 c0 test %eax,%eax
10c23a: 75 e8 jne 10c224 <_POSIX_Condition_variables_Signal_support+0x3c>
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
10c23c: c7 47 14 00 00 00 00 movl $0x0,0x14(%edi)
} while ( is_broadcast && the_thread );
10c243: 84 db test %bl,%bl
10c245: 75 e1 jne 10c228 <_POSIX_Condition_variables_Signal_support+0x40>
10c247: 90 nop
_Thread_Enable_dispatch();
10c248: e8 d3 34 00 00 call 10f720 <_Thread_Enable_dispatch>
return 0;
10c24d: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c24f: 8d 65 f4 lea -0xc(%ebp),%esp
10c252: 5b pop %ebx
10c253: 5e pop %esi
10c254: 5f pop %edi
10c255: c9 leave
10c256: c3 ret
0010c2b0 <_POSIX_Condition_variables_Wait_support>:
pthread_cond_t *cond,
pthread_mutex_t *mutex,
Watchdog_Interval timeout,
bool already_timedout
)
{
10c2b0: 55 push %ebp
10c2b1: 89 e5 mov %esp,%ebp
10c2b3: 57 push %edi
10c2b4: 56 push %esi
10c2b5: 53 push %ebx
10c2b6: 83 ec 34 sub $0x34,%esp
10c2b9: 8b 7d 08 mov 0x8(%ebp),%edi
10c2bc: 8b 5d 0c mov 0xc(%ebp),%ebx
10c2bf: 8a 45 14 mov 0x14(%ebp),%al
10c2c2: 88 45 d7 mov %al,-0x29(%ebp)
register POSIX_Condition_variables_Control *the_cond;
Objects_Locations location;
int status;
int mutex_status;
if ( !_POSIX_Mutex_Get( mutex, &location ) ) {
10c2c5: 8d 75 e4 lea -0x1c(%ebp),%esi
10c2c8: 56 push %esi
10c2c9: 53 push %ebx
10c2ca: e8 59 01 00 00 call 10c428 <_POSIX_Mutex_Get>
10c2cf: 83 c4 10 add $0x10,%esp
10c2d2: 85 c0 test %eax,%eax
10c2d4: 74 21 je 10c2f7 <_POSIX_Condition_variables_Wait_support+0x47>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10c2d6: a1 90 a5 12 00 mov 0x12a590,%eax
10c2db: 48 dec %eax
10c2dc: a3 90 a5 12 00 mov %eax,0x12a590
return EINVAL;
}
_Thread_Unnest_dispatch();
the_cond = _POSIX_Condition_variables_Get( cond, &location );
10c2e1: 83 ec 08 sub $0x8,%esp
10c2e4: 56 push %esi
10c2e5: 57 push %edi
10c2e6: e8 e1 fd ff ff call 10c0cc <_POSIX_Condition_variables_Get>
10c2eb: 89 c6 mov %eax,%esi
switch ( location ) {
10c2ed: 83 c4 10 add $0x10,%esp
10c2f0: 8b 55 e4 mov -0x1c(%ebp),%edx
10c2f3: 85 d2 test %edx,%edx
10c2f5: 74 11 je 10c308 <_POSIX_Condition_variables_Wait_support+0x58>
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10c2f7: be 16 00 00 00 mov $0x16,%esi
}
10c2fc: 89 f0 mov %esi,%eax
10c2fe: 8d 65 f4 lea -0xc(%ebp),%esp
10c301: 5b pop %ebx
10c302: 5e pop %esi
10c303: 5f pop %edi
10c304: c9 leave
10c305: c3 ret
10c306: 66 90 xchg %ax,%ax
the_cond = _POSIX_Condition_variables_Get( cond, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( the_cond->Mutex && ( the_cond->Mutex != *mutex ) ) {
10c308: 8b 40 14 mov 0x14(%eax),%eax
10c30b: 85 c0 test %eax,%eax
10c30d: 74 19 je 10c328 <_POSIX_Condition_variables_Wait_support+0x78>
10c30f: 3b 03 cmp (%ebx),%eax
10c311: 74 15 je 10c328 <_POSIX_Condition_variables_Wait_support+0x78>
_Thread_Enable_dispatch();
10c313: e8 08 34 00 00 call 10f720 <_Thread_Enable_dispatch>
return EINVAL;
10c318: be 16 00 00 00 mov $0x16,%esi
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c31d: 89 f0 mov %esi,%eax
10c31f: 8d 65 f4 lea -0xc(%ebp),%esp
10c322: 5b pop %ebx
10c323: 5e pop %esi
10c324: 5f pop %edi
10c325: c9 leave
10c326: c3 ret
10c327: 90 nop
if ( the_cond->Mutex && ( the_cond->Mutex != *mutex ) ) {
_Thread_Enable_dispatch();
return EINVAL;
}
(void) pthread_mutex_unlock( mutex );
10c328: 83 ec 0c sub $0xc,%esp
10c32b: 53 push %ebx
10c32c: e8 73 03 00 00 call 10c6a4 <pthread_mutex_unlock>
_Thread_Enable_dispatch();
return EINVAL;
}
*/
if ( !already_timedout ) {
10c331: 83 c4 10 add $0x10,%esp
10c334: 80 7d d7 00 cmpb $0x0,-0x29(%ebp)
10c338: 75 4e jne 10c388 <_POSIX_Condition_variables_Wait_support+0xd8>
the_cond->Mutex = *mutex;
10c33a: 8b 03 mov (%ebx),%eax
10c33c: 89 46 14 mov %eax,0x14(%esi)
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
10c33f: c7 46 48 01 00 00 00 movl $0x1,0x48(%esi)
_Thread_queue_Enter_critical_section( &the_cond->Wait_queue );
_Thread_Executing->Wait.return_code = 0;
10c346: a1 78 ab 12 00 mov 0x12ab78,%eax
10c34b: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
_Thread_Executing->Wait.queue = &the_cond->Wait_queue;
10c352: 83 c6 18 add $0x18,%esi
10c355: 89 70 44 mov %esi,0x44(%eax)
_Thread_Executing->Wait.id = *cond;
10c358: 8b 17 mov (%edi),%edx
10c35a: 89 50 20 mov %edx,0x20(%eax)
_Thread_queue_Enqueue( &the_cond->Wait_queue, timeout );
10c35d: 50 push %eax
10c35e: 68 78 ff 10 00 push $0x10ff78
10c363: ff 75 10 pushl 0x10(%ebp)
10c366: 56 push %esi
10c367: e8 90 38 00 00 call 10fbfc <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
10c36c: e8 af 33 00 00 call 10f720 <_Thread_Enable_dispatch>
* a POSIX signal, then pthread_cond_wait returns spuriously,
* according to the POSIX standard. It means that pthread_cond_wait
* returns a success status, except for the fact that it was not
* woken up a pthread_cond_signal or a pthread_cond_broadcast.
*/
status = _Thread_Executing->Wait.return_code;
10c371: a1 78 ab 12 00 mov 0x12ab78,%eax
10c376: 8b 70 34 mov 0x34(%eax),%esi
if ( status == EINTR )
10c379: 83 c4 10 add $0x10,%esp
10c37c: 83 fe 04 cmp $0x4,%esi
10c37f: 75 11 jne 10c392 <_POSIX_Condition_variables_Wait_support+0xe2>
status = 0;
10c381: 31 f6 xor %esi,%esi
10c383: eb 0d jmp 10c392 <_POSIX_Condition_variables_Wait_support+0xe2>
10c385: 8d 76 00 lea 0x0(%esi),%esi
} else {
_Thread_Enable_dispatch();
10c388: e8 93 33 00 00 call 10f720 <_Thread_Enable_dispatch>
status = ETIMEDOUT;
10c38d: be 74 00 00 00 mov $0x74,%esi
/*
* When we get here the dispatch disable level is 0.
*/
mutex_status = pthread_mutex_lock( mutex );
10c392: 83 ec 0c sub $0xc,%esp
10c395: 53 push %ebx
10c396: e8 81 02 00 00 call 10c61c <pthread_mutex_lock>
if ( mutex_status )
10c39b: 83 c4 10 add $0x10,%esp
10c39e: 85 c0 test %eax,%eax
10c3a0: 0f 85 51 ff ff ff jne 10c2f7 <_POSIX_Condition_variables_Wait_support+0x47>
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c3a6: 89 f0 mov %esi,%eax
10c3a8: 8d 65 f4 lea -0xc(%ebp),%esp
10c3ab: 5b pop %ebx
10c3ac: 5e pop %esi
10c3ad: 5f pop %edi
10c3ae: c9 leave
10c3af: c3 ret
00116378 <_POSIX_Message_queue_Create_support>:
const char *name_arg,
int pshared,
struct mq_attr *attr_ptr,
POSIX_Message_queue_Control **message_queue
)
{
116378: 55 push %ebp
116379: 89 e5 mov %esp,%ebp
11637b: 57 push %edi
11637c: 56 push %esi
11637d: 53 push %ebx
11637e: 83 ec 24 sub $0x24,%esp
116381: 8b 5d 10 mov 0x10(%ebp),%ebx
CORE_message_queue_Attributes *the_mq_attr;
struct mq_attr attr;
char *name;
size_t n;
n = strnlen( name_arg, NAME_MAX );
116384: 68 ff 00 00 00 push $0xff
116389: ff 75 08 pushl 0x8(%ebp)
11638c: e8 a7 4c 00 00 call 11b038 <strnlen>
116391: 89 c6 mov %eax,%esi
116393: a1 50 0f 13 00 mov 0x130f50,%eax
116398: 40 inc %eax
116399: a3 50 0f 13 00 mov %eax,0x130f50
* There is no real basis for the default values. They will work
* but were not compared against any existing implementation for
* compatibility. See README.mqueue for an example program we
* think will print out the defaults. Report anything you find with it.
*/
if ( attr_ptr == NULL ) {
11639e: 83 c4 10 add $0x10,%esp
1163a1: 85 db test %ebx,%ebx
1163a3: 0f 84 b7 00 00 00 je 116460 <_POSIX_Message_queue_Create_support+0xe8>
attr.mq_maxmsg = 10;
attr.mq_msgsize = 16;
} else {
if ( attr_ptr->mq_maxmsg <= 0 ){
1163a9: 8b 7b 04 mov 0x4(%ebx),%edi
1163ac: 85 ff test %edi,%edi
1163ae: 0f 8e f0 00 00 00 jle 1164a4 <_POSIX_Message_queue_Create_support+0x12c>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( attr_ptr->mq_msgsize <= 0 ){
1163b4: 8b 5b 08 mov 0x8(%ebx),%ebx
1163b7: 89 5d e4 mov %ebx,-0x1c(%ebp)
1163ba: 85 db test %ebx,%ebx
1163bc: 0f 8e e2 00 00 00 jle 1164a4 <_POSIX_Message_queue_Create_support+0x12c>
RTEMS_INLINE_ROUTINE
POSIX_Message_queue_Control *_POSIX_Message_queue_Allocate( void )
{
return (POSIX_Message_queue_Control *)
_Objects_Allocate( &_POSIX_Message_queue_Information );
1163c2: 83 ec 0c sub $0xc,%esp
1163c5: 68 20 13 13 00 push $0x131320
1163ca: e8 d9 c3 ff ff call 1127a8 <_Objects_Allocate>
1163cf: 89 c3 mov %eax,%ebx
attr = *attr_ptr;
}
the_mq = _POSIX_Message_queue_Allocate();
if ( !the_mq ) {
1163d1: 83 c4 10 add $0x10,%esp
1163d4: 85 c0 test %eax,%eax
1163d6: 0f 84 0a 01 00 00 je 1164e6 <_POSIX_Message_queue_Create_support+0x16e>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENFILE );
}
the_mq->process_shared = pshared;
1163dc: 8b 45 0c mov 0xc(%ebp),%eax
1163df: 89 43 10 mov %eax,0x10(%ebx)
the_mq->named = true;
1163e2: c6 43 14 01 movb $0x1,0x14(%ebx)
the_mq->open_count = 1;
1163e6: c7 43 18 01 00 00 00 movl $0x1,0x18(%ebx)
the_mq->linked = true;
1163ed: c6 43 15 01 movb $0x1,0x15(%ebx)
/*
* Make a copy of the user's string for name just in case it was
* dynamically constructed.
*/
name = _Workspace_Allocate(n+1);
1163f1: 8d 56 01 lea 0x1(%esi),%edx
1163f4: 83 ec 0c sub $0xc,%esp
1163f7: 52 push %edx
1163f8: 89 55 e0 mov %edx,-0x20(%ebp)
1163fb: e8 dc e4 ff ff call 1148dc <_Workspace_Allocate>
116400: 89 c6 mov %eax,%esi
if (!name) {
116402: 83 c4 10 add $0x10,%esp
116405: 85 c0 test %eax,%eax
116407: 8b 55 e0 mov -0x20(%ebp),%edx
11640a: 0f 84 ab 00 00 00 je 1164bb <_POSIX_Message_queue_Create_support+0x143>
_POSIX_Message_queue_Free( the_mq );
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENOMEM );
}
strncpy( name, name_arg, n+1 );
116410: 50 push %eax
116411: 52 push %edx
116412: ff 75 08 pushl 0x8(%ebp)
116415: 56 push %esi
116416: e8 a1 4b 00 00 call 11afbc <strncpy>
*
* Joel: Cite POSIX or OpenGroup on above statement so we can determine
* if it is a real requirement.
*/
the_mq_attr = &the_mq->Message_queue.Attributes;
the_mq_attr->discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
11641b: c7 43 5c 00 00 00 00 movl $0x0,0x5c(%ebx)
if ( !_CORE_message_queue_Initialize(
116422: ff 75 e4 pushl -0x1c(%ebp)
116425: 57 push %edi
* current scheduling policy.
*
* Joel: Cite POSIX or OpenGroup on above statement so we can determine
* if it is a real requirement.
*/
the_mq_attr = &the_mq->Message_queue.Attributes;
116426: 8d 43 5c lea 0x5c(%ebx),%eax
the_mq_attr->discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
if ( !_CORE_message_queue_Initialize(
116429: 50 push %eax
11642a: 8d 43 1c lea 0x1c(%ebx),%eax
11642d: 50 push %eax
11642e: e8 25 0f 00 00 call 117358 <_CORE_message_queue_Initialize>
116433: 83 c4 20 add $0x20,%esp
116436: 84 c0 test %al,%al
116438: 74 3a je 116474 <_POSIX_Message_queue_Create_support+0xfc>
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
11643a: 0f b7 53 08 movzwl 0x8(%ebx),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
11643e: a1 3c 13 13 00 mov 0x13133c,%eax
116443: 89 1c 90 mov %ebx,(%eax,%edx,4)
the_object
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
/* ASSERT: information->is_string */
the_object->name.name_p = name;
116446: 89 73 0c mov %esi,0xc(%ebx)
&_POSIX_Message_queue_Information,
&the_mq->Object,
name
);
*message_queue = the_mq;
116449: 8b 45 14 mov 0x14(%ebp),%eax
11644c: 89 18 mov %ebx,(%eax)
_Thread_Enable_dispatch();
11644e: e8 41 d3 ff ff call 113794 <_Thread_Enable_dispatch>
return 0;
116453: 31 c0 xor %eax,%eax
}
116455: 8d 65 f4 lea -0xc(%ebp),%esp
116458: 5b pop %ebx
116459: 5e pop %esi
11645a: 5f pop %edi
11645b: c9 leave
11645c: c3 ret
11645d: 8d 76 00 lea 0x0(%esi),%esi
* compatibility. See README.mqueue for an example program we
* think will print out the defaults. Report anything you find with it.
*/
if ( attr_ptr == NULL ) {
attr.mq_maxmsg = 10;
attr.mq_msgsize = 16;
116460: c7 45 e4 10 00 00 00 movl $0x10,-0x1c(%ebp)
* but were not compared against any existing implementation for
* compatibility. See README.mqueue for an example program we
* think will print out the defaults. Report anything you find with it.
*/
if ( attr_ptr == NULL ) {
attr.mq_maxmsg = 10;
116467: bf 0a 00 00 00 mov $0xa,%edi
11646c: e9 51 ff ff ff jmp 1163c2 <_POSIX_Message_queue_Create_support+0x4a>
116471: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free (
POSIX_Message_queue_Control *the_mq
)
{
_Objects_Free( &_POSIX_Message_queue_Information, &the_mq->Object );
116474: 83 ec 08 sub $0x8,%esp
116477: 53 push %ebx
116478: 68 20 13 13 00 push $0x131320
11647d: e8 9e c6 ff ff call 112b20 <_Objects_Free>
attr.mq_maxmsg,
attr.mq_msgsize
) ) {
_POSIX_Message_queue_Free( the_mq );
_Workspace_Free(name);
116482: 89 34 24 mov %esi,(%esp)
116485: e8 6e e4 ff ff call 1148f8 <_Workspace_Free>
_Thread_Enable_dispatch();
11648a: e8 05 d3 ff ff call 113794 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSPC );
11648f: e8 24 34 00 00 call 1198b8 <__errno>
116494: c7 00 1c 00 00 00 movl $0x1c,(%eax)
11649a: 83 c4 10 add $0x10,%esp
11649d: b8 ff ff ff ff mov $0xffffffff,%eax
1164a2: eb b1 jmp 116455 <_POSIX_Message_queue_Create_support+0xdd>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( attr_ptr->mq_msgsize <= 0 ){
_Thread_Enable_dispatch();
1164a4: e8 eb d2 ff ff call 113794 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EINVAL );
1164a9: e8 0a 34 00 00 call 1198b8 <__errno>
1164ae: c7 00 16 00 00 00 movl $0x16,(%eax)
1164b4: b8 ff ff ff ff mov $0xffffffff,%eax
1164b9: eb 9a jmp 116455 <_POSIX_Message_queue_Create_support+0xdd>
1164bb: 83 ec 08 sub $0x8,%esp
1164be: 53 push %ebx
1164bf: 68 20 13 13 00 push $0x131320
1164c4: e8 57 c6 ff ff call 112b20 <_Objects_Free>
* dynamically constructed.
*/
name = _Workspace_Allocate(n+1);
if (!name) {
_POSIX_Message_queue_Free( the_mq );
_Thread_Enable_dispatch();
1164c9: e8 c6 d2 ff ff call 113794 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOMEM );
1164ce: e8 e5 33 00 00 call 1198b8 <__errno>
1164d3: c7 00 0c 00 00 00 movl $0xc,(%eax)
1164d9: 83 c4 10 add $0x10,%esp
1164dc: b8 ff ff ff ff mov $0xffffffff,%eax
1164e1: e9 6f ff ff ff jmp 116455 <_POSIX_Message_queue_Create_support+0xdd>
attr = *attr_ptr;
}
the_mq = _POSIX_Message_queue_Allocate();
if ( !the_mq ) {
_Thread_Enable_dispatch();
1164e6: e8 a9 d2 ff ff call 113794 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENFILE );
1164eb: e8 c8 33 00 00 call 1198b8 <__errno>
1164f0: c7 00 17 00 00 00 movl $0x17,(%eax)
1164f6: b8 ff ff ff ff mov $0xffffffff,%eax
1164fb: e9 55 ff ff ff jmp 116455 <_POSIX_Message_queue_Create_support+0xdd>
00116500 <_POSIX_Message_queue_Name_to_id>:
*/
int _POSIX_Message_queue_Name_to_id(
const char *name,
Objects_Id *id
)
{
116500: 55 push %ebp
116501: 89 e5 mov %esp,%ebp
116503: 53 push %ebx
116504: 83 ec 14 sub $0x14,%esp
116507: 8b 5d 08 mov 0x8(%ebp),%ebx
Objects_Name_or_id_lookup_errors status;
Objects_Id the_id;
if ( !name )
11650a: 85 db test %ebx,%ebx
11650c: 74 05 je 116513 <_POSIX_Message_queue_Name_to_id+0x13>
return EINVAL;
if ( !name[0] )
11650e: 80 3b 00 cmpb $0x0,(%ebx)
116511: 75 0d jne 116520 <_POSIX_Message_queue_Name_to_id+0x20>
return EINVAL;
116513: b8 16 00 00 00 mov $0x16,%eax
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL )
return 0;
return ENOENT;
}
116518: 8b 5d fc mov -0x4(%ebp),%ebx
11651b: c9 leave
11651c: c3 ret
11651d: 8d 76 00 lea 0x0(%esi),%esi
return EINVAL;
if ( !name[0] )
return EINVAL;
if ( strnlen( name, NAME_MAX ) >= NAME_MAX )
116520: 83 ec 08 sub $0x8,%esp
116523: 68 ff 00 00 00 push $0xff
116528: 53 push %ebx
116529: e8 0a 4b 00 00 call 11b038 <strnlen>
11652e: 83 c4 10 add $0x10,%esp
116531: 3d fe 00 00 00 cmp $0xfe,%eax
116536: 76 0c jbe 116544 <_POSIX_Message_queue_Name_to_id+0x44>
return ENAMETOOLONG;
116538: b8 5b 00 00 00 mov $0x5b,%eax
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL )
return 0;
return ENOENT;
}
11653d: 8b 5d fc mov -0x4(%ebp),%ebx
116540: c9 leave
116541: c3 ret
116542: 66 90 xchg %ax,%ax
return EINVAL;
if ( strnlen( name, NAME_MAX ) >= NAME_MAX )
return ENAMETOOLONG;
status = _Objects_Name_to_id_string(
116544: 50 push %eax
116545: 8d 45 f4 lea -0xc(%ebp),%eax
116548: 50 push %eax
116549: 53 push %ebx
11654a: 68 20 13 13 00 push $0x131320
11654f: e8 10 14 00 00 call 117964 <_Objects_Name_to_id_string>
&_POSIX_Message_queue_Information,
name,
&the_id
);
*id = the_id;
116554: 8b 4d f4 mov -0xc(%ebp),%ecx
116557: 8b 55 0c mov 0xc(%ebp),%edx
11655a: 89 0a mov %ecx,(%edx)
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL )
11655c: 83 c4 10 add $0x10,%esp
return 0;
11655f: 83 f8 01 cmp $0x1,%eax
116562: 19 c0 sbb %eax,%eax
116564: f7 d0 not %eax
116566: 83 e0 02 and $0x2,%eax
return ENOENT;
}
116569: 8b 5d fc mov -0x4(%ebp),%ebx
11656c: c9 leave
11656d: c3 ret
0010fce8 <_POSIX_Message_queue_Receive_support>:
size_t msg_len,
unsigned int *msg_prio,
bool wait,
Watchdog_Interval timeout
)
{
10fce8: 55 push %ebp
10fce9: 89 e5 mov %esp,%ebp
10fceb: 53 push %ebx
10fcec: 83 ec 28 sub $0x28,%esp
10fcef: 8b 5d 08 mov 0x8(%ebp),%ebx
10fcf2: 8a 45 18 mov 0x18(%ebp),%al
10fcf5: 88 45 e7 mov %al,-0x19(%ebp)
POSIX_Message_queue_Control_fd *the_mq_fd;
Objects_Locations location;
size_t length_out;
bool do_wait;
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
10fcf8: 8d 45 f4 lea -0xc(%ebp),%eax
RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *_POSIX_Message_queue_Get_fd (
mqd_t id,
Objects_Locations *location
)
{
return (POSIX_Message_queue_Control_fd *) _Objects_Get(
10fcfb: 50 push %eax
10fcfc: 53 push %ebx
10fcfd: 68 c0 14 13 00 push $0x1314c0
10fd02: e8 59 2f 00 00 call 112c60 <_Objects_Get>
switch ( location ) {
10fd07: 83 c4 10 add $0x10,%esp
10fd0a: 8b 55 f4 mov -0xc(%ebp),%edx
10fd0d: 85 d2 test %edx,%edx
10fd0f: 74 17 je 10fd28 <_POSIX_Message_queue_Receive_support+0x40>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
10fd11: e8 a2 9b 00 00 call 1198b8 <__errno>
10fd16: c7 00 09 00 00 00 movl $0x9,(%eax)
10fd1c: b8 ff ff ff ff mov $0xffffffff,%eax
}
10fd21: 8b 5d fc mov -0x4(%ebp),%ebx
10fd24: c9 leave
10fd25: c3 ret
10fd26: 66 90 xchg %ax,%ax
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) {
10fd28: 8b 50 14 mov 0x14(%eax),%edx
10fd2b: 89 d1 mov %edx,%ecx
10fd2d: 83 e1 03 and $0x3,%ecx
10fd30: 49 dec %ecx
10fd31: 0f 84 af 00 00 00 je 10fde6 <_POSIX_Message_queue_Receive_support+0xfe>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq = the_mq_fd->Queue;
10fd37: 8b 40 10 mov 0x10(%eax),%eax
if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
10fd3a: 8b 4d 10 mov 0x10(%ebp),%ecx
10fd3d: 39 48 68 cmp %ecx,0x68(%eax)
10fd40: 77 62 ja 10fda4 <_POSIX_Message_queue_Receive_support+0xbc>
/*
* Now if something goes wrong, we return a "length" of -1
* to indicate an error.
*/
length_out = -1;
10fd42: c7 45 f0 ff ff ff ff movl $0xffffffff,-0x10(%ebp)
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
10fd49: 80 7d e7 00 cmpb $0x0,-0x19(%ebp)
10fd4d: 75 45 jne 10fd94 <_POSIX_Message_queue_Receive_support+0xac><== ALWAYS TAKEN
10fd4f: 31 d2 xor %edx,%edx <== NOT EXECUTED
do_wait = wait;
/*
* Now perform the actual message receive
*/
_CORE_message_queue_Seize(
10fd51: 83 ec 08 sub $0x8,%esp
10fd54: ff 75 1c pushl 0x1c(%ebp)
10fd57: 52 push %edx
10fd58: 8d 55 f0 lea -0x10(%ebp),%edx
10fd5b: 52 push %edx
10fd5c: ff 75 0c pushl 0xc(%ebp)
10fd5f: 53 push %ebx
10fd60: 83 c0 1c add $0x1c,%eax
10fd63: 50 push %eax
10fd64: e8 a3 1f 00 00 call 111d0c <_CORE_message_queue_Seize>
&length_out,
do_wait,
timeout
);
_Thread_Enable_dispatch();
10fd69: 83 c4 20 add $0x20,%esp
10fd6c: e8 23 3a 00 00 call 113794 <_Thread_Enable_dispatch>
*msg_prio =
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
10fd71: 8b 15 38 15 13 00 mov 0x131538,%edx
RTEMS_INLINE_ROUTINE unsigned int _POSIX_Message_queue_Priority_from_core(
CORE_message_queue_Submit_types priority
)
{
/* absolute value without a library dependency */
return ((priority >= 0) ? priority : -priority);
10fd77: 8b 42 24 mov 0x24(%edx),%eax
10fd7a: 85 c0 test %eax,%eax
10fd7c: 78 22 js 10fda0 <_POSIX_Message_queue_Receive_support+0xb8>
do_wait,
timeout
);
_Thread_Enable_dispatch();
*msg_prio =
10fd7e: 8b 4d 14 mov 0x14(%ebp),%ecx
10fd81: 89 01 mov %eax,(%ecx)
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
if ( !_Thread_Executing->Wait.return_code )
10fd83: 8b 42 34 mov 0x34(%edx),%eax
10fd86: 85 c0 test %eax,%eax
10fd88: 75 36 jne 10fdc0 <_POSIX_Message_queue_Receive_support+0xd8>
return length_out;
10fd8a: 8b 45 f0 mov -0x10(%ebp),%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
}
10fd8d: 8b 5d fc mov -0x4(%ebp),%ebx
10fd90: c9 leave
10fd91: c3 ret
10fd92: 66 90 xchg %ax,%ax
length_out = -1;
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
10fd94: 80 e6 40 and $0x40,%dh
10fd97: 0f 94 c2 sete %dl
10fd9a: 0f b6 d2 movzbl %dl,%edx
10fd9d: eb b2 jmp 10fd51 <_POSIX_Message_queue_Receive_support+0x69>
10fd9f: 90 nop
10fda0: f7 d8 neg %eax
10fda2: eb da jmp 10fd7e <_POSIX_Message_queue_Receive_support+0x96>
}
the_mq = the_mq_fd->Queue;
if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
_Thread_Enable_dispatch();
10fda4: e8 eb 39 00 00 call 113794 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EMSGSIZE );
10fda9: e8 0a 9b 00 00 call 1198b8 <__errno>
10fdae: c7 00 7a 00 00 00 movl $0x7a,(%eax)
10fdb4: b8 ff ff ff ff mov $0xffffffff,%eax
10fdb9: e9 63 ff ff ff jmp 10fd21 <_POSIX_Message_queue_Receive_support+0x39>
10fdbe: 66 90 xchg %ax,%ax
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
if ( !_Thread_Executing->Wait.return_code )
return length_out;
rtems_set_errno_and_return_minus_one(
10fdc0: e8 f3 9a 00 00 call 1198b8 <__errno>
10fdc5: 89 c3 mov %eax,%ebx
10fdc7: 83 ec 0c sub $0xc,%esp
10fdca: a1 38 15 13 00 mov 0x131538,%eax
10fdcf: ff 70 34 pushl 0x34(%eax)
10fdd2: e8 29 02 00 00 call 110000 <_POSIX_Message_queue_Translate_core_message_queue_return_code>
10fdd7: 89 03 mov %eax,(%ebx)
10fdd9: 83 c4 10 add $0x10,%esp
10fddc: b8 ff ff ff ff mov $0xffffffff,%eax
10fde1: e9 3b ff ff ff jmp 10fd21 <_POSIX_Message_queue_Receive_support+0x39>
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) {
_Thread_Enable_dispatch();
10fde6: e8 a9 39 00 00 call 113794 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EBADF );
10fdeb: e8 c8 9a 00 00 call 1198b8 <__errno>
10fdf0: c7 00 09 00 00 00 movl $0x9,(%eax)
10fdf6: b8 ff ff ff ff mov $0xffffffff,%eax
10fdfb: e9 21 ff ff ff jmp 10fd21 <_POSIX_Message_queue_Receive_support+0x39>
0010fe20 <_POSIX_Message_queue_Send_support>:
size_t msg_len,
uint32_t msg_prio,
bool wait,
Watchdog_Interval timeout
)
{
10fe20: 55 push %ebp
10fe21: 89 e5 mov %esp,%ebp
10fe23: 56 push %esi
10fe24: 53 push %ebx
10fe25: 83 ec 20 sub $0x20,%esp
10fe28: 8b 75 08 mov 0x8(%ebp),%esi
10fe2b: 8b 5d 14 mov 0x14(%ebp),%ebx
10fe2e: 8a 55 18 mov 0x18(%ebp),%dl
/*
* Validate the priority.
* XXX - Do not validate msg_prio is not less than 0.
*/
if ( msg_prio > MQ_PRIO_MAX )
10fe31: 83 fb 20 cmp $0x20,%ebx
10fe34: 0f 87 92 00 00 00 ja 10fecc <_POSIX_Message_queue_Send_support+0xac>
RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *_POSIX_Message_queue_Get_fd (
mqd_t id,
Objects_Locations *location
)
{
return (POSIX_Message_queue_Control_fd *) _Objects_Get(
10fe3a: 51 push %ecx
rtems_set_errno_and_return_minus_one( EINVAL );
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
10fe3b: 8d 45 f4 lea -0xc(%ebp),%eax
10fe3e: 50 push %eax
10fe3f: 56 push %esi
10fe40: 68 c0 14 13 00 push $0x1314c0
10fe45: 88 55 e4 mov %dl,-0x1c(%ebp)
10fe48: e8 13 2e 00 00 call 112c60 <_Objects_Get>
switch ( location ) {
10fe4d: 83 c4 10 add $0x10,%esp
10fe50: 8b 55 f4 mov -0xc(%ebp),%edx
10fe53: 85 d2 test %edx,%edx
10fe55: 8a 55 e4 mov -0x1c(%ebp),%dl
10fe58: 75 5e jne 10feb8 <_POSIX_Message_queue_Send_support+0x98>
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_RDONLY ) {
10fe5a: 8b 48 14 mov 0x14(%eax),%ecx
10fe5d: f6 c1 03 test $0x3,%cl
10fe60: 74 7e je 10fee0 <_POSIX_Message_queue_Send_support+0xc0>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq = the_mq_fd->Queue;
10fe62: 8b 40 10 mov 0x10(%eax),%eax
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
10fe65: 84 d2 test %dl,%dl
10fe67: 75 37 jne 10fea0 <_POSIX_Message_queue_Send_support+0x80>
10fe69: 31 d2 xor %edx,%edx
do_wait = wait;
/*
* Now perform the actual message receive
*/
msg_status = _CORE_message_queue_Submit(
10fe6b: ff 75 1c pushl 0x1c(%ebp)
10fe6e: 52 push %edx
RTEMS_INLINE_ROUTINE CORE_message_queue_Submit_types _POSIX_Message_queue_Priority_to_core(
unsigned int priority
)
{
return priority * -1;
10fe6f: f7 db neg %ebx
10fe71: 53 push %ebx
10fe72: 6a 00 push $0x0
10fe74: 56 push %esi
10fe75: ff 75 10 pushl 0x10(%ebp)
10fe78: ff 75 0c pushl 0xc(%ebp)
10fe7b: 83 c0 1c add $0x1c,%eax
10fe7e: 50 push %eax
10fe7f: e8 b4 1f 00 00 call 111e38 <_CORE_message_queue_Submit>
10fe84: 89 c3 mov %eax,%ebx
_POSIX_Message_queue_Priority_to_core( msg_prio ),
do_wait,
timeout /* no timeout */
);
_Thread_Enable_dispatch();
10fe86: 83 c4 20 add $0x20,%esp
10fe89: e8 06 39 00 00 call 113794 <_Thread_Enable_dispatch>
* after it wakes up. The returned status is correct for
* non-blocking operations but if we blocked, then we need
* to look at the status in our TCB.
*/
if ( msg_status == CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT )
10fe8e: 83 fb 07 cmp $0x7,%ebx
10fe91: 74 19 je 10feac <_POSIX_Message_queue_Send_support+0x8c>
msg_status = _Thread_Executing->Wait.return_code;
if ( !msg_status )
10fe93: 85 db test %ebx,%ebx
10fe95: 75 61 jne 10fef8 <_POSIX_Message_queue_Send_support+0xd8>
return msg_status;
10fe97: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
}
10fe99: 8d 65 f8 lea -0x8(%ebp),%esp
10fe9c: 5b pop %ebx
10fe9d: 5e pop %esi
10fe9e: c9 leave
10fe9f: c3 ret
the_mq = the_mq_fd->Queue;
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
10fea0: 31 d2 xor %edx,%edx
10fea2: f6 c5 40 test $0x40,%ch
10fea5: 0f 94 c2 sete %dl
10fea8: eb c1 jmp 10fe6b <_POSIX_Message_queue_Send_support+0x4b>
10feaa: 66 90 xchg %ax,%ax
* non-blocking operations but if we blocked, then we need
* to look at the status in our TCB.
*/
if ( msg_status == CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT )
msg_status = _Thread_Executing->Wait.return_code;
10feac: a1 38 15 13 00 mov 0x131538,%eax
10feb1: 8b 58 34 mov 0x34(%eax),%ebx
10feb4: eb dd jmp 10fe93 <_POSIX_Message_queue_Send_support+0x73>
10feb6: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
10feb8: e8 fb 99 00 00 call 1198b8 <__errno>
10febd: c7 00 09 00 00 00 movl $0x9,(%eax)
10fec3: b8 ff ff ff ff mov $0xffffffff,%eax
10fec8: eb cf jmp 10fe99 <_POSIX_Message_queue_Send_support+0x79>
10feca: 66 90 xchg %ax,%ax
* Validate the priority.
* XXX - Do not validate msg_prio is not less than 0.
*/
if ( msg_prio > MQ_PRIO_MAX )
rtems_set_errno_and_return_minus_one( EINVAL );
10fecc: e8 e7 99 00 00 call 1198b8 <__errno>
10fed1: c7 00 16 00 00 00 movl $0x16,(%eax)
10fed7: b8 ff ff ff ff mov $0xffffffff,%eax
10fedc: eb bb jmp 10fe99 <_POSIX_Message_queue_Send_support+0x79>
10fede: 66 90 xchg %ax,%ax
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_RDONLY ) {
_Thread_Enable_dispatch();
10fee0: e8 af 38 00 00 call 113794 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EBADF );
10fee5: e8 ce 99 00 00 call 1198b8 <__errno>
10feea: c7 00 09 00 00 00 movl $0x9,(%eax)
10fef0: b8 ff ff ff ff mov $0xffffffff,%eax
10fef5: eb a2 jmp 10fe99 <_POSIX_Message_queue_Send_support+0x79>
10fef7: 90 nop
msg_status = _Thread_Executing->Wait.return_code;
if ( !msg_status )
return msg_status;
rtems_set_errno_and_return_minus_one(
10fef8: e8 bb 99 00 00 call 1198b8 <__errno>
10fefd: 89 c6 mov %eax,%esi
10feff: 83 ec 0c sub $0xc,%esp
10ff02: 53 push %ebx
10ff03: e8 f8 00 00 00 call 110000 <_POSIX_Message_queue_Translate_core_message_queue_return_code>
10ff08: 89 06 mov %eax,(%esi)
10ff0a: 83 c4 10 add $0x10,%esp
10ff0d: b8 ff ff ff ff mov $0xffffffff,%eax
10ff12: eb 85 jmp 10fe99 <_POSIX_Message_queue_Send_support+0x79>
0010d0f4 <_POSIX_Mutex_Get>:
POSIX_Mutex_Control *_POSIX_Mutex_Get (
pthread_mutex_t *mutex,
Objects_Locations *location
)
{
10d0f4: 55 push %ebp
10d0f5: 89 e5 mov %esp,%ebp
10d0f7: 56 push %esi
10d0f8: 53 push %ebx
10d0f9: 8b 5d 08 mov 0x8(%ebp),%ebx
10d0fc: 8b 75 0c mov 0xc(%ebp),%esi
___POSIX_Mutex_Get_support_error_check( mutex, location );
10d0ff: 85 db test %ebx,%ebx
10d101: 74 39 je 10d13c <_POSIX_Mutex_Get+0x48>
___POSIX_Mutex_Get_support_auto_initialization( mutex, location );
10d103: 8b 03 mov (%ebx),%eax
10d105: 83 f8 ff cmp $0xffffffff,%eax
10d108: 74 1a je 10d124 <_POSIX_Mutex_Get+0x30>
return (POSIX_Mutex_Control *)
_Objects_Get( &_POSIX_Mutex_Information, (Objects_Id) *mutex, location );
10d10a: 52 push %edx
10d10b: 56 push %esi
10d10c: 50 push %eax
10d10d: 68 a0 d1 12 00 push $0x12d1a0
10d112: e8 e9 2b 00 00 call 10fd00 <_Objects_Get>
{
___POSIX_Mutex_Get_support_error_check( mutex, location );
___POSIX_Mutex_Get_support_auto_initialization( mutex, location );
return (POSIX_Mutex_Control *)
10d117: 83 c4 10 add $0x10,%esp
_Objects_Get( &_POSIX_Mutex_Information, (Objects_Id) *mutex, location );
}
10d11a: 8d 65 f8 lea -0x8(%ebp),%esp
10d11d: 5b pop %ebx
10d11e: 5e pop %esi
10d11f: c9 leave
10d120: c3 ret
10d121: 8d 76 00 lea 0x0(%esi),%esi
Objects_Locations *location
)
{
___POSIX_Mutex_Get_support_error_check( mutex, location );
___POSIX_Mutex_Get_support_auto_initialization( mutex, location );
10d124: 83 ec 08 sub $0x8,%esp
10d127: 6a 00 push $0x0
10d129: 53 push %ebx
10d12a: e8 b9 00 00 00 call 10d1e8 <pthread_mutex_init>
10d12f: 83 c4 10 add $0x10,%esp
10d132: 85 c0 test %eax,%eax
10d134: 75 06 jne 10d13c <_POSIX_Mutex_Get+0x48>
10d136: 8b 03 mov (%ebx),%eax
10d138: eb d0 jmp 10d10a <_POSIX_Mutex_Get+0x16>
10d13a: 66 90 xchg %ax,%ax
10d13c: c7 06 01 00 00 00 movl $0x1,(%esi)
10d142: 31 c0 xor %eax,%eax
10d144: eb d4 jmp 10d11a <_POSIX_Mutex_Get+0x26>
0010d148 <_POSIX_Mutex_Get_interrupt_disable>:
POSIX_Mutex_Control *_POSIX_Mutex_Get_interrupt_disable (
pthread_mutex_t *mutex,
Objects_Locations *location,
ISR_Level *level
)
{
10d148: 55 push %ebp
10d149: 89 e5 mov %esp,%ebp
10d14b: 56 push %esi
10d14c: 53 push %ebx
10d14d: 8b 5d 08 mov 0x8(%ebp),%ebx
10d150: 8b 75 0c mov 0xc(%ebp),%esi
___POSIX_Mutex_Get_support_error_check( mutex, location );
10d153: 85 db test %ebx,%ebx
10d155: 74 39 je 10d190 <_POSIX_Mutex_Get_interrupt_disable+0x48>
___POSIX_Mutex_Get_support_auto_initialization( mutex, location );
10d157: 8b 03 mov (%ebx),%eax
10d159: 83 f8 ff cmp $0xffffffff,%eax
10d15c: 74 1a je 10d178 <_POSIX_Mutex_Get_interrupt_disable+0x30>
return (POSIX_Mutex_Control *) _Objects_Get_isr_disable(
10d15e: ff 75 10 pushl 0x10(%ebp)
10d161: 56 push %esi
10d162: 50 push %eax
10d163: 68 a0 d1 12 00 push $0x12d1a0
10d168: e8 3b 2b 00 00 call 10fca8 <_Objects_Get_isr_disable>
10d16d: 83 c4 10 add $0x10,%esp
&_POSIX_Mutex_Information,
(Objects_Id) *mutex,
location,
level
);
}
10d170: 8d 65 f8 lea -0x8(%ebp),%esp
10d173: 5b pop %ebx
10d174: 5e pop %esi
10d175: c9 leave
10d176: c3 ret
10d177: 90 nop
ISR_Level *level
)
{
___POSIX_Mutex_Get_support_error_check( mutex, location );
___POSIX_Mutex_Get_support_auto_initialization( mutex, location );
10d178: 83 ec 08 sub $0x8,%esp
10d17b: 6a 00 push $0x0
10d17d: 53 push %ebx
10d17e: e8 65 00 00 00 call 10d1e8 <pthread_mutex_init>
10d183: 83 c4 10 add $0x10,%esp
10d186: 85 c0 test %eax,%eax
10d188: 75 06 jne 10d190 <_POSIX_Mutex_Get_interrupt_disable+0x48>
10d18a: 8b 03 mov (%ebx),%eax
10d18c: eb d0 jmp 10d15e <_POSIX_Mutex_Get_interrupt_disable+0x16>
10d18e: 66 90 xchg %ax,%ax
10d190: c7 06 01 00 00 00 movl $0x1,(%esi)
10d196: 31 c0 xor %eax,%eax
10d198: eb d6 jmp 10d170 <_POSIX_Mutex_Get_interrupt_disable+0x28>
0010d348 <_POSIX_Mutex_Lock_support>:
int _POSIX_Mutex_Lock_support(
pthread_mutex_t *mutex,
bool blocking,
Watchdog_Interval timeout
)
{
10d348: 55 push %ebp
10d349: 89 e5 mov %esp,%ebp
10d34b: 53 push %ebx
10d34c: 83 ec 18 sub $0x18,%esp
10d34f: 8a 5d 0c mov 0xc(%ebp),%bl
register POSIX_Mutex_Control *the_mutex;
Objects_Locations location;
ISR_Level level;
the_mutex = _POSIX_Mutex_Get_interrupt_disable( mutex, &location, &level );
10d352: 8d 45 f0 lea -0x10(%ebp),%eax
10d355: 50 push %eax
10d356: 8d 45 f4 lea -0xc(%ebp),%eax
10d359: 50 push %eax
10d35a: ff 75 08 pushl 0x8(%ebp)
10d35d: e8 e6 fd ff ff call 10d148 <_POSIX_Mutex_Get_interrupt_disable>
switch ( location ) {
10d362: 83 c4 10 add $0x10,%esp
10d365: 8b 55 f4 mov -0xc(%ebp),%edx
10d368: 85 d2 test %edx,%edx
10d36a: 75 34 jne 10d3a0 <_POSIX_Mutex_Lock_support+0x58>
case OBJECTS_LOCAL:
_CORE_mutex_Seize(
10d36c: 83 ec 0c sub $0xc,%esp
10d36f: ff 75 f0 pushl -0x10(%ebp)
10d372: ff 75 10 pushl 0x10(%ebp)
10d375: 0f b6 db movzbl %bl,%ebx
10d378: 53 push %ebx
10d379: ff 70 08 pushl 0x8(%eax)
10d37c: 83 c0 14 add $0x14,%eax
10d37f: 50 push %eax
10d380: e8 47 1d 00 00 call 10f0cc <_CORE_mutex_Seize>
the_mutex->Object.id,
blocking,
timeout,
level
);
return _POSIX_Mutex_Translate_core_mutex_return_code(
10d385: 83 c4 14 add $0x14,%esp
(CORE_mutex_Status) _Thread_Executing->Wait.return_code
10d388: a1 78 d3 12 00 mov 0x12d378,%eax
the_mutex->Object.id,
blocking,
timeout,
level
);
return _POSIX_Mutex_Translate_core_mutex_return_code(
10d38d: ff 70 34 pushl 0x34(%eax)
10d390: e8 1b 01 00 00 call 10d4b0 <_POSIX_Mutex_Translate_core_mutex_return_code>
10d395: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10d398: 8b 5d fc mov -0x4(%ebp),%ebx
10d39b: c9 leave
10d39c: c3 ret
10d39d: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10d3a0: b8 16 00 00 00 mov $0x16,%eax
}
10d3a5: 8b 5d fc mov -0x4(%ebp),%ebx
10d3a8: c9 leave
10d3a9: c3 ret
00114958 <_POSIX_Semaphore_Create_support>:
const char *name,
int pshared,
unsigned int value,
POSIX_Semaphore_Control **the_sem
)
{
114958: 55 push %ebp
114959: 89 e5 mov %esp,%ebp
11495b: 56 push %esi
11495c: 53 push %ebx
11495d: 8b 5d 08 mov 0x8(%ebp),%ebx
POSIX_Semaphore_Control *the_semaphore;
CORE_semaphore_Attributes *the_sem_attr;
char *name_p = (char *)name;
/* Sharing semaphores among processes is not currently supported */
if (pshared != 0)
114960: 8b 55 0c mov 0xc(%ebp),%edx
114963: 85 d2 test %edx,%edx
114965: 0f 85 b9 00 00 00 jne 114a24 <_POSIX_Semaphore_Create_support+0xcc>
rtems_set_errno_and_return_minus_one( ENOSYS );
if ( name ) {
11496b: 85 db test %ebx,%ebx
11496d: 74 1c je 11498b <_POSIX_Semaphore_Create_support+0x33>
if ( strnlen( name, NAME_MAX ) >= NAME_MAX )
11496f: 83 ec 08 sub $0x8,%esp
114972: 68 ff 00 00 00 push $0xff
114977: 53 push %ebx
114978: e8 0b 3e 00 00 call 118788 <strnlen>
11497d: 83 c4 10 add $0x10,%esp
114980: 3d fe 00 00 00 cmp $0xfe,%eax
114985: 0f 87 ad 00 00 00 ja 114a38 <_POSIX_Semaphore_Create_support+0xe0>
11498b: a1 b0 db 12 00 mov 0x12dbb0,%eax
114990: 40 inc %eax
114991: a3 b0 db 12 00 mov %eax,0x12dbb0
*/
RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Allocate( void )
{
return (POSIX_Semaphore_Control *)
_Objects_Allocate( &_POSIX_Semaphore_Information );
114996: 83 ec 0c sub $0xc,%esp
114999: 68 00 df 12 00 push $0x12df00
11499e: e8 89 b9 ff ff call 11032c <_Objects_Allocate>
1149a3: 89 c6 mov %eax,%esi
_Thread_Disable_dispatch();
the_semaphore = _POSIX_Semaphore_Allocate();
if ( !the_semaphore ) {
1149a5: 83 c4 10 add $0x10,%esp
1149a8: 85 c0 test %eax,%eax
1149aa: 0f 84 9a 00 00 00 je 114a4a <_POSIX_Semaphore_Create_support+0xf2>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENOSPC );
}
the_semaphore->process_shared = pshared;
1149b0: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax)
if ( name ) {
1149b7: 85 db test %ebx,%ebx
1149b9: 74 55 je 114a10 <_POSIX_Semaphore_Create_support+0xb8>
the_semaphore->named = true;
1149bb: c6 40 14 01 movb $0x1,0x14(%eax)
the_semaphore->open_count = 1;
1149bf: c7 40 18 01 00 00 00 movl $0x1,0x18(%eax)
the_semaphore->linked = true;
1149c6: c6 40 15 01 movb $0x1,0x15(%eax)
* blocking tasks on this semaphore should be. It could somehow
* be derived from the current scheduling policy. One
* thing is certain, no matter what we decide, it won't be
* the same as all other POSIX implementations. :)
*/
the_sem_attr->discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
1149ca: c7 46 60 00 00 00 00 movl $0x0,0x60(%esi)
/*
* This effectively disables limit checking.
*/
the_sem_attr->maximum_count = 0xFFFFFFFF;
1149d1: c7 46 5c ff ff ff ff movl $0xffffffff,0x5c(%esi)
_CORE_semaphore_Initialize( &the_semaphore->Semaphore, the_sem_attr, value );
1149d8: 50 push %eax
1149d9: ff 75 10 pushl 0x10(%ebp)
the_semaphore->named = false;
the_semaphore->open_count = 0;
the_semaphore->linked = false;
}
the_sem_attr = &the_semaphore->Semaphore.Attributes;
1149dc: 8d 46 5c lea 0x5c(%esi),%eax
/*
* This effectively disables limit checking.
*/
the_sem_attr->maximum_count = 0xFFFFFFFF;
_CORE_semaphore_Initialize( &the_semaphore->Semaphore, the_sem_attr, value );
1149df: 50 push %eax
1149e0: 8d 46 1c lea 0x1c(%esi),%eax
1149e3: 50 push %eax
1149e4: e8 cb b3 ff ff call 10fdb4 <_CORE_semaphore_Initialize>
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
1149e9: 0f b7 56 08 movzwl 0x8(%esi),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
1149ed: a1 1c df 12 00 mov 0x12df1c,%eax
1149f2: 89 34 90 mov %esi,(%eax,%edx,4)
the_object
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
/* ASSERT: information->is_string */
the_object->name.name_p = name;
1149f5: 89 5e 0c mov %ebx,0xc(%esi)
&_POSIX_Semaphore_Information,
&the_semaphore->Object,
name_p
);
*the_sem = the_semaphore;
1149f8: 8b 45 14 mov 0x14(%ebp),%eax
1149fb: 89 30 mov %esi,(%eax)
_Thread_Enable_dispatch();
1149fd: e8 16 c9 ff ff call 111318 <_Thread_Enable_dispatch>
return 0;
114a02: 83 c4 10 add $0x10,%esp
114a05: 31 c0 xor %eax,%eax
}
114a07: 8d 65 f8 lea -0x8(%ebp),%esp
114a0a: 5b pop %ebx
114a0b: 5e pop %esi
114a0c: c9 leave
114a0d: c3 ret
114a0e: 66 90 xchg %ax,%ax
if ( name ) {
the_semaphore->named = true;
the_semaphore->open_count = 1;
the_semaphore->linked = true;
} else {
the_semaphore->named = false;
114a10: c6 40 14 00 movb $0x0,0x14(%eax)
the_semaphore->open_count = 0;
114a14: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
the_semaphore->linked = false;
114a1b: c6 40 15 00 movb $0x0,0x15(%eax)
114a1f: eb a9 jmp 1149ca <_POSIX_Semaphore_Create_support+0x72>
114a21: 8d 76 00 lea 0x0(%esi),%esi
CORE_semaphore_Attributes *the_sem_attr;
char *name_p = (char *)name;
/* Sharing semaphores among processes is not currently supported */
if (pshared != 0)
rtems_set_errno_and_return_minus_one( ENOSYS );
114a24: e8 33 2c 00 00 call 11765c <__errno>
114a29: c7 00 58 00 00 00 movl $0x58,(%eax)
114a2f: b8 ff ff ff ff mov $0xffffffff,%eax
114a34: eb d1 jmp 114a07 <_POSIX_Semaphore_Create_support+0xaf>
114a36: 66 90 xchg %ax,%ax
if ( name ) {
if ( strnlen( name, NAME_MAX ) >= NAME_MAX )
rtems_set_errno_and_return_minus_one( ENAMETOOLONG );
114a38: e8 1f 2c 00 00 call 11765c <__errno>
114a3d: c7 00 5b 00 00 00 movl $0x5b,(%eax)
114a43: b8 ff ff ff ff mov $0xffffffff,%eax
114a48: eb bd jmp 114a07 <_POSIX_Semaphore_Create_support+0xaf>
_Thread_Disable_dispatch();
the_semaphore = _POSIX_Semaphore_Allocate();
if ( !the_semaphore ) {
_Thread_Enable_dispatch();
114a4a: e8 c9 c8 ff ff call 111318 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSPC );
114a4f: e8 08 2c 00 00 call 11765c <__errno>
114a54: c7 00 1c 00 00 00 movl $0x1c,(%eax)
114a5a: b8 ff ff ff ff mov $0xffffffff,%eax
114a5f: eb a6 jmp 114a07 <_POSIX_Semaphore_Create_support+0xaf>
00114ab4 <_POSIX_Semaphore_Name_to_id>:
int _POSIX_Semaphore_Name_to_id(
const char *name,
sem_t *id
)
{
114ab4: 55 push %ebp
114ab5: 89 e5 mov %esp,%ebp
114ab7: 83 ec 18 sub $0x18,%esp
114aba: 8b 45 08 mov 0x8(%ebp),%eax
Objects_Name_or_id_lookup_errors status;
Objects_Id the_id;
if ( !name )
114abd: 85 c0 test %eax,%eax
114abf: 74 05 je 114ac6 <_POSIX_Semaphore_Name_to_id+0x12>
return EINVAL;
if ( !name[0] )
114ac1: 80 38 00 cmpb $0x0,(%eax)
114ac4: 75 0a jne 114ad0 <_POSIX_Semaphore_Name_to_id+0x1c>
return EINVAL;
114ac6: b8 16 00 00 00 mov $0x16,%eax
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL )
return 0;
return ENOENT;
}
114acb: c9 leave
114acc: c3 ret
114acd: 8d 76 00 lea 0x0(%esi),%esi
return EINVAL;
if ( !name[0] )
return EINVAL;
status = _Objects_Name_to_id_string(
114ad0: 52 push %edx
114ad1: 8d 55 f4 lea -0xc(%ebp),%edx
114ad4: 52 push %edx
114ad5: 50 push %eax
114ad6: 68 00 df 12 00 push $0x12df00
114adb: e8 7c 0c 00 00 call 11575c <_Objects_Name_to_id_string>
&_POSIX_Semaphore_Information,
name,
&the_id
);
*id = the_id;
114ae0: 8b 4d f4 mov -0xc(%ebp),%ecx
114ae3: 8b 55 0c mov 0xc(%ebp),%edx
114ae6: 89 0a mov %ecx,(%edx)
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL )
114ae8: 83 c4 10 add $0x10,%esp
return 0;
114aeb: 83 f8 01 cmp $0x1,%eax
114aee: 19 c0 sbb %eax,%eax
114af0: f7 d0 not %eax
114af2: 83 e0 02 and $0x2,%eax
return ENOENT;
}
114af5: c9 leave
114af6: c3 ret
00114b20 <_POSIX_Semaphore_Wait_support>:
int _POSIX_Semaphore_Wait_support(
sem_t *sem,
bool blocking,
Watchdog_Interval timeout
)
{
114b20: 55 push %ebp
114b21: 89 e5 mov %esp,%ebp
114b23: 53 push %ebx
114b24: 83 ec 18 sub $0x18,%esp
114b27: 8a 5d 0c mov 0xc(%ebp),%bl
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
114b2a: 8d 45 f4 lea -0xc(%ebp),%eax
sem_t *id,
Objects_Locations *location
)
{
return (POSIX_Semaphore_Control *)
_Objects_Get( &_POSIX_Semaphore_Information, (Objects_Id)*id, location );
114b2d: 50 push %eax
114b2e: 8b 45 08 mov 0x8(%ebp),%eax
114b31: ff 30 pushl (%eax)
114b33: 68 00 df 12 00 push $0x12df00
114b38: e8 a7 bc ff ff call 1107e4 <_Objects_Get>
switch ( location ) {
114b3d: 83 c4 10 add $0x10,%esp
114b40: 8b 55 f4 mov -0xc(%ebp),%edx
114b43: 85 d2 test %edx,%edx
114b45: 74 15 je 114b5c <_POSIX_Semaphore_Wait_support+0x3c>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
114b47: e8 10 2b 00 00 call 11765c <__errno>
114b4c: c7 00 16 00 00 00 movl $0x16,(%eax)
114b52: b8 ff ff ff ff mov $0xffffffff,%eax
}
114b57: 8b 5d fc mov -0x4(%ebp),%ebx
114b5a: c9 leave
114b5b: c3 ret
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_semaphore_Seize(
114b5c: ff 75 10 pushl 0x10(%ebp)
114b5f: 0f b6 db movzbl %bl,%ebx
114b62: 53 push %ebx
114b63: ff 70 08 pushl 0x8(%eax)
114b66: 83 c0 1c add $0x1c,%eax
114b69: 50 push %eax
114b6a: e8 29 07 00 00 call 115298 <_CORE_semaphore_Seize>
&the_semaphore->Semaphore,
the_semaphore->Object.id,
blocking,
timeout
);
_Thread_Enable_dispatch();
114b6f: e8 a4 c7 ff ff call 111318 <_Thread_Enable_dispatch>
if ( !_Thread_Executing->Wait.return_code )
114b74: 83 c4 10 add $0x10,%esp
114b77: a1 98 e1 12 00 mov 0x12e198,%eax
114b7c: 8b 40 34 mov 0x34(%eax),%eax
114b7f: 85 c0 test %eax,%eax
114b81: 75 09 jne 114b8c <_POSIX_Semaphore_Wait_support+0x6c>
return 0;
114b83: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
114b85: 8b 5d fc mov -0x4(%ebp),%ebx
114b88: c9 leave
114b89: c3 ret
114b8a: 66 90 xchg %ax,%ax
_Thread_Enable_dispatch();
if ( !_Thread_Executing->Wait.return_code )
return 0;
rtems_set_errno_and_return_minus_one(
114b8c: e8 cb 2a 00 00 call 11765c <__errno>
114b91: 89 c3 mov %eax,%ebx
114b93: 83 ec 0c sub $0xc,%esp
114b96: a1 98 e1 12 00 mov 0x12e198,%eax
114b9b: ff 70 34 pushl 0x34(%eax)
114b9e: e8 29 26 00 00 call 1171cc <_POSIX_Semaphore_Translate_core_semaphore_return_code>
114ba3: 89 03 mov %eax,(%ebx)
114ba5: 83 c4 10 add $0x10,%esp
114ba8: b8 ff ff ff ff mov $0xffffffff,%eax
114bad: eb a8 jmp 114b57 <_POSIX_Semaphore_Wait_support+0x37>
001106dc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>:
#include <rtems/posix/pthread.h>
void _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch(
Thread_Control *the_thread
)
{
1106dc: 55 push %ebp
1106dd: 89 e5 mov %esp,%ebp
1106df: 83 ec 08 sub $0x8,%esp
1106e2: 8b 55 08 mov 0x8(%ebp),%edx
POSIX_API_Control *thread_support;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
1106e5: 8b 82 ec 00 00 00 mov 0xec(%edx),%eax
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
1106eb: 8b 88 d8 00 00 00 mov 0xd8(%eax),%ecx
1106f1: 85 c9 test %ecx,%ecx
1106f3: 75 09 jne 1106fe <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x22><== NEVER TAKEN
1106f5: 83 b8 dc 00 00 00 01 cmpl $0x1,0xdc(%eax)
1106fc: 74 06 je 110704 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x28>
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
} else
_Thread_Enable_dispatch();
}
1106fe: c9 leave
thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
thread_support->cancelation_requested ) {
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
} else
_Thread_Enable_dispatch();
1106ff: e9 38 d6 ff ff jmp 10dd3c <_Thread_Enable_dispatch>
POSIX_API_Control *thread_support;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
110704: 8b 80 e0 00 00 00 mov 0xe0(%eax),%eax
11070a: 85 c0 test %eax,%eax
11070c: 74 f0 je 1106fe <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x22>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
11070e: a1 30 91 12 00 mov 0x129130,%eax
110713: 48 dec %eax
110714: a3 30 91 12 00 mov %eax,0x129130
thread_support->cancelation_requested ) {
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
110719: 83 ec 08 sub $0x8,%esp
11071c: 6a ff push $0xffffffff
11071e: 52 push %edx
11071f: e8 c0 08 00 00 call 110fe4 <_POSIX_Thread_Exit>
110724: 83 c4 10 add $0x10,%esp
} else
_Thread_Enable_dispatch();
}
110727: c9 leave
110728: c3 ret
00111a4c <_POSIX_Thread_Translate_sched_param>:
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
111a4c: 55 push %ebp
111a4d: 89 e5 mov %esp,%ebp
111a4f: 57 push %edi
111a50: 56 push %esi
111a51: 53 push %ebx
111a52: 83 ec 18 sub $0x18,%esp
111a55: 8b 5d 08 mov 0x8(%ebp),%ebx
111a58: 8b 75 0c mov 0xc(%ebp),%esi
111a5b: 8b 7d 10 mov 0x10(%ebp),%edi
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
111a5e: ff 36 pushl (%esi)
111a60: e8 cb ff ff ff call 111a30 <_POSIX_Priority_Is_valid>
111a65: 83 c4 10 add $0x10,%esp
111a68: 84 c0 test %al,%al
111a6a: 74 2a je 111a96 <_POSIX_Thread_Translate_sched_param+0x4a><== NEVER TAKEN
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
111a6c: c7 07 00 00 00 00 movl $0x0,(%edi)
*budget_callout = NULL;
111a72: 8b 45 14 mov 0x14(%ebp),%eax
111a75: c7 00 00 00 00 00 movl $0x0,(%eax)
if ( policy == SCHED_OTHER ) {
111a7b: 85 db test %ebx,%ebx
111a7d: 74 25 je 111aa4 <_POSIX_Thread_Translate_sched_param+0x58>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
return 0;
}
if ( policy == SCHED_FIFO ) {
111a7f: 83 fb 01 cmp $0x1,%ebx
111a82: 0f 84 90 00 00 00 je 111b18 <_POSIX_Thread_Translate_sched_param+0xcc>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
}
if ( policy == SCHED_RR ) {
111a88: 83 fb 02 cmp $0x2,%ebx
111a8b: 0f 84 8f 00 00 00 je 111b20 <_POSIX_Thread_Translate_sched_param+0xd4>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
return 0;
}
if ( policy == SCHED_SPORADIC ) {
111a91: 83 fb 04 cmp $0x4,%ebx
111a94: 74 1e je 111ab4 <_POSIX_Thread_Translate_sched_param+0x68>
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
return EINVAL;
111a96: b8 16 00 00 00 mov $0x16,%eax
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
}
111a9b: 8d 65 f4 lea -0xc(%ebp),%esp
111a9e: 5b pop %ebx
111a9f: 5e pop %esi
111aa0: 5f pop %edi
111aa1: c9 leave
111aa2: c3 ret
111aa3: 90 nop
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
*budget_callout = NULL;
if ( policy == SCHED_OTHER ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
111aa4: c7 07 01 00 00 00 movl $0x1,(%edi)
return 0;
111aaa: 31 c0 xor %eax,%eax
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
}
111aac: 8d 65 f4 lea -0xc(%ebp),%esp
111aaf: 5b pop %ebx
111ab0: 5e pop %esi
111ab1: 5f pop %edi
111ab2: c9 leave
111ab3: c3 ret
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
return 0;
}
if ( policy == SCHED_SPORADIC ) {
if ( (param->sched_ss_repl_period.tv_sec == 0) &&
111ab4: 8b 5e 08 mov 0x8(%esi),%ebx
111ab7: 85 db test %ebx,%ebx
111ab9: 75 07 jne 111ac2 <_POSIX_Thread_Translate_sched_param+0x76>
111abb: 8b 4e 0c mov 0xc(%esi),%ecx
111abe: 85 c9 test %ecx,%ecx
111ac0: 74 d4 je 111a96 <_POSIX_Thread_Translate_sched_param+0x4a>
(param->sched_ss_repl_period.tv_nsec == 0) )
return EINVAL;
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
111ac2: 8b 56 10 mov 0x10(%esi),%edx
111ac5: 85 d2 test %edx,%edx
111ac7: 75 07 jne 111ad0 <_POSIX_Thread_Translate_sched_param+0x84>
111ac9: 8b 46 14 mov 0x14(%esi),%eax
111acc: 85 c0 test %eax,%eax
111ace: 74 c6 je 111a96 <_POSIX_Thread_Translate_sched_param+0x4a>
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
111ad0: 83 ec 0c sub $0xc,%esp
111ad3: 8d 46 08 lea 0x8(%esi),%eax
111ad6: 50 push %eax
111ad7: e8 00 da ff ff call 10f4dc <_Timespec_To_ticks>
111adc: 89 c3 mov %eax,%ebx
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
111ade: 8d 46 10 lea 0x10(%esi),%eax
111ae1: 89 04 24 mov %eax,(%esp)
111ae4: e8 f3 d9 ff ff call 10f4dc <_Timespec_To_ticks>
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
111ae9: 83 c4 10 add $0x10,%esp
111aec: 39 c3 cmp %eax,%ebx
111aee: 72 a6 jb 111a96 <_POSIX_Thread_Translate_sched_param+0x4a>
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
111af0: 83 ec 0c sub $0xc,%esp
111af3: ff 76 04 pushl 0x4(%esi)
111af6: e8 35 ff ff ff call 111a30 <_POSIX_Priority_Is_valid>
111afb: 83 c4 10 add $0x10,%esp
111afe: 84 c0 test %al,%al
111b00: 74 94 je 111a96 <_POSIX_Thread_Translate_sched_param+0x4a>
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
111b02: c7 07 03 00 00 00 movl $0x3,(%edi)
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
111b08: 8b 45 14 mov 0x14(%ebp),%eax
111b0b: c7 00 14 bd 10 00 movl $0x10bd14,(%eax)
return 0;
111b11: 31 c0 xor %eax,%eax
111b13: eb 86 jmp 111a9b <_POSIX_Thread_Translate_sched_param+0x4f>
111b15: 8d 76 00 lea 0x0(%esi),%esi
return 0;
}
if ( policy == SCHED_FIFO ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
111b18: 31 c0 xor %eax,%eax
111b1a: e9 7c ff ff ff jmp 111a9b <_POSIX_Thread_Translate_sched_param+0x4f>
111b1f: 90 nop
}
if ( policy == SCHED_RR ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
111b20: c7 07 02 00 00 00 movl $0x2,(%edi)
return 0;
111b26: 31 c0 xor %eax,%eax
111b28: e9 6e ff ff ff jmp 111a9b <_POSIX_Thread_Translate_sched_param+0x4f>
001108e8 <_POSIX_Threads_Create_extension>:
bool _POSIX_Threads_Create_extension(
Thread_Control *executing __attribute__((unused)),
Thread_Control *created
)
{
1108e8: 55 push %ebp
1108e9: 89 e5 mov %esp,%ebp
1108eb: 57 push %edi
1108ec: 56 push %esi
1108ed: 53 push %ebx
1108ee: 83 ec 28 sub $0x28,%esp
1108f1: 8b 55 0c mov 0xc(%ebp),%edx
POSIX_API_Control *api;
POSIX_API_Control *executing_api;
api = _Workspace_Allocate( sizeof( POSIX_API_Control ) );
1108f4: 68 f0 00 00 00 push $0xf0
1108f9: 89 55 e4 mov %edx,-0x1c(%ebp)
1108fc: e8 5f e0 ff ff call 10e960 <_Workspace_Allocate>
110901: 89 c3 mov %eax,%ebx
if ( !api )
110903: 83 c4 10 add $0x10,%esp
110906: 85 c0 test %eax,%eax
110908: 8b 55 e4 mov -0x1c(%ebp),%edx
11090b: 0f 84 2f 01 00 00 je 110a40 <_POSIX_Threads_Create_extension+0x158><== NEVER TAKEN
return false;
created->API_Extensions[ THREAD_API_POSIX ] = api;
110911: 89 82 ec 00 00 00 mov %eax,0xec(%edx)
/* XXX check all fields are touched */
api->Attributes = _POSIX_Threads_Default_attributes;
110917: b9 40 00 00 00 mov $0x40,%ecx
11091c: 31 c0 xor %eax,%eax
11091e: 89 df mov %ebx,%edi
110920: f3 aa rep stos %al,%es:(%edi)
110922: c7 03 01 00 00 00 movl $0x1,(%ebx)
110928: c7 43 10 01 00 00 00 movl $0x1,0x10(%ebx)
11092f: c7 43 14 01 00 00 00 movl $0x1,0x14(%ebx)
110936: c7 43 18 02 00 00 00 movl $0x2,0x18(%ebx)
11093d: c7 43 38 01 00 00 00 movl $0x1,0x38(%ebx)
110944: c7 43 3c 01 00 00 00 movl $0x1,0x3c(%ebx)
api->detachstate = _POSIX_Threads_Default_attributes.detachstate;
11094b: c7 43 40 01 00 00 00 movl $0x1,0x40(%ebx)
api->schedpolicy = _POSIX_Threads_Default_attributes.schedpolicy;
110952: c7 83 84 00 00 00 01 movl $0x1,0x84(%ebx)
110959: 00 00 00
api->schedparam = _POSIX_Threads_Default_attributes.schedparam;
11095c: be 38 1c 12 00 mov $0x121c38,%esi
110961: 8d bb 88 00 00 00 lea 0x88(%ebx),%edi
110967: b1 07 mov $0x7,%cl
110969: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
RTEMS_INLINE_ROUTINE int _POSIX_Priority_From_core(
Priority_Control priority
)
{
return (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
11096b: 0f b6 05 f4 3a 12 00 movzbl 0x123af4,%eax
110972: 2b 42 14 sub 0x14(%edx),%eax
110975: 89 83 88 00 00 00 mov %eax,0x88(%ebx)
_POSIX_Priority_From_core( created->current_priority );
/*
* POSIX 1003.1 1996, 18.2.2.2
*/
api->cancelation_requested = 0;
11097b: c7 83 e0 00 00 00 00 movl $0x0,0xe0(%ebx)
110982: 00 00 00
api->cancelability_state = PTHREAD_CANCEL_ENABLE;
110985: c7 83 d8 00 00 00 00 movl $0x0,0xd8(%ebx)
11098c: 00 00 00
api->cancelability_type = PTHREAD_CANCEL_DEFERRED;
11098f: c7 83 dc 00 00 00 00 movl $0x0,0xdc(%ebx)
110996: 00 00 00
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
110999: 8d 83 e8 00 00 00 lea 0xe8(%ebx),%eax
11099f: 89 83 e4 00 00 00 mov %eax,0xe4(%ebx)
head->next = tail;
head->previous = NULL;
1109a5: c7 83 e8 00 00 00 00 movl $0x0,0xe8(%ebx)
1109ac: 00 00 00
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
1109af: 8d 83 e4 00 00 00 lea 0xe4(%ebx),%eax
1109b5: 89 83 ec 00 00 00 mov %eax,0xec(%ebx)
*
* The check for class == 1 is debug. Should never really happen.
*/
/* XXX use signal constants */
api->signals_pending = 0;
1109bb: c7 83 d4 00 00 00 00 movl $0x0,0xd4(%ebx)
1109c2: 00 00 00
1109c5: 0f b6 42 0b movzbl 0xb(%edx),%eax
1109c9: 83 e0 07 and $0x7,%eax
if ( _Objects_Get_API( created->Object.id ) == OBJECTS_POSIX_API
1109cc: 83 f8 03 cmp $0x3,%eax
1109cf: 74 53 je 110a24 <_POSIX_Threads_Create_extension+0x13c>
#endif
) {
executing_api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
api->signals_blocked = executing_api->signals_blocked;
} else {
api->signals_blocked = 0xffffffff;
1109d1: c7 83 d0 00 00 00 ff movl $0xffffffff,0xd0(%ebx)
1109d8: ff ff ff
}
_Thread_queue_Initialize(
1109db: 6a 00 push $0x0
1109dd: 68 00 10 00 00 push $0x1000
1109e2: 6a 00 push $0x0
1109e4: 8d 43 44 lea 0x44(%ebx),%eax
1109e7: 50 push %eax
1109e8: 89 55 e4 mov %edx,-0x1c(%ebp)
1109eb: e8 48 d6 ff ff call 10e038 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_JOIN_AT_EXIT,
0
);
_Watchdog_Initialize(
1109f0: 8b 55 e4 mov -0x1c(%ebp),%edx
1109f3: 8b 42 08 mov 0x8(%edx),%eax
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
1109f6: c7 83 b0 00 00 00 00 movl $0x0,0xb0(%ebx)
1109fd: 00 00 00
the_watchdog->routine = routine;
110a00: c7 83 c4 00 00 00 4c movl $0x110a4c,0xc4(%ebx)
110a07: 0a 11 00
the_watchdog->id = id;
110a0a: 89 83 c8 00 00 00 mov %eax,0xc8(%ebx)
the_watchdog->user_data = user_data;
110a10: 89 93 cc 00 00 00 mov %edx,0xcc(%ebx)
_POSIX_Threads_Sporadic_budget_TSR,
created->Object.id,
created
);
return true;
110a16: 83 c4 10 add $0x10,%esp
110a19: b0 01 mov $0x1,%al
}
110a1b: 8d 65 f4 lea -0xc(%ebp),%esp
110a1e: 5b pop %ebx
110a1f: 5e pop %esi
110a20: 5f pop %edi
110a21: c9 leave
110a22: c3 ret
110a23: 90 nop
if ( _Objects_Get_API( created->Object.id ) == OBJECTS_POSIX_API
#if defined(RTEMS_DEBUG)
&& _Objects_Get_class( created->Object.id ) == 1
#endif
) {
executing_api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
110a24: a1 18 84 12 00 mov 0x128418,%eax
api->signals_blocked = executing_api->signals_blocked;
110a29: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
110a2f: 8b 80 d0 00 00 00 mov 0xd0(%eax),%eax
110a35: 89 83 d0 00 00 00 mov %eax,0xd0(%ebx)
110a3b: eb 9e jmp 1109db <_POSIX_Threads_Create_extension+0xf3>
110a3d: 8d 76 00 lea 0x0(%esi),%esi
POSIX_API_Control *executing_api;
api = _Workspace_Allocate( sizeof( POSIX_API_Control ) );
if ( !api )
return false;
110a40: 31 c0 xor %eax,%eax
created->Object.id,
created
);
return true;
}
110a42: 8d 65 f4 lea -0xc(%ebp),%esp
110a45: 5b pop %ebx
110a46: 5e pop %esi
110a47: 5f pop %edi
110a48: c9 leave
110a49: c3 ret
00110860 <_POSIX_Threads_Delete_extension>:
*/
void _POSIX_Threads_Delete_extension(
Thread_Control *executing __attribute__((unused)),
Thread_Control *deleted
)
{
110860: 55 push %ebp
110861: 89 e5 mov %esp,%ebp
110863: 57 push %edi
110864: 56 push %esi
110865: 53 push %ebx
110866: 83 ec 28 sub $0x28,%esp
110869: 8b 7d 0c mov 0xc(%ebp),%edi
Thread_Control *the_thread;
POSIX_API_Control *api;
void **value_ptr;
api = deleted->API_Extensions[ THREAD_API_POSIX ];
11086c: 8b 87 ec 00 00 00 mov 0xec(%edi),%eax
110872: 89 45 e4 mov %eax,-0x1c(%ebp)
/*
* Run the POSIX cancellation handlers
*/
_POSIX_Threads_cancel_run( deleted );
110875: 57 push %edi
110876: e8 d1 22 00 00 call 112b4c <_POSIX_Threads_cancel_run>
/*
* Run all the key destructors
*/
_POSIX_Keys_Run_destructors( deleted );
11087b: 89 3c 24 mov %edi,(%esp)
11087e: e8 31 23 00 00 call 112bb4 <_POSIX_Keys_Run_destructors>
/*
* Wakeup all the tasks which joined with this one
*/
value_ptr = (void **) deleted->Wait.return_argument;
110883: 8b 77 28 mov 0x28(%edi),%esi
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
110886: 83 c4 10 add $0x10,%esp
110889: 8b 45 e4 mov -0x1c(%ebp),%eax
11088c: 8d 58 44 lea 0x44(%eax),%ebx
11088f: eb 08 jmp 110899 <_POSIX_Threads_Delete_extension+0x39>
110891: 8d 76 00 lea 0x0(%esi),%esi
*(void **)the_thread->Wait.return_argument = value_ptr;
110894: 8b 40 28 mov 0x28(%eax),%eax
110897: 89 30 mov %esi,(%eax)
/*
* Wakeup all the tasks which joined with this one
*/
value_ptr = (void **) deleted->Wait.return_argument;
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
110899: 83 ec 0c sub $0xc,%esp
11089c: 53 push %ebx
11089d: e8 06 d4 ff ff call 10dca8 <_Thread_queue_Dequeue>
1108a2: 83 c4 10 add $0x10,%esp
1108a5: 85 c0 test %eax,%eax
1108a7: 75 eb jne 110894 <_POSIX_Threads_Delete_extension+0x34>
*(void **)the_thread->Wait.return_argument = value_ptr;
if ( api->schedpolicy == SCHED_SPORADIC )
1108a9: 8b 45 e4 mov -0x1c(%ebp),%eax
1108ac: 83 b8 84 00 00 00 04 cmpl $0x4,0x84(%eax)
1108b3: 74 1f je 1108d4 <_POSIX_Threads_Delete_extension+0x74>
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
1108b5: c7 87 ec 00 00 00 00 movl $0x0,0xec(%edi)
1108bc: 00 00 00
(void) _Workspace_Free( api );
1108bf: 8b 45 e4 mov -0x1c(%ebp),%eax
1108c2: 89 45 08 mov %eax,0x8(%ebp)
}
1108c5: 8d 65 f4 lea -0xc(%ebp),%esp
1108c8: 5b pop %ebx
1108c9: 5e pop %esi
1108ca: 5f pop %edi
1108cb: c9 leave
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
(void) _Workspace_Free( api );
1108cc: e9 ab e0 ff ff jmp 10e97c <_Workspace_Free>
1108d1: 8d 76 00 lea 0x0(%esi),%esi
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
*(void **)the_thread->Wait.return_argument = value_ptr;
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
1108d4: 83 ec 0c sub $0xc,%esp
1108d7: 05 a8 00 00 00 add $0xa8,%eax
1108dc: 50 push %eax
1108dd: e8 56 df ff ff call 10e838 <_Watchdog_Remove>
1108e2: 83 c4 10 add $0x10,%esp
1108e5: eb ce jmp 1108b5 <_POSIX_Threads_Delete_extension+0x55>
00110824 <_POSIX_Threads_Initialize_user_threads>:
*
* This routine creates and starts all configured user
* initialzation threads.
*/
void _POSIX_Threads_Initialize_user_threads( void )
{
110824: 55 push %ebp
110825: 89 e5 mov %esp,%ebp
110827: 83 ec 08 sub $0x8,%esp
if ( _POSIX_Threads_Initialize_user_threads_p )
11082a: a1 d8 60 12 00 mov 0x1260d8,%eax
11082f: 85 c0 test %eax,%eax
110831: 74 05 je 110838 <_POSIX_Threads_Initialize_user_threads+0x14>
(*_POSIX_Threads_Initialize_user_threads_p)();
}
110833: c9 leave
* initialzation threads.
*/
void _POSIX_Threads_Initialize_user_threads( void )
{
if ( _POSIX_Threads_Initialize_user_threads_p )
(*_POSIX_Threads_Initialize_user_threads_p)();
110834: ff e0 jmp *%eax
110836: 66 90 xchg %ax,%ax
}
110838: c9 leave
110839: c3 ret
0010b9f4 <_POSIX_Threads_Initialize_user_threads_body>:
*
* Output parameters: NONE
*/
void _POSIX_Threads_Initialize_user_threads_body(void)
{
10b9f4: 55 push %ebp
10b9f5: 89 e5 mov %esp,%ebp
10b9f7: 57 push %edi
10b9f8: 56 push %esi
10b9f9: 53 push %ebx
10b9fa: 83 ec 6c sub $0x6c,%esp
uint32_t maximum;
posix_initialization_threads_table *user_threads;
pthread_t thread_id;
pthread_attr_t attr;
user_threads = Configuration_POSIX_API.User_initialization_threads_table;
10b9fd: 8b 3d f4 4d 12 00 mov 0x124df4,%edi
maximum = Configuration_POSIX_API.number_of_initialization_threads;
10ba03: a1 f0 4d 12 00 mov 0x124df0,%eax
10ba08: 89 45 94 mov %eax,-0x6c(%ebp)
if ( !user_threads || maximum == 0 )
10ba0b: 85 ff test %edi,%edi
10ba0d: 74 44 je 10ba53 <_POSIX_Threads_Initialize_user_threads_body+0x5f><== NEVER TAKEN
10ba0f: 85 c0 test %eax,%eax
10ba11: 74 40 je 10ba53 <_POSIX_Threads_Initialize_user_threads_body+0x5f><== NEVER TAKEN
10ba13: 31 db xor %ebx,%ebx
10ba15: 8d 75 a4 lea -0x5c(%ebp),%esi
for ( index=0 ; index < maximum ; index++ ) {
/*
* There is no way for these calls to fail in this situation.
*/
(void) pthread_attr_init( &attr );
10ba18: 83 ec 0c sub $0xc,%esp
10ba1b: 56 push %esi
10ba1c: e8 0f 61 00 00 call 111b30 <pthread_attr_init>
(void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
10ba21: 5a pop %edx
10ba22: 59 pop %ecx
10ba23: 6a 02 push $0x2
10ba25: 56 push %esi
10ba26: e8 31 61 00 00 call 111b5c <pthread_attr_setinheritsched>
(void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size);
10ba2b: 59 pop %ecx
10ba2c: 58 pop %eax
10ba2d: ff 74 df 04 pushl 0x4(%edi,%ebx,8)
10ba31: 56 push %esi
10ba32: e8 59 61 00 00 call 111b90 <pthread_attr_setstacksize>
status = pthread_create(
10ba37: 6a 00 push $0x0
10ba39: ff 34 df pushl (%edi,%ebx,8)
10ba3c: 56 push %esi
10ba3d: 8d 45 e4 lea -0x1c(%ebp),%eax
10ba40: 50 push %eax
10ba41: e8 92 fc ff ff call 10b6d8 <pthread_create>
&thread_id,
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
10ba46: 83 c4 20 add $0x20,%esp
10ba49: 85 c0 test %eax,%eax
10ba4b: 75 0e jne 10ba5b <_POSIX_Threads_Initialize_user_threads_body+0x67>
*
* Setting the attributes explicitly is critical, since we don't want
* to inherit the idle tasks attributes.
*/
for ( index=0 ; index < maximum ; index++ ) {
10ba4d: 43 inc %ebx
10ba4e: 39 5d 94 cmp %ebx,-0x6c(%ebp)
10ba51: 77 c5 ja 10ba18 <_POSIX_Threads_Initialize_user_threads_body+0x24><== NEVER TAKEN
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
}
}
10ba53: 8d 65 f4 lea -0xc(%ebp),%esp
10ba56: 5b pop %ebx
10ba57: 5e pop %esi
10ba58: 5f pop %edi
10ba59: c9 leave
10ba5a: c3 ret
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
10ba5b: 52 push %edx
10ba5c: 50 push %eax
10ba5d: 6a 01 push $0x1
10ba5f: 6a 02 push $0x2
10ba61: e8 ce 1e 00 00 call 10d934 <_Internal_error_Occurred>
00110a4c <_POSIX_Threads_Sporadic_budget_TSR>:
*/
void _POSIX_Threads_Sporadic_budget_TSR(
Objects_Id id __attribute__((unused)),
void *argument
)
{
110a4c: 55 push %ebp
110a4d: 89 e5 mov %esp,%ebp
110a4f: 56 push %esi
110a50: 53 push %ebx
110a51: 8b 75 0c mov 0xc(%ebp),%esi
Thread_Control *the_thread;
POSIX_API_Control *api;
the_thread = argument;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
110a54: 8b 9e ec 00 00 00 mov 0xec(%esi),%ebx
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_init_budget );
110a5a: 83 ec 0c sub $0xc,%esp
110a5d: 8d 83 98 00 00 00 lea 0x98(%ebx),%eax
110a63: 50 push %eax
110a64: e8 53 0f 00 00 call 1119bc <_Timespec_To_ticks>
the_thread->cpu_time_budget = ticks;
110a69: 89 46 78 mov %eax,0x78(%esi)
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
110a6c: 0f b6 05 f4 3a 12 00 movzbl 0x123af4,%eax
110a73: 2b 83 88 00 00 00 sub 0x88(%ebx),%eax
new_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority );
the_thread->real_priority = new_priority;
110a79: 89 46 18 mov %eax,0x18(%esi)
*/
#if 0
printk( "TSR %d %d %d\n", the_thread->resource_count,
the_thread->current_priority, new_priority );
#endif
if ( the_thread->resource_count == 0 ) {
110a7c: 83 c4 10 add $0x10,%esp
110a7f: 8b 4e 1c mov 0x1c(%esi),%ecx
110a82: 85 c9 test %ecx,%ecx
110a84: 75 05 jne 110a8b <_POSIX_Threads_Sporadic_budget_TSR+0x3f><== NEVER TAKEN
/*
* If this would make them less important, then do not change it.
*/
if ( the_thread->current_priority > new_priority ) {
110a86: 39 46 14 cmp %eax,0x14(%esi)
110a89: 77 35 ja 110ac0 <_POSIX_Threads_Sporadic_budget_TSR+0x74>
#endif
}
}
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period );
110a8b: 83 ec 0c sub $0xc,%esp
110a8e: 8d 83 90 00 00 00 lea 0x90(%ebx),%eax
110a94: 50 push %eax
110a95: e8 22 0f 00 00 call 1119bc <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
110a9a: 89 83 b4 00 00 00 mov %eax,0xb4(%ebx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
110aa0: 83 c4 10 add $0x10,%esp
_Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
110aa3: 81 c3 a8 00 00 00 add $0xa8,%ebx
110aa9: 89 5d 0c mov %ebx,0xc(%ebp)
110aac: c7 45 08 3c 7f 12 00 movl $0x127f3c,0x8(%ebp)
}
110ab3: 8d 65 f8 lea -0x8(%ebp),%esp
110ab6: 5b pop %ebx
110ab7: 5e pop %esi
110ab8: c9 leave
110ab9: e9 3a dc ff ff jmp 10e6f8 <_Watchdog_Insert>
110abe: 66 90 xchg %ax,%ax
if ( the_thread->resource_count == 0 ) {
/*
* If this would make them less important, then do not change it.
*/
if ( the_thread->current_priority > new_priority ) {
_Thread_Change_priority( the_thread, new_priority, true );
110ac0: 52 push %edx
110ac1: 6a 01 push $0x1
110ac3: 50 push %eax
110ac4: 56 push %esi
110ac5: e8 76 c9 ff ff call 10d440 <_Thread_Change_priority>
110aca: 83 c4 10 add $0x10,%esp
110acd: eb bc jmp 110a8b <_POSIX_Threads_Sporadic_budget_TSR+0x3f>
00110ad0 <_POSIX_Threads_Sporadic_budget_callout>:
* _POSIX_Threads_Sporadic_budget_callout
*/
void _POSIX_Threads_Sporadic_budget_callout(
Thread_Control *the_thread
)
{
110ad0: 55 push %ebp
110ad1: 89 e5 mov %esp,%ebp
110ad3: 83 ec 08 sub $0x8,%esp
110ad6: 8b 45 08 mov 0x8(%ebp),%eax
POSIX_API_Control *api;
uint32_t new_priority;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
110ad9: 8b 88 ec 00 00 00 mov 0xec(%eax),%ecx
/*
* This will prevent the thread from consuming its entire "budget"
* while at low priority.
*/
the_thread->cpu_time_budget = 0xFFFFFFFF; /* XXX should be based on MAX_U32 */
110adf: c7 40 78 ff ff ff ff movl $0xffffffff,0x78(%eax)
110ae6: 0f b6 15 f4 3a 12 00 movzbl 0x123af4,%edx
110aed: 2b 91 8c 00 00 00 sub 0x8c(%ecx),%edx
new_priority = _POSIX_Priority_To_core(api->schedparam.sched_ss_low_priority);
the_thread->real_priority = new_priority;
110af3: 89 50 18 mov %edx,0x18(%eax)
*/
#if 0
printk( "callout %d %d %d\n", the_thread->resource_count,
the_thread->current_priority, new_priority );
#endif
if ( the_thread->resource_count == 0 ) {
110af6: 8b 48 1c mov 0x1c(%eax),%ecx
110af9: 85 c9 test %ecx,%ecx
110afb: 75 05 jne 110b02 <_POSIX_Threads_Sporadic_budget_callout+0x32><== NEVER TAKEN
/*
* Make sure we are actually lowering it. If they have lowered it
* to logically lower than sched_ss_low_priority, then we do not want to
* change it.
*/
if ( the_thread->current_priority < new_priority ) {
110afd: 39 50 14 cmp %edx,0x14(%eax)
110b00: 72 02 jb 110b04 <_POSIX_Threads_Sporadic_budget_callout+0x34><== ALWAYS TAKEN
#if 0
printk( "lower priority\n" );
#endif
}
}
}
110b02: c9 leave <== NOT EXECUTED
110b03: c3 ret <== NOT EXECUTED
* Make sure we are actually lowering it. If they have lowered it
* to logically lower than sched_ss_low_priority, then we do not want to
* change it.
*/
if ( the_thread->current_priority < new_priority ) {
_Thread_Change_priority( the_thread, new_priority, true );
110b04: 51 push %ecx
110b05: 6a 01 push $0x1
110b07: 52 push %edx
110b08: 50 push %eax
110b09: e8 32 c9 ff ff call 10d440 <_Thread_Change_priority>
110b0e: 83 c4 10 add $0x10,%esp
#if 0
printk( "lower priority\n" );
#endif
}
}
}
110b11: c9 leave
110b12: c3 ret
00112b4c <_POSIX_Threads_cancel_run>:
#include <rtems/posix/threadsup.h>
void _POSIX_Threads_cancel_run(
Thread_Control *the_thread
)
{
112b4c: 55 push %ebp
112b4d: 89 e5 mov %esp,%ebp
112b4f: 57 push %edi
112b50: 56 push %esi
112b51: 53 push %ebx
112b52: 83 ec 0c sub $0xc,%esp
POSIX_Cancel_Handler_control *handler;
Chain_Control *handler_stack;
POSIX_API_Control *thread_support;
ISR_Level level;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
112b55: 8b 45 08 mov 0x8(%ebp),%eax
112b58: 8b 98 ec 00 00 00 mov 0xec(%eax),%ebx
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
112b5e: c7 83 d8 00 00 00 01 movl $0x1,0xd8(%ebx)
112b65: 00 00 00
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
112b68: 8d b3 e8 00 00 00 lea 0xe8(%ebx),%esi
while ( !_Chain_Is_empty( handler_stack ) ) {
112b6e: 39 b3 e4 00 00 00 cmp %esi,0xe4(%ebx)
112b74: 74 33 je 112ba9 <_POSIX_Threads_cancel_run+0x5d>
112b76: 66 90 xchg %ax,%ax
_ISR_Disable( level );
112b78: 9c pushf
112b79: fa cli
112b7a: 59 pop %ecx
handler = (POSIX_Cancel_Handler_control *)
112b7b: 8b bb ec 00 00 00 mov 0xec(%ebx),%edi
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
112b81: 8b 17 mov (%edi),%edx
previous = the_node->previous;
112b83: 8b 47 04 mov 0x4(%edi),%eax
next->previous = previous;
112b86: 89 42 04 mov %eax,0x4(%edx)
previous->next = next;
112b89: 89 10 mov %edx,(%eax)
_Chain_Tail( handler_stack )->previous;
_Chain_Extract_unprotected( &handler->Node );
_ISR_Enable( level );
112b8b: 51 push %ecx
112b8c: 9d popf
(*handler->routine)( handler->arg );
112b8d: 83 ec 0c sub $0xc,%esp
112b90: ff 77 0c pushl 0xc(%edi)
112b93: ff 57 08 call *0x8(%edi)
_Workspace_Free( handler );
112b96: 89 3c 24 mov %edi,(%esp)
112b99: e8 de bd ff ff call 10e97c <_Workspace_Free>
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
while ( !_Chain_Is_empty( handler_stack ) ) {
112b9e: 83 c4 10 add $0x10,%esp
112ba1: 39 b3 e4 00 00 00 cmp %esi,0xe4(%ebx)
112ba7: 75 cf jne 112b78 <_POSIX_Threads_cancel_run+0x2c><== NEVER TAKEN
(*handler->routine)( handler->arg );
_Workspace_Free( handler );
}
}
112ba9: 8d 65 f4 lea -0xc(%ebp),%esp
112bac: 5b pop %ebx
112bad: 5e pop %esi
112bae: 5f pop %edi
112baf: c9 leave
112bb0: c3 ret
0011182c <_POSIX_Timer_Insert_helper>:
Watchdog_Interval ticks,
Objects_Id id,
Watchdog_Service_routine_entry TSR,
void *arg
)
{
11182c: 55 push %ebp
11182d: 89 e5 mov %esp,%ebp
11182f: 56 push %esi
111830: 53 push %ebx
111831: 8b 5d 08 mov 0x8(%ebp),%ebx
ISR_Level level;
(void) _Watchdog_Remove( timer );
111834: 83 ec 0c sub $0xc,%esp
111837: 53 push %ebx
111838: e8 0b db ff ff call 10f348 <_Watchdog_Remove>
_ISR_Disable( level );
11183d: 9c pushf
11183e: fa cli
11183f: 5e pop %esi
/*
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( timer->state != WATCHDOG_INACTIVE ) {
111840: 83 c4 10 add $0x10,%esp
111843: 8b 43 08 mov 0x8(%ebx),%eax
111846: 85 c0 test %eax,%eax
111848: 74 0e je 111858 <_POSIX_Timer_Insert_helper+0x2c>
_ISR_Enable( level );
11184a: 56 push %esi
11184b: 9d popf
return false;
11184c: 31 c0 xor %eax,%eax
*/
_Watchdog_Initialize( timer, TSR, id, arg );
_Watchdog_Insert_ticks( timer, ticks );
_ISR_Enable( level );
return true;
}
11184e: 8d 65 f8 lea -0x8(%ebp),%esp
111851: 5b pop %ebx
111852: 5e pop %esi
111853: c9 leave
111854: c3 ret
111855: 8d 76 00 lea 0x0(%esi),%esi
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
111858: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx)
the_watchdog->routine = routine;
11185f: 8b 45 14 mov 0x14(%ebp),%eax
111862: 89 43 1c mov %eax,0x1c(%ebx)
the_watchdog->id = id;
111865: 8b 45 10 mov 0x10(%ebp),%eax
111868: 89 43 20 mov %eax,0x20(%ebx)
the_watchdog->user_data = user_data;
11186b: 8b 45 18 mov 0x18(%ebp),%eax
11186e: 89 43 24 mov %eax,0x24(%ebx)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
111871: 8b 45 0c mov 0xc(%ebp),%eax
111874: 89 43 0c mov %eax,0xc(%ebx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
111877: 83 ec 08 sub $0x8,%esp
11187a: 53 push %ebx
11187b: 68 5c a2 12 00 push $0x12a25c
111880: e8 83 d9 ff ff call 10f208 <_Watchdog_Insert>
* OK. Now we now the timer was not rescheduled by an interrupt
* so we can atomically initialize it as in use.
*/
_Watchdog_Initialize( timer, TSR, id, arg );
_Watchdog_Insert_ticks( timer, ticks );
_ISR_Enable( level );
111885: 56 push %esi
111886: 9d popf
return true;
111887: 83 c4 10 add $0x10,%esp
11188a: b0 01 mov $0x1,%al
}
11188c: 8d 65 f8 lea -0x8(%ebp),%esp
11188f: 5b pop %ebx
111890: 5e pop %esi
111891: c9 leave
111892: c3 ret
0010b804 <_POSIX_Timer_TSR>:
* This is the operation that is run when a timer expires
*/
void _POSIX_Timer_TSR(
Objects_Id timer __attribute__((unused)),
void *data)
{
10b804: 55 push %ebp
10b805: 89 e5 mov %esp,%ebp
10b807: 53 push %ebx
10b808: 83 ec 04 sub $0x4,%esp
10b80b: 8b 5d 0c mov 0xc(%ebp),%ebx
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
10b80e: ff 43 68 incl 0x68(%ebx)
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
10b811: 8b 53 54 mov 0x54(%ebx),%edx
10b814: 85 d2 test %edx,%edx
10b816: 75 28 jne 10b840 <_POSIX_Timer_TSR+0x3c>
10b818: 8b 43 58 mov 0x58(%ebx),%eax
10b81b: 85 c0 test %eax,%eax
10b81d: 75 21 jne 10b840 <_POSIX_Timer_TSR+0x3c> <== ALWAYS TAKEN
/* The state really did not change but just to be safe */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
} else {
/* Indicates that the timer is stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
10b81f: c6 43 3c 04 movb $0x4,0x3c(%ebx) <== NOT EXECUTED
/*
* The sending of the signal to the process running the handling function
* specified for that signal is simulated
*/
if ( pthread_kill ( ptimer->thread_id, ptimer->inf.sigev_signo ) ) {
10b823: 83 ec 08 sub $0x8,%esp
10b826: ff 73 44 pushl 0x44(%ebx)
10b829: ff 73 38 pushl 0x38(%ebx)
10b82c: e8 8b 5b 00 00 call 1113bc <pthread_kill>
}
/* After the signal handler returns, the count of expirations of the
* timer must be set to 0.
*/
ptimer->overrun = 0;
10b831: c7 43 68 00 00 00 00 movl $0x0,0x68(%ebx)
10b838: 83 c4 10 add $0x10,%esp
}
10b83b: 8b 5d fc mov -0x4(%ebp),%ebx
10b83e: c9 leave
10b83f: c3 ret
ptimer->overrun = ptimer->overrun + 1;
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) {
activated = _POSIX_Timer_Insert_helper(
10b840: 83 ec 0c sub $0xc,%esp
10b843: 53 push %ebx
10b844: 68 04 b8 10 00 push $0x10b804
10b849: ff 73 08 pushl 0x8(%ebx)
10b84c: ff 73 64 pushl 0x64(%ebx)
10b84f: 8d 43 10 lea 0x10(%ebx),%eax
10b852: 50 push %eax
10b853: e8 d4 5f 00 00 call 11182c <_POSIX_Timer_Insert_helper>
ptimer->ticks,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated )
10b858: 83 c4 20 add $0x20,%esp
10b85b: 84 c0 test %al,%al
10b85d: 74 dc je 10b83b <_POSIX_Timer_TSR+0x37> <== NEVER TAKEN
return;
/* Store the time when the timer was started again */
_TOD_Get( &ptimer->time );
10b85f: 83 ec 0c sub $0xc,%esp
10b862: 8d 43 6c lea 0x6c(%ebx),%eax
10b865: 50 push %eax
10b866: e8 95 16 00 00 call 10cf00 <_TOD_Get>
/* The state really did not change but just to be safe */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
10b86b: c6 43 3c 03 movb $0x3,0x3c(%ebx)
10b86f: 83 c4 10 add $0x10,%esp
10b872: eb af jmp 10b823 <_POSIX_Timer_TSR+0x1f>
00112c38 <_POSIX_signals_Check_signal>:
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
112c38: 55 push %ebp
112c39: 89 e5 mov %esp,%ebp
112c3b: 57 push %edi
112c3c: 56 push %esi
112c3d: 53 push %ebx
112c3e: 83 ec 78 sub $0x78,%esp
112c41: 8b 5d 0c mov 0xc(%ebp),%ebx
siginfo_t siginfo_struct;
sigset_t saved_signals_blocked;
Thread_Wait_information stored_thread_wait_information;
if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
112c44: 6a 01 push $0x1
112c46: 0f b6 45 10 movzbl 0x10(%ebp),%eax
112c4a: 50 push %eax
112c4b: 8d 55 dc lea -0x24(%ebp),%edx
112c4e: 52 push %edx
112c4f: 53 push %ebx
112c50: ff 75 08 pushl 0x8(%ebp)
112c53: 89 55 9c mov %edx,-0x64(%ebp)
112c56: e8 b5 00 00 00 call 112d10 <_POSIX_signals_Clear_signals>
112c5b: 83 c4 20 add $0x20,%esp
112c5e: 84 c0 test %al,%al
112c60: 8b 55 9c mov -0x64(%ebp),%edx
112c63: 0f 84 9b 00 00 00 je 112d04 <_POSIX_signals_Check_signal+0xcc>
#endif
/*
* Just to prevent sending a signal which is currently being ignored.
*/
if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN )
112c69: 8d 04 5b lea (%ebx,%ebx,2),%eax
112c6c: c1 e0 02 shl $0x2,%eax
112c6f: 8b 88 88 84 12 00 mov 0x128488(%eax),%ecx
112c75: 89 4d a4 mov %ecx,-0x5c(%ebp)
112c78: 49 dec %ecx
112c79: 0f 84 85 00 00 00 je 112d04 <_POSIX_signals_Check_signal+0xcc><== NEVER TAKEN
return false;
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
112c7f: 8b 75 08 mov 0x8(%ebp),%esi
112c82: 8b b6 d0 00 00 00 mov 0xd0(%esi),%esi
112c88: 89 75 a0 mov %esi,-0x60(%ebp)
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
112c8b: 8b 88 84 84 12 00 mov 0x128484(%eax),%ecx
112c91: 09 f1 or %esi,%ecx
112c93: 8b 75 08 mov 0x8(%ebp),%esi
112c96: 89 8e d0 00 00 00 mov %ecx,0xd0(%esi)
/*
* We have to save the blocking information of the current wait queue
* because the signal handler may subsequently go on and put the thread
* on a wait queue, for its own purposes.
*/
memcpy( &stored_thread_wait_information, &_Thread_Executing->Wait,
112c9c: 8d 75 b4 lea -0x4c(%ebp),%esi
112c9f: 89 75 94 mov %esi,-0x6c(%ebp)
112ca2: 8b 35 18 84 12 00 mov 0x128418,%esi
112ca8: 83 c6 20 add $0x20,%esi
112cab: b9 0a 00 00 00 mov $0xa,%ecx
112cb0: 8b 7d 94 mov -0x6c(%ebp),%edi
112cb3: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
sizeof( Thread_Wait_information ));
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
112cb5: 83 b8 80 84 12 00 02 cmpl $0x2,0x128480(%eax)
112cbc: 74 36 je 112cf4 <_POSIX_signals_Check_signal+0xbc>
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
default:
(*_POSIX_signals_Vectors[ signo ].sa_handler)( signo );
112cbe: 83 ec 0c sub $0xc,%esp
112cc1: 53 push %ebx
112cc2: ff 55 a4 call *-0x5c(%ebp)
break;
112cc5: 83 c4 10 add $0x10,%esp
}
/*
* Restore the blocking information
*/
memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information,
112cc8: 8b 3d 18 84 12 00 mov 0x128418,%edi
112cce: 83 c7 20 add $0x20,%edi
112cd1: b9 0a 00 00 00 mov $0xa,%ecx
112cd6: 8b 75 94 mov -0x6c(%ebp),%esi
112cd9: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
sizeof( Thread_Wait_information ));
/*
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
112cdb: 8b 55 a0 mov -0x60(%ebp),%edx
112cde: 8b 45 08 mov 0x8(%ebp),%eax
112ce1: 89 90 d0 00 00 00 mov %edx,0xd0(%eax)
return true;
112ce7: b0 01 mov $0x1,%al
}
112ce9: 8d 65 f4 lea -0xc(%ebp),%esp
112cec: 5b pop %ebx
112ced: 5e pop %esi
112cee: 5f pop %edi
112cef: c9 leave
112cf0: c3 ret
112cf1: 8d 76 00 lea 0x0(%esi),%esi
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
case SA_SIGINFO:
(*_POSIX_signals_Vectors[ signo ].sa_sigaction)(
112cf4: 50 push %eax
112cf5: 6a 00 push $0x0
112cf7: 52 push %edx
112cf8: 53 push %ebx
112cf9: ff 55 a4 call *-0x5c(%ebp)
signo,
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
112cfc: 83 c4 10 add $0x10,%esp
112cff: eb c7 jmp 112cc8 <_POSIX_signals_Check_signal+0x90>
112d01: 8d 76 00 lea 0x0(%esi),%esi
/*
* Just to prevent sending a signal which is currently being ignored.
*/
if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN )
return false;
112d04: 31 c0 xor %eax,%eax
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
return true;
}
112d06: 8d 65 f4 lea -0xc(%ebp),%esp
112d09: 5b pop %ebx
112d0a: 5e pop %esi
112d0b: 5f pop %edi
112d0c: c9 leave
112d0d: c3 ret
001132c0 <_POSIX_signals_Clear_process_signals>:
*/
void _POSIX_signals_Clear_process_signals(
int signo
)
{
1132c0: 55 push %ebp
1132c1: 89 e5 mov %esp,%ebp
1132c3: 53 push %ebx
1132c4: 8b 4d 08 mov 0x8(%ebp),%ecx
clear_signal = true;
mask = signo_to_mask( signo );
ISR_Level level;
_ISR_Disable( level );
1132c7: 9c pushf
1132c8: fa cli
1132c9: 5a pop %edx
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
1132ca: 8d 04 49 lea (%ecx,%ecx,2),%eax
1132cd: c1 e0 02 shl $0x2,%eax
1132d0: 83 b8 80 84 12 00 02 cmpl $0x2,0x128480(%eax)
1132d7: 74 13 je 1132ec <_POSIX_signals_Clear_process_signals+0x2c>
1132d9: 49 dec %ecx
1132da: b8 fe ff ff ff mov $0xfffffffe,%eax
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
clear_signal = false;
}
if ( clear_signal ) {
_POSIX_signals_Pending &= ~mask;
1132df: d3 c0 rol %cl,%eax
1132e1: 21 05 88 86 12 00 and %eax,0x128688
}
_ISR_Enable( level );
1132e7: 52 push %edx
1132e8: 9d popf
}
1132e9: 5b pop %ebx
1132ea: c9 leave
1132eb: c3 ret
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
1132ec: 8d 98 a4 86 12 00 lea 0x1286a4(%eax),%ebx
ISR_Level level;
_ISR_Disable( level );
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
1132f2: 39 98 a0 86 12 00 cmp %ebx,0x1286a0(%eax)
1132f8: 75 ed jne 1132e7 <_POSIX_signals_Clear_process_signals+0x27><== NEVER TAKEN
1132fa: eb dd jmp 1132d9 <_POSIX_signals_Clear_process_signals+0x19>
00112d10 <_POSIX_signals_Clear_signals>:
int signo,
siginfo_t *info,
bool is_global,
bool check_blocked
)
{
112d10: 55 push %ebp
112d11: 89 e5 mov %esp,%ebp
112d13: 57 push %edi
112d14: 56 push %esi
112d15: 53 push %ebx
112d16: 83 ec 1c sub $0x1c,%esp
112d19: 8b 5d 0c mov 0xc(%ebp),%ebx
112d1c: 0f b6 7d 14 movzbl 0x14(%ebp),%edi
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
112d20: 8d 4b ff lea -0x1(%ebx),%ecx
112d23: b8 01 00 00 00 mov $0x1,%eax
112d28: d3 e0 shl %cl,%eax
/* set blocked signals based on if checking for them, SIGNAL_ALL_MASK
* insures that no signals are blocked and all are checked.
*/
if ( check_blocked )
112d2a: 80 7d 18 00 cmpb $0x0,0x18(%ebp)
112d2e: 74 40 je 112d70 <_POSIX_signals_Clear_signals+0x60>
signals_blocked = ~api->signals_blocked;
112d30: 8b 55 08 mov 0x8(%ebp),%edx
112d33: 8b 8a d0 00 00 00 mov 0xd0(%edx),%ecx
112d39: f7 d1 not %ecx
signals_blocked = SIGNAL_ALL_MASK;
/* XXX is this right for siginfo type signals? */
/* XXX are we sure they can be cleared the same way? */
_ISR_Disable( level );
112d3b: 9c pushf
112d3c: fa cli
112d3d: 8f 45 e4 popl -0x1c(%ebp)
if ( is_global ) {
112d40: 89 fa mov %edi,%edx
112d42: 84 d2 test %dl,%dl
112d44: 74 32 je 112d78 <_POSIX_signals_Clear_signals+0x68>
if ( mask & (_POSIX_signals_Pending & signals_blocked) ) {
112d46: 23 05 88 86 12 00 and 0x128688,%eax
112d4c: 85 c8 test %ecx,%eax
112d4e: 74 54 je 112da4 <_POSIX_signals_Clear_signals+0x94>
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
112d50: 8d 14 5b lea (%ebx,%ebx,2),%edx
112d53: c1 e2 02 shl $0x2,%edx
112d56: 83 ba 80 84 12 00 02 cmpl $0x2,0x128480(%edx)
112d5d: 74 49 je 112da8 <_POSIX_signals_Clear_signals+0x98>
&psiginfo->Node
);
} else
do_callout = false;
}
_POSIX_signals_Clear_process_signals( signo );
112d5f: 83 ec 0c sub $0xc,%esp
112d62: 53 push %ebx
112d63: e8 58 05 00 00 call 1132c0 <_POSIX_signals_Clear_process_signals>
112d68: 83 c4 10 add $0x10,%esp
do_callout = true;
112d6b: b0 01 mov $0x1,%al
112d6d: eb 26 jmp 112d95 <_POSIX_signals_Clear_signals+0x85>
112d6f: 90 nop
*/
if ( check_blocked )
signals_blocked = ~api->signals_blocked;
else
signals_blocked = SIGNAL_ALL_MASK;
112d70: b9 ff ff ff ff mov $0xffffffff,%ecx
112d75: eb c4 jmp 112d3b <_POSIX_signals_Clear_signals+0x2b>
112d77: 90 nop
}
_POSIX_signals_Clear_process_signals( signo );
do_callout = true;
}
} else {
if ( mask & (api->signals_pending & signals_blocked) ) {
112d78: 8b 55 08 mov 0x8(%ebp),%edx
112d7b: 8b 9a d4 00 00 00 mov 0xd4(%edx),%ebx
112d81: 89 c6 mov %eax,%esi
112d83: 21 de and %ebx,%esi
112d85: 85 ce test %ecx,%esi
112d87: 74 1b je 112da4 <_POSIX_signals_Clear_signals+0x94>
api->signals_pending &= ~mask;
112d89: f7 d0 not %eax
112d8b: 21 d8 and %ebx,%eax
112d8d: 89 82 d4 00 00 00 mov %eax,0xd4(%edx)
do_callout = true;
112d93: b0 01 mov $0x1,%al
}
}
_ISR_Enable( level );
112d95: ff 75 e4 pushl -0x1c(%ebp)
112d98: 9d popf
return do_callout;
}
112d99: 8d 65 f4 lea -0xc(%ebp),%esp
112d9c: 5b pop %ebx
112d9d: 5e pop %esi
112d9e: 5f pop %edi
112d9f: c9 leave
112da0: c3 ret
112da1: 8d 76 00 lea 0x0(%esi),%esi
bool do_callout;
POSIX_signals_Siginfo_node *psiginfo;
mask = signo_to_mask( signo );
do_callout = false;
112da4: 31 c0 xor %eax,%eax
112da6: eb ed jmp 112d95 <_POSIX_signals_Clear_signals+0x85>
do_callout = true;
}
}
_ISR_Enable( level );
return do_callout;
}
112da8: 8d 8a a0 86 12 00 lea 0x1286a0(%edx),%ecx
112dae: 8b 82 a0 86 12 00 mov 0x1286a0(%edx),%eax
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
112db4: 8d 71 04 lea 0x4(%ecx),%esi
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
112db7: 39 f0 cmp %esi,%eax
112db9: 74 45 je 112e00 <_POSIX_signals_Clear_signals+0xf0>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
112dbb: 8b 30 mov (%eax),%esi
head->next = new_first;
112dbd: 89 b2 a0 86 12 00 mov %esi,0x1286a0(%edx)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_first_unprotected(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
112dc3: 89 4e 04 mov %ecx,0x4(%esi)
if ( is_global ) {
if ( mask & (_POSIX_signals_Pending & signals_blocked) ) {
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get_unprotected( &_POSIX_signals_Siginfo[ signo ] );
_POSIX_signals_Clear_process_signals( signo );
112dc6: 83 ec 0c sub $0xc,%esp
112dc9: 53 push %ebx
112dca: 89 45 e0 mov %eax,-0x20(%ebp)
112dcd: e8 ee 04 00 00 call 1132c0 <_POSIX_signals_Clear_process_signals>
* It may be impossible to get here with an empty chain
* BUT until that is proven we need to be defensive and
* protect against it.
*/
if ( psiginfo ) {
*info = psiginfo->Info;
112dd2: 8b 45 e0 mov -0x20(%ebp),%eax
112dd5: 8d 70 08 lea 0x8(%eax),%esi
112dd8: b9 03 00 00 00 mov $0x3,%ecx
112ddd: 8b 7d 10 mov 0x10(%ebp),%edi
112de0: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
112de2: 8b 15 08 86 12 00 mov 0x128608,%edx
the_node->next = tail;
112de8: c7 00 04 86 12 00 movl $0x128604,(%eax)
tail->previous = the_node;
112dee: a3 08 86 12 00 mov %eax,0x128608
old_last->next = the_node;
112df3: 89 02 mov %eax,(%edx)
the_node->previous = old_last;
112df5: 89 50 04 mov %edx,0x4(%eax)
112df8: 83 c4 10 add $0x10,%esp
112dfb: e9 5f ff ff ff jmp 112d5f <_POSIX_signals_Clear_signals+0x4f>
if ( is_global ) {
if ( mask & (_POSIX_signals_Pending & signals_blocked) ) {
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get_unprotected( &_POSIX_signals_Siginfo[ signo ] );
_POSIX_signals_Clear_process_signals( signo );
112e00: 83 ec 0c sub $0xc,%esp
112e03: 53 push %ebx
112e04: e8 b7 04 00 00 call 1132c0 <_POSIX_signals_Clear_process_signals>
112e09: 83 c4 10 add $0x10,%esp
112e0c: e9 4e ff ff ff jmp 112d5f <_POSIX_signals_Clear_signals+0x4f>
0010c0dc <_POSIX_signals_Get_lowest>:
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
sigset_t set
)
{
10c0dc: 55 push %ebp
10c0dd: 89 e5 mov %esp,%ebp
10c0df: 56 push %esi
10c0e0: 53 push %ebx
10c0e1: 8b 55 08 mov 0x8(%ebp),%edx
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
10c0e4: b8 1b 00 00 00 mov $0x1b,%eax
10c0e9: bb 01 00 00 00 mov $0x1,%ebx
#include <rtems/posix/psignal.h>
#include <rtems/seterr.h>
#include <rtems/posix/time.h>
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
10c0ee: 8d 48 ff lea -0x1(%eax),%ecx
10c0f1: 89 de mov %ebx,%esi
10c0f3: d3 e6 shl %cl,%esi
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
if ( set & signo_to_mask( signo ) ) {
10c0f5: 85 d6 test %edx,%esi
10c0f7: 75 20 jne 10c119 <_POSIX_signals_Get_lowest+0x3d><== NEVER TAKEN
sigset_t set
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
10c0f9: 40 inc %eax
10c0fa: 83 f8 20 cmp $0x20,%eax
10c0fd: 75 ef jne 10c0ee <_POSIX_signals_Get_lowest+0x12>
10c0ff: b0 01 mov $0x1,%al
10c101: bb 01 00 00 00 mov $0x1,%ebx
10c106: eb 06 jmp 10c10e <_POSIX_signals_Get_lowest+0x32>
*/
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
10c108: 40 inc %eax
10c109: 83 f8 1b cmp $0x1b,%eax
10c10c: 74 0b je 10c119 <_POSIX_signals_Get_lowest+0x3d><== NEVER TAKEN
#include <rtems/posix/psignal.h>
#include <rtems/seterr.h>
#include <rtems/posix/time.h>
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
10c10e: 8d 48 ff lea -0x1(%eax),%ecx
10c111: 89 de mov %ebx,%esi
10c113: d3 e6 shl %cl,%esi
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
if ( set & signo_to_mask( signo ) ) {
10c115: 85 d6 test %edx,%esi
10c117: 74 ef je 10c108 <_POSIX_signals_Get_lowest+0x2c>
* a return 0. This routine will NOT be called unless a signal
* is pending in the set passed in.
*/
found_it:
return signo;
}
10c119: 5b pop %ebx
10c11a: 5e pop %esi
10c11b: c9 leave
10c11c: c3 ret
00124d1c <_POSIX_signals_Unblock_thread>:
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
siginfo_t *info
)
{
124d1c: 55 push %ebp
124d1d: 89 e5 mov %esp,%ebp
124d1f: 57 push %edi
124d20: 56 push %esi
124d21: 53 push %ebx
124d22: 83 ec 0c sub $0xc,%esp
124d25: 8b 5d 08 mov 0x8(%ebp),%ebx
124d28: 8b 55 0c mov 0xc(%ebp),%edx
POSIX_API_Control *api;
sigset_t mask;
siginfo_t *the_info = NULL;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
124d2b: 8b b3 ec 00 00 00 mov 0xec(%ebx),%esi
124d31: 8d 4a ff lea -0x1(%edx),%ecx
124d34: b8 01 00 00 00 mov $0x1,%eax
124d39: d3 e0 shl %cl,%eax
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
124d3b: 8b 4b 10 mov 0x10(%ebx),%ecx
124d3e: 89 cf mov %ecx,%edi
124d40: 81 e7 00 80 00 10 and $0x10008000,%edi
124d46: 81 ff 00 80 00 10 cmp $0x10008000,%edi
124d4c: 74 72 je 124dc0 <_POSIX_signals_Unblock_thread+0xa4>
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( ~api->signals_blocked & mask ) {
124d4e: 8b 96 d0 00 00 00 mov 0xd0(%esi),%edx
124d54: f7 d2 not %edx
124d56: 85 d0 test %edx,%eax
124d58: 74 5a je 124db4 <_POSIX_signals_Unblock_thread+0x98>
* it is not blocked, THEN
* we need to dispatch at the end of this ISR.
* + Any other combination, do nothing.
*/
if ( _States_Is_interruptible_by_signal( the_thread->current_state ) ) {
124d5a: f7 c1 00 00 00 10 test $0x10000000,%ecx
124d60: 74 3a je 124d9c <_POSIX_signals_Unblock_thread+0x80>
the_thread->Wait.return_code = EINTR;
124d62: c7 43 34 04 00 00 00 movl $0x4,0x34(%ebx)
/*
* In pthread_cond_wait, a thread will be blocking on a thread
* queue, but is also interruptible by a POSIX signal.
*/
if ( _States_Is_waiting_on_thread_queue(the_thread->current_state) )
124d69: f7 c1 e0 be 03 00 test $0x3bee0,%ecx
124d6f: 0f 85 93 00 00 00 jne 124e08 <_POSIX_signals_Unblock_thread+0xec>
_Thread_queue_Extract_with_proxy( the_thread );
else if ( _States_Is_delaying(the_thread->current_state) ) {
124d75: 83 e1 08 and $0x8,%ecx
124d78: 74 3a je 124db4 <_POSIX_signals_Unblock_thread+0x98><== NEVER TAKEN
(void) _Watchdog_Remove( &the_thread->Timer );
124d7a: 83 ec 0c sub $0xc,%esp
124d7d: 8d 43 48 lea 0x48(%ebx),%eax
124d80: 50 push %eax
124d81: e8 da eb fe ff call 113960 <_Watchdog_Remove>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
124d86: 5a pop %edx
124d87: 59 pop %ecx
124d88: 68 f8 ff 03 10 push $0x1003fff8
124d8d: 53 push %ebx
124d8e: e8 09 d9 fe ff call 11269c <_Thread_Clear_state>
124d93: 83 c4 10 add $0x10,%esp
} else if ( the_thread->current_state == STATES_READY ) {
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
124d96: 31 c0 xor %eax,%eax
124d98: eb 1c jmp 124db6 <_POSIX_signals_Unblock_thread+0x9a>
124d9a: 66 90 xchg %ax,%ax
else if ( _States_Is_delaying(the_thread->current_state) ) {
(void) _Watchdog_Remove( &the_thread->Timer );
_Thread_Unblock( the_thread );
}
} else if ( the_thread->current_state == STATES_READY ) {
124d9c: 85 c9 test %ecx,%ecx
124d9e: 75 14 jne 124db4 <_POSIX_signals_Unblock_thread+0x98><== NEVER TAKEN
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
124da0: a1 74 f1 12 00 mov 0x12f174,%eax
124da5: 85 c0 test %eax,%eax
124da7: 74 0b je 124db4 <_POSIX_signals_Unblock_thread+0x98>
124da9: 3b 1d 78 f1 12 00 cmp 0x12f178,%ebx
124daf: 74 7b je 124e2c <_POSIX_signals_Unblock_thread+0x110><== ALWAYS TAKEN
124db1: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Dispatch_necessary = true;
}
}
return false;
124db4: 31 c0 xor %eax,%eax
}
124db6: 8d 65 f4 lea -0xc(%ebp),%esp
124db9: 5b pop %ebx
124dba: 5e pop %esi
124dbb: 5f pop %edi
124dbc: c9 leave
124dbd: c3 ret
124dbe: 66 90 xchg %ax,%ax
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
124dc0: 85 43 30 test %eax,0x30(%ebx)
124dc3: 74 33 je 124df8 <_POSIX_signals_Unblock_thread+0xdc>
the_thread->Wait.return_code = EINTR;
124dc5: c7 43 34 04 00 00 00 movl $0x4,0x34(%ebx)
the_info = (siginfo_t *) the_thread->Wait.return_argument;
124dcc: 8b 43 28 mov 0x28(%ebx),%eax
if ( !info ) {
124dcf: 8b 75 10 mov 0x10(%ebp),%esi
124dd2: 85 f6 test %esi,%esi
124dd4: 74 42 je 124e18 <_POSIX_signals_Unblock_thread+0xfc>
the_info->si_signo = signo;
the_info->si_code = SI_USER;
the_info->si_value.sival_int = 0;
} else {
*the_info = *info;
124dd6: b9 03 00 00 00 mov $0x3,%ecx
124ddb: 89 c7 mov %eax,%edi
124ddd: 8b 75 10 mov 0x10(%ebp),%esi
124de0: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
}
_Thread_queue_Extract_with_proxy( the_thread );
124de2: 83 ec 0c sub $0xc,%esp
124de5: 53 push %ebx
124de6: e8 1d e3 fe ff call 113108 <_Thread_queue_Extract_with_proxy>
return true;
124deb: 83 c4 10 add $0x10,%esp
124dee: b0 01 mov $0x1,%al
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
}
124df0: 8d 65 f4 lea -0xc(%ebp),%esp
124df3: 5b pop %ebx
124df4: 5e pop %esi
124df5: 5f pop %edi
124df6: c9 leave
124df7: c3 ret
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
124df8: 8b 8e d0 00 00 00 mov 0xd0(%esi),%ecx
124dfe: f7 d1 not %ecx
124e00: 85 c8 test %ecx,%eax
124e02: 75 c1 jne 124dc5 <_POSIX_signals_Unblock_thread+0xa9>
124e04: eb ae jmp 124db4 <_POSIX_signals_Unblock_thread+0x98>
124e06: 66 90 xchg %ax,%ax
/*
* In pthread_cond_wait, a thread will be blocking on a thread
* queue, but is also interruptible by a POSIX signal.
*/
if ( _States_Is_waiting_on_thread_queue(the_thread->current_state) )
_Thread_queue_Extract_with_proxy( the_thread );
124e08: 83 ec 0c sub $0xc,%esp
124e0b: 53 push %ebx
124e0c: e8 f7 e2 fe ff call 113108 <_Thread_queue_Extract_with_proxy>
124e11: 83 c4 10 add $0x10,%esp
} else if ( the_thread->current_state == STATES_READY ) {
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
124e14: 31 c0 xor %eax,%eax
124e16: eb 9e jmp 124db6 <_POSIX_signals_Unblock_thread+0x9a>
the_thread->Wait.return_code = EINTR;
the_info = (siginfo_t *) the_thread->Wait.return_argument;
if ( !info ) {
the_info->si_signo = signo;
124e18: 89 10 mov %edx,(%eax)
the_info->si_code = SI_USER;
124e1a: c7 40 04 01 00 00 00 movl $0x1,0x4(%eax)
the_info->si_value.sival_int = 0;
124e21: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)
124e28: eb b8 jmp 124de2 <_POSIX_signals_Unblock_thread+0xc6>
124e2a: 66 90 xchg %ax,%ax
_Thread_Unblock( the_thread );
}
} else if ( the_thread->current_state == STATES_READY ) {
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
124e2c: c6 05 84 f1 12 00 01 movb $0x1,0x12f184
}
}
return false;
124e33: 31 c0 xor %eax,%eax
124e35: e9 7c ff ff ff jmp 124db6 <_POSIX_signals_Unblock_thread+0x9a>
0010d864 <_Protected_heap_Get_information>:
bool _Protected_heap_Get_information(
Heap_Control *the_heap,
Heap_Information_block *the_info
)
{
10d864: 55 push %ebp
10d865: 89 e5 mov %esp,%ebp
10d867: 56 push %esi
10d868: 53 push %ebx
10d869: 8b 5d 08 mov 0x8(%ebp),%ebx
10d86c: 8b 75 0c mov 0xc(%ebp),%esi
if ( !the_heap )
10d86f: 85 db test %ebx,%ebx
10d871: 74 35 je 10d8a8 <_Protected_heap_Get_information+0x44>
return false;
if ( !the_info )
10d873: 85 f6 test %esi,%esi
10d875: 74 31 je 10d8a8 <_Protected_heap_Get_information+0x44>
return false;
_RTEMS_Lock_allocator();
10d877: 83 ec 0c sub $0xc,%esp
10d87a: ff 35 fc 88 12 00 pushl 0x1288fc
10d880: e8 cf ed ff ff call 10c654 <_API_Mutex_Lock>
_Heap_Get_information( the_heap, the_info );
10d885: 5a pop %edx
10d886: 59 pop %ecx
10d887: 56 push %esi
10d888: 53 push %ebx
10d889: e8 86 47 00 00 call 112014 <_Heap_Get_information>
_RTEMS_Unlock_allocator();
10d88e: 58 pop %eax
10d88f: ff 35 fc 88 12 00 pushl 0x1288fc
10d895: e8 02 ee ff ff call 10c69c <_API_Mutex_Unlock>
return true;
10d89a: 83 c4 10 add $0x10,%esp
10d89d: b0 01 mov $0x1,%al
}
10d89f: 8d 65 f8 lea -0x8(%ebp),%esp
10d8a2: 5b pop %ebx
10d8a3: 5e pop %esi
10d8a4: c9 leave
10d8a5: c3 ret
10d8a6: 66 90 xchg %ax,%ax
{
if ( !the_heap )
return false;
if ( !the_info )
return false;
10d8a8: 31 c0 xor %eax,%eax
_RTEMS_Lock_allocator();
_Heap_Get_information( the_heap, the_info );
_RTEMS_Unlock_allocator();
return true;
}
10d8aa: 8d 65 f8 lea -0x8(%ebp),%esp
10d8ad: 5b pop %ebx
10d8ae: 5e pop %esi
10d8af: c9 leave
10d8b0: c3 ret
00110c20 <_Protected_heap_Walk>:
bool _Protected_heap_Walk(
Heap_Control *the_heap,
int source,
bool do_dump
)
{
110c20: 55 push %ebp
110c21: 89 e5 mov %esp,%ebp
110c23: 56 push %esi
110c24: 53 push %ebx
110c25: 83 ec 10 sub $0x10,%esp
110c28: 8b 5d 08 mov 0x8(%ebp),%ebx
110c2b: 8b 75 0c mov 0xc(%ebp),%esi
110c2e: 8a 45 10 mov 0x10(%ebp),%al
* then it is forbidden to lock a mutex. But since we are inside
* a critical section, it should be safe to walk it unlocked.
*
* NOTE: Dispatching is also disabled during initialization.
*/
if ( !_Thread_Dispatch_disable_level ) {
110c31: 8b 15 70 f3 12 00 mov 0x12f370,%edx
110c37: 85 d2 test %edx,%edx
110c39: 74 19 je 110c54 <_Protected_heap_Walk+0x34>
_RTEMS_Lock_allocator();
status = _Heap_Walk( the_heap, source, do_dump );
_RTEMS_Unlock_allocator();
} else {
status = _Heap_Walk( the_heap, source, do_dump );
110c3b: 0f b6 c0 movzbl %al,%eax
110c3e: 89 45 10 mov %eax,0x10(%ebp)
110c41: 89 75 0c mov %esi,0xc(%ebp)
110c44: 89 5d 08 mov %ebx,0x8(%ebp)
}
return status;
}
110c47: 8d 65 f8 lea -0x8(%ebp),%esp
110c4a: 5b pop %ebx
110c4b: 5e pop %esi
110c4c: c9 leave
if ( !_Thread_Dispatch_disable_level ) {
_RTEMS_Lock_allocator();
status = _Heap_Walk( the_heap, source, do_dump );
_RTEMS_Unlock_allocator();
} else {
status = _Heap_Walk( the_heap, source, do_dump );
110c4d: e9 1a f2 ff ff jmp 10fe6c <_Heap_Walk>
110c52: 66 90 xchg %ax,%ax
* a critical section, it should be safe to walk it unlocked.
*
* NOTE: Dispatching is also disabled during initialization.
*/
if ( !_Thread_Dispatch_disable_level ) {
_RTEMS_Lock_allocator();
110c54: 83 ec 0c sub $0xc,%esp
110c57: ff 35 5c f4 12 00 pushl 0x12f45c
110c5d: 88 45 f4 mov %al,-0xc(%ebp)
110c60: e8 a7 e3 ff ff call 10f00c <_API_Mutex_Lock>
status = _Heap_Walk( the_heap, source, do_dump );
110c65: 83 c4 0c add $0xc,%esp
110c68: 8a 45 f4 mov -0xc(%ebp),%al
110c6b: 0f b6 c0 movzbl %al,%eax
110c6e: 50 push %eax
110c6f: 56 push %esi
110c70: 53 push %ebx
110c71: e8 f6 f1 ff ff call 10fe6c <_Heap_Walk>
_RTEMS_Unlock_allocator();
110c76: 5a pop %edx
110c77: ff 35 5c f4 12 00 pushl 0x12f45c
110c7d: 88 45 f4 mov %al,-0xc(%ebp)
110c80: e8 cf e3 ff ff call 10f054 <_API_Mutex_Unlock>
110c85: 83 c4 10 add $0x10,%esp
} else {
status = _Heap_Walk( the_heap, source, do_dump );
}
return status;
}
110c88: 8a 45 f4 mov -0xc(%ebp),%al
110c8b: 8d 65 f8 lea -0x8(%ebp),%esp
110c8e: 5b pop %ebx
110c8f: 5e pop %esi
110c90: c9 leave
110c91: c3 ret
00110e64 <_RTEMS_tasks_Create_extension>:
bool _RTEMS_tasks_Create_extension(
Thread_Control *executing,
Thread_Control *created
)
{
110e64: 55 push %ebp
110e65: 89 e5 mov %esp,%ebp
110e67: 53 push %ebx
110e68: 83 ec 10 sub $0x10,%esp
110e6b: 8b 5d 0c mov 0xc(%ebp),%ebx
/*
* Notepads must be the last entry in the structure and they
* can be left off if disabled in the configuration.
*/
to_allocate = sizeof( RTEMS_API_Control );
110e6e: 80 3d c4 3a 12 00 01 cmpb $0x1,0x123ac4
110e75: 19 c0 sbb %eax,%eax
110e77: 83 e0 c0 and $0xffffffc0,%eax
110e7a: 83 c0 60 add $0x60,%eax
if ( !rtems_configuration_get_notepads_enabled() )
to_allocate -= (RTEMS_NUMBER_NOTEPADS * sizeof(uint32_t));
api = _Workspace_Allocate( to_allocate );
110e7d: 50 push %eax
110e7e: e8 dd da ff ff call 10e960 <_Workspace_Allocate>
if ( !api )
110e83: 83 c4 10 add $0x10,%esp
110e86: 85 c0 test %eax,%eax
110e88: 74 6a je 110ef4 <_RTEMS_tasks_Create_extension+0x90>
return false;
created->API_Extensions[ THREAD_API_RTEMS ] = api;
110e8a: 89 83 e8 00 00 00 mov %eax,0xe8(%ebx)
api->pending_events = EVENT_SETS_NONE_PENDING;
110e90: c7 00 00 00 00 00 movl $0x0,(%eax)
api->event_condition = 0;
110e96: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)
*/
RTEMS_INLINE_ROUTINE void _ASR_Initialize (
ASR_Information *information
)
{
information->is_enabled = false;
110e9d: c6 40 08 00 movb $0x0,0x8(%eax)
information->handler = NULL;
110ea1: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
information->mode_set = RTEMS_DEFAULT_MODES;
110ea8: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax)
information->signals_posted = 0;
110eaf: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax)
information->signals_pending = 0;
110eb6: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
information->nest_level = 0;
110ebd: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax)
_ASR_Initialize( &api->Signal );
created->task_variables = NULL;
110ec4: c7 83 f4 00 00 00 00 movl $0x0,0xf4(%ebx)
110ecb: 00 00 00
if ( rtems_configuration_get_notepads_enabled() ) {
110ece: 80 3d c4 3a 12 00 00 cmpb $0x0,0x123ac4
110ed5: 74 13 je 110eea <_RTEMS_tasks_Create_extension+0x86>
110ed7: 31 d2 xor %edx,%edx
110ed9: 8d 76 00 lea 0x0(%esi),%esi
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
api->Notepads[i] = 0;
110edc: c7 44 90 20 00 00 00 movl $0x0,0x20(%eax,%edx,4)
110ee3: 00
api->event_condition = 0;
_ASR_Initialize( &api->Signal );
created->task_variables = NULL;
if ( rtems_configuration_get_notepads_enabled() ) {
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
110ee4: 42 inc %edx
110ee5: 83 fa 10 cmp $0x10,%edx
110ee8: 75 f2 jne 110edc <_RTEMS_tasks_Create_extension+0x78>
api->Notepads[i] = 0;
}
return true;
110eea: b0 01 mov $0x1,%al
}
110eec: 8b 5d fc mov -0x4(%ebp),%ebx
110eef: c9 leave
110ef0: c3 ret
110ef1: 8d 76 00 lea 0x0(%esi),%esi
to_allocate -= (RTEMS_NUMBER_NOTEPADS * sizeof(uint32_t));
api = _Workspace_Allocate( to_allocate );
if ( !api )
return false;
110ef4: 31 c0 xor %eax,%eax
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
api->Notepads[i] = 0;
}
return true;
}
110ef6: 8b 5d fc mov -0x4(%ebp),%ebx
110ef9: c9 leave
110efa: c3 ret
00110e0c <_RTEMS_tasks_Delete_extension>:
void _RTEMS_tasks_Delete_extension(
Thread_Control *executing,
Thread_Control *deleted
)
{
110e0c: 55 push %ebp
110e0d: 89 e5 mov %esp,%ebp
110e0f: 56 push %esi
110e10: 53 push %ebx
110e11: 8b 5d 0c mov 0xc(%ebp),%ebx
/*
* Free per task variable memory
*/
tvp = deleted->task_variables;
110e14: 8b 83 f4 00 00 00 mov 0xf4(%ebx),%eax
deleted->task_variables = NULL;
110e1a: c7 83 f4 00 00 00 00 movl $0x0,0xf4(%ebx)
110e21: 00 00 00
while (tvp) {
110e24: 85 c0 test %eax,%eax
110e26: 75 06 jne 110e2e <_RTEMS_tasks_Delete_extension+0x22>
110e28: eb 17 jmp 110e41 <_RTEMS_tasks_Delete_extension+0x35>
110e2a: 66 90 xchg %ax,%ax
next = (rtems_task_variable_t *)tvp->next;
_RTEMS_Tasks_Invoke_task_variable_dtor( deleted, tvp );
tvp = next;
110e2c: 89 f0 mov %esi,%eax
*/
tvp = deleted->task_variables;
deleted->task_variables = NULL;
while (tvp) {
next = (rtems_task_variable_t *)tvp->next;
110e2e: 8b 30 mov (%eax),%esi
_RTEMS_Tasks_Invoke_task_variable_dtor( deleted, tvp );
110e30: 83 ec 08 sub $0x8,%esp
110e33: 50 push %eax
110e34: 53 push %ebx
110e35: e8 56 01 00 00 call 110f90 <_RTEMS_Tasks_Invoke_task_variable_dtor>
* Free per task variable memory
*/
tvp = deleted->task_variables;
deleted->task_variables = NULL;
while (tvp) {
110e3a: 83 c4 10 add $0x10,%esp
110e3d: 85 f6 test %esi,%esi
110e3f: 75 eb jne 110e2c <_RTEMS_tasks_Delete_extension+0x20>
/*
* Free API specific memory
*/
(void) _Workspace_Free( deleted->API_Extensions[ THREAD_API_RTEMS ] );
110e41: 83 ec 0c sub $0xc,%esp
110e44: ff b3 e8 00 00 00 pushl 0xe8(%ebx)
110e4a: e8 2d db ff ff call 10e97c <_Workspace_Free>
deleted->API_Extensions[ THREAD_API_RTEMS ] = NULL;
110e4f: c7 83 e8 00 00 00 00 movl $0x0,0xe8(%ebx)
110e56: 00 00 00
110e59: 83 c4 10 add $0x10,%esp
}
110e5c: 8d 65 f8 lea -0x8(%ebp),%esp
110e5f: 5b pop %ebx
110e60: 5e pop %esi
110e61: c9 leave
110e62: c3 ret
00110d90 <_RTEMS_tasks_Initialize_user_tasks>:
*
* Output parameters: NONE
*/
void _RTEMS_tasks_Initialize_user_tasks( void )
{
110d90: 55 push %ebp
110d91: 89 e5 mov %esp,%ebp
110d93: 83 ec 08 sub $0x8,%esp
if ( _RTEMS_tasks_Initialize_user_tasks_p )
110d96: a1 44 3b 12 00 mov 0x123b44,%eax
110d9b: 85 c0 test %eax,%eax
110d9d: 74 05 je 110da4 <_RTEMS_tasks_Initialize_user_tasks+0x14>
(*_RTEMS_tasks_Initialize_user_tasks_p)();
}
110d9f: c9 leave
*/
void _RTEMS_tasks_Initialize_user_tasks( void )
{
if ( _RTEMS_tasks_Initialize_user_tasks_p )
(*_RTEMS_tasks_Initialize_user_tasks_p)();
110da0: ff e0 jmp *%eax
110da2: 66 90 xchg %ax,%ax
}
110da4: c9 leave
110da5: c3 ret
0010ba80 <_RTEMS_tasks_Initialize_user_tasks_body>:
*
* Output parameters: NONE
*/
void _RTEMS_tasks_Initialize_user_tasks_body( void )
{
10ba80: 55 push %ebp
10ba81: 89 e5 mov %esp,%ebp
10ba83: 57 push %edi
10ba84: 56 push %esi
10ba85: 53 push %ebx
10ba86: 83 ec 1c sub $0x1c,%esp
rtems_initialization_tasks_table *user_tasks;
/*
* Move information into local variables
*/
user_tasks = Configuration_RTEMS_API.User_initialization_tasks_table;
10ba89: 8b 1d ec 3a 12 00 mov 0x123aec,%ebx
maximum = Configuration_RTEMS_API.number_of_initialization_tasks;
10ba8f: 8b 3d e8 3a 12 00 mov 0x123ae8,%edi
/*
* Verify that we have a set of user tasks to iterate
*/
if ( !user_tasks )
10ba95: 85 db test %ebx,%ebx
10ba97: 74 46 je 10badf <_RTEMS_tasks_Initialize_user_tasks_body+0x5f>
return;
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
10ba99: 85 ff test %edi,%edi
10ba9b: 74 42 je 10badf <_RTEMS_tasks_Initialize_user_tasks_body+0x5f><== NEVER TAKEN
10ba9d: 31 f6 xor %esi,%esi
10ba9f: 90 nop
return_value = rtems_task_create(
10baa0: 83 ec 08 sub $0x8,%esp
10baa3: 8d 45 e4 lea -0x1c(%ebp),%eax
10baa6: 50 push %eax
10baa7: ff 73 0c pushl 0xc(%ebx)
10baaa: ff 73 14 pushl 0x14(%ebx)
10baad: ff 73 04 pushl 0x4(%ebx)
10bab0: ff 73 08 pushl 0x8(%ebx)
10bab3: ff 33 pushl (%ebx)
10bab5: e8 92 fd ff ff call 10b84c <rtems_task_create>
user_tasks[ index ].stack_size,
user_tasks[ index ].mode_set,
user_tasks[ index ].attribute_set,
&id
);
if ( !rtems_is_status_successful( return_value ) )
10baba: 83 c4 20 add $0x20,%esp
10babd: 85 c0 test %eax,%eax
10babf: 75 26 jne 10bae7 <_RTEMS_tasks_Initialize_user_tasks_body+0x67>
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
return_value = rtems_task_start(
10bac1: 51 push %ecx
10bac2: ff 73 18 pushl 0x18(%ebx)
10bac5: ff 73 10 pushl 0x10(%ebx)
10bac8: ff 75 e4 pushl -0x1c(%ebp)
10bacb: e8 24 00 00 00 call 10baf4 <rtems_task_start>
id,
user_tasks[ index ].entry_point,
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
10bad0: 83 c4 10 add $0x10,%esp
10bad3: 85 c0 test %eax,%eax
10bad5: 75 10 jne 10bae7 <_RTEMS_tasks_Initialize_user_tasks_body+0x67>
return;
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
10bad7: 46 inc %esi
10bad8: 83 c3 1c add $0x1c,%ebx
10badb: 39 f7 cmp %esi,%edi
10badd: 77 c1 ja 10baa0 <_RTEMS_tasks_Initialize_user_tasks_body+0x20><== NEVER TAKEN
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
}
}
10badf: 8d 65 f4 lea -0xc(%ebp),%esp
10bae2: 5b pop %ebx
10bae3: 5e pop %esi
10bae4: 5f pop %edi
10bae5: c9 leave
10bae6: c3 ret
id,
user_tasks[ index ].entry_point,
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
10bae7: 52 push %edx
10bae8: 50 push %eax
10bae9: 6a 01 push $0x1
10baeb: 6a 01 push $0x1
10baed: e8 06 0e 00 00 call 10c8f8 <_Internal_error_Occurred>
00110d48 <_RTEMS_tasks_Switch_extension>:
void _RTEMS_tasks_Switch_extension(
Thread_Control *executing,
Thread_Control *heir
)
{
110d48: 55 push %ebp
110d49: 89 e5 mov %esp,%ebp
/*
* Per Task Variables
*/
tvp = executing->task_variables;
110d4b: 8b 45 08 mov 0x8(%ebp),%eax
110d4e: 8b 80 f4 00 00 00 mov 0xf4(%eax),%eax
while (tvp) {
110d54: 85 c0 test %eax,%eax
110d56: 74 13 je 110d6b <_RTEMS_tasks_Switch_extension+0x23>
tvp->tval = *tvp->ptr;
110d58: 8b 50 04 mov 0x4(%eax),%edx
110d5b: 8b 0a mov (%edx),%ecx
110d5d: 89 48 0c mov %ecx,0xc(%eax)
*tvp->ptr = tvp->gval;
110d60: 8b 48 08 mov 0x8(%eax),%ecx
110d63: 89 0a mov %ecx,(%edx)
tvp = (rtems_task_variable_t *)tvp->next;
110d65: 8b 00 mov (%eax),%eax
/*
* Per Task Variables
*/
tvp = executing->task_variables;
while (tvp) {
110d67: 85 c0 test %eax,%eax
110d69: 75 ed jne 110d58 <_RTEMS_tasks_Switch_extension+0x10><== NEVER TAKEN
tvp->tval = *tvp->ptr;
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
110d6b: 8b 45 0c mov 0xc(%ebp),%eax
110d6e: 8b 80 f4 00 00 00 mov 0xf4(%eax),%eax
while (tvp) {
110d74: 85 c0 test %eax,%eax
110d76: 74 13 je 110d8b <_RTEMS_tasks_Switch_extension+0x43>
tvp->gval = *tvp->ptr;
110d78: 8b 50 04 mov 0x4(%eax),%edx
110d7b: 8b 0a mov (%edx),%ecx
110d7d: 89 48 08 mov %ecx,0x8(%eax)
*tvp->ptr = tvp->tval;
110d80: 8b 48 0c mov 0xc(%eax),%ecx
110d83: 89 0a mov %ecx,(%edx)
tvp = (rtems_task_variable_t *)tvp->next;
110d85: 8b 00 mov (%eax),%eax
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
while (tvp) {
110d87: 85 c0 test %eax,%eax
110d89: 75 ed jne 110d78 <_RTEMS_tasks_Switch_extension+0x30><== NEVER TAKEN
tvp->gval = *tvp->ptr;
*tvp->ptr = tvp->tval;
tvp = (rtems_task_variable_t *)tvp->next;
}
}
110d8b: c9 leave
110d8c: c3 ret
0010c4f0 <_Rate_monotonic_Initiate_statistics>:
}
void _Rate_monotonic_Initiate_statistics(
Rate_monotonic_Control *the_period
)
{
10c4f0: 55 push %ebp
10c4f1: 89 e5 mov %esp,%ebp
10c4f3: 57 push %edi
10c4f4: 56 push %esi
10c4f5: 53 push %ebx
10c4f6: 83 ec 28 sub $0x28,%esp
10c4f9: 8b 5d 08 mov 0x8(%ebp),%ebx
Thread_Control *owning_thread = the_period->owner;
10c4fc: 8b 73 40 mov 0x40(%ebx),%esi
* If using nanosecond statistics, we need to obtain the uptime.
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
Timestamp_Control uptime;
_TOD_Get_uptime( &uptime );
10c4ff: 8d 7d e0 lea -0x20(%ebp),%edi
10c502: 57 push %edi
10c503: e8 9c 18 00 00 call 10dda4 <_TOD_Get_uptime>
/*
* Set the starting point and the CPU time used for the statistics.
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
the_period->time_period_initiated = uptime;
10c508: 8b 45 e0 mov -0x20(%ebp),%eax
10c50b: 8b 55 e4 mov -0x1c(%ebp),%edx
10c50e: 89 43 4c mov %eax,0x4c(%ebx)
10c511: 89 53 50 mov %edx,0x50(%ebx)
#else
the_period->time_period_initiated = _Watchdog_Ticks_since_boot;
#endif
the_period->cpu_usage_period_initiated = owning_thread->cpu_time_used;
10c514: 8b 86 84 00 00 00 mov 0x84(%esi),%eax
10c51a: 8b 96 88 00 00 00 mov 0x88(%esi),%edx
10c520: 89 43 44 mov %eax,0x44(%ebx)
10c523: 89 53 48 mov %edx,0x48(%ebx)
* routine is invoked from rtems_rate_monotonic_period, the owner will
* be the executing thread. When this routine is invoked from
* _Rate_monotonic_Timeout, it will not.
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
if (owning_thread == _Thread_Executing) {
10c526: 83 c4 10 add $0x10,%esp
10c529: 39 35 98 b7 12 00 cmp %esi,0x12b798
10c52f: 74 0b je 10c53c <_Rate_monotonic_Initiate_statistics+0x4c>
);
_Timespec_Add_to( &the_period->cpu_usage_period_initiated, &ran );
}
#endif
}
10c531: 8d 65 f4 lea -0xc(%ebp),%esp
10c534: 5b pop %ebx
10c535: 5e pop %esi
10c536: 5f pop %edi
10c537: c9 leave
10c538: c3 ret
10c539: 8d 76 00 lea 0x0(%esi),%esi
/*
* Adjust the CPU time used to account for the time since last
* context switch.
*/
_Timespec_Subtract(
10c53c: 50 push %eax
&_Thread_Time_of_last_context_switch, &uptime, &ran
10c53d: 8d 75 d8 lea -0x28(%ebp),%esi
/*
* Adjust the CPU time used to account for the time since last
* context switch.
*/
_Timespec_Subtract(
10c540: 56 push %esi
10c541: 57 push %edi
10c542: 68 a8 b2 12 00 push $0x12b2a8
10c547: e8 cc 39 00 00 call 10ff18 <_Timespec_Subtract>
&_Thread_Time_of_last_context_switch, &uptime, &ran
);
_Timespec_Add_to( &the_period->cpu_usage_period_initiated, &ran );
10c54c: 59 pop %ecx
10c54d: 5f pop %edi
10c54e: 56 push %esi
10c54f: 83 c3 44 add $0x44,%ebx
10c552: 53 push %ebx
10c553: e8 c4 38 00 00 call 10fe1c <_Timespec_Add_to>
10c558: 83 c4 10 add $0x10,%esp
}
#endif
}
10c55b: 8d 65 f4 lea -0xc(%ebp),%esp
10c55e: 5b pop %ebx
10c55f: 5e pop %esi
10c560: 5f pop %edi
10c561: c9 leave
10c562: c3 ret
0010caac <_Rate_monotonic_Timeout>:
void _Rate_monotonic_Timeout(
Objects_Id id,
void *ignored
)
{
10caac: 55 push %ebp
10caad: 89 e5 mov %esp,%ebp
10caaf: 83 ec 2c sub $0x2c,%esp
/*
* When we get here, the Timer is already off the chain so we do not
* have to worry about that -- hence no _Watchdog_Remove().
*/
the_period = _Rate_monotonic_Get( id, &location );
10cab2: 8d 45 f4 lea -0xc(%ebp),%eax
10cab5: 50 push %eax
10cab6: ff 75 08 pushl 0x8(%ebp)
10cab9: 68 c0 b0 12 00 push $0x12b0c0
10cabe: e8 79 1d 00 00 call 10e83c <_Objects_Get>
switch ( location ) {
10cac3: 83 c4 10 add $0x10,%esp
10cac6: 8b 55 f4 mov -0xc(%ebp),%edx
10cac9: 85 d2 test %edx,%edx
10cacb: 75 29 jne 10caf6 <_Rate_monotonic_Timeout+0x4a><== NEVER TAKEN
case OBJECTS_LOCAL:
the_thread = the_period->owner;
10cacd: 8b 50 40 mov 0x40(%eax),%edx
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
10cad0: f6 42 11 40 testb $0x40,0x11(%edx)
10cad4: 74 08 je 10cade <_Rate_monotonic_Timeout+0x32>
10cad6: 8b 48 08 mov 0x8(%eax),%ecx
10cad9: 39 4a 20 cmp %ecx,0x20(%edx)
10cadc: 74 4e je 10cb2c <_Rate_monotonic_Timeout+0x80>
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
10cade: 83 78 38 01 cmpl $0x1,0x38(%eax)
10cae2: 74 14 je 10caf8 <_Rate_monotonic_Timeout+0x4c>
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else
the_period->state = RATE_MONOTONIC_EXPIRED;
10cae4: c7 40 38 04 00 00 00 movl $0x4,0x38(%eax)
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10caeb: a1 b0 b1 12 00 mov 0x12b1b0,%eax
10caf0: 48 dec %eax
10caf1: a3 b0 b1 12 00 mov %eax,0x12b1b0
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
10caf6: c9 leave
10caf7: c3 ret
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING;
10caf8: c7 40 38 03 00 00 00 movl $0x3,0x38(%eax)
_Rate_monotonic_Initiate_statistics( the_period );
10caff: 83 ec 0c sub $0xc,%esp
10cb02: 50 push %eax
10cb03: 89 45 e4 mov %eax,-0x1c(%ebp)
10cb06: e8 e5 f9 ff ff call 10c4f0 <_Rate_monotonic_Initiate_statistics>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10cb0b: 8b 45 e4 mov -0x1c(%ebp),%eax
10cb0e: 8b 50 3c mov 0x3c(%eax),%edx
10cb11: 89 50 1c mov %edx,0x1c(%eax)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10cb14: 5a pop %edx
10cb15: 59 pop %ecx
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
10cb16: 83 c0 10 add $0x10,%eax
10cb19: 50 push %eax
10cb1a: 68 bc b2 12 00 push $0x12b2bc
10cb1f: e8 d4 36 00 00 call 1101f8 <_Watchdog_Insert>
10cb24: 83 c4 10 add $0x10,%esp
10cb27: eb c2 jmp 10caeb <_Rate_monotonic_Timeout+0x3f>
10cb29: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
10cb2c: 83 ec 08 sub $0x8,%esp
10cb2f: 68 f8 ff 03 10 push $0x1003fff8
10cb34: 52 push %edx
10cb35: 89 45 e4 mov %eax,-0x1c(%ebp)
10cb38: e8 33 24 00 00 call 10ef70 <_Thread_Clear_state>
the_thread = the_period->owner;
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
the_thread->Wait.id == the_period->Object.id ) {
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
10cb3d: 8b 45 e4 mov -0x1c(%ebp),%eax
10cb40: 89 04 24 mov %eax,(%esp)
10cb43: eb c1 jmp 10cb06 <_Rate_monotonic_Timeout+0x5a>
0010c564 <_Rate_monotonic_Update_statistics>:
void _Rate_monotonic_Update_statistics(
Rate_monotonic_Control *the_period
)
{
10c564: 55 push %ebp
10c565: 89 e5 mov %esp,%ebp
10c567: 57 push %edi
10c568: 56 push %esi
10c569: 53 push %ebx
10c56a: 83 ec 1c sub $0x1c,%esp
10c56d: 8b 5d 08 mov 0x8(%ebp),%ebx
/*
* Update the counts.
*/
stats = &the_period->Statistics;
stats->count++;
10c570: ff 43 54 incl 0x54(%ebx)
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
10c573: 83 7b 38 04 cmpl $0x4,0x38(%ebx)
10c577: 0f 84 bf 00 00 00 je 10c63c <_Rate_monotonic_Update_statistics+0xd8>
stats->missed_count++;
/*
* Grab status for time statistics.
*/
valid_status =
10c57d: 51 push %ecx
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
10c57e: 8d 7d e0 lea -0x20(%ebp),%edi
stats->missed_count++;
/*
* Grab status for time statistics.
*/
valid_status =
10c581: 57 push %edi
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
10c582: 8d 75 d8 lea -0x28(%ebp),%esi
stats->missed_count++;
/*
* Grab status for time statistics.
*/
valid_status =
10c585: 56 push %esi
10c586: 53 push %ebx
10c587: e8 cc fe ff ff call 10c458 <_Rate_monotonic_Get_status>
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
if (!valid_status)
10c58c: 83 c4 10 add $0x10,%esp
10c58f: 84 c0 test %al,%al
10c591: 75 09 jne 10c59c <_Rate_monotonic_Update_statistics+0x38>
stats->min_wall_time = since_last_period;
if ( since_last_period > stats->max_wall_time )
stats->max_wall_time = since_last_period;
#endif
}
10c593: 8d 65 f4 lea -0xc(%ebp),%esp
10c596: 5b pop %ebx
10c597: 5e pop %esi
10c598: 5f pop %edi
10c599: c9 leave
10c59a: c3 ret
10c59b: 90 nop
/*
* Update CPU time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_cpu_time, &executed );
10c59c: 83 ec 08 sub $0x8,%esp
10c59f: 57 push %edi
10c5a0: 8d 43 6c lea 0x6c(%ebx),%eax
10c5a3: 50 push %eax
10c5a4: e8 73 38 00 00 call 10fe1c <_Timespec_Add_to>
if ( _Timestamp_Less_than( &executed, &stats->min_cpu_time ) )
10c5a9: 58 pop %eax
10c5aa: 5a pop %edx
10c5ab: 8d 43 5c lea 0x5c(%ebx),%eax
10c5ae: 50 push %eax
10c5af: 57 push %edi
10c5b0: e8 3f 39 00 00 call 10fef4 <_Timespec_Less_than>
10c5b5: 83 c4 10 add $0x10,%esp
10c5b8: 84 c0 test %al,%al
10c5ba: 74 0c je 10c5c8 <_Rate_monotonic_Update_statistics+0x64>
stats->min_cpu_time = executed;
10c5bc: 8b 45 e0 mov -0x20(%ebp),%eax
10c5bf: 8b 55 e4 mov -0x1c(%ebp),%edx
10c5c2: 89 43 5c mov %eax,0x5c(%ebx)
10c5c5: 89 53 60 mov %edx,0x60(%ebx)
if ( _Timestamp_Greater_than( &executed, &stats->max_cpu_time ) )
10c5c8: 83 ec 08 sub $0x8,%esp
10c5cb: 8d 43 64 lea 0x64(%ebx),%eax
10c5ce: 50 push %eax
10c5cf: 57 push %edi
10c5d0: e8 fb 38 00 00 call 10fed0 <_Timespec_Greater_than>
10c5d5: 83 c4 10 add $0x10,%esp
10c5d8: 84 c0 test %al,%al
10c5da: 74 0c je 10c5e8 <_Rate_monotonic_Update_statistics+0x84>
stats->max_cpu_time = executed;
10c5dc: 8b 45 e0 mov -0x20(%ebp),%eax
10c5df: 8b 55 e4 mov -0x1c(%ebp),%edx
10c5e2: 89 43 64 mov %eax,0x64(%ebx)
10c5e5: 89 53 68 mov %edx,0x68(%ebx)
/*
* Update Wall time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_wall_time, &since_last_period );
10c5e8: 83 ec 08 sub $0x8,%esp
10c5eb: 56 push %esi
10c5ec: 8d 83 84 00 00 00 lea 0x84(%ebx),%eax
10c5f2: 50 push %eax
10c5f3: e8 24 38 00 00 call 10fe1c <_Timespec_Add_to>
if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) )
10c5f8: 5a pop %edx
10c5f9: 59 pop %ecx
10c5fa: 8d 43 74 lea 0x74(%ebx),%eax
10c5fd: 50 push %eax
10c5fe: 56 push %esi
10c5ff: e8 f0 38 00 00 call 10fef4 <_Timespec_Less_than>
10c604: 83 c4 10 add $0x10,%esp
10c607: 84 c0 test %al,%al
10c609: 75 39 jne 10c644 <_Rate_monotonic_Update_statistics+0xe0>
stats->min_wall_time = since_last_period;
if ( _Timestamp_Greater_than( &since_last_period, &stats->max_wall_time ) )
10c60b: 83 ec 08 sub $0x8,%esp
10c60e: 8d 43 7c lea 0x7c(%ebx),%eax
10c611: 50 push %eax
10c612: 56 push %esi
10c613: e8 b8 38 00 00 call 10fed0 <_Timespec_Greater_than>
10c618: 83 c4 10 add $0x10,%esp
10c61b: 84 c0 test %al,%al
10c61d: 0f 84 70 ff ff ff je 10c593 <_Rate_monotonic_Update_statistics+0x2f>
stats->max_wall_time = since_last_period;
10c623: 8b 45 d8 mov -0x28(%ebp),%eax
10c626: 8b 55 dc mov -0x24(%ebp),%edx
10c629: 89 43 7c mov %eax,0x7c(%ebx)
10c62c: 89 93 80 00 00 00 mov %edx,0x80(%ebx)
stats->min_wall_time = since_last_period;
if ( since_last_period > stats->max_wall_time )
stats->max_wall_time = since_last_period;
#endif
}
10c632: 8d 65 f4 lea -0xc(%ebp),%esp
10c635: 5b pop %ebx
10c636: 5e pop %esi
10c637: 5f pop %edi
10c638: c9 leave
10c639: c3 ret
10c63a: 66 90 xchg %ax,%ax
*/
stats = &the_period->Statistics;
stats->count++;
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
stats->missed_count++;
10c63c: ff 43 58 incl 0x58(%ebx)
10c63f: e9 39 ff ff ff jmp 10c57d <_Rate_monotonic_Update_statistics+0x19>
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_wall_time, &since_last_period );
if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) )
stats->min_wall_time = since_last_period;
10c644: 8b 45 d8 mov -0x28(%ebp),%eax
10c647: 8b 55 dc mov -0x24(%ebp),%edx
10c64a: 89 43 74 mov %eax,0x74(%ebx)
10c64d: 89 53 78 mov %edx,0x78(%ebx)
10c650: eb b9 jmp 10c60b <_Rate_monotonic_Update_statistics+0xa7>
00111608 <_Scheduler_priority_Block>:
void _Scheduler_priority_Block(
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
111608: 55 push %ebp
111609: 89 e5 mov %esp,%ebp
11160b: 53 push %ebx
11160c: 8b 45 0c mov 0xc(%ebp),%eax
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_extract(
Thread_Control *the_thread
)
{
Chain_Control *ready = the_thread->scheduler.priority->ready_chain;
11160f: 8b 90 8c 00 00 00 mov 0x8c(%eax),%edx
111615: 8b 12 mov (%edx),%edx
if ( _Chain_Has_only_one_node( ready ) ) {
111617: 8b 4a 08 mov 0x8(%edx),%ecx
11161a: 39 0a cmp %ecx,(%edx)
11161c: 74 6e je 11168c <_Scheduler_priority_Block+0x84>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
11161e: 8b 08 mov (%eax),%ecx
previous = the_node->previous;
111620: 8b 50 04 mov 0x4(%eax),%edx
next->previous = previous;
111623: 89 51 04 mov %edx,0x4(%ecx)
previous->next = next;
111626: 89 0a mov %ecx,(%edx)
{
_Scheduler_priority_Ready_queue_extract(the_thread);
/* TODO: flash critical section */
if ( _Thread_Is_heir( the_thread ) )
111628: 3b 05 1c 84 12 00 cmp 0x12841c,%eax
11162e: 74 18 je 111648 <_Scheduler_priority_Block+0x40>
_Scheduler_priority_Schedule_body(the_scheduler);
if ( _Thread_Is_executing( the_thread ) )
111630: 3b 05 18 84 12 00 cmp 0x128418,%eax
111636: 74 04 je 11163c <_Scheduler_priority_Block+0x34>
_Scheduler_priority_Block_body(the_scheduler, the_thread);
}
111638: 5b pop %ebx
111639: c9 leave
11163a: c3 ret
11163b: 90 nop
_Thread_Dispatch_necessary = true;
11163c: c6 05 24 84 12 00 01 movb $0x1,0x128424
111643: 5b pop %ebx
111644: c9 leave
111645: c3 ret
111646: 66 90 xchg %ax,%ax
RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void )
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
111648: 66 8b 1d 40 84 12 00 mov 0x128440,%bx
11164f: 31 d2 xor %edx,%edx
111651: 89 d1 mov %edx,%ecx
111653: 66 0f bc cb bsf %bx,%cx
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
111657: 0f b7 c9 movzwl %cx,%ecx
11165a: 66 8b 9c 09 60 84 12 mov 0x128460(%ecx,%ecx,1),%bx
111661: 00
111662: 66 0f bc d3 bsf %bx,%dx
return (_Priority_Bits_index( major ) << 4) +
111666: c1 e1 04 shl $0x4,%ecx
111669: 0f b7 d2 movzwl %dx,%edx
11166c: 8d 14 11 lea (%ecx,%edx,1),%edx
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
11166f: 8d 14 52 lea (%edx,%edx,2),%edx
111672: c1 e2 02 shl $0x2,%edx
111675: 8b 4d 08 mov 0x8(%ebp),%ecx
111678: 03 11 add (%ecx),%edx
11167a: 8b 0a mov (%edx),%ecx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
11167c: 83 c2 04 add $0x4,%edx
11167f: 39 d1 cmp %edx,%ecx
111681: 74 4d je 1116d0 <_Scheduler_priority_Block+0xc8><== NEVER TAKEN
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(
Scheduler_Control *the_scheduler
)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
111683: 89 0d 1c 84 12 00 mov %ecx,0x12841c
111689: eb a5 jmp 111630 <_Scheduler_priority_Block+0x28>
11168b: 90 nop
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
11168c: 8d 4a 04 lea 0x4(%edx),%ecx
11168f: 89 0a mov %ecx,(%edx)
head->next = tail;
head->previous = NULL;
111691: c7 42 04 00 00 00 00 movl $0x0,0x4(%edx)
tail->previous = head;
111698: 89 52 08 mov %edx,0x8(%edx)
{
Chain_Control *ready = the_thread->scheduler.priority->ready_chain;
if ( _Chain_Has_only_one_node( ready ) ) {
_Chain_Initialize_empty( ready );
_Priority_bit_map_Remove( &the_thread->scheduler.priority->Priority_map );
11169b: 8b 88 8c 00 00 00 mov 0x8c(%eax),%ecx
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor &= the_priority_map->block_minor;
1116a1: 8b 59 04 mov 0x4(%ecx),%ebx
1116a4: 66 8b 13 mov (%ebx),%dx
1116a7: 66 23 51 0e and 0xe(%ecx),%dx
1116ab: 66 89 13 mov %dx,(%ebx)
if ( *the_priority_map->minor == 0 )
1116ae: 66 85 d2 test %dx,%dx
1116b1: 0f 85 71 ff ff ff jne 111628 <_Scheduler_priority_Block+0x20>
_Priority_Major_bit_map &= the_priority_map->block_major;
1116b7: 66 8b 15 40 84 12 00 mov 0x128440,%dx
1116be: 23 51 0c and 0xc(%ecx),%edx
1116c1: 66 89 15 40 84 12 00 mov %dx,0x128440
1116c8: e9 5b ff ff ff jmp 111628 <_Scheduler_priority_Block+0x20>
1116cd: 8d 76 00 lea 0x0(%esi),%esi
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
1116d0: 31 c9 xor %ecx,%ecx <== NOT EXECUTED
1116d2: eb af jmp 111683 <_Scheduler_priority_Block+0x7b><== NOT EXECUTED
0010d238 <_Scheduler_priority_Schedule>:
*/
void _Scheduler_priority_Schedule(
Scheduler_Control *the_scheduler
)
{
10d238: 55 push %ebp
10d239: 89 e5 mov %esp,%ebp
RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void )
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
10d23b: 66 8b 0d 40 84 12 00 mov 0x128440,%cx
10d242: 31 c0 xor %eax,%eax
10d244: 89 c2 mov %eax,%edx
10d246: 66 0f bc d1 bsf %cx,%dx
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
10d24a: 0f b7 d2 movzwl %dx,%edx
10d24d: 66 8b 8c 12 60 84 12 mov 0x128460(%edx,%edx,1),%cx
10d254: 00
10d255: 66 0f bc c1 bsf %cx,%ax
return (_Priority_Bits_index( major ) << 4) +
10d259: c1 e2 04 shl $0x4,%edx
10d25c: 0f b7 c0 movzwl %ax,%eax
10d25f: 8d 04 02 lea (%edx,%eax,1),%eax
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
10d262: 8d 04 40 lea (%eax,%eax,2),%eax
10d265: c1 e0 02 shl $0x2,%eax
10d268: 8b 55 08 mov 0x8(%ebp),%edx
10d26b: 03 02 add (%edx),%eax
_Scheduler_priority_Schedule_body( the_scheduler );
}
10d26d: 8b 10 mov (%eax),%edx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10d26f: 83 c0 04 add $0x4,%eax
10d272: 39 c2 cmp %eax,%edx
10d274: 74 0a je 10d280 <_Scheduler_priority_Schedule+0x48><== NEVER TAKEN
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(
Scheduler_Control *the_scheduler
)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
10d276: 89 15 1c 84 12 00 mov %edx,0x12841c
10d27c: c9 leave
10d27d: c3 ret
10d27e: 66 90 xchg %ax,%ax
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
10d280: 31 d2 xor %edx,%edx <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(
Scheduler_Control *the_scheduler
)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
10d282: 89 15 1c 84 12 00 mov %edx,0x12841c <== NOT EXECUTED
10d288: c9 leave <== NOT EXECUTED
10d289: c3 ret <== NOT EXECUTED
0010d318 <_Scheduler_priority_Unblock>:
void _Scheduler_priority_Unblock (
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
10d318: 55 push %ebp
10d319: 89 e5 mov %esp,%ebp
10d31b: 53 push %ebx
10d31c: 8b 45 0c mov 0xc(%ebp),%eax
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_enqueue(
Thread_Control *the_thread
)
{
_Priority_bit_map_Add( &the_thread->scheduler.priority->Priority_map );
10d31f: 8b 90 8c 00 00 00 mov 0x8c(%eax),%edx
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Add (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor |= the_priority_map->ready_minor;
10d325: 8b 4a 04 mov 0x4(%edx),%ecx
10d328: 66 8b 5a 0a mov 0xa(%edx),%bx
10d32c: 66 09 19 or %bx,(%ecx)
_Priority_Major_bit_map |= the_priority_map->ready_major;
10d32f: 66 8b 0d 40 84 12 00 mov 0x128440,%cx
10d336: 0b 4a 08 or 0x8(%edx),%ecx
10d339: 66 89 0d 40 84 12 00 mov %cx,0x128440
_Chain_Append_unprotected( the_thread->scheduler.priority->ready_chain,
10d340: 8b 12 mov (%edx),%edx
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
10d342: 8b 4a 08 mov 0x8(%edx),%ecx
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
10d345: 8d 5a 04 lea 0x4(%edx),%ebx
10d348: 89 18 mov %ebx,(%eax)
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
10d34a: 89 42 08 mov %eax,0x8(%edx)
old_last->next = the_node;
10d34d: 89 01 mov %eax,(%ecx)
the_node->previous = old_last;
10d34f: 89 48 04 mov %ecx,0x4(%eax)
* a context switch.
* Pseudo-ISR case:
* Even if the thread isn't preemptible, if the new heir is
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( the_thread->current_priority < _Thread_Heir->current_priority ) {
10d352: 8b 50 14 mov 0x14(%eax),%edx
10d355: 8b 0d 1c 84 12 00 mov 0x12841c,%ecx
10d35b: 3b 51 14 cmp 0x14(%ecx),%edx
10d35e: 73 17 jae 10d377 <_Scheduler_priority_Unblock+0x5f>
_Thread_Heir = the_thread;
10d360: a3 1c 84 12 00 mov %eax,0x12841c
if ( _Thread_Executing->is_preemptible ||
10d365: a1 18 84 12 00 mov 0x128418,%eax
10d36a: 80 78 74 00 cmpb $0x0,0x74(%eax)
10d36e: 74 0c je 10d37c <_Scheduler_priority_Unblock+0x64>
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
10d370: c6 05 24 84 12 00 01 movb $0x1,0x128424
_Scheduler_priority_Unblock_body(the_scheduler, the_thread);
}
10d377: 5b pop %ebx
10d378: c9 leave
10d379: c3 ret
10d37a: 66 90 xchg %ax,%ax
* Even if the thread isn't preemptible, if the new heir is
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( the_thread->current_priority < _Thread_Heir->current_priority ) {
_Thread_Heir = the_thread;
if ( _Thread_Executing->is_preemptible ||
10d37c: 85 d2 test %edx,%edx
10d37e: 75 f7 jne 10d377 <_Scheduler_priority_Unblock+0x5f>
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
10d380: c6 05 24 84 12 00 01 movb $0x1,0x128424
10d387: eb ee jmp 10d377 <_Scheduler_priority_Unblock+0x5f>
0010d38c <_Scheduler_priority_Yield>:
*/
void _Scheduler_priority_Yield(
Scheduler_Control *the_scheduler __attribute__((unused))
)
{
10d38c: 55 push %ebp
10d38d: 89 e5 mov %esp,%ebp
10d38f: 56 push %esi
10d390: 53 push %ebx
ISR_Level level;
Thread_Control *executing;
Chain_Control *ready;
executing = _Thread_Executing;
10d391: a1 18 84 12 00 mov 0x128418,%eax
ready = executing->scheduler.priority->ready_chain;
10d396: 8b 90 8c 00 00 00 mov 0x8c(%eax),%edx
10d39c: 8b 12 mov (%edx),%edx
_ISR_Disable( level );
10d39e: 9c pushf
10d39f: fa cli
10d3a0: 59 pop %ecx
if ( !_Chain_Has_only_one_node( ready ) ) {
10d3a1: 8b 5a 08 mov 0x8(%edx),%ebx
10d3a4: 39 1a cmp %ebx,(%edx)
10d3a6: 74 40 je 10d3e8 <_Scheduler_priority_Yield+0x5c>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
10d3a8: 8b 30 mov (%eax),%esi
previous = the_node->previous;
10d3aa: 8b 58 04 mov 0x4(%eax),%ebx
next->previous = previous;
10d3ad: 89 5e 04 mov %ebx,0x4(%esi)
previous->next = next;
10d3b0: 89 33 mov %esi,(%ebx)
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
10d3b2: 8b 5a 08 mov 0x8(%edx),%ebx
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
10d3b5: 8d 72 04 lea 0x4(%edx),%esi
10d3b8: 89 30 mov %esi,(%eax)
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
10d3ba: 89 42 08 mov %eax,0x8(%edx)
old_last->next = the_node;
10d3bd: 89 03 mov %eax,(%ebx)
the_node->previous = old_last;
10d3bf: 89 58 04 mov %ebx,0x4(%eax)
_Chain_Extract_unprotected( &executing->Object.Node );
_Chain_Append_unprotected( ready, &executing->Object.Node );
_ISR_Flash( level );
10d3c2: 51 push %ecx
10d3c3: 9d popf
10d3c4: fa cli
if ( _Thread_Is_heir( executing ) )
10d3c5: 3b 05 1c 84 12 00 cmp 0x12841c,%eax
10d3cb: 74 0f je 10d3dc <_Scheduler_priority_Yield+0x50>
_Thread_Heir = (Thread_Control *) _Chain_First( ready );
_Thread_Dispatch_necessary = true;
}
else if ( !_Thread_Is_heir( executing ) )
_Thread_Dispatch_necessary = true;
10d3cd: c6 05 24 84 12 00 01 movb $0x1,0x128424
_ISR_Enable( level );
10d3d4: 51 push %ecx
10d3d5: 9d popf
}
10d3d6: 5b pop %ebx
10d3d7: 5e pop %esi
10d3d8: c9 leave
10d3d9: c3 ret
10d3da: 66 90 xchg %ax,%ax
_Chain_Append_unprotected( ready, &executing->Object.Node );
_ISR_Flash( level );
if ( _Thread_Is_heir( executing ) )
_Thread_Heir = (Thread_Control *) _Chain_First( ready );
10d3dc: 8b 02 mov (%edx),%eax
10d3de: a3 1c 84 12 00 mov %eax,0x12841c
10d3e3: eb e8 jmp 10d3cd <_Scheduler_priority_Yield+0x41>
10d3e5: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Dispatch_necessary = true;
}
else if ( !_Thread_Is_heir( executing ) )
10d3e8: 3b 05 1c 84 12 00 cmp 0x12841c,%eax
10d3ee: 75 dd jne 10d3cd <_Scheduler_priority_Yield+0x41>
10d3f0: eb e2 jmp 10d3d4 <_Scheduler_priority_Yield+0x48>
0010dae0 <_TOD_Set>:
*/
void _TOD_Set(
const struct timespec *time
)
{
10dae0: 55 push %ebp
10dae1: 89 e5 mov %esp,%ebp
10dae3: 53 push %ebx
10dae4: 83 ec 04 sub $0x4,%esp
10dae7: 8b 5d 08 mov 0x8(%ebp),%ebx
10daea: a1 50 34 13 00 mov 0x133450,%eax
10daef: 40 inc %eax
10daf0: a3 50 34 13 00 mov %eax,0x133450
long seconds;
_Thread_Disable_dispatch();
_TOD_Deactivate();
seconds = _TOD_Seconds_since_epoch();
10daf5: a1 24 35 13 00 mov 0x133524,%eax
if ( time->tv_sec < seconds )
10dafa: 8b 13 mov (%ebx),%edx
10dafc: 39 d0 cmp %edx,%eax
10dafe: 7f 34 jg 10db34 <_TOD_Set+0x54>
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
_Watchdog_Adjust( &_Watchdog_Seconds_chain, direction, units );
10db00: 51 push %ecx
_Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds - time->tv_sec );
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, time->tv_sec - seconds );
10db01: 29 c2 sub %eax,%edx
10db03: 52 push %edx
10db04: 6a 00 push $0x0
10db06: 68 50 35 13 00 push $0x133550
10db0b: e8 e8 24 00 00 call 10fff8 <_Watchdog_Adjust>
10db10: 83 c4 10 add $0x10,%esp
/* POSIX format TOD (timespec) */
_Timestamp_Set( &_TOD_Now, time->tv_sec, time->tv_nsec );
10db13: 8b 03 mov (%ebx),%eax
10db15: a3 24 35 13 00 mov %eax,0x133524
10db1a: 8b 43 04 mov 0x4(%ebx),%eax
10db1d: a3 28 35 13 00 mov %eax,0x133528
_TOD_Is_set = true;
10db22: c6 05 64 34 13 00 01 movb $0x1,0x133464
_TOD_Activate();
_Thread_Enable_dispatch();
}
10db29: 8b 5d fc mov -0x4(%ebp),%ebx
10db2c: c9 leave
_Timestamp_Set( &_TOD_Now, time->tv_sec, time->tv_nsec );
_TOD_Is_set = true;
_TOD_Activate();
_Thread_Enable_dispatch();
10db2d: e9 42 15 00 00 jmp 10f074 <_Thread_Enable_dispatch>
10db32: 66 90 xchg %ax,%ax
10db34: 51 push %ecx
_TOD_Deactivate();
seconds = _TOD_Seconds_since_epoch();
if ( time->tv_sec < seconds )
_Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds - time->tv_sec );
10db35: 29 d0 sub %edx,%eax
10db37: 50 push %eax
10db38: 6a 01 push $0x1
10db3a: 68 50 35 13 00 push $0x133550
10db3f: e8 b4 24 00 00 call 10fff8 <_Watchdog_Adjust>
10db44: 83 c4 10 add $0x10,%esp
10db47: eb ca jmp 10db13 <_TOD_Set+0x33>
0010c1e8 <_TOD_To_seconds>:
*/
uint32_t _TOD_To_seconds(
const rtems_time_of_day *the_tod
)
{
10c1e8: 55 push %ebp
10c1e9: 89 e5 mov %esp,%ebp
10c1eb: 56 push %esi
10c1ec: 53 push %ebx
10c1ed: 8b 55 08 mov 0x8(%ebp),%edx
uint32_t time;
uint32_t year_mod_4;
time = the_tod->day - 1;
10c1f0: 8b 72 08 mov 0x8(%edx),%esi
10c1f3: 4e dec %esi
year_mod_4 = the_tod->year & 3;
10c1f4: 8b 02 mov (%edx),%eax
if ( year_mod_4 == 0 )
10c1f6: 89 c3 mov %eax,%ebx
10c1f8: 83 e3 03 and $0x3,%ebx
10c1fb: 74 67 je 10c264 <_TOD_To_seconds+0x7c>
time += _TOD_Days_to_date[ 1 ][ the_tod->month ];
else
time += _TOD_Days_to_date[ 0 ][ the_tod->month ];
10c1fd: 8b 4a 04 mov 0x4(%edx),%ecx
10c200: 0f b7 8c 09 a0 43 12 movzwl 0x1243a0(%ecx,%ecx,1),%ecx
10c207: 00
10c208: 8d 34 31 lea (%ecx,%esi,1),%esi
time += ( (the_tod->year - TOD_BASE_YEAR) / 4 ) *
( (TOD_DAYS_PER_YEAR * 4) + 1);
time += _TOD_Days_since_last_leap_year[ year_mod_4 ];
10c20b: 0f b7 8c 1b d4 43 12 movzwl 0x1243d4(%ebx,%ebx,1),%ecx
10c212: 00
if ( year_mod_4 == 0 )
time += _TOD_Days_to_date[ 1 ][ the_tod->month ];
else
time += _TOD_Days_to_date[ 0 ][ the_tod->month ];
time += ( (the_tod->year - TOD_BASE_YEAR) / 4 ) *
10c213: 2d c4 07 00 00 sub $0x7c4,%eax
10c218: c1 e8 02 shr $0x2,%eax
10c21b: 8d 1c c0 lea (%eax,%eax,8),%ebx
10c21e: 8d 1c d8 lea (%eax,%ebx,8),%ebx
10c221: 8d 1c 9b lea (%ebx,%ebx,4),%ebx
10c224: 8d 04 98 lea (%eax,%ebx,4),%eax
10c227: 01 c1 add %eax,%ecx
( (TOD_DAYS_PER_YEAR * 4) + 1);
time += _TOD_Days_since_last_leap_year[ year_mod_4 ];
10c229: 01 f1 add %esi,%ecx
time *= TOD_SECONDS_PER_DAY;
10c22b: 8d 04 89 lea (%ecx,%ecx,4),%eax
10c22e: 8d 04 81 lea (%ecx,%eax,4),%eax
10c231: 8d 04 c1 lea (%ecx,%eax,8),%eax
10c234: c1 e0 02 shl $0x2,%eax
10c237: 29 c8 sub %ecx,%eax
10c239: c1 e0 07 shl $0x7,%eax
time += ((the_tod->hour * TOD_MINUTES_PER_HOUR) + the_tod->minute)
10c23c: 8b 5a 14 mov 0x14(%edx),%ebx
10c23f: 8b 4a 0c mov 0xc(%edx),%ecx
10c242: 8d 0c 49 lea (%ecx,%ecx,2),%ecx
10c245: 8d 0c 89 lea (%ecx,%ecx,4),%ecx
10c248: c1 e1 02 shl $0x2,%ecx
10c24b: 03 4a 10 add 0x10(%edx),%ecx
* TOD_SECONDS_PER_MINUTE;
10c24e: 8d 14 49 lea (%ecx,%ecx,2),%edx
10c251: 8d 14 92 lea (%edx,%edx,4),%edx
time += the_tod->second;
10c254: 8d 94 93 00 e5 da 21 lea 0x21dae500(%ebx,%edx,4),%edx
time += TOD_SECONDS_1970_THROUGH_1988;
10c25b: 8d 04 02 lea (%edx,%eax,1),%eax
return( time );
}
10c25e: 5b pop %ebx
10c25f: 5e pop %esi
10c260: c9 leave
10c261: c3 ret
10c262: 66 90 xchg %ax,%ax
time = the_tod->day - 1;
year_mod_4 = the_tod->year & 3;
if ( year_mod_4 == 0 )
time += _TOD_Days_to_date[ 1 ][ the_tod->month ];
10c264: 8b 4a 04 mov 0x4(%edx),%ecx
10c267: 0f b7 8c 09 ba 43 12 movzwl 0x1243ba(%ecx,%ecx,1),%ecx
10c26e: 00
10c26f: 8d 34 31 lea (%ecx,%esi,1),%esi
10c272: eb 97 jmp 10c20b <_TOD_To_seconds+0x23>
0010c274 <_TOD_Validate>:
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
10c274: 55 push %ebp
10c275: 89 e5 mov %esp,%ebp
10c277: 53 push %ebx
10c278: 8b 4d 08 mov 0x8(%ebp),%ecx
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
10c27b: 8b 1d cc 72 12 00 mov 0x1272cc,%ebx
if ((!the_tod) ||
10c281: 85 c9 test %ecx,%ecx
10c283: 74 53 je 10c2d8 <_TOD_Validate+0x64> <== NEVER TAKEN
)
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
10c285: b8 40 42 0f 00 mov $0xf4240,%eax
10c28a: 31 d2 xor %edx,%edx
10c28c: f7 f3 div %ebx
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
10c28e: 3b 41 18 cmp 0x18(%ecx),%eax
10c291: 76 45 jbe 10c2d8 <_TOD_Validate+0x64>
(the_tod->ticks >= ticks_per_second) ||
10c293: 83 79 14 3b cmpl $0x3b,0x14(%ecx)
10c297: 77 3f ja 10c2d8 <_TOD_Validate+0x64>
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
10c299: 83 79 10 3b cmpl $0x3b,0x10(%ecx)
10c29d: 77 39 ja 10c2d8 <_TOD_Validate+0x64>
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
10c29f: 83 79 0c 17 cmpl $0x17,0xc(%ecx)
10c2a3: 77 33 ja 10c2d8 <_TOD_Validate+0x64>
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
10c2a5: 8b 41 04 mov 0x4(%ecx),%eax
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
(the_tod->ticks >= ticks_per_second) ||
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
10c2a8: 85 c0 test %eax,%eax
10c2aa: 74 2c je 10c2d8 <_TOD_Validate+0x64> <== NEVER TAKEN
(the_tod->month == 0) ||
10c2ac: 83 f8 0c cmp $0xc,%eax
10c2af: 77 27 ja 10c2d8 <_TOD_Validate+0x64>
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
10c2b1: 8b 11 mov (%ecx),%edx
(the_tod->ticks >= ticks_per_second) ||
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
10c2b3: 81 fa c3 07 00 00 cmp $0x7c3,%edx
10c2b9: 76 1d jbe 10c2d8 <_TOD_Validate+0x64>
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
10c2bb: 8b 49 08 mov 0x8(%ecx),%ecx
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
10c2be: 85 c9 test %ecx,%ecx
10c2c0: 74 16 je 10c2d8 <_TOD_Validate+0x64> <== NEVER TAKEN
(the_tod->day == 0) )
return false;
if ( (the_tod->year % 4) == 0 )
10c2c2: 83 e2 03 and $0x3,%edx
10c2c5: 75 16 jne 10c2dd <_TOD_Validate+0x69>
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
10c2c7: 8b 04 85 14 44 12 00 mov 0x124414(,%eax,4),%eax
* false - if the the_tod is invalid
*
* NOTE: This routine only works for leap-years through 2099.
*/
bool _TOD_Validate(
10c2ce: 39 c8 cmp %ecx,%eax
10c2d0: 0f 93 c0 setae %al
10c2d3: eb 05 jmp 10c2da <_TOD_Validate+0x66>
10c2d5: 8d 76 00 lea 0x0(%esi),%esi
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
return false;
10c2d8: 31 c0 xor %eax,%eax
if ( the_tod->day > days_in_month )
return false;
return true;
}
10c2da: 5b pop %ebx
10c2db: c9 leave
10c2dc: c3 ret
return false;
if ( (the_tod->year % 4) == 0 )
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
10c2dd: 8b 04 85 e0 43 12 00 mov 0x1243e0(,%eax,4),%eax
10c2e4: eb e8 jmp 10c2ce <_TOD_Validate+0x5a>
0010d440 <_Thread_Change_priority>:
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
10d440: 55 push %ebp
10d441: 89 e5 mov %esp,%ebp
10d443: 57 push %edi
10d444: 56 push %esi
10d445: 53 push %ebx
10d446: 83 ec 28 sub $0x28,%esp
10d449: 8b 5d 08 mov 0x8(%ebp),%ebx
10d44c: 8b 75 0c mov 0xc(%ebp),%esi
10d44f: 8a 45 10 mov 0x10(%ebp),%al
10d452: 88 45 e7 mov %al,-0x19(%ebp)
*/
/*
* Save original state
*/
original_state = the_thread->current_state;
10d455: 8b 7b 10 mov 0x10(%ebx),%edi
/*
* Set a transient state for the thread so it is pulled off the Ready chains.
* This will prevent it from being scheduled no matter what happens in an
* ISR.
*/
_Thread_Set_transient( the_thread );
10d458: 53 push %ebx
10d459: e8 3a 0d 00 00 call 10e198 <_Thread_Set_transient>
/*
* Do not bother recomputing all the priority related information if
* we are not REALLY changing priority.
*/
if ( the_thread->current_priority != new_priority )
10d45e: 83 c4 10 add $0x10,%esp
10d461: 39 73 14 cmp %esi,0x14(%ebx)
10d464: 74 0d je 10d473 <_Thread_Change_priority+0x33>
_Thread_Set_priority( the_thread, new_priority );
10d466: 83 ec 08 sub $0x8,%esp
10d469: 56 push %esi
10d46a: 53 push %ebx
10d46b: e8 c4 0c 00 00 call 10e134 <_Thread_Set_priority>
10d470: 83 c4 10 add $0x10,%esp
_ISR_Disable( level );
10d473: 9c pushf
10d474: fa cli
10d475: 5e pop %esi
/*
* If the thread has more than STATES_TRANSIENT set, then it is blocked,
* If it is blocked on a thread queue, then we need to requeue it.
*/
state = the_thread->current_state;
10d476: 8b 43 10 mov 0x10(%ebx),%eax
if ( state != STATES_TRANSIENT ) {
10d479: 83 f8 04 cmp $0x4,%eax
10d47c: 74 26 je 10d4a4 <_Thread_Change_priority+0x64>
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
10d47e: 83 e7 04 and $0x4,%edi
10d481: 74 15 je 10d498 <_Thread_Change_priority+0x58><== ALWAYS TAKEN
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
10d483: 56 push %esi
10d484: 9d popf
if ( _States_Is_waiting_on_thread_queue( state ) ) {
10d485: a9 e0 be 03 00 test $0x3bee0,%eax
10d48a: 0f 85 94 00 00 00 jne 10d524 <_Thread_Change_priority+0xe4>
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
_ISR_Enable( level );
}
10d490: 8d 65 f4 lea -0xc(%ebp),%esp
10d493: 5b pop %ebx
10d494: 5e pop %esi
10d495: 5f pop %edi
10d496: c9 leave
10d497: c3 ret
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
10d498: 89 c2 mov %eax,%edx
10d49a: 83 e2 fb and $0xfffffffb,%edx
10d49d: 89 53 10 mov %edx,0x10(%ebx)
10d4a0: eb e1 jmp 10d483 <_Thread_Change_priority+0x43>
10d4a2: 66 90 xchg %ax,%ax
}
return;
}
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) ) {
10d4a4: 83 e7 04 and $0x4,%edi
10d4a7: 75 40 jne 10d4e9 <_Thread_Change_priority+0xa9><== NEVER TAKEN
* Ready Queue with interrupts off.
*
* FIXME: hard-coded for priority scheduling. Might be ok since this
* function is specific to priority scheduling?
*/
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
10d4a9: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx)
if ( prepend_it )
10d4b0: 80 7d e7 00 cmpb $0x0,-0x19(%ebp)
10d4b4: 0f 84 82 00 00 00 je 10d53c <_Thread_Change_priority+0xfc>
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_enqueue_first(
Thread_Control *the_thread
)
{
_Priority_bit_map_Add( &the_thread->scheduler.priority->Priority_map );
10d4ba: 8b 83 8c 00 00 00 mov 0x8c(%ebx),%eax
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Add (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor |= the_priority_map->ready_minor;
10d4c0: 8b 50 04 mov 0x4(%eax),%edx
10d4c3: 66 8b 48 0a mov 0xa(%eax),%cx
10d4c7: 66 09 0a or %cx,(%edx)
_Priority_Major_bit_map |= the_priority_map->ready_major;
10d4ca: 66 8b 15 40 84 12 00 mov 0x128440,%dx
10d4d1: 0b 50 08 or 0x8(%eax),%edx
10d4d4: 66 89 15 40 84 12 00 mov %dx,0x128440
_Chain_Prepend_unprotected( the_thread->scheduler.priority->ready_chain,
10d4db: 8b 00 mov (%eax),%eax
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
10d4dd: 89 43 04 mov %eax,0x4(%ebx)
before_node = after_node->next;
10d4e0: 8b 10 mov (%eax),%edx
after_node->next = the_node;
10d4e2: 89 18 mov %ebx,(%eax)
the_node->next = before_node;
10d4e4: 89 13 mov %edx,(%ebx)
before_node->previous = the_node;
10d4e6: 89 5a 04 mov %ebx,0x4(%edx)
_Scheduler_priority_Ready_queue_enqueue_first( the_thread );
else
_Scheduler_priority_Ready_queue_enqueue( the_thread );
}
_ISR_Flash( level );
10d4e9: 56 push %esi
10d4ea: 9d popf
10d4eb: fa cli
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Schedule(
Scheduler_Control *the_scheduler
)
{
the_scheduler->Operations.schedule( the_scheduler );
10d4ec: 83 ec 0c sub $0xc,%esp
10d4ef: 68 e0 7e 12 00 push $0x127ee0
10d4f4: ff 15 e4 7e 12 00 call *0x127ee4
* is also the heir thread, and false otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void )
{
return ( _Thread_Executing == _Thread_Heir );
10d4fa: a1 18 84 12 00 mov 0x128418,%eax
* We altered the set of thread priorities. So let's figure out
* who is the heir and if we need to switch to them.
*/
_Scheduler_Schedule(&_Scheduler);
if ( !_Thread_Is_executing_also_the_heir() &&
10d4ff: 83 c4 10 add $0x10,%esp
10d502: 3b 05 1c 84 12 00 cmp 0x12841c,%eax
10d508: 74 0d je 10d517 <_Thread_Change_priority+0xd7>
10d50a: 80 78 74 00 cmpb $0x0,0x74(%eax)
10d50e: 74 07 je 10d517 <_Thread_Change_priority+0xd7>
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
10d510: c6 05 24 84 12 00 01 movb $0x1,0x128424
_ISR_Enable( level );
10d517: 56 push %esi
10d518: 9d popf
}
10d519: 8d 65 f4 lea -0xc(%ebp),%esp
10d51c: 5b pop %ebx
10d51d: 5e pop %esi
10d51e: 5f pop %edi
10d51f: c9 leave
10d520: c3 ret
10d521: 8d 76 00 lea 0x0(%esi),%esi
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
if ( _States_Is_waiting_on_thread_queue( state ) ) {
_Thread_queue_Requeue( the_thread->Wait.queue, the_thread );
10d524: 89 5d 0c mov %ebx,0xc(%ebp)
10d527: 8b 43 44 mov 0x44(%ebx),%eax
10d52a: 89 45 08 mov %eax,0x8(%ebp)
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
_ISR_Enable( level );
}
10d52d: 8d 65 f4 lea -0xc(%ebp),%esp
10d530: 5b pop %ebx
10d531: 5e pop %esi
10d532: 5f pop %edi
10d533: c9 leave
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
if ( _States_Is_waiting_on_thread_queue( state ) ) {
_Thread_queue_Requeue( the_thread->Wait.queue, the_thread );
10d534: e9 63 0b 00 00 jmp 10e09c <_Thread_queue_Requeue>
10d539: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_enqueue(
Thread_Control *the_thread
)
{
_Priority_bit_map_Add( &the_thread->scheduler.priority->Priority_map );
10d53c: 8b 83 8c 00 00 00 mov 0x8c(%ebx),%eax
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Add (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor |= the_priority_map->ready_minor;
10d542: 8b 50 04 mov 0x4(%eax),%edx
10d545: 66 8b 48 0a mov 0xa(%eax),%cx
10d549: 66 09 0a or %cx,(%edx)
_Priority_Major_bit_map |= the_priority_map->ready_major;
10d54c: 66 8b 15 40 84 12 00 mov 0x128440,%dx
10d553: 0b 50 08 or 0x8(%eax),%edx
10d556: 66 89 15 40 84 12 00 mov %dx,0x128440
_Chain_Append_unprotected( the_thread->scheduler.priority->ready_chain,
10d55d: 8b 00 mov (%eax),%eax
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
10d55f: 8b 50 08 mov 0x8(%eax),%edx
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
10d562: 8d 48 04 lea 0x4(%eax),%ecx
10d565: 89 0b mov %ecx,(%ebx)
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
10d567: 89 58 08 mov %ebx,0x8(%eax)
old_last->next = the_node;
10d56a: 89 1a mov %ebx,(%edx)
the_node->previous = old_last;
10d56c: 89 53 04 mov %edx,0x4(%ebx)
10d56f: e9 75 ff ff ff jmp 10d4e9 <_Thread_Change_priority+0xa9>
0010d574 <_Thread_Clear_state>:
void _Thread_Clear_state(
Thread_Control *the_thread,
States_Control state
)
{
10d574: 55 push %ebp
10d575: 89 e5 mov %esp,%ebp
10d577: 53 push %ebx
10d578: 83 ec 04 sub $0x4,%esp
10d57b: 8b 55 08 mov 0x8(%ebp),%edx
10d57e: 8b 45 0c mov 0xc(%ebp),%eax
ISR_Level level;
States_Control current_state;
_ISR_Disable( level );
10d581: 9c pushf
10d582: fa cli
10d583: 5b pop %ebx
current_state = the_thread->current_state;
10d584: 8b 4a 10 mov 0x10(%edx),%ecx
if ( current_state & state ) {
10d587: 85 c8 test %ecx,%eax
10d589: 74 0b je 10d596 <_Thread_Clear_state+0x22>
10d58b: f7 d0 not %eax
10d58d: 21 c8 and %ecx,%eax
current_state =
the_thread->current_state = _States_Clear( state, current_state );
10d58f: 89 42 10 mov %eax,0x10(%edx)
if ( _States_Is_ready( current_state ) ) {
10d592: 85 c0 test %eax,%eax
10d594: 74 0a je 10d5a0 <_Thread_Clear_state+0x2c>
_Scheduler_Unblock( &_Scheduler, the_thread);
}
}
_ISR_Enable( level );
10d596: 53 push %ebx
10d597: 9d popf
}
10d598: 8b 5d fc mov -0x4(%ebp),%ebx
10d59b: c9 leave
10d59c: c3 ret
10d59d: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _Scheduler_Unblock(
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
the_scheduler->Operations.unblock( the_scheduler, the_thread );
10d5a0: 83 ec 08 sub $0x8,%esp
10d5a3: 52 push %edx
10d5a4: 68 e0 7e 12 00 push $0x127ee0
10d5a9: ff 15 f0 7e 12 00 call *0x127ef0
10d5af: 83 c4 10 add $0x10,%esp
10d5b2: eb e2 jmp 10d596 <_Thread_Clear_state+0x22>
0010d740 <_Thread_Delay_ended>:
void _Thread_Delay_ended(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
10d740: 55 push %ebp
10d741: 89 e5 mov %esp,%ebp
10d743: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10d746: 8d 45 f4 lea -0xc(%ebp),%eax
10d749: 50 push %eax
10d74a: ff 75 08 pushl 0x8(%ebp)
10d74d: e8 c6 01 00 00 call 10d918 <_Thread_Get>
switch ( location ) {
10d752: 83 c4 10 add $0x10,%esp
10d755: 8b 55 f4 mov -0xc(%ebp),%edx
10d758: 85 d2 test %edx,%edx
10d75a: 75 1c jne 10d778 <_Thread_Delay_ended+0x38><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_Clear_state(
10d75c: 83 ec 08 sub $0x8,%esp
10d75f: 68 18 00 00 10 push $0x10000018
10d764: 50 push %eax
10d765: e8 0a fe ff ff call 10d574 <_Thread_Clear_state>
10d76a: a1 30 7e 12 00 mov 0x127e30,%eax
10d76f: 48 dec %eax
10d770: a3 30 7e 12 00 mov %eax,0x127e30
10d775: 83 c4 10 add $0x10,%esp
| STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Thread_Unnest_dispatch();
break;
}
}
10d778: c9 leave
10d779: c3 ret
0010d77c <_Thread_Dispatch>:
* dispatch thread
* no dispatch thread
*/
void _Thread_Dispatch( void )
{
10d77c: 55 push %ebp
10d77d: 89 e5 mov %esp,%ebp
10d77f: 57 push %edi
10d780: 56 push %esi
10d781: 53 push %ebx
10d782: 83 ec 1c sub $0x1c,%esp
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
10d785: 8b 1d 18 84 12 00 mov 0x128418,%ebx
_ISR_Disable( level );
10d78b: 9c pushf
10d78c: fa cli
10d78d: 58 pop %eax
while ( _Thread_Dispatch_necessary == true ) {
10d78e: 8a 15 24 84 12 00 mov 0x128424,%dl
10d794: 84 d2 test %dl,%dl
10d796: 0f 84 3c 01 00 00 je 10d8d8 <_Thread_Dispatch+0x15c>
heir = _Thread_Heir;
10d79c: 8b 35 1c 84 12 00 mov 0x12841c,%esi
_Thread_Dispatch_disable_level = 1;
10d7a2: c7 05 30 7e 12 00 01 movl $0x1,0x127e30
10d7a9: 00 00 00
_Thread_Dispatch_necessary = false;
10d7ac: c6 05 24 84 12 00 00 movb $0x0,0x128424
_Thread_Executing = heir;
10d7b3: 89 35 18 84 12 00 mov %esi,0x128418
/*
* When the heir and executing are the same, then we are being
* requested to do the post switch dispatching. This is normally
* done to dispatch signals.
*/
if ( heir == executing )
10d7b9: 39 f3 cmp %esi,%ebx
10d7bb: 0f 84 17 01 00 00 je 10d8d8 <_Thread_Dispatch+0x15c>
10d7c1: 8d 7d d8 lea -0x28(%ebp),%edi
10d7c4: e9 f5 00 00 00 jmp 10d8be <_Thread_Dispatch+0x142>
10d7c9: 8d 76 00 lea 0x0(%esi),%esi
rtems_ada_self = heir->rtems_ada_self;
#endif
if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
_ISR_Enable( level );
10d7cc: 50 push %eax
10d7cd: 9d popf
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
10d7ce: 83 ec 0c sub $0xc,%esp
10d7d1: 8d 45 e0 lea -0x20(%ebp),%eax
10d7d4: 50 push %eax
10d7d5: e8 b6 3a 00 00 call 111290 <_TOD_Get_uptime>
_Timestamp_Subtract(
10d7da: 83 c4 0c add $0xc,%esp
10d7dd: 57 push %edi
10d7de: 8d 45 e0 lea -0x20(%ebp),%eax
10d7e1: 50 push %eax
10d7e2: 68 28 7f 12 00 push $0x127f28
10d7e7: e8 2c 0c 00 00 call 10e418 <_Timespec_Subtract>
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
10d7ec: 58 pop %eax
10d7ed: 5a pop %edx
10d7ee: 57 push %edi
10d7ef: 8d 83 84 00 00 00 lea 0x84(%ebx),%eax
10d7f5: 50 push %eax
10d7f6: e8 e1 0b 00 00 call 10e3dc <_Timespec_Add_to>
_Thread_Time_of_last_context_switch = uptime;
10d7fb: 8b 45 e0 mov -0x20(%ebp),%eax
10d7fe: 8b 55 e4 mov -0x1c(%ebp),%edx
10d801: a3 28 7f 12 00 mov %eax,0x127f28
10d806: 89 15 2c 7f 12 00 mov %edx,0x127f2c
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
10d80c: a1 00 7f 12 00 mov 0x127f00,%eax
10d811: 83 c4 10 add $0x10,%esp
10d814: 85 c0 test %eax,%eax
10d816: 74 10 je 10d828 <_Thread_Dispatch+0xac> <== NEVER TAKEN
executing->libc_reent = *_Thread_libc_reent;
10d818: 8b 10 mov (%eax),%edx
10d81a: 89 93 e4 00 00 00 mov %edx,0xe4(%ebx)
*_Thread_libc_reent = heir->libc_reent;
10d820: 8b 96 e4 00 00 00 mov 0xe4(%esi),%edx
10d826: 89 10 mov %edx,(%eax)
}
_User_extensions_Thread_switch( executing, heir );
10d828: 83 ec 08 sub $0x8,%esp
10d82b: 56 push %esi
10d82c: 53 push %ebx
10d82d: e8 86 0e 00 00 call 10e6b8 <_User_extensions_Thread_switch>
if ( executing->fp_context != NULL )
_Context_Save_fp( &executing->fp_context );
#endif
#endif
_Context_Switch( &executing->Registers, &heir->Registers );
10d832: 5a pop %edx
10d833: 59 pop %ecx
10d834: 81 c6 c8 00 00 00 add $0xc8,%esi
10d83a: 56 push %esi
10d83b: 8d 83 c8 00 00 00 lea 0xc8(%ebx),%eax
10d841: 50 push %eax
10d842: e8 79 11 00 00 call 10e9c0 <_CPU_Context_switch>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
10d847: 83 c4 10 add $0x10,%esp
10d84a: 8b 83 e0 00 00 00 mov 0xe0(%ebx),%eax
10d850: 85 c0 test %eax,%eax
10d852: 74 36 je 10d88a <_Thread_Dispatch+0x10e>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
RTEMS_INLINE_ROUTINE bool _Thread_Is_allocated_fp (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Allocated_fp );
10d854: a1 c0 7e 12 00 mov 0x127ec0,%eax
10d859: 39 c3 cmp %eax,%ebx
10d85b: 74 2d je 10d88a <_Thread_Dispatch+0x10e>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
10d85d: 85 c0 test %eax,%eax
10d85f: 74 11 je 10d872 <_Thread_Dispatch+0xf6>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
10d861: 83 ec 0c sub $0xc,%esp
10d864: 05 e0 00 00 00 add $0xe0,%eax
10d869: 50 push %eax
10d86a: e8 85 11 00 00 call 10e9f4 <_CPU_Context_save_fp>
10d86f: 83 c4 10 add $0x10,%esp
_Context_Restore_fp( &executing->fp_context );
10d872: 83 ec 0c sub $0xc,%esp
10d875: 8d 83 e0 00 00 00 lea 0xe0(%ebx),%eax
10d87b: 50 push %eax
10d87c: e8 7d 11 00 00 call 10e9fe <_CPU_Context_restore_fp>
_Thread_Allocated_fp = executing;
10d881: 89 1d c0 7e 12 00 mov %ebx,0x127ec0
10d887: 83 c4 10 add $0x10,%esp
if ( executing->fp_context != NULL )
_Context_Restore_fp( &executing->fp_context );
#endif
#endif
executing = _Thread_Executing;
10d88a: 8b 1d 18 84 12 00 mov 0x128418,%ebx
_ISR_Disable( level );
10d890: 9c pushf
10d891: fa cli
10d892: 58 pop %eax
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
10d893: 8a 15 24 84 12 00 mov 0x128424,%dl
10d899: 84 d2 test %dl,%dl
10d89b: 74 3b je 10d8d8 <_Thread_Dispatch+0x15c>
heir = _Thread_Heir;
10d89d: 8b 35 1c 84 12 00 mov 0x12841c,%esi
_Thread_Dispatch_disable_level = 1;
10d8a3: c7 05 30 7e 12 00 01 movl $0x1,0x127e30
10d8aa: 00 00 00
_Thread_Dispatch_necessary = false;
10d8ad: c6 05 24 84 12 00 00 movb $0x0,0x128424
_Thread_Executing = heir;
10d8b4: 89 35 18 84 12 00 mov %esi,0x128418
/*
* When the heir and executing are the same, then we are being
* requested to do the post switch dispatching. This is normally
* done to dispatch signals.
*/
if ( heir == executing )
10d8ba: 39 de cmp %ebx,%esi
10d8bc: 74 1a je 10d8d8 <_Thread_Dispatch+0x15c><== NEVER TAKEN
*/
#if __RTEMS_ADA__
executing->rtems_ada_self = rtems_ada_self;
rtems_ada_self = heir->rtems_ada_self;
#endif
if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
10d8be: 83 7e 7c 01 cmpl $0x1,0x7c(%esi)
10d8c2: 0f 85 04 ff ff ff jne 10d7cc <_Thread_Dispatch+0x50>
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
10d8c8: 8b 15 00 7e 12 00 mov 0x127e00,%edx
10d8ce: 89 56 78 mov %edx,0x78(%esi)
10d8d1: e9 f6 fe ff ff jmp 10d7cc <_Thread_Dispatch+0x50>
10d8d6: 66 90 xchg %ax,%ax
_ISR_Disable( level );
}
post_switch:
_Thread_Dispatch_disable_level = 0;
10d8d8: c7 05 30 7e 12 00 00 movl $0x0,0x127e30
10d8df: 00 00 00
_ISR_Enable( level );
10d8e2: 50 push %eax
10d8e3: 9d popf
_API_extensions_Run_postswitch();
10d8e4: e8 eb e5 ff ff call 10bed4 <_API_extensions_Run_postswitch>
}
10d8e9: 8d 65 f4 lea -0xc(%ebp),%esp
10d8ec: 5b pop %ebx
10d8ed: 5e pop %esi
10d8ee: 5f pop %edi
10d8ef: c9 leave
10d8f0: c3 ret
0010d918 <_Thread_Get>:
*/
Thread_Control *_Thread_Get (
Objects_Id id,
Objects_Locations *location
)
{
10d918: 55 push %ebp
10d919: 89 e5 mov %esp,%ebp
10d91b: 53 push %ebx
10d91c: 83 ec 04 sub $0x4,%esp
10d91f: 8b 45 08 mov 0x8(%ebp),%eax
10d922: 8b 4d 0c mov 0xc(%ebp),%ecx
uint32_t the_class;
Objects_Information **api_information;
Objects_Information *information;
Thread_Control *tp = (Thread_Control *) 0;
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {
10d925: 85 c0 test %eax,%eax
10d927: 74 47 je 10d970 <_Thread_Get+0x58>
*/
RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API(
Objects_Id id
)
{
return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS);
10d929: 89 c2 mov %eax,%edx
10d92b: c1 ea 18 shr $0x18,%edx
10d92e: 83 e2 07 and $0x7,%edx
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
10d931: 8d 5a ff lea -0x1(%edx),%ebx
10d934: 83 fb 02 cmp $0x2,%ebx
10d937: 77 27 ja 10d960 <_Thread_Get+0x48>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
10d939: 89 c3 mov %eax,%ebx
10d93b: c1 eb 1b shr $0x1b,%ebx
*location = OBJECTS_ERROR;
goto done;
}
the_class = _Objects_Get_class( id );
if ( the_class != 1 ) { /* threads are always first class :) */
10d93e: 4b dec %ebx
10d93f: 75 1f jne 10d960 <_Thread_Get+0x48>
*location = OBJECTS_ERROR;
goto done;
}
#endif
information = api_information[ the_class ];
10d941: 8b 14 95 08 7e 12 00 mov 0x127e08(,%edx,4),%edx
10d948: 8b 52 04 mov 0x4(%edx),%edx
if ( !information ) {
10d94b: 85 d2 test %edx,%edx
10d94d: 74 11 je 10d960 <_Thread_Get+0x48>
*location = OBJECTS_ERROR;
goto done;
}
tp = (Thread_Control *) _Objects_Get( information, id, location );
10d94f: 53 push %ebx
10d950: 51 push %ecx
10d951: 50 push %eax
10d952: 52 push %edx
10d953: e8 e8 f4 ff ff call 10ce40 <_Objects_Get>
10d958: 83 c4 10 add $0x10,%esp
done:
return tp;
}
10d95b: 8b 5d fc mov -0x4(%ebp),%ebx
10d95e: c9 leave
10d95f: c3 ret
}
#endif
information = api_information[ the_class ];
if ( !information ) {
*location = OBJECTS_ERROR;
10d960: c7 01 01 00 00 00 movl $0x1,(%ecx)
{
uint32_t the_api;
uint32_t the_class;
Objects_Information **api_information;
Objects_Information *information;
Thread_Control *tp = (Thread_Control *) 0;
10d966: 31 c0 xor %eax,%eax
tp = (Thread_Control *) _Objects_Get( information, id, location );
done:
return tp;
}
10d968: 8b 5d fc mov -0x4(%ebp),%ebx
10d96b: c9 leave
10d96c: c3 ret
10d96d: 8d 76 00 lea 0x0(%esi),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10d970: a1 30 7e 12 00 mov 0x127e30,%eax
10d975: 40 inc %eax
10d976: a3 30 7e 12 00 mov %eax,0x127e30
Objects_Information *information;
Thread_Control *tp = (Thread_Control *) 0;
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {
_Thread_Disable_dispatch();
*location = OBJECTS_LOCAL;
10d97b: c7 01 00 00 00 00 movl $0x0,(%ecx)
tp = _Thread_Executing;
10d981: a1 18 84 12 00 mov 0x128418,%eax
tp = (Thread_Control *) _Objects_Get( information, id, location );
done:
return tp;
}
10d986: 8b 5d fc mov -0x4(%ebp),%ebx
10d989: c9 leave
10d98a: c3 ret
0011314c <_Thread_Handler>:
*
* Output parameters: NONE
*/
void _Thread_Handler( void )
{
11314c: 55 push %ebp
11314d: 89 e5 mov %esp,%ebp
11314f: 53 push %ebx
113150: 83 ec 14 sub $0x14,%esp
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
static char doneConstructors;
char doneCons;
#endif
executing = _Thread_Executing;
113153: 8b 1d 18 84 12 00 mov 0x128418,%ebx
/*
* have to put level into a register for those cpu's that use
* inline asm here
*/
level = executing->Start.isr_level;
113159: 8b 83 ac 00 00 00 mov 0xac(%ebx),%eax
_ISR_Set_level(level);
11315f: 85 c0 test %eax,%eax
113161: 74 79 je 1131dc <_Thread_Handler+0x90>
113163: fa cli
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
doneCons = doneConstructors;
113164: a0 ac 7a 12 00 mov 0x127aac,%al
113169: 88 45 f7 mov %al,-0x9(%ebp)
doneConstructors = 1;
11316c: c6 05 ac 7a 12 00 01 movb $0x1,0x127aac
#endif
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
113173: 8b 83 e0 00 00 00 mov 0xe0(%ebx),%eax
113179: 85 c0 test %eax,%eax
11317b: 74 24 je 1131a1 <_Thread_Handler+0x55>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
RTEMS_INLINE_ROUTINE bool _Thread_Is_allocated_fp (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Allocated_fp );
11317d: a1 c0 7e 12 00 mov 0x127ec0,%eax
113182: 39 c3 cmp %eax,%ebx
113184: 74 1b je 1131a1 <_Thread_Handler+0x55>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
113186: 85 c0 test %eax,%eax
113188: 74 11 je 11319b <_Thread_Handler+0x4f>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
11318a: 83 ec 0c sub $0xc,%esp
11318d: 05 e0 00 00 00 add $0xe0,%eax
113192: 50 push %eax
113193: e8 5c b8 ff ff call 10e9f4 <_CPU_Context_save_fp>
113198: 83 c4 10 add $0x10,%esp
_Thread_Allocated_fp = executing;
11319b: 89 1d c0 7e 12 00 mov %ebx,0x127ec0
/*
* Take care that 'begin' extensions get to complete before
* 'switch' extensions can run. This means must keep dispatch
* disabled until all 'begin' extensions complete.
*/
_User_extensions_Thread_begin( executing );
1131a1: 83 ec 0c sub $0xc,%esp
1131a4: 53 push %ebx
1131a5: e8 72 b3 ff ff call 10e51c <_User_extensions_Thread_begin>
/*
* At this point, the dispatch disable level BETTER be 1.
*/
_Thread_Enable_dispatch();
1131aa: e8 45 a7 ff ff call 10d8f4 <_Thread_Enable_dispatch>
/*
* _init could be a weak symbol and we SHOULD test it but it isn't
* in any configuration I know of and it generates a warning on every
* RTEMS target configuration. --joel (12 May 2007)
*/
if (!doneCons) /* && (volatile void *)_init) */ {
1131af: 83 c4 10 add $0x10,%esp
1131b2: 80 7d f7 00 cmpb $0x0,-0x9(%ebp)
1131b6: 74 28 je 1131e0 <_Thread_Handler+0x94>
INIT_NAME ();
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
1131b8: 8b 83 94 00 00 00 mov 0x94(%ebx),%eax
1131be: 85 c0 test %eax,%eax
1131c0: 74 2d je 1131ef <_Thread_Handler+0xa3>
(*(Thread_Entry_numeric) executing->Start.entry_point)(
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
1131c2: 48 dec %eax
1131c3: 74 43 je 113208 <_Thread_Handler+0xbc> <== ALWAYS TAKEN
* was placed in return_argument. This assumed that if it returned
* anything (which is not supporting in all APIs), then it would be
* able to fit in a (void *).
*/
_User_extensions_Thread_exitted( executing );
1131c5: 83 ec 0c sub $0xc,%esp
1131c8: 53 push %ebx
1131c9: e8 8a b3 ff ff call 10e558 <_User_extensions_Thread_exitted>
_Internal_error_Occurred(
1131ce: 83 c4 0c add $0xc,%esp
1131d1: 6a 05 push $0x5
1131d3: 6a 01 push $0x1
1131d5: 6a 00 push $0x0
1131d7: e8 1c 97 ff ff call 10c8f8 <_Internal_error_Occurred>
* have to put level into a register for those cpu's that use
* inline asm here
*/
level = executing->Start.isr_level;
_ISR_Set_level(level);
1131dc: fb sti
1131dd: eb 85 jmp 113164 <_Thread_Handler+0x18>
1131df: 90 nop
* _init could be a weak symbol and we SHOULD test it but it isn't
* in any configuration I know of and it generates a warning on every
* RTEMS target configuration. --joel (12 May 2007)
*/
if (!doneCons) /* && (volatile void *)_init) */ {
INIT_NAME ();
1131e0: e8 4b c7 00 00 call 11f930 <__start_set_sysctl_set>
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
1131e5: 8b 83 94 00 00 00 mov 0x94(%ebx),%eax
1131eb: 85 c0 test %eax,%eax
1131ed: 75 d3 jne 1131c2 <_Thread_Handler+0x76>
executing->Wait.return_argument =
(*(Thread_Entry_numeric) executing->Start.entry_point)(
1131ef: 83 ec 0c sub $0xc,%esp
1131f2: ff b3 9c 00 00 00 pushl 0x9c(%ebx)
1131f8: ff 93 90 00 00 00 call *0x90(%ebx)
INIT_NAME ();
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
executing->Wait.return_argument =
1131fe: 89 43 28 mov %eax,0x28(%ebx)
113201: 83 c4 10 add $0x10,%esp
113204: eb bf jmp 1131c5 <_Thread_Handler+0x79>
113206: 66 90 xchg %ax,%ax
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
executing->Wait.return_argument =
(*(Thread_Entry_pointer) executing->Start.entry_point)(
113208: 83 ec 0c sub $0xc,%esp
11320b: ff b3 98 00 00 00 pushl 0x98(%ebx)
113211: ff 93 90 00 00 00 call *0x90(%ebx)
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
executing->Wait.return_argument =
113217: 89 43 28 mov %eax,0x28(%ebx)
11321a: 83 c4 10 add $0x10,%esp
11321d: eb a6 jmp 1131c5 <_Thread_Handler+0x79>
0010d98c <_Thread_Initialize>:
Thread_CPU_budget_algorithms budget_algorithm,
Thread_CPU_budget_algorithm_callout budget_callout,
uint32_t isr_level,
Objects_Name name
)
{
10d98c: 55 push %ebp
10d98d: 89 e5 mov %esp,%ebp
10d98f: 57 push %edi
10d990: 56 push %esi
10d991: 53 push %ebx
10d992: 83 ec 1c sub $0x1c,%esp
10d995: 8b 5d 0c mov 0xc(%ebp),%ebx
10d998: 8b 4d 10 mov 0x10(%ebp),%ecx
10d99b: 8b 75 14 mov 0x14(%ebp),%esi
10d99e: 8a 55 18 mov 0x18(%ebp),%dl
10d9a1: 0f b6 7d 20 movzbl 0x20(%ebp),%edi
/*
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
10d9a5: c7 83 e8 00 00 00 00 movl $0x0,0xe8(%ebx)
10d9ac: 00 00 00
10d9af: c7 83 ec 00 00 00 00 movl $0x0,0xec(%ebx)
10d9b6: 00 00 00
extensions_area = NULL;
the_thread->libc_reent = NULL;
10d9b9: c7 83 e4 00 00 00 00 movl $0x0,0xe4(%ebx)
10d9c0: 00 00 00
if ( !actual_stack_size || actual_stack_size < stack_size )
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
#else
if ( !stack_area ) {
10d9c3: 85 c9 test %ecx,%ecx
10d9c5: 0f 84 14 02 00 00 je 10dbdf <_Thread_Initialize+0x253>
stack = the_thread->Start.stack;
the_thread->Start.core_allocated_stack = true;
} else {
stack = stack_area;
actual_stack_size = stack_size;
the_thread->Start.core_allocated_stack = false;
10d9cb: c6 83 b4 00 00 00 00 movb $0x0,0xb4(%ebx)
10d9d2: 89 f0 mov %esi,%eax
Stack_Control *the_stack,
void *starting_address,
size_t size
)
{
the_stack->area = starting_address;
10d9d4: 89 8b bc 00 00 00 mov %ecx,0xbc(%ebx)
the_stack->size = size;
10d9da: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx)
/*
* Allocate the floating point area for this thread
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( is_fp ) {
10d9e0: 84 d2 test %dl,%dl
10d9e2: 0f 85 94 01 00 00 jne 10db7c <_Thread_Initialize+0x1f0>
10d9e8: 31 c0 xor %eax,%eax
extensions_area = NULL;
the_thread->libc_reent = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
fp_area = NULL;
10d9ea: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
if ( !fp_area )
goto failed;
fp_area = _Context_Fp_start( fp_area, 0 );
}
the_thread->fp_context = fp_area;
10d9f1: 89 83 e0 00 00 00 mov %eax,0xe0(%ebx)
the_thread->Start.fp_context = fp_area;
10d9f7: 89 83 c0 00 00 00 mov %eax,0xc0(%ebx)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10d9fd: c7 43 50 00 00 00 00 movl $0x0,0x50(%ebx)
the_watchdog->routine = routine;
10da04: c7 43 64 00 00 00 00 movl $0x0,0x64(%ebx)
the_watchdog->id = id;
10da0b: c7 43 68 00 00 00 00 movl $0x0,0x68(%ebx)
the_watchdog->user_data = user_data;
10da12: c7 43 6c 00 00 00 00 movl $0x0,0x6c(%ebx)
#endif
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
10da19: a1 0c 7f 12 00 mov 0x127f0c,%eax
10da1e: 85 c0 test %eax,%eax
10da20: 0f 85 7a 01 00 00 jne 10dba0 <_Thread_Initialize+0x214>
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
goto failed;
}
the_thread->extensions = (void **) extensions_area;
10da26: c7 83 f0 00 00 00 00 movl $0x0,0xf0(%ebx)
10da2d: 00 00 00
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
10da30: 31 f6 xor %esi,%esi
/*
* General initialization
*/
the_thread->Start.is_preemptible = is_preemptible;
10da32: 89 f8 mov %edi,%eax
10da34: 88 83 a0 00 00 00 mov %al,0xa0(%ebx)
the_thread->Start.budget_algorithm = budget_algorithm;
10da3a: 8b 45 24 mov 0x24(%ebp),%eax
10da3d: 89 83 a4 00 00 00 mov %eax,0xa4(%ebx)
the_thread->Start.budget_callout = budget_callout;
10da43: 8b 45 28 mov 0x28(%ebp),%eax
10da46: 89 83 a8 00 00 00 mov %eax,0xa8(%ebx)
switch ( budget_algorithm ) {
10da4c: 83 7d 24 02 cmpl $0x2,0x24(%ebp)
10da50: 75 08 jne 10da5a <_Thread_Initialize+0xce>
case THREAD_CPU_BUDGET_ALGORITHM_NONE:
case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE:
break;
#if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE)
case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
10da52: a1 00 7e 12 00 mov 0x127e00,%eax
10da57: 89 43 78 mov %eax,0x78(%ebx)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
break;
#endif
}
the_thread->Start.isr_level = isr_level;
10da5a: 8b 45 2c mov 0x2c(%ebp),%eax
10da5d: 89 83 ac 00 00 00 mov %eax,0xac(%ebx)
the_thread->current_state = STATES_DORMANT;
10da63: c7 43 10 01 00 00 00 movl $0x1,0x10(%ebx)
the_thread->Wait.queue = NULL;
10da6a: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx)
the_thread->resource_count = 0;
10da71: c7 43 1c 00 00 00 00 movl $0x0,0x1c(%ebx)
the_thread->real_priority = priority;
10da78: 8b 45 1c mov 0x1c(%ebp),%eax
10da7b: 89 43 18 mov %eax,0x18(%ebx)
the_thread->Start.initial_priority = priority;
10da7e: 89 83 b0 00 00 00 mov %eax,0xb0(%ebx)
RTEMS_INLINE_ROUTINE void* _Scheduler_Thread_scheduler_allocate(
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
return
10da84: 83 ec 08 sub $0x8,%esp
10da87: 53 push %ebx
10da88: 68 e0 7e 12 00 push $0x127ee0
10da8d: ff 15 f4 7e 12 00 call *0x127ef4
10da93: 89 c7 mov %eax,%edi
sched =_Scheduler_Thread_scheduler_allocate( &_Scheduler, the_thread );
if ( !sched )
10da95: 83 c4 10 add $0x10,%esp
10da98: 85 c0 test %eax,%eax
10da9a: 74 46 je 10dae2 <_Thread_Initialize+0x156>
goto failed;
_Thread_Set_priority( the_thread, priority );
10da9c: 83 ec 08 sub $0x8,%esp
10da9f: ff 75 1c pushl 0x1c(%ebp)
10daa2: 53 push %ebx
10daa3: e8 8c 06 00 00 call 10e134 <_Thread_Set_priority>
/*
* Initialize the CPU usage statistics
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Set_to_zero( &the_thread->cpu_time_used );
10daa8: c7 83 84 00 00 00 00 movl $0x0,0x84(%ebx)
10daaf: 00 00 00
10dab2: c7 83 88 00 00 00 00 movl $0x0,0x88(%ebx)
10dab9: 00 00 00
_Thread_Stack_Free( the_thread );
return false;
}
10dabc: 8b 45 08 mov 0x8(%ebp),%eax
10dabf: 8b 40 1c mov 0x1c(%eax),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
10dac2: 0f b7 53 08 movzwl 0x8(%ebx),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10dac6: 89 1c 90 mov %ebx,(%eax,%edx,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
10dac9: 8b 45 30 mov 0x30(%ebp),%eax
10dacc: 89 43 0c mov %eax,0xc(%ebx)
* enabled when we get here. We want to be able to run the
* user extensions with dispatching enabled. The Allocator
* Mutex provides sufficient protection to let the user extensions
* run safely.
*/
extension_status = _User_extensions_Thread_create( the_thread );
10dacf: 89 1c 24 mov %ebx,(%esp)
10dad2: e8 0d 0b 00 00 call 10e5e4 <_User_extensions_Thread_create>
if ( extension_status )
10dad7: 83 c4 10 add $0x10,%esp
10dada: 84 c0 test %al,%al
10dadc: 0f 85 8e 00 00 00 jne 10db70 <_Thread_Initialize+0x1e4>
return true;
failed:
if ( the_thread->libc_reent )
10dae2: 8b 83 e4 00 00 00 mov 0xe4(%ebx),%eax
10dae8: 85 c0 test %eax,%eax
10daea: 74 0c je 10daf8 <_Thread_Initialize+0x16c>
_Workspace_Free( the_thread->libc_reent );
10daec: 83 ec 0c sub $0xc,%esp
10daef: 50 push %eax
10daf0: e8 87 0e 00 00 call 10e97c <_Workspace_Free>
10daf5: 83 c4 10 add $0x10,%esp
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
if ( the_thread->API_Extensions[i] )
10daf8: 8b 83 e8 00 00 00 mov 0xe8(%ebx),%eax
10dafe: 85 c0 test %eax,%eax
10db00: 74 0c je 10db0e <_Thread_Initialize+0x182>
_Workspace_Free( the_thread->API_Extensions[i] );
10db02: 83 ec 0c sub $0xc,%esp
10db05: 50 push %eax
10db06: e8 71 0e 00 00 call 10e97c <_Workspace_Free>
10db0b: 83 c4 10 add $0x10,%esp
failed:
if ( the_thread->libc_reent )
_Workspace_Free( the_thread->libc_reent );
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
if ( the_thread->API_Extensions[i] )
10db0e: 8b 83 ec 00 00 00 mov 0xec(%ebx),%eax
10db14: 85 c0 test %eax,%eax
10db16: 74 0c je 10db24 <_Thread_Initialize+0x198>
_Workspace_Free( the_thread->API_Extensions[i] );
10db18: 83 ec 0c sub $0xc,%esp
10db1b: 50 push %eax
10db1c: e8 5b 0e 00 00 call 10e97c <_Workspace_Free>
10db21: 83 c4 10 add $0x10,%esp
if ( extensions_area )
10db24: 85 f6 test %esi,%esi
10db26: 74 0c je 10db34 <_Thread_Initialize+0x1a8>
(void) _Workspace_Free( extensions_area );
10db28: 83 ec 0c sub $0xc,%esp
10db2b: 56 push %esi
10db2c: e8 4b 0e 00 00 call 10e97c <_Workspace_Free>
10db31: 83 c4 10 add $0x10,%esp
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( fp_area )
10db34: 8b 45 e4 mov -0x1c(%ebp),%eax
10db37: 85 c0 test %eax,%eax
10db39: 74 0e je 10db49 <_Thread_Initialize+0x1bd>
(void) _Workspace_Free( fp_area );
10db3b: 83 ec 0c sub $0xc,%esp
10db3e: ff 75 e4 pushl -0x1c(%ebp)
10db41: e8 36 0e 00 00 call 10e97c <_Workspace_Free>
10db46: 83 c4 10 add $0x10,%esp
#endif
if ( sched )
10db49: 85 ff test %edi,%edi
10db4b: 74 0c je 10db59 <_Thread_Initialize+0x1cd>
(void) _Workspace_Free( sched );
10db4d: 83 ec 0c sub $0xc,%esp
10db50: 57 push %edi
10db51: e8 26 0e 00 00 call 10e97c <_Workspace_Free>
10db56: 83 c4 10 add $0x10,%esp
_Thread_Stack_Free( the_thread );
10db59: 83 ec 0c sub $0xc,%esp
10db5c: 53 push %ebx
10db5d: e8 0a 07 00 00 call 10e26c <_Thread_Stack_Free>
return false;
10db62: 83 c4 10 add $0x10,%esp
10db65: 31 c0 xor %eax,%eax
}
10db67: 8d 65 f4 lea -0xc(%ebp),%esp
10db6a: 5b pop %ebx
10db6b: 5e pop %esi
10db6c: 5f pop %edi
10db6d: c9 leave
10db6e: c3 ret
10db6f: 90 nop
* Mutex provides sufficient protection to let the user extensions
* run safely.
*/
extension_status = _User_extensions_Thread_create( the_thread );
if ( extension_status )
return true;
10db70: b0 01 mov $0x1,%al
_Thread_Stack_Free( the_thread );
return false;
}
10db72: 8d 65 f4 lea -0xc(%ebp),%esp
10db75: 5b pop %ebx
10db76: 5e pop %esi
10db77: 5f pop %edi
10db78: c9 leave
10db79: c3 ret
10db7a: 66 90 xchg %ax,%ax
/*
* Allocate the floating point area for this thread
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( is_fp ) {
fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
10db7c: 83 ec 0c sub $0xc,%esp
10db7f: 6a 6c push $0x6c
10db81: e8 da 0d 00 00 call 10e960 <_Workspace_Allocate>
10db86: 89 45 e4 mov %eax,-0x1c(%ebp)
if ( !fp_area )
10db89: 83 c4 10 add $0x10,%esp
10db8c: 85 c0 test %eax,%eax
10db8e: 0f 85 5d fe ff ff jne 10d9f1 <_Thread_Initialize+0x65>
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
10db94: 31 f6 xor %esi,%esi
size_t actual_stack_size = 0;
void *stack = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
void *fp_area;
#endif
void *sched = NULL;
10db96: 31 ff xor %edi,%edi
10db98: e9 45 ff ff ff jmp 10dae2 <_Thread_Initialize+0x156>
10db9d: 8d 76 00 lea 0x0(%esi),%esi
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
extensions_area = _Workspace_Allocate(
10dba0: 83 ec 0c sub $0xc,%esp
10dba3: 8d 04 85 04 00 00 00 lea 0x4(,%eax,4),%eax
10dbaa: 50 push %eax
10dbab: e8 b0 0d 00 00 call 10e960 <_Workspace_Allocate>
10dbb0: 89 c6 mov %eax,%esi
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
10dbb2: 83 c4 10 add $0x10,%esp
10dbb5: 85 c0 test %eax,%eax
10dbb7: 74 5a je 10dc13 <_Thread_Initialize+0x287>
goto failed;
}
the_thread->extensions = (void **) extensions_area;
10dbb9: 89 83 f0 00 00 00 mov %eax,0xf0(%ebx)
10dbbf: 8b 0d 0c 7f 12 00 mov 0x127f0c,%ecx
* create the extension long after tasks have been created
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
10dbc5: 31 d2 xor %edx,%edx
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
goto failed;
}
the_thread->extensions = (void **) extensions_area;
10dbc7: 31 c0 xor %eax,%eax
10dbc9: 8d 76 00 lea 0x0(%esi),%esi
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
the_thread->extensions[i] = NULL;
10dbcc: c7 04 96 00 00 00 00 movl $0x0,(%esi,%edx,4)
* create the extension long after tasks have been created
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
10dbd3: 40 inc %eax
10dbd4: 89 c2 mov %eax,%edx
10dbd6: 39 c1 cmp %eax,%ecx
10dbd8: 73 f2 jae 10dbcc <_Thread_Initialize+0x240>
10dbda: e9 53 fe ff ff jmp 10da32 <_Thread_Initialize+0xa6>
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
#else
if ( !stack_area ) {
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
10dbdf: 83 ec 08 sub $0x8,%esp
10dbe2: 56 push %esi
10dbe3: 53 push %ebx
10dbe4: 88 55 e0 mov %dl,-0x20(%ebp)
10dbe7: e8 1c 06 00 00 call 10e208 <_Thread_Stack_Allocate>
if ( !actual_stack_size || actual_stack_size < stack_size )
10dbec: 83 c4 10 add $0x10,%esp
10dbef: 85 c0 test %eax,%eax
10dbf1: 8a 55 e0 mov -0x20(%ebp),%dl
10dbf4: 74 16 je 10dc0c <_Thread_Initialize+0x280>
10dbf6: 39 c6 cmp %eax,%esi
10dbf8: 77 12 ja 10dc0c <_Thread_Initialize+0x280><== NEVER TAKEN
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
10dbfa: 8b 8b c4 00 00 00 mov 0xc4(%ebx),%ecx
the_thread->Start.core_allocated_stack = true;
10dc00: c6 83 b4 00 00 00 01 movb $0x1,0xb4(%ebx)
10dc07: e9 c8 fd ff ff jmp 10d9d4 <_Thread_Initialize+0x48>
stack = the_thread->Start.stack;
#else
if ( !stack_area ) {
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
if ( !actual_stack_size || actual_stack_size < stack_size )
return false; /* stack allocation failed */
10dc0c: 31 c0 xor %eax,%eax
10dc0e: e9 54 ff ff ff jmp 10db67 <_Thread_Initialize+0x1db>
size_t actual_stack_size = 0;
void *stack = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
void *fp_area;
#endif
void *sched = NULL;
10dc13: 31 ff xor %edi,%edi
10dc15: e9 c8 fe ff ff jmp 10dae2 <_Thread_Initialize+0x156>
00112610 <_Thread_Reset>:
void _Thread_Reset(
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
112610: 55 push %ebp
112611: 89 e5 mov %esp,%ebp
112613: 53 push %ebx
112614: 83 ec 10 sub $0x10,%esp
112617: 8b 5d 08 mov 0x8(%ebp),%ebx
the_thread->resource_count = 0;
11261a: c7 43 1c 00 00 00 00 movl $0x0,0x1c(%ebx)
the_thread->is_preemptible = the_thread->Start.is_preemptible;
112621: 8a 83 a0 00 00 00 mov 0xa0(%ebx),%al
112627: 88 43 74 mov %al,0x74(%ebx)
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
11262a: 8b 83 a4 00 00 00 mov 0xa4(%ebx),%eax
112630: 89 43 7c mov %eax,0x7c(%ebx)
the_thread->budget_callout = the_thread->Start.budget_callout;
112633: 8b 83 a8 00 00 00 mov 0xa8(%ebx),%eax
112639: 89 83 80 00 00 00 mov %eax,0x80(%ebx)
the_thread->Start.pointer_argument = pointer_argument;
11263f: 8b 45 0c mov 0xc(%ebp),%eax
112642: 89 83 98 00 00 00 mov %eax,0x98(%ebx)
the_thread->Start.numeric_argument = numeric_argument;
112648: 8b 45 10 mov 0x10(%ebp),%eax
11264b: 89 83 9c 00 00 00 mov %eax,0x9c(%ebx)
if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
112651: 53 push %ebx
112652: e8 c5 c4 ff ff call 10eb1c <_Thread_queue_Extract_with_proxy>
112657: 83 c4 10 add $0x10,%esp
11265a: 84 c0 test %al,%al
11265c: 75 06 jne 112664 <_Thread_Reset+0x54>
if ( _Watchdog_Is_active( &the_thread->Timer ) )
11265e: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
112662: 74 28 je 11268c <_Thread_Reset+0x7c>
(void) _Watchdog_Remove( &the_thread->Timer );
}
if ( the_thread->current_priority != the_thread->Start.initial_priority ) {
112664: 8b 83 b0 00 00 00 mov 0xb0(%ebx),%eax
11266a: 39 43 14 cmp %eax,0x14(%ebx)
11266d: 74 15 je 112684 <_Thread_Reset+0x74>
the_thread->real_priority = the_thread->Start.initial_priority;
11266f: 89 43 18 mov %eax,0x18(%ebx)
_Thread_Set_priority( the_thread, the_thread->Start.initial_priority );
112672: 89 45 0c mov %eax,0xc(%ebp)
112675: 89 5d 08 mov %ebx,0x8(%ebp)
}
}
112678: 8b 5d fc mov -0x4(%ebp),%ebx
11267b: c9 leave
(void) _Watchdog_Remove( &the_thread->Timer );
}
if ( the_thread->current_priority != the_thread->Start.initial_priority ) {
the_thread->real_priority = the_thread->Start.initial_priority;
_Thread_Set_priority( the_thread, the_thread->Start.initial_priority );
11267c: e9 77 c6 ff ff jmp 10ecf8 <_Thread_Set_priority>
112681: 8d 76 00 lea 0x0(%esi),%esi
}
}
112684: 8b 5d fc mov -0x4(%ebp),%ebx
112687: c9 leave
112688: c3 ret
112689: 8d 76 00 lea 0x0(%esi),%esi
the_thread->Start.numeric_argument = numeric_argument;
if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
if ( _Watchdog_Is_active( &the_thread->Timer ) )
(void) _Watchdog_Remove( &the_thread->Timer );
11268c: 83 ec 0c sub $0xc,%esp
11268f: 8d 43 48 lea 0x48(%ebx),%eax
112692: 50 push %eax
112693: e8 a4 cd ff ff call 10f43c <_Watchdog_Remove>
112698: 83 c4 10 add $0x10,%esp
11269b: eb c7 jmp 112664 <_Thread_Reset+0x54>
0011146c <_Thread_Resume>:
void _Thread_Resume(
Thread_Control *the_thread,
bool force
)
{
11146c: 55 push %ebp
11146d: 89 e5 mov %esp,%ebp
11146f: 53 push %ebx
111470: 83 ec 04 sub $0x4,%esp
111473: 8b 45 08 mov 0x8(%ebp),%eax
ISR_Level level;
States_Control current_state;
_ISR_Disable( level );
111476: 9c pushf
111477: fa cli
111478: 5b pop %ebx
current_state = the_thread->current_state;
111479: 8b 50 10 mov 0x10(%eax),%edx
if ( current_state & STATES_SUSPENDED ) {
11147c: f6 c2 02 test $0x2,%dl
11147f: 74 0a je 11148b <_Thread_Resume+0x1f> <== NEVER TAKEN
111481: 83 e2 fd and $0xfffffffd,%edx
current_state =
the_thread->current_state = _States_Clear(STATES_SUSPENDED, current_state);
111484: 89 50 10 mov %edx,0x10(%eax)
if ( _States_Is_ready( current_state ) ) {
111487: 85 d2 test %edx,%edx
111489: 74 09 je 111494 <_Thread_Resume+0x28>
_Scheduler_Unblock( &_Scheduler, the_thread );
}
}
_ISR_Enable( level );
11148b: 53 push %ebx
11148c: 9d popf
}
11148d: 8b 5d fc mov -0x4(%ebp),%ebx
111490: c9 leave
111491: c3 ret
111492: 66 90 xchg %ax,%ax
RTEMS_INLINE_ROUTINE void _Scheduler_Unblock(
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
the_scheduler->Operations.unblock( the_scheduler, the_thread );
111494: 83 ec 08 sub $0x8,%esp
111497: 50 push %eax
111498: 68 a0 b8 12 00 push $0x12b8a0
11149d: ff 15 b0 b8 12 00 call *0x12b8b0
1114a3: 83 c4 10 add $0x10,%esp
1114a6: eb e3 jmp 11148b <_Thread_Resume+0x1f>
0010e208 <_Thread_Stack_Allocate>:
size_t _Thread_Stack_Allocate(
Thread_Control *the_thread,
size_t stack_size
)
{
10e208: 55 push %ebp
10e209: 89 e5 mov %esp,%ebp
10e20b: 53 push %ebx
10e20c: 83 ec 04 sub $0x4,%esp
the_stack_size = _Stack_Adjust_size( the_stack_size );
stack_addr = _Workspace_Allocate( the_stack_size );
}
if ( !stack_addr )
the_stack_size = 0;
10e20f: a1 f0 3a 12 00 mov 0x123af0,%eax
10e214: 8b 5d 0c mov 0xc(%ebp),%ebx
10e217: 39 c3 cmp %eax,%ebx
10e219: 73 02 jae 10e21d <_Thread_Stack_Allocate+0x15>
10e21b: 89 c3 mov %eax,%ebx
* Call ONLY the CPU table stack allocate hook, _or_ the
* the RTEMS workspace allocate. This is so the stack free
* routine can call the correct deallocation routine.
*/
if ( Configuration.stack_allocate_hook ) {
10e21d: a1 24 3b 12 00 mov 0x123b24,%eax
10e222: 85 c0 test %eax,%eax
10e224: 74 32 je 10e258 <_Thread_Stack_Allocate+0x50>
stack_addr = (*Configuration.stack_allocate_hook)( the_stack_size );
10e226: 83 ec 0c sub $0xc,%esp
10e229: 53 push %ebx
10e22a: ff d0 call *%eax
10e22c: 83 c4 10 add $0x10,%esp
the_stack_size = _Stack_Adjust_size( the_stack_size );
stack_addr = _Workspace_Allocate( the_stack_size );
}
if ( !stack_addr )
10e22f: 85 c0 test %eax,%eax
10e231: 74 11 je 10e244 <_Thread_Stack_Allocate+0x3c>
the_stack_size = 0;
the_thread->Start.stack = stack_addr;
10e233: 8b 55 08 mov 0x8(%ebp),%edx
10e236: 89 82 c4 00 00 00 mov %eax,0xc4(%edx)
return the_stack_size;
}
10e23c: 89 d8 mov %ebx,%eax
10e23e: 8b 5d fc mov -0x4(%ebp),%ebx
10e241: c9 leave
10e242: c3 ret
10e243: 90 nop
the_stack_size = _Stack_Adjust_size( the_stack_size );
stack_addr = _Workspace_Allocate( the_stack_size );
}
if ( !stack_addr )
the_stack_size = 0;
10e244: 31 db xor %ebx,%ebx
the_thread->Start.stack = stack_addr;
10e246: 8b 55 08 mov 0x8(%ebp),%edx
10e249: 89 82 c4 00 00 00 mov %eax,0xc4(%edx)
return the_stack_size;
}
10e24f: 89 d8 mov %ebx,%eax
10e251: 8b 5d fc mov -0x4(%ebp),%ebx
10e254: c9 leave
10e255: c3 ret
10e256: 66 90 xchg %ax,%ax
RTEMS_INLINE_ROUTINE uint32_t _Stack_Adjust_size (
size_t size
)
{
return size + CPU_STACK_ALIGNMENT;
10e258: 83 c3 10 add $0x10,%ebx
* get and keep the stack adjust factor, the stack alignment, and
* the context initialization sequence in sync.
*/
the_stack_size = _Stack_Adjust_size( the_stack_size );
stack_addr = _Workspace_Allocate( the_stack_size );
10e25b: 83 ec 0c sub $0xc,%esp
10e25e: 53 push %ebx
10e25f: e8 fc 06 00 00 call 10e960 <_Workspace_Allocate>
10e264: 83 c4 10 add $0x10,%esp
10e267: eb c6 jmp 10e22f <_Thread_Stack_Allocate+0x27>
0010e26c <_Thread_Stack_Free>:
*/
void _Thread_Stack_Free(
Thread_Control *the_thread
)
{
10e26c: 55 push %ebp
10e26d: 89 e5 mov %esp,%ebp
10e26f: 83 ec 08 sub $0x8,%esp
10e272: 8b 45 08 mov 0x8(%ebp),%eax
#if defined(RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API)
/*
* If the API provided the stack space, then don't free it.
*/
if ( !the_thread->Start.core_allocated_stack )
10e275: 80 b8 b4 00 00 00 00 cmpb $0x0,0xb4(%eax)
10e27c: 74 16 je 10e294 <_Thread_Stack_Free+0x28>
* Call ONLY the CPU table stack free hook, or the
* the RTEMS workspace free. This is so the free
* routine properly matches the allocation of the stack.
*/
if ( Configuration.stack_free_hook )
10e27e: 8b 15 28 3b 12 00 mov 0x123b28,%edx
10e284: 85 d2 test %edx,%edx
10e286: 74 10 je 10e298 <_Thread_Stack_Free+0x2c>
(*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area );
10e288: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax
10e28e: 89 45 08 mov %eax,0x8(%ebp)
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
}
10e291: c9 leave
* the RTEMS workspace free. This is so the free
* routine properly matches the allocation of the stack.
*/
if ( Configuration.stack_free_hook )
(*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area );
10e292: ff e2 jmp *%edx
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
}
10e294: c9 leave
10e295: c3 ret
10e296: 66 90 xchg %ax,%ax
*/
if ( Configuration.stack_free_hook )
(*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area );
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
10e298: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax
10e29e: 89 45 08 mov %eax,0x8(%ebp)
}
10e2a1: c9 leave
*/
if ( Configuration.stack_free_hook )
(*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area );
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
10e2a2: e9 d5 06 00 00 jmp 10e97c <_Workspace_Free>
00111978 <_Thread_Suspend>:
*/
void _Thread_Suspend(
Thread_Control *the_thread
)
{
111978: 55 push %ebp
111979: 89 e5 mov %esp,%ebp
11197b: 53 push %ebx
11197c: 83 ec 04 sub $0x4,%esp
11197f: 8b 45 08 mov 0x8(%ebp),%eax
ISR_Level level;
_ISR_Disable( level );
111982: 9c pushf
111983: fa cli
111984: 5b pop %ebx
if ( !_States_Is_ready( the_thread->current_state ) ) {
111985: 8b 50 10 mov 0x10(%eax),%edx
111988: 85 d2 test %edx,%edx
11198a: 74 10 je 11199c <_Thread_Suspend+0x24>
11198c: 83 ca 02 or $0x2,%edx
11198f: 89 50 10 mov %edx,0x10(%eax)
the_thread->current_state =
_States_Set( STATES_SUSPENDED, the_thread->current_state );
_ISR_Enable( level );
111992: 53 push %ebx
111993: 9d popf
the_thread->current_state = STATES_SUSPENDED;
_Scheduler_Block(&_Scheduler, the_thread);
_ISR_Enable( level );
}
111994: 8b 5d fc mov -0x4(%ebp),%ebx
111997: c9 leave
111998: c3 ret
111999: 8d 76 00 lea 0x0(%esi),%esi
_States_Set( STATES_SUSPENDED, the_thread->current_state );
_ISR_Enable( level );
return;
}
the_thread->current_state = STATES_SUSPENDED;
11199c: c7 40 10 02 00 00 00 movl $0x2,0x10(%eax)
RTEMS_INLINE_ROUTINE void _Scheduler_Block(
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
the_scheduler->Operations.block( the_scheduler, the_thread );
1119a3: 83 ec 08 sub $0x8,%esp
1119a6: 50 push %eax
1119a7: 68 e0 7e 12 00 push $0x127ee0
1119ac: ff 15 ec 7e 12 00 call *0x127eec
_Scheduler_Block(&_Scheduler, the_thread);
_ISR_Enable( level );
1119b2: 53 push %ebx
1119b3: 9d popf
1119b4: 83 c4 10 add $0x10,%esp
}
1119b7: 8b 5d fc mov -0x4(%ebp),%ebx
1119ba: c9 leave
1119bb: c3 ret
0010e364 <_Thread_Tickle_timeslice>:
*
* Output parameters: NONE
*/
void _Thread_Tickle_timeslice( void )
{
10e364: 55 push %ebp
10e365: 89 e5 mov %esp,%ebp
10e367: 53 push %ebx
10e368: 83 ec 04 sub $0x4,%esp
Thread_Control *executing;
executing = _Thread_Executing;
10e36b: 8b 1d 18 84 12 00 mov 0x128418,%ebx
/*
* If the thread is not preemptible or is not ready, then
* just return.
*/
if ( !executing->is_preemptible )
10e371: 80 7b 74 00 cmpb $0x0,0x74(%ebx)
10e375: 74 19 je 10e390 <_Thread_Tickle_timeslice+0x2c>
return;
if ( !_States_Is_ready( executing->current_state ) )
10e377: 8b 43 10 mov 0x10(%ebx),%eax
10e37a: 85 c0 test %eax,%eax
10e37c: 75 12 jne 10e390 <_Thread_Tickle_timeslice+0x2c>
/*
* The cpu budget algorithm determines what happens next.
*/
switch ( executing->budget_algorithm ) {
10e37e: 8b 43 7c mov 0x7c(%ebx),%eax
10e381: 83 f8 01 cmp $0x1,%eax
10e384: 72 0a jb 10e390 <_Thread_Tickle_timeslice+0x2c>
10e386: 83 f8 02 cmp $0x2,%eax
10e389: 76 29 jbe 10e3b4 <_Thread_Tickle_timeslice+0x50>
10e38b: 83 f8 03 cmp $0x3,%eax
10e38e: 74 08 je 10e398 <_Thread_Tickle_timeslice+0x34><== ALWAYS TAKEN
if ( --executing->cpu_time_budget == 0 )
(*executing->budget_callout)( executing );
break;
#endif
}
}
10e390: 8b 5d fc mov -0x4(%ebp),%ebx
10e393: c9 leave
10e394: c3 ret
10e395: 8d 76 00 lea 0x0(%esi),%esi
}
break;
#if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
if ( --executing->cpu_time_budget == 0 )
10e398: 8b 43 78 mov 0x78(%ebx),%eax
10e39b: 48 dec %eax
10e39c: 89 43 78 mov %eax,0x78(%ebx)
10e39f: 85 c0 test %eax,%eax
10e3a1: 75 ed jne 10e390 <_Thread_Tickle_timeslice+0x2c>
(*executing->budget_callout)( executing );
10e3a3: 83 ec 0c sub $0xc,%esp
10e3a6: 53 push %ebx
10e3a7: ff 93 80 00 00 00 call *0x80(%ebx)
10e3ad: 83 c4 10 add $0x10,%esp
10e3b0: eb de jmp 10e390 <_Thread_Tickle_timeslice+0x2c>
10e3b2: 66 90 xchg %ax,%ax
case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE:
#if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE)
case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE:
#endif
if ( (int)(--executing->cpu_time_budget) <= 0 ) {
10e3b4: 8b 43 78 mov 0x78(%ebx),%eax
10e3b7: 48 dec %eax
10e3b8: 89 43 78 mov %eax,0x78(%ebx)
10e3bb: 85 c0 test %eax,%eax
10e3bd: 7f d1 jg 10e390 <_Thread_Tickle_timeslice+0x2c>
* always operates on the scheduler that 'owns' the currently executing
* thread.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Yield( void )
{
_Scheduler.Operations.yield( &_Scheduler );
10e3bf: 83 ec 0c sub $0xc,%esp
10e3c2: 68 e0 7e 12 00 push $0x127ee0
10e3c7: ff 15 e8 7e 12 00 call *0x127ee8
* executing thread's timeslice is reset. Otherwise, the
* currently executing thread is placed at the rear of the
* FIFO for this priority and a new heir is selected.
*/
_Scheduler_Yield( );
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
10e3cd: a1 00 7e 12 00 mov 0x127e00,%eax
10e3d2: 89 43 78 mov %eax,0x78(%ebx)
10e3d5: 83 c4 10 add $0x10,%esp
10e3d8: eb b6 jmp 10e390 <_Thread_Tickle_timeslice+0x2c>
0010dcf4 <_Thread_queue_Dequeue_priority>:
*/
Thread_Control *_Thread_queue_Dequeue_priority(
Thread_queue_Control *the_thread_queue
)
{
10dcf4: 55 push %ebp
10dcf5: 89 e5 mov %esp,%ebp
10dcf7: 57 push %edi
10dcf8: 56 push %esi
10dcf9: 53 push %ebx
10dcfa: 83 ec 2c sub $0x2c,%esp
10dcfd: 8b 7d 08 mov 0x8(%ebp),%edi
Chain_Node *new_second_node;
Chain_Node *last_node;
Chain_Node *next_node;
Chain_Node *previous_node;
_ISR_Disable( level );
10dd00: 9c pushf
10dd01: fa cli
10dd02: 58 pop %eax
10dd03: 89 f9 mov %edi,%ecx
for( index=0 ;
10dd05: 31 d2 xor %edx,%edx
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
return( the_thread );
}
10dd07: 8b 19 mov (%ecx),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10dd09: 8d 34 52 lea (%edx,%edx,2),%esi
10dd0c: 8d 74 b7 04 lea 0x4(%edi,%esi,4),%esi
_ISR_Disable( level );
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) ) {
10dd10: 39 f3 cmp %esi,%ebx
10dd12: 75 18 jne 10dd2c <_Thread_queue_Dequeue_priority+0x38>
Chain_Node *previous_node;
_ISR_Disable( level );
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
10dd14: 42 inc %edx
10dd15: 83 c1 0c add $0xc,%ecx
Chain_Node *last_node;
Chain_Node *next_node;
Chain_Node *previous_node;
_ISR_Disable( level );
for( index=0 ;
10dd18: 83 fa 04 cmp $0x4,%edx
10dd1b: 75 ea jne 10dd07 <_Thread_queue_Dequeue_priority+0x13>
}
/*
* We did not find a thread to unblock.
*/
_ISR_Enable( level );
10dd1d: 50 push %eax
10dd1e: 9d popf
return NULL;
10dd1f: 31 f6 xor %esi,%esi
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
return( the_thread );
}
10dd21: 89 f0 mov %esi,%eax
10dd23: 8d 65 f4 lea -0xc(%ebp),%esp
10dd26: 5b pop %ebx
10dd27: 5e pop %esi
10dd28: 5f pop %edi
10dd29: c9 leave
10dd2a: c3 ret
10dd2b: 90 nop
_ISR_Disable( level );
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) ) {
the_thread = (Thread_Control *) _Chain_First(
10dd2c: 89 de mov %ebx,%esi
*/
_ISR_Enable( level );
return NULL;
dequeue:
the_thread->Wait.queue = NULL;
10dd2e: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx)
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
return( the_thread );
}
10dd35: 8b 53 38 mov 0x38(%ebx),%edx
dequeue:
the_thread->Wait.queue = NULL;
new_first_node = _Chain_First( &the_thread->Wait.Block2n );
new_first_thread = (Thread_Control *) new_first_node;
next_node = the_thread->Object.Node.next;
10dd38: 8b 0b mov (%ebx),%ecx
previous_node = the_thread->Object.Node.previous;
10dd3a: 8b 7b 04 mov 0x4(%ebx),%edi
10dd3d: 89 7d d4 mov %edi,-0x2c(%ebp)
10dd40: 8d 7b 3c lea 0x3c(%ebx),%edi
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
10dd43: 39 fa cmp %edi,%edx
10dd45: 74 7f je 10ddc6 <_Thread_queue_Dequeue_priority+0xd2>
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
return( the_thread );
}
10dd47: 8b 7b 40 mov 0x40(%ebx),%edi
10dd4a: 89 7d e4 mov %edi,-0x1c(%ebp)
next_node = the_thread->Object.Node.next;
previous_node = the_thread->Object.Node.previous;
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
last_node = _Chain_Last( &the_thread->Wait.Block2n );
new_second_node = new_first_node->next;
10dd4d: 8b 3a mov (%edx),%edi
10dd4f: 89 7d e0 mov %edi,-0x20(%ebp)
previous_node->next = new_first_node;
10dd52: 8b 7d d4 mov -0x2c(%ebp),%edi
10dd55: 89 17 mov %edx,(%edi)
next_node->previous = new_first_node;
10dd57: 89 51 04 mov %edx,0x4(%ecx)
new_first_node->next = next_node;
10dd5a: 89 0a mov %ecx,(%edx)
new_first_node->previous = previous_node;
10dd5c: 89 7a 04 mov %edi,0x4(%edx)
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
10dd5f: 8b 4b 40 mov 0x40(%ebx),%ecx
10dd62: 39 4b 38 cmp %ecx,0x38(%ebx)
10dd65: 74 17 je 10dd7e <_Thread_queue_Dequeue_priority+0x8a>
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
10dd67: 8d 4a 38 lea 0x38(%edx),%ecx
10dd6a: 8b 7d e0 mov -0x20(%ebp),%edi
10dd6d: 89 4f 04 mov %ecx,0x4(%edi)
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
new_second_node->previous = head;
head->next = new_second_node;
10dd70: 89 7a 38 mov %edi,0x38(%edx)
tail->previous = last_node;
10dd73: 8b 4d e4 mov -0x1c(%ebp),%ecx
10dd76: 89 4a 40 mov %ecx,0x40(%edx)
new_first_node->previous = previous_node;
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
10dd79: 83 c2 3c add $0x3c,%edx
10dd7c: 89 11 mov %edx,(%ecx)
} else {
previous_node->next = next_node;
next_node->previous = previous_node;
}
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
10dd7e: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
10dd82: 74 18 je 10dd9c <_Thread_queue_Dequeue_priority+0xa8>
_ISR_Enable( level );
10dd84: 50 push %eax
10dd85: 9d popf
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
10dd86: 83 ec 08 sub $0x8,%esp
10dd89: 68 f8 ff 03 10 push $0x1003fff8
10dd8e: 53 push %ebx
10dd8f: e8 e0 f7 ff ff call 10d574 <_Thread_Clear_state>
10dd94: 83 c4 10 add $0x10,%esp
10dd97: eb 88 jmp 10dd21 <_Thread_queue_Dequeue_priority+0x2d>
10dd99: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
10dd9c: c7 43 50 03 00 00 00 movl $0x3,0x50(%ebx)
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
10dda3: 50 push %eax
10dda4: 9d popf
(void) _Watchdog_Remove( &the_thread->Timer );
10dda5: 83 ec 0c sub $0xc,%esp
10dda8: 8d 43 48 lea 0x48(%ebx),%eax
10ddab: 50 push %eax
10ddac: e8 87 0a 00 00 call 10e838 <_Watchdog_Remove>
10ddb1: 58 pop %eax
10ddb2: 5a pop %edx
10ddb3: 68 f8 ff 03 10 push $0x1003fff8
10ddb8: 53 push %ebx
10ddb9: e8 b6 f7 ff ff call 10d574 <_Thread_Clear_state>
10ddbe: 83 c4 10 add $0x10,%esp
10ddc1: e9 5b ff ff ff jmp 10dd21 <_Thread_queue_Dequeue_priority+0x2d>
head->next = new_second_node;
tail->previous = last_node;
last_node->next = tail;
}
} else {
previous_node->next = next_node;
10ddc6: 8b 7d d4 mov -0x2c(%ebp),%edi
10ddc9: 89 0f mov %ecx,(%edi)
next_node->previous = previous_node;
10ddcb: 89 79 04 mov %edi,0x4(%ecx)
10ddce: eb ae jmp 10dd7e <_Thread_queue_Dequeue_priority+0x8a>
0011181c <_Thread_queue_Extract>:
void _Thread_queue_Extract(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
11181c: 55 push %ebp
11181d: 89 e5 mov %esp,%ebp
11181f: 83 ec 08 sub $0x8,%esp
111822: 8b 45 08 mov 0x8(%ebp),%eax
111825: 8b 55 0c mov 0xc(%ebp),%edx
/*
* Can not use indirect function pointer here since Extract priority
* is a macro and the underlying methods do not have the same signature.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
111828: 83 78 34 01 cmpl $0x1,0x34(%eax)
11182c: 74 0e je 11183c <_Thread_queue_Extract+0x20>
_Thread_queue_Extract_priority( the_thread_queue, the_thread );
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
_Thread_queue_Extract_fifo( the_thread_queue, the_thread );
11182e: 89 55 0c mov %edx,0xc(%ebp)
111831: 89 45 08 mov %eax,0x8(%ebp)
}
111834: c9 leave
* is a macro and the underlying methods do not have the same signature.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
_Thread_queue_Extract_priority( the_thread_queue, the_thread );
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
_Thread_queue_Extract_fifo( the_thread_queue, the_thread );
111835: e9 e6 19 00 00 jmp 113220 <_Thread_queue_Extract_fifo>
11183a: 66 90 xchg %ax,%ax
/*
* Can not use indirect function pointer here since Extract priority
* is a macro and the underlying methods do not have the same signature.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
_Thread_queue_Extract_priority( the_thread_queue, the_thread );
11183c: 51 push %ecx
11183d: 6a 00 push $0x0
11183f: 52 push %edx
111840: 50 push %eax
111841: e8 06 00 00 00 call 11184c <_Thread_queue_Extract_priority_helper>
111846: 83 c4 10 add $0x10,%esp
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
_Thread_queue_Extract_fifo( the_thread_queue, the_thread );
}
111849: c9 leave
11184a: c3 ret
00113220 <_Thread_queue_Extract_fifo>:
void _Thread_queue_Extract_fifo(
Thread_queue_Control *the_thread_queue __attribute__((unused)),
Thread_Control *the_thread
)
{
113220: 55 push %ebp
113221: 89 e5 mov %esp,%ebp
113223: 53 push %ebx
113224: 83 ec 04 sub $0x4,%esp
113227: 8b 5d 0c mov 0xc(%ebp),%ebx
ISR_Level level;
_ISR_Disable( level );
11322a: 9c pushf
11322b: fa cli
11322c: 58 pop %eax
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
11322d: f7 43 10 e0 be 03 00 testl $0x3bee0,0x10(%ebx)
113234: 74 2e je 113264 <_Thread_queue_Extract_fifo+0x44>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
113236: 8b 0b mov (%ebx),%ecx
previous = the_node->previous;
113238: 8b 53 04 mov 0x4(%ebx),%edx
next->previous = previous;
11323b: 89 51 04 mov %edx,0x4(%ecx)
previous->next = next;
11323e: 89 0a mov %ecx,(%edx)
return;
}
_Chain_Extract_unprotected( &the_thread->Object.Node );
the_thread->Wait.queue = NULL;
113240: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
113247: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
11324b: 74 1f je 11326c <_Thread_queue_Extract_fifo+0x4c>
_ISR_Enable( level );
11324d: 50 push %eax
11324e: 9d popf
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
11324f: c7 45 0c f8 ff 03 10 movl $0x1003fff8,0xc(%ebp)
113256: 89 5d 08 mov %ebx,0x8(%ebp)
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
113259: 8b 5d fc mov -0x4(%ebp),%ebx
11325c: c9 leave
11325d: e9 12 a3 ff ff jmp 10d574 <_Thread_Clear_state>
113262: 66 90 xchg %ax,%ax
ISR_Level level;
_ISR_Disable( level );
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
_ISR_Enable( level );
113264: 50 push %eax
113265: 9d popf
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
113266: 8b 5d fc mov -0x4(%ebp),%ebx
113269: c9 leave
11326a: c3 ret
11326b: 90 nop
11326c: c7 43 50 03 00 00 00 movl $0x3,0x50(%ebx)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
113273: 50 push %eax
113274: 9d popf
(void) _Watchdog_Remove( &the_thread->Timer );
113275: 83 ec 0c sub $0xc,%esp
113278: 8d 43 48 lea 0x48(%ebx),%eax
11327b: 50 push %eax
11327c: e8 b7 b5 ff ff call 10e838 <_Watchdog_Remove>
113281: 83 c4 10 add $0x10,%esp
113284: eb c9 jmp 11324f <_Thread_queue_Extract_fifo+0x2f>
0011184c <_Thread_queue_Extract_priority_helper>:
void _Thread_queue_Extract_priority_helper(
Thread_queue_Control *the_thread_queue __attribute__((unused)),
Thread_Control *the_thread,
bool requeuing
)
{
11184c: 55 push %ebp
11184d: 89 e5 mov %esp,%ebp
11184f: 57 push %edi
111850: 56 push %esi
111851: 53 push %ebx
111852: 83 ec 1c sub $0x1c,%esp
111855: 8b 5d 0c mov 0xc(%ebp),%ebx
111858: 8a 45 10 mov 0x10(%ebp),%al
11185b: 88 45 e3 mov %al,-0x1d(%ebp)
Chain_Node *new_first_node;
Chain_Node *new_second_node;
Chain_Node *last_node;
the_node = (Chain_Node *) the_thread;
_ISR_Disable( level );
11185e: 9c pushf
11185f: fa cli
111860: 8f 45 e4 popl -0x1c(%ebp)
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
111863: f7 43 10 e0 be 03 00 testl $0x3bee0,0x10(%ebx)
11186a: 74 6c je 1118d8 <_Thread_queue_Extract_priority_helper+0x8c>
/*
* The thread was actually waiting on a thread queue so let's remove it.
*/
next_node = the_node->next;
11186c: 8b 13 mov (%ebx),%edx
previous_node = the_node->previous;
11186e: 8b 4b 04 mov 0x4(%ebx),%ecx
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
111871: 8b 43 38 mov 0x38(%ebx),%eax
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
111874: 8d 73 3c lea 0x3c(%ebx),%esi
*/
next_node = the_node->next;
previous_node = the_node->previous;
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
111877: 39 f0 cmp %esi,%eax
111879: 74 69 je 1118e4 <_Thread_queue_Extract_priority_helper+0x98>
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
11187b: 8b 7b 40 mov 0x40(%ebx),%edi
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
new_first_node = _Chain_First( &the_thread->Wait.Block2n );
new_first_thread = (Thread_Control *) new_first_node;
last_node = _Chain_Last( &the_thread->Wait.Block2n );
new_second_node = new_first_node->next;
11187e: 8b 30 mov (%eax),%esi
previous_node->next = new_first_node;
111880: 89 01 mov %eax,(%ecx)
next_node->previous = new_first_node;
111882: 89 42 04 mov %eax,0x4(%edx)
new_first_node->next = next_node;
111885: 89 10 mov %edx,(%eax)
new_first_node->previous = previous_node;
111887: 89 48 04 mov %ecx,0x4(%eax)
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
11188a: 8b 53 40 mov 0x40(%ebx),%edx
11188d: 39 53 38 cmp %edx,0x38(%ebx)
111890: 74 11 je 1118a3 <_Thread_queue_Extract_priority_helper+0x57>
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
111892: 8d 50 38 lea 0x38(%eax),%edx
111895: 89 56 04 mov %edx,0x4(%esi)
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
new_second_node->previous = head;
head->next = new_second_node;
111898: 89 70 38 mov %esi,0x38(%eax)
tail->previous = last_node;
11189b: 89 78 40 mov %edi,0x40(%eax)
new_first_node->previous = previous_node;
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
11189e: 83 c0 3c add $0x3c,%eax
1118a1: 89 07 mov %eax,(%edi)
/*
* If we are not supposed to touch timers or the thread's state, return.
*/
if ( requeuing ) {
1118a3: 80 7d e3 00 cmpb $0x0,-0x1d(%ebp)
1118a7: 75 23 jne 1118cc <_Thread_queue_Extract_priority_helper+0x80>
_ISR_Enable( level );
return;
}
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
1118a9: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
1118ad: 74 3d je 1118ec <_Thread_queue_Extract_priority_helper+0xa0>
_ISR_Enable( level );
1118af: ff 75 e4 pushl -0x1c(%ebp)
1118b2: 9d popf
1118b3: c7 45 0c f8 ff 03 10 movl $0x1003fff8,0xc(%ebp)
1118ba: 89 5d 08 mov %ebx,0x8(%ebp)
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
1118bd: 8d 65 f4 lea -0xc(%ebp),%esp
1118c0: 5b pop %ebx
1118c1: 5e pop %esi
1118c2: 5f pop %edi
1118c3: c9 leave
1118c4: e9 ab bc ff ff jmp 10d574 <_Thread_Clear_state>
1118c9: 8d 76 00 lea 0x0(%esi),%esi
/*
* If we are not supposed to touch timers or the thread's state, return.
*/
if ( requeuing ) {
_ISR_Enable( level );
1118cc: ff 75 e4 pushl -0x1c(%ebp)
1118cf: 9d popf
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
1118d0: 8d 65 f4 lea -0xc(%ebp),%esp
1118d3: 5b pop %ebx
1118d4: 5e pop %esi
1118d5: 5f pop %edi
1118d6: c9 leave
1118d7: c3 ret
Chain_Node *last_node;
the_node = (Chain_Node *) the_thread;
_ISR_Disable( level );
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
_ISR_Enable( level );
1118d8: ff 75 e4 pushl -0x1c(%ebp)
1118db: 9d popf
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
1118dc: 8d 65 f4 lea -0xc(%ebp),%esp
1118df: 5b pop %ebx
1118e0: 5e pop %esi
1118e1: 5f pop %edi
1118e2: c9 leave
1118e3: c3 ret
head->next = new_second_node;
tail->previous = last_node;
last_node->next = tail;
}
} else {
previous_node->next = next_node;
1118e4: 89 11 mov %edx,(%ecx)
next_node->previous = previous_node;
1118e6: 89 4a 04 mov %ecx,0x4(%edx)
1118e9: eb b8 jmp 1118a3 <_Thread_queue_Extract_priority_helper+0x57>
1118eb: 90 nop
1118ec: c7 43 50 03 00 00 00 movl $0x3,0x50(%ebx)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
1118f3: ff 75 e4 pushl -0x1c(%ebp)
1118f6: 9d popf
(void) _Watchdog_Remove( &the_thread->Timer );
1118f7: 83 ec 0c sub $0xc,%esp
1118fa: 8d 43 48 lea 0x48(%ebx),%eax
1118fd: 50 push %eax
1118fe: e8 35 cf ff ff call 10e838 <_Watchdog_Remove>
111903: 83 c4 10 add $0x10,%esp
111906: eb ab jmp 1118b3 <_Thread_queue_Extract_priority_helper+0x67>
0010dfe0 <_Thread_queue_Extract_with_proxy>:
*/
bool _Thread_queue_Extract_with_proxy(
Thread_Control *the_thread
)
{
10dfe0: 55 push %ebp
10dfe1: 89 e5 mov %esp,%ebp
10dfe3: 83 ec 08 sub $0x8,%esp
10dfe6: 8b 45 08 mov 0x8(%ebp),%eax
States_Control state;
state = the_thread->current_state;
if ( _States_Is_waiting_on_thread_queue( state ) ) {
10dfe9: f7 40 10 e0 be 03 00 testl $0x3bee0,0x10(%eax)
10dff0: 75 06 jne 10dff8 <_Thread_queue_Extract_with_proxy+0x18>
#endif
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
return true;
}
return false;
10dff2: 31 c0 xor %eax,%eax
}
10dff4: c9 leave
10dff5: c3 ret
10dff6: 66 90 xchg %ax,%ax
if ( proxy_extract_callout )
(*proxy_extract_callout)( the_thread );
}
#endif
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
10dff8: 83 ec 08 sub $0x8,%esp
10dffb: 50 push %eax
10dffc: ff 70 44 pushl 0x44(%eax)
10dfff: e8 18 38 00 00 call 11181c <_Thread_queue_Extract>
return true;
10e004: 83 c4 10 add $0x10,%esp
10e007: b0 01 mov $0x1,%al
}
return false;
}
10e009: c9 leave
10e00a: c3 ret
0010fe38 <_Thread_queue_First>:
*/
Thread_Control *_Thread_queue_First(
Thread_queue_Control *the_thread_queue
)
{
10fe38: 55 push %ebp
10fe39: 89 e5 mov %esp,%ebp
10fe3b: 83 ec 08 sub $0x8,%esp
10fe3e: 8b 45 08 mov 0x8(%ebp),%eax
Thread_Control * (*first_p)(Thread_queue_Control *);
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
10fe41: 83 78 34 01 cmpl $0x1,0x34(%eax)
10fe45: 74 0d je 10fe54 <_Thread_queue_First+0x1c>
first_p = _Thread_queue_First_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
first_p = _Thread_queue_First_fifo;
10fe47: ba b0 37 11 00 mov $0x1137b0,%edx
return (*first_p)( the_thread_queue );
10fe4c: 89 45 08 mov %eax,0x8(%ebp)
}
10fe4f: c9 leave
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
first_p = _Thread_queue_First_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
first_p = _Thread_queue_First_fifo;
return (*first_p)( the_thread_queue );
10fe50: ff e2 jmp *%edx
10fe52: 66 90 xchg %ax,%ax
)
{
Thread_Control * (*first_p)(Thread_queue_Control *);
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
first_p = _Thread_queue_First_priority;
10fe54: ba 60 fe 10 00 mov $0x10fe60,%edx
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
first_p = _Thread_queue_First_fifo;
return (*first_p)( the_thread_queue );
10fe59: 89 45 08 mov %eax,0x8(%ebp)
}
10fe5c: c9 leave
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
first_p = _Thread_queue_First_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
first_p = _Thread_queue_First_fifo;
return (*first_p)( the_thread_queue );
10fe5d: ff e2 jmp *%edx
001137b0 <_Thread_queue_First_fifo>:
*/
Thread_Control *_Thread_queue_First_fifo(
Thread_queue_Control *the_thread_queue
)
{
1137b0: 55 push %ebp
1137b1: 89 e5 mov %esp,%ebp
1137b3: 8b 55 08 mov 0x8(%ebp),%edx
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) )
return (Thread_Control *) _Chain_First( &the_thread_queue->Queues.Fifo );
return NULL;
}
1137b6: 8b 02 mov (%edx),%eax
1137b8: 83 c2 04 add $0x4,%edx
Thread_Control *_Thread_queue_First_fifo(
Thread_queue_Control *the_thread_queue
)
{
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) )
1137bb: 39 d0 cmp %edx,%eax
1137bd: 74 05 je 1137c4 <_Thread_queue_First_fifo+0x14>
return (Thread_Control *) _Chain_First( &the_thread_queue->Queues.Fifo );
return NULL;
}
1137bf: c9 leave
1137c0: c3 ret
1137c1: 8d 76 00 lea 0x0(%esi),%esi
)
{
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) )
return (Thread_Control *) _Chain_First( &the_thread_queue->Queues.Fifo );
return NULL;
1137c4: 31 c0 xor %eax,%eax
}
1137c6: c9 leave
1137c7: c3 ret
0010e00c <_Thread_queue_Flush>:
#else
Thread_queue_Flush_callout remote_extract_callout __attribute__((unused)),
#endif
uint32_t status
)
{
10e00c: 55 push %ebp
10e00d: 89 e5 mov %esp,%ebp
10e00f: 56 push %esi
10e010: 53 push %ebx
10e011: 8b 5d 08 mov 0x8(%ebp),%ebx
10e014: 8b 75 10 mov 0x10(%ebp),%esi
Thread_Control *the_thread;
while ( (the_thread = _Thread_queue_Dequeue( the_thread_queue )) ) {
10e017: eb 06 jmp 10e01f <_Thread_queue_Flush+0x13>
10e019: 8d 76 00 lea 0x0(%esi),%esi
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
( *remote_extract_callout )( the_thread );
else
#endif
the_thread->Wait.return_code = status;
10e01c: 89 70 34 mov %esi,0x34(%eax)
uint32_t status
)
{
Thread_Control *the_thread;
while ( (the_thread = _Thread_queue_Dequeue( the_thread_queue )) ) {
10e01f: 83 ec 0c sub $0xc,%esp
10e022: 53 push %ebx
10e023: e8 80 fc ff ff call 10dca8 <_Thread_queue_Dequeue>
10e028: 83 c4 10 add $0x10,%esp
10e02b: 85 c0 test %eax,%eax
10e02d: 75 ed jne 10e01c <_Thread_queue_Flush+0x10>
( *remote_extract_callout )( the_thread );
else
#endif
the_thread->Wait.return_code = status;
}
}
10e02f: 8d 65 f8 lea -0x8(%ebp),%esp
10e032: 5b pop %ebx
10e033: 5e pop %esi
10e034: c9 leave
10e035: c3 ret
0010e038 <_Thread_queue_Initialize>:
Thread_queue_Control *the_thread_queue,
Thread_queue_Disciplines the_discipline,
States_Control state,
uint32_t timeout_status
)
{
10e038: 55 push %ebp
10e039: 89 e5 mov %esp,%ebp
10e03b: 56 push %esi
10e03c: 53 push %ebx
10e03d: 8b 45 08 mov 0x8(%ebp),%eax
10e040: 8b 55 0c mov 0xc(%ebp),%edx
the_thread_queue->state = state;
10e043: 8b 4d 10 mov 0x10(%ebp),%ecx
10e046: 89 48 38 mov %ecx,0x38(%eax)
the_thread_queue->discipline = the_discipline;
10e049: 89 50 34 mov %edx,0x34(%eax)
the_thread_queue->timeout_status = timeout_status;
10e04c: 8b 4d 14 mov 0x14(%ebp),%ecx
10e04f: 89 48 3c mov %ecx,0x3c(%eax)
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
10e052: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
10e059: 83 fa 01 cmp $0x1,%edx
10e05c: 74 16 je 10e074 <_Thread_queue_Initialize+0x3c>
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
10e05e: 8d 50 04 lea 0x4(%eax),%edx
10e061: 89 10 mov %edx,(%eax)
head->next = tail;
head->previous = NULL;
10e063: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)
tail->previous = head;
10e06a: 89 40 08 mov %eax,0x8(%eax)
_Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] );
} else { /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
_Chain_Initialize_empty( &the_thread_queue->Queues.Fifo );
}
}
10e06d: 5b pop %ebx
10e06e: 5e pop %esi
10e06f: c9 leave
10e070: c3 ret
10e071: 8d 76 00 lea 0x0(%esi),%esi
the_thread_queue->state = state;
the_thread_queue->discipline = the_discipline;
the_thread_queue->timeout_status = timeout_status;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
10e074: 89 c1 mov %eax,%ecx
10e076: 30 d2 xor %dl,%dl
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
10e078: 8d 1c 52 lea (%edx,%edx,2),%ebx
10e07b: 8d 1c 98 lea (%eax,%ebx,4),%ebx
10e07e: 8d 73 04 lea 0x4(%ebx),%esi
10e081: 89 31 mov %esi,(%ecx)
head->next = tail;
head->previous = NULL;
10e083: c7 41 04 00 00 00 00 movl $0x0,0x4(%ecx)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
10e08a: 89 59 08 mov %ebx,0x8(%ecx)
uint32_t index;
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++)
10e08d: 42 inc %edx
10e08e: 83 c1 0c add $0xc,%ecx
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
uint32_t index;
for( index=0 ;
10e091: 83 fa 04 cmp $0x4,%edx
10e094: 75 e2 jne 10e078 <_Thread_queue_Initialize+0x40>
_Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] );
} else { /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
_Chain_Initialize_empty( &the_thread_queue->Queues.Fifo );
}
}
10e096: 5b pop %ebx
10e097: 5e pop %esi
10e098: c9 leave
10e099: c3 ret
0010e09c <_Thread_queue_Requeue>:
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
10e09c: 55 push %ebp
10e09d: 89 e5 mov %esp,%ebp
10e09f: 57 push %edi
10e0a0: 56 push %esi
10e0a1: 53 push %ebx
10e0a2: 83 ec 1c sub $0x1c,%esp
10e0a5: 8b 75 08 mov 0x8(%ebp),%esi
10e0a8: 8b 7d 0c mov 0xc(%ebp),%edi
/*
* Just in case the thread really wasn't blocked on a thread queue
* when we get here.
*/
if ( !the_thread_queue )
10e0ab: 85 f6 test %esi,%esi
10e0ad: 74 06 je 10e0b5 <_Thread_queue_Requeue+0x19><== NEVER TAKEN
/*
* If queueing by FIFO, there is nothing to do. This only applies to
* priority blocking discipline.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
10e0af: 83 7e 34 01 cmpl $0x1,0x34(%esi)
10e0b3: 74 0b je 10e0c0 <_Thread_queue_Requeue+0x24><== ALWAYS TAKEN
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
}
_ISR_Enable( level );
}
}
10e0b5: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10e0b8: 5b pop %ebx <== NOT EXECUTED
10e0b9: 5e pop %esi <== NOT EXECUTED
10e0ba: 5f pop %edi <== NOT EXECUTED
10e0bb: c9 leave <== NOT EXECUTED
10e0bc: c3 ret <== NOT EXECUTED
10e0bd: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
Thread_queue_Control *tq = the_thread_queue;
ISR_Level level;
ISR_Level level_ignored;
_ISR_Disable( level );
10e0c0: 9c pushf
10e0c1: fa cli
10e0c2: 5b pop %ebx
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
10e0c3: f7 47 10 e0 be 03 00 testl $0x3bee0,0x10(%edi)
10e0ca: 75 0c jne 10e0d8 <_Thread_queue_Requeue+0x3c><== ALWAYS TAKEN
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
}
_ISR_Enable( level );
10e0cc: 53 push %ebx
10e0cd: 9d popf
}
}
10e0ce: 8d 65 f4 lea -0xc(%ebp),%esp
10e0d1: 5b pop %ebx
10e0d2: 5e pop %esi
10e0d3: 5f pop %edi
10e0d4: c9 leave
10e0d5: c3 ret
10e0d6: 66 90 xchg %ax,%ax
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
10e0d8: c7 46 30 01 00 00 00 movl $0x1,0x30(%esi)
ISR_Level level_ignored;
_ISR_Disable( level );
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
10e0df: 50 push %eax
10e0e0: 6a 01 push $0x1
10e0e2: 57 push %edi
10e0e3: 56 push %esi
10e0e4: e8 63 37 00 00 call 11184c <_Thread_queue_Extract_priority_helper>
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
10e0e9: 83 c4 0c add $0xc,%esp
10e0ec: 8d 45 e4 lea -0x1c(%ebp),%eax
10e0ef: 50 push %eax
10e0f0: 57 push %edi
10e0f1: 56 push %esi
10e0f2: e8 71 fd ff ff call 10de68 <_Thread_queue_Enqueue_priority>
10e0f7: 83 c4 10 add $0x10,%esp
10e0fa: eb d0 jmp 10e0cc <_Thread_queue_Requeue+0x30>
0010e0fc <_Thread_queue_Timeout>:
void _Thread_queue_Timeout(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
10e0fc: 55 push %ebp
10e0fd: 89 e5 mov %esp,%ebp
10e0ff: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10e102: 8d 45 f4 lea -0xc(%ebp),%eax
10e105: 50 push %eax
10e106: ff 75 08 pushl 0x8(%ebp)
10e109: e8 0a f8 ff ff call 10d918 <_Thread_Get>
switch ( location ) {
10e10e: 83 c4 10 add $0x10,%esp
10e111: 8b 55 f4 mov -0xc(%ebp),%edx
10e114: 85 d2 test %edx,%edx
10e116: 75 17 jne 10e12f <_Thread_queue_Timeout+0x33><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
10e118: 83 ec 0c sub $0xc,%esp
10e11b: 50 push %eax
10e11c: e8 e7 37 00 00 call 111908 <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10e121: a1 30 7e 12 00 mov 0x127e30,%eax
10e126: 48 dec %eax
10e127: a3 30 7e 12 00 mov %eax,0x127e30
10e12c: 83 c4 10 add $0x10,%esp
_Thread_Unnest_dispatch();
break;
}
}
10e12f: c9 leave
10e130: c3 ret
00118dc4 <_Timer_server_Body>:
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
118dc4: 55 push %ebp
118dc5: 89 e5 mov %esp,%ebp
118dc7: 57 push %edi
118dc8: 56 push %esi
118dc9: 53 push %ebx
118dca: 83 ec 4c sub $0x4c,%esp
118dcd: 8b 5d 08 mov 0x8(%ebp),%ebx
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
118dd0: 8d 45 e0 lea -0x20(%ebp),%eax
118dd3: 89 45 b4 mov %eax,-0x4c(%ebp)
118dd6: 89 45 dc mov %eax,-0x24(%ebp)
head->previous = NULL;
118dd9: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
tail->previous = head;
118de0: 8d 4d dc lea -0x24(%ebp),%ecx
118de3: 89 4d e4 mov %ecx,-0x1c(%ebp)
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
118de6: 8d 7d d0 lea -0x30(%ebp),%edi
118de9: 8d 45 d4 lea -0x2c(%ebp),%eax
118dec: 89 45 b0 mov %eax,-0x50(%ebp)
118def: 89 45 d0 mov %eax,-0x30(%ebp)
head->previous = NULL;
118df2: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp)
tail->previous = head;
118df9: 89 7d d8 mov %edi,-0x28(%ebp)
118dfc: 8d 73 30 lea 0x30(%ebx),%esi
118dff: 8d 4b 68 lea 0x68(%ebx),%ecx
118e02: 89 4d c4 mov %ecx,-0x3c(%ebp)
118e05: 8d 43 08 lea 0x8(%ebx),%eax
118e08: 89 45 bc mov %eax,-0x44(%ebp)
118e0b: 8d 53 40 lea 0x40(%ebx),%edx
118e0e: 89 55 c0 mov %edx,-0x40(%ebp)
118e11: 8d 76 00 lea 0x0(%esi),%esi
Chain_Control *tmp;
/*
* Afterwards all timer inserts are directed to this chain and the interval
* and TOD chains will be no more modified by other parties.
*/
ts->insert_chain = insert_chain;
118e14: 8d 4d dc lea -0x24(%ebp),%ecx
118e17: 89 4b 78 mov %ecx,0x78(%ebx)
118e1a: 66 90 xchg %ax,%ax
static void _Timer_server_Process_interval_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
118e1c: a1 44 2c 14 00 mov 0x142c44,%eax
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
118e21: 8b 53 3c mov 0x3c(%ebx),%edx
watchdogs->last_snapshot = snapshot;
118e24: 89 43 3c mov %eax,0x3c(%ebx)
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
118e27: 51 push %ecx
118e28: 57 push %edi
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
118e29: 29 d0 sub %edx,%eax
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
118e2b: 50 push %eax
118e2c: 56 push %esi
118e2d: e8 72 3f 00 00 call 11cda4 <_Watchdog_Adjust_to_chain>
static void _Timer_server_Process_tod_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
118e32: a1 a4 2b 14 00 mov 0x142ba4,%eax
Watchdog_Interval last_snapshot = watchdogs->last_snapshot;
118e37: 8b 53 74 mov 0x74(%ebx),%edx
/*
* Process the seconds chain. Start by checking that the Time
* of Day (TOD) has not been set backwards. If it has then
* we want to adjust the watchdogs->Chain to indicate this.
*/
if ( snapshot > last_snapshot ) {
118e3a: 83 c4 10 add $0x10,%esp
118e3d: 39 d0 cmp %edx,%eax
118e3f: 0f 87 af 00 00 00 ja 118ef4 <_Timer_server_Body+0x130>
* TOD has been set forward.
*/
delta = snapshot - last_snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
} else if ( snapshot < last_snapshot ) {
118e45: 0f 82 c9 00 00 00 jb 118f14 <_Timer_server_Body+0x150>
*/
delta = last_snapshot - snapshot;
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
}
watchdogs->last_snapshot = snapshot;
118e4b: 89 43 74 mov %eax,0x74(%ebx)
118e4e: 66 90 xchg %ax,%ax
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
118e50: 8b 43 78 mov 0x78(%ebx),%eax
118e53: 83 ec 0c sub $0xc,%esp
118e56: 50 push %eax
118e57: e8 04 0a 00 00 call 119860 <_Chain_Get>
if ( timer == NULL ) {
118e5c: 83 c4 10 add $0x10,%esp
118e5f: 85 c0 test %eax,%eax
118e61: 74 35 je 118e98 <_Timer_server_Body+0xd4><== ALWAYS TAKEN
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
118e63: 8b 50 38 mov 0x38(%eax),%edx <== NOT EXECUTED
118e66: 83 fa 01 cmp $0x1,%edx <== NOT EXECUTED
118e69: 74 19 je 118e84 <_Timer_server_Body+0xc0><== NOT EXECUTED
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
118e6b: 83 fa 03 cmp $0x3,%edx <== NOT EXECUTED
118e6e: 75 e0 jne 118e50 <_Timer_server_Body+0x8c><== NOT EXECUTED
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
118e70: 83 ec 08 sub $0x8,%esp <== NOT EXECUTED
118e73: 83 c0 10 add $0x10,%eax <== NOT EXECUTED
118e76: 50 push %eax <== NOT EXECUTED
118e77: ff 75 c4 pushl -0x3c(%ebp) <== NOT EXECUTED
118e7a: e8 b1 3f 00 00 call 11ce30 <_Watchdog_Insert> <== NOT EXECUTED
118e7f: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
118e82: eb cc jmp 118e50 <_Timer_server_Body+0x8c><== NOT EXECUTED
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
118e84: 83 ec 08 sub $0x8,%esp <== NOT EXECUTED
118e87: 83 c0 10 add $0x10,%eax <== NOT EXECUTED
118e8a: 50 push %eax <== NOT EXECUTED
118e8b: 56 push %esi <== NOT EXECUTED
118e8c: e8 9f 3f 00 00 call 11ce30 <_Watchdog_Insert> <== NOT EXECUTED
118e91: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
118e94: eb ba jmp 118e50 <_Timer_server_Body+0x8c><== NOT EXECUTED
118e96: 66 90 xchg %ax,%ax <== NOT EXECUTED
* of zero it will be processed in the next iteration of the timer server
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
118e98: 9c pushf
118e99: fa cli
118e9a: 58 pop %eax
tmp = ts->insert_chain;
118e9b: 8b 53 78 mov 0x78(%ebx),%edx
if ( _Chain_Is_empty( insert_chain ) ) {
118e9e: 8b 55 b4 mov -0x4c(%ebp),%edx
118ea1: 39 55 dc cmp %edx,-0x24(%ebp)
118ea4: 0f 84 86 00 00 00 je 118f30 <_Timer_server_Body+0x16c><== ALWAYS TAKEN
118eaa: b2 01 mov $0x1,%dl <== NOT EXECUTED
ts->insert_chain = NULL;
do_loop = false;
}
_ISR_Enable( level );
118eac: 50 push %eax
118ead: 9d popf
* Afterwards all timer inserts are directed to this chain and the interval
* and TOD chains will be no more modified by other parties.
*/
ts->insert_chain = insert_chain;
while ( do_loop ) {
118eae: 84 d2 test %dl,%dl
118eb0: 0f 85 66 ff ff ff jne 118e1c <_Timer_server_Body+0x58><== NEVER TAKEN
_Chain_Initialize_empty( &fire_chain );
while ( true ) {
_Timer_server_Get_watchdogs_that_fire_now( ts, &insert_chain, &fire_chain );
if ( !_Chain_Is_empty( &fire_chain ) ) {
118eb6: 8b 4d b0 mov -0x50(%ebp),%ecx
118eb9: 39 4d d0 cmp %ecx,-0x30(%ebp)
118ebc: 75 22 jne 118ee0 <_Timer_server_Body+0x11c>
118ebe: eb 7e jmp 118f3e <_Timer_server_Body+0x17a>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
118ec0: 8b 10 mov (%eax),%edx
head->next = new_first;
118ec2: 89 55 d0 mov %edx,-0x30(%ebp)
new_first->previous = head;
118ec5: 89 7a 04 mov %edi,0x4(%edx)
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
118ec8: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)
_ISR_Enable( level );
118ecf: 51 push %ecx
118ed0: 9d popf
/*
* The timer server may block here and wait for resources or time.
* The system watchdogs are inactive and will remain inactive since
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
118ed1: 83 ec 08 sub $0x8,%esp
118ed4: ff 70 24 pushl 0x24(%eax)
118ed7: ff 70 20 pushl 0x20(%eax)
118eda: ff 50 1c call *0x1c(%eax)
}
118edd: 83 c4 10 add $0x10,%esp
/*
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
118ee0: 9c pushf
118ee1: fa cli
118ee2: 59 pop %ecx
initialized = false;
}
#endif
return status;
}
118ee3: 8b 45 d0 mov -0x30(%ebp),%eax
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
118ee6: 3b 45 b0 cmp -0x50(%ebp),%eax
118ee9: 75 d5 jne 118ec0 <_Timer_server_Body+0xfc>
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
_ISR_Enable( level );
} else {
_ISR_Enable( level );
118eeb: 51 push %ecx
118eec: 9d popf
118eed: e9 22 ff ff ff jmp 118e14 <_Timer_server_Body+0x50>
118ef2: 66 90 xchg %ax,%ax
/*
* This path is for normal forward movement and cases where the
* TOD has been set forward.
*/
delta = snapshot - last_snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
118ef4: 51 push %ecx
118ef5: 57 push %edi
if ( snapshot > last_snapshot ) {
/*
* This path is for normal forward movement and cases where the
* TOD has been set forward.
*/
delta = snapshot - last_snapshot;
118ef6: 89 c1 mov %eax,%ecx
118ef8: 29 d1 sub %edx,%ecx
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
118efa: 51 push %ecx
118efb: ff 75 c4 pushl -0x3c(%ebp)
118efe: 89 45 b8 mov %eax,-0x48(%ebp)
118f01: e8 9e 3e 00 00 call 11cda4 <_Watchdog_Adjust_to_chain>
118f06: 83 c4 10 add $0x10,%esp
118f09: 8b 45 b8 mov -0x48(%ebp),%eax
118f0c: e9 3a ff ff ff jmp 118e4b <_Timer_server_Body+0x87>
118f11: 8d 76 00 lea 0x0(%esi),%esi
/*
* The current TOD is before the last TOD which indicates that
* TOD has been set backwards.
*/
delta = last_snapshot - snapshot;
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
118f14: 51 push %ecx
} else if ( snapshot < last_snapshot ) {
/*
* The current TOD is before the last TOD which indicates that
* TOD has been set backwards.
*/
delta = last_snapshot - snapshot;
118f15: 29 c2 sub %eax,%edx
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
118f17: 52 push %edx
118f18: 6a 01 push $0x1
118f1a: ff 75 c4 pushl -0x3c(%ebp)
118f1d: 89 45 b8 mov %eax,-0x48(%ebp)
118f20: e8 07 3e 00 00 call 11cd2c <_Watchdog_Adjust>
118f25: 83 c4 10 add $0x10,%esp
118f28: 8b 45 b8 mov -0x48(%ebp),%eax
118f2b: e9 1b ff ff ff jmp 118e4b <_Timer_server_Body+0x87>
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
tmp = ts->insert_chain;
if ( _Chain_Is_empty( insert_chain ) ) {
ts->insert_chain = NULL;
118f30: c7 43 78 00 00 00 00 movl $0x0,0x78(%ebx)
do_loop = false;
118f37: 31 d2 xor %edx,%edx
118f39: e9 6e ff ff ff jmp 118eac <_Timer_server_Body+0xe8>
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
}
} else {
ts->active = false;
118f3e: c6 43 7c 00 movb $0x0,0x7c(%ebx)
118f42: a1 d0 2a 14 00 mov 0x142ad0,%eax
118f47: 40 inc %eax
118f48: a3 d0 2a 14 00 mov %eax,0x142ad0
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
_Thread_Set_state( ts->thread, STATES_DELAYING );
118f4d: 83 ec 08 sub $0x8,%esp
118f50: 6a 08 push $0x8
118f52: ff 33 pushl (%ebx)
118f54: e8 67 37 00 00 call 11c6c0 <_Thread_Set_state>
_Timer_server_Reset_interval_system_watchdog( ts );
118f59: 89 d8 mov %ebx,%eax
118f5b: e8 c4 fd ff ff call 118d24 <_Timer_server_Reset_interval_system_watchdog>
_Timer_server_Reset_tod_system_watchdog( ts );
118f60: 89 d8 mov %ebx,%eax
118f62: e8 0d fe ff ff call 118d74 <_Timer_server_Reset_tod_system_watchdog>
_Thread_Enable_dispatch();
118f67: e8 2c 2e 00 00 call 11bd98 <_Thread_Enable_dispatch>
ts->active = true;
118f6c: c6 43 7c 01 movb $0x1,0x7c(%ebx)
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
118f70: 5a pop %edx
118f71: ff 75 bc pushl -0x44(%ebp)
118f74: e8 f7 3f 00 00 call 11cf70 <_Watchdog_Remove>
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
118f79: 58 pop %eax
118f7a: ff 75 c0 pushl -0x40(%ebp)
118f7d: e8 ee 3f 00 00 call 11cf70 <_Watchdog_Remove>
118f82: 83 c4 10 add $0x10,%esp
118f85: e9 8a fe ff ff jmp 118e14 <_Timer_server_Body+0x50>
00118f8c <_Timer_server_Schedule_operation_method>:
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
118f8c: 55 push %ebp
118f8d: 89 e5 mov %esp,%ebp
118f8f: 57 push %edi
118f90: 56 push %esi
118f91: 53 push %ebx
118f92: 83 ec 2c sub $0x2c,%esp
118f95: 8b 5d 08 mov 0x8(%ebp),%ebx
118f98: 8b 45 0c mov 0xc(%ebp),%eax
if ( ts->insert_chain == NULL ) {
118f9b: 8b 53 78 mov 0x78(%ebx),%edx
118f9e: 85 d2 test %edx,%edx
118fa0: 74 16 je 118fb8 <_Timer_server_Schedule_operation_method+0x2c><== ALWAYS TAKEN
* server is not preemptible, so we must be in interrupt context here. No
* thread dispatch will happen until the timer server finishes its
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
118fa2: 8b 53 78 mov 0x78(%ebx),%edx <== NOT EXECUTED
118fa5: 89 45 0c mov %eax,0xc(%ebp) <== NOT EXECUTED
118fa8: 89 55 08 mov %edx,0x8(%ebp) <== NOT EXECUTED
}
}
118fab: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
118fae: 5b pop %ebx <== NOT EXECUTED
118faf: 5e pop %esi <== NOT EXECUTED
118fb0: 5f pop %edi <== NOT EXECUTED
118fb1: c9 leave <== NOT EXECUTED
* server is not preemptible, so we must be in interrupt context here. No
* thread dispatch will happen until the timer server finishes its
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
118fb2: e9 6d 08 00 00 jmp 119824 <_Chain_Append> <== NOT EXECUTED
118fb7: 90 nop <== NOT EXECUTED
118fb8: 8b 15 d0 2a 14 00 mov 0x142ad0,%edx
118fbe: 42 inc %edx
118fbf: 89 15 d0 2a 14 00 mov %edx,0x142ad0
* being inserted. This could result in an integer overflow.
*/
_Thread_Disable_dispatch();
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
118fc5: 8b 50 38 mov 0x38(%eax),%edx
118fc8: 83 fa 01 cmp $0x1,%edx
118fcb: 74 7b je 119048 <_Timer_server_Schedule_operation_method+0xbc>
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
if ( !ts->active ) {
_Timer_server_Reset_interval_system_watchdog( ts );
}
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
118fcd: 83 fa 03 cmp $0x3,%edx
118fd0: 74 0e je 118fe0 <_Timer_server_Schedule_operation_method+0x54>
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
}
}
118fd2: 8d 65 f4 lea -0xc(%ebp),%esp
118fd5: 5b pop %ebx
118fd6: 5e pop %esi
118fd7: 5f pop %edi
118fd8: c9 leave
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
118fd9: e9 ba 2d 00 00 jmp 11bd98 <_Thread_Enable_dispatch>
118fde: 66 90 xchg %ax,%ax
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
118fe0: 9c pushf
118fe1: fa cli
118fe2: 8f 45 e4 popl -0x1c(%ebp)
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
118fe5: 8b 0d a4 2b 14 00 mov 0x142ba4,%ecx
last_snapshot = ts->TOD_watchdogs.last_snapshot;
118feb: 8b 53 74 mov 0x74(%ebx),%edx
118fee: 89 55 d4 mov %edx,-0x2c(%ebp)
initialized = false;
}
#endif
return status;
}
118ff1: 8b 53 68 mov 0x68(%ebx),%edx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
118ff4: 8d 7b 6c lea 0x6c(%ebx),%edi
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
last_snapshot = ts->TOD_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
118ff7: 39 fa cmp %edi,%edx
118ff9: 74 21 je 11901c <_Timer_server_Schedule_operation_method+0x90>
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
118ffb: 8b 7a 10 mov 0x10(%edx),%edi
if ( snapshot > last_snapshot ) {
118ffe: 3b 4d d4 cmp -0x2c(%ebp),%ecx
119001: 0f 86 a1 00 00 00 jbe 1190a8 <_Timer_server_Schedule_operation_method+0x11c>
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
119007: 89 ce mov %ecx,%esi
119009: 2b 75 d4 sub -0x2c(%ebp),%esi
11900c: 89 75 d4 mov %esi,-0x2c(%ebp)
if (delta_interval > delta) {
11900f: 39 f7 cmp %esi,%edi
119011: 0f 86 9b 00 00 00 jbe 1190b2 <_Timer_server_Schedule_operation_method+0x126><== NEVER TAKEN
delta_interval -= delta;
119017: 29 f7 sub %esi,%edi
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
delta_interval += delta;
}
first_watchdog->delta_interval = delta_interval;
119019: 89 7a 10 mov %edi,0x10(%edx)
}
ts->TOD_watchdogs.last_snapshot = snapshot;
11901c: 89 4b 74 mov %ecx,0x74(%ebx)
_ISR_Enable( level );
11901f: ff 75 e4 pushl -0x1c(%ebp)
119022: 9d popf
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
119023: 83 ec 08 sub $0x8,%esp
119026: 83 c0 10 add $0x10,%eax
119029: 50 push %eax
11902a: 8d 43 68 lea 0x68(%ebx),%eax
11902d: 50 push %eax
11902e: e8 fd 3d 00 00 call 11ce30 <_Watchdog_Insert>
if ( !ts->active ) {
119033: 8a 43 7c mov 0x7c(%ebx),%al
119036: 83 c4 10 add $0x10,%esp
119039: 84 c0 test %al,%al
11903b: 75 95 jne 118fd2 <_Timer_server_Schedule_operation_method+0x46>
_Timer_server_Reset_tod_system_watchdog( ts );
11903d: 89 d8 mov %ebx,%eax
11903f: e8 30 fd ff ff call 118d74 <_Timer_server_Reset_tod_system_watchdog>
119044: eb 8c jmp 118fd2 <_Timer_server_Schedule_operation_method+0x46>
119046: 66 90 xchg %ax,%ax
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
/*
* We have to advance the last known ticks value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
119048: 9c pushf
119049: fa cli
11904a: 8f 45 e4 popl -0x1c(%ebp)
snapshot = _Watchdog_Ticks_since_boot;
11904d: 8b 0d 44 2c 14 00 mov 0x142c44,%ecx
last_snapshot = ts->Interval_watchdogs.last_snapshot;
119053: 8b 7b 3c mov 0x3c(%ebx),%edi
initialized = false;
}
#endif
return status;
}
119056: 8b 53 30 mov 0x30(%ebx),%edx
119059: 8d 73 34 lea 0x34(%ebx),%esi
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = _Watchdog_Ticks_since_boot;
last_snapshot = ts->Interval_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) {
11905c: 39 f2 cmp %esi,%edx
11905e: 74 10 je 119070 <_Timer_server_Schedule_operation_method+0xe4>
first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain );
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
119060: 89 ce mov %ecx,%esi
119062: 29 fe sub %edi,%esi
delta_interval = first_watchdog->delta_interval;
119064: 8b 7a 10 mov 0x10(%edx),%edi
if (delta_interval > delta) {
119067: 39 fe cmp %edi,%esi
119069: 73 39 jae 1190a4 <_Timer_server_Schedule_operation_method+0x118>
delta_interval -= delta;
11906b: 29 f7 sub %esi,%edi
} else {
delta_interval = 0;
}
first_watchdog->delta_interval = delta_interval;
11906d: 89 7a 10 mov %edi,0x10(%edx)
}
ts->Interval_watchdogs.last_snapshot = snapshot;
119070: 89 4b 3c mov %ecx,0x3c(%ebx)
_ISR_Enable( level );
119073: ff 75 e4 pushl -0x1c(%ebp)
119076: 9d popf
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
119077: 83 ec 08 sub $0x8,%esp
11907a: 83 c0 10 add $0x10,%eax
11907d: 50 push %eax
11907e: 8d 43 30 lea 0x30(%ebx),%eax
119081: 50 push %eax
119082: e8 a9 3d 00 00 call 11ce30 <_Watchdog_Insert>
if ( !ts->active ) {
119087: 8a 43 7c mov 0x7c(%ebx),%al
11908a: 83 c4 10 add $0x10,%esp
11908d: 84 c0 test %al,%al
11908f: 0f 85 3d ff ff ff jne 118fd2 <_Timer_server_Schedule_operation_method+0x46>
_Timer_server_Reset_interval_system_watchdog( ts );
119095: 89 d8 mov %ebx,%eax
119097: e8 88 fc ff ff call 118d24 <_Timer_server_Reset_interval_system_watchdog>
11909c: e9 31 ff ff ff jmp 118fd2 <_Timer_server_Schedule_operation_method+0x46>
1190a1: 8d 76 00 lea 0x0(%esi),%esi
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
1190a4: 31 ff xor %edi,%edi
1190a6: eb c5 jmp 11906d <_Timer_server_Schedule_operation_method+0xe1>
}
} else {
/*
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
1190a8: 03 7d d4 add -0x2c(%ebp),%edi
delta_interval += delta;
1190ab: 29 cf sub %ecx,%edi
1190ad: e9 67 ff ff ff jmp 119019 <_Timer_server_Schedule_operation_method+0x8d>
*/
delta = snapshot - last_snapshot;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
1190b2: 31 ff xor %edi,%edi <== NOT EXECUTED
1190b4: e9 60 ff ff ff jmp 119019 <_Timer_server_Schedule_operation_method+0x8d><== NOT EXECUTED
0010fc18 <_Timespec_Divide>:
const struct timespec *lhs,
const struct timespec *rhs,
uint32_t *ival_percentage,
uint32_t *fval_percentage
)
{
10fc18: 55 push %ebp
10fc19: 89 e5 mov %esp,%ebp
10fc1b: 57 push %edi
10fc1c: 56 push %esi
10fc1d: 53 push %ebx
10fc1e: 83 ec 2c sub $0x2c,%esp
10fc21: 8b 45 08 mov 0x8(%ebp),%eax
10fc24: 8b 4d 0c mov 0xc(%ebp),%ecx
/*
* For math simplicity just convert the timespec to nanoseconds
* in a 64-bit integer.
*/
left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
10fc27: 8b 38 mov (%eax),%edi
left += lhs->tv_nsec;
10fc29: 8b 70 04 mov 0x4(%eax),%esi
right = rhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
10fc2c: bb 00 ca 9a 3b mov $0x3b9aca00,%ebx
10fc31: 8b 01 mov (%ecx),%eax
10fc33: f7 eb imul %ebx
10fc35: 89 45 e0 mov %eax,-0x20(%ebp)
10fc38: 89 55 e4 mov %edx,-0x1c(%ebp)
right += rhs->tv_nsec;
10fc3b: 8b 41 04 mov 0x4(%ecx),%eax
10fc3e: 99 cltd
10fc3f: 01 45 e0 add %eax,-0x20(%ebp)
10fc42: 11 55 e4 adc %edx,-0x1c(%ebp)
if ( right == 0 ) {
10fc45: 8b 55 e4 mov -0x1c(%ebp),%edx
10fc48: 0b 55 e0 or -0x20(%ebp),%edx
10fc4b: 74 73 je 10fcc0 <_Timespec_Divide+0xa8>
/*
* For math simplicity just convert the timespec to nanoseconds
* in a 64-bit integer.
*/
left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
10fc4d: 89 f8 mov %edi,%eax
10fc4f: f7 eb imul %ebx
10fc51: 89 45 d0 mov %eax,-0x30(%ebp)
10fc54: 89 55 d4 mov %edx,-0x2c(%ebp)
left += lhs->tv_nsec;
10fc57: 89 f7 mov %esi,%edi
10fc59: c1 ff 1f sar $0x1f,%edi
10fc5c: 01 75 d0 add %esi,-0x30(%ebp)
10fc5f: 11 7d d4 adc %edi,-0x2c(%ebp)
* Put it back in the timespec result.
*
* TODO: Rounding on the last digit of the fval.
*/
answer = (left * 100000) / right;
10fc62: 69 4d d4 a0 86 01 00 imul $0x186a0,-0x2c(%ebp),%ecx
10fc69: bb a0 86 01 00 mov $0x186a0,%ebx
10fc6e: 8b 45 d0 mov -0x30(%ebp),%eax
10fc71: f7 e3 mul %ebx
10fc73: 8d 34 11 lea (%ecx,%edx,1),%esi
10fc76: ff 75 e4 pushl -0x1c(%ebp)
10fc79: ff 75 e0 pushl -0x20(%ebp)
10fc7c: 56 push %esi
10fc7d: 50 push %eax
10fc7e: e8 f9 12 01 00 call 120f7c <__udivdi3>
10fc83: 83 c4 10 add $0x10,%esp
10fc86: 89 c3 mov %eax,%ebx
10fc88: 89 d6 mov %edx,%esi
*ival_percentage = answer / 1000;
10fc8a: 6a 00 push $0x0
10fc8c: 68 e8 03 00 00 push $0x3e8
10fc91: 52 push %edx
10fc92: 50 push %eax
10fc93: e8 e4 12 01 00 call 120f7c <__udivdi3>
10fc98: 83 c4 10 add $0x10,%esp
10fc9b: 8b 55 10 mov 0x10(%ebp),%edx
10fc9e: 89 02 mov %eax,(%edx)
*fval_percentage = answer % 1000;
10fca0: 6a 00 push $0x0
10fca2: 68 e8 03 00 00 push $0x3e8
10fca7: 56 push %esi
10fca8: 53 push %ebx
10fca9: e8 de 13 01 00 call 12108c <__umoddi3>
10fcae: 83 c4 10 add $0x10,%esp
10fcb1: 8b 55 14 mov 0x14(%ebp),%edx
10fcb4: 89 02 mov %eax,(%edx)
}
10fcb6: 8d 65 f4 lea -0xc(%ebp),%esp
10fcb9: 5b pop %ebx
10fcba: 5e pop %esi
10fcbb: 5f pop %edi
10fcbc: c9 leave
10fcbd: c3 ret
10fcbe: 66 90 xchg %ax,%ax
left += lhs->tv_nsec;
right = rhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
right += rhs->tv_nsec;
if ( right == 0 ) {
*ival_percentage = 0;
10fcc0: 8b 45 10 mov 0x10(%ebp),%eax
10fcc3: c7 00 00 00 00 00 movl $0x0,(%eax)
*fval_percentage = 0;
10fcc9: 8b 55 14 mov 0x14(%ebp),%edx
10fccc: c7 02 00 00 00 00 movl $0x0,(%edx)
answer = (left * 100000) / right;
*ival_percentage = answer / 1000;
*fval_percentage = answer % 1000;
}
10fcd2: 8d 65 f4 lea -0xc(%ebp),%esp
10fcd5: 5b pop %ebx
10fcd6: 5e pop %esi
10fcd7: 5f pop %edi
10fcd8: c9 leave
10fcd9: c3 ret
00120060 <_Timespec_Is_valid>:
#include <rtems/score/tod.h>
bool _Timespec_Is_valid(
const struct timespec *time
)
{
120060: 55 push %ebp
120061: 89 e5 mov %esp,%ebp
120063: 8b 45 08 mov 0x8(%ebp),%eax
if ( !time )
120066: 85 c0 test %eax,%eax
120068: 74 1a je 120084 <_Timespec_Is_valid+0x24>
return false;
if ( time->tv_sec < 0 )
12006a: 8b 10 mov (%eax),%edx
12006c: 85 d2 test %edx,%edx
12006e: 78 14 js 120084 <_Timespec_Is_valid+0x24>
return false;
if ( time->tv_nsec < 0 )
120070: 8b 40 04 mov 0x4(%eax),%eax
120073: 85 c0 test %eax,%eax
120075: 78 0d js 120084 <_Timespec_Is_valid+0x24>
#include <rtems/system.h>
#include <rtems/score/timespec.h>
#include <rtems/score/tod.h>
bool _Timespec_Is_valid(
120077: 3d ff c9 9a 3b cmp $0x3b9ac9ff,%eax
12007c: 0f 96 c0 setbe %al
if ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND )
return false;
return true;
}
12007f: c9 leave
120080: c3 ret
120081: 8d 76 00 lea 0x0(%esi),%esi
if ( time->tv_sec < 0 )
return false;
if ( time->tv_nsec < 0 )
return false;
120084: 31 c0 xor %eax,%eax
if ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND )
return false;
return true;
}
120086: c9 leave
120087: c3 ret
001119bc <_Timespec_To_ticks>:
*/
uint32_t _Timespec_To_ticks(
const struct timespec *time
)
{
1119bc: 55 push %ebp
1119bd: 89 e5 mov %esp,%ebp
1119bf: 56 push %esi
1119c0: 53 push %ebx
1119c1: 8b 5d 08 mov 0x8(%ebp),%ebx
uint32_t ticks;
if ( (time->tv_sec == 0) && (time->tv_nsec == 0) )
1119c4: 8b 33 mov (%ebx),%esi
1119c6: 85 f6 test %esi,%esi
1119c8: 75 07 jne 1119d1 <_Timespec_To_ticks+0x15>
1119ca: 8b 43 04 mov 0x4(%ebx),%eax
1119cd: 85 c0 test %eax,%eax
1119cf: 74 37 je 111a08 <_Timespec_To_ticks+0x4c>
return 0;
ticks = time->tv_sec * TOD_TICKS_PER_SECOND;
1119d1: e8 62 17 00 00 call 113138 <TOD_TICKS_PER_SECOND_method>
1119d6: 89 c1 mov %eax,%ecx
1119d8: 0f af ce imul %esi,%ecx
ticks += time->tv_nsec / rtems_configuration_get_nanoseconds_per_tick();
1119db: a1 0c 3b 12 00 mov 0x123b0c,%eax
1119e0: 8d 04 80 lea (%eax,%eax,4),%eax
1119e3: 8d 04 80 lea (%eax,%eax,4),%eax
1119e6: 8d 34 80 lea (%eax,%eax,4),%esi
1119e9: c1 e6 03 shl $0x3,%esi
1119ec: 8b 43 04 mov 0x4(%ebx),%eax
1119ef: 31 d2 xor %edx,%edx
1119f1: f7 f6 div %esi
if (ticks)
1119f3: 01 c8 add %ecx,%eax
1119f5: 74 05 je 1119fc <_Timespec_To_ticks+0x40>
return ticks;
return 1;
}
1119f7: 5b pop %ebx
1119f8: 5e pop %esi
1119f9: c9 leave
1119fa: c3 ret
1119fb: 90 nop
ticks += time->tv_nsec / rtems_configuration_get_nanoseconds_per_tick();
if (ticks)
return ticks;
return 1;
1119fc: b8 01 00 00 00 mov $0x1,%eax
}
111a01: 5b pop %ebx
111a02: 5e pop %esi
111a03: c9 leave
111a04: c3 ret
111a05: 8d 76 00 lea 0x0(%esi),%esi
)
{
uint32_t ticks;
if ( (time->tv_sec == 0) && (time->tv_nsec == 0) )
return 0;
111a08: 31 c0 xor %eax,%eax
if (ticks)
return ticks;
return 1;
}
111a0a: 5b pop %ebx
111a0b: 5e pop %esi
111a0c: c9 leave
111a0d: c3 ret
0010e594 <_User_extensions_Fatal>:
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
10e594: 55 push %ebp
10e595: 89 e5 mov %esp,%ebp
10e597: 57 push %edi
10e598: 56 push %esi
10e599: 53 push %ebx
10e59a: 83 ec 1c sub $0x1c,%esp
10e59d: 8b 75 08 mov 0x8(%ebp),%esi
10e5a0: 8b 7d 10 mov 0x10(%ebp),%edi
10e5a3: 8a 45 0c mov 0xc(%ebp),%al
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
10e5a6: 8b 1d 94 80 12 00 mov 0x128094,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e5ac: 81 fb 8c 80 12 00 cmp $0x12808c,%ebx
10e5b2: 74 25 je 10e5d9 <_User_extensions_Fatal+0x45><== NEVER TAKEN
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
10e5b4: 0f b6 c0 movzbl %al,%eax
10e5b7: 89 45 e4 mov %eax,-0x1c(%ebp)
10e5ba: 66 90 xchg %ax,%ax
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
10e5bc: 8b 43 30 mov 0x30(%ebx),%eax
10e5bf: 85 c0 test %eax,%eax
10e5c1: 74 0b je 10e5ce <_User_extensions_Fatal+0x3a>
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
10e5c3: 52 push %edx
10e5c4: 57 push %edi
10e5c5: ff 75 e4 pushl -0x1c(%ebp)
10e5c8: 56 push %esi
10e5c9: ff d0 call *%eax
10e5cb: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
10e5ce: 8b 5b 04 mov 0x4(%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e5d1: 81 fb 8c 80 12 00 cmp $0x12808c,%ebx
10e5d7: 75 e3 jne 10e5bc <_User_extensions_Fatal+0x28><== ALWAYS TAKEN
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
10e5d9: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10e5dc: 5b pop %ebx <== NOT EXECUTED
10e5dd: 5e pop %esi <== NOT EXECUTED
10e5de: 5f pop %edi <== NOT EXECUTED
10e5df: c9 leave <== NOT EXECUTED
10e5e0: c3 ret <== NOT EXECUTED
0010e458 <_User_extensions_Handler_initialization>:
#include <rtems/score/userext.h>
#include <rtems/score/wkspace.h>
#include <string.h>
void _User_extensions_Handler_initialization(void)
{
10e458: 55 push %ebp
10e459: 89 e5 mov %esp,%ebp
10e45b: 57 push %edi
10e45c: 56 push %esi
10e45d: 53 push %ebx
10e45e: 83 ec 1c sub $0x1c,%esp
User_extensions_Control *extension;
uint32_t i;
uint32_t number_of_extensions;
User_extensions_Table *initial_extensions;
number_of_extensions = Configuration.number_of_initial_extensions;
10e461: a1 3c 3b 12 00 mov 0x123b3c,%eax
10e466: 89 45 dc mov %eax,-0x24(%ebp)
initial_extensions = Configuration.User_extension_table;
10e469: 8b 35 40 3b 12 00 mov 0x123b40,%esi
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10e46f: c7 05 8c 80 12 00 90 movl $0x128090,0x12808c
10e476: 80 12 00
head->previous = NULL;
10e479: c7 05 90 80 12 00 00 movl $0x0,0x128090
10e480: 00 00 00
tail->previous = head;
10e483: c7 05 94 80 12 00 8c movl $0x12808c,0x128094
10e48a: 80 12 00
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10e48d: c7 05 34 7e 12 00 38 movl $0x127e38,0x127e34
10e494: 7e 12 00
head->previous = NULL;
10e497: c7 05 38 7e 12 00 00 movl $0x0,0x127e38
10e49e: 00 00 00
tail->previous = head;
10e4a1: c7 05 3c 7e 12 00 34 movl $0x127e34,0x127e3c
10e4a8: 7e 12 00
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
10e4ab: 85 f6 test %esi,%esi
10e4ad: 74 64 je 10e513 <_User_extensions_Handler_initialization+0xbb><== NEVER TAKEN
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
10e4af: 89 c2 mov %eax,%edx
10e4b1: 8d 04 40 lea (%eax,%eax,2),%eax
10e4b4: 8d 0c 82 lea (%edx,%eax,4),%ecx
10e4b7: c1 e1 02 shl $0x2,%ecx
10e4ba: 83 ec 0c sub $0xc,%esp
10e4bd: 51 push %ecx
10e4be: 89 4d d8 mov %ecx,-0x28(%ebp)
10e4c1: e8 ce 04 00 00 call 10e994 <_Workspace_Allocate_or_fatal_error>
10e4c6: 89 c3 mov %eax,%ebx
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
10e4c8: 31 c0 xor %eax,%eax
10e4ca: 8b 4d d8 mov -0x28(%ebp),%ecx
10e4cd: 89 df mov %ebx,%edi
10e4cf: f3 aa rep stos %al,%es:(%edi)
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
10e4d1: 83 c4 10 add $0x10,%esp
10e4d4: 8b 45 dc mov -0x24(%ebp),%eax
10e4d7: 85 c0 test %eax,%eax
10e4d9: 74 38 je 10e513 <_User_extensions_Handler_initialization+0xbb><== NEVER TAKEN
10e4db: 89 75 e4 mov %esi,-0x1c(%ebp)
10e4de: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
10e4e5: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table(
User_extensions_Control *extension,
const User_extensions_Table *extension_table
)
{
extension->Callouts = *extension_table;
10e4e8: 8d 7b 14 lea 0x14(%ebx),%edi
10e4eb: 8b 75 e4 mov -0x1c(%ebp),%esi
10e4ee: b9 08 00 00 00 mov $0x8,%ecx
10e4f3: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
_User_extensions_Add_set( extension );
10e4f5: 83 ec 0c sub $0xc,%esp
10e4f8: 53 push %ebx
10e4f9: e8 12 35 00 00 call 111a10 <_User_extensions_Add_set>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
10e4fe: 83 c3 34 add $0x34,%ebx
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
10e501: ff 45 e0 incl -0x20(%ebp)
10e504: 83 45 e4 20 addl $0x20,-0x1c(%ebp)
10e508: 83 c4 10 add $0x10,%esp
10e50b: 8b 45 e0 mov -0x20(%ebp),%eax
10e50e: 39 45 dc cmp %eax,-0x24(%ebp)
10e511: 77 d5 ja 10e4e8 <_User_extensions_Handler_initialization+0x90>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
}
}
}
10e513: 8d 65 f4 lea -0xc(%ebp),%esp
10e516: 5b pop %ebx
10e517: 5e pop %esi
10e518: 5f pop %edi
10e519: c9 leave
10e51a: c3 ret
0010f9e0 <_User_extensions_Remove_set>:
#include <rtems/score/userext.h>
void _User_extensions_Remove_set (
User_extensions_Control *the_extension
)
{
10f9e0: 55 push %ebp
10f9e1: 89 e5 mov %esp,%ebp
10f9e3: 53 push %ebx
10f9e4: 83 ec 10 sub $0x10,%esp
10f9e7: 8b 5d 08 mov 0x8(%ebp),%ebx
_Chain_Extract( &the_extension->Node );
10f9ea: 53 push %ebx
10f9eb: e8 ac d9 ff ff call 10d39c <_Chain_Extract>
/*
* If a switch handler is present, remove it.
*/
if ( the_extension->Callouts.thread_switch != NULL )
10f9f0: 83 c4 10 add $0x10,%esp
10f9f3: 8b 43 24 mov 0x24(%ebx),%eax
10f9f6: 85 c0 test %eax,%eax
10f9f8: 74 12 je 10fa0c <_User_extensions_Remove_set+0x2c>
_Chain_Extract( &the_extension->Switch.Node );
10f9fa: 83 c3 08 add $0x8,%ebx
10f9fd: 89 5d 08 mov %ebx,0x8(%ebp)
}
10fa00: 8b 5d fc mov -0x4(%ebp),%ebx
10fa03: c9 leave
/*
* If a switch handler is present, remove it.
*/
if ( the_extension->Callouts.thread_switch != NULL )
_Chain_Extract( &the_extension->Switch.Node );
10fa04: e9 93 d9 ff ff jmp 10d39c <_Chain_Extract>
10fa09: 8d 76 00 lea 0x0(%esi),%esi
}
10fa0c: 8b 5d fc mov -0x4(%ebp),%ebx
10fa0f: c9 leave
10fa10: c3 ret
0010e51c <_User_extensions_Thread_begin>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_begin (
Thread_Control *executing
)
{
10e51c: 55 push %ebp
10e51d: 89 e5 mov %esp,%ebp
10e51f: 56 push %esi
10e520: 53 push %ebx
10e521: 8b 75 08 mov 0x8(%ebp),%esi
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
10e524: 8b 1d 8c 80 12 00 mov 0x12808c,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10e52a: 81 fb 90 80 12 00 cmp $0x128090,%ebx
10e530: 74 1c je 10e54e <_User_extensions_Thread_begin+0x32><== NEVER TAKEN
10e532: 66 90 xchg %ax,%ax
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_begin != NULL )
10e534: 8b 43 28 mov 0x28(%ebx),%eax
10e537: 85 c0 test %eax,%eax
10e539: 74 09 je 10e544 <_User_extensions_Thread_begin+0x28>
(*the_extension->Callouts.thread_begin)( executing );
10e53b: 83 ec 0c sub $0xc,%esp
10e53e: 56 push %esi
10e53f: ff d0 call *%eax
10e541: 83 c4 10 add $0x10,%esp
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
10e544: 8b 1b mov (%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10e546: 81 fb 90 80 12 00 cmp $0x128090,%ebx
10e54c: 75 e6 jne 10e534 <_User_extensions_Thread_begin+0x18>
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_begin != NULL )
(*the_extension->Callouts.thread_begin)( executing );
}
}
10e54e: 8d 65 f8 lea -0x8(%ebp),%esp
10e551: 5b pop %ebx
10e552: 5e pop %esi
10e553: c9 leave
10e554: c3 ret
0010e5e4 <_User_extensions_Thread_create>:
#include <rtems/score/userext.h>
bool _User_extensions_Thread_create (
Thread_Control *the_thread
)
{
10e5e4: 55 push %ebp
10e5e5: 89 e5 mov %esp,%ebp
10e5e7: 56 push %esi
10e5e8: 53 push %ebx
10e5e9: 8b 75 08 mov 0x8(%ebp),%esi
return false;
}
}
return true;
}
10e5ec: 8b 1d 8c 80 12 00 mov 0x12808c,%ebx
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
10e5f2: 81 fb 90 80 12 00 cmp $0x128090,%ebx
10e5f8: 74 26 je 10e620 <_User_extensions_Thread_create+0x3c><== NEVER TAKEN
10e5fa: 66 90 xchg %ax,%ax
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_create != NULL ) {
10e5fc: 8b 43 14 mov 0x14(%ebx),%eax
10e5ff: 85 c0 test %eax,%eax
10e601: 74 13 je 10e616 <_User_extensions_Thread_create+0x32>
status = (*the_extension->Callouts.thread_create)(
10e603: 83 ec 08 sub $0x8,%esp
10e606: 56 push %esi
10e607: ff 35 18 84 12 00 pushl 0x128418
10e60d: ff d0 call *%eax
_Thread_Executing,
the_thread
);
if ( !status )
10e60f: 83 c4 10 add $0x10,%esp
10e612: 84 c0 test %al,%al
10e614: 74 16 je 10e62c <_User_extensions_Thread_create+0x48>
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
10e616: 8b 1b mov (%ebx),%ebx
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
10e618: 81 fb 90 80 12 00 cmp $0x128090,%ebx
10e61e: 75 dc jne 10e5fc <_User_extensions_Thread_create+0x18>
if ( !status )
return false;
}
}
return true;
10e620: b0 01 mov $0x1,%al
}
10e622: 8d 65 f8 lea -0x8(%ebp),%esp
10e625: 5b pop %ebx
10e626: 5e pop %esi
10e627: c9 leave
10e628: c3 ret
10e629: 8d 76 00 lea 0x0(%esi),%esi
status = (*the_extension->Callouts.thread_create)(
_Thread_Executing,
the_thread
);
if ( !status )
return false;
10e62c: 31 c0 xor %eax,%eax
}
}
return true;
}
10e62e: 8d 65 f8 lea -0x8(%ebp),%esp
10e631: 5b pop %ebx
10e632: 5e pop %esi
10e633: c9 leave
10e634: c3 ret
0010e638 <_User_extensions_Thread_delete>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_delete (
Thread_Control *the_thread
)
{
10e638: 55 push %ebp
10e639: 89 e5 mov %esp,%ebp
10e63b: 56 push %esi
10e63c: 53 push %ebx
10e63d: 8b 75 08 mov 0x8(%ebp),%esi
(*the_extension->Callouts.thread_delete)(
_Thread_Executing,
the_thread
);
}
}
10e640: 8b 1d 94 80 12 00 mov 0x128094,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e646: 81 fb 8c 80 12 00 cmp $0x12808c,%ebx
10e64c: 74 23 je 10e671 <_User_extensions_Thread_delete+0x39><== NEVER TAKEN
10e64e: 66 90 xchg %ax,%ax
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_delete != NULL )
10e650: 8b 43 20 mov 0x20(%ebx),%eax
10e653: 85 c0 test %eax,%eax
10e655: 74 0f je 10e666 <_User_extensions_Thread_delete+0x2e>
(*the_extension->Callouts.thread_delete)(
10e657: 83 ec 08 sub $0x8,%esp
10e65a: 56 push %esi
10e65b: ff 35 18 84 12 00 pushl 0x128418
10e661: ff d0 call *%eax
10e663: 83 c4 10 add $0x10,%esp
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
10e666: 8b 5b 04 mov 0x4(%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e669: 81 fb 8c 80 12 00 cmp $0x12808c,%ebx
10e66f: 75 df jne 10e650 <_User_extensions_Thread_delete+0x18>
(*the_extension->Callouts.thread_delete)(
_Thread_Executing,
the_thread
);
}
}
10e671: 8d 65 f8 lea -0x8(%ebp),%esp
10e674: 5b pop %ebx
10e675: 5e pop %esi
10e676: c9 leave
10e677: c3 ret
0010e558 <_User_extensions_Thread_exitted>:
void _User_extensions_Thread_exitted (
Thread_Control *executing
)
{
10e558: 55 push %ebp
10e559: 89 e5 mov %esp,%ebp
10e55b: 56 push %esi
10e55c: 53 push %ebx
10e55d: 8b 75 08 mov 0x8(%ebp),%esi
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
10e560: 8b 1d 94 80 12 00 mov 0x128094,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e566: 81 fb 8c 80 12 00 cmp $0x12808c,%ebx
10e56c: 74 1d je 10e58b <_User_extensions_Thread_exitted+0x33><== NEVER TAKEN
10e56e: 66 90 xchg %ax,%ax
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_exitted != NULL )
10e570: 8b 43 2c mov 0x2c(%ebx),%eax
10e573: 85 c0 test %eax,%eax
10e575: 74 09 je 10e580 <_User_extensions_Thread_exitted+0x28>
(*the_extension->Callouts.thread_exitted)( executing );
10e577: 83 ec 0c sub $0xc,%esp
10e57a: 56 push %esi
10e57b: ff d0 call *%eax
10e57d: 83 c4 10 add $0x10,%esp
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
10e580: 8b 5b 04 mov 0x4(%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e583: 81 fb 8c 80 12 00 cmp $0x12808c,%ebx
10e589: 75 e5 jne 10e570 <_User_extensions_Thread_exitted+0x18>
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_exitted != NULL )
(*the_extension->Callouts.thread_exitted)( executing );
}
}
10e58b: 8d 65 f8 lea -0x8(%ebp),%esp
10e58e: 5b pop %ebx
10e58f: 5e pop %esi
10e590: c9 leave
10e591: c3 ret
0010f23c <_User_extensions_Thread_restart>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_restart (
Thread_Control *the_thread
)
{
10f23c: 55 push %ebp
10f23d: 89 e5 mov %esp,%ebp
10f23f: 56 push %esi
10f240: 53 push %ebx
10f241: 8b 75 08 mov 0x8(%ebp),%esi
(*the_extension->Callouts.thread_restart)(
_Thread_Executing,
the_thread
);
}
}
10f244: 8b 1d ac a3 12 00 mov 0x12a3ac,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10f24a: 81 fb b0 a3 12 00 cmp $0x12a3b0,%ebx
10f250: 74 22 je 10f274 <_User_extensions_Thread_restart+0x38><== NEVER TAKEN
10f252: 66 90 xchg %ax,%ax
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_restart != NULL )
10f254: 8b 43 1c mov 0x1c(%ebx),%eax
10f257: 85 c0 test %eax,%eax
10f259: 74 0f je 10f26a <_User_extensions_Thread_restart+0x2e>
(*the_extension->Callouts.thread_restart)(
10f25b: 83 ec 08 sub $0x8,%esp
10f25e: 56 push %esi
10f25f: ff 35 38 a7 12 00 pushl 0x12a738
10f265: ff d0 call *%eax
10f267: 83 c4 10 add $0x10,%esp
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
10f26a: 8b 1b mov (%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10f26c: 81 fb b0 a3 12 00 cmp $0x12a3b0,%ebx
10f272: 75 e0 jne 10f254 <_User_extensions_Thread_restart+0x18>
(*the_extension->Callouts.thread_restart)(
_Thread_Executing,
the_thread
);
}
}
10f274: 8d 65 f8 lea -0x8(%ebp),%esp
10f277: 5b pop %ebx
10f278: 5e pop %esi
10f279: c9 leave
10f27a: c3 ret
0010e678 <_User_extensions_Thread_start>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_start (
Thread_Control *the_thread
)
{
10e678: 55 push %ebp
10e679: 89 e5 mov %esp,%ebp
10e67b: 56 push %esi
10e67c: 53 push %ebx
10e67d: 8b 75 08 mov 0x8(%ebp),%esi
(*the_extension->Callouts.thread_start)(
_Thread_Executing,
the_thread
);
}
}
10e680: 8b 1d 8c 80 12 00 mov 0x12808c,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10e686: 81 fb 90 80 12 00 cmp $0x128090,%ebx
10e68c: 74 22 je 10e6b0 <_User_extensions_Thread_start+0x38><== NEVER TAKEN
10e68e: 66 90 xchg %ax,%ax
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_start != NULL )
10e690: 8b 43 18 mov 0x18(%ebx),%eax
10e693: 85 c0 test %eax,%eax
10e695: 74 0f je 10e6a6 <_User_extensions_Thread_start+0x2e>
(*the_extension->Callouts.thread_start)(
10e697: 83 ec 08 sub $0x8,%esp
10e69a: 56 push %esi
10e69b: ff 35 18 84 12 00 pushl 0x128418
10e6a1: ff d0 call *%eax
10e6a3: 83 c4 10 add $0x10,%esp
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
10e6a6: 8b 1b mov (%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10e6a8: 81 fb 90 80 12 00 cmp $0x128090,%ebx
10e6ae: 75 e0 jne 10e690 <_User_extensions_Thread_start+0x18>
(*the_extension->Callouts.thread_start)(
_Thread_Executing,
the_thread
);
}
}
10e6b0: 8d 65 f8 lea -0x8(%ebp),%esp
10e6b3: 5b pop %ebx
10e6b4: 5e pop %esi
10e6b5: c9 leave
10e6b6: c3 ret
0010e6b8 <_User_extensions_Thread_switch>:
void _User_extensions_Thread_switch (
Thread_Control *executing,
Thread_Control *heir
)
{
10e6b8: 55 push %ebp
10e6b9: 89 e5 mov %esp,%ebp
10e6bb: 57 push %edi
10e6bc: 56 push %esi
10e6bd: 53 push %ebx
10e6be: 83 ec 0c sub $0xc,%esp
10e6c1: 8b 7d 08 mov 0x8(%ebp),%edi
10e6c4: 8b 75 0c mov 0xc(%ebp),%esi
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
}
}
10e6c7: 8b 1d 34 7e 12 00 mov 0x127e34,%ebx
)
{
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _Chain_First( &_User_extensions_Switches_list );
10e6cd: 81 fb 38 7e 12 00 cmp $0x127e38,%ebx
10e6d3: 74 18 je 10e6ed <_User_extensions_Thread_switch+0x35><== NEVER TAKEN
10e6d5: 8d 76 00 lea 0x0(%esi),%esi
!_Chain_Is_tail( &_User_extensions_Switches_list, the_node ) ;
the_node = the_node->next ) {
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
10e6d8: 83 ec 08 sub $0x8,%esp
10e6db: 56 push %esi
10e6dc: 57 push %edi
10e6dd: ff 53 08 call *0x8(%ebx)
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _Chain_First( &_User_extensions_Switches_list );
!_Chain_Is_tail( &_User_extensions_Switches_list, the_node ) ;
the_node = the_node->next ) {
10e6e0: 8b 1b mov (%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _Chain_First( &_User_extensions_Switches_list );
10e6e2: 83 c4 10 add $0x10,%esp
10e6e5: 81 fb 38 7e 12 00 cmp $0x127e38,%ebx
10e6eb: 75 eb jne 10e6d8 <_User_extensions_Thread_switch+0x20>
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
}
}
10e6ed: 8d 65 f4 lea -0xc(%ebp),%esp
10e6f0: 5b pop %ebx
10e6f1: 5e pop %esi
10e6f2: 5f pop %edi
10e6f3: c9 leave
10e6f4: c3 ret
0010fff8 <_Watchdog_Adjust>:
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
10fff8: 55 push %ebp
10fff9: 89 e5 mov %esp,%ebp
10fffb: 57 push %edi
10fffc: 56 push %esi
10fffd: 53 push %ebx
10fffe: 83 ec 1c sub $0x1c,%esp
110001: 8b 75 08 mov 0x8(%ebp),%esi
110004: 8b 4d 0c mov 0xc(%ebp),%ecx
110007: 8b 5d 10 mov 0x10(%ebp),%ebx
ISR_Level level;
_ISR_Disable( level );
11000a: 9c pushf
11000b: fa cli
11000c: 58 pop %eax
}
}
_ISR_Enable( level );
}
11000d: 8b 16 mov (%esi),%edx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
11000f: 8d 7e 04 lea 0x4(%esi),%edi
110012: 89 7d e4 mov %edi,-0x1c(%ebp)
* hence the compiler must not assume *header to remain
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
110015: 39 fa cmp %edi,%edx
110017: 74 3d je 110056 <_Watchdog_Adjust+0x5e>
switch ( direction ) {
110019: 85 c9 test %ecx,%ecx
11001b: 75 43 jne 110060 <_Watchdog_Adjust+0x68>
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
11001d: 85 db test %ebx,%ebx
11001f: 74 35 je 110056 <_Watchdog_Adjust+0x5e> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
110021: 8b 7a 10 mov 0x10(%edx),%edi
110024: 39 fb cmp %edi,%ebx
110026: 73 0f jae 110037 <_Watchdog_Adjust+0x3f> <== ALWAYS TAKEN
110028: eb 3e jmp 110068 <_Watchdog_Adjust+0x70> <== NOT EXECUTED
11002a: 66 90 xchg %ax,%ax <== NOT EXECUTED
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
11002c: 29 fb sub %edi,%ebx
11002e: 74 26 je 110056 <_Watchdog_Adjust+0x5e> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
110030: 8b 7a 10 mov 0x10(%edx),%edi
110033: 39 df cmp %ebx,%edi
110035: 77 31 ja 110068 <_Watchdog_Adjust+0x70>
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
110037: c7 42 10 01 00 00 00 movl $0x1,0x10(%edx)
_ISR_Enable( level );
11003e: 50 push %eax
11003f: 9d popf
_Watchdog_Tickle( header );
110040: 83 ec 0c sub $0xc,%esp
110043: 56 push %esi
110044: e8 d3 01 00 00 call 11021c <_Watchdog_Tickle>
_ISR_Disable( level );
110049: 9c pushf
11004a: fa cli
11004b: 58 pop %eax
}
}
_ISR_Enable( level );
}
11004c: 8b 16 mov (%esi),%edx
_Watchdog_Tickle( header );
_ISR_Disable( level );
if ( _Chain_Is_empty( header ) )
11004e: 83 c4 10 add $0x10,%esp
110051: 39 55 e4 cmp %edx,-0x1c(%ebp)
110054: 75 d6 jne 11002c <_Watchdog_Adjust+0x34>
}
break;
}
}
_ISR_Enable( level );
110056: 50 push %eax
110057: 9d popf
}
110058: 8d 65 f4 lea -0xc(%ebp),%esp
11005b: 5b pop %ebx
11005c: 5e pop %esi
11005d: 5f pop %edi
11005e: c9 leave
11005f: c3 ret
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
switch ( direction ) {
110060: 49 dec %ecx
110061: 75 f3 jne 110056 <_Watchdog_Adjust+0x5e> <== NEVER TAKEN
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
110063: 01 5a 10 add %ebx,0x10(%edx)
break;
110066: eb ee jmp 110056 <_Watchdog_Adjust+0x5e>
case WATCHDOG_FORWARD:
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
110068: 29 df sub %ebx,%edi
11006a: 89 7a 10 mov %edi,0x10(%edx)
break;
11006d: eb e7 jmp 110056 <_Watchdog_Adjust+0x5e>
0010e6f8 <_Watchdog_Insert>:
void _Watchdog_Insert(
Chain_Control *header,
Watchdog_Control *the_watchdog
)
{
10e6f8: 55 push %ebp
10e6f9: 89 e5 mov %esp,%ebp
10e6fb: 57 push %edi
10e6fc: 56 push %esi
10e6fd: 53 push %ebx
10e6fe: 83 ec 04 sub $0x4,%esp
10e701: 8b 5d 0c mov 0xc(%ebp),%ebx
Watchdog_Control *after;
uint32_t insert_isr_nest_level;
Watchdog_Interval delta_interval;
insert_isr_nest_level = _ISR_Nest_level;
10e704: 8b 3d 14 84 12 00 mov 0x128414,%edi
_ISR_Disable( level );
10e70a: 9c pushf
10e70b: fa cli
10e70c: 8f 45 f0 popl -0x10(%ebp)
/*
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
10e70f: 8b 43 08 mov 0x8(%ebx),%eax
10e712: 85 c0 test %eax,%eax
10e714: 0f 85 9e 00 00 00 jne 10e7b8 <_Watchdog_Insert+0xc0>
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
10e71a: c7 43 08 01 00 00 00 movl $0x1,0x8(%ebx)
_Watchdog_Sync_count++;
10e721: a1 a0 7f 12 00 mov 0x127fa0,%eax
10e726: 40 inc %eax
10e727: a3 a0 7f 12 00 mov %eax,0x127fa0
restart:
delta_interval = the_watchdog->initial;
10e72c: 8b 43 0c mov 0xc(%ebx),%eax
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) _Chain_First( header ) );
10e72f: 8b 4d 08 mov 0x8(%ebp),%ecx
10e732: 8b 11 mov (%ecx),%edx
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
10e734: 85 c0 test %eax,%eax
10e736: 74 5d je 10e795 <_Watchdog_Insert+0x9d>
10e738: 8b 32 mov (%edx),%esi
10e73a: 85 f6 test %esi,%esi
10e73c: 74 57 je 10e795 <_Watchdog_Insert+0x9d>
break;
if ( delta_interval < after->delta_interval ) {
10e73e: 8b 4a 10 mov 0x10(%edx),%ecx
10e741: 39 c8 cmp %ecx,%eax
10e743: 73 22 jae 10e767 <_Watchdog_Insert+0x6f>
10e745: eb 49 jmp 10e790 <_Watchdog_Insert+0x98>
10e747: 90 nop
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
10e748: 8b 35 20 7f 12 00 mov 0x127f20,%esi
10e74e: 39 f7 cmp %esi,%edi
10e750: 72 72 jb 10e7c4 <_Watchdog_Insert+0xcc>
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
break;
}
delta_interval -= after->delta_interval;
10e752: 29 c8 sub %ecx,%eax
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
_Watchdog_Sync_count--;
_ISR_Enable( level );
}
10e754: 8b 12 mov (%edx),%edx
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
10e756: 85 c0 test %eax,%eax
10e758: 74 3b je 10e795 <_Watchdog_Insert+0x9d>
10e75a: 8b 0a mov (%edx),%ecx
10e75c: 85 c9 test %ecx,%ecx
10e75e: 74 35 je 10e795 <_Watchdog_Insert+0x9d>
break;
if ( delta_interval < after->delta_interval ) {
10e760: 8b 4a 10 mov 0x10(%edx),%ecx
10e763: 39 c1 cmp %eax,%ecx
10e765: 77 29 ja 10e790 <_Watchdog_Insert+0x98>
break;
}
delta_interval -= after->delta_interval;
_ISR_Flash( level );
10e767: ff 75 f0 pushl -0x10(%ebp)
10e76a: 9d popf
10e76b: fa cli
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
10e76c: 83 7b 08 01 cmpl $0x1,0x8(%ebx)
10e770: 74 d6 je 10e748 <_Watchdog_Insert+0x50>
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
10e772: 89 3d 20 7f 12 00 mov %edi,0x127f20
_Watchdog_Sync_count--;
10e778: a1 a0 7f 12 00 mov 0x127fa0,%eax
10e77d: 48 dec %eax
10e77e: a3 a0 7f 12 00 mov %eax,0x127fa0
_ISR_Enable( level );
10e783: ff 75 f0 pushl -0x10(%ebp)
10e786: 9d popf
}
10e787: 58 pop %eax
10e788: 5b pop %ebx
10e789: 5e pop %esi
10e78a: 5f pop %edi
10e78b: c9 leave
10e78c: c3 ret
10e78d: 8d 76 00 lea 0x0(%esi),%esi
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
break;
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
10e790: 29 c1 sub %eax,%ecx
10e792: 89 4a 10 mov %ecx,0x10(%edx)
RTEMS_INLINE_ROUTINE void _Watchdog_Activate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_ACTIVE;
10e795: c7 43 08 02 00 00 00 movl $0x2,0x8(%ebx)
}
}
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
10e79c: 89 43 10 mov %eax,0x10(%ebx)
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
10e79f: 8b 42 04 mov 0x4(%edx),%eax
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
10e7a2: 89 43 04 mov %eax,0x4(%ebx)
before_node = after_node->next;
10e7a5: 8b 10 mov (%eax),%edx
after_node->next = the_node;
10e7a7: 89 18 mov %ebx,(%eax)
the_node->next = before_node;
10e7a9: 89 13 mov %edx,(%ebx)
before_node->previous = the_node;
10e7ab: 89 5a 04 mov %ebx,0x4(%edx)
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
10e7ae: a1 a4 7f 12 00 mov 0x127fa4,%eax
10e7b3: 89 43 14 mov %eax,0x14(%ebx)
10e7b6: eb ba jmp 10e772 <_Watchdog_Insert+0x7a>
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
10e7b8: ff 75 f0 pushl -0x10(%ebp)
10e7bb: 9d popf
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
_Watchdog_Sync_count--;
_ISR_Enable( level );
}
10e7bc: 58 pop %eax
10e7bd: 5b pop %ebx
10e7be: 5e pop %esi
10e7bf: 5f pop %edi
10e7c0: c9 leave
10e7c1: c3 ret
10e7c2: 66 90 xchg %ax,%ax
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
_Watchdog_Sync_level = insert_isr_nest_level;
10e7c4: 89 3d 20 7f 12 00 mov %edi,0x127f20
goto restart;
10e7ca: e9 5d ff ff ff jmp 10e72c <_Watchdog_Insert+0x34>
0010e838 <_Watchdog_Remove>:
*/
Watchdog_States _Watchdog_Remove(
Watchdog_Control *the_watchdog
)
{
10e838: 55 push %ebp
10e839: 89 e5 mov %esp,%ebp
10e83b: 56 push %esi
10e83c: 53 push %ebx
10e83d: 8b 55 08 mov 0x8(%ebp),%edx
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
10e840: 9c pushf
10e841: fa cli
10e842: 59 pop %ecx
previous_state = the_watchdog->state;
10e843: 8b 42 08 mov 0x8(%edx),%eax
switch ( previous_state ) {
10e846: 83 f8 01 cmp $0x1,%eax
10e849: 74 4d je 10e898 <_Watchdog_Remove+0x60>
10e84b: 73 0f jae 10e85c <_Watchdog_Remove+0x24>
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
10e84d: 8b 1d a4 7f 12 00 mov 0x127fa4,%ebx
10e853: 89 5a 18 mov %ebx,0x18(%edx)
_ISR_Enable( level );
10e856: 51 push %ecx
10e857: 9d popf
return( previous_state );
}
10e858: 5b pop %ebx
10e859: 5e pop %esi
10e85a: c9 leave
10e85b: c3 ret
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
previous_state = the_watchdog->state;
switch ( previous_state ) {
10e85c: 83 f8 03 cmp $0x3,%eax
10e85f: 77 ec ja 10e84d <_Watchdog_Remove+0x15> <== NEVER TAKEN
break;
case WATCHDOG_ACTIVE:
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
10e861: c7 42 08 00 00 00 00 movl $0x0,0x8(%edx)
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
_ISR_Enable( level );
return( previous_state );
}
10e868: 8b 1a mov (%edx),%ebx
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
next_watchdog = _Watchdog_Next( the_watchdog );
if ( _Watchdog_Next(next_watchdog) )
10e86a: 8b 33 mov (%ebx),%esi
10e86c: 85 f6 test %esi,%esi
10e86e: 74 06 je 10e876 <_Watchdog_Remove+0x3e>
next_watchdog->delta_interval += the_watchdog->delta_interval;
10e870: 8b 72 10 mov 0x10(%edx),%esi
10e873: 01 73 10 add %esi,0x10(%ebx)
if ( _Watchdog_Sync_count )
10e876: 8b 35 a0 7f 12 00 mov 0x127fa0,%esi
10e87c: 85 f6 test %esi,%esi
10e87e: 74 0c je 10e88c <_Watchdog_Remove+0x54>
_Watchdog_Sync_level = _ISR_Nest_level;
10e880: 8b 35 14 84 12 00 mov 0x128414,%esi
10e886: 89 35 20 7f 12 00 mov %esi,0x127f20
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
10e88c: 8b 72 04 mov 0x4(%edx),%esi
next->previous = previous;
10e88f: 89 73 04 mov %esi,0x4(%ebx)
previous->next = next;
10e892: 89 1e mov %ebx,(%esi)
10e894: eb b7 jmp 10e84d <_Watchdog_Remove+0x15>
10e896: 66 90 xchg %ax,%ax
/*
* It is not actually on the chain so just change the state and
* the Insert operation we interrupted will be aborted.
*/
the_watchdog->state = WATCHDOG_INACTIVE;
10e898: c7 42 08 00 00 00 00 movl $0x0,0x8(%edx)
break;
10e89f: eb ac jmp 10e84d <_Watchdog_Remove+0x15>
0010fbec <_Watchdog_Report>:
void _Watchdog_Report(
const char *name,
Watchdog_Control *watch
)
{
10fbec: 55 push %ebp
10fbed: 89 e5 mov %esp,%ebp
10fbef: 57 push %edi
10fbf0: 56 push %esi
10fbf1: 53 push %ebx
10fbf2: 83 ec 2c sub $0x2c,%esp
10fbf5: 8b 55 08 mov 0x8(%ebp),%edx
10fbf8: 8b 45 0c mov 0xc(%ebp),%eax
printk(
10fbfb: 8b 78 24 mov 0x24(%eax),%edi
10fbfe: 8b 70 20 mov 0x20(%eax),%esi
10fc01: 8b 58 1c mov 0x1c(%eax),%ebx
10fc04: 8b 48 0c mov 0xc(%eax),%ecx
10fc07: 89 4d d4 mov %ecx,-0x2c(%ebp)
10fc0a: 8b 48 10 mov 0x10(%eax),%ecx
10fc0d: 89 4d e4 mov %ecx,-0x1c(%ebp)
10fc10: 85 d2 test %edx,%edx
10fc12: 74 2c je 10fc40 <_Watchdog_Report+0x54>
10fc14: b9 63 35 12 00 mov $0x123563,%ecx
10fc19: 83 ec 0c sub $0xc,%esp
10fc1c: 57 push %edi
10fc1d: 56 push %esi
10fc1e: 53 push %ebx
10fc1f: 50 push %eax
10fc20: ff 75 d4 pushl -0x2c(%ebp)
10fc23: ff 75 e4 pushl -0x1c(%ebp)
10fc26: 51 push %ecx
10fc27: 52 push %edx
10fc28: 68 c6 3f 12 00 push $0x123fc6
10fc2d: e8 66 9e ff ff call 109a98 <printk>
10fc32: 83 c4 30 add $0x30,%esp
watch,
watch->routine,
watch->id,
watch->user_data
);
}
10fc35: 8d 65 f4 lea -0xc(%ebp),%esp
10fc38: 5b pop %ebx
10fc39: 5e pop %esi
10fc3a: 5f pop %edi
10fc3b: c9 leave
10fc3c: c3 ret
10fc3d: 8d 76 00 lea 0x0(%esi),%esi
void _Watchdog_Report(
const char *name,
Watchdog_Control *watch
)
{
printk(
10fc40: b9 29 3e 12 00 mov $0x123e29,%ecx
10fc45: 89 ca mov %ecx,%edx
10fc47: eb d0 jmp 10fc19 <_Watchdog_Report+0x2d>
0010fb7c <_Watchdog_Report_chain>:
void _Watchdog_Report_chain(
const char *name,
Chain_Control *header
)
{
10fb7c: 55 push %ebp
10fb7d: 89 e5 mov %esp,%ebp
10fb7f: 57 push %edi
10fb80: 56 push %esi
10fb81: 53 push %ebx
10fb82: 83 ec 20 sub $0x20,%esp
10fb85: 8b 7d 08 mov 0x8(%ebp),%edi
10fb88: 8b 75 0c mov 0xc(%ebp),%esi
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
10fb8b: 9c pushf
10fb8c: fa cli
10fb8d: 8f 45 e4 popl -0x1c(%ebp)
printk( "Watchdog Chain: %s %p\n", name, header );
10fb90: 56 push %esi
10fb91: 57 push %edi
10fb92: 68 90 3f 12 00 push $0x123f90
10fb97: e8 fc 9e ff ff call 109a98 <printk>
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
}
10fb9c: 8b 1e mov (%esi),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10fb9e: 83 c6 04 add $0x4,%esi
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
10fba1: 83 c4 10 add $0x10,%esp
10fba4: 39 f3 cmp %esi,%ebx
10fba6: 74 31 je 10fbd9 <_Watchdog_Report_chain+0x5d>
node != _Chain_Tail(header) ;
node = node->next )
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
10fba8: 83 ec 08 sub $0x8,%esp
10fbab: 53 push %ebx
10fbac: 6a 00 push $0x0
10fbae: e8 39 00 00 00 call 10fbec <_Watchdog_Report>
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
for ( node = _Chain_First( header ) ;
node != _Chain_Tail(header) ;
node = node->next )
10fbb3: 8b 1b mov (%ebx),%ebx
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
for ( node = _Chain_First( header ) ;
10fbb5: 83 c4 10 add $0x10,%esp
10fbb8: 39 f3 cmp %esi,%ebx
10fbba: 75 ec jne 10fba8 <_Watchdog_Report_chain+0x2c><== NEVER TAKEN
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
10fbbc: 83 ec 08 sub $0x8,%esp
10fbbf: 57 push %edi
10fbc0: 68 a7 3f 12 00 push $0x123fa7
10fbc5: e8 ce 9e ff ff call 109a98 <printk>
10fbca: 83 c4 10 add $0x10,%esp
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
10fbcd: ff 75 e4 pushl -0x1c(%ebp)
10fbd0: 9d popf
}
10fbd1: 8d 65 f4 lea -0xc(%ebp),%esp
10fbd4: 5b pop %ebx
10fbd5: 5e pop %esi
10fbd6: 5f pop %edi
10fbd7: c9 leave
10fbd8: c3 ret
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
10fbd9: 83 ec 0c sub $0xc,%esp
10fbdc: 68 b6 3f 12 00 push $0x123fb6
10fbe1: e8 b2 9e ff ff call 109a98 <printk>
10fbe6: 83 c4 10 add $0x10,%esp
10fbe9: eb e2 jmp 10fbcd <_Watchdog_Report_chain+0x51>
0010e8a4 <_Watchdog_Tickle>:
*/
void _Watchdog_Tickle(
Chain_Control *header
)
{
10e8a4: 55 push %ebp
10e8a5: 89 e5 mov %esp,%ebp
10e8a7: 57 push %edi
10e8a8: 56 push %esi
10e8a9: 53 push %ebx
10e8aa: 83 ec 1c sub $0x1c,%esp
10e8ad: 8b 7d 08 mov 0x8(%ebp),%edi
* See the comment in watchdoginsert.c and watchdogadjust.c
* about why it's safe not to declare header a pointer to
* volatile data - till, 2003/7
*/
_ISR_Disable( level );
10e8b0: 9c pushf
10e8b1: fa cli
10e8b2: 5e pop %esi
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
10e8b3: 8b 1f mov (%edi),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10e8b5: 8d 47 04 lea 0x4(%edi),%eax
10e8b8: 89 45 e4 mov %eax,-0x1c(%ebp)
* volatile data - till, 2003/7
*/
_ISR_Disable( level );
if ( _Chain_Is_empty( header ) )
10e8bb: 39 c3 cmp %eax,%ebx
10e8bd: 74 11 je 10e8d0 <_Watchdog_Tickle+0x2c>
* to be inserted has already had its delta_interval adjusted to 0, and
* so is added to the head of the chain with a delta_interval of 0.
*
* Steven Johnson - 12/2005 (gcc-3.2.3 -O3 on powerpc)
*/
if (the_watchdog->delta_interval != 0) {
10e8bf: 8b 43 10 mov 0x10(%ebx),%eax
10e8c2: 85 c0 test %eax,%eax
10e8c4: 74 34 je 10e8fa <_Watchdog_Tickle+0x56>
the_watchdog->delta_interval--;
10e8c6: 48 dec %eax
10e8c7: 89 43 10 mov %eax,0x10(%ebx)
if ( the_watchdog->delta_interval != 0 )
10e8ca: 85 c0 test %eax,%eax
10e8cc: 74 2c je 10e8fa <_Watchdog_Tickle+0x56>
10e8ce: 66 90 xchg %ax,%ax
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
10e8d0: 56 push %esi
10e8d1: 9d popf
}
10e8d2: 8d 65 f4 lea -0xc(%ebp),%esp
10e8d5: 5b pop %ebx
10e8d6: 5e pop %esi
10e8d7: 5f pop %edi
10e8d8: c9 leave
10e8d9: c3 ret
_ISR_Enable( level );
switch( watchdog_state ) {
case WATCHDOG_ACTIVE:
(*the_watchdog->routine)(
10e8da: 83 ec 08 sub $0x8,%esp
10e8dd: ff 73 24 pushl 0x24(%ebx)
10e8e0: ff 73 20 pushl 0x20(%ebx)
10e8e3: ff 53 1c call *0x1c(%ebx)
the_watchdog->id,
the_watchdog->user_data
);
break;
10e8e6: 83 c4 10 add $0x10,%esp
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
10e8e9: 9c pushf
10e8ea: fa cli
10e8eb: 5e pop %esi
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
10e8ec: 8b 1f mov (%edi),%ebx
_ISR_Disable( level );
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
10e8ee: 3b 5d e4 cmp -0x1c(%ebp),%ebx
10e8f1: 74 dd je 10e8d0 <_Watchdog_Tickle+0x2c>
}
_ISR_Disable( level );
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
10e8f3: 8b 43 10 mov 0x10(%ebx),%eax
10e8f6: 85 c0 test %eax,%eax
10e8f8: 75 d6 jne 10e8d0 <_Watchdog_Tickle+0x2c>
if ( the_watchdog->delta_interval != 0 )
goto leave;
}
do {
watchdog_state = _Watchdog_Remove( the_watchdog );
10e8fa: 83 ec 0c sub $0xc,%esp
10e8fd: 53 push %ebx
10e8fe: e8 35 ff ff ff call 10e838 <_Watchdog_Remove>
_ISR_Enable( level );
10e903: 56 push %esi
10e904: 9d popf
switch( watchdog_state ) {
10e905: 83 c4 10 add $0x10,%esp
10e908: 83 f8 02 cmp $0x2,%eax
10e90b: 75 dc jne 10e8e9 <_Watchdog_Tickle+0x45> <== NEVER TAKEN
10e90d: eb cb jmp 10e8da <_Watchdog_Tickle+0x36>
0010e910 <_Workspace_Handler_initialization>:
/*
* _Workspace_Handler_initialization
*/
void _Workspace_Handler_initialization(void)
{
10e910: 55 push %ebp
10e911: 89 e5 mov %esp,%ebp
10e913: 57 push %edi
10e914: 53 push %ebx
uintptr_t memory_available = 0;
void *starting_address = Configuration.work_space_start;
10e915: 8b 1d 00 3b 12 00 mov 0x123b00,%ebx
uintptr_t size = Configuration.work_space_size;
10e91b: 8b 15 04 3b 12 00 mov 0x123b04,%edx
if ( Configuration.do_zero_of_workspace )
10e921: 80 3d 2c 3b 12 00 00 cmpb $0x0,0x123b2c
10e928: 75 1e jne 10e948 <_Workspace_Handler_initialization+0x38>
memset( starting_address, 0, size );
memory_available = _Heap_Initialize(
10e92a: 6a 04 push $0x4
10e92c: 52 push %edx
10e92d: 53 push %ebx
10e92e: 68 60 7e 12 00 push $0x127e60
10e933: e8 b8 dd ff ff call 10c6f0 <_Heap_Initialize>
starting_address,
size,
CPU_HEAP_ALIGNMENT
);
if ( memory_available == 0 )
10e938: 83 c4 10 add $0x10,%esp
10e93b: 85 c0 test %eax,%eax
10e93d: 74 13 je 10e952 <_Workspace_Handler_initialization+0x42>
_Internal_error_Occurred(
INTERNAL_ERROR_CORE,
true,
INTERNAL_ERROR_TOO_LITTLE_WORKSPACE
);
}
10e93f: 8d 65 f8 lea -0x8(%ebp),%esp
10e942: 5b pop %ebx
10e943: 5f pop %edi
10e944: c9 leave
10e945: c3 ret
10e946: 66 90 xchg %ax,%ax
uintptr_t memory_available = 0;
void *starting_address = Configuration.work_space_start;
uintptr_t size = Configuration.work_space_size;
if ( Configuration.do_zero_of_workspace )
memset( starting_address, 0, size );
10e948: 31 c0 xor %eax,%eax
10e94a: 89 df mov %ebx,%edi
10e94c: 89 d1 mov %edx,%ecx
10e94e: f3 aa rep stos %al,%es:(%edi)
10e950: eb d8 jmp 10e92a <_Workspace_Handler_initialization+0x1a>
size,
CPU_HEAP_ALIGNMENT
);
if ( memory_available == 0 )
_Internal_error_Occurred(
10e952: 50 push %eax
10e953: 6a 02 push $0x2
10e955: 6a 01 push $0x1
10e957: 6a 00 push $0x0
10e959: e8 9a df ff ff call 10c8f8 <_Internal_error_Occurred>
0010c4ac <_rename_r>:
int _rename_r(
struct _reent *ptr __attribute__((unused)),
const char *old,
const char *new
)
{
10c4ac: 55 push %ebp
10c4ad: 89 e5 mov %esp,%ebp
10c4af: 57 push %edi
10c4b0: 56 push %esi
10c4b1: 53 push %ebx
10c4b2: 83 ec 78 sub $0x78,%esp
10c4b5: 8b 5d 0c mov 0xc(%ebp),%ebx
/*
* Get the parent node of the old path to be renamed. Find the parent path.
*/
old_parent_pathlen = rtems_filesystem_dirname ( old );
10c4b8: 53 push %ebx
10c4b9: e8 52 ea ff ff call 10af10 <rtems_filesystem_dirname>
if ( old_parent_pathlen == 0 )
10c4be: 83 c4 10 add $0x10,%esp
10c4c1: 85 c0 test %eax,%eax
10c4c3: 0f 85 57 01 00 00 jne 10c620 <_rename_r+0x174>
rtems_filesystem_get_start_loc( old, &i, &old_parent_loc );
10c4c9: 52 push %edx
10c4ca: 8d 45 b8 lea -0x48(%ebp),%eax
10c4cd: 89 45 94 mov %eax,-0x6c(%ebp)
10c4d0: 50 push %eax
10c4d1: 8d 45 e4 lea -0x1c(%ebp),%eax
10c4d4: 50 push %eax
10c4d5: 53 push %ebx
10c4d6: e8 e1 03 00 00 call 10c8bc <rtems_filesystem_get_start_loc>
10c4db: 83 c4 10 add $0x10,%esp
10c4de: 31 d2 xor %edx,%edx
rtems_filesystem_location_info_t old_parent_loc;
rtems_filesystem_location_info_t new_parent_loc;
int i;
int result;
const char *name;
bool free_old_parentloc = false;
10c4e0: c6 45 93 00 movb $0x0,-0x6d(%ebp)
/*
* Start from the parent to find the node that should be under it.
*/
old_loc = old_parent_loc;
10c4e4: 8d 7d cc lea -0x34(%ebp),%edi
10c4e7: b9 05 00 00 00 mov $0x5,%ecx
10c4ec: 8b 75 94 mov -0x6c(%ebp),%esi
10c4ef: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
name = old + old_parent_pathlen;
10c4f1: 01 d3 add %edx,%ebx
10c4f3: 89 5d e0 mov %ebx,-0x20(%ebp)
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
10c4f6: be ff ff ff ff mov $0xffffffff,%esi
10c4fb: 89 f1 mov %esi,%ecx
10c4fd: 89 df mov %ebx,%edi
10c4ff: 31 c0 xor %eax,%eax
10c501: f2 ae repnz scas %es:(%edi),%al
10c503: f7 d1 not %ecx
10c505: 49 dec %ecx
10c506: 83 ec 08 sub $0x8,%esp
10c509: 51 push %ecx
10c50a: 53 push %ebx
10c50b: e8 44 ea ff ff call 10af54 <rtems_filesystem_prefix_separators>
10c510: 01 c3 add %eax,%ebx
10c512: 89 5d e0 mov %ebx,-0x20(%ebp)
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
10c515: 89 f1 mov %esi,%ecx
10c517: 89 df mov %ebx,%edi
10c519: 31 c0 xor %eax,%eax
10c51b: f2 ae repnz scas %es:(%edi),%al
10c51d: f7 d1 not %ecx
10c51f: 49 dec %ecx
10c520: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10c527: 8d 75 cc lea -0x34(%ebp),%esi
10c52a: 56 push %esi
10c52b: 6a 00 push $0x0
10c52d: 51 push %ecx
10c52e: 53 push %ebx
10c52f: e8 30 e9 ff ff call 10ae64 <rtems_filesystem_evaluate_relative_path>
0, &old_loc, false );
if ( result != 0 ) {
10c534: 83 c4 20 add $0x20,%esp
10c537: 85 c0 test %eax,%eax
10c539: 0f 85 c9 00 00 00 jne 10c608 <_rename_r+0x15c>
/*
* Get the parent of the new node we are renaming to.
*/
rtems_filesystem_get_start_loc( new, &i, &new_parent_loc );
10c53f: 50 push %eax
10c540: 8d 5d a4 lea -0x5c(%ebp),%ebx
10c543: 53 push %ebx
10c544: 8d 45 e4 lea -0x1c(%ebp),%eax
10c547: 50 push %eax
10c548: ff 75 10 pushl 0x10(%ebp)
10c54b: e8 6c 03 00 00 call 10c8bc <rtems_filesystem_get_start_loc>
result = (*new_parent_loc.ops->evalformake_h)( &new[i], &new_parent_loc, &name );
10c550: 83 c4 0c add $0xc,%esp
10c553: 8d 45 e0 lea -0x20(%ebp),%eax
10c556: 50 push %eax
10c557: 53 push %ebx
10c558: 8b 45 10 mov 0x10(%ebp),%eax
10c55b: 03 45 e4 add -0x1c(%ebp),%eax
10c55e: 50 push %eax
10c55f: 8b 45 b0 mov -0x50(%ebp),%eax
10c562: ff 50 04 call *0x4(%eax)
if ( result != 0 ) {
10c565: 83 c4 10 add $0x10,%esp
10c568: 85 c0 test %eax,%eax
10c56a: 0f 85 e0 00 00 00 jne 10c650 <_rename_r+0x1a4>
/*
* Check to see if the caller is trying to rename across file system
* boundaries.
*/
if ( old_parent_loc.mt_entry != new_parent_loc.mt_entry ) {
10c570: 8b 45 b4 mov -0x4c(%ebp),%eax
10c573: 39 45 c8 cmp %eax,-0x38(%ebp)
10c576: 75 48 jne 10c5c0 <_rename_r+0x114>
rtems_filesystem_freenode( &old_parent_loc );
rtems_filesystem_freenode( &old_loc );
rtems_set_errno_and_return_minus_one( EXDEV );
}
result = (*new_parent_loc.ops->rename_h)( &old_parent_loc, &old_loc, &new_parent_loc, name );
10c578: ff 75 e0 pushl -0x20(%ebp)
10c57b: 53 push %ebx
10c57c: 56 push %esi
10c57d: ff 75 94 pushl -0x6c(%ebp)
10c580: 8b 45 b0 mov -0x50(%ebp),%eax
10c583: ff 50 40 call *0x40(%eax)
10c586: 89 c7 mov %eax,%edi
rtems_filesystem_freenode( &new_parent_loc );
10c588: 89 1c 24 mov %ebx,(%esp)
10c58b: e8 f0 eb ff ff call 10b180 <rtems_filesystem_freenode>
if ( free_old_parentloc )
10c590: 83 c4 10 add $0x10,%esp
10c593: 80 7d 93 00 cmpb $0x0,-0x6d(%ebp)
10c597: 75 17 jne 10c5b0 <_rename_r+0x104>
rtems_filesystem_freenode( &old_parent_loc );
rtems_filesystem_freenode( &old_loc );
10c599: 83 ec 0c sub $0xc,%esp
10c59c: 56 push %esi
10c59d: e8 de eb ff ff call 10b180 <rtems_filesystem_freenode>
return result;
10c5a2: 83 c4 10 add $0x10,%esp
}
10c5a5: 89 f8 mov %edi,%eax
10c5a7: 8d 65 f4 lea -0xc(%ebp),%esp
10c5aa: 5b pop %ebx
10c5ab: 5e pop %esi
10c5ac: 5f pop %edi
10c5ad: c9 leave
10c5ae: c3 ret
10c5af: 90 nop
result = (*new_parent_loc.ops->rename_h)( &old_parent_loc, &old_loc, &new_parent_loc, name );
rtems_filesystem_freenode( &new_parent_loc );
if ( free_old_parentloc )
rtems_filesystem_freenode( &old_parent_loc );
10c5b0: 83 ec 0c sub $0xc,%esp
10c5b3: ff 75 94 pushl -0x6c(%ebp)
10c5b6: e8 c5 eb ff ff call 10b180 <rtems_filesystem_freenode>
10c5bb: 83 c4 10 add $0x10,%esp
10c5be: eb d9 jmp 10c599 <_rename_r+0xed>
* Check to see if the caller is trying to rename across file system
* boundaries.
*/
if ( old_parent_loc.mt_entry != new_parent_loc.mt_entry ) {
rtems_filesystem_freenode( &new_parent_loc );
10c5c0: 83 ec 0c sub $0xc,%esp
10c5c3: 53 push %ebx
10c5c4: e8 b7 eb ff ff call 10b180 <rtems_filesystem_freenode>
if ( free_old_parentloc )
10c5c9: 83 c4 10 add $0x10,%esp
10c5cc: 80 7d 93 00 cmpb $0x0,-0x6d(%ebp)
10c5d0: 74 0e je 10c5e0 <_rename_r+0x134>
rtems_filesystem_freenode( &old_parent_loc );
10c5d2: 83 ec 0c sub $0xc,%esp
10c5d5: ff 75 94 pushl -0x6c(%ebp)
10c5d8: e8 a3 eb ff ff call 10b180 <rtems_filesystem_freenode>
10c5dd: 83 c4 10 add $0x10,%esp
rtems_filesystem_freenode( &old_loc );
10c5e0: 83 ec 0c sub $0xc,%esp
10c5e3: 56 push %esi
10c5e4: e8 97 eb ff ff call 10b180 <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( EXDEV );
10c5e9: e8 76 a9 00 00 call 116f64 <__errno>
10c5ee: c7 00 12 00 00 00 movl $0x12,(%eax)
10c5f4: 83 c4 10 add $0x10,%esp
10c5f7: bf ff ff ff ff mov $0xffffffff,%edi
if ( free_old_parentloc )
rtems_filesystem_freenode( &old_parent_loc );
rtems_filesystem_freenode( &old_loc );
return result;
}
10c5fc: 89 f8 mov %edi,%eax
10c5fe: 8d 65 f4 lea -0xc(%ebp),%esp
10c601: 5b pop %ebx
10c602: 5e pop %esi
10c603: 5f pop %edi
10c604: c9 leave
10c605: c3 ret
10c606: 66 90 xchg %ax,%ax
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &old_loc, false );
if ( result != 0 ) {
if ( free_old_parentloc )
10c608: 80 7d 93 00 cmpb $0x0,-0x6d(%ebp)
10c60c: 75 78 jne 10c686 <_rename_r+0x1da> <== ALWAYS TAKEN
rtems_filesystem_freenode( &old_parent_loc );
return -1;
10c60e: bf ff ff ff ff mov $0xffffffff,%edi <== NOT EXECUTED
if ( free_old_parentloc )
rtems_filesystem_freenode( &old_parent_loc );
rtems_filesystem_freenode( &old_loc );
return result;
}
10c613: 89 f8 mov %edi,%eax <== NOT EXECUTED
10c615: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10c618: 5b pop %ebx <== NOT EXECUTED
10c619: 5e pop %esi <== NOT EXECUTED
10c61a: 5f pop %edi <== NOT EXECUTED
10c61b: c9 leave <== NOT EXECUTED
10c61c: c3 ret <== NOT EXECUTED
10c61d: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
old_parent_pathlen = rtems_filesystem_dirname ( old );
if ( old_parent_pathlen == 0 )
rtems_filesystem_get_start_loc( old, &i, &old_parent_loc );
else {
result = rtems_filesystem_evaluate_path( old, old_parent_pathlen,
10c620: 89 c2 mov %eax,%edx
10c622: 83 ec 0c sub $0xc,%esp
10c625: 6a 00 push $0x0
10c627: 8d 45 b8 lea -0x48(%ebp),%eax
10c62a: 89 45 94 mov %eax,-0x6c(%ebp)
10c62d: 50 push %eax
10c62e: 6a 02 push $0x2
10c630: 52 push %edx
10c631: 53 push %ebx
10c632: 89 55 8c mov %edx,-0x74(%ebp)
10c635: e8 92 e8 ff ff call 10aecc <rtems_filesystem_evaluate_path>
RTEMS_LIBIO_PERMS_WRITE,
&old_parent_loc,
false );
if ( result != 0 )
10c63a: 83 c4 20 add $0x20,%esp
10c63d: 85 c0 test %eax,%eax
10c63f: 8b 55 8c mov -0x74(%ebp),%edx
10c642: 75 ca jne 10c60e <_rename_r+0x162> <== NEVER TAKEN
return -1;
free_old_parentloc = true;
10c644: c6 45 93 01 movb $0x1,-0x6d(%ebp)
10c648: e9 97 fe ff ff jmp 10c4e4 <_rename_r+0x38>
10c64d: 8d 76 00 lea 0x0(%esi),%esi
rtems_filesystem_get_start_loc( new, &i, &new_parent_loc );
result = (*new_parent_loc.ops->evalformake_h)( &new[i], &new_parent_loc, &name );
if ( result != 0 ) {
rtems_filesystem_freenode( &new_parent_loc );
10c650: 83 ec 0c sub $0xc,%esp
10c653: 53 push %ebx
10c654: e8 27 eb ff ff call 10b180 <rtems_filesystem_freenode>
if ( free_old_parentloc )
10c659: 83 c4 10 add $0x10,%esp
10c65c: 80 7d 93 00 cmpb $0x0,-0x6d(%ebp)
10c660: 74 0e je 10c670 <_rename_r+0x1c4> <== NEVER TAKEN
rtems_filesystem_freenode( &old_parent_loc );
10c662: 83 ec 0c sub $0xc,%esp
10c665: ff 75 94 pushl -0x6c(%ebp)
10c668: e8 13 eb ff ff call 10b180 <rtems_filesystem_freenode>
10c66d: 83 c4 10 add $0x10,%esp
rtems_filesystem_freenode( &old_loc );
10c670: 83 ec 0c sub $0xc,%esp
10c673: 56 push %esi
10c674: e8 07 eb ff ff call 10b180 <rtems_filesystem_freenode>
return -1;
10c679: 83 c4 10 add $0x10,%esp
10c67c: bf ff ff ff ff mov $0xffffffff,%edi
10c681: e9 1f ff ff ff jmp 10c5a5 <_rename_r+0xf9>
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &old_loc, false );
if ( result != 0 ) {
if ( free_old_parentloc )
rtems_filesystem_freenode( &old_parent_loc );
10c686: 83 ec 0c sub $0xc,%esp
10c689: ff 75 94 pushl -0x6c(%ebp)
10c68c: e8 ef ea ff ff call 10b180 <rtems_filesystem_freenode>
10c691: 83 c4 10 add $0x10,%esp
return -1;
10c694: bf ff ff ff ff mov $0xffffffff,%edi
10c699: e9 07 ff ff ff jmp 10c5a5 <_rename_r+0xf9>
0010ad6c <_times>:
#endif
clock_t _times(
struct tms *ptms
)
{
10ad6c: 55 push %ebp
10ad6d: 89 e5 mov %esp,%ebp
10ad6f: 56 push %esi
10ad70: 53 push %ebx
10ad71: 83 ec 10 sub $0x10,%esp
10ad74: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_interval ticks;
if ( !ptms )
10ad77: 85 db test %ebx,%ebx
10ad79: 74 75 je 10adf0 <_times+0x84>
/*
* This call does not depend on TOD being initialized and can't fail.
*/
ticks = rtems_clock_get_ticks_since_boot();
10ad7b: e8 84 04 00 00 call 10b204 <rtems_clock_get_ticks_since_boot>
10ad80: 89 c6 mov %eax,%esi
{
Timestamp_Control per_tick;
uint32_t ticks;
uint32_t fractional_ticks;
_Timestamp_Set(
10ad82: 8b 0d 2c 3e 12 00 mov 0x123e2c,%ecx
10ad88: ba 83 de 1b 43 mov $0x431bde83,%edx
10ad8d: 89 c8 mov %ecx,%eax
10ad8f: f7 e2 mul %edx
10ad91: c1 ea 12 shr $0x12,%edx
10ad94: 89 55 e8 mov %edx,-0x18(%ebp)
10ad97: 8d 04 89 lea (%ecx,%ecx,4),%eax
10ad9a: 8d 04 80 lea (%eax,%eax,4),%eax
10ad9d: 8d 04 80 lea (%eax,%eax,4),%eax
10ada0: c1 e0 03 shl $0x3,%eax
10ada3: b9 00 ca 9a 3b mov $0x3b9aca00,%ecx
10ada8: 31 d2 xor %edx,%edx
10adaa: f7 f1 div %ecx
10adac: 89 55 ec mov %edx,-0x14(%ebp)
TOD_MICROSECONDS_PER_SECOND,
(rtems_configuration_get_nanoseconds_per_tick() %
TOD_NANOSECONDS_PER_SECOND)
);
_Timestamp_Divide(
10adaf: 8d 45 f0 lea -0x10(%ebp),%eax
10adb2: 50 push %eax
10adb3: 8d 45 f4 lea -0xc(%ebp),%eax
10adb6: 50 push %eax
10adb7: 8d 45 e8 lea -0x18(%ebp),%eax
10adba: 50 push %eax
10adbb: a1 38 87 12 00 mov 0x128738,%eax
10adc0: 05 84 00 00 00 add $0x84,%eax
10adc5: 50 push %eax
10adc6: e8 61 38 00 00 call 10e62c <_Timespec_Divide>
&_Thread_Executing->cpu_time_used,
&per_tick,
&ticks,
&fractional_ticks
);
ptms->tms_utime = ticks;
10adcb: 8b 45 f4 mov -0xc(%ebp),%eax
10adce: 89 03 mov %eax,(%ebx)
}
#else
ptms->tms_utime = _Thread_Executing->cpu_time_used;
#endif
ptms->tms_stime = ticks;
10add0: 89 73 04 mov %esi,0x4(%ebx)
ptms->tms_cutime = 0;
10add3: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx)
ptms->tms_cstime = 0;
10adda: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
return ticks;
10ade1: 83 c4 10 add $0x10,%esp
10ade4: 89 f0 mov %esi,%eax
}
10ade6: 8d 65 f8 lea -0x8(%ebp),%esp
10ade9: 5b pop %ebx
10adea: 5e pop %esi
10adeb: c9 leave
10adec: c3 ret
10aded: 8d 76 00 lea 0x0(%esi),%esi
)
{
rtems_interval ticks;
if ( !ptms )
rtems_set_errno_and_return_minus_one( EFAULT );
10adf0: e8 ff 87 00 00 call 1135f4 <__errno>
10adf5: c7 00 0e 00 00 00 movl $0xe,(%eax)
10adfb: b8 ff ff ff ff mov $0xffffffff,%eax
ptms->tms_stime = ticks;
ptms->tms_cutime = 0;
ptms->tms_cstime = 0;
return ticks;
}
10ae00: 8d 65 f8 lea -0x8(%ebp),%esp
10ae03: 5b pop %ebx
10ae04: 5e pop %esi
10ae05: c9 leave
10ae06: c3 ret
00109b3c <access>:
int access(
const char *path,
int amode
)
{
109b3c: 55 push %ebp
109b3d: 89 e5 mov %esp,%ebp
109b3f: 53 push %ebx
109b40: 83 ec 5c sub $0x5c,%esp
109b43: 8b 5d 0c mov 0xc(%ebp),%ebx
struct stat statbuf;
if ( stat(path, &statbuf) )
109b46: 8d 45 b0 lea -0x50(%ebp),%eax
109b49: 50 push %eax
109b4a: ff 75 08 pushl 0x8(%ebp)
109b4d: e8 42 17 00 00 call 10b294 <stat>
109b52: 83 c4 10 add $0x10,%esp
109b55: 85 c0 test %eax,%eax
109b57: 75 1f jne 109b78 <access+0x3c>
return -1;
if ( amode & R_OK ) {
109b59: f6 c3 04 test $0x4,%bl
109b5c: 75 26 jne 109b84 <access+0x48>
if (!( statbuf.st_mode & S_IREAD ))
return -1;
}
if ( amode & W_OK ) {
109b5e: f6 c3 02 test $0x2,%bl
109b61: 75 0d jne 109b70 <access+0x34>
if ( !( statbuf.st_mode & S_IWRITE ) )
return -1;
}
if ( amode & X_OK ) {
109b63: 83 e3 01 and $0x1,%ebx
109b66: 75 24 jne 109b8c <access+0x50>
if ( !( statbuf.st_mode & S_IEXEC ) )
return -1;
}
return 0;
109b68: 31 c0 xor %eax,%eax
}
109b6a: 8b 5d fc mov -0x4(%ebp),%ebx
109b6d: c9 leave
109b6e: c3 ret
109b6f: 90 nop
if (!( statbuf.st_mode & S_IREAD ))
return -1;
}
if ( amode & W_OK ) {
if ( !( statbuf.st_mode & S_IWRITE ) )
109b70: f6 45 bc 80 testb $0x80,-0x44(%ebp)
109b74: 75 ed jne 109b63 <access+0x27>
109b76: 66 90 xchg %ax,%ax
return -1;
109b78: b8 ff ff ff ff mov $0xffffffff,%eax
if ( !( statbuf.st_mode & S_IEXEC ) )
return -1;
}
return 0;
}
109b7d: 8b 5d fc mov -0x4(%ebp),%ebx
109b80: c9 leave
109b81: c3 ret
109b82: 66 90 xchg %ax,%ax
if ( stat(path, &statbuf) )
return -1;
if ( amode & R_OK ) {
if (!( statbuf.st_mode & S_IREAD ))
109b84: f6 45 bd 01 testb $0x1,-0x43(%ebp)
109b88: 75 d4 jne 109b5e <access+0x22>
109b8a: eb ec jmp 109b78 <access+0x3c>
if ( !( statbuf.st_mode & S_IWRITE ) )
return -1;
}
if ( amode & X_OK ) {
if ( !( statbuf.st_mode & S_IEXEC ) )
109b8c: 8b 45 bc mov -0x44(%ebp),%eax
109b8f: 83 e0 40 and $0x40,%eax
return -1;
}
return 0;
109b92: 83 f8 01 cmp $0x1,%eax
109b95: 19 c0 sbb %eax,%eax
109b97: eb d1 jmp 109b6a <access+0x2e>
0010b5d4 <adjtime>:
int adjtime(
struct timeval *delta,
struct timeval *olddelta
)
{
10b5d4: 55 push %ebp
10b5d5: 89 e5 mov %esp,%ebp
10b5d7: 57 push %edi
10b5d8: 56 push %esi
10b5d9: 53 push %ebx
10b5da: 83 ec 1c sub $0x1c,%esp
10b5dd: 8b 5d 08 mov 0x8(%ebp),%ebx
10b5e0: 8b 75 0c mov 0xc(%ebp),%esi
long adjustment;
/*
* Simple validations
*/
if ( !delta )
10b5e3: 85 db test %ebx,%ebx
10b5e5: 0f 84 f1 00 00 00 je 10b6dc <adjtime+0x108>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND )
10b5eb: 8b 53 04 mov 0x4(%ebx),%edx
10b5ee: 81 fa 3f 42 0f 00 cmp $0xf423f,%edx
10b5f4: 0f 87 e2 00 00 00 ja 10b6dc <adjtime+0x108>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( olddelta ) {
10b5fa: 85 f6 test %esi,%esi
10b5fc: 74 10 je 10b60e <adjtime+0x3a>
olddelta->tv_sec = 0;
10b5fe: c7 06 00 00 00 00 movl $0x0,(%esi)
olddelta->tv_usec = 0;
10b604: c7 46 04 00 00 00 00 movl $0x0,0x4(%esi)
10b60b: 8b 53 04 mov 0x4(%ebx),%edx
}
/* convert delta to microseconds */
adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND);
10b60e: 8b 03 mov (%ebx),%eax
10b610: 8d 04 80 lea (%eax,%eax,4),%eax
10b613: 8d 04 80 lea (%eax,%eax,4),%eax
10b616: 8d 04 80 lea (%eax,%eax,4),%eax
10b619: 8d 04 80 lea (%eax,%eax,4),%eax
10b61c: 8d 04 80 lea (%eax,%eax,4),%eax
10b61f: 8d 04 80 lea (%eax,%eax,4),%eax
10b622: c1 e0 06 shl $0x6,%eax
adjustment += delta->tv_usec;
10b625: 8d 04 02 lea (%edx,%eax,1),%eax
/* too small to account for */
if ( adjustment < rtems_configuration_get_microseconds_per_tick() )
10b628: 3b 05 2c 42 12 00 cmp 0x12422c,%eax
10b62e: 73 0c jae 10b63c <adjtime+0x68>
/* set the user's output */
if ( olddelta )
*olddelta = *delta;
return 0;
10b630: 31 c0 xor %eax,%eax
}
10b632: 8d 65 f4 lea -0xc(%ebp),%esp
10b635: 5b pop %ebx
10b636: 5e pop %esi
10b637: 5f pop %edi
10b638: c9 leave
10b639: c3 ret
10b63a: 66 90 xchg %ax,%ax
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b63c: a1 90 86 12 00 mov 0x128690,%eax
10b641: 40 inc %eax
10b642: a3 90 86 12 00 mov %eax,0x128690
* This prevents context switches while we are adjusting the TOD
*/
_Thread_Disable_dispatch();
_TOD_Get( &ts );
10b647: 83 ec 0c sub $0xc,%esp
10b64a: 8d 7d e0 lea -0x20(%ebp),%edi
10b64d: 57 push %edi
10b64e: e8 89 17 00 00 call 10cddc <_TOD_Get>
ts.tv_sec += delta->tv_sec;
10b653: 8b 03 mov (%ebx),%eax
10b655: 01 45 e0 add %eax,-0x20(%ebp)
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
10b658: 8b 43 04 mov 0x4(%ebx),%eax
10b65b: 8d 04 80 lea (%eax,%eax,4),%eax
10b65e: 8d 04 80 lea (%eax,%eax,4),%eax
10b661: 8d 04 80 lea (%eax,%eax,4),%eax
10b664: c1 e0 03 shl $0x3,%eax
10b667: 03 45 e4 add -0x1c(%ebp),%eax
10b66a: 89 45 e4 mov %eax,-0x1c(%ebp)
/* if adjustment is too much positive */
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
10b66d: 83 c4 10 add $0x10,%esp
10b670: 3d ff c9 9a 3b cmp $0x3b9ac9ff,%eax
10b675: 76 18 jbe 10b68f <adjtime+0xbb>
10b677: 8b 55 e0 mov -0x20(%ebp),%edx
10b67a: 66 90 xchg %ax,%ax
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
10b67c: 2d 00 ca 9a 3b sub $0x3b9aca00,%eax
* At one point there was a static variable named adjustment
* used by this implementation. I don't see any reason for it
* to be here based upon the GNU/Linux documentation.
*/
int adjtime(
10b681: 42 inc %edx
ts.tv_sec += delta->tv_sec;
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
/* if adjustment is too much positive */
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
10b682: 3d ff c9 9a 3b cmp $0x3b9ac9ff,%eax
10b687: 77 f3 ja 10b67c <adjtime+0xa8> <== NEVER TAKEN
10b689: 89 45 e4 mov %eax,-0x1c(%ebp)
10b68c: 89 55 e0 mov %edx,-0x20(%ebp)
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec++;
}
/* if adjustment is too much negative */
while ( ts.tv_nsec <= (-1 * TOD_NANOSECONDS_PER_SECOND) ) {
10b68f: 3d 00 36 65 c4 cmp $0xc4653600,%eax
10b694: 77 19 ja 10b6af <adjtime+0xdb> <== NEVER TAKEN
10b696: 8b 55 e0 mov -0x20(%ebp),%edx
10b699: 8d 76 00 lea 0x0(%esi),%esi
ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND;
10b69c: 05 00 ca 9a 3b add $0x3b9aca00,%eax
* At one point there was a static variable named adjustment
* used by this implementation. I don't see any reason for it
* to be here based upon the GNU/Linux documentation.
*/
int adjtime(
10b6a1: 4a dec %edx
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec++;
}
/* if adjustment is too much negative */
while ( ts.tv_nsec <= (-1 * TOD_NANOSECONDS_PER_SECOND) ) {
10b6a2: 3d 00 36 65 c4 cmp $0xc4653600,%eax
10b6a7: 76 f3 jbe 10b69c <adjtime+0xc8>
10b6a9: 89 45 e4 mov %eax,-0x1c(%ebp)
10b6ac: 89 55 e0 mov %edx,-0x20(%ebp)
ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec--;
}
_TOD_Set( &ts );
10b6af: 83 ec 0c sub $0xc,%esp
10b6b2: 57 push %edi
10b6b3: e8 ac 17 00 00 call 10ce64 <_TOD_Set>
_Thread_Enable_dispatch();
10b6b8: e8 ef 2b 00 00 call 10e2ac <_Thread_Enable_dispatch>
/* set the user's output */
if ( olddelta )
10b6bd: 83 c4 10 add $0x10,%esp
10b6c0: 85 f6 test %esi,%esi
10b6c2: 0f 84 68 ff ff ff je 10b630 <adjtime+0x5c>
*olddelta = *delta;
10b6c8: 8b 03 mov (%ebx),%eax
10b6ca: 8b 53 04 mov 0x4(%ebx),%edx
10b6cd: 89 06 mov %eax,(%esi)
10b6cf: 89 56 04 mov %edx,0x4(%esi)
return 0;
10b6d2: 31 c0 xor %eax,%eax
}
10b6d4: 8d 65 f4 lea -0xc(%ebp),%esp
10b6d7: 5b pop %ebx
10b6d8: 5e pop %esi
10b6d9: 5f pop %edi
10b6da: c9 leave
10b6db: c3 ret
*/
if ( !delta )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND )
rtems_set_errno_and_return_minus_one( EINVAL );
10b6dc: e8 e7 86 00 00 call 113dc8 <__errno>
10b6e1: c7 00 16 00 00 00 movl $0x16,(%eax)
10b6e7: b8 ff ff ff ff mov $0xffffffff,%eax
10b6ec: e9 41 ff ff ff jmp 10b632 <adjtime+0x5e>
0010bd14 <aio_cancel>:
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
10bd14: 55 push %ebp
10bd15: 89 e5 mov %esp,%ebp
10bd17: 57 push %edi
10bd18: 56 push %esi
10bd19: 53 push %ebx
10bd1a: 83 ec 18 sub $0x18,%esp
10bd1d: 8b 75 08 mov 0x8(%ebp),%esi
10bd20: 8b 5d 0c mov 0xc(%ebp),%ebx
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
10bd23: 68 80 aa 12 00 push $0x12aa80
10bd28: e8 bf 11 00 00 call 10ceec <pthread_mutex_lock>
if (fcntl (fildes, F_GETFD) < 0) {
10bd2d: 5a pop %edx
10bd2e: 59 pop %ecx
10bd2f: 6a 01 push $0x1
10bd31: 56 push %esi
10bd32: e8 e1 6a 00 00 call 112818 <fcntl>
10bd37: 83 c4 10 add $0x10,%esp
10bd3a: 85 c0 test %eax,%eax
10bd3c: 0f 88 9b 01 00 00 js 10bedd <aio_cancel+0x1c9>
pthread_mutex_unlock(&aio_request_queue.mutex);
rtems_set_errno_and_return_minus_one (EBADF);
}
/* if aiocbp is NULL remove all request for given file descriptor */
if (aiocbp == NULL) {
10bd42: 85 db test %ebx,%ebx
10bd44: 0f 84 ea 00 00 00 je 10be34 <aio_cancel+0x120>
pthread_mutex_unlock (&aio_request_queue.mutex);
return AIO_CANCELED;
} else {
AIO_printf ("Cancel request\n");
if (aiocbp->aio_fildes != fildes) {
10bd4a: 8b 3b mov (%ebx),%edi
10bd4c: 39 f7 cmp %esi,%edi
10bd4e: 0f 85 b8 00 00 00 jne 10be0c <aio_cancel+0xf8>
pthread_mutex_unlock (&aio_request_queue.mutex);
rtems_set_errno_and_return_minus_one (EINVAL);
}
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
10bd54: 56 push %esi
10bd55: 6a 00 push $0x0
10bd57: 57 push %edi
10bd58: 68 c8 aa 12 00 push $0x12aac8
10bd5d: e8 9e 03 00 00 call 10c100 <rtems_aio_search_fd>
10bd62: 89 c6 mov %eax,%esi
if (r_chain == NULL) {
10bd64: 83 c4 10 add $0x10,%esp
10bd67: 85 c0 test %eax,%eax
10bd69: 74 3d je 10bda8 <aio_cancel+0x94>
return AIO_ALLDONE;
}
}
AIO_printf ("Request on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
10bd6b: 8d 78 1c lea 0x1c(%eax),%edi
10bd6e: 83 ec 0c sub $0xc,%esp
10bd71: 57 push %edi
10bd72: e8 75 11 00 00 call 10ceec <pthread_mutex_lock>
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
10bd77: 58 pop %eax
10bd78: 5a pop %edx
10bd79: 53 push %ebx
10bd7a: 83 c6 08 add $0x8,%esi
10bd7d: 56 push %esi
10bd7e: e8 5d 07 00 00 call 10c4e0 <rtems_aio_remove_req>
10bd83: 89 c3 mov %eax,%ebx
pthread_mutex_unlock (&r_chain->mutex);
10bd85: 89 3c 24 mov %edi,(%esp)
10bd88: e8 e7 11 00 00 call 10cf74 <pthread_mutex_unlock>
pthread_mutex_unlock (&aio_request_queue.mutex);
10bd8d: c7 04 24 80 aa 12 00 movl $0x12aa80,(%esp)
10bd94: e8 db 11 00 00 call 10cf74 <pthread_mutex_unlock>
return result;
10bd99: 83 c4 10 add $0x10,%esp
}
return AIO_ALLDONE;
}
10bd9c: 89 d8 mov %ebx,%eax
10bd9e: 8d 65 f4 lea -0xc(%ebp),%esp
10bda1: 5b pop %ebx
10bda2: 5e pop %esi
10bda3: 5f pop %edi
10bda4: c9 leave
10bda5: c3 ret
10bda6: 66 90 xchg %ax,%ax
rtems_set_errno_and_return_minus_one (EINVAL);
}
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
if (r_chain == NULL) {
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
10bda8: 81 3d d4 aa 12 00 d8 cmpl $0x12aad8,0x12aad4
10bdaf: aa 12 00
10bdb2: 74 40 je 10bdf4 <aio_cancel+0xe0> <== NEVER TAKEN
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
10bdb4: 51 push %ecx
10bdb5: 6a 00 push $0x0
10bdb7: 57 push %edi
10bdb8: 68 d4 aa 12 00 push $0x12aad4
10bdbd: e8 3e 03 00 00 call 10c100 <rtems_aio_search_fd>
if (r_chain == NULL) {
10bdc2: 83 c4 10 add $0x10,%esp
10bdc5: 85 c0 test %eax,%eax
10bdc7: 74 43 je 10be0c <aio_cancel+0xf8>
rtems_set_errno_and_return_minus_one (EINVAL);
}
AIO_printf ("Request on [IQ]\n");
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
10bdc9: 83 ec 08 sub $0x8,%esp
10bdcc: 53 push %ebx
10bdcd: 83 c0 08 add $0x8,%eax
10bdd0: 50 push %eax
10bdd1: e8 0a 07 00 00 call 10c4e0 <rtems_aio_remove_req>
10bdd6: 89 c3 mov %eax,%ebx
pthread_mutex_unlock (&aio_request_queue.mutex);
10bdd8: c7 04 24 80 aa 12 00 movl $0x12aa80,(%esp)
10bddf: e8 90 11 00 00 call 10cf74 <pthread_mutex_unlock>
return result;
10bde4: 83 c4 10 add $0x10,%esp
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
}
return AIO_ALLDONE;
}
10bde7: 89 d8 mov %ebx,%eax
10bde9: 8d 65 f4 lea -0xc(%ebp),%esp
10bdec: 5b pop %ebx
10bded: 5e pop %esi
10bdee: 5f pop %edi
10bdef: c9 leave
10bdf0: c3 ret
10bdf1: 8d 76 00 lea 0x0(%esi),%esi
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
} else {
pthread_mutex_unlock (&aio_request_queue.mutex);
10bdf4: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10bdf7: 68 80 aa 12 00 push $0x12aa80 <== NOT EXECUTED
10bdfc: e8 73 11 00 00 call 10cf74 <pthread_mutex_unlock> <== NOT EXECUTED
return AIO_ALLDONE;
10be01: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10be04: bb 02 00 00 00 mov $0x2,%ebx <== NOT EXECUTED
10be09: eb 91 jmp 10bd9c <aio_cancel+0x88> <== NOT EXECUTED
10be0b: 90 nop <== NOT EXECUTED
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
if (r_chain == NULL) {
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
if (r_chain == NULL) {
pthread_mutex_unlock (&aio_request_queue.mutex);
10be0c: 83 ec 0c sub $0xc,%esp
10be0f: 68 80 aa 12 00 push $0x12aa80
10be14: e8 5b 11 00 00 call 10cf74 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EINVAL);
10be19: e8 2e 9e 00 00 call 115c4c <__errno>
10be1e: c7 00 16 00 00 00 movl $0x16,(%eax)
10be24: 83 c4 10 add $0x10,%esp
10be27: bb ff ff ff ff mov $0xffffffff,%ebx
10be2c: e9 6b ff ff ff jmp 10bd9c <aio_cancel+0x88>
10be31: 8d 76 00 lea 0x0(%esi),%esi
/* if aiocbp is NULL remove all request for given file descriptor */
if (aiocbp == NULL) {
AIO_printf ("Cancel all requests\n");
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
10be34: 50 push %eax
10be35: 6a 00 push $0x0
10be37: 56 push %esi
10be38: 68 c8 aa 12 00 push $0x12aac8
10be3d: e8 be 02 00 00 call 10c100 <rtems_aio_search_fd>
10be42: 89 c3 mov %eax,%ebx
if (r_chain == NULL) {
10be44: 83 c4 10 add $0x10,%esp
10be47: 85 c0 test %eax,%eax
10be49: 74 3d je 10be88 <aio_cancel+0x174>
return AIO_ALLDONE;
}
AIO_printf ("Request chain on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
10be4b: 8d 70 1c lea 0x1c(%eax),%esi
10be4e: 83 ec 0c sub $0xc,%esp
10be51: 56 push %esi
10be52: e8 95 10 00 00 call 10ceec <pthread_mutex_lock>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
10be57: 89 1c 24 mov %ebx,(%esp)
10be5a: e8 61 2a 00 00 call 10e8c0 <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
10be5f: 89 1c 24 mov %ebx,(%esp)
10be62: e8 29 06 00 00 call 10c490 <rtems_aio_remove_fd>
pthread_mutex_unlock (&r_chain->mutex);
10be67: 89 34 24 mov %esi,(%esp)
10be6a: e8 05 11 00 00 call 10cf74 <pthread_mutex_unlock>
pthread_mutex_unlock (&aio_request_queue.mutex);
10be6f: c7 04 24 80 aa 12 00 movl $0x12aa80,(%esp)
10be76: e8 f9 10 00 00 call 10cf74 <pthread_mutex_unlock>
return AIO_CANCELED;
10be7b: 83 c4 10 add $0x10,%esp
10be7e: 31 db xor %ebx,%ebx
10be80: e9 17 ff ff ff jmp 10bd9c <aio_cancel+0x88>
10be85: 8d 76 00 lea 0x0(%esi),%esi
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
if (r_chain == NULL) {
AIO_printf ("Request chain not on [WQ]\n");
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
10be88: 81 3d d4 aa 12 00 d8 cmpl $0x12aad8,0x12aad4
10be8f: aa 12 00
10be92: 0f 84 5c ff ff ff je 10bdf4 <aio_cancel+0xe0> <== NEVER TAKEN
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
10be98: 57 push %edi
10be99: 6a 00 push $0x0
10be9b: 56 push %esi
10be9c: 68 d4 aa 12 00 push $0x12aad4
10bea1: e8 5a 02 00 00 call 10c100 <rtems_aio_search_fd>
10bea6: 89 c3 mov %eax,%ebx
if (r_chain == NULL) {
10bea8: 83 c4 10 add $0x10,%esp
10beab: 85 c0 test %eax,%eax
10bead: 74 53 je 10bf02 <aio_cancel+0x1ee>
10beaf: 83 ec 0c sub $0xc,%esp
10beb2: 50 push %eax
10beb3: e8 08 2a 00 00 call 10e8c0 <_Chain_Extract>
}
AIO_printf ("Request chain on [IQ]\n");
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
10beb8: 89 1c 24 mov %ebx,(%esp)
10bebb: e8 d0 05 00 00 call 10c490 <rtems_aio_remove_fd>
pthread_mutex_destroy (&r_chain->mutex);
10bec0: 8d 73 1c lea 0x1c(%ebx),%esi
10bec3: 89 34 24 mov %esi,(%esp)
10bec6: e8 b5 0d 00 00 call 10cc80 <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->mutex);
10becb: 89 34 24 mov %esi,(%esp)
10bece: e8 69 0a 00 00 call 10c93c <pthread_cond_destroy>
free (r_chain);
10bed3: 89 1c 24 mov %ebx,(%esp)
10bed6: e8 59 cc ff ff call 108b34 <free>
10bedb: eb 92 jmp 10be6f <aio_cancel+0x15b>
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
if (fcntl (fildes, F_GETFD) < 0) {
pthread_mutex_unlock(&aio_request_queue.mutex);
10bedd: 83 ec 0c sub $0xc,%esp
10bee0: 68 80 aa 12 00 push $0x12aa80
10bee5: e8 8a 10 00 00 call 10cf74 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EBADF);
10beea: e8 5d 9d 00 00 call 115c4c <__errno>
10beef: c7 00 09 00 00 00 movl $0x9,(%eax)
10bef5: 83 c4 10 add $0x10,%esp
10bef8: bb ff ff ff ff mov $0xffffffff,%ebx
10befd: e9 9a fe ff ff jmp 10bd9c <aio_cancel+0x88>
AIO_printf ("Request chain not on [WQ]\n");
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
if (r_chain == NULL) {
pthread_mutex_unlock(&aio_request_queue.mutex);
10bf02: 83 ec 0c sub $0xc,%esp
10bf05: 68 80 aa 12 00 push $0x12aa80
10bf0a: e8 65 10 00 00 call 10cf74 <pthread_mutex_unlock>
return AIO_ALLDONE;
10bf0f: 83 c4 10 add $0x10,%esp
10bf12: b3 02 mov $0x2,%bl
10bf14: e9 83 fe ff ff jmp 10bd9c <aio_cancel+0x88>
0010bf28 <aio_fsync>:
int aio_fsync(
int op,
struct aiocb *aiocbp
)
{
10bf28: 55 push %ebp
10bf29: 89 e5 mov %esp,%ebp
10bf2b: 53 push %ebx
10bf2c: 83 ec 04 sub $0x4,%esp
10bf2f: 8b 5d 0c mov 0xc(%ebp),%ebx
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
10bf32: 81 7d 08 00 20 00 00 cmpl $0x2000,0x8(%ebp)
10bf39: 75 41 jne 10bf7c <aio_fsync+0x54>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
10bf3b: 83 ec 08 sub $0x8,%esp
10bf3e: 6a 03 push $0x3
10bf40: ff 33 pushl (%ebx)
10bf42: e8 d1 68 00 00 call 112818 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
10bf47: 83 e0 03 and $0x3,%eax
10bf4a: 48 dec %eax
10bf4b: 83 c4 10 add $0x10,%esp
10bf4e: 83 f8 01 cmp $0x1,%eax
10bf51: 77 4d ja 10bfa0 <aio_fsync+0x78>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
req = malloc (sizeof (rtems_aio_request));
10bf53: 83 ec 0c sub $0xc,%esp
10bf56: 6a 18 push $0x18
10bf58: e8 eb d0 ff ff call 109048 <malloc>
if (req == NULL)
10bf5d: 83 c4 10 add $0x10,%esp
10bf60: 85 c0 test %eax,%eax
10bf62: 74 57 je 10bfbb <aio_fsync+0x93> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
10bf64: 89 58 14 mov %ebx,0x14(%eax)
req->aiocbp->aio_lio_opcode = LIO_SYNC;
10bf67: c7 43 2c 03 00 00 00 movl $0x3,0x2c(%ebx)
return rtems_aio_enqueue (req);
10bf6e: 89 45 08 mov %eax,0x8(%ebp)
}
10bf71: 8b 5d fc mov -0x4(%ebp),%ebx
10bf74: c9 leave
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
10bf75: e9 d6 05 00 00 jmp 10c550 <rtems_aio_enqueue>
10bf7a: 66 90 xchg %ax,%ax
{
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
10bf7c: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx)
10bf83: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10bf8a: e8 bd 9c 00 00 call 115c4c <__errno>
10bf8f: c7 00 16 00 00 00 movl $0x16,(%eax)
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
}
10bf95: b8 ff ff ff ff mov $0xffffffff,%eax
10bf9a: 8b 5d fc mov -0x4(%ebp),%ebx
10bf9d: c9 leave
10bf9e: c3 ret
10bf9f: 90 nop
if (op != O_SYNC)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
10bfa0: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx)
10bfa7: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10bfae: e8 99 9c 00 00 call 115c4c <__errno>
10bfb3: c7 00 09 00 00 00 movl $0x9,(%eax)
10bfb9: eb da jmp 10bf95 <aio_fsync+0x6d>
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
10bfbb: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx)
10bfc2: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED
10bfc9: e8 7e 9c 00 00 call 115c4c <__errno> <== NOT EXECUTED
10bfce: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED
10bfd4: eb bf jmp 10bf95 <aio_fsync+0x6d> <== NOT EXECUTED
0010c760 <aio_read>:
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
10c760: 55 push %ebp
10c761: 89 e5 mov %esp,%ebp
10c763: 53 push %ebx
10c764: 83 ec 0c sub $0xc,%esp
10c767: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
10c76a: 6a 03 push $0x3
10c76c: ff 33 pushl (%ebx)
10c76e: e8 a5 60 00 00 call 112818 <fcntl>
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
10c773: 83 c4 10 add $0x10,%esp
10c776: 83 e0 03 and $0x3,%eax
10c779: 74 05 je 10c780 <aio_read+0x20> <== NEVER TAKEN
10c77b: 83 f8 02 cmp $0x2,%eax
10c77e: 75 38 jne 10c7b8 <aio_read+0x58>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
10c780: 8b 53 14 mov 0x14(%ebx),%edx
10c783: 85 d2 test %edx,%edx
10c785: 75 55 jne 10c7dc <aio_read+0x7c>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
10c787: 8b 43 08 mov 0x8(%ebx),%eax
10c78a: 85 c0 test %eax,%eax
10c78c: 78 4e js 10c7dc <aio_read+0x7c>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
10c78e: 83 ec 0c sub $0xc,%esp
10c791: 6a 18 push $0x18
10c793: e8 b0 c8 ff ff call 109048 <malloc>
if (req == NULL)
10c798: 83 c4 10 add $0x10,%esp
10c79b: 85 c0 test %eax,%eax
10c79d: 74 58 je 10c7f7 <aio_read+0x97> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
10c79f: 89 58 14 mov %ebx,0x14(%eax)
req->aiocbp->aio_lio_opcode = LIO_READ;
10c7a2: c7 43 2c 01 00 00 00 movl $0x1,0x2c(%ebx)
return rtems_aio_enqueue (req);
10c7a9: 89 45 08 mov %eax,0x8(%ebp)
}
10c7ac: 8b 5d fc mov -0x4(%ebp),%ebx
10c7af: c9 leave
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
return rtems_aio_enqueue (req);
10c7b0: e9 9b fd ff ff jmp 10c550 <rtems_aio_enqueue>
10c7b5: 8d 76 00 lea 0x0(%esi),%esi
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
10c7b8: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx)
10c7bf: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10c7c6: e8 81 94 00 00 call 115c4c <__errno>
10c7cb: c7 00 09 00 00 00 movl $0x9,(%eax)
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
return rtems_aio_enqueue (req);
}
10c7d1: b8 ff ff ff ff mov $0xffffffff,%eax
10c7d6: 8b 5d fc mov -0x4(%ebp),%ebx
10c7d9: c9 leave
10c7da: c3 ret
10c7db: 90 nop
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
10c7dc: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx)
10c7e3: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10c7ea: e8 5d 94 00 00 call 115c4c <__errno>
10c7ef: c7 00 16 00 00 00 movl $0x16,(%eax)
10c7f5: eb da jmp 10c7d1 <aio_read+0x71>
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
10c7f7: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED
10c7fe: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED
10c805: e8 42 94 00 00 call 115c4c <__errno> <== NOT EXECUTED
10c80a: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED
10c810: eb bf jmp 10c7d1 <aio_read+0x71> <== NOT EXECUTED
0010c820 <aio_write>:
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
10c820: 55 push %ebp
10c821: 89 e5 mov %esp,%ebp
10c823: 53 push %ebx
10c824: 83 ec 0c sub $0xc,%esp
10c827: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
10c82a: 6a 03 push $0x3
10c82c: ff 33 pushl (%ebx)
10c82e: e8 e5 5f 00 00 call 112818 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
10c833: 83 e0 03 and $0x3,%eax
10c836: 48 dec %eax
10c837: 83 c4 10 add $0x10,%esp
10c83a: 83 f8 01 cmp $0x1,%eax
10c83d: 77 35 ja 10c874 <aio_write+0x54>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
10c83f: 8b 53 14 mov 0x14(%ebx),%edx
10c842: 85 d2 test %edx,%edx
10c844: 75 52 jne 10c898 <aio_write+0x78>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
10c846: 8b 43 08 mov 0x8(%ebx),%eax
10c849: 85 c0 test %eax,%eax
10c84b: 78 4b js 10c898 <aio_write+0x78>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
10c84d: 83 ec 0c sub $0xc,%esp
10c850: 6a 18 push $0x18
10c852: e8 f1 c7 ff ff call 109048 <malloc>
if (req == NULL)
10c857: 83 c4 10 add $0x10,%esp
10c85a: 85 c0 test %eax,%eax
10c85c: 74 55 je 10c8b3 <aio_write+0x93> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
10c85e: 89 58 14 mov %ebx,0x14(%eax)
req->aiocbp->aio_lio_opcode = LIO_WRITE;
10c861: c7 43 2c 02 00 00 00 movl $0x2,0x2c(%ebx)
return rtems_aio_enqueue (req);
10c868: 89 45 08 mov %eax,0x8(%ebp)
}
10c86b: 8b 5d fc mov -0x4(%ebp),%ebx
10c86e: c9 leave
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
return rtems_aio_enqueue (req);
10c86f: e9 dc fc ff ff jmp 10c550 <rtems_aio_enqueue>
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
10c874: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx)
10c87b: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10c882: e8 c5 93 00 00 call 115c4c <__errno>
10c887: c7 00 09 00 00 00 movl $0x9,(%eax)
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
return rtems_aio_enqueue (req);
}
10c88d: b8 ff ff ff ff mov $0xffffffff,%eax
10c892: 8b 5d fc mov -0x4(%ebp),%ebx
10c895: c9 leave
10c896: c3 ret
10c897: 90 nop
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
10c898: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx)
10c89f: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10c8a6: e8 a1 93 00 00 call 115c4c <__errno>
10c8ab: c7 00 16 00 00 00 movl $0x16,(%eax)
10c8b1: eb da jmp 10c88d <aio_write+0x6d>
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
10c8b3: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED
10c8ba: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED
10c8c1: e8 86 93 00 00 call 115c4c <__errno> <== NOT EXECUTED
10c8c6: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED
10c8cc: eb bf jmp 10c88d <aio_write+0x6d> <== NOT EXECUTED
001092f0 <cfsetospeed>:
int cfsetospeed(
struct termios *tp,
speed_t speed
)
{
1092f0: 55 push %ebp
1092f1: 89 e5 mov %esp,%ebp
1092f3: 83 ec 08 sub $0x8,%esp
1092f6: 8b 4d 08 mov 0x8(%ebp),%ecx
1092f9: 8b 55 0c mov 0xc(%ebp),%edx
if ( speed & ~CBAUD )
1092fc: f7 c2 f0 ef ff ff test $0xffffeff0,%edx
109302: 75 14 jne 109318 <cfsetospeed+0x28>
rtems_set_errno_and_return_minus_one( EINVAL );
tp->c_cflag = (tp->c_cflag & ~CBAUD) | speed;
109304: 8b 41 08 mov 0x8(%ecx),%eax
109307: 25 f0 ef ff ff and $0xffffeff0,%eax
10930c: 09 d0 or %edx,%eax
10930e: 89 41 08 mov %eax,0x8(%ecx)
return 0;
109311: 31 c0 xor %eax,%eax
}
109313: c9 leave
109314: c3 ret
109315: 8d 76 00 lea 0x0(%esi),%esi
struct termios *tp,
speed_t speed
)
{
if ( speed & ~CBAUD )
rtems_set_errno_and_return_minus_one( EINVAL );
109318: e8 6f bb 00 00 call 114e8c <__errno>
10931d: c7 00 16 00 00 00 movl $0x16,(%eax)
109323: b8 ff ff ff ff mov $0xffffffff,%eax
tp->c_cflag = (tp->c_cflag & ~CBAUD) | speed;
return 0;
}
109328: c9 leave
109329: c3 ret
001106a8 <chdir>:
#include <rtems/seterr.h>
int chdir(
const char *pathname
)
{
1106a8: 55 push %ebp
1106a9: 89 e5 mov %esp,%ebp
1106ab: 57 push %edi
1106ac: 56 push %esi
1106ad: 83 ec 20 sub $0x20,%esp
1106b0: 8b 55 08 mov 0x8(%ebp),%edx
rtems_filesystem_location_info_t loc;
int result;
if ( !pathname )
1106b3: 85 d2 test %edx,%edx
1106b5: 74 75 je 11072c <chdir+0x84>
rtems_set_errno_and_return_minus_one( EFAULT );
/*
* Get the node where we wish to go.
*/
result = rtems_filesystem_evaluate_path(
1106b7: 31 c0 xor %eax,%eax
1106b9: b9 ff ff ff ff mov $0xffffffff,%ecx
1106be: 89 d7 mov %edx,%edi
1106c0: f2 ae repnz scas %es:(%edi),%al
1106c2: f7 d1 not %ecx
1106c4: 49 dec %ecx
1106c5: 83 ec 0c sub $0xc,%esp
1106c8: 6a 01 push $0x1
1106ca: 8d 75 e4 lea -0x1c(%ebp),%esi
1106cd: 56 push %esi
1106ce: 6a 01 push $0x1
1106d0: 51 push %ecx
1106d1: 52 push %edx
1106d2: e8 31 7d ff ff call 108408 <rtems_filesystem_evaluate_path>
pathname, strlen( pathname ), RTEMS_LIBIO_PERMS_SEARCH, &loc, true );
if ( result != 0 )
1106d7: 83 c4 20 add $0x20,%esp
1106da: 85 c0 test %eax,%eax
1106dc: 74 0e je 1106ec <chdir+0x44>
return -1;
1106de: b8 ff ff ff ff mov $0xffffffff,%eax
rtems_filesystem_freenode( &rtems_filesystem_current );
rtems_filesystem_current = loc;
return 0;
}
1106e3: 8d 65 f8 lea -0x8(%ebp),%esp
1106e6: 5e pop %esi
1106e7: 5f pop %edi
1106e8: c9 leave
1106e9: c3 ret
1106ea: 66 90 xchg %ax,%ax
return -1;
/*
* Verify you can change directory into this node.
*/
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
1106ec: 83 ec 0c sub $0xc,%esp
1106ef: 56 push %esi
1106f0: 8b 45 f0 mov -0x10(%ebp),%eax
1106f3: ff 50 10 call *0x10(%eax)
1106f6: 83 c4 10 add $0x10,%esp
1106f9: 48 dec %eax
1106fa: 75 48 jne 110744 <chdir+0x9c>
rtems_filesystem_freenode( &loc );
rtems_set_errno_and_return_minus_one( ENOTDIR );
}
rtems_filesystem_freenode( &rtems_filesystem_current );
1106fc: 83 ec 0c sub $0xc,%esp
1106ff: a1 30 63 12 00 mov 0x126330,%eax
110704: 83 c0 04 add $0x4,%eax
110707: 50 push %eax
110708: e8 d3 7d ff ff call 1084e0 <rtems_filesystem_freenode>
rtems_filesystem_current = loc;
11070d: 8b 3d 30 63 12 00 mov 0x126330,%edi
110713: 83 c7 04 add $0x4,%edi
110716: b9 05 00 00 00 mov $0x5,%ecx
11071b: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return 0;
11071d: 83 c4 10 add $0x10,%esp
110720: 31 c0 xor %eax,%eax
}
110722: 8d 65 f8 lea -0x8(%ebp),%esp
110725: 5e pop %esi
110726: 5f pop %edi
110727: c9 leave
110728: c3 ret
110729: 8d 76 00 lea 0x0(%esi),%esi
{
rtems_filesystem_location_info_t loc;
int result;
if ( !pathname )
rtems_set_errno_and_return_minus_one( EFAULT );
11072c: e8 8f 34 00 00 call 113bc0 <__errno>
110731: c7 00 0e 00 00 00 movl $0xe,(%eax)
110737: b8 ff ff ff ff mov $0xffffffff,%eax
rtems_filesystem_freenode( &rtems_filesystem_current );
rtems_filesystem_current = loc;
return 0;
}
11073c: 8d 65 f8 lea -0x8(%ebp),%esp
11073f: 5e pop %esi
110740: 5f pop %edi
110741: c9 leave
110742: c3 ret
110743: 90 nop
/*
* Verify you can change directory into this node.
*/
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
rtems_filesystem_freenode( &loc );
110744: 83 ec 0c sub $0xc,%esp
110747: 56 push %esi
110748: e8 93 7d ff ff call 1084e0 <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( ENOTDIR );
11074d: e8 6e 34 00 00 call 113bc0 <__errno>
110752: c7 00 14 00 00 00 movl $0x14,(%eax)
110758: 83 c4 10 add $0x10,%esp
11075b: b8 ff ff ff ff mov $0xffffffff,%eax
110760: eb 81 jmp 1106e3 <chdir+0x3b>
00108270 <chroot>:
#include <rtems/seterr.h>
int chroot(
const char *pathname
)
{
108270: 55 push %ebp
108271: 89 e5 mov %esp,%ebp
108273: 57 push %edi
108274: 56 push %esi
108275: 83 ec 20 sub $0x20,%esp
int result;
rtems_filesystem_location_info_t loc;
/* an automatic call to new private env the first time */
if (rtems_current_user_env == &rtems_global_user_env) {
108278: 81 3d 30 63 12 00 20 cmpl $0x128620,0x126330
10827f: 86 12 00
108282: 74 60 je 1082e4 <chroot+0x74>
rtems_libio_set_private_env(); /* try to set a new private env*/
if (rtems_current_user_env == &rtems_global_user_env) /* not ok */
rtems_set_errno_and_return_minus_one( ENOTSUP );
}
result = chdir(pathname);
108284: 83 ec 0c sub $0xc,%esp
108287: ff 75 08 pushl 0x8(%ebp)
10828a: e8 19 84 00 00 call 1106a8 <chdir>
if (result) {
10828f: 83 c4 10 add $0x10,%esp
108292: 85 c0 test %eax,%eax
108294: 75 72 jne 108308 <chroot+0x98>
rtems_set_errno_and_return_minus_one( errno );
}
/* clone the new root location */
if (rtems_filesystem_evaluate_path(".", 1, 0, &loc, 0)) {
108296: 83 ec 0c sub $0xc,%esp
108299: 6a 00 push $0x0
10829b: 8d 75 e4 lea -0x1c(%ebp),%esi
10829e: 56 push %esi
10829f: 6a 00 push $0x0
1082a1: 6a 01 push $0x1
1082a3: 68 76 22 12 00 push $0x122276
1082a8: e8 5b 01 00 00 call 108408 <rtems_filesystem_evaluate_path>
1082ad: 83 c4 20 add $0x20,%esp
1082b0: 85 c0 test %eax,%eax
1082b2: 75 54 jne 108308 <chroot+0x98> <== NEVER TAKEN
/* our cwd has changed, though - but there is no easy way of return :-( */
rtems_set_errno_and_return_minus_one( errno );
}
rtems_filesystem_freenode(&rtems_filesystem_root);
1082b4: 83 ec 0c sub $0xc,%esp
1082b7: a1 30 63 12 00 mov 0x126330,%eax
1082bc: 83 c0 18 add $0x18,%eax
1082bf: 50 push %eax
1082c0: e8 1b 02 00 00 call 1084e0 <rtems_filesystem_freenode>
rtems_filesystem_root = loc;
1082c5: 8b 3d 30 63 12 00 mov 0x126330,%edi
1082cb: 83 c7 18 add $0x18,%edi
1082ce: b9 05 00 00 00 mov $0x5,%ecx
1082d3: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return 0;
1082d5: 83 c4 10 add $0x10,%esp
1082d8: 31 c0 xor %eax,%eax
}
1082da: 8d 65 f8 lea -0x8(%ebp),%esp
1082dd: 5e pop %esi
1082de: 5f pop %edi
1082df: c9 leave
1082e0: c3 ret
1082e1: 8d 76 00 lea 0x0(%esi),%esi
int result;
rtems_filesystem_location_info_t loc;
/* an automatic call to new private env the first time */
if (rtems_current_user_env == &rtems_global_user_env) {
rtems_libio_set_private_env(); /* try to set a new private env*/
1082e4: e8 a7 12 00 00 call 109590 <rtems_libio_set_private_env>
if (rtems_current_user_env == &rtems_global_user_env) /* not ok */
1082e9: 81 3d 30 63 12 00 20 cmpl $0x128620,0x126330
1082f0: 86 12 00
1082f3: 75 8f jne 108284 <chroot+0x14>
rtems_set_errno_and_return_minus_one( ENOTSUP );
1082f5: e8 c6 b8 00 00 call 113bc0 <__errno>
1082fa: c7 00 86 00 00 00 movl $0x86,(%eax)
108300: 83 c8 ff or $0xffffffff,%eax
108303: eb d5 jmp 1082da <chroot+0x6a>
108305: 8d 76 00 lea 0x0(%esi),%esi
}
/* clone the new root location */
if (rtems_filesystem_evaluate_path(".", 1, 0, &loc, 0)) {
/* our cwd has changed, though - but there is no easy way of return :-( */
rtems_set_errno_and_return_minus_one( errno );
108308: e8 b3 b8 00 00 call 113bc0 <__errno>
10830d: 89 c6 mov %eax,%esi
10830f: e8 ac b8 00 00 call 113bc0 <__errno>
108314: 8b 00 mov (%eax),%eax
108316: 89 06 mov %eax,(%esi)
108318: b8 ff ff ff ff mov $0xffffffff,%eax
10831d: eb bb jmp 1082da <chroot+0x6a>
0010b454 <clock_gettime>:
int clock_gettime(
clockid_t clock_id,
struct timespec *tp
)
{
10b454: 55 push %ebp
10b455: 89 e5 mov %esp,%ebp
10b457: 83 ec 08 sub $0x8,%esp
10b45a: 8b 45 08 mov 0x8(%ebp),%eax
10b45d: 8b 55 0c mov 0xc(%ebp),%edx
if ( !tp )
10b460: 85 d2 test %edx,%edx
10b462: 74 14 je 10b478 <clock_gettime+0x24>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
10b464: 83 f8 01 cmp $0x1,%eax
10b467: 74 47 je 10b4b0 <clock_gettime+0x5c>
_TOD_Get(tp);
return 0;
}
#ifdef CLOCK_MONOTONIC
if ( clock_id == CLOCK_MONOTONIC ) {
10b469: 83 f8 04 cmp $0x4,%eax
10b46c: 74 32 je 10b4a0 <clock_gettime+0x4c> <== NEVER TAKEN
return 0;
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME ) {
10b46e: 83 f8 02 cmp $0x2,%eax
10b471: 74 2d je 10b4a0 <clock_gettime+0x4c>
return 0;
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME )
10b473: 83 f8 03 cmp $0x3,%eax
10b476: 74 14 je 10b48c <clock_gettime+0x38>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
10b478: e8 a3 8e 00 00 call 114320 <__errno>
10b47d: c7 00 16 00 00 00 movl $0x16,(%eax)
10b483: b8 ff ff ff ff mov $0xffffffff,%eax
return 0;
}
10b488: c9 leave
10b489: c3 ret
10b48a: 66 90 xchg %ax,%ax
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME )
rtems_set_errno_and_return_minus_one( ENOSYS );
10b48c: e8 8f 8e 00 00 call 114320 <__errno>
10b491: c7 00 58 00 00 00 movl $0x58,(%eax)
10b497: b8 ff ff ff ff mov $0xffffffff,%eax
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
10b49c: c9 leave
10b49d: c3 ret
10b49e: 66 90 xchg %ax,%ax
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME ) {
_TOD_Get_uptime_as_timespec( tp );
10b4a0: 83 ec 0c sub $0xc,%esp
10b4a3: 52 push %edx
10b4a4: e8 a3 1e 00 00 call 10d34c <_TOD_Get_uptime_as_timespec>
return 0;
10b4a9: 83 c4 10 add $0x10,%esp
10b4ac: 31 c0 xor %eax,%eax
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
10b4ae: c9 leave
10b4af: c3 ret
{
if ( !tp )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
_TOD_Get(tp);
10b4b0: 83 ec 0c sub $0xc,%esp
10b4b3: 52 push %edx
10b4b4: e8 3f 1e 00 00 call 10d2f8 <_TOD_Get>
return 0;
10b4b9: 83 c4 10 add $0x10,%esp
10b4bc: 31 c0 xor %eax,%eax
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
10b4be: c9 leave
10b4bf: c3 ret
0010b4c0 <clock_settime>:
int clock_settime(
clockid_t clock_id,
const struct timespec *tp
)
{
10b4c0: 55 push %ebp
10b4c1: 89 e5 mov %esp,%ebp
10b4c3: 83 ec 08 sub $0x8,%esp
10b4c6: 8b 45 08 mov 0x8(%ebp),%eax
10b4c9: 8b 55 0c mov 0xc(%ebp),%edx
if ( !tp )
10b4cc: 85 d2 test %edx,%edx
10b4ce: 74 0f je 10b4df <clock_settime+0x1f> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
10b4d0: 83 f8 01 cmp $0x1,%eax
10b4d3: 74 1f je 10b4f4 <clock_settime+0x34>
_Thread_Disable_dispatch();
_TOD_Set( tp );
_Thread_Enable_dispatch();
}
#ifdef _POSIX_CPUTIME
else if ( clock_id == CLOCK_PROCESS_CPUTIME )
10b4d5: 83 f8 02 cmp $0x2,%eax
10b4d8: 74 42 je 10b51c <clock_settime+0x5c>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME )
10b4da: 83 f8 03 cmp $0x3,%eax
10b4dd: 74 3d je 10b51c <clock_settime+0x5c>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
10b4df: e8 3c 8e 00 00 call 114320 <__errno>
10b4e4: c7 00 16 00 00 00 movl $0x16,(%eax)
10b4ea: b8 ff ff ff ff mov $0xffffffff,%eax
return 0;
}
10b4ef: c9 leave
10b4f0: c3 ret
10b4f1: 8d 76 00 lea 0x0(%esi),%esi
{
if ( !tp )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 )
10b4f4: 81 3a ff e4 da 21 cmpl $0x21dae4ff,(%edx)
10b4fa: 76 e3 jbe 10b4df <clock_settime+0x1f>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b4fc: a1 30 9e 12 00 mov 0x129e30,%eax
10b501: 40 inc %eax
10b502: a3 30 9e 12 00 mov %eax,0x129e30
rtems_set_errno_and_return_minus_one( EINVAL );
_Thread_Disable_dispatch();
_TOD_Set( tp );
10b507: 83 ec 0c sub $0xc,%esp
10b50a: 52 push %edx
10b50b: e8 94 1e 00 00 call 10d3a4 <_TOD_Set>
_Thread_Enable_dispatch();
10b510: e8 d7 32 00 00 call 10e7ec <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
10b515: 83 c4 10 add $0x10,%esp
10b518: 31 c0 xor %eax,%eax
}
10b51a: c9 leave
10b51b: c3 ret
else if ( clock_id == CLOCK_PROCESS_CPUTIME )
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME )
rtems_set_errno_and_return_minus_one( ENOSYS );
10b51c: e8 ff 8d 00 00 call 114320 <__errno>
10b521: c7 00 58 00 00 00 movl $0x58,(%eax)
10b527: b8 ff ff ff ff mov $0xffffffff,%eax
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
10b52c: c9 leave
10b52d: c3 ret
0010fc0c <close>:
#include <rtems/libio_.h>
int close(
int fd
)
{
10fc0c: 55 push %ebp
10fc0d: 89 e5 mov %esp,%ebp
10fc0f: 53 push %ebx
10fc10: 83 ec 14 sub $0x14,%esp
10fc13: 8b 45 08 mov 0x8(%ebp),%eax
rtems_libio_t *iop;
rtems_status_code rc;
rtems_libio_check_fd(fd);
10fc16: 3b 05 2c 3a 12 00 cmp 0x123a2c,%eax
10fc1c: 73 46 jae 10fc64 <close+0x58>
iop = rtems_libio_iop(fd);
10fc1e: c1 e0 03 shl $0x3,%eax
10fc21: 8d 1c c5 00 00 00 00 lea 0x0(,%eax,8),%ebx
10fc28: 29 c3 sub %eax,%ebx
10fc2a: 03 1d c0 7c 12 00 add 0x127cc0,%ebx
rtems_libio_check_is_open(iop);
10fc30: f6 43 15 01 testb $0x1,0x15(%ebx)
10fc34: 74 2e je 10fc64 <close+0x58>
rc = RTEMS_SUCCESSFUL;
rc = (*iop->pathinfo.handlers->close_h)( iop );
10fc36: 83 ec 0c sub $0xc,%esp
10fc39: 8b 43 20 mov 0x20(%ebx),%eax
10fc3c: 53 push %ebx
10fc3d: ff 50 04 call *0x4(%eax)
rtems_filesystem_freenode( &iop->pathinfo );
10fc40: 8d 53 18 lea 0x18(%ebx),%edx
10fc43: 89 14 24 mov %edx,(%esp)
10fc46: 89 45 f4 mov %eax,-0xc(%ebp)
10fc49: e8 52 84 ff ff call 1080a0 <rtems_filesystem_freenode>
rtems_libio_free( iop );
10fc4e: 89 1c 24 mov %ebx,(%esp)
10fc51: e8 26 02 00 00 call 10fe7c <rtems_libio_free>
return rc;
10fc56: 83 c4 10 add $0x10,%esp
10fc59: 8b 45 f4 mov -0xc(%ebp),%eax
}
10fc5c: 8b 5d fc mov -0x4(%ebp),%ebx
10fc5f: c9 leave
10fc60: c3 ret
10fc61: 8d 76 00 lea 0x0(%esi),%esi
rtems_libio_t *iop;
rtems_status_code rc;
rtems_libio_check_fd(fd);
iop = rtems_libio_iop(fd);
rtems_libio_check_is_open(iop);
10fc64: e8 ab 36 00 00 call 113314 <__errno>
10fc69: c7 00 09 00 00 00 movl $0x9,(%eax)
10fc6f: b8 ff ff ff ff mov $0xffffffff,%eax
10fc74: eb e6 jmp 10fc5c <close+0x50>
0010820c <ctermid>:
static char *ctermid_name = "/dev/console";
char *ctermid(
char *s
)
{
10820c: 55 push %ebp
10820d: 89 e5 mov %esp,%ebp
10820f: 57 push %edi
108210: 56 push %esi
108211: 8b 45 08 mov 0x8(%ebp),%eax
if ( !s )
108214: 85 c0 test %eax,%eax
108216: 74 14 je 10822c <ctermid+0x20>
/*
* We have no way of knowing the length of the user provided buffer.
* It may not be large enough but there is no way to know that. :(
* So this is a potential buffer owerrun that we can do nothing about.
*/
strcpy( s, ctermid_name );
108218: be ab df 11 00 mov $0x11dfab,%esi
10821d: b9 0d 00 00 00 mov $0xd,%ecx
108222: 89 c7 mov %eax,%edi
108224: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
return s;
}
108226: 5e pop %esi
108227: 5f pop %edi
108228: c9 leave
108229: c3 ret
10822a: 66 90 xchg %ax,%ax
char *ctermid(
char *s
)
{
if ( !s )
return ctermid_name;
10822c: b8 ab df 11 00 mov $0x11dfab,%eax
* It may not be large enough but there is no way to know that. :(
* So this is a potential buffer owerrun that we can do nothing about.
*/
strcpy( s, ctermid_name );
return s;
}
108231: 5e pop %esi
108232: 5f pop %edi
108233: c9 leave
108234: c3 ret
0010ee58 <devFS_evaluate_path>:
const char *pathname,
size_t pathnamelen,
int flags,
rtems_filesystem_location_info_t *pathloc
)
{
10ee58: 55 push %ebp
10ee59: 89 e5 mov %esp,%ebp
10ee5b: 57 push %edi
10ee5c: 56 push %esi
10ee5d: 53 push %ebx
10ee5e: 83 ec 1c sub $0x1c,%esp
int i;
rtems_device_name_t *device_name_table;
/* see if 'flags' is valid */
if ( !rtems_libio_is_valid_perms( flags ) )
10ee61: f7 45 10 f8 ff ff ff testl $0xfffffff8,0x10(%ebp)
10ee68: 0f 85 96 00 00 00 jne 10ef04 <devFS_evaluate_path+0xac><== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EPERM );
/* get the device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
10ee6e: 8b 45 14 mov 0x14(%ebp),%eax
10ee71: 8b 00 mov (%eax),%eax
10ee73: 89 45 e4 mov %eax,-0x1c(%ebp)
if (!device_name_table)
10ee76: 85 c0 test %eax,%eax
10ee78: 0f 84 98 00 00 00 je 10ef16 <devFS_evaluate_path+0xbe>
rtems_set_errno_and_return_minus_one( EFAULT );
for (i = 0; i < rtems_device_table_size; i++) {
10ee7e: 8b 15 d0 15 12 00 mov 0x1215d0,%edx
10ee84: 89 55 e0 mov %edx,-0x20(%ebp)
10ee87: 85 d2 test %edx,%edx
10ee89: 74 38 je 10eec3 <devFS_evaluate_path+0x6b><== NEVER TAKEN
10ee8b: 31 c0 xor %eax,%eax
10ee8d: 31 db xor %ebx,%ebx
if (!device_name_table[i].device_name)
10ee8f: 8d 04 80 lea (%eax,%eax,4),%eax
10ee92: 8b 55 e4 mov -0x1c(%ebp),%edx
10ee95: 8d 3c 82 lea (%edx,%eax,4),%edi
10ee98: 8b 37 mov (%edi),%esi
10ee9a: 85 f6 test %esi,%esi
10ee9c: 74 1d je 10eebb <devFS_evaluate_path+0x63>
continue;
if (strncmp(pathname, device_name_table[i].device_name, pathnamelen) != 0)
10ee9e: 50 push %eax
10ee9f: ff 75 0c pushl 0xc(%ebp)
10eea2: 56 push %esi
10eea3: ff 75 08 pushl 0x8(%ebp)
10eea6: e8 79 32 00 00 call 112124 <strncmp>
10eeab: 83 c4 10 add $0x10,%esp
10eeae: 85 c0 test %eax,%eax
10eeb0: 75 09 jne 10eebb <devFS_evaluate_path+0x63>
continue;
if (device_name_table[i].device_name[pathnamelen] != '\0')
10eeb2: 8b 45 0c mov 0xc(%ebp),%eax
10eeb5: 80 3c 06 00 cmpb $0x0,(%esi,%eax,1)
10eeb9: 74 21 je 10eedc <devFS_evaluate_path+0x84><== ALWAYS TAKEN
/* get the device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
for (i = 0; i < rtems_device_table_size; i++) {
10eebb: 43 inc %ebx
10eebc: 89 d8 mov %ebx,%eax
10eebe: 39 5d e0 cmp %ebx,-0x20(%ebp)
10eec1: 77 cc ja 10ee8f <devFS_evaluate_path+0x37>
pathloc->mt_entry = rtems_filesystem_root.mt_entry;
return 0;
}
/* no such file or directory */
rtems_set_errno_and_return_minus_one( ENOENT );
10eec3: e8 20 26 00 00 call 1114e8 <__errno>
10eec8: c7 00 02 00 00 00 movl $0x2,(%eax)
10eece: b8 ff ff ff ff mov $0xffffffff,%eax
}
10eed3: 8d 65 f4 lea -0xc(%ebp),%esp
10eed6: 5b pop %ebx
10eed7: 5e pop %esi
10eed8: 5f pop %edi
10eed9: c9 leave
10eeda: c3 ret
10eedb: 90 nop
if (device_name_table[i].device_name[pathnamelen] != '\0')
continue;
/* find the device, set proper values */
pathloc->node_access = (void *)&device_name_table[i];
10eedc: 8b 55 14 mov 0x14(%ebp),%edx
10eedf: 89 3a mov %edi,(%edx)
pathloc->handlers = &devFS_file_handlers;
10eee1: c7 42 08 20 35 12 00 movl $0x123520,0x8(%edx)
pathloc->ops = &devFS_ops;
10eee8: c7 42 0c c0 34 12 00 movl $0x1234c0,0xc(%edx)
pathloc->mt_entry = rtems_filesystem_root.mt_entry;
10eeef: a1 90 36 12 00 mov 0x123690,%eax
10eef4: 8b 40 28 mov 0x28(%eax),%eax
10eef7: 89 42 10 mov %eax,0x10(%edx)
return 0;
10eefa: 31 c0 xor %eax,%eax
}
/* no such file or directory */
rtems_set_errno_and_return_minus_one( ENOENT );
}
10eefc: 8d 65 f4 lea -0xc(%ebp),%esp
10eeff: 5b pop %ebx
10ef00: 5e pop %esi
10ef01: 5f pop %edi
10ef02: c9 leave
10ef03: c3 ret
int i;
rtems_device_name_t *device_name_table;
/* see if 'flags' is valid */
if ( !rtems_libio_is_valid_perms( flags ) )
rtems_set_errno_and_return_minus_one( EPERM );
10ef04: e8 df 25 00 00 call 1114e8 <__errno>
10ef09: c7 00 01 00 00 00 movl $0x1,(%eax)
10ef0f: b8 ff ff ff ff mov $0xffffffff,%eax
10ef14: eb e6 jmp 10eefc <devFS_evaluate_path+0xa4>
/* get the device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
10ef16: e8 cd 25 00 00 call 1114e8 <__errno>
10ef1b: c7 00 0e 00 00 00 movl $0xe,(%eax)
10ef21: 83 c8 ff or $0xffffffff,%eax
10ef24: eb d6 jmp 10eefc <devFS_evaluate_path+0xa4>
00107ae0 <devFS_ioctl>:
int devFS_ioctl(
rtems_libio_t *iop,
uint32_t command,
void *buffer
)
{
107ae0: 55 push %ebp
107ae1: 89 e5 mov %esp,%ebp
107ae3: 83 ec 1c sub $0x1c,%esp
107ae6: 8b 55 08 mov 0x8(%ebp),%edx
rtems_libio_ioctl_args_t args;
rtems_status_code status;
rtems_device_name_t *np;
np = (rtems_device_name_t *)iop->pathinfo.node_access;
107ae9: 8b 42 18 mov 0x18(%edx),%eax
args.iop = iop;
107aec: 89 55 e8 mov %edx,-0x18(%ebp)
args.command = command;
107aef: 8b 55 0c mov 0xc(%ebp),%edx
107af2: 89 55 ec mov %edx,-0x14(%ebp)
args.buffer = buffer;
107af5: 8b 55 10 mov 0x10(%ebp),%edx
107af8: 89 55 f0 mov %edx,-0x10(%ebp)
status = rtems_io_control(
np->major,
np->minor,
(void *) &args
107afb: 8d 55 e8 lea -0x18(%ebp),%edx
args.iop = iop;
args.command = command;
args.buffer = buffer;
status = rtems_io_control(
107afe: 52 push %edx
107aff: ff 70 0c pushl 0xc(%eax)
107b02: ff 70 08 pushl 0x8(%eax)
107b05: e8 22 40 00 00 call 10bb2c <rtems_io_control>
np->major,
np->minor,
(void *) &args
);
if ( status )
107b0a: 83 c4 10 add $0x10,%esp
107b0d: 85 c0 test %eax,%eax
107b0f: 75 07 jne 107b18 <devFS_ioctl+0x38>
return rtems_deviceio_errno(status);
return args.ioctl_return;
107b11: 8b 45 f4 mov -0xc(%ebp),%eax
}
107b14: c9 leave
107b15: c3 ret
107b16: 66 90 xchg %ax,%ax
np->minor,
(void *) &args
);
if ( status )
return rtems_deviceio_errno(status);
107b18: 83 ec 0c sub $0xc,%esp
107b1b: 50 push %eax
107b1c: e8 17 74 00 00 call 10ef38 <rtems_deviceio_errno>
107b21: 83 c4 10 add $0x10,%esp
return args.ioctl_return;
}
107b24: c9 leave
107b25: c3 ret
00107924 <devFS_mknod>:
const char *path,
mode_t mode,
dev_t dev,
rtems_filesystem_location_info_t *pathloc
)
{
107924: 55 push %ebp
107925: 89 e5 mov %esp,%ebp
107927: 57 push %edi
107928: 56 push %esi
107929: 53 push %ebx
10792a: 83 ec 1c sub $0x1c,%esp
10792d: 8b 7d 08 mov 0x8(%ebp),%edi
107930: 8b 4d 10 mov 0x10(%ebp),%ecx
107933: 8b 55 14 mov 0x14(%ebp),%edx
* condition and do not create the '/dev' and the 'path'
* actually passed in is 'dev', not '/dev'. Just return 0 to
* indicate we are OK.
*/
if ((path[0] == 'd') && (path[1] == 'e') &&
107936: 80 3f 64 cmpb $0x64,(%edi)
107939: 0f 84 dd 00 00 00 je 107a1c <devFS_mknod+0xf8>
(path[2] == 'v') && (path[3] == '\0'))
return 0;
/* must be a character device or a block device */
if (!S_ISBLK(mode) && !S_ISCHR(mode))
10793f: 8b 45 0c mov 0xc(%ebp),%eax
107942: 25 00 f0 00 00 and $0xf000,%eax
107947: 3d 00 60 00 00 cmp $0x6000,%eax
10794c: 74 0b je 107959 <devFS_mknod+0x35>
10794e: 3d 00 20 00 00 cmp $0x2000,%eax
107953: 0f 85 e5 00 00 00 jne 107a3e <devFS_mknod+0x11a>
)
{
union __rtems_dev_t temp;
temp.device = device;
return temp.__overlay.major;
107959: 89 4d dc mov %ecx,-0x24(%ebp)
dev_t device
)
{
union __rtems_dev_t temp;
temp.device = device;
10795c: 89 55 d8 mov %edx,-0x28(%ebp)
rtems_set_errno_and_return_minus_one( EINVAL );
else
rtems_filesystem_split_dev_t(dev, major, minor);
/* Find an empty slot in device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
10795f: 8b 45 18 mov 0x18(%ebp),%eax
107962: 8b 30 mov (%eax),%esi
if (!device_name_table)
107964: 85 f6 test %esi,%esi
107966: 0f 84 f4 00 00 00 je 107a60 <devFS_mknod+0x13c>
rtems_set_errno_and_return_minus_one( EFAULT );
for (slot = -1, i = 0; i < rtems_device_table_size; i++){
10796c: 8b 15 d0 15 12 00 mov 0x1215d0,%edx
107972: 85 d2 test %edx,%edx
107974: 0f 84 d6 00 00 00 je 107a50 <devFS_mknod+0x12c>
10797a: 31 c0 xor %eax,%eax
10797c: c7 45 e0 ff ff ff ff movl $0xffffffff,-0x20(%ebp)
107983: 31 db xor %ebx,%ebx
107985: 89 7d e4 mov %edi,-0x1c(%ebp)
107988: 89 d7 mov %edx,%edi
10798a: eb 1a jmp 1079a6 <devFS_mknod+0x82>
if (device_name_table[i].device_name == NULL)
slot = i;
else
if (strcmp(path, device_name_table[i].device_name) == 0)
10798c: 83 ec 08 sub $0x8,%esp
10798f: 50 push %eax
107990: ff 75 e4 pushl -0x1c(%ebp)
107993: e8 34 a7 00 00 call 1120cc <strcmp>
107998: 83 c4 10 add $0x10,%esp
10799b: 85 c0 test %eax,%eax
10799d: 74 65 je 107a04 <devFS_mknod+0xe0>
/* Find an empty slot in device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
for (slot = -1, i = 0; i < rtems_device_table_size; i++){
10799f: 43 inc %ebx
1079a0: 89 d8 mov %ebx,%eax
1079a2: 39 fb cmp %edi,%ebx
1079a4: 73 16 jae 1079bc <devFS_mknod+0x98>
if (device_name_table[i].device_name == NULL)
1079a6: 8d 04 80 lea (%eax,%eax,4),%eax
1079a9: 8b 04 86 mov (%esi,%eax,4),%eax
1079ac: 85 c0 test %eax,%eax
1079ae: 75 dc jne 10798c <devFS_mknod+0x68>
1079b0: 89 5d e0 mov %ebx,-0x20(%ebp)
/* Find an empty slot in device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
for (slot = -1, i = 0; i < rtems_device_table_size; i++){
1079b3: 43 inc %ebx
1079b4: 89 d8 mov %ebx,%eax
1079b6: 39 fb cmp %edi,%ebx
1079b8: 72 ec jb 1079a6 <devFS_mknod+0x82>
1079ba: 66 90 xchg %ax,%ax
1079bc: 8b 7d e4 mov -0x1c(%ebp),%edi
else
if (strcmp(path, device_name_table[i].device_name) == 0)
rtems_set_errno_and_return_minus_one( EEXIST );
}
if (slot == -1)
1079bf: 83 7d e0 ff cmpl $0xffffffff,-0x20(%ebp)
1079c3: 0f 84 87 00 00 00 je 107a50 <devFS_mknod+0x12c> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( ENOMEM );
_ISR_Disable(level);
1079c9: 9c pushf
1079ca: fa cli
1079cb: 5b pop %ebx
device_name_table[slot].device_name = (char *)path;
1079cc: 8b 55 e0 mov -0x20(%ebp),%edx
1079cf: 8d 04 92 lea (%edx,%edx,4),%eax
1079d2: 8d 14 86 lea (%esi,%eax,4),%edx
1079d5: 89 3a mov %edi,(%edx)
device_name_table[slot].device_name_length = strlen(path);
1079d7: 31 c0 xor %eax,%eax
1079d9: b9 ff ff ff ff mov $0xffffffff,%ecx
1079de: f2 ae repnz scas %es:(%edi),%al
1079e0: f7 d1 not %ecx
1079e2: 49 dec %ecx
1079e3: 89 4a 04 mov %ecx,0x4(%edx)
device_name_table[slot].major = major;
1079e6: 8b 45 dc mov -0x24(%ebp),%eax
1079e9: 89 42 08 mov %eax,0x8(%edx)
device_name_table[slot].minor = minor;
1079ec: 8b 45 d8 mov -0x28(%ebp),%eax
1079ef: 89 42 0c mov %eax,0xc(%edx)
device_name_table[slot].mode = mode;
1079f2: 8b 45 0c mov 0xc(%ebp),%eax
1079f5: 89 42 10 mov %eax,0x10(%edx)
_ISR_Enable(level);
1079f8: 53 push %ebx
1079f9: 9d popf
return 0;
1079fa: 31 c0 xor %eax,%eax
}
1079fc: 8d 65 f4 lea -0xc(%ebp),%esp
1079ff: 5b pop %ebx
107a00: 5e pop %esi
107a01: 5f pop %edi
107a02: c9 leave
107a03: c3 ret
for (slot = -1, i = 0; i < rtems_device_table_size; i++){
if (device_name_table[i].device_name == NULL)
slot = i;
else
if (strcmp(path, device_name_table[i].device_name) == 0)
rtems_set_errno_and_return_minus_one( EEXIST );
107a04: e8 df 9a 00 00 call 1114e8 <__errno>
107a09: c7 00 11 00 00 00 movl $0x11,(%eax)
107a0f: b8 ff ff ff ff mov $0xffffffff,%eax
device_name_table[slot].minor = minor;
device_name_table[slot].mode = mode;
_ISR_Enable(level);
return 0;
}
107a14: 8d 65 f4 lea -0xc(%ebp),%esp
107a17: 5b pop %ebx
107a18: 5e pop %esi
107a19: 5f pop %edi
107a1a: c9 leave
107a1b: c3 ret
* condition and do not create the '/dev' and the 'path'
* actually passed in is 'dev', not '/dev'. Just return 0 to
* indicate we are OK.
*/
if ((path[0] == 'd') && (path[1] == 'e') &&
107a1c: 80 7f 01 65 cmpb $0x65,0x1(%edi)
107a20: 0f 85 19 ff ff ff jne 10793f <devFS_mknod+0x1b> <== NEVER TAKEN
107a26: 80 7f 02 76 cmpb $0x76,0x2(%edi)
107a2a: 0f 85 0f ff ff ff jne 10793f <devFS_mknod+0x1b> <== NEVER TAKEN
(path[2] == 'v') && (path[3] == '\0'))
107a30: 80 7f 03 00 cmpb $0x0,0x3(%edi)
107a34: 0f 85 05 ff ff ff jne 10793f <devFS_mknod+0x1b>
return 0;
107a3a: 31 c0 xor %eax,%eax
107a3c: eb be jmp 1079fc <devFS_mknod+0xd8>
/* must be a character device or a block device */
if (!S_ISBLK(mode) && !S_ISCHR(mode))
rtems_set_errno_and_return_minus_one( EINVAL );
107a3e: e8 a5 9a 00 00 call 1114e8 <__errno>
107a43: c7 00 16 00 00 00 movl $0x16,(%eax)
107a49: b8 ff ff ff ff mov $0xffffffff,%eax
107a4e: eb ac jmp 1079fc <devFS_mknod+0xd8>
if (strcmp(path, device_name_table[i].device_name) == 0)
rtems_set_errno_and_return_minus_one( EEXIST );
}
if (slot == -1)
rtems_set_errno_and_return_minus_one( ENOMEM );
107a50: e8 93 9a 00 00 call 1114e8 <__errno>
107a55: c7 00 0c 00 00 00 movl $0xc,(%eax)
107a5b: 83 c8 ff or $0xffffffff,%eax
107a5e: eb 9c jmp 1079fc <devFS_mknod+0xd8>
rtems_filesystem_split_dev_t(dev, major, minor);
/* Find an empty slot in device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
107a60: e8 83 9a 00 00 call 1114e8 <__errno>
107a65: c7 00 0e 00 00 00 movl $0xe,(%eax)
107a6b: 83 c8 ff or $0xffffffff,%eax
107a6e: eb 8c jmp 1079fc <devFS_mknod+0xd8>
00112714 <device_ioctl>:
int device_ioctl(
rtems_libio_t *iop,
uint32_t command,
void *buffer
)
{
112714: 55 push %ebp
112715: 89 e5 mov %esp,%ebp
112717: 83 ec 1c sub $0x1c,%esp
11271a: 8b 45 08 mov 0x8(%ebp),%eax
rtems_libio_ioctl_args_t args;
rtems_status_code status;
IMFS_jnode_t *the_jnode;
args.iop = iop;
11271d: 89 45 e8 mov %eax,-0x18(%ebp)
args.command = command;
112720: 8b 55 0c mov 0xc(%ebp),%edx
112723: 89 55 ec mov %edx,-0x14(%ebp)
args.buffer = buffer;
112726: 8b 55 10 mov 0x10(%ebp),%edx
112729: 89 55 f0 mov %edx,-0x10(%ebp)
the_jnode = iop->pathinfo.node_access;
11272c: 8b 40 18 mov 0x18(%eax),%eax
status = rtems_io_control(
the_jnode->info.device.major,
the_jnode->info.device.minor,
(void *) &args
11272f: 8d 55 e8 lea -0x18(%ebp),%edx
args.command = command;
args.buffer = buffer;
the_jnode = iop->pathinfo.node_access;
status = rtems_io_control(
112732: 52 push %edx
112733: ff 70 54 pushl 0x54(%eax)
112736: ff 70 50 pushl 0x50(%eax)
112739: e8 fa 08 00 00 call 113038 <rtems_io_control>
the_jnode->info.device.major,
the_jnode->info.device.minor,
(void *) &args
);
if ( status )
11273e: 83 c4 10 add $0x10,%esp
112741: 85 c0 test %eax,%eax
112743: 75 07 jne 11274c <device_ioctl+0x38>
return rtems_deviceio_errno(status);
return args.ioctl_return;
112745: 8b 45 f4 mov -0xc(%ebp),%eax
}
112748: c9 leave
112749: c3 ret
11274a: 66 90 xchg %ax,%ax
the_jnode->info.device.minor,
(void *) &args
);
if ( status )
return rtems_deviceio_errno(status);
11274c: 83 ec 0c sub $0xc,%esp
11274f: 50 push %eax
112750: e8 33 0b 00 00 call 113288 <rtems_deviceio_errno>
112755: 83 c4 10 add $0x10,%esp
return args.ioctl_return;
}
112758: c9 leave
112759: c3 ret
00108fa4 <drainOutput>:
/*
* Drain output queue
*/
static void
drainOutput (struct rtems_termios_tty *tty)
{
108fa4: 55 push %ebp
108fa5: 89 e5 mov %esp,%ebp
108fa7: 53 push %ebx
108fa8: 83 ec 04 sub $0x4,%esp
108fab: 89 c3 mov %eax,%ebx
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) {
108fad: 8b 90 b4 00 00 00 mov 0xb4(%eax),%edx
108fb3: 85 d2 test %edx,%edx
108fb5: 74 4d je 109004 <drainOutput+0x60>
rtems_interrupt_disable (level);
108fb7: 9c pushf
108fb8: fa cli
108fb9: 58 pop %eax
while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) {
108fba: 8b 8b 84 00 00 00 mov 0x84(%ebx),%ecx
108fc0: 8b 93 80 00 00 00 mov 0x80(%ebx),%edx
108fc6: 39 d1 cmp %edx,%ecx
108fc8: 74 38 je 109002 <drainOutput+0x5e>
108fca: 66 90 xchg %ax,%ax
tty->rawOutBufState = rob_wait;
108fcc: c7 83 94 00 00 00 02 movl $0x2,0x94(%ebx)
108fd3: 00 00 00
rtems_interrupt_enable (level);
108fd6: 50 push %eax
108fd7: 9d popf
sc = rtems_semaphore_obtain(
108fd8: 50 push %eax
108fd9: 6a 00 push $0x0
108fdb: 6a 00 push $0x0
108fdd: ff b3 8c 00 00 00 pushl 0x8c(%ebx)
108fe3: e8 c8 26 00 00 call 10b6b0 <rtems_semaphore_obtain>
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
108fe8: 83 c4 10 add $0x10,%esp
108feb: 85 c0 test %eax,%eax
108fed: 75 1a jne 109009 <drainOutput+0x65> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
108fef: 9c pushf
108ff0: fa cli
108ff1: 58 pop %eax
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) {
rtems_interrupt_disable (level);
while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) {
108ff2: 8b 8b 84 00 00 00 mov 0x84(%ebx),%ecx
108ff8: 8b 93 80 00 00 00 mov 0x80(%ebx),%edx
108ffe: 39 d1 cmp %edx,%ecx
109000: 75 ca jne 108fcc <drainOutput+0x28> <== NEVER TAKEN
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
}
rtems_interrupt_enable (level);
109002: 50 push %eax
109003: 9d popf
}
}
109004: 8b 5d fc mov -0x4(%ebp),%ebx
109007: c9 leave
109008: c3 ret
tty->rawOutBufState = rob_wait;
rtems_interrupt_enable (level);
sc = rtems_semaphore_obtain(
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
109009: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10900c: 50 push %eax <== NOT EXECUTED
10900d: e8 ee 2c 00 00 call 10bd00 <rtems_fatal_error_occurred><== NOT EXECUTED
00109d3c <echo>:
/*
* Echo a typed character
*/
static void
echo (unsigned char c, struct rtems_termios_tty *tty)
{
109d3c: 55 push %ebp
109d3d: 89 e5 mov %esp,%ebp
109d3f: 53 push %ebx
109d40: 83 ec 24 sub $0x24,%esp
if ((tty->termios.c_lflag & ECHOCTL) &&
109d43: f6 42 3d 02 testb $0x2,0x3d(%edx)
109d47: 74 1b je 109d64 <echo+0x28> <== NEVER TAKEN
iscntrl(c) && (c != '\t') && (c != '\n')) {
109d49: 0f b6 c8 movzbl %al,%ecx
* Echo a typed character
*/
static void
echo (unsigned char c, struct rtems_termios_tty *tty)
{
if ((tty->termios.c_lflag & ECHOCTL) &&
109d4c: 8b 1d 34 5b 12 00 mov 0x125b34,%ebx
109d52: f6 44 0b 01 20 testb $0x20,0x1(%ebx,%ecx,1)
109d57: 74 0b je 109d64 <echo+0x28>
iscntrl(c) && (c != '\t') && (c != '\n')) {
109d59: 3c 09 cmp $0x9,%al
109d5b: 74 07 je 109d64 <echo+0x28>
109d5d: 3c 0a cmp $0xa,%al
109d5f: 75 13 jne 109d74 <echo+0x38>
109d61: 8d 76 00 lea 0x0(%esi),%esi
echobuf[0] = '^';
echobuf[1] = c ^ 0x40;
rtems_termios_puts (echobuf, 2, tty);
tty->column += 2;
} else {
oproc (c, tty);
109d64: 0f b6 c0 movzbl %al,%eax
109d67: e8 94 fe ff ff call 109c00 <oproc>
}
}
109d6c: 8b 5d fc mov -0x4(%ebp),%ebx
109d6f: c9 leave
109d70: c3 ret
109d71: 8d 76 00 lea 0x0(%esi),%esi
{
if ((tty->termios.c_lflag & ECHOCTL) &&
iscntrl(c) && (c != '\t') && (c != '\n')) {
char echobuf[2];
echobuf[0] = '^';
109d74: c6 45 f6 5e movb $0x5e,-0xa(%ebp)
echobuf[1] = c ^ 0x40;
109d78: 83 f0 40 xor $0x40,%eax
109d7b: 88 45 f7 mov %al,-0x9(%ebp)
rtems_termios_puts (echobuf, 2, tty);
109d7e: 53 push %ebx
109d7f: 52 push %edx
109d80: 6a 02 push $0x2
109d82: 8d 45 f6 lea -0xa(%ebp),%eax
109d85: 50 push %eax
109d86: 89 55 e4 mov %edx,-0x1c(%ebp)
109d89: e8 3e fd ff ff call 109acc <rtems_termios_puts>
tty->column += 2;
109d8e: 8b 55 e4 mov -0x1c(%ebp),%edx
109d91: 83 42 28 02 addl $0x2,0x28(%edx)
*/
static void
echo (unsigned char c, struct rtems_termios_tty *tty)
{
if ((tty->termios.c_lflag & ECHOCTL) &&
iscntrl(c) && (c != '\t') && (c != '\n')) {
109d95: 83 c4 10 add $0x10,%esp
rtems_termios_puts (echobuf, 2, tty);
tty->column += 2;
} else {
oproc (c, tty);
}
}
109d98: 8b 5d fc mov -0x4(%ebp),%ebx
109d9b: c9 leave
109d9c: c3 ret
00108f64 <endgrent>:
void endgrent(void)
{
108f64: 55 push %ebp
108f65: 89 e5 mov %esp,%ebp
108f67: 83 ec 08 sub $0x8,%esp
if (group_fp != NULL)
108f6a: a1 a0 93 12 00 mov 0x1293a0,%eax
108f6f: 85 c0 test %eax,%eax
108f71: 74 0c je 108f7f <endgrent+0x1b> <== NEVER TAKEN
fclose(group_fp);
108f73: 83 ec 0c sub $0xc,%esp
108f76: 50 push %eax
108f77: e8 50 b3 00 00 call 1142cc <fclose>
108f7c: 83 c4 10 add $0x10,%esp
}
108f7f: c9 leave
108f80: c3 ret
00108e0c <endpwent>:
void endpwent(void)
{
108e0c: 55 push %ebp
108e0d: 89 e5 mov %esp,%ebp
108e0f: 83 ec 08 sub $0x8,%esp
if (passwd_fp != NULL)
108e12: a1 88 94 12 00 mov 0x129488,%eax
108e17: 85 c0 test %eax,%eax
108e19: 74 0c je 108e27 <endpwent+0x1b> <== NEVER TAKEN
fclose(passwd_fp);
108e1b: 83 ec 0c sub $0xc,%esp
108e1e: 50 push %eax
108e1f: e8 a8 b4 00 00 call 1142cc <fclose>
108e24: 83 c4 10 add $0x10,%esp
}
108e27: c9 leave
108e28: c3 ret
00109da0 <erase>:
* FIXME: Needs support for WERASE and ECHOPRT.
* FIXME: Some of the tests should check for IEXTEN, too.
*/
static void
erase (struct rtems_termios_tty *tty, int lineFlag)
{
109da0: 55 push %ebp
109da1: 89 e5 mov %esp,%ebp
109da3: 57 push %edi
109da4: 56 push %esi
109da5: 53 push %ebx
109da6: 83 ec 1c sub $0x1c,%esp
109da9: 89 c3 mov %eax,%ebx
109dab: 89 d7 mov %edx,%edi
if (tty->ccount == 0)
109dad: 8b 48 20 mov 0x20(%eax),%ecx
109db0: 85 c9 test %ecx,%ecx
109db2: 0f 84 84 00 00 00 je 109e3c <erase+0x9c>
return;
if (lineFlag) {
109db8: 85 d2 test %edx,%edx
109dba: 0f 85 84 00 00 00 jne 109e44 <erase+0xa4>
echo ('\n', tty);
return;
}
}
while (tty->ccount) {
109dc0: 8b 50 3c mov 0x3c(%eax),%edx
109dc3: 89 7d e4 mov %edi,-0x1c(%ebp)
109dc6: eb 1d jmp 109de5 <erase+0x45>
rtems_termios_puts ("\b", 1, tty);
tty->column--;
}
}
else {
if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) {
109dc8: 80 e6 02 and $0x2,%dh <== NOT EXECUTED
109dcb: 0f 85 37 01 00 00 jne 109f08 <erase+0x168> <== NOT EXECUTED
109dd1: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
if (tty->column)
tty->column--;
}
}
}
if (!lineFlag)
109dd4: 8b 75 e4 mov -0x1c(%ebp),%esi
109dd7: 85 f6 test %esi,%esi
109dd9: 74 61 je 109e3c <erase+0x9c> <== NEVER TAKEN
echo ('\n', tty);
return;
}
}
while (tty->ccount) {
109ddb: 8b 4b 20 mov 0x20(%ebx),%ecx
109dde: 85 c9 test %ecx,%ecx
109de0: 74 5a je 109e3c <erase+0x9c>
}
if (!(tty->termios.c_lflag & ECHOE)) {
tty->ccount = 0;
echo (tty->termios.c_cc[VKILL], tty);
if (tty->termios.c_lflag & ECHOK)
echo ('\n', tty);
109de2: 8b 53 3c mov 0x3c(%ebx),%edx
return;
}
}
while (tty->ccount) {
unsigned char c = tty->cbuf[--tty->ccount];
109de5: 8b 7b 1c mov 0x1c(%ebx),%edi
109de8: 49 dec %ecx
109de9: 89 4b 20 mov %ecx,0x20(%ebx)
109dec: 8a 04 0f mov (%edi,%ecx,1),%al
if (tty->termios.c_lflag & ECHO) {
109def: f6 c2 08 test $0x8,%dl
109df2: 74 e0 je 109dd4 <erase+0x34> <== NEVER TAKEN
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
109df4: 8b 75 e4 mov -0x1c(%ebp),%esi
109df7: 85 f6 test %esi,%esi
109df9: 75 09 jne 109e04 <erase+0x64>
109dfb: f6 c2 10 test $0x10,%dl
109dfe: 0f 84 f0 00 00 00 je 109ef4 <erase+0x154> <== NEVER TAKEN
echo (tty->termios.c_cc[VERASE], tty);
} else if (c == '\t') {
109e04: 3c 09 cmp $0x9,%al
109e06: 74 58 je 109e60 <erase+0xc0>
rtems_termios_puts ("\b", 1, tty);
tty->column--;
}
}
else {
if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) {
109e08: 0f b6 c0 movzbl %al,%eax
109e0b: 8d 70 01 lea 0x1(%eax),%esi
109e0e: a1 34 5b 12 00 mov 0x125b34,%eax
109e13: f6 04 30 20 testb $0x20,(%eax,%esi,1)
109e17: 75 af jne 109dc8 <erase+0x28> <== NEVER TAKEN
rtems_termios_puts ("\b \b", 3, tty);
if (tty->column)
tty->column--;
}
if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) {
rtems_termios_puts ("\b \b", 3, tty);
109e19: 57 push %edi
109e1a: 53 push %ebx
109e1b: 6a 03 push $0x3
109e1d: 68 c6 14 12 00 push $0x1214c6
109e22: e8 a5 fc ff ff call 109acc <rtems_termios_puts>
if (tty->column)
109e27: 8b 43 28 mov 0x28(%ebx),%eax
109e2a: 83 c4 10 add $0x10,%esp
109e2d: 85 c0 test %eax,%eax
109e2f: 74 a3 je 109dd4 <erase+0x34> <== NEVER TAKEN
tty->column--;
109e31: 48 dec %eax
109e32: 89 43 28 mov %eax,0x28(%ebx)
}
}
}
if (!lineFlag)
109e35: 8b 75 e4 mov -0x1c(%ebp),%esi
109e38: 85 f6 test %esi,%esi
109e3a: 75 9f jne 109ddb <erase+0x3b>
break;
}
}
109e3c: 8d 65 f4 lea -0xc(%ebp),%esp
109e3f: 5b pop %ebx
109e40: 5e pop %esi
109e41: 5f pop %edi
109e42: c9 leave
109e43: c3 ret
erase (struct rtems_termios_tty *tty, int lineFlag)
{
if (tty->ccount == 0)
return;
if (lineFlag) {
if (!(tty->termios.c_lflag & ECHO)) {
109e44: 8b 50 3c mov 0x3c(%eax),%edx
109e47: f6 c2 08 test $0x8,%dl
109e4a: 0f 84 94 00 00 00 je 109ee4 <erase+0x144> <== NEVER TAKEN
tty->ccount = 0;
return;
}
if (!(tty->termios.c_lflag & ECHOE)) {
109e50: f6 c2 10 test $0x10,%dl
109e53: 0f 84 eb 00 00 00 je 109f44 <erase+0x1a4> <== NEVER TAKEN
109e59: 89 7d e4 mov %edi,-0x1c(%ebp)
109e5c: eb 87 jmp 109de5 <erase+0x45>
109e5e: 66 90 xchg %ax,%ax
if (tty->termios.c_lflag & ECHO) {
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
echo (tty->termios.c_cc[VERASE], tty);
} else if (c == '\t') {
int col = tty->read_start_column;
109e60: 8b 73 2c mov 0x2c(%ebx),%esi
int i = 0;
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
109e63: 85 c9 test %ecx,%ecx
109e65: 74 46 je 109ead <erase+0x10d>
c = tty->cbuf[i++];
if (c == '\t') {
col = (col | 7) + 1;
} else if (iscntrl (c)) {
109e67: a1 34 5b 12 00 mov 0x125b34,%eax
109e6c: 89 45 dc mov %eax,-0x24(%ebp)
if (tty->termios.c_lflag & ECHO) {
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
echo (tty->termios.c_cc[VERASE], tty);
} else if (c == '\t') {
int col = tty->read_start_column;
int i = 0;
109e6f: 31 c0 xor %eax,%eax
while (i != tty->ccount) {
c = tty->cbuf[i++];
if (c == '\t') {
col = (col | 7) + 1;
} else if (iscntrl (c)) {
if (tty->termios.c_lflag & ECHOCTL)
109e71: 81 e2 00 02 00 00 and $0x200,%edx
109e77: 89 55 e0 mov %edx,-0x20(%ebp)
109e7a: 89 5d d8 mov %ebx,-0x28(%ebp)
109e7d: 8b 5d dc mov -0x24(%ebp),%ebx
109e80: eb 10 jmp 109e92 <erase+0xf2>
109e82: 66 90 xchg %ax,%ax
109e84: 8b 55 e0 mov -0x20(%ebp),%edx <== NOT EXECUTED
109e87: 85 d2 test %edx,%edx <== NOT EXECUTED
109e89: 74 03 je 109e8e <erase+0xee> <== NOT EXECUTED
col += 2;
109e8b: 83 c6 02 add $0x2,%esi <== NOT EXECUTED
int i = 0;
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
109e8e: 39 c1 cmp %eax,%ecx
109e90: 74 18 je 109eaa <erase+0x10a> <== NEVER TAKEN
c = tty->cbuf[i++];
109e92: 8a 14 07 mov (%edi,%eax,1),%dl
109e95: 40 inc %eax
if (c == '\t') {
109e96: 80 fa 09 cmp $0x9,%dl
109e99: 74 41 je 109edc <erase+0x13c>
col = (col | 7) + 1;
} else if (iscntrl (c)) {
109e9b: 0f b6 d2 movzbl %dl,%edx
109e9e: f6 44 13 01 20 testb $0x20,0x1(%ebx,%edx,1)
109ea3: 75 df jne 109e84 <erase+0xe4> <== NEVER TAKEN
if (tty->termios.c_lflag & ECHOCTL)
col += 2;
} else {
col++;
109ea5: 46 inc %esi
int i = 0;
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
109ea6: 39 c1 cmp %eax,%ecx
109ea8: 75 e8 jne 109e92 <erase+0xf2>
109eaa: 8b 5d d8 mov -0x28(%ebp),%ebx
}
/*
* Back up over the tab
*/
while (tty->column > col) {
109ead: 3b 73 28 cmp 0x28(%ebx),%esi
109eb0: 0f 8d 1e ff ff ff jge 109dd4 <erase+0x34> <== NEVER TAKEN
109eb6: 66 90 xchg %ax,%ax
rtems_termios_puts ("\b", 1, tty);
109eb8: 52 push %edx
109eb9: 53 push %ebx
109eba: 6a 01 push $0x1
109ebc: 68 c8 14 12 00 push $0x1214c8
109ec1: e8 06 fc ff ff call 109acc <rtems_termios_puts>
tty->column--;
109ec6: 8b 43 28 mov 0x28(%ebx),%eax
109ec9: 48 dec %eax
109eca: 89 43 28 mov %eax,0x28(%ebx)
}
/*
* Back up over the tab
*/
while (tty->column > col) {
109ecd: 83 c4 10 add $0x10,%esp
109ed0: 39 f0 cmp %esi,%eax
109ed2: 7f e4 jg 109eb8 <erase+0x118>
109ed4: e9 fb fe ff ff jmp 109dd4 <erase+0x34>
109ed9: 8d 76 00 lea 0x0(%esi),%esi
* Find the character before the tab
*/
while (i != tty->ccount) {
c = tty->cbuf[i++];
if (c == '\t') {
col = (col | 7) + 1;
109edc: 83 ce 07 or $0x7,%esi
109edf: 46 inc %esi
109ee0: eb ac jmp 109e8e <erase+0xee>
109ee2: 66 90 xchg %ax,%ax
{
if (tty->ccount == 0)
return;
if (lineFlag) {
if (!(tty->termios.c_lflag & ECHO)) {
tty->ccount = 0;
109ee4: c7 40 20 00 00 00 00 movl $0x0,0x20(%eax) <== NOT EXECUTED
}
}
if (!lineFlag)
break;
}
}
109eeb: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
109eee: 5b pop %ebx <== NOT EXECUTED
109eef: 5e pop %esi <== NOT EXECUTED
109ef0: 5f pop %edi <== NOT EXECUTED
109ef1: c9 leave <== NOT EXECUTED
109ef2: c3 ret <== NOT EXECUTED
109ef3: 90 nop <== NOT EXECUTED
while (tty->ccount) {
unsigned char c = tty->cbuf[--tty->ccount];
if (tty->termios.c_lflag & ECHO) {
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
echo (tty->termios.c_cc[VERASE], tty);
109ef4: 0f b6 43 43 movzbl 0x43(%ebx),%eax <== NOT EXECUTED
109ef8: 89 da mov %ebx,%edx <== NOT EXECUTED
}
}
if (!lineFlag)
break;
}
}
109efa: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
109efd: 5b pop %ebx <== NOT EXECUTED
109efe: 5e pop %esi <== NOT EXECUTED
109eff: 5f pop %edi <== NOT EXECUTED
109f00: c9 leave <== NOT EXECUTED
while (tty->ccount) {
unsigned char c = tty->cbuf[--tty->ccount];
if (tty->termios.c_lflag & ECHO) {
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
echo (tty->termios.c_cc[VERASE], tty);
109f01: e9 36 fe ff ff jmp 109d3c <echo> <== NOT EXECUTED
109f06: 66 90 xchg %ax,%ax <== NOT EXECUTED
tty->column--;
}
}
else {
if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) {
rtems_termios_puts ("\b \b", 3, tty);
109f08: 50 push %eax <== NOT EXECUTED
109f09: 53 push %ebx <== NOT EXECUTED
109f0a: 6a 03 push $0x3 <== NOT EXECUTED
109f0c: 68 c6 14 12 00 push $0x1214c6 <== NOT EXECUTED
109f11: e8 b6 fb ff ff call 109acc <rtems_termios_puts> <== NOT EXECUTED
if (tty->column)
109f16: 8b 43 28 mov 0x28(%ebx),%eax <== NOT EXECUTED
109f19: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
109f1c: 85 c0 test %eax,%eax <== NOT EXECUTED
109f1e: 74 04 je 109f24 <erase+0x184> <== NOT EXECUTED
tty->column--;
109f20: 48 dec %eax <== NOT EXECUTED
109f21: 89 43 28 mov %eax,0x28(%ebx) <== NOT EXECUTED
}
if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) {
109f24: a1 34 5b 12 00 mov 0x125b34,%eax <== NOT EXECUTED
109f29: f6 04 30 20 testb $0x20,(%eax,%esi,1) <== NOT EXECUTED
109f2d: 0f 84 e6 fe ff ff je 109e19 <erase+0x79> <== NOT EXECUTED
109f33: f6 43 3d 02 testb $0x2,0x3d(%ebx) <== NOT EXECUTED
109f37: 0f 85 dc fe ff ff jne 109e19 <erase+0x79> <== NOT EXECUTED
109f3d: e9 92 fe ff ff jmp 109dd4 <erase+0x34> <== NOT EXECUTED
109f42: 66 90 xchg %ax,%ax <== NOT EXECUTED
if (!(tty->termios.c_lflag & ECHO)) {
tty->ccount = 0;
return;
}
if (!(tty->termios.c_lflag & ECHOE)) {
tty->ccount = 0;
109f44: c7 40 20 00 00 00 00 movl $0x0,0x20(%eax) <== NOT EXECUTED
echo (tty->termios.c_cc[VKILL], tty);
109f4b: 0f b6 40 44 movzbl 0x44(%eax),%eax <== NOT EXECUTED
109f4f: 89 da mov %ebx,%edx <== NOT EXECUTED
109f51: e8 e6 fd ff ff call 109d3c <echo> <== NOT EXECUTED
if (tty->termios.c_lflag & ECHOK)
109f56: f6 43 3c 20 testb $0x20,0x3c(%ebx) <== NOT EXECUTED
109f5a: 0f 84 dc fe ff ff je 109e3c <erase+0x9c> <== NOT EXECUTED
echo ('\n', tty);
109f60: 89 da mov %ebx,%edx <== NOT EXECUTED
109f62: b8 0a 00 00 00 mov $0xa,%eax <== NOT EXECUTED
109f67: eb 91 jmp 109efa <erase+0x15a> <== NOT EXECUTED
00108b30 <fchdir>:
#include <rtems/seterr.h>
int fchdir(
int fd
)
{
108b30: 55 push %ebp
108b31: 89 e5 mov %esp,%ebp
108b33: 57 push %edi
108b34: 56 push %esi
108b35: 53 push %ebx
108b36: 83 ec 4c sub $0x4c,%esp
108b39: 8b 45 08 mov 0x8(%ebp),%eax
rtems_libio_t *iop;
rtems_filesystem_location_info_t loc, saved;
rtems_libio_check_fd( fd );
108b3c: 3b 05 6c 4e 12 00 cmp 0x124e6c,%eax
108b42: 0f 83 d0 00 00 00 jae 108c18 <fchdir+0xe8>
iop = rtems_libio_iop( fd );
108b48: c1 e0 03 shl $0x3,%eax
108b4b: 8d 1c c5 00 00 00 00 lea 0x0(,%eax,8),%ebx
108b52: 29 c3 sub %eax,%ebx
108b54: 03 1d 00 91 12 00 add 0x129100,%ebx
rtems_libio_check_is_open(iop);
108b5a: 8b 43 14 mov 0x14(%ebx),%eax
108b5d: f6 c4 01 test $0x1,%ah
108b60: 0f 84 b2 00 00 00 je 108c18 <fchdir+0xe8>
/*
* Now process the fchmod().
*/
rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ );
108b66: a8 02 test $0x2,%al
108b68: 0f 84 be 00 00 00 je 108c2c <fchdir+0xfc>
/*
* Verify you can change directory into this node.
*/
if ( (*iop->pathinfo.ops->node_type_h)( &iop->pathinfo ) !=
108b6e: 83 ec 0c sub $0xc,%esp
108b71: 8b 43 24 mov 0x24(%ebx),%eax
108b74: 83 c3 18 add $0x18,%ebx
108b77: 53 push %ebx
108b78: ff 50 10 call *0x10(%eax)
108b7b: 83 c4 10 add $0x10,%esp
108b7e: 48 dec %eax
108b7f: 75 67 jne 108be8 <fchdir+0xb8>
* but note the race condition. Threads who
* share their rtems_filesystem_current better
* be synchronized!
*/
saved = rtems_filesystem_current;
108b81: a1 70 6e 12 00 mov 0x126e70,%eax
108b86: 8d 55 c0 lea -0x40(%ebp),%edx
108b89: 89 55 b4 mov %edx,-0x4c(%ebp)
108b8c: 8d 70 04 lea 0x4(%eax),%esi
108b8f: b9 05 00 00 00 mov $0x5,%ecx
108b94: 89 d7 mov %edx,%edi
108b96: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
rtems_filesystem_current = iop->pathinfo;
108b98: 8d 78 04 lea 0x4(%eax),%edi
108b9b: b1 05 mov $0x5,%cl
108b9d: 89 de mov %ebx,%esi
108b9f: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* clone the current node */
if (rtems_filesystem_evaluate_path(".", 1, 0, &loc, 0)) {
108ba1: 83 ec 0c sub $0xc,%esp
108ba4: 6a 00 push $0x0
108ba6: 8d 75 d4 lea -0x2c(%ebp),%esi
108ba9: 56 push %esi
108baa: 6a 00 push $0x0
108bac: 6a 01 push $0x1
108bae: 68 96 2d 12 00 push $0x122d96
108bb3: e8 a0 fe ff ff call 108a58 <rtems_filesystem_evaluate_path>
108bb8: 83 c4 20 add $0x20,%esp
108bbb: 85 c0 test %eax,%eax
108bbd: 75 3d jne 108bfc <fchdir+0xcc>
/* cloning failed; restore original and bail out */
rtems_filesystem_current = saved;
return -1;
}
/* release the old one */
rtems_filesystem_freenode( &saved );
108bbf: 83 ec 0c sub $0xc,%esp
108bc2: 8d 45 c0 lea -0x40(%ebp),%eax
108bc5: 50 push %eax
108bc6: e8 61 01 00 00 call 108d2c <rtems_filesystem_freenode>
rtems_filesystem_current = loc;
108bcb: 8b 3d 70 6e 12 00 mov 0x126e70,%edi
108bd1: 83 c7 04 add $0x4,%edi
108bd4: b9 05 00 00 00 mov $0x5,%ecx
108bd9: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return 0;
108bdb: 83 c4 10 add $0x10,%esp
108bde: 31 c0 xor %eax,%eax
}
108be0: 8d 65 f4 lea -0xc(%ebp),%esp
108be3: 5b pop %ebx
108be4: 5e pop %esi
108be5: 5f pop %edi
108be6: c9 leave
108be7: c3 ret
* Verify you can change directory into this node.
*/
if ( (*iop->pathinfo.ops->node_type_h)( &iop->pathinfo ) !=
RTEMS_FILESYSTEM_DIRECTORY ) {
rtems_set_errno_and_return_minus_one( ENOTDIR );
108be8: e8 e7 b5 00 00 call 1141d4 <__errno>
108bed: c7 00 14 00 00 00 movl $0x14,(%eax)
108bf3: b8 ff ff ff ff mov $0xffffffff,%eax
108bf8: eb e6 jmp 108be0 <fchdir+0xb0>
108bfa: 66 90 xchg %ax,%ax
rtems_filesystem_current = iop->pathinfo;
/* clone the current node */
if (rtems_filesystem_evaluate_path(".", 1, 0, &loc, 0)) {
/* cloning failed; restore original and bail out */
rtems_filesystem_current = saved;
108bfc: 8b 3d 70 6e 12 00 mov 0x126e70,%edi
108c02: 83 c7 04 add $0x4,%edi
108c05: b9 05 00 00 00 mov $0x5,%ecx
108c0a: 8b 75 b4 mov -0x4c(%ebp),%esi
108c0d: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return -1;
108c0f: b8 ff ff ff ff mov $0xffffffff,%eax
108c14: eb ca jmp 108be0 <fchdir+0xb0>
108c16: 66 90 xchg %ax,%ax
rtems_libio_t *iop;
rtems_filesystem_location_info_t loc, saved;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open(iop);
108c18: e8 b7 b5 00 00 call 1141d4 <__errno>
108c1d: c7 00 09 00 00 00 movl $0x9,(%eax)
108c23: b8 ff ff ff ff mov $0xffffffff,%eax
108c28: eb b6 jmp 108be0 <fchdir+0xb0>
108c2a: 66 90 xchg %ax,%ax
/*
* Now process the fchmod().
*/
rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ );
108c2c: e8 a3 b5 00 00 call 1141d4 <__errno>
108c31: c7 00 16 00 00 00 movl $0x16,(%eax)
108c37: b8 ff ff ff ff mov $0xffffffff,%eax
108c3c: eb a2 jmp 108be0 <fchdir+0xb0>
00108c40 <fchmod>:
int fchmod(
int fd,
mode_t mode
)
{
108c40: 55 push %ebp
108c41: 89 e5 mov %esp,%ebp
108c43: 83 ec 08 sub $0x8,%esp
108c46: 8b 45 08 mov 0x8(%ebp),%eax
108c49: 8b 4d 0c mov 0xc(%ebp),%ecx
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
108c4c: 3b 05 6c 4e 12 00 cmp 0x124e6c,%eax
108c52: 73 38 jae 108c8c <fchmod+0x4c>
iop = rtems_libio_iop( fd );
108c54: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx
108c5b: 8d 04 d5 00 00 00 00 lea 0x0(,%edx,8),%eax
108c62: 29 d0 sub %edx,%eax
108c64: 03 05 00 91 12 00 add 0x129100,%eax
rtems_libio_check_is_open(iop);
108c6a: 8b 50 14 mov 0x14(%eax),%edx
108c6d: f6 c6 01 test $0x1,%dh
108c70: 74 1a je 108c8c <fchmod+0x4c>
/*
* Now process the fchmod().
*/
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
108c72: 83 e2 04 and $0x4,%edx
108c75: 74 29 je 108ca0 <fchmod+0x60>
return (*iop->pathinfo.handlers->fchmod_h)( &iop->pathinfo, mode );
108c77: 8b 50 20 mov 0x20(%eax),%edx
108c7a: 89 4d 0c mov %ecx,0xc(%ebp)
108c7d: 83 c0 18 add $0x18,%eax
108c80: 89 45 08 mov %eax,0x8(%ebp)
108c83: 8b 42 1c mov 0x1c(%edx),%eax
}
108c86: c9 leave
* Now process the fchmod().
*/
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
return (*iop->pathinfo.handlers->fchmod_h)( &iop->pathinfo, mode );
108c87: ff e0 jmp *%eax
108c89: 8d 76 00 lea 0x0(%esi),%esi
{
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open(iop);
108c8c: e8 43 b5 00 00 call 1141d4 <__errno>
108c91: c7 00 09 00 00 00 movl $0x9,(%eax)
*/
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
return (*iop->pathinfo.handlers->fchmod_h)( &iop->pathinfo, mode );
}
108c97: b8 ff ff ff ff mov $0xffffffff,%eax
108c9c: c9 leave
108c9d: c3 ret
108c9e: 66 90 xchg %ax,%ax
/*
* Now process the fchmod().
*/
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
108ca0: e8 2f b5 00 00 call 1141d4 <__errno>
108ca5: c7 00 16 00 00 00 movl $0x16,(%eax)
108cab: eb ea jmp 108c97 <fchmod+0x57>
00108ae0 <fcntl>:
int fcntl(
int fd,
int cmd,
...
)
{
108ae0: 55 push %ebp
108ae1: 89 e5 mov %esp,%ebp
108ae3: 57 push %edi
108ae4: 56 push %esi
108ae5: 53 push %ebx
108ae6: 83 ec 1c sub $0x1c,%esp
108ae9: 8b 5d 08 mov 0x8(%ebp),%ebx
108aec: 8b 55 0c mov 0xc(%ebp),%edx
int ret;
va_list ap;
va_start( ap, cmd );
108aef: 8d 7d 10 lea 0x10(%ebp),%edi
int fd2;
int flags;
int mask;
int ret = 0;
rtems_libio_check_fd( fd );
108af2: 8b 0d 4c 56 12 00 mov 0x12564c,%ecx
108af8: 39 cb cmp %ecx,%ebx
108afa: 0f 83 5c 01 00 00 jae 108c5c <fcntl+0x17c>
iop = rtems_libio_iop( fd );
108b00: a1 e0 98 12 00 mov 0x1298e0,%eax
108b05: 8d 34 dd 00 00 00 00 lea 0x0(,%ebx,8),%esi
108b0c: 8d 1c f5 00 00 00 00 lea 0x0(,%esi,8),%ebx
108b13: 29 f3 sub %esi,%ebx
108b15: 8d 1c 18 lea (%eax,%ebx,1),%ebx
rtems_libio_check_is_open(iop);
108b18: 8b 73 14 mov 0x14(%ebx),%esi
108b1b: f7 c6 00 01 00 00 test $0x100,%esi
108b21: 0f 84 35 01 00 00 je 108c5c <fcntl+0x17c>
/*
* This switch should contain all the cases from POSIX.
*/
switch ( cmd ) {
108b27: 83 fa 09 cmp $0x9,%edx
108b2a: 76 10 jbe 108b3c <fcntl+0x5c>
errno = ENOTSUP;
ret = -1;
break;
default:
errno = EINVAL;
108b2c: e8 43 b9 00 00 call 114474 <__errno>
108b31: c7 00 16 00 00 00 movl $0x16,(%eax)
108b37: eb 16 jmp 108b4f <fcntl+0x6f>
108b39: 8d 76 00 lea 0x0(%esi),%esi
/*
* This switch should contain all the cases from POSIX.
*/
switch ( cmd ) {
108b3c: ff 24 95 90 2f 12 00 jmp *0x122f90(,%edx,4)
108b43: 90 nop
errno = ENOTSUP;
ret = -1;
break;
case F_GETOWN: /* for sockets. */
errno = ENOTSUP;
108b44: e8 2b b9 00 00 call 114474 <__errno>
108b49: c7 00 86 00 00 00 movl $0x86,(%eax)
if (ret >= 0) {
int err = (*iop->pathinfo.handlers->fcntl_h)( cmd, iop );
if (err) {
errno = err;
ret = -1;
108b4f: be ff ff ff ff mov $0xffffffff,%esi
va_list ap;
va_start( ap, cmd );
ret = vfcntl(fd,cmd,ap);
va_end(ap);
return ret;
}
108b54: 89 f0 mov %esi,%eax
108b56: 8d 65 f4 lea -0xc(%ebp),%esp
108b59: 5b pop %ebx
108b5a: 5e pop %esi
108b5b: 5f pop %edi
108b5c: c9 leave
108b5d: c3 ret
108b5e: 66 90 xchg %ax,%ax
case F_GETFL: /* more flags (cloexec) */
ret = rtems_libio_to_fcntl_flags( iop->flags );
break;
case F_SETFL:
flags = rtems_libio_fcntl_flags( va_arg( ap, int ) );
108b60: 83 ec 0c sub $0xc,%esp
108b63: ff 37 pushl (%edi)
108b65: 89 55 e0 mov %edx,-0x20(%ebp)
108b68: e8 33 05 00 00 call 1090a0 <rtems_libio_fcntl_flags>
/*
* XXX If we are turning on append, should we seek to the end?
*/
iop->flags = (iop->flags & ~mask) | (flags & mask);
108b6d: 25 01 02 00 00 and $0x201,%eax
108b72: 8b 4b 14 mov 0x14(%ebx),%ecx
108b75: 81 e1 fe fd ff ff and $0xfffffdfe,%ecx
108b7b: 09 c8 or %ecx,%eax
108b7d: 89 43 14 mov %eax,0x14(%ebx)
108b80: 83 c4 10 add $0x10,%esp
rtems_libio_t *iop;
rtems_libio_t *diop;
int fd2;
int flags;
int mask;
int ret = 0;
108b83: 31 f6 xor %esi,%esi
108b85: 8b 55 e0 mov -0x20(%ebp),%edx
* If we got this far successfully, then we give the optional
* filesystem specific handler a chance to process this.
*/
if (ret >= 0) {
int err = (*iop->pathinfo.handlers->fcntl_h)( cmd, iop );
108b88: 83 ec 08 sub $0x8,%esp
108b8b: 8b 43 20 mov 0x20(%ebx),%eax
108b8e: 53 push %ebx
108b8f: 52 push %edx
108b90: ff 50 30 call *0x30(%eax)
108b93: 89 c3 mov %eax,%ebx
if (err) {
108b95: 83 c4 10 add $0x10,%esp
108b98: 85 c0 test %eax,%eax
108b9a: 74 b8 je 108b54 <fcntl+0x74> <== ALWAYS TAKEN
errno = err;
108b9c: e8 d3 b8 00 00 call 114474 <__errno> <== NOT EXECUTED
108ba1: 89 18 mov %ebx,(%eax) <== NOT EXECUTED
108ba3: eb aa jmp 108b4f <fcntl+0x6f> <== NOT EXECUTED
108ba5: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
else
iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC;
break;
case F_GETFL: /* more flags (cloexec) */
ret = rtems_libio_to_fcntl_flags( iop->flags );
108ba8: 83 ec 0c sub $0xc,%esp
108bab: 56 push %esi
108bac: 89 55 e0 mov %edx,-0x20(%ebp)
108baf: e8 24 05 00 00 call 1090d8 <rtems_libio_to_fcntl_flags>
108bb4: 89 c6 mov %eax,%esi
108bb6: 83 c4 10 add $0x10,%esp
108bb9: 8b 55 e0 mov -0x20(%ebp),%edx
/*
* If we got this far successfully, then we give the optional
* filesystem specific handler a chance to process this.
*/
if (ret >= 0) {
108bbc: 85 f6 test %esi,%esi
108bbe: 79 c8 jns 108b88 <fcntl+0xa8> <== ALWAYS TAKEN
108bc0: eb 92 jmp 108b54 <fcntl+0x74> <== NOT EXECUTED
108bc2: 66 90 xchg %ax,%ax <== NOT EXECUTED
* if a new process is exec()'ed. Since RTEMS does not support
* processes, then we can ignore this one except to make
* F_GETFD work.
*/
if ( va_arg( ap, int ) )
108bc4: 8b 07 mov (%edi),%eax
108bc6: 85 c0 test %eax,%eax
108bc8: 74 6a je 108c34 <fcntl+0x154>
iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC;
108bca: 81 ce 00 08 00 00 or $0x800,%esi
108bd0: 89 73 14 mov %esi,0x14(%ebx)
rtems_libio_t *iop;
rtems_libio_t *diop;
int fd2;
int flags;
int mask;
int ret = 0;
108bd3: 31 f6 xor %esi,%esi
108bd5: eb b1 jmp 108b88 <fcntl+0xa8>
108bd7: 90 nop
diop->pathinfo = iop->pathinfo;
ret = (int) (diop - rtems_libio_iops);
break;
case F_GETFD: /* get f_flags */
ret = ((iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC) != 0);
108bd8: 31 c0 xor %eax,%eax
108bda: f7 c6 00 08 00 00 test $0x800,%esi
108be0: 0f 95 c0 setne %al
108be3: 89 c6 mov %eax,%esi
108be5: eb a1 jmp 108b88 <fcntl+0xa8>
108be7: 90 nop
* This switch should contain all the cases from POSIX.
*/
switch ( cmd ) {
case F_DUPFD: /* dup */
fd2 = va_arg( ap, int );
108be8: 8b 3f mov (%edi),%edi
if ( fd2 )
108bea: 85 ff test %edi,%edi
108bec: 0f 84 82 00 00 00 je 108c74 <fcntl+0x194>
diop = rtems_libio_iop( fd2 );
108bf2: 39 f9 cmp %edi,%ecx
108bf4: 77 4e ja 108c44 <fcntl+0x164> <== ALWAYS TAKEN
108bf6: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) <== NOT EXECUTED
108bfd: 31 ff xor %edi,%edi <== NOT EXECUTED
ret = -1;
break;
}
}
diop->flags = iop->flags;
108bff: 89 77 14 mov %esi,0x14(%edi)
diop->pathinfo = iop->pathinfo;
108c02: 83 c7 18 add $0x18,%edi
108c05: 8d 73 18 lea 0x18(%ebx),%esi
108c08: b9 05 00 00 00 mov $0x5,%ecx
108c0d: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
ret = (int) (diop - rtems_libio_iops);
108c0f: 8b 4d e4 mov -0x1c(%ebp),%ecx
108c12: 29 c1 sub %eax,%ecx
108c14: 89 c8 mov %ecx,%eax
108c16: c1 f8 03 sar $0x3,%eax
108c19: 8d 0c c0 lea (%eax,%eax,8),%ecx
108c1c: 8d 0c c8 lea (%eax,%ecx,8),%ecx
108c1f: 8d 0c c8 lea (%eax,%ecx,8),%ecx
108c22: 8d 0c c8 lea (%eax,%ecx,8),%ecx
108c25: 89 ce mov %ecx,%esi
108c27: c1 e6 0f shl $0xf,%esi
108c2a: 01 f1 add %esi,%ecx
108c2c: 8d 34 c8 lea (%eax,%ecx,8),%esi
108c2f: f7 de neg %esi
108c31: eb 89 jmp 108bbc <fcntl+0xdc>
108c33: 90 nop
*/
if ( va_arg( ap, int ) )
iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC;
else
iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC;
108c34: 81 e6 ff f7 ff ff and $0xfffff7ff,%esi
108c3a: 89 73 14 mov %esi,0x14(%ebx)
rtems_libio_t *iop;
rtems_libio_t *diop;
int fd2;
int flags;
int mask;
int ret = 0;
108c3d: 31 f6 xor %esi,%esi
108c3f: e9 44 ff ff ff jmp 108b88 <fcntl+0xa8>
switch ( cmd ) {
case F_DUPFD: /* dup */
fd2 = va_arg( ap, int );
if ( fd2 )
diop = rtems_libio_iop( fd2 );
108c44: 8d 0c fd 00 00 00 00 lea 0x0(,%edi,8),%ecx
108c4b: 8d 3c cd 00 00 00 00 lea 0x0(,%ecx,8),%edi
108c52: 29 cf sub %ecx,%edi
108c54: 8d 3c 38 lea (%eax,%edi,1),%edi
108c57: 89 7d e4 mov %edi,-0x1c(%ebp)
108c5a: eb a3 jmp 108bff <fcntl+0x11f>
int mask;
int ret = 0;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open(iop);
108c5c: e8 13 b8 00 00 call 114474 <__errno>
108c61: c7 00 09 00 00 00 movl $0x9,(%eax)
108c67: be ff ff ff ff mov $0xffffffff,%esi
108c6c: e9 e3 fe ff ff jmp 108b54 <fcntl+0x74>
108c71: 8d 76 00 lea 0x0(%esi),%esi
fd2 = va_arg( ap, int );
if ( fd2 )
diop = rtems_libio_iop( fd2 );
else {
/* allocate a file control block */
diop = rtems_libio_allocate();
108c74: 89 55 e0 mov %edx,-0x20(%ebp)
108c77: e8 a0 04 00 00 call 10911c <rtems_libio_allocate>
108c7c: 89 c7 mov %eax,%edi
if ( diop == 0 ) {
108c7e: 85 c0 test %eax,%eax
108c80: 8b 55 e0 mov -0x20(%ebp),%edx
108c83: 0f 84 c6 fe ff ff je 108b4f <fcntl+0x6f> <== NEVER TAKEN
108c89: 8b 73 14 mov 0x14(%ebx),%esi
108c8c: 89 45 e4 mov %eax,-0x1c(%ebp)
108c8f: a1 e0 98 12 00 mov 0x1298e0,%eax
108c94: e9 66 ff ff ff jmp 108bff <fcntl+0x11f>
00108cbc <fdatasync>:
#include <rtems/seterr.h>
int fdatasync(
int fd
)
{
108cbc: 55 push %ebp
108cbd: 89 e5 mov %esp,%ebp
108cbf: 83 ec 08 sub $0x8,%esp
108cc2: 8b 45 08 mov 0x8(%ebp),%eax
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
108cc5: 3b 05 4c 56 12 00 cmp 0x12564c,%eax
108ccb: 73 2f jae 108cfc <fdatasync+0x40>
iop = rtems_libio_iop( fd );
108ccd: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx
108cd4: 8d 04 d5 00 00 00 00 lea 0x0(,%edx,8),%eax
108cdb: 29 d0 sub %edx,%eax
108cdd: 03 05 e0 98 12 00 add 0x1298e0,%eax
rtems_libio_check_is_open(iop);
108ce3: 8b 50 14 mov 0x14(%eax),%edx
108ce6: f6 c6 01 test $0x1,%dh
108ce9: 74 11 je 108cfc <fdatasync+0x40>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
108ceb: 83 e2 04 and $0x4,%edx
108cee: 74 20 je 108d10 <fdatasync+0x54>
/*
* Now process the fdatasync().
*/
return (*iop->pathinfo.handlers->fdatasync_h)( iop );
108cf0: 8b 50 20 mov 0x20(%eax),%edx
108cf3: 89 45 08 mov %eax,0x8(%ebp)
108cf6: 8b 42 2c mov 0x2c(%edx),%eax
}
108cf9: c9 leave
/*
* Now process the fdatasync().
*/
return (*iop->pathinfo.handlers->fdatasync_h)( iop );
108cfa: ff e0 jmp *%eax
{
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open(iop);
108cfc: e8 73 b7 00 00 call 114474 <__errno>
108d01: c7 00 09 00 00 00 movl $0x9,(%eax)
/*
* Now process the fdatasync().
*/
return (*iop->pathinfo.handlers->fdatasync_h)( iop );
}
108d07: b8 ff ff ff ff mov $0xffffffff,%eax
108d0c: c9 leave
108d0d: c3 ret
108d0e: 66 90 xchg %ax,%ax
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open(iop);
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
108d10: e8 5f b7 00 00 call 114474 <__errno>
108d15: c7 00 16 00 00 00 movl $0x16,(%eax)
108d1b: eb ea jmp 108d07 <fdatasync+0x4b>
00111a70 <fifo_open>:
*/
int fifo_open(
pipe_control_t **pipep,
rtems_libio_t *iop
)
{
111a70: 55 push %ebp
111a71: 89 e5 mov %esp,%ebp
111a73: 57 push %edi
111a74: 56 push %esi
111a75: 53 push %ebx
111a76: 83 ec 2c sub $0x2c,%esp
111a79: 8b 75 08 mov 0x8(%ebp),%esi
static rtems_status_code pipe_lock(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (pipe_semaphore == RTEMS_ID_NONE) {
111a7c: a1 ac a4 12 00 mov 0x12a4ac,%eax
111a81: 85 c0 test %eax,%eax
111a83: 0f 84 8b 00 00 00 je 111b14 <fifo_open+0xa4>
rtems_libio_unlock();
}
if (sc == RTEMS_SUCCESSFUL) {
sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
111a89: 53 push %ebx
111a8a: 6a 00 push $0x0
111a8c: 6a 00 push $0x0
111a8e: 50 push %eax
111a8f: e8 40 ba ff ff call 10d4d4 <rtems_semaphore_obtain>
}
if (sc == RTEMS_SUCCESSFUL) {
111a94: 83 c4 10 add $0x10,%esp
111a97: 85 c0 test %eax,%eax
111a99: 0f 85 4c 03 00 00 jne 111deb <fifo_open+0x37b> <== NEVER TAKEN
err = pipe_lock();
if (err)
return err;
pipe = *pipep;
111a9f: 8b 1e mov (%esi),%ebx
if (pipe == NULL) {
111aa1: 85 db test %ebx,%ebx
111aa3: 0f 84 df 01 00 00 je 111c88 <fifo_open+0x218>
err = pipe_alloc(&pipe);
if (err)
goto out;
}
if (! PIPE_LOCK(pipe))
111aa9: 52 push %edx
111aaa: 6a 00 push $0x0
111aac: 6a 00 push $0x0
111aae: ff 73 28 pushl 0x28(%ebx)
111ab1: e8 1e ba ff ff call 10d4d4 <rtems_semaphore_obtain>
111ab6: 83 c4 10 add $0x10,%esp
111ab9: 83 f8 01 cmp $0x1,%eax
111abc: 19 ff sbb %edi,%edi
111abe: f7 d7 not %edi
111ac0: 83 e7 fc and $0xfffffffc,%edi
err = -EINTR;
if (*pipep == NULL) {
111ac3: 8b 06 mov (%esi),%eax
111ac5: 85 c0 test %eax,%eax
111ac7: 0f 84 d7 02 00 00 je 111da4 <fifo_open+0x334>
else
*pipep = pipe;
}
out:
pipe_unlock();
111acd: e8 aa fe ff ff call 11197c <pipe_unlock>
pipe_control_t *pipe;
unsigned int prevCounter;
int err;
err = pipe_new(pipep);
if (err)
111ad2: 85 ff test %edi,%edi
111ad4: 75 32 jne 111b08 <fifo_open+0x98> <== NEVER TAKEN
return err;
pipe = *pipep;
111ad6: 8b 1e mov (%esi),%ebx
switch (LIBIO_ACCMODE(iop)) {
111ad8: 8b 55 0c mov 0xc(%ebp),%edx
111adb: 8b 42 14 mov 0x14(%edx),%eax
111ade: 83 e0 06 and $0x6,%eax
111ae1: 83 f8 04 cmp $0x4,%eax
111ae4: 74 6a je 111b50 <fifo_open+0xe0>
111ae6: 83 f8 06 cmp $0x6,%eax
111ae9: 0f 84 59 01 00 00 je 111c48 <fifo_open+0x1d8>
111aef: 83 f8 02 cmp $0x2,%eax
111af2: 0f 84 dc 00 00 00 je 111bd4 <fifo_open+0x164> <== ALWAYS TAKEN
if (pipe->Writers ++ == 0)
PIPE_WAKEUPREADERS(pipe);
break;
}
PIPE_UNLOCK(pipe);
111af8: 83 ec 0c sub $0xc,%esp
111afb: ff 73 28 pushl 0x28(%ebx)
111afe: e8 cd ba ff ff call 10d5d0 <rtems_semaphore_release>
return 0;
111b03: 83 c4 10 add $0x10,%esp
111b06: 31 ff xor %edi,%edi
out_error:
pipe_release(pipep, iop);
return err;
}
111b08: 89 f8 mov %edi,%eax
111b0a: 8d 65 f4 lea -0xc(%ebp),%esp
111b0d: 5b pop %ebx
111b0e: 5e pop %esi
111b0f: 5f pop %edi
111b10: c9 leave
111b11: c3 ret
111b12: 66 90 xchg %ax,%ax
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
111b14: 50 push %eax
111b15: 6a 00 push $0x0
111b17: 6a 00 push $0x0
111b19: ff 35 c8 a6 12 00 pushl 0x12a6c8
111b1f: e8 b0 b9 ff ff call 10d4d4 <rtems_semaphore_obtain>
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (pipe_semaphore == RTEMS_ID_NONE) {
rtems_libio_lock();
if (pipe_semaphore == RTEMS_ID_NONE) {
111b24: 83 c4 10 add $0x10,%esp
111b27: 8b 3d ac a4 12 00 mov 0x12a4ac,%edi
111b2d: 85 ff test %edi,%edi
111b2f: 0f 84 83 02 00 00 je 111db8 <fifo_open+0x348> <== ALWAYS TAKEN
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
111b35: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
111b38: ff 35 c8 a6 12 00 pushl 0x12a6c8 <== NOT EXECUTED
111b3e: e8 8d ba ff ff call 10d5d0 <rtems_semaphore_release><== NOT EXECUTED
111b43: a1 ac a4 12 00 mov 0x12a4ac,%eax <== NOT EXECUTED
111b48: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
111b4b: e9 39 ff ff ff jmp 111a89 <fifo_open+0x19> <== NOT EXECUTED
} while (prevCounter == pipe->writerCounter);
}
break;
case LIBIO_FLAGS_WRITE:
pipe->writerCounter ++;
111b50: ff 43 24 incl 0x24(%ebx)
if (pipe->Writers ++ == 0)
111b53: 8b 43 14 mov 0x14(%ebx),%eax
111b56: 8d 50 01 lea 0x1(%eax),%edx
111b59: 89 53 14 mov %edx,0x14(%ebx)
111b5c: 85 c0 test %eax,%eax
111b5e: 0f 84 c4 02 00 00 je 111e28 <fifo_open+0x3b8> <== ALWAYS TAKEN
PIPE_WAKEUPREADERS(pipe);
if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) {
111b64: 8b 4b 10 mov 0x10(%ebx),%ecx
111b67: 85 c9 test %ecx,%ecx
111b69: 75 8d jne 111af8 <fifo_open+0x88>
111b6b: 8b 55 0c mov 0xc(%ebp),%edx
111b6e: f6 42 14 01 testb $0x1,0x14(%edx)
111b72: 0f 85 04 03 00 00 jne 111e7c <fifo_open+0x40c>
err = -ENXIO;
goto out_error;
}
if (pipe->Readers == 0) {
prevCounter = pipe->readerCounter;
111b78: 8b 7b 20 mov 0x20(%ebx),%edi
111b7b: eb 20 jmp 111b9d <fifo_open+0x12d>
111b7d: 8d 76 00 lea 0x0(%esi),%esi
err = -EINTR;
do {
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
goto out_error;
if (! PIPE_LOCK(pipe))
111b80: 51 push %ecx
111b81: 6a 00 push $0x0
111b83: 6a 00 push $0x0
111b85: ff 73 28 pushl 0x28(%ebx)
111b88: e8 47 b9 ff ff call 10d4d4 <rtems_semaphore_obtain>
111b8d: 83 c4 10 add $0x10,%esp
111b90: 85 c0 test %eax,%eax
111b92: 75 27 jne 111bbb <fifo_open+0x14b> <== NEVER TAKEN
goto out_error;
} while (prevCounter == pipe->readerCounter);
111b94: 39 7b 20 cmp %edi,0x20(%ebx)
111b97: 0f 85 5b ff ff ff jne 111af8 <fifo_open+0x88> <== ALWAYS TAKEN
if (pipe->Readers == 0) {
prevCounter = pipe->readerCounter;
err = -EINTR;
do {
PIPE_UNLOCK(pipe);
111b9d: 83 ec 0c sub $0xc,%esp
111ba0: ff 73 28 pushl 0x28(%ebx)
111ba3: e8 28 ba ff ff call 10d5d0 <rtems_semaphore_release>
if (! PIPE_WRITEWAIT(pipe))
111ba8: 58 pop %eax
111ba9: 5a pop %edx
111baa: 6a 00 push $0x0
111bac: ff 73 30 pushl 0x30(%ebx)
111baf: e8 b0 1c 00 00 call 113864 <rtems_barrier_wait>
111bb4: 83 c4 10 add $0x10,%esp
111bb7: 85 c0 test %eax,%eax
111bb9: 74 c5 je 111b80 <fifo_open+0x110> <== ALWAYS TAKEN
goto out_error;
}
if (pipe->Readers == 0) {
prevCounter = pipe->readerCounter;
err = -EINTR;
111bbb: bf fc ff ff ff mov $0xfffffffc,%edi <== NOT EXECUTED
PIPE_UNLOCK(pipe);
return 0;
out_error:
pipe_release(pipep, iop);
111bc0: 83 ec 08 sub $0x8,%esp
111bc3: ff 75 0c pushl 0xc(%ebp)
111bc6: 56 push %esi
111bc7: e8 c8 fd ff ff call 111994 <pipe_release>
return err;
111bcc: 83 c4 10 add $0x10,%esp
111bcf: e9 34 ff ff ff jmp 111b08 <fifo_open+0x98>
return err;
pipe = *pipep;
switch (LIBIO_ACCMODE(iop)) {
case LIBIO_FLAGS_READ:
pipe->readerCounter ++;
111bd4: ff 43 20 incl 0x20(%ebx)
if (pipe->Readers ++ == 0)
111bd7: 8b 43 10 mov 0x10(%ebx),%eax
111bda: 8d 50 01 lea 0x1(%eax),%edx
111bdd: 89 53 10 mov %edx,0x10(%ebx)
111be0: 85 c0 test %eax,%eax
111be2: 0f 84 10 02 00 00 je 111df8 <fifo_open+0x388> <== ALWAYS TAKEN
PIPE_WAKEUPWRITERS(pipe);
if (pipe->Writers == 0) {
111be8: 8b 7b 14 mov 0x14(%ebx),%edi
111beb: 85 ff test %edi,%edi
111bed: 0f 85 05 ff ff ff jne 111af8 <fifo_open+0x88>
/* Not an error */
if (LIBIO_NODELAY(iop))
111bf3: 8b 45 0c mov 0xc(%ebp),%eax
111bf6: f6 40 14 01 testb $0x1,0x14(%eax)
111bfa: 0f 85 f8 fe ff ff jne 111af8 <fifo_open+0x88>
break;
prevCounter = pipe->writerCounter;
111c00: 8b 7b 24 mov 0x24(%ebx),%edi
111c03: eb 20 jmp 111c25 <fifo_open+0x1b5>
111c05: 8d 76 00 lea 0x0(%esi),%esi
/* Wait until a writer opens the pipe */
do {
PIPE_UNLOCK(pipe);
if (! PIPE_READWAIT(pipe))
goto out_error;
if (! PIPE_LOCK(pipe))
111c08: 50 push %eax
111c09: 6a 00 push $0x0
111c0b: 6a 00 push $0x0
111c0d: ff 73 28 pushl 0x28(%ebx)
111c10: e8 bf b8 ff ff call 10d4d4 <rtems_semaphore_obtain>
111c15: 83 c4 10 add $0x10,%esp
111c18: 85 c0 test %eax,%eax
111c1a: 75 9f jne 111bbb <fifo_open+0x14b> <== NEVER TAKEN
goto out_error;
} while (prevCounter == pipe->writerCounter);
111c1c: 39 7b 24 cmp %edi,0x24(%ebx)
111c1f: 0f 85 d3 fe ff ff jne 111af8 <fifo_open+0x88> <== ALWAYS TAKEN
prevCounter = pipe->writerCounter;
err = -EINTR;
/* Wait until a writer opens the pipe */
do {
PIPE_UNLOCK(pipe);
111c25: 83 ec 0c sub $0xc,%esp
111c28: ff 73 28 pushl 0x28(%ebx)
111c2b: e8 a0 b9 ff ff call 10d5d0 <rtems_semaphore_release>
if (! PIPE_READWAIT(pipe))
111c30: 5a pop %edx
111c31: 59 pop %ecx
111c32: 6a 00 push $0x0
111c34: ff 73 2c pushl 0x2c(%ebx)
111c37: e8 28 1c 00 00 call 113864 <rtems_barrier_wait>
111c3c: 83 c4 10 add $0x10,%esp
111c3f: 85 c0 test %eax,%eax
111c41: 74 c5 je 111c08 <fifo_open+0x198> <== ALWAYS TAKEN
111c43: e9 73 ff ff ff jmp 111bbb <fifo_open+0x14b> <== NOT EXECUTED
} while (prevCounter == pipe->readerCounter);
}
break;
case LIBIO_FLAGS_READ_WRITE:
pipe->readerCounter ++;
111c48: ff 43 20 incl 0x20(%ebx)
if (pipe->Readers ++ == 0)
111c4b: 8b 43 10 mov 0x10(%ebx),%eax
111c4e: 8d 50 01 lea 0x1(%eax),%edx
111c51: 89 53 10 mov %edx,0x10(%ebx)
111c54: 85 c0 test %eax,%eax
111c56: 0f 84 b4 01 00 00 je 111e10 <fifo_open+0x3a0> <== ALWAYS TAKEN
PIPE_WAKEUPWRITERS(pipe);
pipe->writerCounter ++;
111c5c: ff 43 24 incl 0x24(%ebx)
if (pipe->Writers ++ == 0)
111c5f: 8b 43 14 mov 0x14(%ebx),%eax
111c62: 8d 50 01 lea 0x1(%eax),%edx
111c65: 89 53 14 mov %edx,0x14(%ebx)
111c68: 85 c0 test %eax,%eax
111c6a: 0f 85 88 fe ff ff jne 111af8 <fifo_open+0x88> <== NEVER TAKEN
PIPE_WAKEUPREADERS(pipe);
111c70: 83 ec 08 sub $0x8,%esp
111c73: 8d 45 e4 lea -0x1c(%ebp),%eax
111c76: 50 push %eax
111c77: ff 73 2c pushl 0x2c(%ebx)
111c7a: e8 81 1b 00 00 call 113800 <rtems_barrier_release>
111c7f: 83 c4 10 add $0x10,%esp
111c82: e9 71 fe ff ff jmp 111af8 <fifo_open+0x88>
111c87: 90 nop
{
static char c = 'a';
pipe_control_t *pipe;
int err = -ENOMEM;
pipe = malloc(sizeof(pipe_control_t));
111c88: 83 ec 0c sub $0xc,%esp
111c8b: 6a 34 push $0x34
111c8d: e8 2e 84 ff ff call 10a0c0 <malloc>
111c92: 89 c3 mov %eax,%ebx
111c94: 89 45 d4 mov %eax,-0x2c(%ebp)
if (pipe == NULL)
111c97: 83 c4 10 add $0x10,%esp
111c9a: 85 c0 test %eax,%eax
111c9c: 0f 84 32 02 00 00 je 111ed4 <fifo_open+0x464>
return err;
memset(pipe, 0, sizeof(pipe_control_t));
111ca2: b9 34 00 00 00 mov $0x34,%ecx
111ca7: 31 c0 xor %eax,%eax
111ca9: 89 df mov %ebx,%edi
111cab: f3 aa rep stos %al,%es:(%edi)
pipe->Size = PIPE_BUF;
111cad: c7 43 04 00 02 00 00 movl $0x200,0x4(%ebx)
pipe->Buffer = malloc(pipe->Size);
111cb4: 83 ec 0c sub $0xc,%esp
111cb7: 68 00 02 00 00 push $0x200
111cbc: e8 ff 83 ff ff call 10a0c0 <malloc>
111cc1: 89 03 mov %eax,(%ebx)
if (! pipe->Buffer)
111cc3: 83 c4 10 add $0x10,%esp
111cc6: 85 c0 test %eax,%eax
111cc8: 0f 84 f8 01 00 00 je 111ec6 <fifo_open+0x456> <== NEVER TAKEN
goto err_buf;
err = -ENOMEM;
if (rtems_barrier_create(
111cce: 8d 43 2c lea 0x2c(%ebx),%eax
111cd1: 50 push %eax
111cd2: 6a 00 push $0x0
111cd4: 6a 00 push $0x0
rtems_build_name ('P', 'I', 'r', c),
111cd6: 0f be 05 38 84 12 00 movsbl 0x128438,%eax
if (! pipe->Buffer)
goto err_buf;
err = -ENOMEM;
if (rtems_barrier_create(
111cdd: 0d 00 72 49 50 or $0x50497200,%eax
111ce2: 50 push %eax
111ce3: e8 9c 19 00 00 call 113684 <rtems_barrier_create>
111ce8: 83 c4 10 add $0x10,%esp
111ceb: 85 c0 test %eax,%eax
111ced: 0f 85 c3 01 00 00 jne 111eb6 <fifo_open+0x446>
rtems_build_name ('P', 'I', 'r', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->readBarrier) != RTEMS_SUCCESSFUL)
goto err_rbar;
if (rtems_barrier_create(
111cf3: 8d 43 30 lea 0x30(%ebx),%eax
111cf6: 50 push %eax
111cf7: 6a 00 push $0x0
111cf9: 6a 00 push $0x0
rtems_build_name ('P', 'I', 'w', c),
111cfb: 0f be 05 38 84 12 00 movsbl 0x128438,%eax
if (rtems_barrier_create(
rtems_build_name ('P', 'I', 'r', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->readBarrier) != RTEMS_SUCCESSFUL)
goto err_rbar;
if (rtems_barrier_create(
111d02: 0d 00 77 49 50 or $0x50497700,%eax
111d07: 50 push %eax
111d08: e8 77 19 00 00 call 113684 <rtems_barrier_create>
111d0d: 83 c4 10 add $0x10,%esp
111d10: 85 c0 test %eax,%eax
111d12: 0f 85 8d 01 00 00 jne 111ea5 <fifo_open+0x435>
rtems_build_name ('P', 'I', 'w', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->writeBarrier) != RTEMS_SUCCESSFUL)
goto err_wbar;
if (rtems_semaphore_create(
111d18: 83 ec 0c sub $0xc,%esp
111d1b: 8d 43 28 lea 0x28(%ebx),%eax
111d1e: 50 push %eax
111d1f: 6a 00 push $0x0
111d21: 6a 10 push $0x10
111d23: 6a 01 push $0x1
rtems_build_name ('P', 'I', 's', c), 1,
111d25: 0f be 05 38 84 12 00 movsbl 0x128438,%eax
if (rtems_barrier_create(
rtems_build_name ('P', 'I', 'w', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->writeBarrier) != RTEMS_SUCCESSFUL)
goto err_wbar;
if (rtems_semaphore_create(
111d2c: 0d 00 73 49 50 or $0x50497300,%eax
111d31: 50 push %eax
111d32: e8 21 b5 ff ff call 10d258 <rtems_semaphore_create>
111d37: 83 c4 20 add $0x20,%esp
111d3a: 85 c0 test %eax,%eax
111d3c: 0f 85 52 01 00 00 jne 111e94 <fifo_open+0x424>
Objects_Id id,
Objects_Locations *location
)
{
return (Barrier_Control *)
_Objects_Get( &_Barrier_Information, id, location );
111d42: 51 push %ecx
/* Set barriers to be interruptible by signals. */
static void pipe_interruptible(pipe_control_t *pipe)
{
Objects_Locations location;
_Barrier_Get(pipe->readBarrier, &location)->Barrier.Wait_queue.state
111d43: 8d 7d e0 lea -0x20(%ebp),%edi
111d46: 57 push %edi
111d47: ff 73 2c pushl 0x2c(%ebx)
111d4a: 68 60 b2 12 00 push $0x12b260
111d4f: e8 c8 ce ff ff call 10ec1c <_Objects_Get>
|= STATES_INTERRUPTIBLE_BY_SIGNAL;
111d54: 81 48 4c 00 00 00 10 orl $0x10000000,0x4c(%eax)
_Thread_Enable_dispatch();
111d5b: e8 a0 d9 ff ff call 10f700 <_Thread_Enable_dispatch>
111d60: 83 c4 0c add $0xc,%esp
111d63: 57 push %edi
111d64: ff 73 30 pushl 0x30(%ebx)
111d67: 68 60 b2 12 00 push $0x12b260
111d6c: e8 ab ce ff ff call 10ec1c <_Objects_Get>
_Barrier_Get(pipe->writeBarrier, &location)->Barrier.Wait_queue.state
|= STATES_INTERRUPTIBLE_BY_SIGNAL;
111d71: 81 48 4c 00 00 00 10 orl $0x10000000,0x4c(%eax)
_Thread_Enable_dispatch();
111d78: e8 83 d9 ff ff call 10f700 <_Thread_Enable_dispatch>
#ifdef RTEMS_POSIX_API
pipe_interruptible(pipe);
#endif
*pipep = pipe;
if (c ++ == 'z')
111d7d: a0 38 84 12 00 mov 0x128438,%al
111d82: 8d 50 01 lea 0x1(%eax),%edx
111d85: 88 15 38 84 12 00 mov %dl,0x128438
111d8b: 83 c4 10 add $0x10,%esp
111d8e: 3c 7a cmp $0x7a,%al
111d90: 0f 85 13 fd ff ff jne 111aa9 <fifo_open+0x39>
c = 'a';
111d96: c6 05 38 84 12 00 61 movb $0x61,0x128438
111d9d: e9 07 fd ff ff jmp 111aa9 <fifo_open+0x39>
111da2: 66 90 xchg %ax,%ax
if (! PIPE_LOCK(pipe))
err = -EINTR;
if (*pipep == NULL) {
if (err)
111da4: 85 ff test %edi,%edi
111da6: 0f 85 94 00 00 00 jne 111e40 <fifo_open+0x3d0> <== NEVER TAKEN
pipe_free(pipe);
else
*pipep = pipe;
111dac: 89 1e mov %ebx,(%esi)
}
out:
pipe_unlock();
111dae: e8 c9 fb ff ff call 11197c <pipe_unlock>
111db3: e9 1e fd ff ff jmp 111ad6 <fifo_open+0x66>
if (pipe_semaphore == RTEMS_ID_NONE) {
rtems_libio_lock();
if (pipe_semaphore == RTEMS_ID_NONE) {
sc = rtems_semaphore_create(
111db8: 83 ec 0c sub $0xc,%esp
111dbb: 68 ac a4 12 00 push $0x12a4ac
111dc0: 6a 00 push $0x0
111dc2: 6a 54 push $0x54
111dc4: 6a 01 push $0x1
111dc6: 68 45 50 49 50 push $0x50495045
111dcb: e8 88 b4 ff ff call 10d258 <rtems_semaphore_create>
111dd0: 89 c3 mov %eax,%ebx
111dd2: 83 c4 14 add $0x14,%esp
111dd5: ff 35 c8 a6 12 00 pushl 0x12a6c8
111ddb: e8 f0 b7 ff ff call 10d5d0 <rtems_semaphore_release>
}
rtems_libio_unlock();
}
if (sc == RTEMS_SUCCESSFUL) {
111de0: 83 c4 10 add $0x10,%esp
111de3: 85 db test %ebx,%ebx
111de5: 0f 84 f0 00 00 00 je 111edb <fifo_open+0x46b>
)
{
pipe_control_t *pipe;
int err = 0;
err = pipe_lock();
111deb: bf f4 ff ff ff mov $0xfffffff4,%edi
111df0: e9 13 fd ff ff jmp 111b08 <fifo_open+0x98>
111df5: 8d 76 00 lea 0x0(%esi),%esi
switch (LIBIO_ACCMODE(iop)) {
case LIBIO_FLAGS_READ:
pipe->readerCounter ++;
if (pipe->Readers ++ == 0)
PIPE_WAKEUPWRITERS(pipe);
111df8: 83 ec 08 sub $0x8,%esp
111dfb: 8d 45 e4 lea -0x1c(%ebp),%eax
111dfe: 50 push %eax
111dff: ff 73 30 pushl 0x30(%ebx)
111e02: e8 f9 19 00 00 call 113800 <rtems_barrier_release>
111e07: 83 c4 10 add $0x10,%esp
111e0a: e9 d9 fd ff ff jmp 111be8 <fifo_open+0x178>
111e0f: 90 nop
break;
case LIBIO_FLAGS_READ_WRITE:
pipe->readerCounter ++;
if (pipe->Readers ++ == 0)
PIPE_WAKEUPWRITERS(pipe);
111e10: 83 ec 08 sub $0x8,%esp
111e13: 8d 45 e4 lea -0x1c(%ebp),%eax
111e16: 50 push %eax
111e17: ff 73 30 pushl 0x30(%ebx)
111e1a: e8 e1 19 00 00 call 113800 <rtems_barrier_release>
111e1f: 83 c4 10 add $0x10,%esp
111e22: e9 35 fe ff ff jmp 111c5c <fifo_open+0x1ec>
111e27: 90 nop
case LIBIO_FLAGS_WRITE:
pipe->writerCounter ++;
if (pipe->Writers ++ == 0)
PIPE_WAKEUPREADERS(pipe);
111e28: 83 ec 08 sub $0x8,%esp
111e2b: 8d 45 e4 lea -0x1c(%ebp),%eax
111e2e: 50 push %eax
111e2f: ff 73 2c pushl 0x2c(%ebx)
111e32: e8 c9 19 00 00 call 113800 <rtems_barrier_release>
111e37: 83 c4 10 add $0x10,%esp
111e3a: e9 25 fd ff ff jmp 111b64 <fifo_open+0xf4>
111e3f: 90 nop
/* Called with pipe_semaphore held. */
static inline void pipe_free(
pipe_control_t *pipe
)
{
rtems_barrier_delete(pipe->readBarrier);
111e40: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
111e43: ff 73 2c pushl 0x2c(%ebx) <== NOT EXECUTED
111e46: e8 25 19 00 00 call 113770 <rtems_barrier_delete> <== NOT EXECUTED
rtems_barrier_delete(pipe->writeBarrier);
111e4b: 59 pop %ecx <== NOT EXECUTED
111e4c: ff 73 30 pushl 0x30(%ebx) <== NOT EXECUTED
111e4f: e8 1c 19 00 00 call 113770 <rtems_barrier_delete> <== NOT EXECUTED
rtems_semaphore_delete(pipe->Semaphore);
111e54: 5a pop %edx <== NOT EXECUTED
111e55: ff 73 28 pushl 0x28(%ebx) <== NOT EXECUTED
111e58: e8 d3 b5 ff ff call 10d430 <rtems_semaphore_delete><== NOT EXECUTED
free(pipe->Buffer);
111e5d: 58 pop %eax <== NOT EXECUTED
111e5e: ff 33 pushl (%ebx) <== NOT EXECUTED
111e60: e8 6b 7b ff ff call 1099d0 <free> <== NOT EXECUTED
free(pipe);
111e65: 89 1c 24 mov %ebx,(%esp) <== NOT EXECUTED
111e68: e8 63 7b ff ff call 1099d0 <free> <== NOT EXECUTED
111e6d: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
else
*pipep = pipe;
}
out:
pipe_unlock();
111e70: e8 07 fb ff ff call 11197c <pipe_unlock>
111e75: e9 8e fc ff ff jmp 111b08 <fifo_open+0x98>
111e7a: 66 90 xchg %ax,%ax
if (pipe->Writers ++ == 0)
PIPE_WAKEUPREADERS(pipe);
if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) {
PIPE_UNLOCK(pipe);
111e7c: 83 ec 0c sub $0xc,%esp
111e7f: ff 73 28 pushl 0x28(%ebx)
111e82: e8 49 b7 ff ff call 10d5d0 <rtems_semaphore_release>
err = -ENXIO;
goto out_error;
111e87: 83 c4 10 add $0x10,%esp
if (pipe->Writers ++ == 0)
PIPE_WAKEUPREADERS(pipe);
if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) {
PIPE_UNLOCK(pipe);
err = -ENXIO;
111e8a: bf fa ff ff ff mov $0xfffffffa,%edi
goto out_error;
111e8f: e9 2c fd ff ff jmp 111bc0 <fifo_open+0x150>
if (c ++ == 'z')
c = 'a';
return 0;
err_sem:
rtems_barrier_delete(pipe->writeBarrier);
111e94: 83 ec 0c sub $0xc,%esp
111e97: 8b 45 d4 mov -0x2c(%ebp),%eax
111e9a: ff 70 30 pushl 0x30(%eax)
111e9d: e8 ce 18 00 00 call 113770 <rtems_barrier_delete>
111ea2: 83 c4 10 add $0x10,%esp
err_wbar:
rtems_barrier_delete(pipe->readBarrier);
111ea5: 83 ec 0c sub $0xc,%esp
111ea8: 8b 55 d4 mov -0x2c(%ebp),%edx
111eab: ff 72 2c pushl 0x2c(%edx)
111eae: e8 bd 18 00 00 call 113770 <rtems_barrier_delete>
111eb3: 83 c4 10 add $0x10,%esp
err_rbar:
free(pipe->Buffer);
111eb6: 83 ec 0c sub $0xc,%esp
111eb9: 8b 45 d4 mov -0x2c(%ebp),%eax
111ebc: ff 30 pushl (%eax)
111ebe: e8 0d 7b ff ff call 1099d0 <free>
111ec3: 83 c4 10 add $0x10,%esp
err_buf:
free(pipe);
111ec6: 83 ec 0c sub $0xc,%esp
111ec9: ff 75 d4 pushl -0x2c(%ebp)
111ecc: e8 ff 7a ff ff call 1099d0 <free>
111ed1: 83 c4 10 add $0x10,%esp
)
{
pipe_control_t *pipe;
int err = 0;
err = pipe_lock();
111ed4: bf f4 ff ff ff mov $0xfffffff4,%edi
111ed9: eb 95 jmp 111e70 <fifo_open+0x400>
}
rtems_libio_unlock();
}
if (sc == RTEMS_SUCCESSFUL) {
111edb: a1 ac a4 12 00 mov 0x12a4ac,%eax
111ee0: e9 a4 fb ff ff jmp 111a89 <fifo_open+0x19>
0010ff9c <find_handler>:
const char *type;
rtems_filesystem_fsmount_me_t mount_h;
} find_arg;
static bool find_handler(const rtems_filesystem_table_t *entry, void *arg)
{
10ff9c: 55 push %ebp
10ff9d: 89 e5 mov %esp,%ebp
10ff9f: 56 push %esi
10ffa0: 53 push %ebx
10ffa1: 8b 75 08 mov 0x8(%ebp),%esi
10ffa4: 8b 5d 0c mov 0xc(%ebp),%ebx
find_arg *fa = arg;
if ( strcmp( entry->type, fa->type ) != 0 ) {
10ffa7: 83 ec 08 sub $0x8,%esp
10ffaa: ff 33 pushl (%ebx)
10ffac: ff 36 pushl (%esi)
10ffae: e8 d9 3f 00 00 call 113f8c <strcmp>
10ffb3: 83 c4 10 add $0x10,%esp
10ffb6: 85 c0 test %eax,%eax
10ffb8: 75 12 jne 10ffcc <find_handler+0x30>
return false;
} else {
fa->mount_h = entry->mount_h;
10ffba: 8b 46 04 mov 0x4(%esi),%eax
10ffbd: 89 43 04 mov %eax,0x4(%ebx)
return true;
10ffc0: b0 01 mov $0x1,%al
}
}
10ffc2: 8d 65 f8 lea -0x8(%ebp),%esp
10ffc5: 5b pop %ebx
10ffc6: 5e pop %esi
10ffc7: c9 leave
10ffc8: c3 ret
10ffc9: 8d 76 00 lea 0x0(%esi),%esi
static bool find_handler(const rtems_filesystem_table_t *entry, void *arg)
{
find_arg *fa = arg;
if ( strcmp( entry->type, fa->type ) != 0 ) {
return false;
10ffcc: 31 c0 xor %eax,%eax
} else {
fa->mount_h = entry->mount_h;
return true;
}
}
10ffce: 8d 65 f8 lea -0x8(%ebp),%esp
10ffd1: 5b pop %ebx
10ffd2: 5e pop %esi
10ffd3: c9 leave
10ffd4: c3 ret
00108d20 <fpathconf>:
long fpathconf(
int fd,
int name
)
{
108d20: 55 push %ebp
108d21: 89 e5 mov %esp,%ebp
108d23: 83 ec 08 sub $0x8,%esp
108d26: 8b 45 08 mov 0x8(%ebp),%eax
108d29: 8b 55 0c mov 0xc(%ebp),%edx
long return_value;
rtems_libio_t *iop;
rtems_filesystem_limits_and_options_t *the_limits;
rtems_libio_check_fd(fd);
108d2c: 3b 05 4c 56 12 00 cmp 0x12564c,%eax
108d32: 0f 83 ac 00 00 00 jae 108de4 <fpathconf+0xc4>
iop = rtems_libio_iop(fd);
108d38: 8d 0c c5 00 00 00 00 lea 0x0(,%eax,8),%ecx
108d3f: 8d 04 cd 00 00 00 00 lea 0x0(,%ecx,8),%eax
108d46: 29 c8 sub %ecx,%eax
108d48: 03 05 e0 98 12 00 add 0x1298e0,%eax
rtems_libio_check_is_open(iop);
108d4e: 8b 48 14 mov 0x14(%eax),%ecx
108d51: f6 c5 01 test $0x1,%ch
108d54: 0f 84 8a 00 00 00 je 108de4 <fpathconf+0xc4> <== NEVER TAKEN
rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ);
108d5a: 83 e1 02 and $0x2,%ecx
108d5d: 74 08 je 108d67 <fpathconf+0x47>
/*
* Now process the information request.
*/
the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options;
108d5f: 8b 40 28 mov 0x28(%eax),%eax
switch ( name ) {
108d62: 83 fa 0b cmp $0xb,%edx
108d65: 76 15 jbe 108d7c <fpathconf+0x5c>
break;
case _PC_SYNC_IO:
return_value = the_limits->posix_sync_io;
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
108d67: e8 08 b7 00 00 call 114474 <__errno>
108d6c: c7 00 16 00 00 00 movl $0x16,(%eax)
108d72: b8 ff ff ff ff mov $0xffffffff,%eax
break;
}
return return_value;
}
108d77: c9 leave
108d78: c3 ret
108d79: 8d 76 00 lea 0x0(%esi),%esi
* Now process the information request.
*/
the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options;
switch ( name ) {
108d7c: ff 24 95 b8 2f 12 00 jmp *0x122fb8(,%edx,4)
108d83: 90 nop
break;
case _PC_ASYNC_IO:
return_value = the_limits->posix_async_io;
break;
case _PC_PRIO_IO:
return_value = the_limits->posix_prio_io;
108d84: 8b 40 5c mov 0x5c(%eax),%eax
rtems_set_errno_and_return_minus_one( EINVAL );
break;
}
return return_value;
}
108d87: c9 leave
108d88: c3 ret
108d89: 8d 76 00 lea 0x0(%esi),%esi
break;
case _PC_VDISABLE:
return_value = the_limits->posix_vdisable;
break;
case _PC_ASYNC_IO:
return_value = the_limits->posix_async_io;
108d8c: 8b 40 50 mov 0x50(%eax),%eax
rtems_set_errno_and_return_minus_one( EINVAL );
break;
}
return return_value;
}
108d8f: c9 leave
108d90: c3 ret
108d91: 8d 76 00 lea 0x0(%esi),%esi
break;
case _PC_NO_TRUNC:
return_value = the_limits->posix_no_trunc;
break;
case _PC_VDISABLE:
return_value = the_limits->posix_vdisable;
108d94: 8b 40 64 mov 0x64(%eax),%eax
rtems_set_errno_and_return_minus_one( EINVAL );
break;
}
return return_value;
}
108d97: c9 leave
108d98: c3 ret
108d99: 8d 76 00 lea 0x0(%esi),%esi
break;
case _PC_CHOWN_RESTRICTED:
return_value = the_limits->posix_chown_restrictions;
break;
case _PC_NO_TRUNC:
return_value = the_limits->posix_no_trunc;
108d9c: 8b 40 58 mov 0x58(%eax),%eax
rtems_set_errno_and_return_minus_one( EINVAL );
break;
}
return return_value;
}
108d9f: c9 leave
108da0: c3 ret
108da1: 8d 76 00 lea 0x0(%esi),%esi
break;
case _PC_PIPE_BUF:
return_value = the_limits->pipe_buf;
break;
case _PC_CHOWN_RESTRICTED:
return_value = the_limits->posix_chown_restrictions;
108da4: 8b 40 54 mov 0x54(%eax),%eax
rtems_set_errno_and_return_minus_one( EINVAL );
break;
}
return return_value;
}
108da7: c9 leave
108da8: c3 ret
108da9: 8d 76 00 lea 0x0(%esi),%esi
break;
case _PC_PATH_MAX:
return_value = the_limits->path_max;
break;
case _PC_PIPE_BUF:
return_value = the_limits->pipe_buf;
108dac: 8b 40 4c mov 0x4c(%eax),%eax
rtems_set_errno_and_return_minus_one( EINVAL );
break;
}
return return_value;
}
108daf: c9 leave
108db0: c3 ret
108db1: 8d 76 00 lea 0x0(%esi),%esi
break;
case _PC_NAME_MAX:
return_value = the_limits->name_max;
break;
case _PC_PATH_MAX:
return_value = the_limits->path_max;
108db4: 8b 40 48 mov 0x48(%eax),%eax
rtems_set_errno_and_return_minus_one( EINVAL );
break;
}
return return_value;
}
108db7: c9 leave
108db8: c3 ret
108db9: 8d 76 00 lea 0x0(%esi),%esi
break;
case _PC_MAX_INPUT:
return_value = the_limits->max_input;
break;
case _PC_NAME_MAX:
return_value = the_limits->name_max;
108dbc: 8b 40 44 mov 0x44(%eax),%eax
rtems_set_errno_and_return_minus_one( EINVAL );
break;
}
return return_value;
}
108dbf: c9 leave
108dc0: c3 ret
108dc1: 8d 76 00 lea 0x0(%esi),%esi
break;
case _PC_MAX_CANON:
return_value = the_limits->max_canon;
break;
case _PC_MAX_INPUT:
return_value = the_limits->max_input;
108dc4: 8b 40 40 mov 0x40(%eax),%eax
rtems_set_errno_and_return_minus_one( EINVAL );
break;
}
return return_value;
}
108dc7: c9 leave
108dc8: c3 ret
108dc9: 8d 76 00 lea 0x0(%esi),%esi
switch ( name ) {
case _PC_LINK_MAX:
return_value = the_limits->link_max;
break;
case _PC_MAX_CANON:
return_value = the_limits->max_canon;
108dcc: 8b 40 3c mov 0x3c(%eax),%eax
rtems_set_errno_and_return_minus_one( EINVAL );
break;
}
return return_value;
}
108dcf: c9 leave
108dd0: c3 ret
108dd1: 8d 76 00 lea 0x0(%esi),%esi
the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options;
switch ( name ) {
case _PC_LINK_MAX:
return_value = the_limits->link_max;
108dd4: 8b 40 38 mov 0x38(%eax),%eax
rtems_set_errno_and_return_minus_one( EINVAL );
break;
}
return return_value;
}
108dd7: c9 leave
108dd8: c3 ret
108dd9: 8d 76 00 lea 0x0(%esi),%esi
break;
case _PC_PRIO_IO:
return_value = the_limits->posix_prio_io;
break;
case _PC_SYNC_IO:
return_value = the_limits->posix_sync_io;
108ddc: 8b 40 60 mov 0x60(%eax),%eax
rtems_set_errno_and_return_minus_one( EINVAL );
break;
}
return return_value;
}
108ddf: c9 leave
108de0: c3 ret
108de1: 8d 76 00 lea 0x0(%esi),%esi
rtems_libio_t *iop;
rtems_filesystem_limits_and_options_t *the_limits;
rtems_libio_check_fd(fd);
iop = rtems_libio_iop(fd);
rtems_libio_check_is_open(iop);
108de4: e8 8b b6 00 00 call 114474 <__errno>
108de9: c7 00 09 00 00 00 movl $0x9,(%eax)
108def: b8 ff ff ff ff mov $0xffffffff,%eax
rtems_set_errno_and_return_minus_one( EINVAL );
break;
}
return return_value;
}
108df4: c9 leave
108df5: c3 ret
001080b4 <free>:
#include <stdlib.h>
void free(
void *ptr
)
{
1080b4: 55 push %ebp
1080b5: 89 e5 mov %esp,%ebp
1080b7: 53 push %ebx
1080b8: 83 ec 04 sub $0x4,%esp
1080bb: 8b 5d 08 mov 0x8(%ebp),%ebx
MSBUMP(free_calls, 1);
1080be: ff 05 ec 7c 12 00 incl 0x127cec
if ( !ptr )
1080c4: 85 db test %ebx,%ebx
1080c6: 74 4b je 108113 <free+0x5f>
return;
/*
* Do not attempt to free memory if in a critical section or ISR.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
1080c8: 83 3d 00 80 12 00 03 cmpl $0x3,0x128000
1080cf: 74 47 je 108118 <free+0x64> <== ALWAYS TAKEN
}
/*
* If configured, update the statistics
*/
if ( rtems_malloc_statistics_helpers )
1080d1: a1 88 60 12 00 mov 0x126088,%eax
1080d6: 85 c0 test %eax,%eax
1080d8: 74 0a je 1080e4 <free+0x30>
(*rtems_malloc_statistics_helpers->at_free)(ptr);
1080da: 83 ec 0c sub $0xc,%esp
1080dd: 53 push %ebx
1080de: ff 50 08 call *0x8(%eax)
1080e1: 83 c4 10 add $0x10,%esp
if ( !_Protected_heap_Free( RTEMS_Malloc_Heap, ptr ) ) {
1080e4: 83 ec 08 sub $0x8,%esp
1080e7: 53 push %ebx
1080e8: ff 35 38 3a 12 00 pushl 0x123a38
1080ee: e8 4d 50 00 00 call 10d140 <_Protected_heap_Free>
1080f3: 83 c4 10 add $0x10,%esp
1080f6: 84 c0 test %al,%al
1080f8: 75 19 jne 108113 <free+0x5f>
printk( "Program heap: free of bad pointer %p -- range %p - %p \n",
ptr,
RTEMS_Malloc_Heap->area_begin,
RTEMS_Malloc_Heap->area_end
1080fa: a1 38 3a 12 00 mov 0x123a38,%eax
*/
if ( rtems_malloc_statistics_helpers )
(*rtems_malloc_statistics_helpers->at_free)(ptr);
if ( !_Protected_heap_Free( RTEMS_Malloc_Heap, ptr ) ) {
printk( "Program heap: free of bad pointer %p -- range %p - %p \n",
1080ff: ff 70 1c pushl 0x1c(%eax)
108102: ff 70 18 pushl 0x18(%eax)
108105: 53 push %ebx
108106: 68 d0 13 12 00 push $0x1213d0
10810b: e8 8c 0d 00 00 call 108e9c <printk>
108110: 83 c4 10 add $0x10,%esp
RTEMS_Malloc_Heap->area_begin,
RTEMS_Malloc_Heap->area_end
);
}
}
108113: 8b 5d fc mov -0x4(%ebp),%ebx
108116: c9 leave
108117: c3 ret
/*
* Do not attempt to free memory if in a critical section or ISR.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
!malloc_is_system_state_OK() ) {
108118: e8 3b 01 00 00 call 108258 <malloc_is_system_state_OK>
return;
/*
* Do not attempt to free memory if in a critical section or ISR.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
10811d: 84 c0 test %al,%al
10811f: 75 b0 jne 1080d1 <free+0x1d>
!malloc_is_system_state_OK() ) {
malloc_deferred_free(ptr);
108121: 89 5d 08 mov %ebx,0x8(%ebp)
RTEMS_Malloc_Heap->area_begin,
RTEMS_Malloc_Heap->area_end
);
}
}
108124: 8b 5d fc mov -0x4(%ebp),%ebx
108127: c9 leave
/*
* Do not attempt to free memory if in a critical section or ISR.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
!malloc_is_system_state_OK() ) {
malloc_deferred_free(ptr);
108128: e9 97 01 00 00 jmp 1082c4 <malloc_deferred_free>
00109550 <free_user_env>:
* NOTE: this must be called with
* thread dispatching disabled!
*/
static void
free_user_env(void *venv)
{
109550: 55 push %ebp
109551: 89 e5 mov %esp,%ebp
109553: 53 push %ebx
109554: 83 ec 04 sub $0x4,%esp
109557: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_user_env_t *env = (rtems_user_env_t*) venv ;
if (env != &rtems_global_user_env
10955a: 81 fb 20 86 12 00 cmp $0x128620,%ebx
109560: 74 26 je 109588 <free_user_env+0x38> <== NEVER TAKEN
#ifdef HAVE_USERENV_REFCNT
&& --env->refcnt <= 0
#endif
) {
rtems_filesystem_freenode( &env->current_directory);
109562: 83 ec 0c sub $0xc,%esp
109565: 8d 43 04 lea 0x4(%ebx),%eax
109568: 50 push %eax
109569: e8 72 ef ff ff call 1084e0 <rtems_filesystem_freenode>
rtems_filesystem_freenode( &env->root_directory);
10956e: 8d 43 18 lea 0x18(%ebx),%eax
109571: 89 04 24 mov %eax,(%esp)
109574: e8 67 ef ff ff call 1084e0 <rtems_filesystem_freenode>
free(env);
109579: 83 c4 10 add $0x10,%esp
10957c: 89 5d 08 mov %ebx,0x8(%ebp)
}
}
10957f: 8b 5d fc mov -0x4(%ebp),%ebx
109582: c9 leave
&& --env->refcnt <= 0
#endif
) {
rtems_filesystem_freenode( &env->current_directory);
rtems_filesystem_freenode( &env->root_directory);
free(env);
109583: e9 6c ef ff ff jmp 1084f4 <free>
}
}
109588: 8b 5d fc mov -0x4(%ebp),%ebx
10958b: c9 leave <== NOT EXECUTED
10958c: c3 ret <== NOT EXECUTED
0011f06c <fstat>:
int fstat(
int fd,
struct stat *sbuf
)
{
11f06c: 55 push %ebp
11f06d: 89 e5 mov %esp,%ebp
11f06f: 57 push %edi
11f070: 53 push %ebx
11f071: 8b 45 08 mov 0x8(%ebp),%eax
11f074: 8b 5d 0c mov 0xc(%ebp),%ebx
rtems_libio_t *iop;
/*
* Check to see if we were passed a valid pointer.
*/
if ( !sbuf )
11f077: 85 db test %ebx,%ebx
11f079: 74 55 je 11f0d0 <fstat+0x64>
rtems_set_errno_and_return_minus_one( EFAULT );
/*
* Now process the stat() request.
*/
iop = rtems_libio_iop( fd );
11f07b: 3b 05 2c 3a 12 00 cmp 0x123a2c,%eax
11f081: 73 39 jae 11f0bc <fstat+0x50>
11f083: c1 e0 03 shl $0x3,%eax
11f086: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx
11f08d: 29 c2 sub %eax,%edx
11f08f: 03 15 c0 7c 12 00 add 0x127cc0,%edx
rtems_libio_check_fd( fd );
rtems_libio_check_is_open(iop);
11f095: f6 42 15 01 testb $0x1,0x15(%edx)
11f099: 74 21 je 11f0bc <fstat+0x50>
/*
* Zero out the stat structure so the various support
* versions of stat don't have to.
*/
memset( sbuf, 0, sizeof(struct stat) );
11f09b: b9 48 00 00 00 mov $0x48,%ecx
11f0a0: 31 c0 xor %eax,%eax
11f0a2: 89 df mov %ebx,%edi
11f0a4: f3 aa rep stos %al,%es:(%edi)
return (*iop->pathinfo.handlers->fstat_h)( &iop->pathinfo, sbuf );
11f0a6: 8b 42 20 mov 0x20(%edx),%eax
11f0a9: 89 5d 0c mov %ebx,0xc(%ebp)
11f0ac: 83 c2 18 add $0x18,%edx
11f0af: 89 55 08 mov %edx,0x8(%ebp)
11f0b2: 8b 40 18 mov 0x18(%eax),%eax
}
11f0b5: 5b pop %ebx
11f0b6: 5f pop %edi
11f0b7: c9 leave
* Zero out the stat structure so the various support
* versions of stat don't have to.
*/
memset( sbuf, 0, sizeof(struct stat) );
return (*iop->pathinfo.handlers->fstat_h)( &iop->pathinfo, sbuf );
11f0b8: ff e0 jmp *%eax
11f0ba: 66 90 xchg %ax,%ax
/*
* Now process the stat() request.
*/
iop = rtems_libio_iop( fd );
rtems_libio_check_fd( fd );
rtems_libio_check_is_open(iop);
11f0bc: e8 53 42 ff ff call 113314 <__errno>
11f0c1: c7 00 09 00 00 00 movl $0x9,(%eax)
* versions of stat don't have to.
*/
memset( sbuf, 0, sizeof(struct stat) );
return (*iop->pathinfo.handlers->fstat_h)( &iop->pathinfo, sbuf );
}
11f0c7: b8 ff ff ff ff mov $0xffffffff,%eax
11f0cc: 5b pop %ebx
11f0cd: 5f pop %edi
11f0ce: c9 leave
11f0cf: c3 ret
/*
* Check to see if we were passed a valid pointer.
*/
if ( !sbuf )
rtems_set_errno_and_return_minus_one( EFAULT );
11f0d0: e8 3f 42 ff ff call 113314 <__errno>
11f0d5: c7 00 0e 00 00 00 movl $0xe,(%eax)
11f0db: eb ea jmp 11f0c7 <fstat+0x5b>
00108f14 <fsync>:
#include <rtems/seterr.h>
int fsync(
int fd
)
{
108f14: 55 push %ebp
108f15: 89 e5 mov %esp,%ebp
108f17: 83 ec 08 sub $0x8,%esp
108f1a: 8b 45 08 mov 0x8(%ebp),%eax
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
108f1d: 3b 05 4c 56 12 00 cmp 0x12564c,%eax
108f23: 73 2f jae 108f54 <fsync+0x40>
iop = rtems_libio_iop( fd );
108f25: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx
108f2c: 8d 04 d5 00 00 00 00 lea 0x0(,%edx,8),%eax
108f33: 29 d0 sub %edx,%eax
108f35: 03 05 e0 98 12 00 add 0x1298e0,%eax
rtems_libio_check_is_open(iop);
108f3b: 8b 50 14 mov 0x14(%eax),%edx
108f3e: f6 c6 01 test $0x1,%dh
108f41: 74 11 je 108f54 <fsync+0x40>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
108f43: 83 e2 04 and $0x4,%edx
108f46: 74 20 je 108f68 <fsync+0x54>
/*
* Now process the fsync().
*/
return (*iop->pathinfo.handlers->fsync_h)( iop );
108f48: 8b 50 20 mov 0x20(%eax),%edx
108f4b: 89 45 08 mov %eax,0x8(%ebp)
108f4e: 8b 42 28 mov 0x28(%edx),%eax
}
108f51: c9 leave
/*
* Now process the fsync().
*/
return (*iop->pathinfo.handlers->fsync_h)( iop );
108f52: ff e0 jmp *%eax
{
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open(iop);
108f54: e8 1b b5 00 00 call 114474 <__errno>
108f59: c7 00 09 00 00 00 movl $0x9,(%eax)
/*
* Now process the fsync().
*/
return (*iop->pathinfo.handlers->fsync_h)( iop );
}
108f5f: b8 ff ff ff ff mov $0xffffffff,%eax
108f64: c9 leave
108f65: c3 ret
108f66: 66 90 xchg %ax,%ax
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open(iop);
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
108f68: e8 07 b5 00 00 call 114474 <__errno>
108f6d: c7 00 16 00 00 00 movl $0x16,(%eax)
108f73: eb ea jmp 108f5f <fsync+0x4b>
0010fc8c <ftruncate>:
int ftruncate(
int fd,
off_t length
)
{
10fc8c: 55 push %ebp
10fc8d: 89 e5 mov %esp,%ebp
10fc8f: 57 push %edi
10fc90: 56 push %esi
10fc91: 53 push %ebx
10fc92: 83 ec 3c sub $0x3c,%esp
10fc95: 8b 45 08 mov 0x8(%ebp),%eax
10fc98: 8b 55 0c mov 0xc(%ebp),%edx
10fc9b: 8b 4d 10 mov 0x10(%ebp),%ecx
10fc9e: 89 55 c0 mov %edx,-0x40(%ebp)
10fca1: 89 4d c4 mov %ecx,-0x3c(%ebp)
rtems_libio_t *iop;
rtems_filesystem_location_info_t loc;
rtems_libio_check_fd( fd );
10fca4: 3b 05 2c 3a 12 00 cmp 0x123a2c,%eax
10fcaa: 73 58 jae 10fd04 <ftruncate+0x78>
iop = rtems_libio_iop( fd );
10fcac: c1 e0 03 shl $0x3,%eax
10fcaf: 8d 1c c5 00 00 00 00 lea 0x0(,%eax,8),%ebx
10fcb6: 29 c3 sub %eax,%ebx
10fcb8: 03 1d c0 7c 12 00 add 0x127cc0,%ebx
rtems_libio_check_is_open(iop);
10fcbe: f6 43 15 01 testb $0x1,0x15(%ebx)
10fcc2: 74 40 je 10fd04 <ftruncate+0x78>
/*
* Make sure we are not working on a directory
*/
loc = iop->pathinfo;
10fcc4: 8d 7d d4 lea -0x2c(%ebp),%edi
10fcc7: 8d 73 18 lea 0x18(%ebx),%esi
10fcca: b9 05 00 00 00 mov $0x5,%ecx
10fccf: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY )
10fcd1: 83 ec 0c sub $0xc,%esp
10fcd4: 8d 45 d4 lea -0x2c(%ebp),%eax
10fcd7: 50 push %eax
10fcd8: 8b 45 e0 mov -0x20(%ebp),%eax
10fcdb: ff 50 10 call *0x10(%eax)
10fcde: 83 c4 10 add $0x10,%esp
10fce1: 48 dec %eax
10fce2: 74 46 je 10fd2a <ftruncate+0x9e>
rtems_set_errno_and_return_minus_one( EISDIR );
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
10fce4: f6 43 14 04 testb $0x4,0x14(%ebx)
10fce8: 74 2e je 10fd18 <ftruncate+0x8c>
return (*iop->pathinfo.handlers->ftruncate_h)( iop, length );
10fcea: 50 push %eax
10fceb: 8b 43 20 mov 0x20(%ebx),%eax
10fcee: ff 75 c4 pushl -0x3c(%ebp)
10fcf1: ff 75 c0 pushl -0x40(%ebp)
10fcf4: 53 push %ebx
10fcf5: ff 50 20 call *0x20(%eax)
10fcf8: 83 c4 10 add $0x10,%esp
}
10fcfb: 8d 65 f4 lea -0xc(%ebp),%esp
10fcfe: 5b pop %ebx
10fcff: 5e pop %esi
10fd00: 5f pop %edi
10fd01: c9 leave
10fd02: c3 ret
10fd03: 90 nop
rtems_libio_t *iop;
rtems_filesystem_location_info_t loc;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open(iop);
10fd04: e8 0b 36 00 00 call 113314 <__errno>
10fd09: c7 00 09 00 00 00 movl $0x9,(%eax)
10fd0f: b8 ff ff ff ff mov $0xffffffff,%eax
10fd14: eb e5 jmp 10fcfb <ftruncate+0x6f>
10fd16: 66 90 xchg %ax,%ax
loc = iop->pathinfo;
if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY )
rtems_set_errno_and_return_minus_one( EISDIR );
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
10fd18: e8 f7 35 00 00 call 113314 <__errno>
10fd1d: c7 00 16 00 00 00 movl $0x16,(%eax)
10fd23: b8 ff ff ff ff mov $0xffffffff,%eax
10fd28: eb d1 jmp 10fcfb <ftruncate+0x6f>
* Make sure we are not working on a directory
*/
loc = iop->pathinfo;
if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY )
rtems_set_errno_and_return_minus_one( EISDIR );
10fd2a: e8 e5 35 00 00 call 113314 <__errno>
10fd2f: c7 00 15 00 00 00 movl $0x15,(%eax)
10fd35: b8 ff ff ff ff mov $0xffffffff,%eax
10fd3a: eb bf jmp 10fcfb <ftruncate+0x6f>
00108300 <getchark>:
#include <rtems.h>
#include <rtems/bspIo.h>
int getchark(void)
{
108300: 55 push %ebp
108301: 89 e5 mov %esp,%ebp
108303: 83 ec 08 sub $0x8,%esp
if ( BSP_poll_char )
108306: a1 ec 3e 12 00 mov 0x123eec,%eax
10830b: 85 c0 test %eax,%eax
10830d: 74 05 je 108314 <getchark+0x14>
return (*BSP_poll_char)();
return -1;
}
10830f: c9 leave
#include <rtems/bspIo.h>
int getchark(void)
{
if ( BSP_poll_char )
return (*BSP_poll_char)();
108310: ff e0 jmp *%eax
108312: 66 90 xchg %ax,%ax
return -1;
}
108314: b8 ff ff ff ff mov $0xffffffff,%eax
108319: c9 leave
10831a: c3 ret
00120a60 <getdents>:
int getdents(
int dd_fd,
char *dd_buf,
int dd_len
)
{
120a60: 55 push %ebp
120a61: 89 e5 mov %esp,%ebp
120a63: 57 push %edi
120a64: 56 push %esi
120a65: 53 push %ebx
120a66: 83 ec 2c sub $0x2c,%esp
120a69: 8b 45 08 mov 0x8(%ebp),%eax
rtems_filesystem_location_info_t loc;
/*
* Get the file control block structure associated with the file descriptor
*/
iop = rtems_libio_iop( dd_fd );
120a6c: 3b 05 4c 65 12 00 cmp 0x12654c,%eax
120a72: 73 4c jae 120ac0 <getdents+0x60> <== NEVER TAKEN
120a74: c1 e0 03 shl $0x3,%eax
120a77: 8d 1c c5 00 00 00 00 lea 0x0(,%eax,8),%ebx
120a7e: 29 c3 sub %eax,%ebx
120a80: 03 1d 00 a9 12 00 add 0x12a900,%ebx
/*
* Make sure we are working on a directory
*/
loc = iop->pathinfo;
120a86: 8d 7d d4 lea -0x2c(%ebp),%edi
120a89: 8d 73 18 lea 0x18(%ebx),%esi
120a8c: b9 05 00 00 00 mov $0x5,%ecx
120a91: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY )
120a93: 83 ec 0c sub $0xc,%esp
120a96: 8d 45 d4 lea -0x2c(%ebp),%eax
120a99: 50 push %eax
120a9a: 8b 45 e0 mov -0x20(%ebp),%eax
120a9d: ff 50 10 call *0x10(%eax)
120aa0: 83 c4 10 add $0x10,%esp
120aa3: 48 dec %eax
120aa4: 75 1e jne 120ac4 <getdents+0x64>
/*
* Return the number of bytes that were actually transfered as a result
* of the read attempt.
*/
return (*iop->pathinfo.handlers->read_h)( iop, dd_buf, dd_len );
120aa6: 50 push %eax
120aa7: 8b 43 20 mov 0x20(%ebx),%eax
120aaa: ff 75 10 pushl 0x10(%ebp)
120aad: ff 75 0c pushl 0xc(%ebp)
120ab0: 53 push %ebx
120ab1: ff 50 08 call *0x8(%eax)
120ab4: 83 c4 10 add $0x10,%esp
}
120ab7: 8d 65 f4 lea -0xc(%ebp),%esp
120aba: 5b pop %ebx
120abb: 5e pop %esi
120abc: 5f pop %edi
120abd: c9 leave
120abe: c3 ret
120abf: 90 nop
rtems_filesystem_location_info_t loc;
/*
* Get the file control block structure associated with the file descriptor
*/
iop = rtems_libio_iop( dd_fd );
120ac0: 31 db xor %ebx,%ebx
120ac2: eb c2 jmp 120a86 <getdents+0x26> <== NOT EXECUTED
/*
* Make sure we are working on a directory
*/
loc = iop->pathinfo;
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY )
rtems_set_errno_and_return_minus_one( ENOTDIR );
120ac4: e8 9b 38 ff ff call 114364 <__errno>
120ac9: c7 00 14 00 00 00 movl $0x14,(%eax)
120acf: b8 ff ff ff ff mov $0xffffffff,%eax
120ad4: eb e1 jmp 120ab7 <getdents+0x57>
00108b34 <getgr_r>:
struct group *grp,
char *buffer,
size_t bufsize,
struct group **result
)
{
108b34: 55 push %ebp
108b35: 89 e5 mov %esp,%ebp
108b37: 57 push %edi
108b38: 56 push %esi
108b39: 53 push %ebx
108b3a: 83 ec 1c sub $0x1c,%esp
108b3d: 89 c3 mov %eax,%ebx
108b3f: 89 55 e4 mov %edx,-0x1c(%ebp)
108b42: 89 ce mov %ecx,%esi
FILE *fp;
int match;
init_etc_passwd_group();
108b44: e8 eb fe ff ff call 108a34 <init_etc_passwd_group>
if ((fp = fopen("/etc/group", "r")) == NULL)
108b49: 83 ec 08 sub $0x8,%esp
108b4c: 68 92 18 12 00 push $0x121892
108b51: 68 79 2d 12 00 push $0x122d79
108b56: e8 75 be 00 00 call 1149d0 <fopen>
108b5b: 89 c7 mov %eax,%edi
108b5d: 83 c4 10 add $0x10,%esp
108b60: 85 c0 test %eax,%eax
108b62: 75 22 jne 108b86 <getgr_r+0x52>
108b64: e9 8b 00 00 00 jmp 108bf4 <getgr_r+0xc0>
108b69: 8d 76 00 lea 0x0(%esi),%esi
for(;;) {
if (!scangr(fp, grp, buffer, bufsize))
goto error_einval;
if (name) {
match = (strcmp(grp->gr_name, name) == 0);
108b6c: 83 ec 08 sub $0x8,%esp
108b6f: 53 push %ebx
108b70: ff 36 pushl (%esi)
108b72: e8 d5 cc 00 00 call 11584c <strcmp>
108b77: 83 c4 10 add $0x10,%esp
108b7a: 85 c0 test %eax,%eax
108b7c: 0f 94 c0 sete %al
108b7f: 0f b6 c0 movzbl %al,%eax
} else {
match = (grp->gr_gid == gid);
}
if (match) {
108b82: 85 c0 test %eax,%eax
108b84: 75 2e jne 108bb4 <getgr_r+0x80>
if ((fp = fopen("/etc/group", "r")) == NULL)
rtems_set_errno_and_return_minus_one( EINVAL );
for(;;) {
if (!scangr(fp, grp, buffer, bufsize))
108b86: 83 ec 0c sub $0xc,%esp
108b89: ff 75 0c pushl 0xc(%ebp)
108b8c: 8b 4d 08 mov 0x8(%ebp),%ecx
108b8f: 89 f2 mov %esi,%edx
108b91: 89 f8 mov %edi,%eax
108b93: e8 88 fc ff ff call 108820 <scangr>
108b98: 83 c4 10 add $0x10,%esp
108b9b: 85 c0 test %eax,%eax
108b9d: 74 31 je 108bd0 <getgr_r+0x9c>
goto error_einval;
if (name) {
108b9f: 85 db test %ebx,%ebx
108ba1: 75 c9 jne 108b6c <getgr_r+0x38>
match = (strcmp(grp->gr_name, name) == 0);
} else {
match = (grp->gr_gid == gid);
108ba3: 0f b7 46 08 movzwl 0x8(%esi),%eax
108ba7: 3b 45 e4 cmp -0x1c(%ebp),%eax
108baa: 0f 94 c0 sete %al
108bad: 0f b6 c0 movzbl %al,%eax
}
if (match) {
108bb0: 85 c0 test %eax,%eax
108bb2: 74 d2 je 108b86 <getgr_r+0x52>
fclose(fp);
108bb4: 83 ec 0c sub $0xc,%esp
108bb7: 57 push %edi
108bb8: e8 0f b7 00 00 call 1142cc <fclose>
*result = grp;
108bbd: 8b 45 10 mov 0x10(%ebp),%eax
108bc0: 89 30 mov %esi,(%eax)
return 0;
108bc2: 83 c4 10 add $0x10,%esp
108bc5: 31 c0 xor %eax,%eax
}
}
error_einval:
fclose(fp);
rtems_set_errno_and_return_minus_one( EINVAL );
}
108bc7: 8d 65 f4 lea -0xc(%ebp),%esp
108bca: 5b pop %ebx
108bcb: 5e pop %esi
108bcc: 5f pop %edi
108bcd: c9 leave
108bce: c3 ret
108bcf: 90 nop
*result = grp;
return 0;
}
}
error_einval:
fclose(fp);
108bd0: 83 ec 0c sub $0xc,%esp
108bd3: 57 push %edi
108bd4: e8 f3 b6 00 00 call 1142cc <fclose>
rtems_set_errno_and_return_minus_one( EINVAL );
108bd9: e8 96 b5 00 00 call 114174 <__errno>
108bde: c7 00 16 00 00 00 movl $0x16,(%eax)
108be4: 83 c4 10 add $0x10,%esp
108be7: b8 ff ff ff ff mov $0xffffffff,%eax
}
108bec: 8d 65 f4 lea -0xc(%ebp),%esp
108bef: 5b pop %ebx
108bf0: 5e pop %esi
108bf1: 5f pop %edi
108bf2: c9 leave
108bf3: c3 ret
int match;
init_etc_passwd_group();
if ((fp = fopen("/etc/group", "r")) == NULL)
rtems_set_errno_and_return_minus_one( EINVAL );
108bf4: e8 7b b5 00 00 call 114174 <__errno>
108bf9: c7 00 16 00 00 00 movl $0x16,(%eax)
108bff: 83 c8 ff or $0xffffffff,%eax
108c02: eb c3 jmp 108bc7 <getgr_r+0x93>
00108e58 <getgrnam>:
}
struct group *getgrnam(
const char *name
)
{
108e58: 55 push %ebp
108e59: 89 e5 mov %esp,%ebp
108e5b: 83 ec 24 sub $0x24,%esp
struct group *p;
if(getgrnam_r(name, &grent, grbuf, sizeof grbuf, &p))
108e5e: 8d 45 f4 lea -0xc(%ebp),%eax
108e61: 50 push %eax
108e62: 68 c8 00 00 00 push $0xc8
108e67: 68 c0 93 12 00 push $0x1293c0
108e6c: 68 a4 93 12 00 push $0x1293a4
108e71: ff 75 08 pushl 0x8(%ebp)
108e74: e8 b3 ff ff ff call 108e2c <getgrnam_r>
108e79: 83 c4 20 add $0x20,%esp
108e7c: 85 c0 test %eax,%eax
108e7e: 75 08 jne 108e88 <getgrnam+0x30>
return NULL;
return p;
108e80: 8b 45 f4 mov -0xc(%ebp),%eax
}
108e83: c9 leave
108e84: c3 ret
108e85: 8d 76 00 lea 0x0(%esi),%esi
)
{
struct group *p;
if(getgrnam_r(name, &grent, grbuf, sizeof grbuf, &p))
return NULL;
108e88: 31 c0 xor %eax,%eax
return p;
}
108e8a: c9 leave
108e8b: c3 ret
0010b234 <getitimer>:
int getitimer(
int which,
struct itimerval *value
)
{
10b234: 55 push %ebp
10b235: 89 e5 mov %esp,%ebp
10b237: 83 ec 08 sub $0x8,%esp
if ( !value )
10b23a: 8b 45 0c mov 0xc(%ebp),%eax
10b23d: 85 c0 test %eax,%eax
10b23f: 74 2f je 10b270 <getitimer+0x3c>
rtems_set_errno_and_return_minus_one( EFAULT );
switch ( which ) {
10b241: 83 7d 08 02 cmpl $0x2,0x8(%ebp)
10b245: 76 15 jbe 10b25c <getitimer+0x28>
case ITIMER_PROF:
rtems_set_errno_and_return_minus_one( ENOSYS );
default:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10b247: e8 e8 87 00 00 call 113a34 <__errno>
10b24c: c7 00 16 00 00 00 movl $0x16,(%eax)
}
10b252: b8 ff ff ff ff mov $0xffffffff,%eax
10b257: c9 leave
10b258: c3 ret
10b259: 8d 76 00 lea 0x0(%esi),%esi
switch ( which ) {
case ITIMER_REAL:
case ITIMER_VIRTUAL:
case ITIMER_PROF:
rtems_set_errno_and_return_minus_one( ENOSYS );
10b25c: e8 d3 87 00 00 call 113a34 <__errno>
10b261: c7 00 58 00 00 00 movl $0x58,(%eax)
default:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10b267: b8 ff ff ff ff mov $0xffffffff,%eax
10b26c: c9 leave
10b26d: c3 ret
10b26e: 66 90 xchg %ax,%ax
int which,
struct itimerval *value
)
{
if ( !value )
rtems_set_errno_and_return_minus_one( EFAULT );
10b270: e8 bf 87 00 00 call 113a34 <__errno>
10b275: c7 00 0e 00 00 00 movl $0xe,(%eax)
10b27b: eb d5 jmp 10b252 <getitimer+0x1e>
001085f8 <getlogin_r>:
*/
int getlogin_r(
char *name,
size_t namesize
)
{
1085f8: 55 push %ebp
1085f9: 89 e5 mov %esp,%ebp
1085fb: 53 push %ebx
1085fc: 83 ec 04 sub $0x4,%esp
1085ff: 8b 5d 08 mov 0x8(%ebp),%ebx
struct passwd *pw;
char *pname;
if ( !name )
108602: 85 db test %ebx,%ebx
108604: 74 42 je 108648 <getlogin_r+0x50>
return EFAULT;
if ( namesize < LOGIN_NAME_MAX )
108606: 83 7d 0c 08 cmpl $0x8,0xc(%ebp)
10860a: 77 0c ja 108618 <getlogin_r+0x20>
return ERANGE;
10860c: b8 22 00 00 00 mov $0x22,%eax
if ( pw )
pname = pw->pw_name;
strncpy( name, pname, LOGIN_NAME_MAX );
return 0;
}
108611: 8b 5d fc mov -0x4(%ebp),%ebx
108614: c9 leave
108615: c3 ret
108616: 66 90 xchg %ax,%ax
return ERANGE;
/* Set the pointer to a default name */
pname = "";
pw = getpwuid(getuid());
108618: e8 e7 09 00 00 call 109004 <getuid>
10861d: 83 ec 0c sub $0xc,%esp
108620: 0f b7 c0 movzwl %ax,%eax
108623: 50 push %eax
108624: e8 37 07 00 00 call 108d60 <getpwuid>
if ( pw )
108629: 83 c4 10 add $0x10,%esp
10862c: 85 c0 test %eax,%eax
10862e: 74 20 je 108650 <getlogin_r+0x58>
pname = pw->pw_name;
108630: 8b 00 mov (%eax),%eax
strncpy( name, pname, LOGIN_NAME_MAX );
108632: 52 push %edx
108633: 6a 09 push $0x9
108635: 50 push %eax
108636: 53 push %ebx
108637: e8 90 d3 00 00 call 1159cc <strncpy>
return 0;
10863c: 83 c4 10 add $0x10,%esp
10863f: 31 c0 xor %eax,%eax
}
108641: 8b 5d fc mov -0x4(%ebp),%ebx
108644: c9 leave
108645: c3 ret
108646: 66 90 xchg %ax,%ax
{
struct passwd *pw;
char *pname;
if ( !name )
return EFAULT;
108648: b8 0e 00 00 00 mov $0xe,%eax
10864d: eb c2 jmp 108611 <getlogin_r+0x19>
10864f: 90 nop
if ( namesize < LOGIN_NAME_MAX )
return ERANGE;
/* Set the pointer to a default name */
pname = "";
108650: b8 c9 2e 12 00 mov $0x122ec9,%eax
108655: eb db jmp 108632 <getlogin_r+0x3a>
00108c04 <getpw_r>:
struct passwd *pwd,
char *buffer,
size_t bufsize,
struct passwd **result
)
{
108c04: 55 push %ebp
108c05: 89 e5 mov %esp,%ebp
108c07: 57 push %edi
108c08: 56 push %esi
108c09: 53 push %ebx
108c0a: 83 ec 1c sub $0x1c,%esp
108c0d: 89 c3 mov %eax,%ebx
108c0f: 89 55 e4 mov %edx,-0x1c(%ebp)
108c12: 89 ce mov %ecx,%esi
FILE *fp;
int match;
init_etc_passwd_group();
108c14: e8 1b fe ff ff call 108a34 <init_etc_passwd_group>
if ((fp = fopen("/etc/passwd", "r")) == NULL)
108c19: 83 ec 08 sub $0x8,%esp
108c1c: 68 92 18 12 00 push $0x121892
108c21: 68 6d 2d 12 00 push $0x122d6d
108c26: e8 a5 bd 00 00 call 1149d0 <fopen>
108c2b: 89 c7 mov %eax,%edi
108c2d: 83 c4 10 add $0x10,%esp
108c30: 85 c0 test %eax,%eax
108c32: 75 22 jne 108c56 <getpw_r+0x52>
108c34: e9 8b 00 00 00 jmp 108cc4 <getpw_r+0xc0>
108c39: 8d 76 00 lea 0x0(%esi),%esi
for(;;) {
if (!scanpw(fp, pwd, buffer, bufsize))
goto error_einval;
if (name) {
match = (strcmp(pwd->pw_name, name) == 0);
108c3c: 83 ec 08 sub $0x8,%esp
108c3f: 53 push %ebx
108c40: ff 36 pushl (%esi)
108c42: e8 05 cc 00 00 call 11584c <strcmp>
108c47: 83 c4 10 add $0x10,%esp
108c4a: 85 c0 test %eax,%eax
108c4c: 0f 94 c0 sete %al
108c4f: 0f b6 c0 movzbl %al,%eax
} else {
match = (pwd->pw_uid == uid);
}
if (match) {
108c52: 85 c0 test %eax,%eax
108c54: 75 2e jne 108c84 <getpw_r+0x80>
if ((fp = fopen("/etc/passwd", "r")) == NULL)
rtems_set_errno_and_return_minus_one( EINVAL );
for(;;) {
if (!scanpw(fp, pwd, buffer, bufsize))
108c56: 83 ec 0c sub $0xc,%esp
108c59: ff 75 0c pushl 0xc(%ebp)
108c5c: 8b 4d 08 mov 0x8(%ebp),%ecx
108c5f: 89 f2 mov %esi,%edx
108c61: 89 f8 mov %edi,%eax
108c63: e8 d0 fc ff ff call 108938 <scanpw>
108c68: 83 c4 10 add $0x10,%esp
108c6b: 85 c0 test %eax,%eax
108c6d: 74 31 je 108ca0 <getpw_r+0x9c>
goto error_einval;
if (name) {
108c6f: 85 db test %ebx,%ebx
108c71: 75 c9 jne 108c3c <getpw_r+0x38>
match = (strcmp(pwd->pw_name, name) == 0);
} else {
match = (pwd->pw_uid == uid);
108c73: 0f b7 46 08 movzwl 0x8(%esi),%eax
108c77: 3b 45 e4 cmp -0x1c(%ebp),%eax
108c7a: 0f 94 c0 sete %al
108c7d: 0f b6 c0 movzbl %al,%eax
}
if (match) {
108c80: 85 c0 test %eax,%eax
108c82: 74 d2 je 108c56 <getpw_r+0x52>
fclose(fp);
108c84: 83 ec 0c sub $0xc,%esp
108c87: 57 push %edi
108c88: e8 3f b6 00 00 call 1142cc <fclose>
*result = pwd;
108c8d: 8b 45 10 mov 0x10(%ebp),%eax
108c90: 89 30 mov %esi,(%eax)
return 0;
108c92: 83 c4 10 add $0x10,%esp
108c95: 31 c0 xor %eax,%eax
}
}
error_einval:
fclose(fp);
rtems_set_errno_and_return_minus_one( EINVAL );
}
108c97: 8d 65 f4 lea -0xc(%ebp),%esp
108c9a: 5b pop %ebx
108c9b: 5e pop %esi
108c9c: 5f pop %edi
108c9d: c9 leave
108c9e: c3 ret
108c9f: 90 nop
*result = pwd;
return 0;
}
}
error_einval:
fclose(fp);
108ca0: 83 ec 0c sub $0xc,%esp
108ca3: 57 push %edi
108ca4: e8 23 b6 00 00 call 1142cc <fclose>
rtems_set_errno_and_return_minus_one( EINVAL );
108ca9: e8 c6 b4 00 00 call 114174 <__errno>
108cae: c7 00 16 00 00 00 movl $0x16,(%eax)
108cb4: 83 c4 10 add $0x10,%esp
108cb7: b8 ff ff ff ff mov $0xffffffff,%eax
}
108cbc: 8d 65 f4 lea -0xc(%ebp),%esp
108cbf: 5b pop %ebx
108cc0: 5e pop %esi
108cc1: 5f pop %edi
108cc2: c9 leave
108cc3: c3 ret
int match;
init_etc_passwd_group();
if ((fp = fopen("/etc/passwd", "r")) == NULL)
rtems_set_errno_and_return_minus_one( EINVAL );
108cc4: e8 ab b4 00 00 call 114174 <__errno>
108cc9: c7 00 16 00 00 00 movl $0x16,(%eax)
108ccf: 83 c8 ff or $0xffffffff,%eax
108cd2: eb c3 jmp 108c97 <getpw_r+0x93>
00108d00 <getpwnam>:
}
struct passwd *getpwnam(
const char *name
)
{
108d00: 55 push %ebp
108d01: 89 e5 mov %esp,%ebp
108d03: 83 ec 24 sub $0x24,%esp
struct passwd *p;
if(getpwnam_r(name, &pwent, pwbuf, sizeof pwbuf, &p))
108d06: 8d 45 f4 lea -0xc(%ebp),%eax
108d09: 50 push %eax
108d0a: 68 c8 00 00 00 push $0xc8
108d0f: 68 c0 94 12 00 push $0x1294c0
108d14: 68 8c 94 12 00 push $0x12948c
108d19: ff 75 08 pushl 0x8(%ebp)
108d1c: e8 b3 ff ff ff call 108cd4 <getpwnam_r>
108d21: 83 c4 20 add $0x20,%esp
108d24: 85 c0 test %eax,%eax
108d26: 75 08 jne 108d30 <getpwnam+0x30>
return NULL;
return p;
108d28: 8b 45 f4 mov -0xc(%ebp),%eax
}
108d2b: c9 leave
108d2c: c3 ret
108d2d: 8d 76 00 lea 0x0(%esi),%esi
)
{
struct passwd *p;
if(getpwnam_r(name, &pwent, pwbuf, sizeof pwbuf, &p))
return NULL;
108d30: 31 c0 xor %eax,%eax
return p;
}
108d32: c9 leave
108d33: c3 ret
00112770 <imfs_dir_open>:
rtems_libio_t *iop,
const char *pathname,
uint32_t flag,
uint32_t mode
)
{
112770: 55 push %ebp
112771: 89 e5 mov %esp,%ebp
112773: 8b 45 08 mov 0x8(%ebp),%eax
IMFS_jnode_t *the_jnode;
/* Is the node a directory ? */
the_jnode = (IMFS_jnode_t *) iop->pathinfo.node_access;
if ( the_jnode->type != IMFS_DIRECTORY )
112776: 8b 50 18 mov 0x18(%eax),%edx
112779: 83 7a 4c 01 cmpl $0x1,0x4c(%edx)
11277d: 74 09 je 112788 <imfs_dir_open+0x18> <== ALWAYS TAKEN
return -1; /* It wasn't a directory --> return error */
11277f: b8 ff ff ff ff mov $0xffffffff,%eax <== NOT EXECUTED
iop->offset = 0;
return 0;
}
112784: c9 leave <== NOT EXECUTED
112785: c3 ret <== NOT EXECUTED
112786: 66 90 xchg %ax,%ax <== NOT EXECUTED
the_jnode = (IMFS_jnode_t *) iop->pathinfo.node_access;
if ( the_jnode->type != IMFS_DIRECTORY )
return -1; /* It wasn't a directory --> return error */
iop->offset = 0;
112788: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
11278f: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax)
return 0;
112796: 31 c0 xor %eax,%eax
}
112798: c9 leave
112799: c3 ret
0011279c <imfs_dir_read>:
ssize_t imfs_dir_read(
rtems_libio_t *iop,
void *buffer,
size_t count
)
{
11279c: 55 push %ebp
11279d: 89 e5 mov %esp,%ebp
11279f: 57 push %edi
1127a0: 56 push %esi
1127a1: 53 push %ebx
1127a2: 81 ec 4c 01 00 00 sub $0x14c,%esp
int current_entry;
int first_entry;
int last_entry;
struct dirent tmp_dirent;
the_jnode = (IMFS_jnode_t *)iop->pathinfo.node_access;
1127a8: 8b 55 08 mov 0x8(%ebp),%edx
1127ab: 8b 42 18 mov 0x18(%edx),%eax
IMFS_create_orphan( the_jnode );
IMFS_check_node_remove( the_jnode );
return 0;
}
1127ae: 8b 58 50 mov 0x50(%eax),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
1127b1: 83 c0 54 add $0x54,%eax
1127b4: 89 85 cc fe ff ff mov %eax,-0x134(%ebp)
struct dirent tmp_dirent;
the_jnode = (IMFS_jnode_t *)iop->pathinfo.node_access;
the_chain = &the_jnode->info.directory.Entries;
if ( rtems_chain_is_empty( the_chain ) )
1127ba: 39 c3 cmp %eax,%ebx
1127bc: 0f 84 2a 01 00 00 je 1128ec <imfs_dir_read+0x150>
/* Move to the first of the desired directory entries */
the_node = rtems_chain_first( the_chain );
bytes_transferred = 0;
first_entry = iop->offset;
1127c2: 8b 42 0c mov 0xc(%edx),%eax
1127c5: 89 85 d4 fe ff ff mov %eax,-0x12c(%ebp)
/* protect against using sizes that are not exact multiples of the */
/* -dirent- size. These could result in unexpected results */
last_entry = first_entry + (count/sizeof(struct dirent)) * sizeof(struct dirent);
1127cb: ba f1 f0 f0 f0 mov $0xf0f0f0f1,%edx
1127d0: 8b 45 10 mov 0x10(%ebp),%eax
1127d3: f7 e2 mul %edx
1127d5: c1 ea 08 shr $0x8,%edx
1127d8: 89 d0 mov %edx,%eax
1127da: c1 e0 04 shl $0x4,%eax
1127dd: c1 e2 08 shl $0x8,%edx
1127e0: 8d 14 10 lea (%eax,%edx,1),%edx
1127e3: 03 95 d4 fe ff ff add -0x12c(%ebp),%edx
1127e9: 89 95 d0 fe ff ff mov %edx,-0x130(%ebp)
/* The directory was not empty so try to move to the desired entry in chain*/
for (
1127ef: 85 d2 test %edx,%edx
1127f1: 0f 8e f5 00 00 00 jle 1128ec <imfs_dir_read+0x150> <== NEVER TAKEN
1127f7: 31 d2 xor %edx,%edx
1127f9: c7 85 c8 fe ff ff 00 movl $0x0,-0x138(%ebp)
112800: 00 00 00
tmp_dirent.d_off = current_entry;
tmp_dirent.d_reclen = sizeof( struct dirent );
the_jnode = (IMFS_jnode_t *) the_node;
tmp_dirent.d_ino = the_jnode->st_ino;
tmp_dirent.d_namlen = strlen( the_jnode->name );
strcpy( tmp_dirent.d_name, the_jnode->name );
112803: 8d 85 d8 fe ff ff lea -0x128(%ebp),%eax
112809: 89 85 b4 fe ff ff mov %eax,-0x14c(%ebp)
11280f: eb 23 jmp 112834 <imfs_dir_read+0x98>
112811: 8d 76 00 lea 0x0(%esi),%esi
);
iop->offset = iop->offset + sizeof(struct dirent);
bytes_transferred = bytes_transferred + sizeof( struct dirent );
}
the_node = the_node->next;
112814: 8b 1b mov (%ebx),%ebx
* to the end of the exisiting file, the remaining entries will be placed in
* the buffer and the returned value will be equal to -m actual- times the
* size of a directory entry.
*/
ssize_t imfs_dir_read(
112816: 81 c2 10 01 00 00 add $0x110,%edx
/* protect against using sizes that are not exact multiples of the */
/* -dirent- size. These could result in unexpected results */
last_entry = first_entry + (count/sizeof(struct dirent)) * sizeof(struct dirent);
/* The directory was not empty so try to move to the desired entry in chain*/
for (
11281c: 39 95 d0 fe ff ff cmp %edx,-0x130(%ebp)
112822: 0f 8e b4 00 00 00 jle 1128dc <imfs_dir_read+0x140> <== NEVER TAKEN
current_entry = 0;
current_entry < last_entry;
current_entry = current_entry + sizeof(struct dirent) ){
if ( rtems_chain_is_tail( the_chain, the_node ) ){
112828: 3b 9d cc fe ff ff cmp -0x134(%ebp),%ebx
11282e: 0f 84 a8 00 00 00 je 1128dc <imfs_dir_read+0x140>
/* entry in the read */
return bytes_transferred; /* Indicate that there are no more */
/* entries to return */
}
if( current_entry >= first_entry ) {
112834: 39 95 d4 fe ff ff cmp %edx,-0x12c(%ebp)
11283a: 7f d8 jg 112814 <imfs_dir_read+0x78>
/* Move the entry to the return buffer */
tmp_dirent.d_off = current_entry;
11283c: 89 95 dc fe ff ff mov %edx,-0x124(%ebp)
112842: 89 d0 mov %edx,%eax
112844: c1 f8 1f sar $0x1f,%eax
112847: 89 85 e0 fe ff ff mov %eax,-0x120(%ebp)
tmp_dirent.d_reclen = sizeof( struct dirent );
11284d: 66 c7 85 e4 fe ff ff movw $0x110,-0x11c(%ebp)
112854: 10 01
the_jnode = (IMFS_jnode_t *) the_node;
tmp_dirent.d_ino = the_jnode->st_ino;
112856: 8b 43 38 mov 0x38(%ebx),%eax
112859: 89 85 d8 fe ff ff mov %eax,-0x128(%ebp)
tmp_dirent.d_namlen = strlen( the_jnode->name );
11285f: 8d 73 0c lea 0xc(%ebx),%esi
112862: 31 c0 xor %eax,%eax
112864: b9 ff ff ff ff mov $0xffffffff,%ecx
112869: 89 f7 mov %esi,%edi
11286b: f2 ae repnz scas %es:(%edi),%al
11286d: f7 d1 not %ecx
11286f: 49 dec %ecx
112870: 66 89 8d e6 fe ff ff mov %cx,-0x11a(%ebp)
strcpy( tmp_dirent.d_name, the_jnode->name );
112877: 83 ec 08 sub $0x8,%esp
11287a: 56 push %esi
11287b: 8d 85 e8 fe ff ff lea -0x118(%ebp),%eax
112881: 50 push %eax
112882: 89 95 c4 fe ff ff mov %edx,-0x13c(%ebp)
112888: e8 57 17 00 00 call 113fe4 <strcpy>
memcpy(
11288d: 8b 45 0c mov 0xc(%ebp),%eax
112890: 03 85 c8 fe ff ff add -0x138(%ebp),%eax
112896: b9 44 00 00 00 mov $0x44,%ecx
11289b: 89 c7 mov %eax,%edi
11289d: 8b b5 b4 fe ff ff mov -0x14c(%ebp),%esi
1128a3: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
buffer + bytes_transferred,
(void *)&tmp_dirent,
sizeof( struct dirent )
);
iop->offset = iop->offset + sizeof(struct dirent);
1128a5: 8b 45 08 mov 0x8(%ebp),%eax
1128a8: 81 40 0c 10 01 00 00 addl $0x110,0xc(%eax)
1128af: 83 50 10 00 adcl $0x0,0x10(%eax)
bytes_transferred = bytes_transferred + sizeof( struct dirent );
1128b3: 81 85 c8 fe ff ff 10 addl $0x110,-0x138(%ebp)
1128ba: 01 00 00
1128bd: 83 c4 10 add $0x10,%esp
1128c0: 8b 95 c4 fe ff ff mov -0x13c(%ebp),%edx
}
the_node = the_node->next;
1128c6: 8b 1b mov (%ebx),%ebx
* to the end of the exisiting file, the remaining entries will be placed in
* the buffer and the returned value will be equal to -m actual- times the
* size of a directory entry.
*/
ssize_t imfs_dir_read(
1128c8: 81 c2 10 01 00 00 add $0x110,%edx
/* protect against using sizes that are not exact multiples of the */
/* -dirent- size. These could result in unexpected results */
last_entry = first_entry + (count/sizeof(struct dirent)) * sizeof(struct dirent);
/* The directory was not empty so try to move to the desired entry in chain*/
for (
1128ce: 39 95 d0 fe ff ff cmp %edx,-0x130(%ebp)
1128d4: 0f 8f 4e ff ff ff jg 112828 <imfs_dir_read+0x8c> <== NEVER TAKEN
1128da: 66 90 xchg %ax,%ax
current_entry = 0;
current_entry < last_entry;
current_entry = current_entry + sizeof(struct dirent) ){
if ( rtems_chain_is_tail( the_chain, the_node ) ){
1128dc: 8b 85 c8 fe ff ff mov -0x138(%ebp),%eax
the_node = the_node->next;
}
/* Success */
return bytes_transferred;
}
1128e2: 8d 65 f4 lea -0xc(%ebp),%esp
1128e5: 5b pop %ebx
1128e6: 5e pop %esi
1128e7: 5f pop %edi
1128e8: c9 leave
1128e9: c3 ret
1128ea: 66 90 xchg %ax,%ax
the_jnode = (IMFS_jnode_t *)iop->pathinfo.node_access;
the_chain = &the_jnode->info.directory.Entries;
if ( rtems_chain_is_empty( the_chain ) )
return 0;
1128ec: 31 c0 xor %eax,%eax
the_node = the_node->next;
}
/* Success */
return bytes_transferred;
}
1128ee: 8d 65 f4 lea -0xc(%ebp),%esp
1128f1: 5b pop %ebx
1128f2: 5e pop %esi
1128f3: 5f pop %edi
1128f4: c9 leave
1128f5: c3 ret
00112a28 <imfs_dir_rmnod>:
int imfs_dir_rmnod(
rtems_filesystem_location_info_t *parent_pathloc, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN */
)
{
112a28: 55 push %ebp
112a29: 89 e5 mov %esp,%ebp
112a2b: 53 push %ebx
112a2c: 83 ec 04 sub $0x4,%esp
112a2f: 8b 45 0c mov 0xc(%ebp),%eax
IMFS_jnode_t *the_jnode;
the_jnode = (IMFS_jnode_t *) pathloc->node_access;
112a32: 8b 18 mov (%eax),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
112a34: 8d 53 54 lea 0x54(%ebx),%edx
/*
* You cannot remove a node that still has children
*/
if ( ! rtems_chain_is_empty( &the_jnode->info.directory.Entries ) )
112a37: 39 53 50 cmp %edx,0x50(%ebx)
112a3a: 75 44 jne 112a80 <imfs_dir_rmnod+0x58>
/*
* You cannot remove the file system root node.
*/
if ( pathloc->mt_entry->mt_fs_root.node_access == pathloc->node_access )
112a3c: 8b 40 10 mov 0x10(%eax),%eax
112a3f: 3b 58 1c cmp 0x1c(%eax),%ebx
112a42: 74 24 je 112a68 <imfs_dir_rmnod+0x40>
/*
* You cannot remove a mountpoint.
*/
if ( the_jnode->info.directory.mt_fs != NULL )
112a44: 8b 4b 5c mov 0x5c(%ebx),%ecx
112a47: 85 c9 test %ecx,%ecx
112a49: 75 1d jne 112a68 <imfs_dir_rmnod+0x40> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EBUSY );
IMFS_create_orphan( the_jnode );
112a4b: 83 ec 0c sub $0xc,%esp
112a4e: 53 push %ebx
112a4f: e8 98 cf ff ff call 10f9ec <IMFS_create_orphan>
IMFS_check_node_remove( the_jnode );
112a54: 89 1c 24 mov %ebx,(%esp)
112a57: e8 d4 cf ff ff call 10fa30 <IMFS_check_node_remove>
return 0;
112a5c: 83 c4 10 add $0x10,%esp
112a5f: 31 c0 xor %eax,%eax
}
112a61: 8b 5d fc mov -0x4(%ebp),%ebx
112a64: c9 leave
112a65: c3 ret
112a66: 66 90 xchg %ax,%ax
/*
* You cannot remove a mountpoint.
*/
if ( the_jnode->info.directory.mt_fs != NULL )
rtems_set_errno_and_return_minus_one( EBUSY );
112a68: e8 a7 08 00 00 call 113314 <__errno>
112a6d: c7 00 10 00 00 00 movl $0x10,(%eax)
112a73: b8 ff ff ff ff mov $0xffffffff,%eax
IMFS_create_orphan( the_jnode );
IMFS_check_node_remove( the_jnode );
return 0;
}
112a78: 8b 5d fc mov -0x4(%ebp),%ebx
112a7b: c9 leave
112a7c: c3 ret
112a7d: 8d 76 00 lea 0x0(%esi),%esi
/*
* You cannot remove a node that still has children
*/
if ( ! rtems_chain_is_empty( &the_jnode->info.directory.Entries ) )
rtems_set_errno_and_return_minus_one( ENOTEMPTY );
112a80: e8 8f 08 00 00 call 113314 <__errno>
112a85: c7 00 5a 00 00 00 movl $0x5a,(%eax)
112a8b: b8 ff ff ff ff mov $0xffffffff,%eax
112a90: eb cf jmp 112a61 <imfs_dir_rmnod+0x39>
00108a34 <init_etc_passwd_group>:
/*
* Initialize useable but dummy databases
*/
void init_etc_passwd_group(void)
{
108a34: 55 push %ebp
108a35: 89 e5 mov %esp,%ebp
108a37: 53 push %ebx
108a38: 83 ec 04 sub $0x4,%esp
FILE *fp;
static char etc_passwd_initted = 0;
if (etc_passwd_initted)
108a3b: 80 3d 88 95 12 00 00 cmpb $0x0,0x129588
108a42: 74 08 je 108a4c <init_etc_passwd_group+0x18>
fprintf( fp, "root:x:0:root\n"
"rtems:x:1:rtems\n"
"tty:x:2:tty\n" );
fclose(fp);
}
}
108a44: 8b 5d fc mov -0x4(%ebp),%ebx
108a47: c9 leave
108a48: c3 ret
108a49: 8d 76 00 lea 0x0(%esi),%esi
FILE *fp;
static char etc_passwd_initted = 0;
if (etc_passwd_initted)
return;
etc_passwd_initted = 1;
108a4c: c6 05 88 95 12 00 01 movb $0x1,0x129588
mkdir("/etc", 0777);
108a53: 83 ec 08 sub $0x8,%esp
108a56: 68 ff 01 00 00 push $0x1ff
108a5b: 68 68 2d 12 00 push $0x122d68
108a60: e8 37 08 00 00 call 10929c <mkdir>
/*
* Initialize /etc/passwd
*/
if ((fp = fopen("/etc/passwd", "r")) != NULL) {
108a65: 59 pop %ecx
108a66: 5b pop %ebx
108a67: 68 92 18 12 00 push $0x121892
108a6c: 68 6d 2d 12 00 push $0x122d6d
108a71: e8 5a bf 00 00 call 1149d0 <fopen>
108a76: 83 c4 10 add $0x10,%esp
108a79: 85 c0 test %eax,%eax
108a7b: 74 77 je 108af4 <init_etc_passwd_group+0xc0>
fclose(fp);
108a7d: 83 ec 0c sub $0xc,%esp
108a80: 50 push %eax
108a81: e8 46 b8 00 00 call 1142cc <fclose>
108a86: 83 c4 10 add $0x10,%esp
}
/*
* Initialize /etc/group
*/
if ((fp = fopen("/etc/group", "r")) != NULL) {
108a89: 83 ec 08 sub $0x8,%esp
108a8c: 68 92 18 12 00 push $0x121892
108a91: 68 79 2d 12 00 push $0x122d79
108a96: e8 35 bf 00 00 call 1149d0 <fopen>
108a9b: 83 c4 10 add $0x10,%esp
108a9e: 85 c0 test %eax,%eax
108aa0: 74 12 je 108ab4 <init_etc_passwd_group+0x80>
fclose(fp);
108aa2: 83 ec 0c sub $0xc,%esp
108aa5: 50 push %eax
108aa6: e8 21 b8 00 00 call 1142cc <fclose>
108aab: 83 c4 10 add $0x10,%esp
fprintf( fp, "root:x:0:root\n"
"rtems:x:1:rtems\n"
"tty:x:2:tty\n" );
fclose(fp);
}
}
108aae: 8b 5d fc mov -0x4(%ebp),%ebx
108ab1: c9 leave
108ab2: c3 ret
108ab3: 90 nop
* Initialize /etc/group
*/
if ((fp = fopen("/etc/group", "r")) != NULL) {
fclose(fp);
}
else if ((fp = fopen("/etc/group", "w")) != NULL) {
108ab4: 83 ec 08 sub $0x8,%esp
108ab7: 68 74 17 12 00 push $0x121774
108abc: 68 79 2d 12 00 push $0x122d79
108ac1: e8 0a bf 00 00 call 1149d0 <fopen>
108ac6: 89 c3 mov %eax,%ebx
108ac8: 83 c4 10 add $0x10,%esp
108acb: 85 c0 test %eax,%eax
108acd: 0f 84 71 ff ff ff je 108a44 <init_etc_passwd_group+0x10><== NEVER TAKEN
fprintf( fp, "root:x:0:root\n"
108ad3: 50 push %eax
108ad4: 6a 2a push $0x2a
108ad6: 6a 01 push $0x1
108ad8: 68 ec 2d 12 00 push $0x122dec
108add: e8 c2 c6 00 00 call 1151a4 <fwrite>
"rtems:x:1:rtems\n"
"tty:x:2:tty\n" );
fclose(fp);
108ae2: 89 1c 24 mov %ebx,(%esp)
108ae5: e8 e2 b7 00 00 call 1142cc <fclose>
108aea: 83 c4 10 add $0x10,%esp
108aed: e9 52 ff ff ff jmp 108a44 <init_etc_passwd_group+0x10>
108af2: 66 90 xchg %ax,%ax
* Initialize /etc/passwd
*/
if ((fp = fopen("/etc/passwd", "r")) != NULL) {
fclose(fp);
}
else if ((fp = fopen("/etc/passwd", "w")) != NULL) {
108af4: 83 ec 08 sub $0x8,%esp
108af7: 68 74 17 12 00 push $0x121774
108afc: 68 6d 2d 12 00 push $0x122d6d
108b01: e8 ca be 00 00 call 1149d0 <fopen>
108b06: 89 c3 mov %eax,%ebx
108b08: 83 c4 10 add $0x10,%esp
108b0b: 85 c0 test %eax,%eax
108b0d: 0f 84 76 ff ff ff je 108a89 <init_etc_passwd_group+0x55><== NEVER TAKEN
fprintf(fp, "root:*:0:0:root::/:/bin/sh\n"
108b13: 50 push %eax
108b14: 6a 66 push $0x66
108b16: 6a 01 push $0x1
108b18: 68 84 2d 12 00 push $0x122d84
108b1d: e8 82 c6 00 00 call 1151a4 <fwrite>
"rtems:*:1:1:RTEMS Application::/:/bin/sh\n"
"tty:!:2:2:tty owner::/:/bin/false\n" );
fclose(fp);
108b22: 89 1c 24 mov %ebx,(%esp)
108b25: e8 a2 b7 00 00 call 1142cc <fclose>
108b2a: 83 c4 10 add $0x10,%esp
108b2d: e9 57 ff ff ff jmp 108a89 <init_etc_passwd_group+0x55>
00109f6c <iproc>:
/*
* Process a single input character
*/
static int
iproc (unsigned char c, struct rtems_termios_tty *tty)
{
109f6c: 55 push %ebp
109f6d: 89 e5 mov %esp,%ebp
109f6f: 56 push %esi
109f70: 53 push %ebx
109f71: 89 d6 mov %edx,%esi
109f73: 88 c3 mov %al,%bl
if (tty->termios.c_iflag & ISTRIP)
109f75: 8b 42 30 mov 0x30(%edx),%eax
109f78: a8 20 test $0x20,%al
109f7a: 74 03 je 109f7f <iproc+0x13> <== ALWAYS TAKEN
c &= 0x7f;
109f7c: 83 e3 7f and $0x7f,%ebx <== NOT EXECUTED
if (tty->termios.c_iflag & IUCLC)
109f7f: f6 c4 02 test $0x2,%ah
109f82: 74 18 je 109f9c <iproc+0x30>
c = tolower (c);
109f84: 0f b6 db movzbl %bl,%ebx
109f87: 8b 15 34 5b 12 00 mov 0x125b34,%edx
109f8d: 0f be 54 1a 01 movsbl 0x1(%edx,%ebx,1),%edx
109f92: 83 e2 03 and $0x3,%edx
109f95: 4a dec %edx
109f96: 0f 84 9c 00 00 00 je 10a038 <iproc+0xcc>
if (c == '\r') {
109f9c: 80 fb 0d cmp $0xd,%bl
109f9f: 74 33 je 109fd4 <iproc+0x68>
if (tty->termios.c_iflag & IGNCR)
return 0;
if (tty->termios.c_iflag & ICRNL)
c = '\n';
} else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) {
109fa1: 80 fb 0a cmp $0xa,%bl
109fa4: 0f 84 86 00 00 00 je 10a030 <iproc+0xc4>
c = '\r';
}
if ((c != '\0') && (tty->termios.c_lflag & ICANON)) {
109faa: 84 db test %bl,%bl
109fac: 75 3a jne 109fe8 <iproc+0x7c> <== ALWAYS TAKEN
}
/*
* FIXME: Should do IMAXBEL handling somehow
*/
if (tty->ccount < (CBUFSIZE-1)) {
109fae: 8b 46 20 mov 0x20(%esi),%eax
109fb1: 8b 15 20 5a 12 00 mov 0x125a20,%edx
109fb7: 4a dec %edx
109fb8: 39 d0 cmp %edx,%eax
109fba: 7d 1c jge 109fd8 <iproc+0x6c> <== NEVER TAKEN
if (tty->termios.c_lflag & ECHO)
109fbc: f6 46 3c 08 testb $0x8,0x3c(%esi)
109fc0: 75 7e jne 10a040 <iproc+0xd4> <== ALWAYS TAKEN
echo (c, tty);
tty->cbuf[tty->ccount++] = c;
109fc2: 8b 56 1c mov 0x1c(%esi),%edx
109fc5: 88 1c 02 mov %bl,(%edx,%eax,1)
109fc8: 40 inc %eax
109fc9: 89 46 20 mov %eax,0x20(%esi)
}
return 0;
109fcc: 31 c0 xor %eax,%eax
}
109fce: 5b pop %ebx
109fcf: 5e pop %esi
109fd0: c9 leave
109fd1: c3 ret
109fd2: 66 90 xchg %ax,%ax
if (tty->termios.c_iflag & IUCLC)
c = tolower (c);
if (c == '\r') {
if (tty->termios.c_iflag & IGNCR)
109fd4: a8 80 test $0x80,%al
109fd6: 74 08 je 109fe0 <iproc+0x74> <== ALWAYS TAKEN
if (tty->ccount < (CBUFSIZE-1)) {
if (tty->termios.c_lflag & ECHO)
echo (c, tty);
tty->cbuf[tty->ccount++] = c;
}
return 0;
109fd8: 31 c0 xor %eax,%eax
}
109fda: 5b pop %ebx <== NOT EXECUTED
109fdb: 5e pop %esi <== NOT EXECUTED
109fdc: c9 leave <== NOT EXECUTED
109fdd: c3 ret <== NOT EXECUTED
109fde: 66 90 xchg %ax,%ax <== NOT EXECUTED
c = tolower (c);
if (c == '\r') {
if (tty->termios.c_iflag & IGNCR)
return 0;
if (tty->termios.c_iflag & ICRNL)
109fe0: f6 c4 01 test $0x1,%ah
109fe3: 74 03 je 109fe8 <iproc+0x7c> <== NEVER TAKEN
c = '\n';
109fe5: b3 0a mov $0xa,%bl
109fe7: 90 nop
} else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) {
c = '\r';
}
if ((c != '\0') && (tty->termios.c_lflag & ICANON)) {
109fe8: 8b 46 3c mov 0x3c(%esi),%eax
109feb: a8 02 test $0x2,%al
109fed: 74 bf je 109fae <iproc+0x42>
if (c == tty->termios.c_cc[VERASE]) {
109fef: 38 5e 43 cmp %bl,0x43(%esi)
109ff2: 0f 84 b0 00 00 00 je 10a0a8 <iproc+0x13c>
erase (tty, 0);
return 0;
}
else if (c == tty->termios.c_cc[VKILL]) {
109ff8: 38 5e 44 cmp %bl,0x44(%esi)
109ffb: 74 63 je 10a060 <iproc+0xf4>
erase (tty, 1);
return 0;
}
else if (c == tty->termios.c_cc[VEOF]) {
109ffd: 38 5e 45 cmp %bl,0x45(%esi)
10a000: 0f 84 96 00 00 00 je 10a09c <iproc+0x130> <== NEVER TAKEN
return 1;
} else if (c == '\n') {
10a006: 80 fb 0a cmp $0xa,%bl
10a009: 74 69 je 10a074 <iproc+0x108>
if (tty->termios.c_lflag & (ECHO | ECHONL))
echo (c, tty);
tty->cbuf[tty->ccount++] = c;
return 1;
} else if ((c == tty->termios.c_cc[VEOL]) ||
10a00b: 38 5e 4c cmp %bl,0x4c(%esi)
10a00e: 74 05 je 10a015 <iproc+0xa9> <== NEVER TAKEN
10a010: 38 5e 51 cmp %bl,0x51(%esi)
10a013: 75 99 jne 109fae <iproc+0x42> <== ALWAYS TAKEN
(c == tty->termios.c_cc[VEOL2])) {
if (tty->termios.c_lflag & ECHO)
10a015: a8 08 test $0x8,%al <== NOT EXECUTED
10a017: 75 3b jne 10a054 <iproc+0xe8> <== NOT EXECUTED
echo (c, tty);
tty->cbuf[tty->ccount++] = c;
10a019: 8b 46 20 mov 0x20(%esi),%eax <== NOT EXECUTED
10a01c: 8b 56 1c mov 0x1c(%esi),%edx <== NOT EXECUTED
10a01f: 88 1c 02 mov %bl,(%edx,%eax,1) <== NOT EXECUTED
10a022: 40 inc %eax <== NOT EXECUTED
10a023: 89 46 20 mov %eax,0x20(%esi) <== NOT EXECUTED
return 1;
10a026: b8 01 00 00 00 mov $0x1,%eax <== NOT EXECUTED
10a02b: eb a1 jmp 109fce <iproc+0x62> <== NOT EXECUTED
10a02d: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
if (c == '\r') {
if (tty->termios.c_iflag & IGNCR)
return 0;
if (tty->termios.c_iflag & ICRNL)
c = '\n';
} else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) {
10a030: a8 40 test $0x40,%al
10a032: 74 b4 je 109fe8 <iproc+0x7c> <== ALWAYS TAKEN
c = '\r';
10a034: b3 0d mov $0xd,%bl <== NOT EXECUTED
10a036: eb b0 jmp 109fe8 <iproc+0x7c> <== NOT EXECUTED
{
if (tty->termios.c_iflag & ISTRIP)
c &= 0x7f;
if (tty->termios.c_iflag & IUCLC)
c = tolower (c);
10a038: 83 c3 20 add $0x20,%ebx
10a03b: e9 5c ff ff ff jmp 109f9c <iproc+0x30>
/*
* FIXME: Should do IMAXBEL handling somehow
*/
if (tty->ccount < (CBUFSIZE-1)) {
if (tty->termios.c_lflag & ECHO)
echo (c, tty);
10a040: 0f b6 c3 movzbl %bl,%eax
10a043: 89 f2 mov %esi,%edx
10a045: e8 f2 fc ff ff call 109d3c <echo>
10a04a: 8b 46 20 mov 0x20(%esi),%eax
10a04d: e9 70 ff ff ff jmp 109fc2 <iproc+0x56>
10a052: 66 90 xchg %ax,%ax
tty->cbuf[tty->ccount++] = c;
return 1;
} else if ((c == tty->termios.c_cc[VEOL]) ||
(c == tty->termios.c_cc[VEOL2])) {
if (tty->termios.c_lflag & ECHO)
echo (c, tty);
10a054: 0f b6 c3 movzbl %bl,%eax <== NOT EXECUTED
10a057: 89 f2 mov %esi,%edx <== NOT EXECUTED
10a059: e8 de fc ff ff call 109d3c <echo> <== NOT EXECUTED
10a05e: eb b9 jmp 10a019 <iproc+0xad> <== NOT EXECUTED
if (c == tty->termios.c_cc[VERASE]) {
erase (tty, 0);
return 0;
}
else if (c == tty->termios.c_cc[VKILL]) {
erase (tty, 1);
10a060: ba 01 00 00 00 mov $0x1,%edx
10a065: 89 f0 mov %esi,%eax
10a067: e8 34 fd ff ff call 109da0 <erase>
return 0;
10a06c: 31 c0 xor %eax,%eax
10a06e: e9 5b ff ff ff jmp 109fce <iproc+0x62>
10a073: 90 nop
}
else if (c == tty->termios.c_cc[VEOF]) {
return 1;
} else if (c == '\n') {
if (tty->termios.c_lflag & (ECHO | ECHONL))
10a074: a8 48 test $0x48,%al
10a076: 74 0c je 10a084 <iproc+0x118> <== NEVER TAKEN
echo (c, tty);
10a078: 89 f2 mov %esi,%edx
10a07a: b8 0a 00 00 00 mov $0xa,%eax
10a07f: e8 b8 fc ff ff call 109d3c <echo>
tty->cbuf[tty->ccount++] = c;
10a084: 8b 46 20 mov 0x20(%esi),%eax
10a087: 8b 56 1c mov 0x1c(%esi),%edx
10a08a: c6 04 02 0a movb $0xa,(%edx,%eax,1)
10a08e: 40 inc %eax
10a08f: 89 46 20 mov %eax,0x20(%esi)
return 1;
10a092: b8 01 00 00 00 mov $0x1,%eax
10a097: e9 32 ff ff ff jmp 109fce <iproc+0x62>
else if (c == tty->termios.c_cc[VKILL]) {
erase (tty, 1);
return 0;
}
else if (c == tty->termios.c_cc[VEOF]) {
return 1;
10a09c: b8 01 00 00 00 mov $0x1,%eax <== NOT EXECUTED
10a0a1: e9 28 ff ff ff jmp 109fce <iproc+0x62> <== NOT EXECUTED
10a0a6: 66 90 xchg %ax,%ax <== NOT EXECUTED
c = '\r';
}
if ((c != '\0') && (tty->termios.c_lflag & ICANON)) {
if (c == tty->termios.c_cc[VERASE]) {
erase (tty, 0);
10a0a8: 31 d2 xor %edx,%edx
10a0aa: 89 f0 mov %esi,%eax
10a0ac: e8 ef fc ff ff call 109da0 <erase>
return 0;
10a0b1: 31 c0 xor %eax,%eax
10a0b3: e9 16 ff ff ff jmp 109fce <iproc+0x62>
00124a68 <killinfo>:
int killinfo(
pid_t pid,
int sig,
const union sigval *value
)
{
124a68: 55 push %ebp
124a69: 89 e5 mov %esp,%ebp
124a6b: 57 push %edi
124a6c: 56 push %esi
124a6d: 53 push %ebx
124a6e: 83 ec 3c sub $0x3c,%esp
124a71: 8b 75 0c mov 0xc(%ebp),%esi
124a74: 8b 7d 10 mov 0x10(%ebp),%edi
POSIX_signals_Siginfo_node *psiginfo;
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid != getpid() )
124a77: e8 00 fd ff ff call 12477c <getpid>
124a7c: 3b 45 08 cmp 0x8(%ebp),%eax
124a7f: 0f 85 3f 02 00 00 jne 124cc4 <killinfo+0x25c>
rtems_set_errno_and_return_minus_one( ESRCH );
/*
* Validate the signal passed.
*/
if ( !sig )
124a85: 85 f6 test %esi,%esi
124a87: 0f 84 4c 02 00 00 je 124cd9 <killinfo+0x271>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
124a8d: 8d 4e ff lea -0x1(%esi),%ecx
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
124a90: 83 f9 1f cmp $0x1f,%ecx
124a93: 0f 87 40 02 00 00 ja 124cd9 <killinfo+0x271>
rtems_set_errno_and_return_minus_one( EINVAL );
/*
* If the signal is being ignored, then we are out of here.
*/
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
124a99: 8d 04 76 lea (%esi,%esi,2),%eax
124a9c: 83 3c 85 e8 f1 12 00 cmpl $0x1,0x12f1e8(,%eax,4)
124aa3: 01
124aa4: 0f 84 e6 01 00 00 je 124c90 <killinfo+0x228>
/*
* P1003.1c/Draft 10, p. 33 says that certain signals should always
* be directed to the executing thread such as those caused by hardware
* faults.
*/
if ( (sig == SIGFPE) || (sig == SIGILL) || (sig == SIGSEGV ) )
124aaa: 83 fe 08 cmp $0x8,%esi
124aad: 0f 84 c9 00 00 00 je 124b7c <killinfo+0x114>
124ab3: 83 fe 04 cmp $0x4,%esi
124ab6: 0f 84 c0 00 00 00 je 124b7c <killinfo+0x114>
124abc: 83 fe 0b cmp $0xb,%esi
124abf: 0f 84 b7 00 00 00 je 124b7c <killinfo+0x114>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
124ac5: bb 01 00 00 00 mov $0x1,%ebx
124aca: d3 e3 shl %cl,%ebx
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
124acc: 89 75 dc mov %esi,-0x24(%ebp)
siginfo->si_code = SI_USER;
124acf: c7 45 e0 01 00 00 00 movl $0x1,-0x20(%ebp)
if ( !value ) {
124ad6: 85 ff test %edi,%edi
124ad8: 0f 84 ba 01 00 00 je 124c98 <killinfo+0x230>
siginfo->si_value.sival_int = 0;
} else {
siginfo->si_value = *value;
124ade: 8b 07 mov (%edi),%eax
124ae0: 89 45 e4 mov %eax,-0x1c(%ebp)
124ae3: a1 90 eb 12 00 mov 0x12eb90,%eax
124ae8: 40 inc %eax
124ae9: a3 90 eb 12 00 mov %eax,0x12eb90
/*
* Is the currently executing thread interested? If so then it will
* get it an execute it as soon as the dispatcher executes.
*/
the_thread = _Thread_Executing;
124aee: 8b 0d 78 f1 12 00 mov 0x12f178,%ecx
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( _POSIX_signals_Is_interested( api, mask ) ) {
124af4: 8b 81 ec 00 00 00 mov 0xec(%ecx),%eax
124afa: 8b 80 d0 00 00 00 mov 0xd0(%eax),%eax
124b00: f7 d0 not %eax
124b02: 85 c3 test %eax,%ebx
124b04: 75 34 jne 124b3a <killinfo+0xd2>
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
124b06: a1 80 f3 12 00 mov 0x12f380,%eax
/* XXX violation of visibility -- need to define thread queue support */
the_chain = &_POSIX_signals_Wait_queue.Queues.Fifo;
for ( the_node = _Chain_First( the_chain );
124b0b: 3d 84 f3 12 00 cmp $0x12f384,%eax
124b10: 75 1b jne 124b2d <killinfo+0xc5>
124b12: e9 81 00 00 00 jmp 124b98 <killinfo+0x130>
124b17: 90 nop
/*
* Is this thread is blocked waiting for another signal but has
* not blocked this one?
*/
if (~api->signals_blocked & mask)
124b18: 8b 92 d0 00 00 00 mov 0xd0(%edx),%edx
124b1e: f7 d2 not %edx
124b20: 85 d3 test %edx,%ebx
124b22: 75 16 jne 124b3a <killinfo+0xd2>
the_chain = &_POSIX_signals_Wait_queue.Queues.Fifo;
for ( the_node = _Chain_First( the_chain );
!_Chain_Is_tail( the_chain, the_node ) ;
the_node = the_node->next ) {
124b24: 8b 00 mov (%eax),%eax
/* XXX violation of visibility -- need to define thread queue support */
the_chain = &_POSIX_signals_Wait_queue.Queues.Fifo;
for ( the_node = _Chain_First( the_chain );
124b26: 3d 84 f3 12 00 cmp $0x12f384,%eax
124b2b: 74 6b je 124b98 <killinfo+0x130> <== ALWAYS TAKEN
!_Chain_Is_tail( the_chain, the_node ) ;
the_node = the_node->next ) {
the_thread = (Thread_Control *)the_node;
124b2d: 89 c1 mov %eax,%ecx
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
124b2f: 8b 90 ec 00 00 00 mov 0xec(%eax),%edx
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
124b35: 85 58 30 test %ebx,0x30(%eax)
124b38: 74 de je 124b18 <killinfo+0xb0>
/*
* Returns true if the signal was synchronously given to a thread
* blocked waiting for the signal.
*/
if ( _POSIX_signals_Unblock_thread( the_thread, sig, siginfo ) ) {
124b3a: 50 push %eax
mask = signo_to_mask( sig );
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
124b3b: 8d 45 dc lea -0x24(%ebp),%eax
/*
* Returns true if the signal was synchronously given to a thread
* blocked waiting for the signal.
*/
if ( _POSIX_signals_Unblock_thread( the_thread, sig, siginfo ) ) {
124b3e: 50 push %eax
124b3f: 56 push %esi
124b40: 51 push %ecx
124b41: e8 d6 01 00 00 call 124d1c <_POSIX_signals_Unblock_thread>
124b46: 83 c4 10 add $0x10,%esp
124b49: 84 c0 test %al,%al
124b4b: 75 1f jne 124b6c <killinfo+0x104>
/*
* We may have woken up a thread but we definitely need to post the
* signal to the process wide information set.
*/
_POSIX_signals_Set_process_signals( mask );
124b4d: 83 ec 0c sub $0xc,%esp
124b50: 53 push %ebx
124b51: e8 b2 01 00 00 call 124d08 <_POSIX_signals_Set_process_signals>
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
124b56: 8d 1c 76 lea (%esi,%esi,2),%ebx
124b59: c1 e3 02 shl $0x2,%ebx
124b5c: 83 c4 10 add $0x10,%esp
124b5f: 83 bb e0 f1 12 00 02 cmpl $0x2,0x12f1e0(%ebx)
124b66: 0f 84 e4 00 00 00 je 124c50 <killinfo+0x1e8>
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
124b6c: e8 ab de fe ff call 112a1c <_Thread_Enable_dispatch>
return 0;
124b71: 31 c0 xor %eax,%eax
}
124b73: 8d 65 f4 lea -0xc(%ebp),%esp
124b76: 5b pop %ebx
124b77: 5e pop %esi
124b78: 5f pop %edi
124b79: c9 leave
124b7a: c3 ret
124b7b: 90 nop
* P1003.1c/Draft 10, p. 33 says that certain signals should always
* be directed to the executing thread such as those caused by hardware
* faults.
*/
if ( (sig == SIGFPE) || (sig == SIGILL) || (sig == SIGSEGV ) )
return pthread_kill( pthread_self(), sig );
124b7c: e8 7b 03 00 00 call 124efc <pthread_self>
124b81: 83 ec 08 sub $0x8,%esp
124b84: 56 push %esi
124b85: 50 push %eax
124b86: e8 b1 02 00 00 call 124e3c <pthread_kill>
124b8b: 83 c4 10 add $0x10,%esp
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
124b8e: 8d 65 f4 lea -0xc(%ebp),%esp
124b91: 5b pop %ebx
124b92: 5e pop %esi
124b93: 5f pop %edi
124b94: c9 leave
124b95: c3 ret
124b96: 66 90 xchg %ax,%ax
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
124b98: 0f b6 05 d4 a6 12 00 movzbl 0x12a6d4,%eax
124b9f: 40 inc %eax
124ba0: 89 45 d4 mov %eax,-0x2c(%ebp)
*
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
124ba3: c7 45 c8 00 00 00 00 movl $0x0,-0x38(%ebp)
interested_priority = PRIORITY_MAXIMUM + 1;
for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) {
124baa: c7 45 cc 02 00 00 00 movl $0x2,-0x34(%ebp)
124bb1: 89 5d d0 mov %ebx,-0x30(%ebp)
124bb4: 89 75 c0 mov %esi,-0x40(%ebp)
/*
* This can occur when no one is interested and an API is not configured.
*/
if ( !_Objects_Information_table[ the_api ] )
124bb7: 8b 55 cc mov -0x34(%ebp),%edx
124bba: 8b 04 95 68 eb 12 00 mov 0x12eb68(,%edx,4),%eax
124bc1: 85 c0 test %eax,%eax
124bc3: 74 68 je 124c2d <killinfo+0x1c5> <== NEVER TAKEN
continue;
the_info = _Objects_Information_table[ the_api ][ 1 ];
124bc5: 8b 40 04 mov 0x4(%eax),%eax
*/
if ( !the_info )
continue;
#endif
maximum = the_info->maximum;
124bc8: 0f b7 70 10 movzwl 0x10(%eax),%esi
object_table = the_info->local_table;
124bcc: 8b 78 1c mov 0x1c(%eax),%edi
for ( index = 1 ; index <= maximum ; index++ ) {
124bcf: 85 f6 test %esi,%esi
124bd1: 74 5a je 124c2d <killinfo+0x1c5>
124bd3: b8 01 00 00 00 mov $0x1,%eax
the_thread = (Thread_Control *) object_table[ index ];
124bd8: 8b 14 87 mov (%edi,%eax,4),%edx
if ( !the_thread )
124bdb: 85 d2 test %edx,%edx
124bdd: 74 49 je 124c28 <killinfo+0x1c0>
/*
* If this thread is of lower priority than the interested thread,
* go on to the next thread.
*/
if ( the_thread->current_priority > interested_priority )
124bdf: 8b 4a 14 mov 0x14(%edx),%ecx
124be2: 3b 4d d4 cmp -0x2c(%ebp),%ecx
124be5: 77 41 ja 124c28 <killinfo+0x1c0>
#if defined(RTEMS_DEBUG)
if ( !api )
continue;
#endif
if ( !_POSIX_signals_Is_interested( api, mask ) )
124be7: 8b 9a ec 00 00 00 mov 0xec(%edx),%ebx
124bed: 8b 9b d0 00 00 00 mov 0xd0(%ebx),%ebx
124bf3: f7 d3 not %ebx
124bf5: 85 5d d0 test %ebx,-0x30(%ebp)
124bf8: 74 2e je 124c28 <killinfo+0x1c0>
*
* NOTE: We initialized interested_priority to PRIORITY_MAXIMUM + 1
* so we never have to worry about deferencing a NULL
* interested thread.
*/
if ( the_thread->current_priority < interested_priority ) {
124bfa: 3b 4d d4 cmp -0x2c(%ebp),%ecx
124bfd: 72 21 jb 124c20 <killinfo+0x1b8>
* and blocking interruptibutable by signal.
*
* If the interested thread is ready, don't think about changing.
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
124bff: 8b 5d c8 mov -0x38(%ebp),%ebx
124c02: 85 db test %ebx,%ebx
124c04: 74 22 je 124c28 <killinfo+0x1c0> <== NEVER TAKEN
124c06: 8b 5d c8 mov -0x38(%ebp),%ebx
124c09: 8b 5b 10 mov 0x10(%ebx),%ebx
124c0c: 89 5d c4 mov %ebx,-0x3c(%ebp)
124c0f: 85 db test %ebx,%ebx
124c11: 74 15 je 124c28 <killinfo+0x1c0> <== NEVER TAKEN
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
124c13: 8b 5a 10 mov 0x10(%edx),%ebx
124c16: 85 db test %ebx,%ebx
124c18: 0f 85 86 00 00 00 jne 124ca4 <killinfo+0x23c>
124c1e: 66 90 xchg %ax,%ax
124c20: 89 4d d4 mov %ecx,-0x2c(%ebp)
124c23: 89 55 c8 mov %edx,-0x38(%ebp)
124c26: 66 90 xchg %ax,%ax
#endif
maximum = the_info->maximum;
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
124c28: 40 inc %eax
124c29: 39 c6 cmp %eax,%esi
124c2b: 73 ab jae 124bd8 <killinfo+0x170>
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) {
124c2d: ff 45 cc incl -0x34(%ebp)
124c30: 83 7d cc 04 cmpl $0x4,-0x34(%ebp)
124c34: 75 81 jne 124bb7 <killinfo+0x14f>
124c36: 8b 5d d0 mov -0x30(%ebp),%ebx
124c39: 8b 75 c0 mov -0x40(%ebp),%esi
}
}
}
}
if ( interested ) {
124c3c: 8b 55 c8 mov -0x38(%ebp),%edx
124c3f: 85 d2 test %edx,%edx
124c41: 0f 84 06 ff ff ff je 124b4d <killinfo+0xe5>
124c47: 8b 4d c8 mov -0x38(%ebp),%ecx
124c4a: e9 eb fe ff ff jmp 124b3a <killinfo+0xd2>
124c4f: 90 nop
_POSIX_signals_Set_process_signals( mask );
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get( &_POSIX_signals_Inactive_siginfo );
124c50: 83 ec 0c sub $0xc,%esp
124c53: 68 60 f3 12 00 push $0x12f360
124c58: e8 43 c4 fe ff call 1110a0 <_Chain_Get>
if ( !psiginfo ) {
124c5d: 83 c4 10 add $0x10,%esp
124c60: 85 c0 test %eax,%eax
124c62: 0f 84 86 00 00 00 je 124cee <killinfo+0x286>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EAGAIN );
}
psiginfo->Info = *siginfo;
124c68: 8d 78 08 lea 0x8(%eax),%edi
124c6b: 8d 75 dc lea -0x24(%ebp),%esi
124c6e: b9 03 00 00 00 mov $0x3,%ecx
124c73: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
124c75: 83 ec 08 sub $0x8,%esp
124c78: 50 push %eax
124c79: 81 c3 00 f4 12 00 add $0x12f400,%ebx
124c7f: 53 push %ebx
124c80: e8 df c3 fe ff call 111064 <_Chain_Append>
124c85: 83 c4 10 add $0x10,%esp
124c88: e9 df fe ff ff jmp 124b6c <killinfo+0x104>
124c8d: 8d 76 00 lea 0x0(%esi),%esi
/*
* If the signal is being ignored, then we are out of here.
*/
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
return 0;
124c90: 31 c0 xor %eax,%eax
124c92: e9 f7 fe ff ff jmp 124b8e <killinfo+0x126>
124c97: 90 nop
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
siginfo->si_code = SI_USER;
if ( !value ) {
siginfo->si_value.sival_int = 0;
124c98: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
124c9f: e9 3f fe ff ff jmp 124ae3 <killinfo+0x7b>
continue;
}
DEBUG_STEP("6");
/* prefer blocked/interruptible over blocked/not interruptible */
if ( !_States_Is_interruptible_by_signal(interested->current_state) ) {
124ca4: f7 45 c4 00 00 00 10 testl $0x10000000,-0x3c(%ebp)
124cab: 0f 85 77 ff ff ff jne 124c28 <killinfo+0x1c0>
DEBUG_STEP("7");
if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) {
124cb1: 81 e3 00 00 00 10 and $0x10000000,%ebx
124cb7: 0f 84 6b ff ff ff je 124c28 <killinfo+0x1c0>
124cbd: e9 5e ff ff ff jmp 124c20 <killinfo+0x1b8>
124cc2: 66 90 xchg %ax,%ax
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid != getpid() )
rtems_set_errno_and_return_minus_one( ESRCH );
124cc4: e8 23 38 ff ff call 1184ec <__errno>
124cc9: c7 00 03 00 00 00 movl $0x3,(%eax)
124ccf: b8 ff ff ff ff mov $0xffffffff,%eax
124cd4: e9 b5 fe ff ff jmp 124b8e <killinfo+0x126>
*/
if ( !sig )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
rtems_set_errno_and_return_minus_one( EINVAL );
124cd9: e8 0e 38 ff ff call 1184ec <__errno>
124cde: c7 00 16 00 00 00 movl $0x16,(%eax)
124ce4: b8 ff ff ff ff mov $0xffffffff,%eax
124ce9: e9 a0 fe ff ff jmp 124b8e <killinfo+0x126>
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get( &_POSIX_signals_Inactive_siginfo );
if ( !psiginfo ) {
_Thread_Enable_dispatch();
124cee: e8 29 dd fe ff call 112a1c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
124cf3: e8 f4 37 ff ff call 1184ec <__errno>
124cf8: c7 00 0b 00 00 00 movl $0xb,(%eax)
124cfe: 83 c8 ff or $0xffffffff,%eax
124d01: e9 88 fe ff ff jmp 124b8e <killinfo+0x126>
0011f234 <libc_wrapup>:
extern void _wrapup_reent(struct _reent *);
extern void _reclaim_reent(struct _reent *);
void libc_wrapup(void)
{
11f234: 55 push %ebp
11f235: 89 e5 mov %esp,%ebp
11f237: 53 push %ebx
11f238: 83 ec 04 sub $0x4,%esp
/*
* In case RTEMS is already down, don't do this. It could be
* dangerous.
*/
if (!_System_state_Is_up(_System_state_Get()))
11f23b: 83 3d 00 80 12 00 03 cmpl $0x3,0x128000
11f242: 74 08 je 11f24c <libc_wrapup+0x18> <== ALWAYS TAKEN
*/
fclose (stdin);
fclose (stdout);
fclose (stderr);
}
11f244: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
11f247: c9 leave <== NOT EXECUTED
11f248: c3 ret <== NOT EXECUTED
11f249: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
/*
* This was already done if the user called exit() directly .
_wrapup_reent(0);
*/
if (_REENT != _global_impure_ptr) {
11f24c: a1 40 5b 12 00 mov 0x125b40,%eax
11f251: 8b 1d a0 1f 12 00 mov 0x121fa0,%ebx
11f257: 39 d8 cmp %ebx,%eax
11f259: 74 14 je 11f26f <libc_wrapup+0x3b>
_wrapup_reent(_global_impure_ptr);
11f25b: 83 ec 0c sub $0xc,%esp
11f25e: 53 push %ebx
11f25f: e8 f8 05 00 00 call 11f85c <_wrapup_reent>
/* Don't reclaim this one, just in case we do printfs
* on the way out to ROM.
*/
_reclaim_reent(&libc_global_reent);
#endif
_REENT = _global_impure_ptr;
11f264: 89 1d 40 5b 12 00 mov %ebx,0x125b40
11f26a: 83 c4 10 add $0x10,%esp
11f26d: 89 d8 mov %ebx,%eax
*
* Should this be changed to do *all* file streams?
* _fwalk (_REENT, fclose);
*/
fclose (stdin);
11f26f: 83 ec 0c sub $0xc,%esp
11f272: ff 70 04 pushl 0x4(%eax)
11f275: e8 f2 41 ff ff call 11346c <fclose>
fclose (stdout);
11f27a: 5a pop %edx
11f27b: a1 40 5b 12 00 mov 0x125b40,%eax
11f280: ff 70 08 pushl 0x8(%eax)
11f283: e8 e4 41 ff ff call 11346c <fclose>
fclose (stderr);
11f288: 58 pop %eax
11f289: a1 40 5b 12 00 mov 0x125b40,%eax
11f28e: ff 70 0c pushl 0xc(%eax)
11f291: e8 d6 41 ff ff call 11346c <fclose>
11f296: 83 c4 10 add $0x10,%esp
}
11f299: 8b 5d fc mov -0x4(%ebp),%ebx
11f29c: c9 leave
11f29d: c3 ret
0010b578 <link>:
int link(
const char *existing,
const char *new
)
{
10b578: 55 push %ebp
10b579: 89 e5 mov %esp,%ebp
10b57b: 57 push %edi
10b57c: 56 push %esi
10b57d: 53 push %ebx
10b57e: 83 ec 58 sub $0x58,%esp
10b581: 8b 55 08 mov 0x8(%ebp),%edx
10b584: 8b 5d 0c mov 0xc(%ebp),%ebx
/*
* Get the node we are linking to.
*/
result = rtems_filesystem_evaluate_path( existing, strlen( existing ),
10b587: 31 c0 xor %eax,%eax
10b589: b9 ff ff ff ff mov $0xffffffff,%ecx
10b58e: 89 d7 mov %edx,%edi
10b590: f2 ae repnz scas %es:(%edi),%al
10b592: f7 d1 not %ecx
10b594: 49 dec %ecx
10b595: 6a 01 push $0x1
10b597: 8d 75 cc lea -0x34(%ebp),%esi
10b59a: 56 push %esi
10b59b: 6a 00 push $0x0
10b59d: 51 push %ecx
10b59e: 52 push %edx
10b59f: e8 28 f9 ff ff call 10aecc <rtems_filesystem_evaluate_path>
0, &existing_loc, true );
if ( result != 0 )
10b5a4: 83 c4 20 add $0x20,%esp
10b5a7: 85 c0 test %eax,%eax
10b5a9: 74 0d je 10b5b8 <link+0x40>
return -1;
10b5ab: b8 ff ff ff ff mov $0xffffffff,%eax
rtems_filesystem_freenode( &existing_loc );
rtems_filesystem_freenode( &parent_loc );
return result;
}
10b5b0: 8d 65 f4 lea -0xc(%ebp),%esp
10b5b3: 5b pop %ebx
10b5b4: 5e pop %esi
10b5b5: 5f pop %edi
10b5b6: c9 leave
10b5b7: c3 ret
/*
* Get the parent of the node we are creating.
*/
rtems_filesystem_get_start_loc( new, &i, &parent_loc );
10b5b8: 52 push %edx
10b5b9: 8d 7d b8 lea -0x48(%ebp),%edi
10b5bc: 57 push %edi
10b5bd: 8d 45 e4 lea -0x1c(%ebp),%eax
10b5c0: 50 push %eax
10b5c1: 53 push %ebx
10b5c2: e8 f5 12 00 00 call 10c8bc <rtems_filesystem_get_start_loc>
result = (*parent_loc.ops->evalformake_h)( &new[i], &parent_loc, &name_start );
10b5c7: 83 c4 0c add $0xc,%esp
10b5ca: 8d 45 e0 lea -0x20(%ebp),%eax
10b5cd: 50 push %eax
10b5ce: 57 push %edi
10b5cf: 03 5d e4 add -0x1c(%ebp),%ebx
10b5d2: 53 push %ebx
10b5d3: 8b 45 c4 mov -0x3c(%ebp),%eax
10b5d6: ff 50 04 call *0x4(%eax)
if ( result != 0 ) {
10b5d9: 83 c4 10 add $0x10,%esp
10b5dc: 85 c0 test %eax,%eax
10b5de: 75 61 jne 10b641 <link+0xc9>
/*
* Check to see if the caller is trying to link across file system
* boundaries.
*/
if ( parent_loc.mt_entry != existing_loc.mt_entry ) {
10b5e0: 8b 45 dc mov -0x24(%ebp),%eax
10b5e3: 39 45 c8 cmp %eax,-0x38(%ebp)
10b5e6: 75 30 jne 10b618 <link+0xa0>
rtems_filesystem_freenode( &existing_loc );
rtems_filesystem_freenode( &parent_loc );
rtems_set_errno_and_return_minus_one( EXDEV );
}
result = (*parent_loc.ops->link_h)( &existing_loc, &parent_loc, name_start );
10b5e8: 50 push %eax
10b5e9: ff 75 e0 pushl -0x20(%ebp)
10b5ec: 57 push %edi
10b5ed: 56 push %esi
10b5ee: 8b 45 c4 mov -0x3c(%ebp),%eax
10b5f1: ff 50 08 call *0x8(%eax)
rtems_filesystem_freenode( &existing_loc );
10b5f4: 89 34 24 mov %esi,(%esp)
10b5f7: 89 45 b4 mov %eax,-0x4c(%ebp)
10b5fa: e8 81 fb ff ff call 10b180 <rtems_filesystem_freenode>
rtems_filesystem_freenode( &parent_loc );
10b5ff: 89 3c 24 mov %edi,(%esp)
10b602: e8 79 fb ff ff call 10b180 <rtems_filesystem_freenode>
return result;
10b607: 83 c4 10 add $0x10,%esp
10b60a: 8b 45 b4 mov -0x4c(%ebp),%eax
}
10b60d: 8d 65 f4 lea -0xc(%ebp),%esp
10b610: 5b pop %ebx
10b611: 5e pop %esi
10b612: 5f pop %edi
10b613: c9 leave
10b614: c3 ret
10b615: 8d 76 00 lea 0x0(%esi),%esi
* Check to see if the caller is trying to link across file system
* boundaries.
*/
if ( parent_loc.mt_entry != existing_loc.mt_entry ) {
rtems_filesystem_freenode( &existing_loc );
10b618: 83 ec 0c sub $0xc,%esp
10b61b: 56 push %esi
10b61c: e8 5f fb ff ff call 10b180 <rtems_filesystem_freenode>
rtems_filesystem_freenode( &parent_loc );
10b621: 89 3c 24 mov %edi,(%esp)
10b624: e8 57 fb ff ff call 10b180 <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( EXDEV );
10b629: e8 36 b9 00 00 call 116f64 <__errno>
10b62e: c7 00 12 00 00 00 movl $0x12,(%eax)
10b634: 83 c4 10 add $0x10,%esp
10b637: b8 ff ff ff ff mov $0xffffffff,%eax
10b63c: e9 6f ff ff ff jmp 10b5b0 <link+0x38>
rtems_filesystem_get_start_loc( new, &i, &parent_loc );
result = (*parent_loc.ops->evalformake_h)( &new[i], &parent_loc, &name_start );
if ( result != 0 ) {
rtems_filesystem_freenode( &existing_loc );
10b641: 83 ec 0c sub $0xc,%esp
10b644: 56 push %esi
10b645: e8 36 fb ff ff call 10b180 <rtems_filesystem_freenode>
return -1;
10b64a: 83 c4 10 add $0x10,%esp
10b64d: b8 ff ff ff ff mov $0xffffffff,%eax
10b652: e9 59 ff ff ff jmp 10b5b0 <link+0x38>
0011f10c <lseek>:
off_t lseek(
int fd,
off_t offset,
int whence
)
{
11f10c: 55 push %ebp
11f10d: 89 e5 mov %esp,%ebp
11f10f: 57 push %edi
11f110: 56 push %esi
11f111: 53 push %ebx
11f112: 83 ec 1c sub $0x1c,%esp
11f115: 8b 5d 08 mov 0x8(%ebp),%ebx
11f118: 8b 55 0c mov 0xc(%ebp),%edx
11f11b: 8b 4d 10 mov 0x10(%ebp),%ecx
11f11e: 8b 45 14 mov 0x14(%ebp),%eax
rtems_libio_t *iop;
off_t old_offset;
off_t status;
rtems_libio_check_fd( fd );
11f121: 3b 1d 2c 3a 12 00 cmp 0x123a2c,%ebx
11f127: 0f 83 b3 00 00 00 jae 11f1e0 <lseek+0xd4> <== NEVER TAKEN
iop = rtems_libio_iop( fd );
11f12d: 8d 34 dd 00 00 00 00 lea 0x0(,%ebx,8),%esi
11f134: 8d 1c f5 00 00 00 00 lea 0x0(,%esi,8),%ebx
11f13b: 29 f3 sub %esi,%ebx
11f13d: 03 1d c0 7c 12 00 add 0x127cc0,%ebx
rtems_libio_check_is_open(iop);
11f143: f6 43 15 01 testb $0x1,0x15(%ebx)
11f147: 0f 84 93 00 00 00 je 11f1e0 <lseek+0xd4> <== NEVER TAKEN
/*
* Now process the lseek().
*/
old_offset = iop->offset;
11f14d: 8b 73 0c mov 0xc(%ebx),%esi
11f150: 8b 7b 10 mov 0x10(%ebx),%edi
11f153: 89 75 e0 mov %esi,-0x20(%ebp)
11f156: 89 7d e4 mov %edi,-0x1c(%ebp)
switch ( whence ) {
11f159: 83 f8 01 cmp $0x1,%eax
11f15c: 74 6e je 11f1cc <lseek+0xc0>
11f15e: 83 f8 02 cmp $0x2,%eax
11f161: 74 35 je 11f198 <lseek+0x8c>
11f163: 85 c0 test %eax,%eax
11f165: 75 45 jne 11f1ac <lseek+0xa0>
case SEEK_SET:
iop->offset = offset;
11f167: 89 53 0c mov %edx,0xc(%ebx)
11f16a: 89 4b 10 mov %ecx,0x10(%ebx)
/*
* At this time, handlers assume iop->offset has the desired
* new offset.
*/
status = (*iop->pathinfo.handlers->lseek_h)( iop, offset, whence );
11f16d: 8b 73 20 mov 0x20(%ebx),%esi
11f170: 50 push %eax
11f171: 51 push %ecx
11f172: 52 push %edx
11f173: 53 push %ebx
11f174: ff 56 14 call *0x14(%esi)
if ( status == (off_t) -1 )
11f177: 83 c4 10 add $0x10,%esp
11f17a: 89 c1 mov %eax,%ecx
11f17c: 21 d1 and %edx,%ecx
11f17e: 41 inc %ecx
11f17f: 75 0c jne 11f18d <lseek+0x81>
iop->offset = old_offset;
11f181: 8b 75 e0 mov -0x20(%ebp),%esi
11f184: 8b 7d e4 mov -0x1c(%ebp),%edi
11f187: 89 73 0c mov %esi,0xc(%ebx)
11f18a: 89 7b 10 mov %edi,0x10(%ebx)
/*
* So if the operation failed, we have to restore iop->offset.
*/
return status;
}
11f18d: 8d 65 f4 lea -0xc(%ebp),%esp
11f190: 5b pop %ebx
11f191: 5e pop %esi
11f192: 5f pop %edi
11f193: c9 leave
11f194: c3 ret
11f195: 8d 76 00 lea 0x0(%esi),%esi
case SEEK_CUR:
iop->offset += offset;
break;
case SEEK_END:
iop->offset = iop->size + offset;
11f198: 89 d6 mov %edx,%esi
11f19a: 89 cf mov %ecx,%edi
11f19c: 03 73 04 add 0x4(%ebx),%esi
11f19f: 13 7b 08 adc 0x8(%ebx),%edi
11f1a2: 89 73 0c mov %esi,0xc(%ebx)
11f1a5: 89 7b 10 mov %edi,0x10(%ebx)
break;
11f1a8: eb c3 jmp 11f16d <lseek+0x61>
11f1aa: 66 90 xchg %ax,%ax
default:
rtems_set_errno_and_return_minus_one( EINVAL );
11f1ac: e8 63 41 ff ff call 113314 <__errno>
11f1b1: c7 00 16 00 00 00 movl $0x16,(%eax)
11f1b7: b8 ff ff ff ff mov $0xffffffff,%eax
11f1bc: ba ff ff ff ff mov $0xffffffff,%edx
/*
* So if the operation failed, we have to restore iop->offset.
*/
return status;
}
11f1c1: 8d 65 f4 lea -0xc(%ebp),%esp
11f1c4: 5b pop %ebx
11f1c5: 5e pop %esi
11f1c6: 5f pop %edi
11f1c7: c9 leave
11f1c8: c3 ret
11f1c9: 8d 76 00 lea 0x0(%esi),%esi
case SEEK_SET:
iop->offset = offset;
break;
case SEEK_CUR:
iop->offset += offset;
11f1cc: 8b 75 e0 mov -0x20(%ebp),%esi
11f1cf: 8b 7d e4 mov -0x1c(%ebp),%edi
11f1d2: 01 d6 add %edx,%esi
11f1d4: 11 cf adc %ecx,%edi
11f1d6: 89 73 0c mov %esi,0xc(%ebx)
11f1d9: 89 7b 10 mov %edi,0x10(%ebx)
break;
11f1dc: eb 8f jmp 11f16d <lseek+0x61>
11f1de: 66 90 xchg %ax,%ax
off_t old_offset;
off_t status;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open(iop);
11f1e0: e8 2f 41 ff ff call 113314 <__errno>
11f1e5: c7 00 09 00 00 00 movl $0x9,(%eax)
11f1eb: b8 ff ff ff ff mov $0xffffffff,%eax
11f1f0: ba ff ff ff ff mov $0xffffffff,%edx
11f1f5: eb 96 jmp 11f18d <lseek+0x81>
00109ecc <lstat>:
int _STAT_NAME(
const char *path,
struct stat *buf
)
{
109ecc: 55 push %ebp
109ecd: 89 e5 mov %esp,%ebp
109ecf: 57 push %edi
109ed0: 56 push %esi
109ed1: 53 push %ebx
109ed2: 83 ec 3c sub $0x3c,%esp
109ed5: 8b 55 08 mov 0x8(%ebp),%edx
109ed8: 8b 75 0c mov 0xc(%ebp),%esi
/*
* Check to see if we were passed a valid pointer.
*/
if ( !buf )
109edb: 85 f6 test %esi,%esi
109edd: 74 65 je 109f44 <lstat+0x78>
rtems_set_errno_and_return_minus_one( EFAULT );
status = rtems_filesystem_evaluate_path( path, strlen( path ),
109edf: b9 ff ff ff ff mov $0xffffffff,%ecx
109ee4: 89 d7 mov %edx,%edi
109ee6: 31 c0 xor %eax,%eax
109ee8: f2 ae repnz scas %es:(%edi),%al
109eea: f7 d1 not %ecx
109eec: 49 dec %ecx
109eed: 83 ec 0c sub $0xc,%esp
109ef0: 6a 00 push $0x0
109ef2: 8d 5d d4 lea -0x2c(%ebp),%ebx
109ef5: 53 push %ebx
109ef6: 6a 00 push $0x0
109ef8: 51 push %ecx
109ef9: 52 push %edx
109efa: e8 e5 f9 ff ff call 1098e4 <rtems_filesystem_evaluate_path>
0, &loc, _STAT_FOLLOW_LINKS );
if ( status != 0 )
109eff: 83 c4 20 add $0x20,%esp
109f02: 85 c0 test %eax,%eax
109f04: 74 0e je 109f14 <lstat+0x48>
return -1;
109f06: b8 ff ff ff ff mov $0xffffffff,%eax
status = (*loc.handlers->fstat_h)( &loc, buf );
rtems_filesystem_freenode( &loc );
return status;
}
109f0b: 8d 65 f4 lea -0xc(%ebp),%esp
109f0e: 5b pop %ebx
109f0f: 5e pop %esi
109f10: 5f pop %edi
109f11: c9 leave
109f12: c3 ret
109f13: 90 nop
/*
* Zero out the stat structure so the various support
* versions of stat don't have to.
*/
memset( buf, 0, sizeof(struct stat) );
109f14: b9 48 00 00 00 mov $0x48,%ecx
109f19: 89 f7 mov %esi,%edi
109f1b: f3 aa rep stos %al,%es:(%edi)
status = (*loc.handlers->fstat_h)( &loc, buf );
109f1d: 83 ec 08 sub $0x8,%esp
109f20: 56 push %esi
109f21: 53 push %ebx
109f22: 8b 45 dc mov -0x24(%ebp),%eax
109f25: ff 50 18 call *0x18(%eax)
rtems_filesystem_freenode( &loc );
109f28: 89 1c 24 mov %ebx,(%esp)
109f2b: 89 45 c4 mov %eax,-0x3c(%ebp)
109f2e: e8 89 fa ff ff call 1099bc <rtems_filesystem_freenode>
return status;
109f33: 83 c4 10 add $0x10,%esp
109f36: 8b 45 c4 mov -0x3c(%ebp),%eax
}
109f39: 8d 65 f4 lea -0xc(%ebp),%esp
109f3c: 5b pop %ebx
109f3d: 5e pop %esi
109f3e: 5f pop %edi
109f3f: c9 leave
109f40: c3 ret
109f41: 8d 76 00 lea 0x0(%esi),%esi
/*
* Check to see if we were passed a valid pointer.
*/
if ( !buf )
rtems_set_errno_and_return_minus_one( EFAULT );
109f44: e8 c3 b5 00 00 call 11550c <__errno>
109f49: c7 00 0e 00 00 00 movl $0xe,(%eax)
109f4f: b8 ff ff ff ff mov $0xffffffff,%eax
status = (*loc.handlers->fstat_h)( &loc, buf );
rtems_filesystem_freenode( &loc );
return status;
}
109f54: 8d 65 f4 lea -0xc(%ebp),%esp
109f57: 5b pop %ebx
109f58: 5e pop %esi
109f59: 5f pop %edi
109f5a: c9 leave
109f5b: c3 ret
00108388 <malloc>:
#include "malloc_p.h"
void *malloc(
size_t size
)
{
108388: 55 push %ebp
108389: 89 e5 mov %esp,%ebp
10838b: 56 push %esi
10838c: 53 push %ebx
10838d: 8b 75 08 mov 0x8(%ebp),%esi
void *return_this;
MSBUMP(malloc_calls, 1);
108390: ff 05 e4 7c 12 00 incl 0x127ce4
/*
* If some free's have been deferred, then do them now.
*/
malloc_deferred_frees_process();
108396: e8 fd fe ff ff call 108298 <malloc_deferred_frees_process>
/*
* Validate the parameters
*/
if ( !size )
10839b: 85 f6 test %esi,%esi
10839d: 74 5d je 1083fc <malloc+0x74>
return (void *) 0;
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
10839f: 83 3d 00 80 12 00 03 cmpl $0x3,0x128000
1083a6: 74 48 je 1083f0 <malloc+0x68>
RTEMS_INLINE_ROUTINE void *_Protected_heap_Allocate(
Heap_Control *heap,
uintptr_t size
)
{
return _Protected_heap_Allocate_aligned_with_boundary( heap, size, 0, 0 );
1083a8: 6a 00 push $0x0
1083aa: 6a 00 push $0x0
1083ac: 56 push %esi
1083ad: ff 35 38 3a 12 00 pushl 0x123a38
1083b3: e8 50 4d 00 00 call 10d108 <_Protected_heap_Allocate_aligned_with_boundary>
1083b8: 89 c3 mov %eax,%ebx
* If this fails then return a NULL pointer.
*/
return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size );
if ( !return_this ) {
1083ba: 83 c4 10 add $0x10,%esp
1083bd: 85 c0 test %eax,%eax
1083bf: 74 47 je 108408 <malloc+0x80>
}
/*
* If the user wants us to dirty the allocated memory, then do it.
*/
if ( rtems_malloc_dirty_helper )
1083c1: a1 90 60 12 00 mov 0x126090,%eax
1083c6: 85 c0 test %eax,%eax
1083c8: 74 0a je 1083d4 <malloc+0x4c>
(*rtems_malloc_dirty_helper)( return_this, size );
1083ca: 83 ec 08 sub $0x8,%esp
1083cd: 56 push %esi
1083ce: 53 push %ebx
1083cf: ff d0 call *%eax
1083d1: 83 c4 10 add $0x10,%esp
/*
* If configured, update the statistics
*/
if ( rtems_malloc_statistics_helpers )
1083d4: a1 88 60 12 00 mov 0x126088,%eax
1083d9: 85 c0 test %eax,%eax
1083db: 74 0a je 1083e7 <malloc+0x5f>
(*rtems_malloc_statistics_helpers->at_malloc)(return_this);
1083dd: 83 ec 0c sub $0xc,%esp
1083e0: 53 push %ebx
1083e1: ff 50 04 call *0x4(%eax)
1083e4: 83 c4 10 add $0x10,%esp
return return_this;
}
1083e7: 89 d8 mov %ebx,%eax
1083e9: 8d 65 f8 lea -0x8(%ebp),%esp
1083ec: 5b pop %ebx
1083ed: 5e pop %esi
1083ee: c9 leave
1083ef: c3 ret
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
!malloc_is_system_state_OK() )
1083f0: e8 63 fe ff ff call 108258 <malloc_is_system_state_OK>
return (void *) 0;
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
1083f5: 84 c0 test %al,%al
1083f7: 75 af jne 1083a8 <malloc+0x20> <== ALWAYS TAKEN
1083f9: 8d 76 00 lea 0x0(%esi),%esi
!malloc_is_system_state_OK() )
return NULL;
1083fc: 31 db xor %ebx,%ebx
*/
if ( rtems_malloc_statistics_helpers )
(*rtems_malloc_statistics_helpers->at_malloc)(return_this);
return return_this;
}
1083fe: 89 d8 mov %ebx,%eax
108400: 8d 65 f8 lea -0x8(%ebp),%esp
108403: 5b pop %ebx
108404: 5e pop %esi
108405: c9 leave
108406: c3 ret
108407: 90 nop
*/
return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size );
if ( !return_this ) {
if (rtems_malloc_sbrk_helpers)
108408: a1 8c 60 12 00 mov 0x12608c,%eax
10840d: 85 c0 test %eax,%eax
10840f: 74 12 je 108423 <malloc+0x9b>
return_this = (*rtems_malloc_sbrk_helpers->extend)( size );
108411: 83 ec 0c sub $0xc,%esp
108414: 56 push %esi
108415: ff 50 04 call *0x4(%eax)
if ( !return_this ) {
108418: 83 c4 10 add $0x10,%esp
10841b: 85 c0 test %eax,%eax
10841d: 74 04 je 108423 <malloc+0x9b>
10841f: 89 c3 mov %eax,%ebx
108421: eb 9e jmp 1083c1 <malloc+0x39>
errno = ENOMEM;
108423: e8 ec ae 00 00 call 113314 <__errno>
108428: c7 00 0c 00 00 00 movl $0xc,(%eax)
return (void *) 0;
10842e: eb b7 jmp 1083e7 <malloc+0x5f>
0010830c <malloc_get_statistics>:
#include "malloc_p.h"
int malloc_get_statistics(
rtems_malloc_statistics_t *stats
)
{
10830c: 55 push %ebp
10830d: 89 e5 mov %esp,%ebp
10830f: 57 push %edi
108310: 56 push %esi
108311: 53 push %ebx
108312: 83 ec 0c sub $0xc,%esp
108315: 8b 5d 08 mov 0x8(%ebp),%ebx
if ( !stats )
108318: 85 db test %ebx,%ebx
10831a: 74 38 je 108354 <malloc_get_statistics+0x48>
return -1;
_RTEMS_Lock_allocator();
10831c: 83 ec 0c sub $0xc,%esp
10831f: ff 35 dc 7e 12 00 pushl 0x127edc
108325: e8 7a 3c 00 00 call 10bfa4 <_API_Mutex_Lock>
*stats = rtems_malloc_statistics;
10832a: be a0 7c 12 00 mov $0x127ca0,%esi
10832f: b9 0b 00 00 00 mov $0xb,%ecx
108334: 89 df mov %ebx,%edi
108336: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
_RTEMS_Unlock_allocator();
108338: 58 pop %eax
108339: ff 35 dc 7e 12 00 pushl 0x127edc
10833f: e8 a8 3c 00 00 call 10bfec <_API_Mutex_Unlock>
return 0;
108344: 83 c4 10 add $0x10,%esp
108347: 31 c0 xor %eax,%eax
}
108349: 8d 65 f4 lea -0xc(%ebp),%esp
10834c: 5b pop %ebx
10834d: 5e pop %esi
10834e: 5f pop %edi
10834f: c9 leave
108350: c3 ret
108351: 8d 76 00 lea 0x0(%esi),%esi
int malloc_get_statistics(
rtems_malloc_statistics_t *stats
)
{
if ( !stats )
return -1;
108354: b8 ff ff ff ff mov $0xffffffff,%eax
_RTEMS_Lock_allocator();
*stats = rtems_malloc_statistics;
_RTEMS_Unlock_allocator();
return 0;
}
108359: 8d 65 f4 lea -0xc(%ebp),%esp
10835c: 5b pop %ebx
10835d: 5e pop %esi
10835e: 5f pop %edi
10835f: c9 leave
108360: c3 ret
0010872c <malloc_sbrk_extend_and_allocate>:
}
void *malloc_sbrk_extend_and_allocate(
size_t size
)
{
10872c: 55 push %ebp
10872d: 89 e5 mov %esp,%ebp
10872f: 56 push %esi
108730: 53 push %ebx
108731: 8b 75 08 mov 0x8(%ebp),%esi
* Round to the "requested sbrk amount" so hopefully we won't have
* to grow again for a while. This effectively does sbrk() calls
* in "page" amounts.
*/
sbrk_amount = RTEMS_Malloc_Sbrk_amount;
108734: 8b 0d 8c 75 12 00 mov 0x12758c,%ecx
if ( sbrk_amount == 0 )
10873a: 85 c9 test %ecx,%ecx
10873c: 75 0a jne 108748 <malloc_sbrk_extend_and_allocate+0x1c><== ALWAYS TAKEN
the_size = ((size + sbrk_amount) / sbrk_amount * sbrk_amount);
starting_address = (void *) sbrk(the_size);
if ( starting_address == (void*) -1 )
return (void *) 0;
10873e: 31 c0 xor %eax,%eax
MSBUMP(space_available, the_size);
return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size );
return return_this;
}
108740: 8d 65 f8 lea -0x8(%ebp),%esp
108743: 5b pop %ebx
108744: 5e pop %esi
108745: c9 leave
108746: c3 ret
108747: 90 nop
sbrk_amount = RTEMS_Malloc_Sbrk_amount;
if ( sbrk_amount == 0 )
return (void *) 0;
the_size = ((size + sbrk_amount) / sbrk_amount * sbrk_amount);
108748: 8d 04 0e lea (%esi,%ecx,1),%eax
10874b: 31 d2 xor %edx,%edx
10874d: f7 f1 div %ecx
10874f: 89 c3 mov %eax,%ebx
108751: 0f af d9 imul %ecx,%ebx
starting_address = (void *) sbrk(the_size);
108754: 83 ec 0c sub $0xc,%esp
108757: 53 push %ebx
108758: e8 ff 7c ff ff call 10045c <sbrk>
if ( starting_address == (void*) -1 )
10875d: 83 c4 10 add $0x10,%esp
108760: 83 f8 ff cmp $0xffffffff,%eax
108763: 74 d9 je 10873e <malloc_sbrk_extend_and_allocate+0x12>
return (void *) 0;
if ( !_Protected_heap_Extend(
108765: 52 push %edx
108766: 53 push %ebx
108767: 50 push %eax
108768: ff 35 58 31 12 00 pushl 0x123158
10876e: e8 59 4d 00 00 call 10d4cc <_Protected_heap_Extend>
108773: 83 c4 10 add $0x10,%esp
108776: 84 c0 test %al,%al
108778: 74 1b je 108795 <malloc_sbrk_extend_and_allocate+0x69>
sbrk(-the_size);
errno = ENOMEM;
return (void *) 0;
}
MSBUMP(space_available, the_size);
10877a: 01 1d 60 75 12 00 add %ebx,0x127560
108780: 6a 00 push $0x0
108782: 6a 00 push $0x0
108784: 56 push %esi
108785: ff 35 58 31 12 00 pushl 0x123158
10878b: e8 04 4d 00 00 call 10d494 <_Protected_heap_Allocate_aligned_with_boundary>
return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size );
return return_this;
108790: 83 c4 10 add $0x10,%esp
108793: eb ab jmp 108740 <malloc_sbrk_extend_and_allocate+0x14>
if ( starting_address == (void*) -1 )
return (void *) 0;
if ( !_Protected_heap_Extend(
RTEMS_Malloc_Heap, starting_address, the_size) ) {
sbrk(-the_size);
108795: 83 ec 0c sub $0xc,%esp
108798: f7 db neg %ebx
10879a: 53 push %ebx
10879b: e8 bc 7c ff ff call 10045c <sbrk>
errno = ENOMEM;
1087a0: e8 f3 b1 00 00 call 113998 <__errno>
1087a5: c7 00 0c 00 00 00 movl $0xc,(%eax)
return (void *) 0;
1087ab: 83 c4 10 add $0x10,%esp
1087ae: 31 c0 xor %eax,%eax
1087b0: eb 8e jmp 108740 <malloc_sbrk_extend_and_allocate+0x14>
00111ec8 <memfile_free_blocks_in_table>:
*/
void memfile_free_blocks_in_table(
block_p **block_table,
int entries
)
{
111ec8: 55 push %ebp
111ec9: 89 e5 mov %esp,%ebp
111ecb: 57 push %edi
111ecc: 56 push %esi
111ecd: 53 push %ebx
111ece: 83 ec 0c sub $0xc,%esp
111ed1: 8b 7d 0c mov 0xc(%ebp),%edi
IMFS_assert( block_table );
/*
* Now go through all the slots in the table and free the memory.
*/
b = *block_table;
111ed4: 8b 45 08 mov 0x8(%ebp),%eax
111ed7: 8b 30 mov (%eax),%esi
for ( i=0 ; i<entries ; i++ ) {
111ed9: 85 ff test %edi,%edi
111edb: 7e 27 jle 111f04 <memfile_free_blocks_in_table+0x3c><== NEVER TAKEN
111edd: 31 db xor %ebx,%ebx
111edf: 90 nop
if ( b[i] ) {
111ee0: 8b 04 9e mov (%esi,%ebx,4),%eax
111ee3: 85 c0 test %eax,%eax
111ee5: 74 13 je 111efa <memfile_free_blocks_in_table+0x32>
memfile_free_block( b[i] );
111ee7: 83 ec 0c sub $0xc,%esp
111eea: 50 push %eax
111eeb: e8 bc ff ff ff call 111eac <memfile_free_block>
b[i] = 0;
111ef0: c7 04 9e 00 00 00 00 movl $0x0,(%esi,%ebx,4)
111ef7: 83 c4 10 add $0x10,%esp
/*
* Now go through all the slots in the table and free the memory.
*/
b = *block_table;
for ( i=0 ; i<entries ; i++ ) {
111efa: 43 inc %ebx
111efb: 39 df cmp %ebx,%edi
111efd: 7f e1 jg 111ee0 <memfile_free_blocks_in_table+0x18>
111eff: 8b 45 08 mov 0x8(%ebp),%eax
111f02: 8b 30 mov (%eax),%esi
/*
* Now that all the blocks in the block table are free, we can
* free the block table itself.
*/
memfile_free_block( *block_table );
111f04: 83 ec 0c sub $0xc,%esp
111f07: 56 push %esi
111f08: e8 9f ff ff ff call 111eac <memfile_free_block>
*block_table = 0;
111f0d: 8b 45 08 mov 0x8(%ebp),%eax
111f10: c7 00 00 00 00 00 movl $0x0,(%eax)
111f16: 83 c4 10 add $0x10,%esp
}
111f19: 8d 65 f4 lea -0xc(%ebp),%esp
111f1c: 5b pop %ebx
111f1d: 5e pop %esi
111f1e: 5f pop %edi
111f1f: c9 leave
111f20: c3 ret
00112444 <memfile_ftruncate>:
*/
int memfile_ftruncate(
rtems_libio_t *iop,
rtems_off64_t length
)
{
112444: 55 push %ebp
112445: 89 e5 mov %esp,%ebp
112447: 53 push %ebx
112448: 83 ec 14 sub $0x14,%esp
11244b: 8b 4d 08 mov 0x8(%ebp),%ecx
11244e: 8b 45 0c mov 0xc(%ebp),%eax
112451: 8b 55 10 mov 0x10(%ebp),%edx
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
112454: 8b 59 18 mov 0x18(%ecx),%ebx
* POSIX 1003.1b does not specify what happens if you truncate a file
* and the new length is greater than the current size. We treat this
* as an extend operation.
*/
if ( length > the_jnode->info.file.size )
112457: 39 53 54 cmp %edx,0x54(%ebx)
11245a: 7f 19 jg 112475 <memfile_ftruncate+0x31><== NEVER TAKEN
11245c: 7d 12 jge 112470 <memfile_ftruncate+0x2c><== ALWAYS TAKEN
return IMFS_memfile_extend( the_jnode, length );
11245e: 51 push %ecx
11245f: 52 push %edx
112460: 50 push %eax
112461: 53 push %ebx
112462: e8 45 fc ff ff call 1120ac <IMFS_memfile_extend>
112467: 83 c4 10 add $0x10,%esp
iop->size = the_jnode->info.file.size;
IMFS_update_atime( the_jnode );
return 0;
}
11246a: 8b 5d fc mov -0x4(%ebp),%ebx
11246d: c9 leave
11246e: c3 ret
11246f: 90 nop
* POSIX 1003.1b does not specify what happens if you truncate a file
* and the new length is greater than the current size. We treat this
* as an extend operation.
*/
if ( length > the_jnode->info.file.size )
112470: 39 43 50 cmp %eax,0x50(%ebx)
112473: 72 e9 jb 11245e <memfile_ftruncate+0x1a>
/*
* The in-memory files do not currently reclaim memory until the file is
* deleted. So we leave the previously allocated blocks in place for
* future use and just set the length.
*/
the_jnode->info.file.size = length;
112475: 89 43 50 mov %eax,0x50(%ebx)
112478: 89 53 54 mov %edx,0x54(%ebx)
iop->size = the_jnode->info.file.size;
11247b: 89 41 04 mov %eax,0x4(%ecx)
11247e: 89 51 08 mov %edx,0x8(%ecx)
IMFS_update_atime( the_jnode );
112481: 83 ec 08 sub $0x8,%esp
112484: 6a 00 push $0x0
112486: 8d 45 f0 lea -0x10(%ebp),%eax
112489: 50 push %eax
11248a: e8 a1 5c ff ff call 108130 <gettimeofday>
11248f: 8b 45 f0 mov -0x10(%ebp),%eax
112492: 89 43 40 mov %eax,0x40(%ebx)
return 0;
112495: 83 c4 10 add $0x10,%esp
112498: 31 c0 xor %eax,%eax
}
11249a: 8b 5d fc mov -0x4(%ebp),%ebx
11249d: c9 leave
11249e: c3 ret
001124a0 <memfile_lseek>:
rtems_off64_t memfile_lseek(
rtems_libio_t *iop,
rtems_off64_t offset,
int whence
)
{
1124a0: 55 push %ebp
1124a1: 89 e5 mov %esp,%ebp
1124a3: 57 push %edi
1124a4: 56 push %esi
1124a5: 53 push %ebx
1124a6: 83 ec 0c sub $0xc,%esp
1124a9: 8b 5d 08 mov 0x8(%ebp),%ebx
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
1124ac: 8b 73 18 mov 0x18(%ebx),%esi
if (the_jnode->type == IMFS_LINEAR_FILE) {
1124af: 83 7e 4c 06 cmpl $0x6,0x4c(%esi)
1124b3: 74 2f je 1124e4 <memfile_lseek+0x44>
if (iop->offset > the_jnode->info.linearfile.size)
iop->offset = the_jnode->info.linearfile.size;
}
else { /* Must be a block file (IMFS_MEMORY_FILE). */
if (IMFS_memfile_extend( the_jnode, iop->offset ))
1124b5: 57 push %edi
1124b6: ff 73 10 pushl 0x10(%ebx)
1124b9: ff 73 0c pushl 0xc(%ebx)
1124bc: 56 push %esi
1124bd: e8 ea fb ff ff call 1120ac <IMFS_memfile_extend>
1124c2: 83 c4 10 add $0x10,%esp
1124c5: 85 c0 test %eax,%eax
1124c7: 75 45 jne 11250e <memfile_lseek+0x6e>
rtems_set_errno_and_return_minus_one( ENOSPC );
iop->size = the_jnode->info.file.size;
1124c9: 8b 46 50 mov 0x50(%esi),%eax
1124cc: 8b 56 54 mov 0x54(%esi),%edx
1124cf: 89 43 04 mov %eax,0x4(%ebx)
1124d2: 89 53 08 mov %edx,0x8(%ebx)
1124d5: 8b 43 0c mov 0xc(%ebx),%eax
1124d8: 8b 53 10 mov 0x10(%ebx),%edx
}
return iop->offset;
}
1124db: 8d 65 f4 lea -0xc(%ebp),%esp
1124de: 5b pop %ebx
1124df: 5e pop %esi
1124e0: 5f pop %edi
1124e1: c9 leave
1124e2: c3 ret
1124e3: 90 nop
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
if (the_jnode->type == IMFS_LINEAR_FILE) {
if (iop->offset > the_jnode->info.linearfile.size)
1124e4: 8b 43 0c mov 0xc(%ebx),%eax
1124e7: 8b 53 10 mov 0x10(%ebx),%edx
1124ea: 8b 7e 50 mov 0x50(%esi),%edi
1124ed: 8b 4e 54 mov 0x54(%esi),%ecx
1124f0: 39 ca cmp %ecx,%edx
1124f2: 7c e7 jl 1124db <memfile_lseek+0x3b> <== NEVER TAKEN
1124f4: 7e 12 jle 112508 <memfile_lseek+0x68> <== ALWAYS TAKEN
iop->offset = the_jnode->info.linearfile.size;
1124f6: 89 7b 0c mov %edi,0xc(%ebx) <== NOT EXECUTED
1124f9: 89 4b 10 mov %ecx,0x10(%ebx) <== NOT EXECUTED
1124fc: 89 f8 mov %edi,%eax <== NOT EXECUTED
1124fe: 89 ca mov %ecx,%edx <== NOT EXECUTED
rtems_set_errno_and_return_minus_one( ENOSPC );
iop->size = the_jnode->info.file.size;
}
return iop->offset;
}
112500: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
112503: 5b pop %ebx <== NOT EXECUTED
112504: 5e pop %esi <== NOT EXECUTED
112505: 5f pop %edi <== NOT EXECUTED
112506: c9 leave <== NOT EXECUTED
112507: c3 ret <== NOT EXECUTED
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
if (the_jnode->type == IMFS_LINEAR_FILE) {
if (iop->offset > the_jnode->info.linearfile.size)
112508: 39 f8 cmp %edi,%eax
11250a: 76 cf jbe 1124db <memfile_lseek+0x3b> <== ALWAYS TAKEN
11250c: eb e8 jmp 1124f6 <memfile_lseek+0x56> <== NOT EXECUTED
iop->offset = the_jnode->info.linearfile.size;
}
else { /* Must be a block file (IMFS_MEMORY_FILE). */
if (IMFS_memfile_extend( the_jnode, iop->offset ))
rtems_set_errno_and_return_minus_one( ENOSPC );
11250e: e8 01 0e 00 00 call 113314 <__errno>
112513: c7 00 1c 00 00 00 movl $0x1c,(%eax)
112519: b8 ff ff ff ff mov $0xffffffff,%eax
11251e: ba ff ff ff ff mov $0xffffffff,%edx
112523: eb b6 jmp 1124db <memfile_lseek+0x3b>
0011239c <memfile_open>:
rtems_libio_t *iop,
const char *pathname,
uint32_t flag,
uint32_t mode
)
{
11239c: 55 push %ebp
11239d: 89 e5 mov %esp,%ebp
11239f: 56 push %esi
1123a0: 53 push %ebx
1123a1: 8b 5d 08 mov 0x8(%ebp),%ebx
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
1123a4: 8b 73 18 mov 0x18(%ebx),%esi
/*
* Perform 'copy on write' for linear files
*/
if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND))
1123a7: 8b 43 14 mov 0x14(%ebx),%eax
1123aa: a9 04 02 00 00 test $0x204,%eax
1123af: 74 06 je 1123b7 <memfile_open+0x1b>
&& (the_jnode->type == IMFS_LINEAR_FILE)) {
1123b1: 83 7e 4c 06 cmpl $0x6,0x4c(%esi)
1123b5: 74 2d je 1123e4 <memfile_open+0x48> <== NEVER TAKEN
the_jnode->info.file.size = 0;
the_jnode->info.file.indirect = 0;
the_jnode->info.file.doubly_indirect = 0;
the_jnode->info.file.triply_indirect = 0;
if ((count != 0)
&& (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1))
1123b7: 8b 56 50 mov 0x50(%esi),%edx
1123ba: 8b 4e 54 mov 0x54(%esi),%ecx
return -1;
}
if (iop->flags & LIBIO_FLAGS_APPEND)
1123bd: f6 c4 02 test $0x2,%ah
1123c0: 75 12 jne 1123d4 <memfile_open+0x38>
iop->offset = the_jnode->info.file.size;
iop->size = the_jnode->info.file.size;
1123c2: 89 53 04 mov %edx,0x4(%ebx)
1123c5: 89 4b 08 mov %ecx,0x8(%ebx)
return 0;
1123c8: 31 c0 xor %eax,%eax
}
1123ca: 8d 65 f8 lea -0x8(%ebp),%esp
1123cd: 5b pop %ebx
1123ce: 5e pop %esi
1123cf: c9 leave
1123d0: c3 ret
1123d1: 8d 76 00 lea 0x0(%esi),%esi
if ((count != 0)
&& (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1))
return -1;
}
if (iop->flags & LIBIO_FLAGS_APPEND)
iop->offset = the_jnode->info.file.size;
1123d4: 89 53 0c mov %edx,0xc(%ebx)
1123d7: 89 4b 10 mov %ecx,0x10(%ebx)
1123da: 8b 56 50 mov 0x50(%esi),%edx
1123dd: 8b 4e 54 mov 0x54(%esi),%ecx
1123e0: eb e0 jmp 1123c2 <memfile_open+0x26>
1123e2: 66 90 xchg %ax,%ax
/*
* Perform 'copy on write' for linear files
*/
if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND))
&& (the_jnode->type == IMFS_LINEAR_FILE)) {
uint32_t count = the_jnode->info.linearfile.size;
1123e4: 8b 46 50 mov 0x50(%esi),%eax <== NOT EXECUTED
const unsigned char *buffer = the_jnode->info.linearfile.direct;
1123e7: 8b 56 58 mov 0x58(%esi),%edx <== NOT EXECUTED
the_jnode->type = IMFS_MEMORY_FILE;
1123ea: c7 46 4c 05 00 00 00 movl $0x5,0x4c(%esi) <== NOT EXECUTED
the_jnode->info.file.size = 0;
1123f1: c7 46 50 00 00 00 00 movl $0x0,0x50(%esi) <== NOT EXECUTED
1123f8: c7 46 54 00 00 00 00 movl $0x0,0x54(%esi) <== NOT EXECUTED
the_jnode->info.file.indirect = 0;
1123ff: c7 46 58 00 00 00 00 movl $0x0,0x58(%esi) <== NOT EXECUTED
the_jnode->info.file.doubly_indirect = 0;
112406: c7 46 5c 00 00 00 00 movl $0x0,0x5c(%esi) <== NOT EXECUTED
the_jnode->info.file.triply_indirect = 0;
11240d: c7 46 60 00 00 00 00 movl $0x0,0x60(%esi) <== NOT EXECUTED
if ((count != 0)
112414: 85 c0 test %eax,%eax <== NOT EXECUTED
112416: 75 09 jne 112421 <memfile_open+0x85> <== NOT EXECUTED
112418: 8b 43 14 mov 0x14(%ebx),%eax <== NOT EXECUTED
11241b: 31 d2 xor %edx,%edx <== NOT EXECUTED
11241d: 31 c9 xor %ecx,%ecx <== NOT EXECUTED
11241f: eb 9c jmp 1123bd <memfile_open+0x21> <== NOT EXECUTED
&& (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1))
112421: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
112424: 50 push %eax <== NOT EXECUTED
112425: 52 push %edx <== NOT EXECUTED
112426: 6a 00 push $0x0 <== NOT EXECUTED
112428: 6a 00 push $0x0 <== NOT EXECUTED
11242a: 56 push %esi <== NOT EXECUTED
11242b: e8 94 fd ff ff call 1121c4 <IMFS_memfile_write> <== NOT EXECUTED
112430: 83 c4 20 add $0x20,%esp <== NOT EXECUTED
112433: 40 inc %eax <== NOT EXECUTED
112434: 74 08 je 11243e <memfile_open+0xa2> <== NOT EXECUTED
112436: 8b 43 14 mov 0x14(%ebx),%eax <== NOT EXECUTED
112439: e9 79 ff ff ff jmp 1123b7 <memfile_open+0x1b> <== NOT EXECUTED
return -1;
11243e: 83 c8 ff or $0xffffffff,%eax <== NOT EXECUTED
112441: eb 87 jmp 1123ca <memfile_open+0x2e> <== NOT EXECUTED
0010844c <mknod>:
int mknod(
const char *pathname,
mode_t mode,
dev_t dev
)
{
10844c: 55 push %ebp
10844d: 89 e5 mov %esp,%ebp
10844f: 57 push %edi
108450: 56 push %esi
108451: 53 push %ebx
108452: 83 ec 3c sub $0x3c,%esp
108455: 8b 7d 08 mov 0x8(%ebp),%edi
108458: 8b 5d 0c mov 0xc(%ebp),%ebx
10845b: 8b 55 10 mov 0x10(%ebp),%edx
10845e: 8b 4d 14 mov 0x14(%ebp),%ecx
rtems_filesystem_location_info_t temp_loc;
int i;
const char *name_start;
int result;
if ( !(mode & (S_IFREG|S_IFCHR|S_IFBLK|S_IFIFO) ) )
108461: f6 c7 f0 test $0xf0,%bh
108464: 75 1a jne 108480 <mknod+0x34>
rtems_set_errno_and_return_minus_one( EINVAL );
108466: e8 a9 ae 00 00 call 113314 <__errno>
10846b: c7 00 16 00 00 00 movl $0x16,(%eax)
108471: b8 ff ff ff ff mov $0xffffffff,%eax
result = (*temp_loc.ops->mknod_h)( name_start, mode, dev, &temp_loc );
rtems_filesystem_freenode( &temp_loc );
return result;
}
108476: 8d 65 f4 lea -0xc(%ebp),%esp
108479: 5b pop %ebx
10847a: 5e pop %esi
10847b: 5f pop %edi
10847c: c9 leave
10847d: c3 ret
10847e: 66 90 xchg %ax,%ax
int result;
if ( !(mode & (S_IFREG|S_IFCHR|S_IFBLK|S_IFIFO) ) )
rtems_set_errno_and_return_minus_one( EINVAL );
rtems_filesystem_get_start_loc( pathname, &i, &temp_loc );
108480: 50 push %eax
108481: 8d 75 cc lea -0x34(%ebp),%esi
108484: 56 push %esi
108485: 8d 45 e4 lea -0x1c(%ebp),%eax
108488: 50 push %eax
108489: 57 push %edi
10848a: 89 55 c4 mov %edx,-0x3c(%ebp)
10848d: 89 4d c0 mov %ecx,-0x40(%ebp)
108490: e8 1f 0a 00 00 call 108eb4 <rtems_filesystem_get_start_loc>
result = (*temp_loc.ops->evalformake_h)(
108495: 83 c4 0c add $0xc,%esp
108498: 8d 45 e0 lea -0x20(%ebp),%eax
10849b: 50 push %eax
10849c: 56 push %esi
10849d: 03 7d e4 add -0x1c(%ebp),%edi
1084a0: 57 push %edi
1084a1: 8b 45 d8 mov -0x28(%ebp),%eax
1084a4: ff 50 04 call *0x4(%eax)
&pathname[i],
&temp_loc,
&name_start
);
if ( result != 0 )
1084a7: 83 c4 10 add $0x10,%esp
1084aa: 85 c0 test %eax,%eax
1084ac: 8b 55 c4 mov -0x3c(%ebp),%edx
1084af: 8b 4d c0 mov -0x40(%ebp),%ecx
1084b2: 74 10 je 1084c4 <mknod+0x78>
return -1;
1084b4: b8 ff ff ff ff mov $0xffffffff,%eax
result = (*temp_loc.ops->mknod_h)( name_start, mode, dev, &temp_loc );
rtems_filesystem_freenode( &temp_loc );
return result;
}
1084b9: 8d 65 f4 lea -0xc(%ebp),%esp
1084bc: 5b pop %ebx
1084bd: 5e pop %esi
1084be: 5f pop %edi
1084bf: c9 leave
1084c0: c3 ret
1084c1: 8d 76 00 lea 0x0(%esi),%esi
&name_start
);
if ( result != 0 )
return -1;
result = (*temp_loc.ops->mknod_h)( name_start, mode, dev, &temp_loc );
1084c4: 83 ec 0c sub $0xc,%esp
1084c7: 56 push %esi
1084c8: 51 push %ecx
1084c9: 52 push %edx
1084ca: 53 push %ebx
1084cb: ff 75 e0 pushl -0x20(%ebp)
1084ce: 8b 45 d8 mov -0x28(%ebp),%eax
1084d1: ff 50 14 call *0x14(%eax)
rtems_filesystem_freenode( &temp_loc );
1084d4: 83 c4 14 add $0x14,%esp
1084d7: 56 push %esi
1084d8: 89 45 c4 mov %eax,-0x3c(%ebp)
1084db: e8 c0 fb ff ff call 1080a0 <rtems_filesystem_freenode>
return result;
1084e0: 83 c4 10 add $0x10,%esp
1084e3: 8b 45 c4 mov -0x3c(%ebp),%eax
}
1084e6: 8d 65 f4 lea -0xc(%ebp),%esp
1084e9: 5b pop %ebx
1084ea: 5e pop %esi
1084eb: 5f pop %edi
1084ec: c9 leave
1084ed: c3 ret
00108574 <mount>:
const char *target,
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
108574: 55 push %ebp
108575: 89 e5 mov %esp,%ebp
108577: 57 push %edi
108578: 56 push %esi
108579: 53 push %ebx
10857a: 83 ec 4c sub $0x4c,%esp
10857d: 8b 75 10 mov 0x10(%ebp),%esi
/*
* Are the file system options valid?
*/
if ( options != RTEMS_FILESYSTEM_READ_ONLY &&
108580: 83 7d 14 01 cmpl $0x1,0x14(%ebp)
108584: 0f 87 36 02 00 00 ja 1087c0 <mount+0x24c>
rtems_set_errno_and_return_minus_one( EINVAL );
/*
* Get mount handler
*/
mount_h = rtems_filesystem_get_mount_handler( filesystemtype );
10858a: 83 ec 0c sub $0xc,%esp
10858d: 56 push %esi
10858e: e8 e9 7a 00 00 call 11007c <rtems_filesystem_get_mount_handler>
108593: 89 45 b8 mov %eax,-0x48(%ebp)
if ( !mount_h )
108596: 83 c4 10 add $0x10,%esp
108599: 85 c0 test %eax,%eax
10859b: 0f 84 1f 02 00 00 je 1087c0 <mount+0x24c>
{
rtems_filesystem_fsmount_me_t mount_h = NULL;
rtems_filesystem_location_info_t loc;
rtems_filesystem_mount_table_entry_t *mt_entry = NULL;
rtems_filesystem_location_info_t *loc_to_free = NULL;
bool has_target = target != NULL;
1085a1: 8b 45 0c mov 0xc(%ebp),%eax
1085a4: 85 c0 test %eax,%eax
const char *target_or_null,
const char *filesystemtype,
size_t *target_length_ptr
)
{
const char *target = target_or_null != NULL ? target_or_null : "/";
1085a6: 0f 95 45 b7 setne -0x49(%ebp)
1085aa: 0f 84 e8 01 00 00 je 108798 <mount+0x224>
* 4) The mount point exists with the proper permissions to allow mounting
* 5) The selected mount point already has a file system mounted to it
*
*/
int mount(
1085b0: 31 c0 xor %eax,%eax
1085b2: b9 ff ff ff ff mov $0xffffffff,%ecx
1085b7: 8b 7d 0c mov 0xc(%ebp),%edi
1085ba: f2 ae repnz scas %es:(%edi),%al
1085bc: f7 d1 not %ecx
1085be: 8d 41 ff lea -0x1(%ecx),%eax
1085c1: 89 45 ac mov %eax,-0x54(%ebp)
1085c4: 89 4d bc mov %ecx,-0x44(%ebp)
1085c7: 8b 55 0c mov 0xc(%ebp),%edx
1085ca: 89 55 b0 mov %edx,-0x50(%ebp)
const char *filesystemtype,
size_t *target_length_ptr
)
{
const char *target = target_or_null != NULL ? target_or_null : "/";
size_t filesystemtype_size = strlen( filesystemtype ) + 1;
1085cd: ba ff ff ff ff mov $0xffffffff,%edx
1085d2: 31 c0 xor %eax,%eax
1085d4: 89 d1 mov %edx,%ecx
1085d6: 89 f7 mov %esi,%edi
1085d8: f2 ae repnz scas %es:(%edi),%al
1085da: f7 d1 not %ecx
1085dc: 89 4d c4 mov %ecx,-0x3c(%ebp)
size_t source_size = source_or_null != NULL ?
strlen( source_or_null ) + 1 : 0;
1085df: 8b 7d 08 mov 0x8(%ebp),%edi
1085e2: 85 ff test %edi,%edi
1085e4: 0f 84 ca 01 00 00 je 1087b4 <mount+0x240>
1085ea: 89 d1 mov %edx,%ecx
1085ec: 8b 7d 08 mov 0x8(%ebp),%edi
1085ef: f2 ae repnz scas %es:(%edi),%al
1085f1: f7 d1 not %ecx
1085f3: 89 4d c0 mov %ecx,-0x40(%ebp)
size_t target_size = strlen( target ) + 1;
size_t size = sizeof( rtems_filesystem_mount_table_entry_t )
+ filesystemtype_size + source_size + target_size;
rtems_filesystem_mount_table_entry_t *mt_entry = calloc( 1, size );
1085f6: 83 ec 08 sub $0x8,%esp
size_t filesystemtype_size = strlen( filesystemtype ) + 1;
size_t source_size = source_or_null != NULL ?
strlen( source_or_null ) + 1 : 0;
size_t target_size = strlen( target ) + 1;
size_t size = sizeof( rtems_filesystem_mount_table_entry_t )
+ filesystemtype_size + source_size + target_size;
1085f9: 8b 55 bc mov -0x44(%ebp),%edx
1085fc: 8b 7d c4 mov -0x3c(%ebp),%edi
1085ff: 8d 44 3a 74 lea 0x74(%edx,%edi,1),%eax
const char *target = target_or_null != NULL ? target_or_null : "/";
size_t filesystemtype_size = strlen( filesystemtype ) + 1;
size_t source_size = source_or_null != NULL ?
strlen( source_or_null ) + 1 : 0;
size_t target_size = strlen( target ) + 1;
size_t size = sizeof( rtems_filesystem_mount_table_entry_t )
108603: 03 45 c0 add -0x40(%ebp),%eax
+ filesystemtype_size + source_size + target_size;
rtems_filesystem_mount_table_entry_t *mt_entry = calloc( 1, size );
108606: 50 push %eax
108607: 6a 01 push $0x1
108609: e8 16 f9 ff ff call 107f24 <calloc>
10860e: 89 c3 mov %eax,%ebx
if ( mt_entry != NULL ) {
108610: 83 c4 10 add $0x10,%esp
108613: 85 c0 test %eax,%eax
108615: 0f 84 65 01 00 00 je 108780 <mount+0x20c> <== NEVER TAKEN
char *str = (char *) mt_entry + sizeof( *mt_entry );
10861b: 8d 40 74 lea 0x74(%eax),%eax
memcpy( str, filesystemtype, filesystemtype_size );
10861e: 89 c7 mov %eax,%edi
108620: 8b 4d c4 mov -0x3c(%ebp),%ecx
108623: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
108625: 89 fa mov %edi,%edx
mt_entry->type = str;
108627: 89 43 6c mov %eax,0x6c(%ebx)
str += filesystemtype_size;
memcpy( str, source_or_null, source_size );
10862a: 8b 75 08 mov 0x8(%ebp),%esi
10862d: 8b 4d c0 mov -0x40(%ebp),%ecx
108630: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
108632: 89 f8 mov %edi,%eax
mt_entry->dev = str;
108634: 89 53 70 mov %edx,0x70(%ebx)
str += source_size;
memcpy( str, target, target_size );
108637: 8b 75 b0 mov -0x50(%ebp),%esi
10863a: 8b 4d bc mov -0x44(%ebp),%ecx
10863d: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
mt_entry->target = str;
10863f: 89 43 68 mov %eax,0x68(%ebx)
&target_length
);
if ( !mt_entry )
rtems_set_errno_and_return_minus_one( ENOMEM );
mt_entry->mt_fs_root.mt_entry = mt_entry;
108642: 89 5b 2c mov %ebx,0x2c(%ebx)
mt_entry->options = options;
108645: 8b 45 14 mov 0x14(%ebp),%eax
108648: 89 43 30 mov %eax,0x30(%ebx)
mt_entry->pathconf_limits_and_options = rtems_filesystem_default_pathconf;
10864b: 8d 7b 38 lea 0x38(%ebx),%edi
10864e: be 20 14 12 00 mov $0x121420,%esi
108653: b1 0c mov $0xc,%cl
108655: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/*
* The mount_point should be a directory with read/write/execute
* permissions in the existing tree.
*/
if ( has_target ) {
108657: 80 7d b7 00 cmpb $0x0,-0x49(%ebp)
10865b: 0f 85 83 00 00 00 jne 1086e4 <mount+0x170>
}
} else {
/*
* Do we already have a base file system ?
*/
if ( !rtems_chain_is_empty( &mount_chain ) ) {
108661: 81 3d 04 59 12 00 08 cmpl $0x125908,0x125904
108668: 59 12 00
10866b: 0f 85 67 01 00 00 jne 1087d8 <mount+0x264> <== NEVER TAKEN
)
{
rtems_filesystem_fsmount_me_t mount_h = NULL;
rtems_filesystem_location_info_t loc;
rtems_filesystem_mount_table_entry_t *mt_entry = NULL;
rtems_filesystem_location_info_t *loc_to_free = NULL;
108671: 31 f6 xor %esi,%esi
* mt_point_node.node_access will be left to null to indicate that this
* is the root of the entire file system.
*/
}
if ( (*mount_h)( mt_entry, data ) ) {
108673: 83 ec 08 sub $0x8,%esp
108676: ff 75 18 pushl 0x18(%ebp)
108679: 53 push %ebx
10867a: ff 55 b8 call *-0x48(%ebp)
10867d: 83 c4 10 add $0x10,%esp
108680: 85 c0 test %eax,%eax
108682: 0f 85 74 01 00 00 jne 1087fc <mount+0x288>
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
108688: 56 push %esi
108689: 6a 00 push $0x0
10868b: 6a 00 push $0x0
10868d: ff 35 c8 7c 12 00 pushl 0x127cc8
108693: e8 18 30 00 00 call 10b6b0 <rtems_semaphore_obtain>
108698: 5a pop %edx
108699: 59 pop %ecx
10869a: 53 push %ebx
10869b: 68 04 59 12 00 push $0x125904
1086a0: e8 37 39 00 00 call 10bfdc <_Chain_Append>
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
1086a5: 58 pop %eax
1086a6: ff 35 c8 7c 12 00 pushl 0x127cc8
1086ac: e8 fb 30 00 00 call 10b7ac <rtems_semaphore_release>
*/
rtems_libio_lock();
rtems_chain_append( &mount_chain, &mt_entry->Node );
rtems_libio_unlock();
if ( !has_target )
1086b1: 83 c4 10 add $0x10,%esp
1086b4: 80 7d b7 00 cmpb $0x0,-0x49(%ebp)
1086b8: 74 0a je 1086c4 <mount+0x150>
rtems_filesystem_root = mt_entry->mt_fs_root;
return 0;
1086ba: 31 c0 xor %eax,%eax
if ( loc_to_free )
rtems_filesystem_freenode( loc_to_free );
return -1;
}
1086bc: 8d 65 f4 lea -0xc(%ebp),%esp
1086bf: 5b pop %ebx
1086c0: 5e pop %esi
1086c1: 5f pop %edi
1086c2: c9 leave
1086c3: c3 ret
rtems_libio_lock();
rtems_chain_append( &mount_chain, &mt_entry->Node );
rtems_libio_unlock();
if ( !has_target )
rtems_filesystem_root = mt_entry->mt_fs_root;
1086c4: 8b 3d 30 5a 12 00 mov 0x125a30,%edi
1086ca: 83 c7 18 add $0x18,%edi
1086cd: 8d 73 1c lea 0x1c(%ebx),%esi
1086d0: b9 05 00 00 00 mov $0x5,%ecx
1086d5: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return 0;
1086d7: 31 c0 xor %eax,%eax
if ( loc_to_free )
rtems_filesystem_freenode( loc_to_free );
return -1;
}
1086d9: 8d 65 f4 lea -0xc(%ebp),%esp
1086dc: 5b pop %ebx
1086dd: 5e pop %esi
1086de: 5f pop %edi
1086df: c9 leave
1086e0: c3 ret
1086e1: 8d 76 00 lea 0x0(%esi),%esi
* The mount_point should be a directory with read/write/execute
* permissions in the existing tree.
*/
if ( has_target ) {
if ( rtems_filesystem_evaluate_path(
1086e4: 83 ec 0c sub $0xc,%esp
1086e7: 6a 01 push $0x1
1086e9: 8d 75 d4 lea -0x2c(%ebp),%esi
1086ec: 56 push %esi
1086ed: 6a 07 push $0x7
1086ef: ff 75 ac pushl -0x54(%ebp)
1086f2: ff 75 0c pushl 0xc(%ebp)
1086f5: e8 ce f8 ff ff call 107fc8 <rtems_filesystem_evaluate_path>
1086fa: 83 c4 20 add $0x20,%esp
1086fd: 40 inc %eax
1086fe: 0f 84 df 00 00 00 je 1087e3 <mount+0x26f> <== NEVER TAKEN
/*
* Test to see if it is a directory
*/
if ( loc.ops->node_type_h( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
108704: 83 ec 0c sub $0xc,%esp
108707: 56 push %esi
108708: 8b 45 e0 mov -0x20(%ebp),%eax
10870b: ff 50 10 call *0x10(%eax)
10870e: 83 c4 10 add $0x10,%esp
108711: 48 dec %eax
108712: 0f 85 0c 01 00 00 jne 108824 <mount+0x2b0>
/*
* You can only mount one file system onto a single mount point.
*/
if ( rtems_filesystem_mount_iterate( is_node_fs_root, loc.node_access ) ) {
108718: 83 ec 08 sub $0x8,%esp
10871b: ff 75 d4 pushl -0x2c(%ebp)
10871e: 68 f0 84 10 00 push $0x1084f0
108723: e8 dc fd ff ff call 108504 <rtems_filesystem_mount_iterate>
108728: 83 c4 10 add $0x10,%esp
10872b: 84 c0 test %al,%al
10872d: 0f 85 01 01 00 00 jne 108834 <mount+0x2c0>
* may have been allocated in loc should not be sent to freenode
* until the system is unmounted. It may be needed to correctly
* traverse the tree.
*/
mt_entry->mt_point_node.node_access = loc.node_access;
108733: 8b 45 d4 mov -0x2c(%ebp),%eax
108736: 89 43 08 mov %eax,0x8(%ebx)
mt_entry->mt_point_node.handlers = loc.handlers;
108739: 8b 45 dc mov -0x24(%ebp),%eax
10873c: 89 43 10 mov %eax,0x10(%ebx)
mt_entry->mt_point_node.ops = loc.ops;
10873f: 8b 45 e0 mov -0x20(%ebp),%eax
108742: 89 43 14 mov %eax,0x14(%ebx)
mt_entry->mt_point_node.mt_entry = loc.mt_entry;
108745: 8b 55 e4 mov -0x1c(%ebp),%edx
108748: 89 53 18 mov %edx,0x18(%ebx)
/*
* This link to the parent is only done when we are dealing with system
* below the base file system
*/
if ( loc.ops->mount_h( mt_entry ) ) {
10874b: 83 ec 0c sub $0xc,%esp
10874e: 53 push %ebx
10874f: ff 50 20 call *0x20(%eax)
108752: 83 c4 10 add $0x10,%esp
108755: 85 c0 test %eax,%eax
108757: 0f 84 16 ff ff ff je 108673 <mount+0xff> <== ALWAYS TAKEN
return 0;
cleanup_and_bail:
free( mt_entry );
10875d: 83 ec 0c sub $0xc,%esp
108760: 53 push %ebx
108761: e8 4e f9 ff ff call 1080b4 <free>
108766: 83 c4 10 add $0x10,%esp
if ( loc_to_free )
rtems_filesystem_freenode( loc_to_free );
108769: 83 ec 0c sub $0xc,%esp
10876c: 56 push %esi
10876d: e8 2e f9 ff ff call 1080a0 <rtems_filesystem_freenode>
108772: 83 c4 10 add $0x10,%esp
return -1;
108775: b8 ff ff ff ff mov $0xffffffff,%eax
10877a: e9 3d ff ff ff jmp 1086bc <mount+0x148>
10877f: 90 nop
target,
filesystemtype,
&target_length
);
if ( !mt_entry )
rtems_set_errno_and_return_minus_one( ENOMEM );
108780: e8 8f ab 00 00 call 113314 <__errno> <== NOT EXECUTED
108785: c7 00 0c 00 00 00 movl $0xc,(%eax) <== NOT EXECUTED
10878b: b8 ff ff ff ff mov $0xffffffff,%eax <== NOT EXECUTED
if ( loc_to_free )
rtems_filesystem_freenode( loc_to_free );
return -1;
}
108790: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
108793: 5b pop %ebx <== NOT EXECUTED
108794: 5e pop %esi <== NOT EXECUTED
108795: 5f pop %edi <== NOT EXECUTED
108796: c9 leave <== NOT EXECUTED
108797: c3 ret <== NOT EXECUTED
const char *target_or_null,
const char *filesystemtype,
size_t *target_length_ptr
)
{
const char *target = target_or_null != NULL ? target_or_null : "/";
108798: c7 45 bc 02 00 00 00 movl $0x2,-0x44(%ebp)
10879f: c7 45 ac 01 00 00 00 movl $0x1,-0x54(%ebp)
1087a6: c7 45 b0 c7 13 12 00 movl $0x1213c7,-0x50(%ebp)
1087ad: e9 1b fe ff ff jmp 1085cd <mount+0x59>
1087b2: 66 90 xchg %ax,%ax
size_t filesystemtype_size = strlen( filesystemtype ) + 1;
size_t source_size = source_or_null != NULL ?
strlen( source_or_null ) + 1 : 0;
1087b4: c7 45 c0 00 00 00 00 movl $0x0,-0x40(%ebp)
1087bb: e9 36 fe ff ff jmp 1085f6 <mount+0x82>
/*
* Get mount handler
*/
mount_h = rtems_filesystem_get_mount_handler( filesystemtype );
if ( !mount_h )
rtems_set_errno_and_return_minus_one( EINVAL );
1087c0: e8 4f ab 00 00 call 113314 <__errno>
1087c5: c7 00 16 00 00 00 movl $0x16,(%eax)
1087cb: b8 ff ff ff ff mov $0xffffffff,%eax
if ( loc_to_free )
rtems_filesystem_freenode( loc_to_free );
return -1;
}
1087d0: 8d 65 f4 lea -0xc(%ebp),%esp
1087d3: 5b pop %ebx
1087d4: 5e pop %esi
1087d5: 5f pop %edi
1087d6: c9 leave
1087d7: c3 ret
} else {
/*
* Do we already have a base file system ?
*/
if ( !rtems_chain_is_empty( &mount_chain ) ) {
errno = EINVAL;
1087d8: e8 37 ab 00 00 call 113314 <__errno> <== NOT EXECUTED
1087dd: c7 00 16 00 00 00 movl $0x16,(%eax) <== NOT EXECUTED
return 0;
cleanup_and_bail:
free( mt_entry );
1087e3: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
1087e6: 53 push %ebx <== NOT EXECUTED
1087e7: e8 c8 f8 ff ff call 1080b4 <free> <== NOT EXECUTED
1087ec: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
if ( loc_to_free )
rtems_filesystem_freenode( loc_to_free );
return -1;
1087ef: b8 ff ff ff ff mov $0xffffffff,%eax <== NOT EXECUTED
1087f4: e9 c3 fe ff ff jmp 1086bc <mount+0x148> <== NOT EXECUTED
1087f9: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
if ( (*mount_h)( mt_entry, data ) ) {
/*
* Try to undo the mount operation
*/
loc.ops->unmount_h( mt_entry );
1087fc: 83 ec 0c sub $0xc,%esp
1087ff: 53 push %ebx
108800: 8b 45 e0 mov -0x20(%ebp),%eax
108803: ff 50 28 call *0x28(%eax)
return 0;
cleanup_and_bail:
free( mt_entry );
108806: 89 1c 24 mov %ebx,(%esp)
108809: e8 a6 f8 ff ff call 1080b4 <free>
if ( loc_to_free )
10880e: 83 c4 10 add $0x10,%esp
108811: 85 f6 test %esi,%esi
108813: 0f 85 50 ff ff ff jne 108769 <mount+0x1f5> <== ALWAYS TAKEN
rtems_filesystem_freenode( loc_to_free );
return -1;
108819: b8 ff ff ff ff mov $0xffffffff,%eax <== NOT EXECUTED
10881e: e9 99 fe ff ff jmp 1086bc <mount+0x148> <== NOT EXECUTED
108823: 90 nop <== NOT EXECUTED
/*
* Test to see if it is a directory
*/
if ( loc.ops->node_type_h( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
errno = ENOTDIR;
108824: e8 eb aa 00 00 call 113314 <__errno>
108829: c7 00 14 00 00 00 movl $0x14,(%eax)
goto cleanup_and_bail;
10882f: e9 29 ff ff ff jmp 10875d <mount+0x1e9>
/*
* You can only mount one file system onto a single mount point.
*/
if ( rtems_filesystem_mount_iterate( is_node_fs_root, loc.node_access ) ) {
errno = EBUSY;
108834: e8 db aa 00 00 call 113314 <__errno>
108839: c7 00 10 00 00 00 movl $0x10,(%eax)
goto cleanup_and_bail;
10883f: e9 19 ff ff ff jmp 10875d <mount+0x1e9>
00108b88 <mount_and_make_target_path>:
const char *target,
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
108b88: 55 push %ebp
108b89: 89 e5 mov %esp,%ebp
108b8b: 57 push %edi
108b8c: 56 push %esi
108b8d: 53 push %ebx
108b8e: 83 ec 1c sub $0x1c,%esp
108b91: 8b 45 08 mov 0x8(%ebp),%eax
108b94: 89 45 e4 mov %eax,-0x1c(%ebp)
108b97: 8b 5d 0c mov 0xc(%ebp),%ebx
108b9a: 8b 75 10 mov 0x10(%ebp),%esi
108b9d: 8b 7d 14 mov 0x14(%ebp),%edi
108ba0: 8b 45 18 mov 0x18(%ebp),%eax
108ba3: 89 45 e0 mov %eax,-0x20(%ebp)
int rv = -1;
if (target != NULL) {
108ba6: 85 db test %ebx,%ebx
108ba8: 74 3f je 108be9 <mount_and_make_target_path+0x61>
rv = rtems_mkdir(target, S_IRWXU | S_IRWXG | S_IRWXO);
108baa: 83 ec 08 sub $0x8,%esp
108bad: 68 ff 01 00 00 push $0x1ff
108bb2: 53 push %ebx
108bb3: e8 08 0a 00 00 call 1095c0 <rtems_mkdir>
if (rv == 0) {
108bb8: 83 c4 10 add $0x10,%esp
108bbb: 85 c0 test %eax,%eax
108bbd: 74 09 je 108bc8 <mount_and_make_target_path+0x40><== ALWAYS TAKEN
} else {
errno = EINVAL;
}
return rv;
}
108bbf: 8d 65 f4 lea -0xc(%ebp),%esp
108bc2: 5b pop %ebx
108bc3: 5e pop %esi
108bc4: 5f pop %edi
108bc5: c9 leave
108bc6: c3 ret
108bc7: 90 nop
int rv = -1;
if (target != NULL) {
rv = rtems_mkdir(target, S_IRWXU | S_IRWXG | S_IRWXO);
if (rv == 0) {
rv = mount(
108bc8: 8b 45 e0 mov -0x20(%ebp),%eax
108bcb: 89 45 18 mov %eax,0x18(%ebp)
108bce: 89 7d 14 mov %edi,0x14(%ebp)
108bd1: 89 75 10 mov %esi,0x10(%ebp)
108bd4: 89 5d 0c mov %ebx,0xc(%ebp)
108bd7: 8b 45 e4 mov -0x1c(%ebp),%eax
108bda: 89 45 08 mov %eax,0x8(%ebp)
} else {
errno = EINVAL;
}
return rv;
}
108bdd: 8d 65 f4 lea -0xc(%ebp),%esp
108be0: 5b pop %ebx
108be1: 5e pop %esi
108be2: 5f pop %edi
108be3: c9 leave
int rv = -1;
if (target != NULL) {
rv = rtems_mkdir(target, S_IRWXU | S_IRWXG | S_IRWXO);
if (rv == 0) {
rv = mount(
108be4: e9 97 00 00 00 jmp 108c80 <mount>
options,
data
);
}
} else {
errno = EINVAL;
108be9: e8 1a ae 00 00 call 113a08 <__errno>
108bee: c7 00 16 00 00 00 movl $0x16,(%eax)
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
int rv = -1;
108bf4: b8 ff ff ff ff mov $0xffffffff,%eax
108bf9: eb c4 jmp 108bbf <mount_and_make_target_path+0x37>
0010fb14 <mq_open>:
int oflag,
...
/* mode_t mode, */
/* struct mq_attr attr */
)
{
10fb14: 55 push %ebp
10fb15: 89 e5 mov %esp,%ebp
10fb17: 57 push %edi
10fb18: 56 push %esi
10fb19: 53 push %ebx
10fb1a: 83 ec 2c sub $0x2c,%esp
10fb1d: 8b 75 0c mov 0xc(%ebp),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10fb20: a1 50 0f 13 00 mov 0x130f50,%eax
10fb25: 40 inc %eax
10fb26: a3 50 0f 13 00 mov %eax,0x130f50
POSIX_Message_queue_Control_fd *the_mq_fd;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
10fb2b: 89 f0 mov %esi,%eax
10fb2d: 25 00 02 00 00 and $0x200,%eax
10fb32: 89 45 d4 mov %eax,-0x2c(%ebp)
10fb35: 0f 85 c9 00 00 00 jne 10fc04 <mq_open+0xf0>
/* struct mq_attr attr */
)
{
va_list arg;
mode_t mode;
struct mq_attr *attr = NULL;
10fb3b: c7 45 d0 00 00 00 00 movl $0x0,-0x30(%ebp)
RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *
_POSIX_Message_queue_Allocate_fd( void )
{
return (POSIX_Message_queue_Control_fd *)
_Objects_Allocate( &_POSIX_Message_queue_Information_fds );
10fb42: 83 ec 0c sub $0xc,%esp
10fb45: 68 c0 14 13 00 push $0x1314c0
10fb4a: e8 59 2c 00 00 call 1127a8 <_Objects_Allocate>
10fb4f: 89 c3 mov %eax,%ebx
attr = (struct mq_attr *) va_arg( arg, struct mq_attr * );
va_end(arg);
}
the_mq_fd = _POSIX_Message_queue_Allocate_fd();
if ( !the_mq_fd ) {
10fb51: 83 c4 10 add $0x10,%esp
10fb54: 85 c0 test %eax,%eax
10fb56: 0f 84 b4 00 00 00 je 10fc10 <mq_open+0xfc>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENFILE );
}
the_mq_fd->oflag = oflag;
10fb5c: 89 70 14 mov %esi,0x14(%eax)
status = _POSIX_Message_queue_Name_to_id( name, &the_mq_id );
10fb5f: 83 ec 08 sub $0x8,%esp
10fb62: 8d 45 e4 lea -0x1c(%ebp),%eax
10fb65: 50 push %eax
10fb66: ff 75 08 pushl 0x8(%ebp)
10fb69: e8 92 69 00 00 call 116500 <_POSIX_Message_queue_Name_to_id>
10fb6e: 89 c7 mov %eax,%edi
* If the name to id translation worked, then the message queue exists
* and we can just return a pointer to the id. Otherwise we may
* need to check to see if this is a "message queue does not exist"
* or some other miscellaneous error on the name.
*/
if ( status ) {
10fb70: 83 c4 10 add $0x10,%esp
10fb73: 85 c0 test %eax,%eax
10fb75: 75 59 jne 10fbd0 <mq_open+0xbc>
} else { /* name -> ID translation succeeded */
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
10fb77: 81 e6 00 0a 00 00 and $0xa00,%esi
10fb7d: 81 fe 00 0a 00 00 cmp $0xa00,%esi
10fb83: 0f 84 a7 00 00 00 je 10fc30 <mq_open+0x11c>
Objects_Id id,
Objects_Locations *location
)
{
return (POSIX_Message_queue_Control *)
_Objects_Get( &_POSIX_Message_queue_Information, id, location );
10fb89: 50 push %eax
/*
* In this case we need to do an ID->pointer conversion to
* check the mode.
*/
the_mq = _POSIX_Message_queue_Get( the_mq_id, &location );
10fb8a: 8d 45 dc lea -0x24(%ebp),%eax
10fb8d: 50 push %eax
10fb8e: ff 75 e4 pushl -0x1c(%ebp)
10fb91: 68 20 13 13 00 push $0x131320
10fb96: e8 c5 30 00 00 call 112c60 <_Objects_Get>
10fb9b: 89 45 e0 mov %eax,-0x20(%ebp)
the_mq->open_count += 1;
10fb9e: ff 40 18 incl 0x18(%eax)
the_mq_fd->Queue = the_mq;
10fba1: 89 43 10 mov %eax,0x10(%ebx)
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
10fba4: 0f b7 53 08 movzwl 0x8(%ebx),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10fba8: a1 dc 14 13 00 mov 0x1314dc,%eax
10fbad: 89 1c 90 mov %ebx,(%eax,%edx,4)
the_object
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
/* ASSERT: information->is_string */
the_object->name.name_p = name;
10fbb0: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
_Objects_Open_string(
&_POSIX_Message_queue_Information_fds,
&the_mq_fd->Object,
NULL
);
_Thread_Enable_dispatch();
10fbb7: e8 d8 3b 00 00 call 113794 <_Thread_Enable_dispatch>
_Thread_Enable_dispatch();
10fbbc: e8 d3 3b 00 00 call 113794 <_Thread_Enable_dispatch>
return (mqd_t)the_mq_fd->Object.id;
10fbc1: 8b 43 08 mov 0x8(%ebx),%eax
10fbc4: 83 c4 10 add $0x10,%esp
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
10fbc7: 8d 65 f4 lea -0xc(%ebp),%esp
10fbca: 5b pop %ebx
10fbcb: 5e pop %esi
10fbcc: 5f pop %edi
10fbcd: c9 leave
10fbce: c3 ret
10fbcf: 90 nop
if ( status ) {
/*
* Unless provided a valid name that did not already exist
* and we are willing to create then it is an error.
*/
if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
10fbd0: 83 f8 02 cmp $0x2,%eax
10fbd3: 0f 84 87 00 00 00 je 10fc60 <mq_open+0x14c>
RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free_fd (
POSIX_Message_queue_Control_fd *the_mq_fd
)
{
_Objects_Free( &_POSIX_Message_queue_Information_fds, &the_mq_fd->Object );
10fbd9: 83 ec 08 sub $0x8,%esp
10fbdc: 53 push %ebx
10fbdd: 68 c0 14 13 00 push $0x1314c0
10fbe2: e8 39 2f 00 00 call 112b20 <_Objects_Free>
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
10fbe7: e8 a8 3b 00 00 call 113794 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, mqd_t );
10fbec: e8 c7 9c 00 00 call 1198b8 <__errno>
10fbf1: 89 38 mov %edi,(%eax)
10fbf3: 83 c4 10 add $0x10,%esp
10fbf6: b8 ff ff ff ff mov $0xffffffff,%eax
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
10fbfb: 8d 65 f4 lea -0xc(%ebp),%esp
10fbfe: 5b pop %ebx
10fbff: 5e pop %esi
10fc00: 5f pop %edi
10fc01: c9 leave
10fc02: c3 ret
10fc03: 90 nop
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
va_start(arg, oflag);
mode = (mode_t) va_arg( arg, unsigned int );
attr = (struct mq_attr *) va_arg( arg, struct mq_attr * );
10fc04: 8b 45 14 mov 0x14(%ebp),%eax
10fc07: 89 45 d0 mov %eax,-0x30(%ebp)
10fc0a: e9 33 ff ff ff jmp 10fb42 <mq_open+0x2e>
10fc0f: 90 nop
va_end(arg);
}
the_mq_fd = _POSIX_Message_queue_Allocate_fd();
if ( !the_mq_fd ) {
_Thread_Enable_dispatch();
10fc10: e8 7f 3b 00 00 call 113794 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENFILE );
10fc15: e8 9e 9c 00 00 call 1198b8 <__errno>
10fc1a: c7 00 17 00 00 00 movl $0x17,(%eax)
10fc20: b8 ff ff ff ff mov $0xffffffff,%eax
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
10fc25: 8d 65 f4 lea -0xc(%ebp),%esp
10fc28: 5b pop %ebx
10fc29: 5e pop %esi
10fc2a: 5f pop %edi
10fc2b: c9 leave
10fc2c: c3 ret
10fc2d: 8d 76 00 lea 0x0(%esi),%esi
10fc30: 83 ec 08 sub $0x8,%esp
10fc33: 53 push %ebx
10fc34: 68 c0 14 13 00 push $0x1314c0
10fc39: e8 e2 2e 00 00 call 112b20 <_Objects_Free>
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
10fc3e: e8 51 3b 00 00 call 113794 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, mqd_t );
10fc43: e8 70 9c 00 00 call 1198b8 <__errno>
10fc48: c7 00 11 00 00 00 movl $0x11,(%eax)
10fc4e: 83 c4 10 add $0x10,%esp
10fc51: b8 ff ff ff ff mov $0xffffffff,%eax
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
10fc56: 8d 65 f4 lea -0xc(%ebp),%esp
10fc59: 5b pop %ebx
10fc5a: 5e pop %esi
10fc5b: 5f pop %edi
10fc5c: c9 leave
10fc5d: c3 ret
10fc5e: 66 90 xchg %ax,%ax
if ( status ) {
/*
* Unless provided a valid name that did not already exist
* and we are willing to create then it is an error.
*/
if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
10fc60: 8b 55 d4 mov -0x2c(%ebp),%edx
10fc63: 85 d2 test %edx,%edx
10fc65: 0f 84 6e ff ff ff je 10fbd9 <mq_open+0xc5>
/*
* At this point, the message queue does not exist and everything has been
* checked. We should go ahead and create a message queue.
*/
status = _POSIX_Message_queue_Create_support(
10fc6b: 8d 45 e0 lea -0x20(%ebp),%eax
10fc6e: 50 push %eax
10fc6f: ff 75 d0 pushl -0x30(%ebp)
10fc72: 6a 01 push $0x1
10fc74: ff 75 08 pushl 0x8(%ebp)
10fc77: e8 fc 66 00 00 call 116378 <_POSIX_Message_queue_Create_support>
);
/*
* errno was set by Create_support, so don't set it again.
*/
if ( status == -1 ) {
10fc7c: 83 c4 10 add $0x10,%esp
10fc7f: 40 inc %eax
10fc80: 74 26 je 10fca8 <mq_open+0x194>
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
return (mqd_t) -1;
}
the_mq_fd->Queue = the_mq;
10fc82: 8b 45 e0 mov -0x20(%ebp),%eax
10fc85: 89 43 10 mov %eax,0x10(%ebx)
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
10fc88: 0f b7 53 08 movzwl 0x8(%ebx),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10fc8c: a1 dc 14 13 00 mov 0x1314dc,%eax
10fc91: 89 1c 90 mov %ebx,(%eax,%edx,4)
the_object
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
/* ASSERT: information->is_string */
the_object->name.name_p = name;
10fc94: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
&_POSIX_Message_queue_Information_fds,
&the_mq_fd->Object,
NULL
);
_Thread_Enable_dispatch();
10fc9b: e8 f4 3a 00 00 call 113794 <_Thread_Enable_dispatch>
return (mqd_t) the_mq_fd->Object.id;
10fca0: 8b 43 08 mov 0x8(%ebx),%eax
10fca3: e9 1f ff ff ff jmp 10fbc7 <mq_open+0xb3>
10fca8: 83 ec 08 sub $0x8,%esp
10fcab: 53 push %ebx
10fcac: 68 c0 14 13 00 push $0x1314c0
10fcb1: e8 6a 2e 00 00 call 112b20 <_Objects_Free>
/*
* errno was set by Create_support, so don't set it again.
*/
if ( status == -1 ) {
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
10fcb6: e8 d9 3a 00 00 call 113794 <_Thread_Enable_dispatch>
return (mqd_t) -1;
10fcbb: 83 c4 10 add $0x10,%esp
10fcbe: b8 ff ff ff ff mov $0xffffffff,%eax
10fcc3: e9 ff fe ff ff jmp 10fbc7 <mq_open+0xb3>
001088a8 <newlib_create_hook>:
*/
bool newlib_create_hook(
rtems_tcb *current_task __attribute__((unused)),
rtems_tcb *creating_task
)
{
1088a8: 55 push %ebp
1088a9: 89 e5 mov %esp,%ebp
1088ab: 57 push %edi
1088ac: 56 push %esi
1088ad: 53 push %ebx
1088ae: 83 ec 0c sub $0xc,%esp
struct _reent *ptr;
if (_Thread_libc_reent == 0)
1088b1: a1 00 7f 12 00 mov 0x127f00,%eax
1088b6: 85 c0 test %eax,%eax
1088b8: 0f 84 52 02 00 00 je 108b10 <newlib_create_hook+0x268>
ptr = (struct _reent *) calloc(1, sizeof(struct _reent));
#else
/* It is OK to allocate from the workspace because these
* hooks run with thread dispatching disabled.
*/
ptr = (struct _reent *) _Workspace_Allocate(sizeof(struct _reent));
1088be: 83 ec 0c sub $0xc,%esp
1088c1: 68 24 04 00 00 push $0x424
1088c6: e8 95 60 00 00 call 10e960 <_Workspace_Allocate>
1088cb: 89 c2 mov %eax,%edx
#endif
if (ptr) {
1088cd: 83 c4 10 add $0x10,%esp
1088d0: 85 c0 test %eax,%eax
1088d2: 0f 84 2c 02 00 00 je 108b04 <newlib_create_hook+0x25c>
_REENT_INIT_PTR((ptr)); /* GCC extension: structure constants */
1088d8: c7 00 00 00 00 00 movl $0x0,(%eax)
1088de: 8d 98 ec 02 00 00 lea 0x2ec(%eax),%ebx
1088e4: 89 58 04 mov %ebx,0x4(%eax)
1088e7: 8d 80 54 03 00 00 lea 0x354(%eax),%eax
1088ed: 89 42 08 mov %eax,0x8(%edx)
1088f0: 8d 82 bc 03 00 00 lea 0x3bc(%edx),%eax
1088f6: 89 42 0c mov %eax,0xc(%edx)
1088f9: c7 42 10 00 00 00 00 movl $0x0,0x10(%edx)
108900: 8d 72 14 lea 0x14(%edx),%esi
108903: 31 c0 xor %eax,%eax
108905: b9 19 00 00 00 mov $0x19,%ecx
10890a: 89 f7 mov %esi,%edi
10890c: f3 aa rep stos %al,%es:(%edi)
10890e: c7 42 30 00 00 00 00 movl $0x0,0x30(%edx)
108915: c7 42 34 4a 11 12 00 movl $0x12114a,0x34(%edx)
10891c: c7 42 38 00 00 00 00 movl $0x0,0x38(%edx)
108923: c7 42 3c 00 00 00 00 movl $0x0,0x3c(%edx)
10892a: c7 42 40 00 00 00 00 movl $0x0,0x40(%edx)
108931: c7 42 44 00 00 00 00 movl $0x0,0x44(%edx)
108938: c7 42 48 00 00 00 00 movl $0x0,0x48(%edx)
10893f: c7 42 4c 00 00 00 00 movl $0x0,0x4c(%edx)
108946: c7 42 50 00 00 00 00 movl $0x0,0x50(%edx)
10894d: c7 42 54 00 00 00 00 movl $0x0,0x54(%edx)
108954: c7 42 58 00 00 00 00 movl $0x0,0x58(%edx)
10895b: c7 42 5c 00 00 00 00 movl $0x0,0x5c(%edx)
108962: c6 42 60 00 movb $0x0,0x60(%edx)
108966: 8d 72 7c lea 0x7c(%edx),%esi
108969: b1 24 mov $0x24,%cl
10896b: 89 f7 mov %esi,%edi
10896d: f3 aa rep stos %al,%es:(%edi)
10896f: c7 82 a0 00 00 00 00 movl $0x0,0xa0(%edx)
108976: 00 00 00
108979: c7 82 a4 00 00 00 01 movl $0x1,0xa4(%edx)
108980: 00 00 00
108983: c7 82 a8 00 00 00 00 movl $0x0,0xa8(%edx)
10898a: 00 00 00
10898d: 66 c7 82 ac 00 00 00 movw $0x330e,0xac(%edx)
108994: 0e 33
108996: 66 c7 82 ae 00 00 00 movw $0xabcd,0xae(%edx)
10899d: cd ab
10899f: 66 c7 82 b0 00 00 00 movw $0x1234,0xb0(%edx)
1089a6: 34 12
1089a8: 66 c7 82 b2 00 00 00 movw $0xe66d,0xb2(%edx)
1089af: 6d e6
1089b1: 66 c7 82 b4 00 00 00 movw $0xdeec,0xb4(%edx)
1089b8: ec de
1089ba: 66 c7 82 b6 00 00 00 movw $0x5,0xb6(%edx)
1089c1: 05 00
1089c3: 66 c7 82 b8 00 00 00 movw $0xb,0xb8(%edx)
1089ca: 0b 00
1089cc: c7 82 bc 00 00 00 00 movl $0x0,0xbc(%edx)
1089d3: 00 00 00
1089d6: c7 82 c0 00 00 00 00 movl $0x0,0xc0(%edx)
1089dd: 00 00 00
1089e0: c7 82 c4 00 00 00 00 movl $0x0,0xc4(%edx)
1089e7: 00 00 00
1089ea: c7 82 c8 00 00 00 00 movl $0x0,0xc8(%edx)
1089f1: 00 00 00
1089f4: c7 82 cc 00 00 00 00 movl $0x0,0xcc(%edx)
1089fb: 00 00 00
1089fe: c7 82 d0 00 00 00 00 movl $0x0,0xd0(%edx)
108a05: 00 00 00
108a08: c7 82 f8 00 00 00 00 movl $0x0,0xf8(%edx)
108a0f: 00 00 00
108a12: c7 82 fc 00 00 00 00 movl $0x0,0xfc(%edx)
108a19: 00 00 00
108a1c: c7 82 00 01 00 00 00 movl $0x0,0x100(%edx)
108a23: 00 00 00
108a26: c7 82 04 01 00 00 00 movl $0x0,0x104(%edx)
108a2d: 00 00 00
108a30: c7 82 08 01 00 00 00 movl $0x0,0x108(%edx)
108a37: 00 00 00
108a3a: c7 82 0c 01 00 00 00 movl $0x0,0x10c(%edx)
108a41: 00 00 00
108a44: c7 82 10 01 00 00 00 movl $0x0,0x110(%edx)
108a4b: 00 00 00
108a4e: c7 82 14 01 00 00 00 movl $0x0,0x114(%edx)
108a55: 00 00 00
108a58: c7 82 18 01 00 00 00 movl $0x0,0x118(%edx)
108a5f: 00 00 00
108a62: c7 82 1c 01 00 00 00 movl $0x0,0x11c(%edx)
108a69: 00 00 00
108a6c: c6 82 d4 00 00 00 00 movb $0x0,0xd4(%edx)
108a73: c6 82 dc 00 00 00 00 movb $0x0,0xdc(%edx)
108a7a: c7 82 f4 00 00 00 00 movl $0x0,0xf4(%edx)
108a81: 00 00 00
108a84: c7 82 48 01 00 00 00 movl $0x0,0x148(%edx)
108a8b: 00 00 00
108a8e: c7 82 4c 01 00 00 00 movl $0x0,0x14c(%edx)
108a95: 00 00 00
108a98: c7 82 50 01 00 00 00 movl $0x0,0x150(%edx)
108a9f: 00 00 00
108aa2: c7 82 54 01 00 00 00 movl $0x0,0x154(%edx)
108aa9: 00 00 00
108aac: c7 82 d4 02 00 00 00 movl $0x0,0x2d4(%edx)
108ab3: 00 00 00
108ab6: c7 82 d4 01 00 00 00 movl $0x0,0x1d4(%edx)
108abd: 00 00 00
108ac0: c7 82 dc 02 00 00 00 movl $0x0,0x2dc(%edx)
108ac7: 00 00 00
108aca: c7 82 e0 02 00 00 00 movl $0x0,0x2e0(%edx)
108ad1: 00 00 00
108ad4: c7 82 e4 02 00 00 00 movl $0x0,0x2e4(%edx)
108adb: 00 00 00
108ade: c7 82 e8 02 00 00 00 movl $0x0,0x2e8(%edx)
108ae5: 00 00 00
108ae8: 66 b9 38 01 mov $0x138,%cx
108aec: 89 df mov %ebx,%edi
108aee: f3 aa rep stos %al,%es:(%edi)
creating_task->libc_reent = ptr;
108af0: 8b 45 0c mov 0xc(%ebp),%eax
108af3: 89 90 e4 00 00 00 mov %edx,0xe4(%eax)
return TRUE;
108af9: b0 01 mov $0x1,%al
}
return FALSE;
}
108afb: 8d 65 f4 lea -0xc(%ebp),%esp
108afe: 5b pop %ebx
108aff: 5e pop %esi
108b00: 5f pop %edi
108b01: c9 leave
108b02: c3 ret
108b03: 90 nop
_REENT_INIT_PTR((ptr)); /* GCC extension: structure constants */
creating_task->libc_reent = ptr;
return TRUE;
}
return FALSE;
108b04: 31 c0 xor %eax,%eax
}
108b06: 8d 65 f4 lea -0xc(%ebp),%esp
108b09: 5b pop %ebx
108b0a: 5e pop %esi
108b0b: 5f pop %edi
108b0c: c9 leave
108b0d: c3 ret
108b0e: 66 90 xchg %ax,%ax
{
struct _reent *ptr;
if (_Thread_libc_reent == 0)
{
_REENT = _global_impure_ptr;
108b10: a1 a0 1f 12 00 mov 0x121fa0,%eax
108b15: a3 40 5b 12 00 mov %eax,0x125b40
RTEMS_INLINE_ROUTINE void _Thread_Set_libc_reent (
struct _reent **libc_reent
)
{
_Thread_libc_reent = libc_reent;
108b1a: c7 05 00 7f 12 00 40 movl $0x125b40,0x127f00
108b21: 5b 12 00
108b24: e9 95 fd ff ff jmp 1088be <newlib_create_hook+0x16>
00108b2c <newlib_delete_hook>:
void newlib_delete_hook(
rtems_tcb *current_task,
rtems_tcb *deleted_task
)
{
108b2c: 55 push %ebp
108b2d: 89 e5 mov %esp,%ebp
108b2f: 57 push %edi
108b30: 56 push %esi
108b31: 53 push %ebx
108b32: 83 ec 0c sub $0xc,%esp
108b35: 8b 7d 08 mov 0x8(%ebp),%edi
108b38: 8b 5d 0c mov 0xc(%ebp),%ebx
/*
* The reentrancy structure was allocated by newlib using malloc()
*/
if (current_task == deleted_task) {
108b3b: 39 df cmp %ebx,%edi
108b3d: 74 55 je 108b94 <newlib_delete_hook+0x68>
ptr = _REENT;
} else {
ptr = deleted_task->libc_reent;
108b3f: 8b b3 e4 00 00 00 mov 0xe4(%ebx),%esi
}
if (ptr && ptr != _global_impure_ptr) {
108b45: 85 f6 test %esi,%esi
108b47: 74 21 je 108b6a <newlib_delete_hook+0x3e><== NEVER TAKEN
108b49: 3b 35 a0 1f 12 00 cmp 0x121fa0,%esi
108b4f: 74 19 je 108b6a <newlib_delete_hook+0x3e>
_reclaim_reent(ptr);
*/
/*
* Just in case there are some buffers lying around.
*/
_fwalk(ptr, newlib_free_buffers);
108b51: 83 ec 08 sub $0x8,%esp
108b54: 68 4c 88 10 00 push $0x10884c
108b59: 56 push %esi
108b5a: e8 9d af 00 00 call 113afc <_fwalk>
#if REENT_MALLOCED
free(ptr);
#else
_Workspace_Free(ptr);
108b5f: 89 34 24 mov %esi,(%esp)
108b62: e8 15 5e 00 00 call 10e97c <_Workspace_Free>
108b67: 83 c4 10 add $0x10,%esp
#endif
}
deleted_task->libc_reent = NULL;
108b6a: c7 83 e4 00 00 00 00 movl $0x0,0xe4(%ebx)
108b71: 00 00 00
/*
* Require the switch back to another task to install its own
*/
if ( current_task == deleted_task ) {
108b74: 39 df cmp %ebx,%edi
108b76: 74 08 je 108b80 <newlib_delete_hook+0x54>
_REENT = 0;
}
}
108b78: 8d 65 f4 lea -0xc(%ebp),%esp
108b7b: 5b pop %ebx
108b7c: 5e pop %esi
108b7d: 5f pop %edi
108b7e: c9 leave
108b7f: c3 ret
/*
* Require the switch back to another task to install its own
*/
if ( current_task == deleted_task ) {
_REENT = 0;
108b80: c7 05 40 5b 12 00 00 movl $0x0,0x125b40
108b87: 00 00 00
}
}
108b8a: 8d 65 f4 lea -0xc(%ebp),%esp
108b8d: 5b pop %ebx
108b8e: 5e pop %esi
108b8f: 5f pop %edi
108b90: c9 leave
108b91: c3 ret
108b92: 66 90 xchg %ax,%ax
/*
* The reentrancy structure was allocated by newlib using malloc()
*/
if (current_task == deleted_task) {
ptr = _REENT;
108b94: 8b 35 40 5b 12 00 mov 0x125b40,%esi
108b9a: eb a9 jmp 108b45 <newlib_delete_hook+0x19>
0010884c <newlib_free_buffers>:
*/
int newlib_free_buffers(
FILE *fp
)
{
10884c: 55 push %ebp
10884d: 89 e5 mov %esp,%ebp
10884f: 53 push %ebx
108850: 83 ec 10 sub $0x10,%esp
108853: 8b 5d 08 mov 0x8(%ebp),%ebx
switch ( fileno(fp) ) {
108856: 53 push %ebx
108857: e8 8c ae 00 00 call 1136e8 <fileno>
10885c: 83 c4 10 add $0x10,%esp
10885f: 83 f8 02 cmp $0x2,%eax
108862: 76 14 jbe 108878 <newlib_free_buffers+0x2c><== ALWAYS TAKEN
fp->_flags &= ~__SMBF;
fp->_bf._base = fp->_p = (unsigned char *) NULL;
}
break;
default:
fclose(fp);
108864: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
108867: 53 push %ebx <== NOT EXECUTED
108868: e8 ff ab 00 00 call 11346c <fclose> <== NOT EXECUTED
10886d: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
return 0;
}
108870: 31 c0 xor %eax,%eax
108872: 8b 5d fc mov -0x4(%ebp),%ebx
108875: c9 leave
108876: c3 ret
108877: 90 nop
{
switch ( fileno(fp) ) {
case 0:
case 1:
case 2:
if (fp->_flags & __SMBF) {
108878: f6 43 0c 80 testb $0x80,0xc(%ebx)
10887c: 74 f2 je 108870 <newlib_free_buffers+0x24><== ALWAYS TAKEN
free( fp->_bf._base );
10887e: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
108881: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
108884: e8 2b f8 ff ff call 1080b4 <free> <== NOT EXECUTED
fp->_flags &= ~__SMBF;
108889: 66 81 63 0c 7f ff andw $0xff7f,0xc(%ebx) <== NOT EXECUTED
fp->_bf._base = fp->_p = (unsigned char *) NULL;
10888f: c7 03 00 00 00 00 movl $0x0,(%ebx) <== NOT EXECUTED
108895: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx) <== NOT EXECUTED
10889c: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
break;
default:
fclose(fp);
}
return 0;
}
10889f: 31 c0 xor %eax,%eax <== NOT EXECUTED
1088a1: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
1088a4: c9 leave <== NOT EXECUTED
1088a5: c3 ret <== NOT EXECUTED
00107cd4 <null_initialize>:
rtems_device_driver null_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor __attribute__((unused)),
void *pargp __attribute__((unused))
)
{
107cd4: 55 push %ebp
107cd5: 89 e5 mov %esp,%ebp
107cd7: 53 push %ebx
107cd8: 83 ec 04 sub $0x4,%esp
107cdb: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_device_driver status;
if ( !initialized ) {
107cde: 80 3d e0 59 12 00 00 cmpb $0x0,0x1259e0
107ce5: 74 09 je 107cf0 <null_initialize+0x1c>
NULL_major = major;
}
return RTEMS_SUCCESSFUL;
}
107ce7: 31 c0 xor %eax,%eax
107ce9: 8b 5d fc mov -0x4(%ebp),%ebx
107cec: c9 leave
107ced: c3 ret
107cee: 66 90 xchg %ax,%ax
)
{
rtems_device_driver status;
if ( !initialized ) {
initialized = 1;
107cf0: c6 05 e0 59 12 00 01 movb $0x1,0x1259e0
status = rtems_io_register_name(
107cf7: 50 push %eax
107cf8: 6a 00 push $0x0
107cfa: 53 push %ebx
107cfb: 68 5a da 11 00 push $0x11da5a
107d00: e8 7b 01 00 00 call 107e80 <rtems_io_register_name>
"/dev/null",
major,
(rtems_device_minor_number) 0
);
if (status != RTEMS_SUCCESSFUL)
107d05: 83 c4 10 add $0x10,%esp
107d08: 85 c0 test %eax,%eax
107d0a: 75 0d jne 107d19 <null_initialize+0x45>
rtems_fatal_error_occurred(status);
NULL_major = major;
107d0c: 89 1d 20 5d 12 00 mov %ebx,0x125d20
}
return RTEMS_SUCCESSFUL;
}
107d12: 31 c0 xor %eax,%eax
107d14: 8b 5d fc mov -0x4(%ebp),%ebx
107d17: c9 leave
107d18: c3 ret
major,
(rtems_device_minor_number) 0
);
if (status != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred(status);
107d19: 83 ec 0c sub $0xc,%esp
107d1c: 50 push %eax
107d1d: e8 ba 41 00 00 call 10bedc <rtems_fatal_error_occurred>
00108bfc <open>:
int open(
const char *pathname,
int flags,
...
)
{
108bfc: 55 push %ebp
108bfd: 89 e5 mov %esp,%ebp
108bff: 57 push %edi
108c00: 56 push %esi
108c01: 53 push %ebx
108c02: 83 ec 4c sub $0x4c,%esp
/*
* Set the Evaluation flags
*/
eval_flags = 0;
status = flags + 1;
108c05: 8b 45 0c mov 0xc(%ebp),%eax
108c08: 40 inc %eax
if ( ( status & _FREAD ) == _FREAD )
108c09: 89 c3 mov %eax,%ebx
108c0b: 83 e3 01 and $0x1,%ebx
eval_flags |= RTEMS_LIBIO_PERMS_READ;
108c0e: f7 db neg %ebx
108c10: 83 e3 04 and $0x4,%ebx
if ( ( status & _FWRITE ) == _FWRITE )
108c13: a8 02 test $0x2,%al
108c15: 74 03 je 108c1a <open+0x1e>
eval_flags |= RTEMS_LIBIO_PERMS_WRITE;
108c17: 83 cb 02 or $0x2,%ebx
va_start(ap, flags);
mode = va_arg( ap, int );
108c1a: 8b 45 10 mov 0x10(%ebp),%eax
108c1d: 89 45 c4 mov %eax,-0x3c(%ebp)
* code does not require changes here since network file
* descriptors are obtained using socket(), not open().
*/
/* allocate a file control block */
iop = rtems_libio_allocate();
108c20: e8 b3 71 00 00 call 10fdd8 <rtems_libio_allocate>
108c25: 89 c2 mov %eax,%edx
if ( iop == 0 ) {
108c27: 85 c0 test %eax,%eax
108c29: 0f 84 c5 00 00 00 je 108cf4 <open+0xf8>
}
/*
* See if the file exists.
*/
status = rtems_filesystem_evaluate_path(
108c2f: 31 f6 xor %esi,%esi
108c31: b9 ff ff ff ff mov $0xffffffff,%ecx
108c36: 8b 7d 08 mov 0x8(%ebp),%edi
108c39: 89 f0 mov %esi,%eax
108c3b: f2 ae repnz scas %es:(%edi),%al
108c3d: f7 d1 not %ecx
108c3f: 49 dec %ecx
108c40: 83 ec 0c sub $0xc,%esp
108c43: 6a 01 push $0x1
108c45: 8d 45 d4 lea -0x2c(%ebp),%eax
108c48: 89 45 b4 mov %eax,-0x4c(%ebp)
108c4b: 50 push %eax
108c4c: 53 push %ebx
108c4d: 51 push %ecx
108c4e: ff 75 08 pushl 0x8(%ebp)
108c51: 89 55 c0 mov %edx,-0x40(%ebp)
108c54: e8 6f f3 ff ff call 107fc8 <rtems_filesystem_evaluate_path>
108c59: 89 c3 mov %eax,%ebx
pathname, strlen( pathname ), eval_flags, &loc, true );
if ( status == -1 ) {
108c5b: 83 c4 20 add $0x20,%esp
108c5e: 83 f8 ff cmp $0xffffffff,%eax
108c61: 8b 55 c0 mov -0x40(%ebp),%edx
108c64: 0f 84 de 00 00 00 je 108d48 <open+0x14c>
if ( status != 0 ) { /* The file did not exist */
rc = EACCES;
goto done;
}
} else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) {
108c6a: 8b 45 0c mov 0xc(%ebp),%eax
108c6d: 25 00 0a 00 00 and $0xa00,%eax
108c72: 3d 00 0a 00 00 cmp $0xa00,%eax
108c77: 0f 84 8b 00 00 00 je 108d08 <open+0x10c>
/*
* Fill in the file control block based on the loc structure
* returned by successful path evaluation.
*/
iop->flags |= rtems_libio_fcntl_flags( flags );
108c7d: 8b 5a 14 mov 0x14(%edx),%ebx
108c80: 83 ec 0c sub $0xc,%esp
108c83: ff 75 0c pushl 0xc(%ebp)
108c86: 89 55 c0 mov %edx,-0x40(%ebp)
108c89: e8 ce 70 00 00 call 10fd5c <rtems_libio_fcntl_flags>
108c8e: 09 d8 or %ebx,%eax
108c90: 8b 55 c0 mov -0x40(%ebp),%edx
108c93: 89 42 14 mov %eax,0x14(%edx)
iop->pathinfo = loc;
108c96: 8d 7a 18 lea 0x18(%edx),%edi
108c99: b9 05 00 00 00 mov $0x5,%ecx
108c9e: 8b 75 b4 mov -0x4c(%ebp),%esi
108ca1: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode );
108ca3: 8b 42 20 mov 0x20(%edx),%eax
108ca6: ff 75 c4 pushl -0x3c(%ebp)
108ca9: ff 75 0c pushl 0xc(%ebp)
108cac: ff 75 08 pushl 0x8(%ebp)
108caf: 52 push %edx
108cb0: ff 10 call *(%eax)
if ( rc ) {
108cb2: 83 c4 20 add $0x20,%esp
108cb5: 85 c0 test %eax,%eax
108cb7: 8b 55 c0 mov -0x40(%ebp),%edx
108cba: 75 78 jne 108d34 <open+0x138>
}
/*
* Optionally truncate the file.
*/
if ( (flags & O_TRUNC) == O_TRUNC ) {
108cbc: f7 45 0c 00 04 00 00 testl $0x400,0xc(%ebp)
108cc3: 0f 85 9f 00 00 00 jne 108d68 <open+0x16c>
if ( loc_to_free )
rtems_filesystem_freenode( loc_to_free );
rtems_set_errno_and_return_minus_one( rc );
}
return iop - rtems_libio_iops;
108cc9: 2b 15 c0 7c 12 00 sub 0x127cc0,%edx
108ccf: c1 fa 03 sar $0x3,%edx
108cd2: 8d 04 d2 lea (%edx,%edx,8),%eax
108cd5: 8d 04 c2 lea (%edx,%eax,8),%eax
108cd8: 8d 04 c2 lea (%edx,%eax,8),%eax
108cdb: 8d 04 c2 lea (%edx,%eax,8),%eax
108cde: 89 c1 mov %eax,%ecx
108ce0: c1 e1 0f shl $0xf,%ecx
108ce3: 01 c8 add %ecx,%eax
108ce5: 8d 04 c2 lea (%edx,%eax,8),%eax
108ce8: f7 d8 neg %eax
}
108cea: 8d 65 f4 lea -0xc(%ebp),%esp
108ced: 5b pop %ebx
108cee: 5e pop %esi
108cef: 5f pop %edi
108cf0: c9 leave
108cf1: c3 ret
108cf2: 66 90 xchg %ax,%ax
*/
/* allocate a file control block */
iop = rtems_libio_allocate();
if ( iop == 0 ) {
rc = ENFILE;
108cf4: bb 17 00 00 00 mov $0x17,%ebx
if ( rc ) {
if ( iop )
rtems_libio_free( iop );
if ( loc_to_free )
rtems_filesystem_freenode( loc_to_free );
rtems_set_errno_and_return_minus_one( rc );
108cf9: e8 16 a6 00 00 call 113314 <__errno>
108cfe: 89 18 mov %ebx,(%eax)
108d00: b8 ff ff ff ff mov $0xffffffff,%eax
108d05: eb e3 jmp 108cea <open+0xee>
108d07: 90 nop
}
} else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) {
/* We were trying to create a file that already exists */
rc = EEXIST;
loc_to_free = &loc;
108d08: 8d 75 d4 lea -0x2c(%ebp),%esi
goto done;
}
} else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) {
/* We were trying to create a file that already exists */
rc = EEXIST;
108d0b: bb 11 00 00 00 mov $0x11,%ebx
*/
done:
va_end(ap);
if ( rc ) {
if ( iop )
108d10: 85 d2 test %edx,%edx
108d12: 74 0c je 108d20 <open+0x124>
rtems_libio_free( iop );
108d14: 83 ec 0c sub $0xc,%esp
108d17: 52 push %edx
108d18: e8 5f 71 00 00 call 10fe7c <rtems_libio_free>
108d1d: 83 c4 10 add $0x10,%esp
if ( loc_to_free )
108d20: 85 f6 test %esi,%esi
108d22: 74 d5 je 108cf9 <open+0xfd>
rtems_filesystem_freenode( loc_to_free );
108d24: 83 ec 0c sub $0xc,%esp
108d27: 56 push %esi
108d28: e8 73 f3 ff ff call 1080a0 <rtems_filesystem_freenode>
108d2d: 83 c4 10 add $0x10,%esp
108d30: eb c7 jmp 108cf9 <open+0xfd>
108d32: 66 90 xchg %ax,%ax
iop->flags |= rtems_libio_fcntl_flags( flags );
iop->pathinfo = loc;
rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode );
if ( rc ) {
rc = errno;
108d34: e8 db a5 00 00 call 113314 <__errno>
108d39: 8b 18 mov (%eax),%ebx
rc = EEXIST;
loc_to_free = &loc;
goto done;
}
loc_to_free = &loc;
108d3b: 8d 75 d4 lea -0x2c(%ebp),%esi
iop->pathinfo = loc;
rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode );
if ( rc ) {
rc = errno;
goto done;
108d3e: 8b 55 c0 mov -0x40(%ebp),%edx
* Single exit and clean up path.
*/
done:
va_end(ap);
if ( rc ) {
108d41: 85 db test %ebx,%ebx
108d43: 74 84 je 108cc9 <open+0xcd> <== NEVER TAKEN
108d45: eb c9 jmp 108d10 <open+0x114>
108d47: 90 nop
*/
status = rtems_filesystem_evaluate_path(
pathname, strlen( pathname ), eval_flags, &loc, true );
if ( status == -1 ) {
if ( errno != ENOENT ) {
108d48: e8 c7 a5 00 00 call 113314 <__errno>
108d4d: 83 38 02 cmpl $0x2,(%eax)
108d50: 8b 55 c0 mov -0x40(%ebp),%edx
108d53: 0f 84 9b 00 00 00 je 108df4 <open+0x1f8>
}
/* Create the node for the new regular file */
rc = mknod( pathname, S_IFREG | mode, 0LL );
if ( rc ) {
rc = errno;
108d59: e8 b6 a5 00 00 call 113314 <__errno>
108d5e: 8b 18 mov (%eax),%ebx
int mode;
int rc;
rtems_libio_t *iop = 0;
int status;
rtems_filesystem_location_info_t loc;
rtems_filesystem_location_info_t *loc_to_free = NULL;
108d60: 31 f6 xor %esi,%esi
/* Create the node for the new regular file */
rc = mknod( pathname, S_IFREG | mode, 0LL );
if ( rc ) {
rc = errno;
goto done;
108d62: 8b 55 c0 mov -0x40(%ebp),%edx
108d65: eb da jmp 108d41 <open+0x145>
108d67: 90 nop
/*
* Optionally truncate the file.
*/
if ( (flags & O_TRUNC) == O_TRUNC ) {
rc = ftruncate( iop - rtems_libio_iops, 0 );
108d68: 51 push %ecx
108d69: 6a 00 push $0x0
108d6b: 6a 00 push $0x0
108d6d: 89 d0 mov %edx,%eax
108d6f: 2b 05 c0 7c 12 00 sub 0x127cc0,%eax
108d75: c1 f8 03 sar $0x3,%eax
108d78: 8d 0c c0 lea (%eax,%eax,8),%ecx
108d7b: 8d 0c c8 lea (%eax,%ecx,8),%ecx
108d7e: 8d 0c c8 lea (%eax,%ecx,8),%ecx
108d81: 8d 0c c8 lea (%eax,%ecx,8),%ecx
108d84: 89 cb mov %ecx,%ebx
108d86: c1 e3 0f shl $0xf,%ebx
108d89: 01 d9 add %ebx,%ecx
108d8b: 8d 04 c8 lea (%eax,%ecx,8),%eax
108d8e: f7 d8 neg %eax
108d90: 50 push %eax
108d91: 89 55 c0 mov %edx,-0x40(%ebp)
108d94: e8 f3 6e 00 00 call 10fc8c <ftruncate>
108d99: 89 c3 mov %eax,%ebx
if ( rc ) {
108d9b: 83 c4 10 add $0x10,%esp
108d9e: 85 c0 test %eax,%eax
108da0: 8b 55 c0 mov -0x40(%ebp),%edx
108da3: 0f 84 20 ff ff ff je 108cc9 <open+0xcd>
if(errno) rc = errno;
108da9: e8 66 a5 00 00 call 113314 <__errno>
108dae: 8b 00 mov (%eax),%eax
108db0: 85 c0 test %eax,%eax
108db2: 8b 55 c0 mov -0x40(%ebp),%edx
108db5: 0f 85 b2 00 00 00 jne 108e6d <open+0x271> <== ALWAYS TAKEN
close( iop - rtems_libio_iops );
108dbb: 83 ec 0c sub $0xc,%esp
108dbe: 2b 15 c0 7c 12 00 sub 0x127cc0,%edx
108dc4: c1 fa 03 sar $0x3,%edx
108dc7: 8d 04 d2 lea (%edx,%edx,8),%eax
108dca: 8d 04 c2 lea (%edx,%eax,8),%eax
108dcd: 8d 04 c2 lea (%edx,%eax,8),%eax
108dd0: 8d 04 c2 lea (%edx,%eax,8),%eax
108dd3: 89 c1 mov %eax,%ecx
108dd5: c1 e1 0f shl $0xf,%ecx
108dd8: 01 c8 add %ecx,%eax
108dda: 8d 04 c2 lea (%edx,%eax,8),%eax
108ddd: f7 d8 neg %eax
108ddf: 50 push %eax
108de0: e8 27 6e 00 00 call 10fc0c <close>
108de5: 83 c4 10 add $0x10,%esp
/* those are released by close(): */
iop = 0;
loc_to_free = NULL;
108de8: 31 f6 xor %esi,%esi
rc = ftruncate( iop - rtems_libio_iops, 0 );
if ( rc ) {
if(errno) rc = errno;
close( iop - rtems_libio_iops );
/* those are released by close(): */
iop = 0;
108dea: 31 d2 xor %edx,%edx
108dec: e9 50 ff ff ff jmp 108d41 <open+0x145>
108df1: 8d 76 00 lea 0x0(%esi),%esi
rc = errno;
goto done;
}
/* If the file does not exist and we are not trying to create it--> error */
if ( !(flags & O_CREAT) ) {
108df4: f7 45 0c 00 02 00 00 testl $0x200,0xc(%ebp)
108dfb: 75 0f jne 108e0c <open+0x210>
int mode;
int rc;
rtems_libio_t *iop = 0;
int status;
rtems_filesystem_location_info_t loc;
rtems_filesystem_location_info_t *loc_to_free = NULL;
108dfd: 31 f6 xor %esi,%esi
goto done;
}
/* If the file does not exist and we are not trying to create it--> error */
if ( !(flags & O_CREAT) ) {
rc = ENOENT;
108dff: bb 02 00 00 00 mov $0x2,%ebx
108e04: e9 07 ff ff ff jmp 108d10 <open+0x114>
108e09: 8d 76 00 lea 0x0(%esi),%esi
goto done;
}
/* Create the node for the new regular file */
rc = mknod( pathname, S_IFREG | mode, 0LL );
108e0c: 6a 00 push $0x0
108e0e: 6a 00 push $0x0
108e10: 8b 45 c4 mov -0x3c(%ebp),%eax
108e13: 80 cc 80 or $0x80,%ah
108e16: 50 push %eax
108e17: ff 75 08 pushl 0x8(%ebp)
108e1a: 89 55 c0 mov %edx,-0x40(%ebp)
108e1d: e8 2a f6 ff ff call 10844c <mknod>
if ( rc ) {
108e22: 83 c4 10 add $0x10,%esp
108e25: 85 c0 test %eax,%eax
108e27: 8b 55 c0 mov -0x40(%ebp),%edx
108e2a: 0f 85 29 ff ff ff jne 108d59 <open+0x15d> <== NEVER TAKEN
/*
* After we do the mknod(), we have to evaluate the path to get the
* "loc" structure needed to actually have the file itself open.
* So we created it, and then we need to have "look it up."
*/
status = rtems_filesystem_evaluate_path(
108e30: 89 d9 mov %ebx,%ecx
108e32: 8b 7d 08 mov 0x8(%ebp),%edi
108e35: 89 f0 mov %esi,%eax
108e37: f2 ae repnz scas %es:(%edi),%al
108e39: f7 d1 not %ecx
108e3b: 49 dec %ecx
108e3c: 83 ec 0c sub $0xc,%esp
108e3f: 6a 01 push $0x1
108e41: 8d 45 d4 lea -0x2c(%ebp),%eax
108e44: 50 push %eax
108e45: 6a 00 push $0x0
108e47: 51 push %ecx
108e48: ff 75 08 pushl 0x8(%ebp)
108e4b: 89 55 c0 mov %edx,-0x40(%ebp)
108e4e: e8 75 f1 ff ff call 107fc8 <rtems_filesystem_evaluate_path>
pathname, strlen( pathname ), 0x0, &loc, true );
if ( status != 0 ) { /* The file did not exist */
108e53: 83 c4 20 add $0x20,%esp
108e56: 85 c0 test %eax,%eax
108e58: 8b 55 c0 mov -0x40(%ebp),%edx
108e5b: 0f 84 1c fe ff ff je 108c7d <open+0x81> <== ALWAYS TAKEN
int mode;
int rc;
rtems_libio_t *iop = 0;
int status;
rtems_filesystem_location_info_t loc;
rtems_filesystem_location_info_t *loc_to_free = NULL;
108e61: 31 f6 xor %esi,%esi
* So we created it, and then we need to have "look it up."
*/
status = rtems_filesystem_evaluate_path(
pathname, strlen( pathname ), 0x0, &loc, true );
if ( status != 0 ) { /* The file did not exist */
rc = EACCES;
108e63: bb 0d 00 00 00 mov $0xd,%ebx <== NOT EXECUTED
108e68: e9 a3 fe ff ff jmp 108d10 <open+0x114> <== NOT EXECUTED
* Optionally truncate the file.
*/
if ( (flags & O_TRUNC) == O_TRUNC ) {
rc = ftruncate( iop - rtems_libio_iops, 0 );
if ( rc ) {
if(errno) rc = errno;
108e6d: e8 a2 a4 00 00 call 113314 <__errno>
108e72: 8b 18 mov (%eax),%ebx
108e74: 8b 55 c0 mov -0x40(%ebp),%edx
108e77: e9 3f ff ff ff jmp 108dbb <open+0x1bf>
00109c00 <oproc>:
/*
* Handle output processing
*/
static void
oproc (unsigned char c, struct rtems_termios_tty *tty)
{
109c00: 55 push %ebp
109c01: 89 e5 mov %esp,%ebp
109c03: 56 push %esi
109c04: 53 push %ebx
109c05: 83 ec 10 sub $0x10,%esp
109c08: 88 45 f4 mov %al,-0xc(%ebp)
int i;
if (tty->termios.c_oflag & OPOST) {
109c0b: 8b 4a 34 mov 0x34(%edx),%ecx
109c0e: f6 c1 01 test $0x1,%cl
109c11: 74 31 je 109c44 <oproc+0x44> <== NEVER TAKEN
switch (c) {
109c13: 3c 09 cmp $0x9,%al
109c15: 0f 84 b1 00 00 00 je 109ccc <oproc+0xcc>
109c1b: 76 3f jbe 109c5c <oproc+0x5c> <== NEVER TAKEN
109c1d: 3c 0a cmp $0xa,%al
109c1f: 74 4f je 109c70 <oproc+0x70>
109c21: 3c 0d cmp $0xd,%al
109c23: 74 7f je 109ca4 <oproc+0xa4> <== NEVER TAKEN
if (tty->column > 0)
tty->column--;
break;
default:
if (tty->termios.c_oflag & OLCUC)
109c25: 83 e1 02 and $0x2,%ecx
109c28: 0f 85 c6 00 00 00 jne 109cf4 <oproc+0xf4> <== NEVER TAKEN
109c2e: 8b 0d 34 5b 12 00 mov 0x125b34,%ecx
c = toupper(c);
if (!iscntrl(c))
109c34: 0f b6 c0 movzbl %al,%eax
109c37: f6 44 01 01 20 testb $0x20,0x1(%ecx,%eax,1)
109c3c: 75 06 jne 109c44 <oproc+0x44> <== NEVER TAKEN
tty->column++;
109c3e: ff 42 28 incl 0x28(%edx)
109c41: 8d 76 00 lea 0x0(%esi),%esi
break;
}
}
rtems_termios_puts (&c, 1, tty);
109c44: 53 push %ebx
109c45: 52 push %edx
109c46: 6a 01 push $0x1
109c48: 8d 45 f4 lea -0xc(%ebp),%eax
109c4b: 50 push %eax
109c4c: e8 7b fe ff ff call 109acc <rtems_termios_puts>
109c51: 83 c4 10 add $0x10,%esp
}
109c54: 8d 65 f8 lea -0x8(%ebp),%esp
109c57: 5b pop %ebx
109c58: 5e pop %esi
109c59: c9 leave
109c5a: c3 ret
109c5b: 90 nop
oproc (unsigned char c, struct rtems_termios_tty *tty)
{
int i;
if (tty->termios.c_oflag & OPOST) {
switch (c) {
109c5c: 3c 08 cmp $0x8,%al <== NOT EXECUTED
109c5e: 75 c5 jne 109c25 <oproc+0x25> <== NOT EXECUTED
}
tty->column += i;
break;
case '\b':
if (tty->column > 0)
109c60: 8b 42 28 mov 0x28(%edx),%eax <== NOT EXECUTED
109c63: 85 c0 test %eax,%eax <== NOT EXECUTED
109c65: 7e dd jle 109c44 <oproc+0x44> <== NOT EXECUTED
tty->column--;
109c67: 48 dec %eax <== NOT EXECUTED
109c68: 89 42 28 mov %eax,0x28(%edx) <== NOT EXECUTED
109c6b: eb d7 jmp 109c44 <oproc+0x44> <== NOT EXECUTED
109c6d: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
int i;
if (tty->termios.c_oflag & OPOST) {
switch (c) {
case '\n':
if (tty->termios.c_oflag & ONLRET)
109c70: f6 c1 20 test $0x20,%cl
109c73: 74 07 je 109c7c <oproc+0x7c> <== ALWAYS TAKEN
tty->column = 0;
109c75: c7 42 28 00 00 00 00 movl $0x0,0x28(%edx) <== NOT EXECUTED
if (tty->termios.c_oflag & ONLCR) {
109c7c: 83 e1 04 and $0x4,%ecx
109c7f: 74 c3 je 109c44 <oproc+0x44> <== NEVER TAKEN
rtems_termios_puts ("\r", 1, tty);
109c81: 51 push %ecx
109c82: 52 push %edx
109c83: 6a 01 push $0x1
109c85: 68 c4 14 12 00 push $0x1214c4
109c8a: 89 55 f0 mov %edx,-0x10(%ebp)
109c8d: e8 3a fe ff ff call 109acc <rtems_termios_puts>
tty->column = 0;
109c92: 8b 55 f0 mov -0x10(%ebp),%edx
109c95: c7 42 28 00 00 00 00 movl $0x0,0x28(%edx)
109c9c: 83 c4 10 add $0x10,%esp
109c9f: eb a3 jmp 109c44 <oproc+0x44>
109ca1: 8d 76 00 lea 0x0(%esi),%esi
}
break;
case '\r':
if ((tty->termios.c_oflag & ONOCR) && (tty->column == 0))
109ca4: f6 c1 10 test $0x10,%cl <== NOT EXECUTED
109ca7: 74 07 je 109cb0 <oproc+0xb0> <== NOT EXECUTED
109ca9: 8b 42 28 mov 0x28(%edx),%eax <== NOT EXECUTED
109cac: 85 c0 test %eax,%eax <== NOT EXECUTED
109cae: 74 a4 je 109c54 <oproc+0x54> <== NOT EXECUTED
return;
if (tty->termios.c_oflag & OCRNL) {
109cb0: f6 c1 08 test $0x8,%cl <== NOT EXECUTED
109cb3: 74 09 je 109cbe <oproc+0xbe> <== NOT EXECUTED
c = '\n';
109cb5: c6 45 f4 0a movb $0xa,-0xc(%ebp) <== NOT EXECUTED
if (tty->termios.c_oflag & ONLRET)
109cb9: 83 e1 20 and $0x20,%ecx <== NOT EXECUTED
109cbc: 74 86 je 109c44 <oproc+0x44> <== NOT EXECUTED
tty->column = 0;
break;
}
tty->column = 0;
109cbe: c7 42 28 00 00 00 00 movl $0x0,0x28(%edx) <== NOT EXECUTED
break;
109cc5: e9 7a ff ff ff jmp 109c44 <oproc+0x44> <== NOT EXECUTED
109cca: 66 90 xchg %ax,%ax <== NOT EXECUTED
case '\t':
i = 8 - (tty->column & 7);
109ccc: 8b 5a 28 mov 0x28(%edx),%ebx
109ccf: 89 de mov %ebx,%esi
109cd1: 83 e6 07 and $0x7,%esi
109cd4: b8 08 00 00 00 mov $0x8,%eax
109cd9: 29 f0 sub %esi,%eax
if ((tty->termios.c_oflag & TABDLY) == XTABS) {
109cdb: 81 e1 00 18 00 00 and $0x1800,%ecx
109ce1: 81 f9 00 18 00 00 cmp $0x1800,%ecx
109ce7: 74 37 je 109d20 <oproc+0x120> <== ALWAYS TAKEN
tty->column += i;
rtems_termios_puts ( " ", i, tty);
return;
}
tty->column += i;
109ce9: 01 d8 add %ebx,%eax <== NOT EXECUTED
109ceb: 89 42 28 mov %eax,0x28(%edx) <== NOT EXECUTED
break;
109cee: e9 51 ff ff ff jmp 109c44 <oproc+0x44> <== NOT EXECUTED
109cf3: 90 nop <== NOT EXECUTED
tty->column--;
break;
default:
if (tty->termios.c_oflag & OLCUC)
c = toupper(c);
109cf4: 8b 0d 34 5b 12 00 mov 0x125b34,%ecx <== NOT EXECUTED
109cfa: 0f b6 c0 movzbl %al,%eax <== NOT EXECUTED
109cfd: 0f be 5c 01 01 movsbl 0x1(%ecx,%eax,1),%ebx <== NOT EXECUTED
109d02: 83 e3 03 and $0x3,%ebx <== NOT EXECUTED
109d05: 83 fb 02 cmp $0x2,%ebx <== NOT EXECUTED
109d08: 74 0e je 109d18 <oproc+0x118> <== NOT EXECUTED
109d0a: 89 c3 mov %eax,%ebx <== NOT EXECUTED
109d0c: 88 d8 mov %bl,%al <== NOT EXECUTED
109d0e: 88 5d f4 mov %bl,-0xc(%ebp) <== NOT EXECUTED
109d11: e9 1e ff ff ff jmp 109c34 <oproc+0x34> <== NOT EXECUTED
109d16: 66 90 xchg %ax,%ax <== NOT EXECUTED
109d18: 8d 58 e0 lea -0x20(%eax),%ebx <== NOT EXECUTED
109d1b: eb ef jmp 109d0c <oproc+0x10c> <== NOT EXECUTED
109d1d: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
break;
case '\t':
i = 8 - (tty->column & 7);
if ((tty->termios.c_oflag & TABDLY) == XTABS) {
tty->column += i;
109d20: 8d 1c 18 lea (%eax,%ebx,1),%ebx
109d23: 89 5a 28 mov %ebx,0x28(%edx)
rtems_termios_puts ( " ", i, tty);
109d26: 56 push %esi
109d27: 52 push %edx
109d28: 50 push %eax
109d29: 68 5c 10 12 00 push $0x12105c
109d2e: e8 99 fd ff ff call 109acc <rtems_termios_puts>
return;
109d33: 83 c4 10 add $0x10,%esp
109d36: e9 19 ff ff ff jmp 109c54 <oproc+0x54>
0010a038 <pathconf>:
long pathconf(
const char *path,
int name
)
{
10a038: 55 push %ebp
10a039: 89 e5 mov %esp,%ebp
10a03b: 56 push %esi
10a03c: 53 push %ebx
int status;
int fd;
fd = open( path, O_RDONLY );
10a03d: 83 ec 08 sub $0x8,%esp
10a040: 6a 00 push $0x0
10a042: ff 75 08 pushl 0x8(%ebp)
10a045: e8 4e fd ff ff call 109d98 <open>
10a04a: 89 c3 mov %eax,%ebx
if ( fd == -1 )
10a04c: 83 c4 10 add $0x10,%esp
10a04f: 83 f8 ff cmp $0xffffffff,%eax
10a052: 74 24 je 10a078 <pathconf+0x40>
return -1;
status = fpathconf( fd, name );
10a054: 83 ec 08 sub $0x8,%esp
10a057: ff 75 0c pushl 0xc(%ebp)
10a05a: 50 push %eax
10a05b: e8 c0 ec ff ff call 108d20 <fpathconf>
10a060: 89 c6 mov %eax,%esi
(void) close( fd );
10a062: 89 1c 24 mov %ebx,(%esp)
10a065: e8 56 e8 ff ff call 1088c0 <close>
return status;
10a06a: 83 c4 10 add $0x10,%esp
10a06d: 89 f0 mov %esi,%eax
}
10a06f: 8d 65 f8 lea -0x8(%ebp),%esp
10a072: 5b pop %ebx
10a073: 5e pop %esi
10a074: c9 leave
10a075: c3 ret
10a076: 66 90 xchg %ax,%ax
int status;
int fd;
fd = open( path, O_RDONLY );
if ( fd == -1 )
return -1;
10a078: b8 ff ff ff ff mov $0xffffffff,%eax
status = fpathconf( fd, name );
(void) close( fd );
return status;
}
10a07d: 8d 65 f8 lea -0x8(%ebp),%esp
10a080: 5b pop %ebx
10a081: 5e pop %esi
10a082: c9 leave
10a083: c3 ret
00110d5c <pipe_create>:
* Called by pipe() to create an anonymous pipe.
*/
int pipe_create(
int filsdes[2]
)
{
110d5c: 55 push %ebp
110d5d: 89 e5 mov %esp,%ebp
110d5f: 57 push %edi
110d60: 56 push %esi
110d61: 53 push %ebx
110d62: 83 ec 24 sub $0x24,%esp
rtems_libio_t *iop;
int err = 0;
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
110d65: 68 ff 01 00 00 push $0x1ff
110d6a: 68 2c 36 12 00 push $0x12362c
110d6f: e8 38 17 00 00 call 1124ac <rtems_mkdir>
110d74: 83 c4 10 add $0x10,%esp
110d77: 85 c0 test %eax,%eax
110d79: 74 0d je 110d88 <pipe_create+0x2c> <== ALWAYS TAKEN
return -1;
110d7b: b8 ff ff ff ff mov $0xffffffff,%eax <== NOT EXECUTED
unlink(fifopath);
}
if(err != 0)
rtems_set_errno_and_return_minus_one(err);
return 0;
}
110d80: 8d 65 f4 lea -0xc(%ebp),%esp
110d83: 5b pop %ebx
110d84: 5e pop %esi
110d85: 5f pop %edi
110d86: c9 leave
110d87: c3 ret
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
return -1;
/* /tmp/.fifoXXXX */
char fifopath[15];
memcpy(fifopath, "/tmp/.fifo", 10);
110d88: 8d 5d d9 lea -0x27(%ebp),%ebx
110d8b: be 31 36 12 00 mov $0x123631,%esi
110d90: b9 0a 00 00 00 mov $0xa,%ecx
110d95: 89 df mov %ebx,%edi
110d97: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
sprintf(fifopath + 10, "%04x", rtems_pipe_no ++);
110d99: 0f b7 05 0c 97 12 00 movzwl 0x12970c,%eax
110da0: 8d 50 01 lea 0x1(%eax),%edx
110da3: 66 89 15 0c 97 12 00 mov %dx,0x12970c
110daa: 51 push %ecx
110dab: 50 push %eax
110dac: 68 3c 36 12 00 push $0x12363c
110db1: 8d 45 e3 lea -0x1d(%ebp),%eax
110db4: 50 push %eax
110db5: e8 aa 4a 00 00 call 115864 <sprintf>
/* Try creating FIFO file until find an available file name */
while (mkfifo(fifopath, S_IRUSR|S_IWUSR) != 0) {
110dba: 58 pop %eax
110dbb: 5a pop %edx
110dbc: 68 80 01 00 00 push $0x180
110dc1: 53 push %ebx
110dc2: e8 2d 14 00 00 call 1121f4 <mkfifo>
110dc7: 83 c4 10 add $0x10,%esp
110dca: 85 c0 test %eax,%eax
110dcc: 0f 85 a6 00 00 00 jne 110e78 <pipe_create+0x11c>
return -1;
/* sprintf(fifopath + 10, "%04x", rtems_pipe_no ++); */
}
/* Non-blocking open to avoid waiting for writers */
filsdes[0] = open(fifopath, O_RDONLY | O_NONBLOCK);
110dd2: 83 ec 08 sub $0x8,%esp
110dd5: 68 00 40 00 00 push $0x4000
110dda: 53 push %ebx
110ddb: e8 f0 90 ff ff call 109ed0 <open>
110de0: 8b 55 08 mov 0x8(%ebp),%edx
110de3: 89 02 mov %eax,(%edx)
if (filsdes[0] < 0) {
110de5: 83 c4 10 add $0x10,%esp
110de8: 85 c0 test %eax,%eax
110dea: 78 58 js 110e44 <pipe_create+0xe8>
the file node will be deleted after it is closed by all. */
unlink(fifopath);
}
else {
/* Reset open file to blocking mode */
iop = rtems_libio_iop(filsdes[0]);
110dec: 3b 05 6c 56 12 00 cmp 0x12566c,%eax
110df2: 72 3c jb 110e30 <pipe_create+0xd4> <== ALWAYS TAKEN
110df4: 31 d2 xor %edx,%edx
iop->flags &= ~LIBIO_FLAGS_NO_DELAY;
110df6: 83 62 14 fe andl $0xfffffffe,0x14(%edx)
filsdes[1] = open(fifopath, O_WRONLY);
110dfa: 83 ec 08 sub $0x8,%esp
110dfd: 6a 01 push $0x1
110dff: 53 push %ebx
110e00: e8 cb 90 ff ff call 109ed0 <open>
110e05: 8b 55 08 mov 0x8(%ebp),%edx
110e08: 89 42 04 mov %eax,0x4(%edx)
if (filsdes[1] < 0) {
110e0b: 83 c4 10 add $0x10,%esp
110e0e: 85 c0 test %eax,%eax
110e10: 78 4a js 110e5c <pipe_create+0x100>
int pipe_create(
int filsdes[2]
)
{
rtems_libio_t *iop;
int err = 0;
110e12: 31 f6 xor %esi,%esi
if (filsdes[1] < 0) {
err = errno;
close(filsdes[0]);
}
unlink(fifopath);
110e14: 83 ec 0c sub $0xc,%esp
110e17: 53 push %ebx
110e18: e8 ff b0 ff ff call 10bf1c <unlink>
110e1d: 83 c4 10 add $0x10,%esp
}
if(err != 0)
110e20: 85 f6 test %esi,%esi
110e22: 75 63 jne 110e87 <pipe_create+0x12b>
rtems_set_errno_and_return_minus_one(err);
return 0;
110e24: 31 c0 xor %eax,%eax
}
110e26: 8d 65 f4 lea -0xc(%ebp),%esp
110e29: 5b pop %ebx
110e2a: 5e pop %esi
110e2b: 5f pop %edi
110e2c: c9 leave
110e2d: c3 ret
110e2e: 66 90 xchg %ax,%ax
the file node will be deleted after it is closed by all. */
unlink(fifopath);
}
else {
/* Reset open file to blocking mode */
iop = rtems_libio_iop(filsdes[0]);
110e30: c1 e0 03 shl $0x3,%eax
110e33: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx
110e3a: 29 c2 sub %eax,%edx
110e3c: 03 15 40 99 12 00 add 0x129940,%edx
110e42: eb b2 jmp 110df6 <pipe_create+0x9a>
}
/* Non-blocking open to avoid waiting for writers */
filsdes[0] = open(fifopath, O_RDONLY | O_NONBLOCK);
if (filsdes[0] < 0) {
err = errno;
110e44: e8 83 40 00 00 call 114ecc <__errno>
110e49: 8b 30 mov (%eax),%esi
/* Delete file at errors, or else if pipe is successfully created
the file node will be deleted after it is closed by all. */
unlink(fifopath);
110e4b: 83 ec 0c sub $0xc,%esp
110e4e: 53 push %ebx
110e4f: e8 c8 b0 ff ff call 10bf1c <unlink>
110e54: 83 c4 10 add $0x10,%esp
110e57: eb c7 jmp 110e20 <pipe_create+0xc4>
110e59: 8d 76 00 lea 0x0(%esi),%esi
iop->flags &= ~LIBIO_FLAGS_NO_DELAY;
filsdes[1] = open(fifopath, O_WRONLY);
if (filsdes[1] < 0) {
err = errno;
110e5c: e8 6b 40 00 00 call 114ecc <__errno>
110e61: 8b 30 mov (%eax),%esi
close(filsdes[0]);
110e63: 83 ec 0c sub $0xc,%esp
110e66: 8b 45 08 mov 0x8(%ebp),%eax
110e69: ff 30 pushl (%eax)
110e6b: e8 c8 80 ff ff call 108f38 <close>
110e70: 83 c4 10 add $0x10,%esp
110e73: eb 9f jmp 110e14 <pipe_create+0xb8>
110e75: 8d 76 00 lea 0x0(%esi),%esi
memcpy(fifopath, "/tmp/.fifo", 10);
sprintf(fifopath + 10, "%04x", rtems_pipe_no ++);
/* Try creating FIFO file until find an available file name */
while (mkfifo(fifopath, S_IRUSR|S_IWUSR) != 0) {
if (errno != EEXIST){
110e78: e8 4f 40 00 00 call 114ecc <__errno>
return -1;
110e7d: b8 ff ff ff ff mov $0xffffffff,%eax
110e82: e9 f9 fe ff ff jmp 110d80 <pipe_create+0x24>
close(filsdes[0]);
}
unlink(fifopath);
}
if(err != 0)
rtems_set_errno_and_return_minus_one(err);
110e87: e8 40 40 00 00 call 114ecc <__errno>
110e8c: 89 30 mov %esi,(%eax)
110e8e: b8 ff ff ff ff mov $0xffffffff,%eax
110e93: e9 e8 fe ff ff jmp 110d80 <pipe_create+0x24>
001122a0 <pipe_ioctl>:
pipe_control_t *pipe,
uint32_t cmd,
void *buffer,
rtems_libio_t *iop
)
{
1122a0: 55 push %ebp
1122a1: 89 e5 mov %esp,%ebp
1122a3: 56 push %esi
1122a4: 53 push %ebx
1122a5: 8b 75 08 mov 0x8(%ebp),%esi
1122a8: 8b 5d 10 mov 0x10(%ebp),%ebx
if (cmd == FIONREAD) {
1122ab: 81 7d 0c 7f 66 04 40 cmpl $0x4004667f,0xc(%ebp)
1122b2: 74 0c je 1122c0 <pipe_ioctl+0x20>
*(unsigned int *)buffer = pipe->Length;
PIPE_UNLOCK(pipe);
return 0;
}
return -EINVAL;
1122b4: b8 ea ff ff ff mov $0xffffffea,%eax
}
1122b9: 8d 65 f8 lea -0x8(%ebp),%esp
1122bc: 5b pop %ebx
1122bd: 5e pop %esi
1122be: c9 leave
1122bf: c3 ret
void *buffer,
rtems_libio_t *iop
)
{
if (cmd == FIONREAD) {
if (buffer == NULL)
1122c0: 85 db test %ebx,%ebx
1122c2: 75 07 jne 1122cb <pipe_ioctl+0x2b>
return -EFAULT;
1122c4: b8 f2 ff ff ff mov $0xfffffff2,%eax
1122c9: eb ee jmp 1122b9 <pipe_ioctl+0x19>
if (! PIPE_LOCK(pipe))
1122cb: 50 push %eax
1122cc: 6a 00 push $0x0
1122ce: 6a 00 push $0x0
1122d0: ff 76 28 pushl 0x28(%esi)
1122d3: e8 fc b1 ff ff call 10d4d4 <rtems_semaphore_obtain>
1122d8: 83 c4 10 add $0x10,%esp
1122db: 85 c0 test %eax,%eax
1122dd: 74 07 je 1122e6 <pipe_ioctl+0x46> <== ALWAYS TAKEN
return -EINTR;
1122df: b8 fc ff ff ff mov $0xfffffffc,%eax <== NOT EXECUTED
1122e4: eb d3 jmp 1122b9 <pipe_ioctl+0x19> <== NOT EXECUTED
/* Return length of pipe */
*(unsigned int *)buffer = pipe->Length;
1122e6: 8b 46 0c mov 0xc(%esi),%eax
1122e9: 89 03 mov %eax,(%ebx)
PIPE_UNLOCK(pipe);
1122eb: 83 ec 0c sub $0xc,%esp
1122ee: ff 76 28 pushl 0x28(%esi)
1122f1: e8 da b2 ff ff call 10d5d0 <rtems_semaphore_release>
return 0;
1122f6: 83 c4 10 add $0x10,%esp
1122f9: 31 c0 xor %eax,%eax
1122fb: eb bc jmp 1122b9 <pipe_ioctl+0x19>
00111ee8 <pipe_read>:
pipe_control_t *pipe,
void *buffer,
size_t count,
rtems_libio_t *iop
)
{
111ee8: 55 push %ebp
111ee9: 89 e5 mov %esp,%ebp
111eeb: 57 push %edi
111eec: 56 push %esi
111eed: 53 push %ebx
111eee: 83 ec 30 sub $0x30,%esp
111ef1: 8b 5d 08 mov 0x8(%ebp),%ebx
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
111ef4: 6a 00 push $0x0
111ef6: 6a 00 push $0x0
111ef8: ff 73 28 pushl 0x28(%ebx)
111efb: e8 d4 b5 ff ff call 10d4d4 <rtems_semaphore_obtain>
111f00: 83 c4 10 add $0x10,%esp
111f03: 85 c0 test %eax,%eax
111f05: 0f 85 ad 00 00 00 jne 111fb8 <pipe_read+0xd0> <== NEVER TAKEN
return -EINTR;
while (read < count) {
111f0b: 8b 55 10 mov 0x10(%ebp),%edx
111f0e: 85 d2 test %edx,%edx
111f10: 0f 84 7a 01 00 00 je 112090 <pipe_read+0x1a8> <== NEVER TAKEN
111f16: c7 45 d0 00 00 00 00 movl $0x0,-0x30(%ebp)
111f1d: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp)
while (PIPE_EMPTY(pipe)) {
111f24: 8b 53 0c mov 0xc(%ebx),%edx
111f27: 85 d2 test %edx,%edx
111f29: 0f 85 99 00 00 00 jne 111fc8 <pipe_read+0xe0>
/* Not an error */
if (pipe->Writers == 0)
111f2f: 8b 43 14 mov 0x14(%ebx),%eax
111f32: 85 c0 test %eax,%eax
111f34: 0f 84 fe 00 00 00 je 112038 <pipe_read+0x150>
goto out_locked;
if (LIBIO_NODELAY(iop)) {
111f3a: 8b 45 14 mov 0x14(%ebp),%eax
111f3d: f6 40 14 01 testb $0x1,0x14(%eax)
111f41: 0f 85 f9 00 00 00 jne 112040 <pipe_read+0x158>
ret = -EAGAIN;
goto out_locked;
}
/* Wait until pipe is no more empty or no writer exists */
pipe->waitingReaders ++;
111f47: ff 43 18 incl 0x18(%ebx)
PIPE_UNLOCK(pipe);
111f4a: 83 ec 0c sub $0xc,%esp
111f4d: ff 73 28 pushl 0x28(%ebx)
111f50: e8 7b b6 ff ff call 10d5d0 <rtems_semaphore_release>
if (! PIPE_READWAIT(pipe))
111f55: 5e pop %esi
111f56: 5f pop %edi
111f57: 6a 00 push $0x0
111f59: ff 73 2c pushl 0x2c(%ebx)
111f5c: e8 03 19 00 00 call 113864 <rtems_barrier_wait>
111f61: 83 c4 0c add $0xc,%esp
111f64: 83 f8 01 cmp $0x1,%eax
111f67: 19 f6 sbb %esi,%esi
111f69: f7 d6 not %esi
111f6b: 83 e6 fc and $0xfffffffc,%esi
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
111f6e: 6a 00 push $0x0
111f70: 6a 00 push $0x0
111f72: ff 73 28 pushl 0x28(%ebx)
111f75: e8 5a b5 ff ff call 10d4d4 <rtems_semaphore_obtain>
111f7a: 83 c4 10 add $0x10,%esp
111f7d: 85 c0 test %eax,%eax
111f7f: 0f 85 c7 00 00 00 jne 11204c <pipe_read+0x164> <== NEVER TAKEN
/* WARN waitingReaders not restored! */
ret = -EINTR;
goto out_nolock;
}
pipe->waitingReaders --;
111f85: ff 4b 18 decl 0x18(%ebx)
if (ret != 0)
111f88: 85 f6 test %esi,%esi
111f8a: 74 98 je 111f24 <pipe_read+0x3c> <== ALWAYS TAKEN
PIPE_WAKEUPWRITERS(pipe);
read += chunk;
}
out_locked:
PIPE_UNLOCK(pipe);
111f8c: 83 ec 0c sub $0xc,%esp
111f8f: ff 73 28 pushl 0x28(%ebx)
111f92: e8 39 b6 ff ff call 10d5d0 <rtems_semaphore_release>
111f97: 83 c4 10 add $0x10,%esp
out_nolock:
if (read > 0)
111f9a: 8b 55 d4 mov -0x2c(%ebp),%edx
111f9d: 85 d2 test %edx,%edx
111f9f: 7e 0b jle 111fac <pipe_read+0xc4>
111fa1: 8b 45 d4 mov -0x2c(%ebp),%eax
return read;
return ret;
}
111fa4: 8d 65 f4 lea -0xc(%ebp),%esp
111fa7: 5b pop %ebx
111fa8: 5e pop %esi
111fa9: 5f pop %edi
111faa: c9 leave
111fab: c3 ret
PIPE_UNLOCK(pipe);
out_nolock:
if (read > 0)
return read;
return ret;
111fac: 89 f0 mov %esi,%eax
}
111fae: 8d 65 f4 lea -0xc(%ebp),%esp
111fb1: 5b pop %ebx
111fb2: 5e pop %esi
111fb3: 5f pop %edi
111fb4: c9 leave
111fb5: c3 ret
111fb6: 66 90 xchg %ax,%ax
)
{
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
return -EINTR;
111fb8: b8 fc ff ff ff mov $0xfffffffc,%eax <== NOT EXECUTED
out_nolock:
if (read > 0)
return read;
return ret;
}
111fbd: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
111fc0: 5b pop %ebx <== NOT EXECUTED
111fc1: 5e pop %esi <== NOT EXECUTED
111fc2: 5f pop %edi <== NOT EXECUTED
111fc3: c9 leave <== NOT EXECUTED
111fc4: c3 ret <== NOT EXECUTED
111fc5: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
if (ret != 0)
goto out_locked;
}
/* Read chunk bytes */
chunk = MIN(count - read, pipe->Length);
111fc8: 8b 45 10 mov 0x10(%ebp),%eax
111fcb: 2b 45 d0 sub -0x30(%ebp),%eax
111fce: 89 55 cc mov %edx,-0x34(%ebp)
111fd1: 39 c2 cmp %eax,%edx
111fd3: 76 03 jbe 111fd8 <pipe_read+0xf0>
111fd5: 89 45 cc mov %eax,-0x34(%ebp)
chunk1 = pipe->Size - pipe->Start;
111fd8: 8b 73 08 mov 0x8(%ebx),%esi
111fdb: 8b 43 04 mov 0x4(%ebx),%eax
111fde: 29 f0 sub %esi,%eax
if (chunk > chunk1) {
111fe0: 39 45 cc cmp %eax,-0x34(%ebp)
111fe3: 7f 71 jg 112056 <pipe_read+0x16e>
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1);
memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1);
}
else
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk);
111fe5: 8b 45 0c mov 0xc(%ebp),%eax
111fe8: 03 45 d0 add -0x30(%ebp),%eax
111feb: 03 33 add (%ebx),%esi
111fed: 89 c7 mov %eax,%edi
111fef: 8b 4d cc mov -0x34(%ebp),%ecx
111ff2: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
pipe->Start += chunk;
111ff4: 8b 45 cc mov -0x34(%ebp),%eax
111ff7: 03 43 08 add 0x8(%ebx),%eax
pipe->Start %= pipe->Size;
111ffa: 31 d2 xor %edx,%edx
111ffc: f7 73 04 divl 0x4(%ebx)
111fff: 89 53 08 mov %edx,0x8(%ebx)
pipe->Length -= chunk;
112002: 8b 43 0c mov 0xc(%ebx),%eax
112005: 2b 45 cc sub -0x34(%ebp),%eax
112008: 89 43 0c mov %eax,0xc(%ebx)
/* For buffering optimization */
if (PIPE_EMPTY(pipe))
11200b: 85 c0 test %eax,%eax
11200d: 75 07 jne 112016 <pipe_read+0x12e>
pipe->Start = 0;
11200f: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx)
if (pipe->waitingWriters > 0)
112016: 8b 4b 1c mov 0x1c(%ebx),%ecx
112019: 85 c9 test %ecx,%ecx
11201b: 75 5f jne 11207c <pipe_read+0x194>
PIPE_WAKEUPWRITERS(pipe);
read += chunk;
11201d: 8b 45 cc mov -0x34(%ebp),%eax
112020: 01 45 d4 add %eax,-0x2c(%ebp)
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
return -EINTR;
while (read < count) {
112023: 8b 45 d4 mov -0x2c(%ebp),%eax
112026: 89 45 d0 mov %eax,-0x30(%ebp)
112029: 8b 45 10 mov 0x10(%ebp),%eax
11202c: 39 45 d4 cmp %eax,-0x2c(%ebp)
11202f: 0f 82 ef fe ff ff jb 111f24 <pipe_read+0x3c> <== NEVER TAKEN
112035: 8d 76 00 lea 0x0(%esi),%esi
while (PIPE_EMPTY(pipe)) {
/* Not an error */
if (pipe->Writers == 0)
112038: 31 f6 xor %esi,%esi
11203a: e9 4d ff ff ff jmp 111f8c <pipe_read+0xa4>
11203f: 90 nop
goto out_locked;
if (LIBIO_NODELAY(iop)) {
ret = -EAGAIN;
112040: be f5 ff ff ff mov $0xfffffff5,%esi
112045: e9 42 ff ff ff jmp 111f8c <pipe_read+0xa4>
11204a: 66 90 xchg %ax,%ax
PIPE_UNLOCK(pipe);
if (! PIPE_READWAIT(pipe))
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
/* WARN waitingReaders not restored! */
ret = -EINTR;
11204c: be fc ff ff ff mov $0xfffffffc,%esi <== NOT EXECUTED
112051: e9 44 ff ff ff jmp 111f9a <pipe_read+0xb2> <== NOT EXECUTED
/* Read chunk bytes */
chunk = MIN(count - read, pipe->Length);
chunk1 = pipe->Size - pipe->Start;
if (chunk > chunk1) {
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1);
112056: 8b 55 0c mov 0xc(%ebp),%edx
112059: 03 55 d0 add -0x30(%ebp),%edx
11205c: 03 33 add (%ebx),%esi
11205e: 89 d7 mov %edx,%edi
112060: 89 c1 mov %eax,%ecx
112062: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1);
112064: 8b 55 d0 mov -0x30(%ebp),%edx
112067: 01 c2 add %eax,%edx
112069: 03 55 0c add 0xc(%ebp),%edx
11206c: 8b 4d cc mov -0x34(%ebp),%ecx
11206f: 29 c1 sub %eax,%ecx
112071: 8b 33 mov (%ebx),%esi
112073: 89 d7 mov %edx,%edi
112075: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
112077: e9 78 ff ff ff jmp 111ff4 <pipe_read+0x10c>
/* For buffering optimization */
if (PIPE_EMPTY(pipe))
pipe->Start = 0;
if (pipe->waitingWriters > 0)
PIPE_WAKEUPWRITERS(pipe);
11207c: 83 ec 08 sub $0x8,%esp
11207f: 8d 45 e4 lea -0x1c(%ebp),%eax
112082: 50 push %eax
112083: ff 73 30 pushl 0x30(%ebx)
112086: e8 75 17 00 00 call 113800 <rtems_barrier_release>
11208b: 83 c4 10 add $0x10,%esp
11208e: eb 8d jmp 11201d <pipe_read+0x135>
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
return -EINTR;
while (read < count) {
112090: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp) <== NOT EXECUTED
112097: 31 f6 xor %esi,%esi <== NOT EXECUTED
112099: e9 ee fe ff ff jmp 111f8c <pipe_read+0xa4> <== NOT EXECUTED
00111994 <pipe_release>:
*/
void pipe_release(
pipe_control_t **pipep,
rtems_libio_t *iop
)
{
111994: 55 push %ebp
111995: 89 e5 mov %esp,%ebp
111997: 57 push %edi
111998: 56 push %esi
111999: 53 push %ebx
11199a: 83 ec 1c sub $0x1c,%esp
11199d: 8b 7d 08 mov 0x8(%ebp),%edi
pipe_control_t *pipe = *pipep;
1119a0: 8b 1f mov (%edi),%ebx
/* WARN pipe not released! */
if (!PIPE_LOCK(pipe))
rtems_fatal_error_occurred(0xdeadbeef);
#endif
mode = LIBIO_ACCMODE(iop);
1119a2: 8b 45 0c mov 0xc(%ebp),%eax
1119a5: 8b 40 14 mov 0x14(%eax),%eax
1119a8: 89 c6 mov %eax,%esi
1119aa: 83 e6 06 and $0x6,%esi
if (mode & LIBIO_FLAGS_READ)
1119ad: a8 02 test $0x2,%al
1119af: 74 03 je 1119b4 <pipe_release+0x20>
pipe->Readers --;
1119b1: ff 4b 10 decl 0x10(%ebx)
if (mode & LIBIO_FLAGS_WRITE)
1119b4: f7 c6 04 00 00 00 test $0x4,%esi
1119ba: 74 03 je 1119bf <pipe_release+0x2b>
pipe->Writers --;
1119bc: ff 4b 14 decl 0x14(%ebx)
PIPE_UNLOCK(pipe);
1119bf: 83 ec 0c sub $0xc,%esp
1119c2: ff 73 28 pushl 0x28(%ebx)
1119c5: e8 06 bc ff ff call 10d5d0 <rtems_semaphore_release>
if (pipe->Readers == 0 && pipe->Writers == 0) {
1119ca: 83 c4 10 add $0x10,%esp
1119cd: 8b 53 10 mov 0x10(%ebx),%edx
1119d0: 85 d2 test %edx,%edx
1119d2: 74 2c je 111a00 <pipe_release+0x6c>
*pipep = NULL;
}
else if (pipe->Readers == 0 && mode != LIBIO_FLAGS_WRITE)
/* Notify waiting Writers that all their partners left */
PIPE_WAKEUPWRITERS(pipe);
else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ)
1119d4: 8b 43 14 mov 0x14(%ebx),%eax
1119d7: 85 c0 test %eax,%eax
1119d9: 75 17 jne 1119f2 <pipe_release+0x5e> <== NEVER TAKEN
1119db: 83 fe 02 cmp $0x2,%esi
1119de: 74 12 je 1119f2 <pipe_release+0x5e> <== NEVER TAKEN
PIPE_WAKEUPREADERS(pipe);
1119e0: 83 ec 08 sub $0x8,%esp
1119e3: 8d 45 e4 lea -0x1c(%ebp),%eax
1119e6: 50 push %eax
1119e7: ff 73 2c pushl 0x2c(%ebx)
1119ea: e8 11 1e 00 00 call 113800 <rtems_barrier_release>
1119ef: 83 c4 10 add $0x10,%esp
pipe_unlock();
1119f2: e8 85 ff ff ff call 11197c <pipe_unlock>
iop->flags &= ~LIBIO_FLAGS_OPEN;
if(iop->pathinfo.ops->unlink_h(&iop->pathinfo))
return;
#endif
}
1119f7: 8d 65 f4 lea -0xc(%ebp),%esp
1119fa: 5b pop %ebx
1119fb: 5e pop %esi
1119fc: 5f pop %edi
1119fd: c9 leave
1119fe: c3 ret
1119ff: 90 nop
if (mode & LIBIO_FLAGS_WRITE)
pipe->Writers --;
PIPE_UNLOCK(pipe);
if (pipe->Readers == 0 && pipe->Writers == 0) {
111a00: 8b 43 14 mov 0x14(%ebx),%eax
111a03: 85 c0 test %eax,%eax
111a05: 74 25 je 111a2c <pipe_release+0x98>
delfile = TRUE;
#endif
pipe_free(pipe);
*pipep = NULL;
}
else if (pipe->Readers == 0 && mode != LIBIO_FLAGS_WRITE)
111a07: 83 fe 04 cmp $0x4,%esi
111a0a: 74 e6 je 1119f2 <pipe_release+0x5e> <== NEVER TAKEN
/* Notify waiting Writers that all their partners left */
PIPE_WAKEUPWRITERS(pipe);
111a0c: 83 ec 08 sub $0x8,%esp
111a0f: 8d 45 e4 lea -0x1c(%ebp),%eax
111a12: 50 push %eax
111a13: ff 73 30 pushl 0x30(%ebx)
111a16: e8 e5 1d 00 00 call 113800 <rtems_barrier_release>
111a1b: 83 c4 10 add $0x10,%esp
else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ)
PIPE_WAKEUPREADERS(pipe);
pipe_unlock();
111a1e: e8 59 ff ff ff call 11197c <pipe_unlock>
iop->flags &= ~LIBIO_FLAGS_OPEN;
if(iop->pathinfo.ops->unlink_h(&iop->pathinfo))
return;
#endif
}
111a23: 8d 65 f4 lea -0xc(%ebp),%esp
111a26: 5b pop %ebx
111a27: 5e pop %esi
111a28: 5f pop %edi
111a29: c9 leave
111a2a: c3 ret
111a2b: 90 nop
/* Called with pipe_semaphore held. */
static inline void pipe_free(
pipe_control_t *pipe
)
{
rtems_barrier_delete(pipe->readBarrier);
111a2c: 83 ec 0c sub $0xc,%esp
111a2f: ff 73 2c pushl 0x2c(%ebx)
111a32: e8 39 1d 00 00 call 113770 <rtems_barrier_delete>
rtems_barrier_delete(pipe->writeBarrier);
111a37: 5e pop %esi
111a38: ff 73 30 pushl 0x30(%ebx)
111a3b: e8 30 1d 00 00 call 113770 <rtems_barrier_delete>
rtems_semaphore_delete(pipe->Semaphore);
111a40: 59 pop %ecx
111a41: ff 73 28 pushl 0x28(%ebx)
111a44: e8 e7 b9 ff ff call 10d430 <rtems_semaphore_delete>
free(pipe->Buffer);
111a49: 5a pop %edx
111a4a: ff 33 pushl (%ebx)
111a4c: e8 7f 7f ff ff call 1099d0 <free>
free(pipe);
111a51: 89 1c 24 mov %ebx,(%esp)
111a54: e8 77 7f ff ff call 1099d0 <free>
/* To delete an anonymous pipe file when all users closed it */
if (pipe->Anonymous)
delfile = TRUE;
#endif
pipe_free(pipe);
*pipep = NULL;
111a59: c7 07 00 00 00 00 movl $0x0,(%edi)
111a5f: 83 c4 10 add $0x10,%esp
/* Notify waiting Writers that all their partners left */
PIPE_WAKEUPWRITERS(pipe);
else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ)
PIPE_WAKEUPREADERS(pipe);
pipe_unlock();
111a62: e8 15 ff ff ff call 11197c <pipe_unlock>
iop->flags &= ~LIBIO_FLAGS_OPEN;
if(iop->pathinfo.ops->unlink_h(&iop->pathinfo))
return;
#endif
}
111a67: 8d 65 f4 lea -0xc(%ebp),%esp
111a6a: 5b pop %ebx
111a6b: 5e pop %esi
111a6c: 5f pop %edi
111a6d: c9 leave
111a6e: c3 ret
001120a0 <pipe_write>:
pipe_control_t *pipe,
const void *buffer,
size_t count,
rtems_libio_t *iop
)
{
1120a0: 55 push %ebp
1120a1: 89 e5 mov %esp,%ebp
1120a3: 57 push %edi
1120a4: 56 push %esi
1120a5: 53 push %ebx
1120a6: 83 ec 2c sub $0x2c,%esp
1120a9: 8b 5d 10 mov 0x10(%ebp),%ebx
int chunk, chunk1, written = 0, ret = 0;
/* Write nothing */
if (count == 0)
1120ac: 85 db test %ebx,%ebx
1120ae: 75 0c jne 1120bc <pipe_write+0x1c> <== ALWAYS TAKEN
return 0;
1120b0: 31 c0 xor %eax,%eax
#endif
if (written > 0)
return written;
return ret;
}
1120b2: 8d 65 f4 lea -0xc(%ebp),%esp
1120b5: 5b pop %ebx
1120b6: 5e pop %esi
1120b7: 5f pop %edi
1120b8: c9 leave
1120b9: c3 ret
1120ba: 66 90 xchg %ax,%ax
/* Write nothing */
if (count == 0)
return 0;
if (! PIPE_LOCK(pipe))
1120bc: 56 push %esi
1120bd: 6a 00 push $0x0
1120bf: 6a 00 push $0x0
1120c1: 8b 45 08 mov 0x8(%ebp),%eax
1120c4: ff 70 28 pushl 0x28(%eax)
1120c7: e8 08 b4 ff ff call 10d4d4 <rtems_semaphore_obtain>
1120cc: 83 c4 10 add $0x10,%esp
1120cf: 85 c0 test %eax,%eax
1120d1: 0f 85 4a 01 00 00 jne 112221 <pipe_write+0x181> <== NEVER TAKEN
return -EINTR;
if (pipe->Readers == 0) {
1120d7: 8b 45 08 mov 0x8(%ebp),%eax
1120da: 8b 48 10 mov 0x10(%eax),%ecx
1120dd: 85 c9 test %ecx,%ecx
1120df: 0f 84 57 01 00 00 je 11223c <pipe_write+0x19c>
ret = -EPIPE;
goto out_locked;
}
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
1120e5: 8b 48 04 mov 0x4(%eax),%ecx
1120e8: 39 cb cmp %ecx,%ebx
1120ea: 0f 87 42 01 00 00 ja 112232 <pipe_write+0x192> <== NEVER TAKEN
1120f0: 89 de mov %ebx,%esi
1120f2: c7 45 d0 00 00 00 00 movl $0x0,-0x30(%ebp)
1120f9: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp)
else
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk);
pipe->Length += chunk;
if (pipe->waitingReaders > 0)
PIPE_WAKEUPREADERS(pipe);
112100: 89 5d c8 mov %ebx,-0x38(%ebp)
112103: 8b 5d 08 mov 0x8(%ebp),%ebx
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
while (PIPE_SPACE(pipe) < chunk) {
112106: 8b 43 0c mov 0xc(%ebx),%eax
112109: 89 ca mov %ecx,%edx
11210b: 29 c2 sub %eax,%edx
11210d: 39 f2 cmp %esi,%edx
11210f: 73 6f jae 112180 <pipe_write+0xe0>
if (LIBIO_NODELAY(iop)) {
112111: 8b 45 14 mov 0x14(%ebp),%eax
112114: f6 40 14 01 testb $0x1,0x14(%eax)
112118: 0f 85 48 01 00 00 jne 112266 <pipe_write+0x1c6>
ret = -EAGAIN;
goto out_locked;
}
/* Wait until there is chunk bytes space or no reader exists */
pipe->waitingWriters ++;
11211e: ff 43 1c incl 0x1c(%ebx)
PIPE_UNLOCK(pipe);
112121: 83 ec 0c sub $0xc,%esp
112124: ff 73 28 pushl 0x28(%ebx)
112127: e8 a4 b4 ff ff call 10d5d0 <rtems_semaphore_release>
if (! PIPE_WRITEWAIT(pipe))
11212c: 58 pop %eax
11212d: 5a pop %edx
11212e: 6a 00 push $0x0
112130: ff 73 30 pushl 0x30(%ebx)
112133: e8 2c 17 00 00 call 113864 <rtems_barrier_wait>
112138: 83 c4 0c add $0xc,%esp
11213b: 83 f8 01 cmp $0x1,%eax
11213e: 19 ff sbb %edi,%edi
112140: f7 d7 not %edi
112142: 83 e7 fc and $0xfffffffc,%edi
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
112145: 6a 00 push $0x0
112147: 6a 00 push $0x0
112149: ff 73 28 pushl 0x28(%ebx)
11214c: e8 83 b3 ff ff call 10d4d4 <rtems_semaphore_obtain>
112151: 83 c4 10 add $0x10,%esp
112154: 85 c0 test %eax,%eax
112156: 0f 85 03 01 00 00 jne 11225f <pipe_write+0x1bf> <== NEVER TAKEN
/* WARN waitingWriters not restored! */
ret = -EINTR;
goto out_nolock;
}
pipe->waitingWriters --;
11215c: ff 4b 1c decl 0x1c(%ebx)
if (ret != 0)
11215f: 85 ff test %edi,%edi
112161: 0f 85 95 00 00 00 jne 1121fc <pipe_write+0x15c> <== NEVER TAKEN
goto out_locked;
if (pipe->Readers == 0) {
112167: 8b 7b 10 mov 0x10(%ebx),%edi
11216a: 85 ff test %edi,%edi
11216c: 0f 84 85 00 00 00 je 1121f7 <pipe_write+0x157> <== NEVER TAKEN
112172: 8b 4b 04 mov 0x4(%ebx),%ecx
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
while (PIPE_SPACE(pipe) < chunk) {
112175: 8b 43 0c mov 0xc(%ebx),%eax
112178: 89 ca mov %ecx,%edx
11217a: 29 c2 sub %eax,%edx
11217c: 39 f2 cmp %esi,%edx
11217e: 72 91 jb 112111 <pipe_write+0x71> <== NEVER TAKEN
ret = -EPIPE;
goto out_locked;
}
}
chunk = MIN(count - written, PIPE_SPACE(pipe));
112180: 8b 75 c8 mov -0x38(%ebp),%esi
112183: 2b 75 d0 sub -0x30(%ebp),%esi
112186: 89 55 cc mov %edx,-0x34(%ebp)
112189: 39 f2 cmp %esi,%edx
11218b: 76 03 jbe 112190 <pipe_write+0xf0>
11218d: 89 75 cc mov %esi,-0x34(%ebp)
chunk1 = pipe->Size - PIPE_WSTART(pipe);
112190: 03 43 08 add 0x8(%ebx),%eax
112193: 31 d2 xor %edx,%edx
112195: f7 f1 div %ecx
112197: 89 c8 mov %ecx,%eax
112199: 29 d0 sub %edx,%eax
if (chunk > chunk1) {
11219b: 39 45 cc cmp %eax,-0x34(%ebp)
11219e: 0f 8e c9 00 00 00 jle 11226d <pipe_write+0x1cd>
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk1);
1121a4: 03 13 add (%ebx),%edx
1121a6: 8b 75 0c mov 0xc(%ebp),%esi
1121a9: 03 75 d0 add -0x30(%ebp),%esi
1121ac: 89 d7 mov %edx,%edi
1121ae: 89 c1 mov %eax,%ecx
1121b0: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
memcpy(pipe->Buffer, buffer + written + chunk1, chunk - chunk1);
1121b2: 8b 13 mov (%ebx),%edx
1121b4: 8b 4d cc mov -0x34(%ebp),%ecx
1121b7: 29 c1 sub %eax,%ecx
1121b9: 03 45 d0 add -0x30(%ebp),%eax
1121bc: 8b 75 0c mov 0xc(%ebp),%esi
1121bf: 01 c6 add %eax,%esi
1121c1: 89 d7 mov %edx,%edi
1121c3: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
}
else
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk);
pipe->Length += chunk;
1121c5: 8b 45 cc mov -0x34(%ebp),%eax
1121c8: 01 43 0c add %eax,0xc(%ebx)
if (pipe->waitingReaders > 0)
1121cb: 83 7b 18 00 cmpl $0x0,0x18(%ebx)
1121cf: 0f 85 ac 00 00 00 jne 112281 <pipe_write+0x1e1>
PIPE_WAKEUPREADERS(pipe);
written += chunk;
1121d5: 8b 45 cc mov -0x34(%ebp),%eax
1121d8: 01 45 d4 add %eax,-0x2c(%ebp)
}
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
1121db: 8b 45 d4 mov -0x2c(%ebp),%eax
1121de: 89 45 d0 mov %eax,-0x30(%ebp)
1121e1: 39 45 c8 cmp %eax,-0x38(%ebp)
1121e4: 0f 86 ad 00 00 00 jbe 112297 <pipe_write+0x1f7> <== ALWAYS TAKEN
1121ea: 8b 4b 04 mov 0x4(%ebx),%ecx <== NOT EXECUTED
pipe->Length += chunk;
if (pipe->waitingReaders > 0)
PIPE_WAKEUPREADERS(pipe);
written += chunk;
/* Write of more than PIPE_BUF bytes can be interleaved */
chunk = 1;
1121ed: be 01 00 00 00 mov $0x1,%esi <== NOT EXECUTED
1121f2: e9 0f ff ff ff jmp 112106 <pipe_write+0x66> <== NOT EXECUTED
pipe->waitingWriters --;
if (ret != 0)
goto out_locked;
if (pipe->Readers == 0) {
ret = -EPIPE;
1121f7: bf e0 ff ff ff mov $0xffffffe0,%edi <== NOT EXECUTED
/* Write of more than PIPE_BUF bytes can be interleaved */
chunk = 1;
}
out_locked:
PIPE_UNLOCK(pipe);
1121fc: 83 ec 0c sub $0xc,%esp
1121ff: 8b 45 08 mov 0x8(%ebp),%eax
112202: ff 70 28 pushl 0x28(%eax)
112205: e8 c6 b3 ff ff call 10d5d0 <rtems_semaphore_release>
11220a: 83 c4 10 add $0x10,%esp
out_nolock:
#ifdef RTEMS_POSIX_API
/* Signal SIGPIPE */
if (ret == -EPIPE)
11220d: 83 ff e0 cmp $0xffffffe0,%edi
112210: 74 38 je 11224a <pipe_write+0x1aa>
kill(getpid(), SIGPIPE);
#endif
if (written > 0)
112212: 8b 4d d4 mov -0x2c(%ebp),%ecx
112215: 85 c9 test %ecx,%ecx
112217: 7e 12 jle 11222b <pipe_write+0x18b>
112219: 8b 45 d4 mov -0x2c(%ebp),%eax
11221c: e9 91 fe ff ff jmp 1120b2 <pipe_write+0x12>
/* Write nothing */
if (count == 0)
return 0;
if (! PIPE_LOCK(pipe))
return -EINTR;
112221: b8 fc ff ff ff mov $0xfffffffc,%eax <== NOT EXECUTED
112226: e9 87 fe ff ff jmp 1120b2 <pipe_write+0x12> <== NOT EXECUTED
/* Signal SIGPIPE */
if (ret == -EPIPE)
kill(getpid(), SIGPIPE);
#endif
if (written > 0)
11222b: 89 f8 mov %edi,%eax
11222d: e9 80 fe ff ff jmp 1120b2 <pipe_write+0x12>
ret = -EPIPE;
goto out_locked;
}
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
112232: be 01 00 00 00 mov $0x1,%esi <== NOT EXECUTED
112237: e9 b6 fe ff ff jmp 1120f2 <pipe_write+0x52> <== NOT EXECUTED
if (! PIPE_LOCK(pipe))
return -EINTR;
if (pipe->Readers == 0) {
ret = -EPIPE;
11223c: bf e0 ff ff ff mov $0xffffffe0,%edi
const void *buffer,
size_t count,
rtems_libio_t *iop
)
{
int chunk, chunk1, written = 0, ret = 0;
112241: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp)
112248: eb b2 jmp 1121fc <pipe_write+0x15c>
out_nolock:
#ifdef RTEMS_POSIX_API
/* Signal SIGPIPE */
if (ret == -EPIPE)
kill(getpid(), SIGPIPE);
11224a: e8 21 08 00 00 call 112a70 <getpid>
11224f: 83 ec 08 sub $0x8,%esp
112252: 6a 0d push $0xd
112254: 50 push %eax
112255: e8 1a 0b 00 00 call 112d74 <kill>
11225a: 83 c4 10 add $0x10,%esp
11225d: eb b3 jmp 112212 <pipe_write+0x172>
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
/* WARN waitingWriters not restored! */
ret = -EINTR;
11225f: bf fc ff ff ff mov $0xfffffffc,%edi <== NOT EXECUTED
112264: eb ac jmp 112212 <pipe_write+0x172> <== NOT EXECUTED
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
while (PIPE_SPACE(pipe) < chunk) {
if (LIBIO_NODELAY(iop)) {
ret = -EAGAIN;
112266: bf f5 ff ff ff mov $0xfffffff5,%edi
11226b: eb 8f jmp 1121fc <pipe_write+0x15c>
if (chunk > chunk1) {
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk1);
memcpy(pipe->Buffer, buffer + written + chunk1, chunk - chunk1);
}
else
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk);
11226d: 03 13 add (%ebx),%edx
11226f: 8b 75 0c mov 0xc(%ebp),%esi
112272: 03 75 d0 add -0x30(%ebp),%esi
112275: 89 d7 mov %edx,%edi
112277: 8b 4d cc mov -0x34(%ebp),%ecx
11227a: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
11227c: e9 44 ff ff ff jmp 1121c5 <pipe_write+0x125>
pipe->Length += chunk;
if (pipe->waitingReaders > 0)
PIPE_WAKEUPREADERS(pipe);
112281: 56 push %esi
112282: 56 push %esi
112283: 8d 45 e4 lea -0x1c(%ebp),%eax
112286: 50 push %eax
112287: ff 73 2c pushl 0x2c(%ebx)
11228a: e8 71 15 00 00 call 113800 <rtems_barrier_release>
11228f: 83 c4 10 add $0x10,%esp
112292: e9 3e ff ff ff jmp 1121d5 <pipe_write+0x135>
}
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
112297: 31 ff xor %edi,%edi
112299: e9 5e ff ff ff jmp 1121fc <pipe_write+0x15c>
0010bad0 <posix_memalign>:
int posix_memalign(
void **pointer,
size_t alignment,
size_t size
)
{
10bad0: 55 push %ebp
10bad1: 89 e5 mov %esp,%ebp
10bad3: 53 push %ebx
10bad4: 83 ec 04 sub $0x4,%esp
10bad7: 8b 45 0c mov 0xc(%ebp),%eax
/*
* Update call statistics
*/
MSBUMP(memalign_calls, 1);
10bada: ff 05 28 f2 12 00 incl 0x12f228
if (((alignment - 1) & alignment) != 0 || (alignment < sizeof(void *)))
10bae0: 8d 50 ff lea -0x1(%eax),%edx
10bae3: 85 c2 test %eax,%edx
10bae5: 75 05 jne 10baec <posix_memalign+0x1c> <== NEVER TAKEN
10bae7: 83 f8 03 cmp $0x3,%eax
10baea: 77 0c ja 10baf8 <posix_memalign+0x28>
/*
* rtems_memalign does all of the error checking work EXCEPT
* for adding restrictionso on the alignment.
*/
return rtems_memalign( pointer, alignment, size );
}
10baec: b8 16 00 00 00 mov $0x16,%eax
10baf1: 5a pop %edx
10baf2: 5b pop %ebx
10baf3: c9 leave
10baf4: c3 ret
10baf5: 8d 76 00 lea 0x0(%esi),%esi
10baf8: 59 pop %ecx
10baf9: 5b pop %ebx
10bafa: c9 leave
/*
* rtems_memalign does all of the error checking work EXCEPT
* for adding restrictionso on the alignment.
*/
return rtems_memalign( pointer, alignment, size );
10bafb: e9 78 01 00 00 jmp 10bc78 <rtems_memalign>
00110950 <pthread_attr_destroy>:
#include <rtems/system.h>
int pthread_attr_destroy(
pthread_attr_t *attr
)
{
110950: 55 push %ebp
110951: 89 e5 mov %esp,%ebp
110953: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || !attr->is_initialized )
110956: 85 c0 test %eax,%eax
110958: 74 12 je 11096c <pthread_attr_destroy+0x1c>
11095a: 8b 10 mov (%eax),%edx
11095c: 85 d2 test %edx,%edx
11095e: 74 0c je 11096c <pthread_attr_destroy+0x1c>
return EINVAL;
attr->is_initialized = false;
110960: c7 00 00 00 00 00 movl $0x0,(%eax)
return 0;
110966: 31 c0 xor %eax,%eax
}
110968: c9 leave
110969: c3 ret
11096a: 66 90 xchg %ax,%ax
int pthread_attr_destroy(
pthread_attr_t *attr
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
11096c: b8 16 00 00 00 mov $0x16,%eax
attr->is_initialized = false;
return 0;
}
110971: c9 leave
110972: c3 ret
00110ff0 <pthread_attr_getcputime>:
int pthread_attr_getcputime(
pthread_attr_t *attr,
int *clock_allowed
)
{
110ff0: 55 push %ebp
110ff1: 89 e5 mov %esp,%ebp
110ff3: 8b 45 08 mov 0x8(%ebp),%eax
110ff6: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized || !clock_allowed )
110ff9: 85 c0 test %eax,%eax
110ffb: 74 13 je 111010 <pthread_attr_getcputime+0x20><== NEVER TAKEN
110ffd: 8b 08 mov (%eax),%ecx
110fff: 85 c9 test %ecx,%ecx
111001: 74 0d je 111010 <pthread_attr_getcputime+0x20>
111003: 85 d2 test %edx,%edx
111005: 74 09 je 111010 <pthread_attr_getcputime+0x20>
return EINVAL;
*clock_allowed = attr->cputime_clock_allowed;
111007: 8b 40 38 mov 0x38(%eax),%eax
11100a: 89 02 mov %eax,(%edx)
return 0;
11100c: 31 c0 xor %eax,%eax
}
11100e: c9 leave
11100f: c3 ret
pthread_attr_t *attr,
int *clock_allowed
)
{
if ( !attr || !attr->is_initialized || !clock_allowed )
return EINVAL;
111010: b8 16 00 00 00 mov $0x16,%eax
*clock_allowed = attr->cputime_clock_allowed;
return 0;
}
111015: c9 leave
111016: c3 ret
00110a9c <pthread_attr_getstack>:
int pthread_attr_getstack(
const pthread_attr_t *attr,
void **stackaddr,
size_t *stacksize
)
{
110a9c: 55 push %ebp
110a9d: 89 e5 mov %esp,%ebp
110a9f: 53 push %ebx
110aa0: 8b 45 08 mov 0x8(%ebp),%eax
110aa3: 8b 55 0c mov 0xc(%ebp),%edx
110aa6: 8b 4d 10 mov 0x10(%ebp),%ecx
if ( !attr || !attr->is_initialized || !stackaddr || !stacksize )
110aa9: 85 c0 test %eax,%eax
110aab: 74 1f je 110acc <pthread_attr_getstack+0x30>
110aad: 8b 18 mov (%eax),%ebx
110aaf: 85 db test %ebx,%ebx
110ab1: 74 19 je 110acc <pthread_attr_getstack+0x30>
110ab3: 85 d2 test %edx,%edx
110ab5: 74 15 je 110acc <pthread_attr_getstack+0x30>
110ab7: 85 c9 test %ecx,%ecx
110ab9: 74 11 je 110acc <pthread_attr_getstack+0x30>
return EINVAL;
*stackaddr = attr->stackaddr;
110abb: 8b 58 04 mov 0x4(%eax),%ebx
110abe: 89 1a mov %ebx,(%edx)
*stacksize = attr->stacksize;
110ac0: 8b 40 08 mov 0x8(%eax),%eax
110ac3: 89 01 mov %eax,(%ecx)
return 0;
110ac5: 31 c0 xor %eax,%eax
}
110ac7: 5b pop %ebx
110ac8: c9 leave
110ac9: c3 ret
110aca: 66 90 xchg %ax,%ax
void **stackaddr,
size_t *stacksize
)
{
if ( !attr || !attr->is_initialized || !stackaddr || !stacksize )
return EINVAL;
110acc: b8 16 00 00 00 mov $0x16,%eax
*stackaddr = attr->stackaddr;
*stacksize = attr->stacksize;
return 0;
}
110ad1: 5b pop %ebx
110ad2: c9 leave
110ad3: c3 ret
00110b50 <pthread_attr_setguardsize>:
int pthread_attr_setguardsize(
pthread_attr_t *attr,
size_t guardsize
)
{
110b50: 55 push %ebp
110b51: 89 e5 mov %esp,%ebp
110b53: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || !attr->is_initialized )
110b56: 85 c0 test %eax,%eax
110b58: 74 12 je 110b6c <pthread_attr_setguardsize+0x1c>
110b5a: 8b 10 mov (%eax),%edx
110b5c: 85 d2 test %edx,%edx
110b5e: 74 0c je 110b6c <pthread_attr_setguardsize+0x1c>
return EINVAL;
attr->guardsize = guardsize;
110b60: 8b 55 0c mov 0xc(%ebp),%edx
110b63: 89 50 34 mov %edx,0x34(%eax)
return 0;
110b66: 31 c0 xor %eax,%eax
}
110b68: c9 leave
110b69: c3 ret
110b6a: 66 90 xchg %ax,%ax
pthread_attr_t *attr,
size_t guardsize
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
110b6c: b8 16 00 00 00 mov $0x16,%eax
attr->guardsize = guardsize;
return 0;
}
110b71: c9 leave
110b72: c3 ret
00111b5c <pthread_attr_setinheritsched>:
int pthread_attr_setinheritsched(
pthread_attr_t *attr,
int inheritsched
)
{
111b5c: 55 push %ebp
111b5d: 89 e5 mov %esp,%ebp
111b5f: 8b 45 08 mov 0x8(%ebp),%eax
111b62: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
111b65: 85 c0 test %eax,%eax
111b67: 74 1f je 111b88 <pthread_attr_setinheritsched+0x2c>
111b69: 8b 08 mov (%eax),%ecx
111b6b: 85 c9 test %ecx,%ecx
111b6d: 74 19 je 111b88 <pthread_attr_setinheritsched+0x2c>
return EINVAL;
switch ( inheritsched ) {
111b6f: 8d 4a ff lea -0x1(%edx),%ecx
111b72: 83 f9 01 cmp $0x1,%ecx
111b75: 76 09 jbe 111b80 <pthread_attr_setinheritsched+0x24>
case PTHREAD_EXPLICIT_SCHED:
attr->inheritsched = inheritsched;
return 0;
default:
return ENOTSUP;
111b77: b8 86 00 00 00 mov $0x86,%eax
}
}
111b7c: c9 leave
111b7d: c3 ret
111b7e: 66 90 xchg %ax,%ax
return EINVAL;
switch ( inheritsched ) {
case PTHREAD_INHERIT_SCHED:
case PTHREAD_EXPLICIT_SCHED:
attr->inheritsched = inheritsched;
111b80: 89 50 10 mov %edx,0x10(%eax)
return 0;
111b83: 31 c0 xor %eax,%eax
default:
return ENOTSUP;
}
}
111b85: c9 leave
111b86: c3 ret
111b87: 90 nop
pthread_attr_t *attr,
int inheritsched
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
111b88: b8 16 00 00 00 mov $0x16,%eax
return 0;
default:
return ENOTSUP;
}
}
111b8d: c9 leave
111b8e: c3 ret
00110ba8 <pthread_attr_setschedparam>:
int pthread_attr_setschedparam(
pthread_attr_t *attr,
const struct sched_param *param
)
{
110ba8: 55 push %ebp
110ba9: 89 e5 mov %esp,%ebp
110bab: 57 push %edi
110bac: 56 push %esi
110bad: 8b 7d 08 mov 0x8(%ebp),%edi
110bb0: 8b 75 0c mov 0xc(%ebp),%esi
if ( !attr || !attr->is_initialized || !param )
110bb3: 85 ff test %edi,%edi
110bb5: 74 1d je 110bd4 <pthread_attr_setschedparam+0x2c>
110bb7: 8b 07 mov (%edi),%eax
110bb9: 85 c0 test %eax,%eax
110bbb: 74 17 je 110bd4 <pthread_attr_setschedparam+0x2c>
110bbd: 85 f6 test %esi,%esi
110bbf: 74 13 je 110bd4 <pthread_attr_setschedparam+0x2c>
return EINVAL;
attr->schedparam = *param;
110bc1: 83 c7 18 add $0x18,%edi
110bc4: b9 07 00 00 00 mov $0x7,%ecx
110bc9: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return 0;
110bcb: 31 c0 xor %eax,%eax
}
110bcd: 5e pop %esi
110bce: 5f pop %edi
110bcf: c9 leave
110bd0: c3 ret
110bd1: 8d 76 00 lea 0x0(%esi),%esi
pthread_attr_t *attr,
const struct sched_param *param
)
{
if ( !attr || !attr->is_initialized || !param )
return EINVAL;
110bd4: b8 16 00 00 00 mov $0x16,%eax
attr->schedparam = *param;
return 0;
}
110bd9: 5e pop %esi
110bda: 5f pop %edi
110bdb: c9 leave
110bdc: c3 ret
00110be0 <pthread_attr_setschedpolicy>:
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
110be0: 55 push %ebp
110be1: 89 e5 mov %esp,%ebp
110be3: 8b 45 08 mov 0x8(%ebp),%eax
110be6: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
110be9: 85 c0 test %eax,%eax
110beb: 74 23 je 110c10 <pthread_attr_setschedpolicy+0x30>
110bed: 8b 08 mov (%eax),%ecx
110bef: 85 c9 test %ecx,%ecx
110bf1: 74 1d je 110c10 <pthread_attr_setschedpolicy+0x30>
return EINVAL;
switch ( policy ) {
110bf3: 85 d2 test %edx,%edx
110bf5: 78 0a js 110c01 <pthread_attr_setschedpolicy+0x21>
110bf7: 83 fa 02 cmp $0x2,%edx
110bfa: 7e 0c jle 110c08 <pthread_attr_setschedpolicy+0x28>
110bfc: 83 fa 04 cmp $0x4,%edx
110bff: 74 07 je 110c08 <pthread_attr_setschedpolicy+0x28><== ALWAYS TAKEN
case SCHED_SPORADIC:
attr->schedpolicy = policy;
return 0;
default:
return ENOTSUP;
110c01: b8 86 00 00 00 mov $0x86,%eax
}
}
110c06: c9 leave
110c07: c3 ret
switch ( policy ) {
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
case SCHED_SPORADIC:
attr->schedpolicy = policy;
110c08: 89 50 14 mov %edx,0x14(%eax)
return 0;
110c0b: 31 c0 xor %eax,%eax
default:
return ENOTSUP;
}
}
110c0d: c9 leave
110c0e: c3 ret
110c0f: 90 nop
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
110c10: b8 16 00 00 00 mov $0x16,%eax
return 0;
default:
return ENOTSUP;
}
}
110c15: c9 leave
110c16: c3 ret
00110c18 <pthread_attr_setscope>:
int pthread_attr_setscope(
pthread_attr_t *attr,
int contentionscope
)
{
110c18: 55 push %ebp
110c19: 89 e5 mov %esp,%ebp
110c1b: 8b 45 08 mov 0x8(%ebp),%eax
110c1e: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
110c21: 85 c0 test %eax,%eax
110c23: 74 1a je 110c3f <pthread_attr_setscope+0x27>
110c25: 8b 08 mov (%eax),%ecx
110c27: 85 c9 test %ecx,%ecx
110c29: 74 14 je 110c3f <pthread_attr_setscope+0x27>
return EINVAL;
switch ( contentionscope ) {
110c2b: 85 d2 test %edx,%edx
110c2d: 75 0d jne 110c3c <pthread_attr_setscope+0x24>
case PTHREAD_SCOPE_PROCESS:
attr->contentionscope = contentionscope;
110c2f: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
return 0;
110c36: 31 c0 xor %eax,%eax
return ENOTSUP;
default:
return EINVAL;
}
}
110c38: c9 leave
110c39: c3 ret
110c3a: 66 90 xchg %ax,%ax
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
switch ( contentionscope ) {
110c3c: 4a dec %edx
110c3d: 74 09 je 110c48 <pthread_attr_setscope+0x30>
case PTHREAD_SCOPE_SYSTEM:
return ENOTSUP;
default:
return EINVAL;
110c3f: b8 16 00 00 00 mov $0x16,%eax
}
}
110c44: c9 leave
110c45: c3 ret
110c46: 66 90 xchg %ax,%ax
case PTHREAD_SCOPE_PROCESS:
attr->contentionscope = contentionscope;
return 0;
case PTHREAD_SCOPE_SYSTEM:
return ENOTSUP;
110c48: b8 86 00 00 00 mov $0x86,%eax
default:
return EINVAL;
}
}
110c4d: c9 leave
110c4e: c3 ret
00110c74 <pthread_attr_setstack>:
int pthread_attr_setstack(
pthread_attr_t *attr,
void *stackaddr,
size_t stacksize
)
{
110c74: 55 push %ebp
110c75: 89 e5 mov %esp,%ebp
110c77: 8b 45 08 mov 0x8(%ebp),%eax
110c7a: 8b 55 10 mov 0x10(%ebp),%edx
if ( !attr || !attr->is_initialized )
110c7d: 85 c0 test %eax,%eax
110c7f: 74 27 je 110ca8 <pthread_attr_setstack+0x34>
110c81: 8b 08 mov (%eax),%ecx
110c83: 85 c9 test %ecx,%ecx
110c85: 74 21 je 110ca8 <pthread_attr_setstack+0x34>
return EINVAL;
if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
110c87: 8b 0d 78 e4 12 00 mov 0x12e478,%ecx
110c8d: d1 e1 shl %ecx
110c8f: 39 d1 cmp %edx,%ecx
110c91: 77 0d ja 110ca0 <pthread_attr_setstack+0x2c>
attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
else
attr->stacksize = stacksize;
110c93: 89 50 08 mov %edx,0x8(%eax)
attr->stackaddr = stackaddr;
110c96: 8b 55 0c mov 0xc(%ebp),%edx
110c99: 89 50 04 mov %edx,0x4(%eax)
return 0;
110c9c: 31 c0 xor %eax,%eax
}
110c9e: c9 leave
110c9f: c3 ret
{
if ( !attr || !attr->is_initialized )
return EINVAL;
if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
110ca0: 89 48 08 mov %ecx,0x8(%eax)
110ca3: eb f1 jmp 110c96 <pthread_attr_setstack+0x22>
110ca5: 8d 76 00 lea 0x0(%esi),%esi
void *stackaddr,
size_t stacksize
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
110ca8: b8 16 00 00 00 mov $0x16,%eax
else
attr->stacksize = stacksize;
attr->stackaddr = stackaddr;
return 0;
}
110cad: c9 leave
110cae: c3 ret
00110c50 <pthread_attr_setstackaddr>:
int pthread_attr_setstackaddr(
pthread_attr_t *attr,
void *stackaddr
)
{
110c50: 55 push %ebp
110c51: 89 e5 mov %esp,%ebp
110c53: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || !attr->is_initialized )
110c56: 85 c0 test %eax,%eax
110c58: 74 12 je 110c6c <pthread_attr_setstackaddr+0x1c>
110c5a: 8b 10 mov (%eax),%edx
110c5c: 85 d2 test %edx,%edx
110c5e: 74 0c je 110c6c <pthread_attr_setstackaddr+0x1c>
return EINVAL;
attr->stackaddr = stackaddr;
110c60: 8b 55 0c mov 0xc(%ebp),%edx
110c63: 89 50 04 mov %edx,0x4(%eax)
return 0;
110c66: 31 c0 xor %eax,%eax
}
110c68: c9 leave
110c69: c3 ret
110c6a: 66 90 xchg %ax,%ax
pthread_attr_t *attr,
void *stackaddr
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
110c6c: b8 16 00 00 00 mov $0x16,%eax
attr->stackaddr = stackaddr;
return 0;
}
110c71: c9 leave
110c72: c3 ret
00111b90 <pthread_attr_setstacksize>:
int pthread_attr_setstacksize(
pthread_attr_t *attr,
size_t stacksize
)
{
111b90: 55 push %ebp
111b91: 89 e5 mov %esp,%ebp
111b93: 8b 45 08 mov 0x8(%ebp),%eax
111b96: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
111b99: 85 c0 test %eax,%eax
111b9b: 74 23 je 111bc0 <pthread_attr_setstacksize+0x30>
111b9d: 8b 08 mov (%eax),%ecx
111b9f: 85 c9 test %ecx,%ecx
111ba1: 74 1d je 111bc0 <pthread_attr_setstacksize+0x30>
return EINVAL;
if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
111ba3: 8b 0d f8 4d 12 00 mov 0x124df8,%ecx
111ba9: d1 e1 shl %ecx
111bab: 39 d1 cmp %edx,%ecx
111bad: 77 09 ja 111bb8 <pthread_attr_setstacksize+0x28>
attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
else
attr->stacksize = stacksize;
111baf: 89 50 08 mov %edx,0x8(%eax)
return 0;
111bb2: 31 c0 xor %eax,%eax
}
111bb4: c9 leave
111bb5: c3 ret
111bb6: 66 90 xchg %ax,%ax
{
if ( !attr || !attr->is_initialized )
return EINVAL;
if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
111bb8: 89 48 08 mov %ecx,0x8(%eax)
else
attr->stacksize = stacksize;
return 0;
111bbb: 31 c0 xor %eax,%eax
}
111bbd: c9 leave
111bbe: c3 ret
111bbf: 90 nop
pthread_attr_t *attr,
size_t stacksize
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
111bc0: b8 16 00 00 00 mov $0x16,%eax
if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
else
attr->stacksize = stacksize;
return 0;
}
111bc5: c9 leave
111bc6: c3 ret
0010b99c <pthread_barrier_init>:
int pthread_barrier_init(
pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr,
unsigned int count
)
{
10b99c: 55 push %ebp
10b99d: 89 e5 mov %esp,%ebp
10b99f: 57 push %edi
10b9a0: 56 push %esi
10b9a1: 53 push %ebx
10b9a2: 83 ec 2c sub $0x2c,%esp
10b9a5: 8b 5d 08 mov 0x8(%ebp),%ebx
10b9a8: 8b 7d 0c mov 0xc(%ebp),%edi
10b9ab: 8b 75 10 mov 0x10(%ebp),%esi
const pthread_barrierattr_t *the_attr;
/*
* Error check parameters
*/
if ( !barrier )
10b9ae: 85 db test %ebx,%ebx
10b9b0: 0f 84 82 00 00 00 je 10ba38 <pthread_barrier_init+0x9c>
return EINVAL;
if ( count == 0 )
10b9b6: 85 f6 test %esi,%esi
10b9b8: 74 7e je 10ba38 <pthread_barrier_init+0x9c>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
10b9ba: 85 ff test %edi,%edi
10b9bc: 0f 84 92 00 00 00 je 10ba54 <pthread_barrier_init+0xb8>
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
10b9c2: 8b 17 mov (%edi),%edx
10b9c4: 85 d2 test %edx,%edx
10b9c6: 74 70 je 10ba38 <pthread_barrier_init+0x9c>
return EINVAL;
switch ( the_attr->process_shared ) {
10b9c8: 8b 47 04 mov 0x4(%edi),%eax
10b9cb: 85 c0 test %eax,%eax
10b9cd: 75 69 jne 10ba38 <pthread_barrier_init+0x9c><== NEVER TAKEN
}
/*
* Convert from POSIX attributes to Core Barrier attributes
*/
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
10b9cf: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
the_attributes.maximum_count = count;
10b9d6: 89 75 e4 mov %esi,-0x1c(%ebp)
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b9d9: a1 b0 95 12 00 mov 0x1295b0,%eax
10b9de: 40 inc %eax
10b9df: a3 b0 95 12 00 mov %eax,0x1295b0
* the inactive chain of free barrier control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Allocate( void )
{
return (POSIX_Barrier_Control *)
_Objects_Allocate( &_POSIX_Barrier_Information );
10b9e4: 83 ec 0c sub $0xc,%esp
10b9e7: 68 00 9a 12 00 push $0x129a00
10b9ec: e8 fb 20 00 00 call 10daec <_Objects_Allocate>
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
10b9f1: 83 c4 10 add $0x10,%esp
10b9f4: 85 c0 test %eax,%eax
10b9f6: 74 50 je 10ba48 <pthread_barrier_init+0xac>
_Thread_Enable_dispatch();
return EAGAIN;
}
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
10b9f8: 83 ec 08 sub $0x8,%esp
10b9fb: 8d 55 e0 lea -0x20(%ebp),%edx
10b9fe: 52 push %edx
10b9ff: 8d 50 10 lea 0x10(%eax),%edx
10ba02: 52 push %edx
10ba03: 89 45 d4 mov %eax,-0x2c(%ebp)
10ba06: e8 dd 16 00 00 call 10d0e8 <_CORE_barrier_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10ba0b: 8b 45 d4 mov -0x2c(%ebp),%eax
10ba0e: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10ba11: 0f b7 f2 movzwl %dx,%esi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10ba14: 8b 0d 1c 9a 12 00 mov 0x129a1c,%ecx
10ba1a: 89 04 b1 mov %eax,(%ecx,%esi,4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
10ba1d: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
);
/*
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
10ba24: 89 13 mov %edx,(%ebx)
_Thread_Enable_dispatch();
10ba26: e8 2d 30 00 00 call 10ea58 <_Thread_Enable_dispatch>
return 0;
10ba2b: 83 c4 10 add $0x10,%esp
10ba2e: 31 c0 xor %eax,%eax
}
10ba30: 8d 65 f4 lea -0xc(%ebp),%esp
10ba33: 5b pop %ebx
10ba34: 5e pop %esi
10ba35: 5f pop %edi
10ba36: c9 leave
10ba37: c3 ret
switch ( the_attr->process_shared ) {
case PTHREAD_PROCESS_PRIVATE: /* only supported values */
break;
case PTHREAD_PROCESS_SHARED:
default:
return EINVAL;
10ba38: b8 16 00 00 00 mov $0x16,%eax
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10ba3d: 8d 65 f4 lea -0xc(%ebp),%esp
10ba40: 5b pop %ebx
10ba41: 5e pop %esi
10ba42: 5f pop %edi
10ba43: c9 leave
10ba44: c3 ret
10ba45: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
_Thread_Enable_dispatch();
10ba48: e8 0b 30 00 00 call 10ea58 <_Thread_Enable_dispatch>
return EAGAIN;
10ba4d: b8 0b 00 00 00 mov $0xb,%eax
10ba52: eb e9 jmp 10ba3d <pthread_barrier_init+0xa1>
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
the_attr = attr;
} else {
(void) pthread_barrierattr_init( &my_attr );
10ba54: 83 ec 0c sub $0xc,%esp
10ba57: 8d 7d d8 lea -0x28(%ebp),%edi
10ba5a: 57 push %edi
10ba5b: e8 7c fe ff ff call 10b8dc <pthread_barrierattr_init>
10ba60: 83 c4 10 add $0x10,%esp
10ba63: e9 5a ff ff ff jmp 10b9c2 <pthread_barrier_init+0x26>
0010ba68 <pthread_barrier_wait>:
*/
int pthread_barrier_wait(
pthread_barrier_t *barrier
)
{
10ba68: 55 push %ebp
10ba69: 89 e5 mov %esp,%ebp
10ba6b: 83 ec 18 sub $0x18,%esp
10ba6e: 8b 45 08 mov 0x8(%ebp),%eax
POSIX_Barrier_Control *the_barrier = NULL;
Objects_Locations location;
if ( !barrier )
10ba71: 85 c0 test %eax,%eax
10ba73: 74 4f je 10bac4 <pthread_barrier_wait+0x5c>
RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Get (
pthread_barrier_t *barrier,
Objects_Locations *location
)
{
return (POSIX_Barrier_Control *) _Objects_Get(
10ba75: 51 push %ecx
return EINVAL;
the_barrier = _POSIX_Barrier_Get( barrier, &location );
10ba76: 8d 55 f4 lea -0xc(%ebp),%edx
10ba79: 52 push %edx
10ba7a: ff 30 pushl (%eax)
10ba7c: 68 00 9a 12 00 push $0x129a00
10ba81: e8 1e 25 00 00 call 10dfa4 <_Objects_Get>
switch ( location ) {
10ba86: 83 c4 10 add $0x10,%esp
10ba89: 8b 55 f4 mov -0xc(%ebp),%edx
10ba8c: 85 d2 test %edx,%edx
10ba8e: 75 34 jne 10bac4 <pthread_barrier_wait+0x5c>
case OBJECTS_LOCAL:
_CORE_barrier_Wait(
10ba90: 83 ec 0c sub $0xc,%esp
10ba93: 6a 00 push $0x0
10ba95: 6a 00 push $0x0
10ba97: 6a 01 push $0x1
10ba99: ff 70 08 pushl 0x8(%eax)
10ba9c: 83 c0 10 add $0x10,%eax
10ba9f: 50 push %eax
10baa0: e8 77 16 00 00 call 10d11c <_CORE_barrier_Wait>
the_barrier->Object.id,
true,
0,
NULL
);
_Thread_Enable_dispatch();
10baa5: 83 c4 20 add $0x20,%esp
10baa8: e8 ab 2f 00 00 call 10ea58 <_Thread_Enable_dispatch>
return _POSIX_Barrier_Translate_core_barrier_return_code(
10baad: 83 ec 0c sub $0xc,%esp
_Thread_Executing->Wait.return_code );
10bab0: a1 98 9b 12 00 mov 0x129b98,%eax
true,
0,
NULL
);
_Thread_Enable_dispatch();
return _POSIX_Barrier_Translate_core_barrier_return_code(
10bab5: ff 70 34 pushl 0x34(%eax)
10bab8: e8 e7 5b 00 00 call 1116a4 <_POSIX_Barrier_Translate_core_barrier_return_code>
10babd: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10bac0: c9 leave
10bac1: c3 ret
10bac2: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10bac4: b8 16 00 00 00 mov $0x16,%eax
}
10bac9: c9 leave
10baca: c3 ret
0010b894 <pthread_barrierattr_destroy>:
*/
int pthread_barrierattr_destroy(
pthread_barrierattr_t *attr
)
{
10b894: 55 push %ebp
10b895: 89 e5 mov %esp,%ebp
10b897: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || attr->is_initialized == false )
10b89a: 85 c0 test %eax,%eax
10b89c: 74 12 je 10b8b0 <pthread_barrierattr_destroy+0x1c>
10b89e: 8b 10 mov (%eax),%edx
10b8a0: 85 d2 test %edx,%edx
10b8a2: 74 0c je 10b8b0 <pthread_barrierattr_destroy+0x1c>
return EINVAL;
attr->is_initialized = false;
10b8a4: c7 00 00 00 00 00 movl $0x0,(%eax)
return 0;
10b8aa: 31 c0 xor %eax,%eax
}
10b8ac: c9 leave
10b8ad: c3 ret
10b8ae: 66 90 xchg %ax,%ax
int pthread_barrierattr_destroy(
pthread_barrierattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
return EINVAL;
10b8b0: b8 16 00 00 00 mov $0x16,%eax
attr->is_initialized = false;
return 0;
}
10b8b5: c9 leave
10b8b6: c3 ret
0010b134 <pthread_cancel>:
*/
int pthread_cancel(
pthread_t thread
)
{
10b134: 55 push %ebp
10b135: 89 e5 mov %esp,%ebp
10b137: 83 ec 18 sub $0x18,%esp
/*
* Don't even think about deleting a resource from an ISR.
*/
if ( _ISR_Is_in_progress() )
10b13a: a1 14 97 12 00 mov 0x129714,%eax
10b13f: 85 c0 test %eax,%eax
10b141: 74 09 je 10b14c <pthread_cancel+0x18>
return EPROTO;
10b143: b8 47 00 00 00 mov $0x47,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10b148: c9 leave
10b149: c3 ret
10b14a: 66 90 xchg %ax,%ax
pthread_t id,
Objects_Locations *location
)
{
return (Thread_Control *)
_Objects_Get( &_POSIX_Threads_Information, (Objects_Id)id, location );
10b14c: 51 push %ecx
*/
if ( _ISR_Is_in_progress() )
return EPROTO;
the_thread = _POSIX_Threads_Get( thread, &location );
10b14d: 8d 45 f4 lea -0xc(%ebp),%eax
10b150: 50 push %eax
10b151: ff 75 08 pushl 0x8(%ebp)
10b154: 68 00 94 12 00 push $0x129400
10b159: e8 2a 21 00 00 call 10d288 <_Objects_Get>
switch ( location ) {
10b15e: 83 c4 10 add $0x10,%esp
10b161: 8b 55 f4 mov -0xc(%ebp),%edx
10b164: 85 d2 test %edx,%edx
10b166: 75 20 jne 10b188 <pthread_cancel+0x54>
case OBJECTS_LOCAL:
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
thread_support->cancelation_requested = 1;
10b168: 8b 90 ec 00 00 00 mov 0xec(%eax),%edx
10b16e: c7 82 e0 00 00 00 01 movl $0x1,0xe0(%edx)
10b175: 00 00 00
/* This enables dispatch implicitly */
_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch( the_thread );
10b178: 83 ec 0c sub $0xc,%esp
10b17b: 50 push %eax
10b17c: e8 5b 55 00 00 call 1106dc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>
return 0;
10b181: 83 c4 10 add $0x10,%esp
10b184: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10b186: c9 leave
10b187: c3 ret
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10b188: b8 16 00 00 00 mov $0x16,%eax
}
10b18d: c9 leave
10b18e: c3 ret
0010afb4 <pthread_cleanup_pop>:
*/
void pthread_cleanup_pop(
int execute
)
{
10afb4: 55 push %ebp
10afb5: 89 e5 mov %esp,%ebp
10afb7: 57 push %edi
10afb8: 56 push %esi
10afb9: 53 push %ebx
10afba: 83 ec 0c sub $0xc,%esp
10afbd: 8b 5d 08 mov 0x8(%ebp),%ebx
POSIX_Cancel_Handler_control tmp_handler;
Chain_Control *handler_stack;
POSIX_API_Control *thread_support;
ISR_Level level;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
10afc0: a1 18 88 12 00 mov 0x128818,%eax
10afc5: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10afcb: 8b 15 30 82 12 00 mov 0x128230,%edx
10afd1: 42 inc %edx
10afd2: 89 15 30 82 12 00 mov %edx,0x128230
* ensure that we do not get prempted and deleted while we are holding
* memory that needs to be freed.
*/
_Thread_Disable_dispatch();
_ISR_Disable( level );
10afd8: 9c pushf
10afd9: fa cli
10afda: 5e pop %esi
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10afdb: 8d 90 e8 00 00 00 lea 0xe8(%eax),%edx
if ( _Chain_Is_empty( handler_stack ) ) {
10afe1: 39 90 e4 00 00 00 cmp %edx,0xe4(%eax)
10afe7: 74 47 je 10b030 <pthread_cleanup_pop+0x7c>
_Thread_Enable_dispatch();
_ISR_Enable( level );
return;
}
handler = (POSIX_Cancel_Handler_control *)
10afe9: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
10afef: 8b 08 mov (%eax),%ecx
previous = the_node->previous;
10aff1: 8b 50 04 mov 0x4(%eax),%edx
next->previous = previous;
10aff4: 89 51 04 mov %edx,0x4(%ecx)
previous->next = next;
10aff7: 89 0a mov %ecx,(%edx)
_Chain_Tail( handler_stack )->previous;
_Chain_Extract_unprotected( &handler->Node );
_ISR_Enable( level );
10aff9: 56 push %esi
10affa: 9d popf
10affb: 8b 70 08 mov 0x8(%eax),%esi
10affe: 8b 78 0c mov 0xc(%eax),%edi
tmp_handler = *handler;
_Workspace_Free( handler );
10b001: 83 ec 0c sub $0xc,%esp
10b004: 50 push %eax
10b005: e8 3a 3a 00 00 call 10ea44 <_Workspace_Free>
_Thread_Enable_dispatch();
10b00a: e8 ad 29 00 00 call 10d9bc <_Thread_Enable_dispatch>
if ( execute )
10b00f: 83 c4 10 add $0x10,%esp
10b012: 85 db test %ebx,%ebx
10b014: 75 0a jne 10b020 <pthread_cleanup_pop+0x6c>
(*tmp_handler.routine)( tmp_handler.arg );
}
10b016: 8d 65 f4 lea -0xc(%ebp),%esp
10b019: 5b pop %ebx
10b01a: 5e pop %esi
10b01b: 5f pop %edi
10b01c: c9 leave
10b01d: c3 ret
10b01e: 66 90 xchg %ax,%ax
_Workspace_Free( handler );
_Thread_Enable_dispatch();
if ( execute )
(*tmp_handler.routine)( tmp_handler.arg );
10b020: 89 7d 08 mov %edi,0x8(%ebp)
10b023: 89 f0 mov %esi,%eax
}
10b025: 8d 65 f4 lea -0xc(%ebp),%esp
10b028: 5b pop %ebx
10b029: 5e pop %esi
10b02a: 5f pop %edi
10b02b: c9 leave
_Workspace_Free( handler );
_Thread_Enable_dispatch();
if ( execute )
(*tmp_handler.routine)( tmp_handler.arg );
10b02c: ff e0 jmp *%eax
10b02e: 66 90 xchg %ax,%ax
_Thread_Disable_dispatch();
_ISR_Disable( level );
if ( _Chain_Is_empty( handler_stack ) ) {
_Thread_Enable_dispatch();
10b030: e8 87 29 00 00 call 10d9bc <_Thread_Enable_dispatch>
_ISR_Enable( level );
10b035: 56 push %esi
10b036: 9d popf
_Thread_Enable_dispatch();
if ( execute )
(*tmp_handler.routine)( tmp_handler.arg );
}
10b037: 8d 65 f4 lea -0xc(%ebp),%esp
10b03a: 5b pop %ebx
10b03b: 5e pop %esi
10b03c: 5f pop %edi
10b03d: c9 leave
10b03e: c3 ret
0010b360 <pthread_cleanup_push>:
void pthread_cleanup_push(
void (*routine)( void * ),
void *arg
)
{
10b360: 55 push %ebp
10b361: 89 e5 mov %esp,%ebp
10b363: 56 push %esi
10b364: 53 push %ebx
10b365: 8b 5d 08 mov 0x8(%ebp),%ebx
10b368: 8b 75 0c mov 0xc(%ebp),%esi
/*
* The POSIX standard does not address what to do when the routine
* is NULL. It also does not address what happens when we cannot
* allocate memory or anything else bad happens.
*/
if ( !routine )
10b36b: 85 db test %ebx,%ebx
10b36d: 74 4d je 10b3bc <pthread_cleanup_push+0x5c>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b36f: a1 d0 98 12 00 mov 0x1298d0,%eax
10b374: 40 inc %eax
10b375: a3 d0 98 12 00 mov %eax,0x1298d0
return;
_Thread_Disable_dispatch();
handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) );
10b37a: 83 ec 0c sub $0xc,%esp
10b37d: 6a 10 push $0x10
10b37f: e8 00 42 00 00 call 10f584 <_Workspace_Allocate>
if ( handler ) {
10b384: 83 c4 10 add $0x10,%esp
10b387: 85 c0 test %eax,%eax
10b389: 74 25 je 10b3b0 <pthread_cleanup_push+0x50><== NEVER TAKEN
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
10b38b: 8b 15 b8 9e 12 00 mov 0x129eb8,%edx
handler_stack = &thread_support->Cancellation_Handlers;
10b391: 8b 92 ec 00 00 00 mov 0xec(%edx),%edx
10b397: 81 c2 e4 00 00 00 add $0xe4,%edx
handler->routine = routine;
10b39d: 89 58 08 mov %ebx,0x8(%eax)
handler->arg = arg;
10b3a0: 89 70 0c mov %esi,0xc(%eax)
_Chain_Append( handler_stack, &handler->Node );
10b3a3: 83 ec 08 sub $0x8,%esp
10b3a6: 50 push %eax
10b3a7: 52 push %edx
10b3a8: e8 c3 17 00 00 call 10cb70 <_Chain_Append>
10b3ad: 83 c4 10 add $0x10,%esp
}
_Thread_Enable_dispatch();
}
10b3b0: 8d 65 f8 lea -0x8(%ebp),%esp
10b3b3: 5b pop %ebx
10b3b4: 5e pop %esi
10b3b5: c9 leave
handler->routine = routine;
handler->arg = arg;
_Chain_Append( handler_stack, &handler->Node );
}
_Thread_Enable_dispatch();
10b3b6: e9 cd 30 00 00 jmp 10e488 <_Thread_Enable_dispatch>
10b3bb: 90 nop
}
10b3bc: 8d 65 f8 lea -0x8(%ebp),%esp
10b3bf: 5b pop %ebx
10b3c0: 5e pop %esi
10b3c1: c9 leave
10b3c2: c3 ret
0010c054 <pthread_cond_destroy>:
*/
int pthread_cond_destroy(
pthread_cond_t *cond
)
{
10c054: 55 push %ebp
10c055: 89 e5 mov %esp,%ebp
10c057: 53 push %ebx
10c058: 83 ec 1c sub $0x1c,%esp
POSIX_Condition_variables_Control *the_cond;
Objects_Locations location;
the_cond = _POSIX_Condition_variables_Get( cond, &location );
10c05b: 8d 45 f4 lea -0xc(%ebp),%eax
10c05e: 50 push %eax
10c05f: ff 75 08 pushl 0x8(%ebp)
10c062: e8 65 00 00 00 call 10c0cc <_POSIX_Condition_variables_Get>
10c067: 89 c3 mov %eax,%ebx
switch ( location ) {
10c069: 83 c4 10 add $0x10,%esp
10c06c: 8b 4d f4 mov -0xc(%ebp),%ecx
10c06f: 85 c9 test %ecx,%ecx
10c071: 75 25 jne 10c098 <pthread_cond_destroy+0x44>
case OBJECTS_LOCAL:
if ( _Thread_queue_First( &the_cond->Wait_queue ) ) {
10c073: 83 ec 0c sub $0xc,%esp
10c076: 8d 40 18 lea 0x18(%eax),%eax
10c079: 50 push %eax
10c07a: e8 b9 3d 00 00 call 10fe38 <_Thread_queue_First>
10c07f: 83 c4 10 add $0x10,%esp
10c082: 85 c0 test %eax,%eax
10c084: 74 1e je 10c0a4 <pthread_cond_destroy+0x50>
_Thread_Enable_dispatch();
10c086: e8 95 36 00 00 call 10f720 <_Thread_Enable_dispatch>
return EBUSY;
10c08b: b8 10 00 00 00 mov $0x10,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c090: 8b 5d fc mov -0x4(%ebp),%ebx
10c093: c9 leave
10c094: c3 ret
10c095: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10c098: b8 16 00 00 00 mov $0x16,%eax
}
10c09d: 8b 5d fc mov -0x4(%ebp),%ebx
10c0a0: c9 leave
10c0a1: c3 ret
10c0a2: 66 90 xchg %ax,%ax
if ( _Thread_queue_First( &the_cond->Wait_queue ) ) {
_Thread_Enable_dispatch();
return EBUSY;
}
_Objects_Close(
10c0a4: 83 ec 08 sub $0x8,%esp
10c0a7: 53 push %ebx
10c0a8: 68 80 aa 12 00 push $0x12aa80
10c0ad: e8 7e 27 00 00 call 10e830 <_Objects_Close>
RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Free (
POSIX_Condition_variables_Control *the_condition_variable
)
{
_Objects_Free(
10c0b2: 58 pop %eax
10c0b3: 5a pop %edx
10c0b4: 53 push %ebx
10c0b5: 68 80 aa 12 00 push $0x12aa80
10c0ba: e8 6d 2a 00 00 call 10eb2c <_Objects_Free>
&_POSIX_Condition_variables_Information,
&the_cond->Object
);
_POSIX_Condition_variables_Free( the_cond );
_Thread_Enable_dispatch();
10c0bf: e8 5c 36 00 00 call 10f720 <_Thread_Enable_dispatch>
return 0;
10c0c4: 83 c4 10 add $0x10,%esp
10c0c7: 31 c0 xor %eax,%eax
10c0c9: eb d2 jmp 10c09d <pthread_cond_destroy+0x49>
0010c120 <pthread_cond_init>:
int pthread_cond_init(
pthread_cond_t *cond,
const pthread_condattr_t *attr
)
{
10c120: 55 push %ebp
10c121: 89 e5 mov %esp,%ebp
10c123: 53 push %ebx
10c124: 83 ec 14 sub $0x14,%esp
10c127: 8b 5d 0c mov 0xc(%ebp),%ebx
POSIX_Condition_variables_Control *the_cond;
const pthread_condattr_t *the_attr;
if ( attr ) the_attr = attr;
10c12a: 85 db test %ebx,%ebx
10c12c: 0f 84 86 00 00 00 je 10c1b8 <pthread_cond_init+0x98>
else the_attr = &_POSIX_Condition_variables_Default_attributes;
/*
* Be careful about attributes when global!!!
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
10c132: 83 7b 04 01 cmpl $0x1,0x4(%ebx)
10c136: 74 06 je 10c13e <pthread_cond_init+0x1e><== NEVER TAKEN
return EINVAL;
if ( !the_attr->is_initialized )
10c138: 8b 03 mov (%ebx),%eax
10c13a: 85 c0 test %eax,%eax
10c13c: 75 0a jne 10c148 <pthread_cond_init+0x28>
return EINVAL;
10c13e: b8 16 00 00 00 mov $0x16,%eax
*cond = the_cond->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10c143: 8b 5d fc mov -0x4(%ebp),%ebx
10c146: c9 leave
10c147: c3 ret
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10c148: a1 90 a5 12 00 mov 0x12a590,%eax
10c14d: 40 inc %eax
10c14e: a3 90 a5 12 00 mov %eax,0x12a590
RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control
*_POSIX_Condition_variables_Allocate( void )
{
return (POSIX_Condition_variables_Control *)
_Objects_Allocate( &_POSIX_Condition_variables_Information );
10c153: 83 ec 0c sub $0xc,%esp
10c156: 68 80 aa 12 00 push $0x12aa80
10c15b: e8 54 26 00 00 call 10e7b4 <_Objects_Allocate>
_Thread_Disable_dispatch();
the_cond = _POSIX_Condition_variables_Allocate();
if ( !the_cond ) {
10c160: 83 c4 10 add $0x10,%esp
10c163: 85 c0 test %eax,%eax
10c165: 74 5d je 10c1c4 <pthread_cond_init+0xa4>
_Thread_Enable_dispatch();
return ENOMEM;
}
the_cond->process_shared = the_attr->process_shared;
10c167: 8b 53 04 mov 0x4(%ebx),%edx
10c16a: 89 50 10 mov %edx,0x10(%eax)
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
10c16d: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax)
_Thread_queue_Initialize(
10c174: 6a 74 push $0x74
10c176: 68 00 08 00 10 push $0x10000800
10c17b: 6a 00 push $0x0
10c17d: 8d 50 18 lea 0x18(%eax),%edx
10c180: 52 push %edx
10c181: 89 45 f4 mov %eax,-0xc(%ebp)
10c184: e8 2b 3d 00 00 call 10feb4 <_Thread_queue_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10c189: 8b 45 f4 mov -0xc(%ebp),%eax
10c18c: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10c18f: 0f b7 da movzwl %dx,%ebx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10c192: 8b 0d 9c aa 12 00 mov 0x12aa9c,%ecx
10c198: 89 04 99 mov %eax,(%ecx,%ebx,4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
10c19b: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
&_POSIX_Condition_variables_Information,
&the_cond->Object,
0
);
*cond = the_cond->Object.id;
10c1a2: 8b 45 08 mov 0x8(%ebp),%eax
10c1a5: 89 10 mov %edx,(%eax)
_Thread_Enable_dispatch();
10c1a7: e8 74 35 00 00 call 10f720 <_Thread_Enable_dispatch>
return 0;
10c1ac: 83 c4 10 add $0x10,%esp
10c1af: 31 c0 xor %eax,%eax
}
10c1b1: 8b 5d fc mov -0x4(%ebp),%ebx
10c1b4: c9 leave
10c1b5: c3 ret
10c1b6: 66 90 xchg %ax,%ax
{
POSIX_Condition_variables_Control *the_cond;
const pthread_condattr_t *the_attr;
if ( attr ) the_attr = attr;
else the_attr = &_POSIX_Condition_variables_Default_attributes;
10c1b8: bb fc 3b 12 00 mov $0x123bfc,%ebx
10c1bd: e9 70 ff ff ff jmp 10c132 <pthread_cond_init+0x12>
10c1c2: 66 90 xchg %ax,%ax
_Thread_Disable_dispatch();
the_cond = _POSIX_Condition_variables_Allocate();
if ( !the_cond ) {
_Thread_Enable_dispatch();
10c1c4: e8 57 35 00 00 call 10f720 <_Thread_Enable_dispatch>
return ENOMEM;
10c1c9: b8 0c 00 00 00 mov $0xc,%eax
10c1ce: e9 70 ff ff ff jmp 10c143 <pthread_cond_init+0x23>
0010bfb0 <pthread_condattr_destroy>:
*/
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
10bfb0: 55 push %ebp
10bfb1: 89 e5 mov %esp,%ebp
10bfb3: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || attr->is_initialized == false )
10bfb6: 85 c0 test %eax,%eax
10bfb8: 74 12 je 10bfcc <pthread_condattr_destroy+0x1c>
10bfba: 8b 10 mov (%eax),%edx
10bfbc: 85 d2 test %edx,%edx
10bfbe: 74 0c je 10bfcc <pthread_condattr_destroy+0x1c><== NEVER TAKEN
return EINVAL;
attr->is_initialized = false;
10bfc0: c7 00 00 00 00 00 movl $0x0,(%eax)
return 0;
10bfc6: 31 c0 xor %eax,%eax
}
10bfc8: c9 leave
10bfc9: c3 ret
10bfca: 66 90 xchg %ax,%ax
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
return EINVAL;
10bfcc: b8 16 00 00 00 mov $0x16,%eax
attr->is_initialized = false;
return 0;
}
10bfd1: c9 leave
10bfd2: c3 ret
0010bfd4 <pthread_condattr_getpshared>:
int pthread_condattr_getpshared(
const pthread_condattr_t *attr,
int *pshared
)
{
10bfd4: 55 push %ebp
10bfd5: 89 e5 mov %esp,%ebp
10bfd7: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr )
10bfda: 85 c0 test %eax,%eax
10bfdc: 74 0e je 10bfec <pthread_condattr_getpshared+0x18>
return EINVAL;
*pshared = attr->process_shared;
10bfde: 8b 50 04 mov 0x4(%eax),%edx
10bfe1: 8b 45 0c mov 0xc(%ebp),%eax
10bfe4: 89 10 mov %edx,(%eax)
return 0;
10bfe6: 31 c0 xor %eax,%eax
}
10bfe8: c9 leave
10bfe9: c3 ret
10bfea: 66 90 xchg %ax,%ax
const pthread_condattr_t *attr,
int *pshared
)
{
if ( !attr )
return EINVAL;
10bfec: b8 16 00 00 00 mov $0x16,%eax
*pshared = attr->process_shared;
return 0;
}
10bff1: c9 leave
10bff2: c3 ret
0010bff4 <pthread_condattr_init>:
*/
int pthread_condattr_init(
pthread_condattr_t *attr
)
{
10bff4: 55 push %ebp
10bff5: 89 e5 mov %esp,%ebp
10bff7: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr )
10bffa: 85 c0 test %eax,%eax
10bffc: 74 16 je 10c014 <pthread_condattr_init+0x20><== NEVER TAKEN
return EINVAL;
*attr = _POSIX_Condition_variables_Default_attributes;
10bffe: 8b 15 fc 3b 12 00 mov 0x123bfc,%edx
10c004: 8b 0d 00 3c 12 00 mov 0x123c00,%ecx
10c00a: 89 10 mov %edx,(%eax)
10c00c: 89 48 04 mov %ecx,0x4(%eax)
return 0;
10c00f: 31 c0 xor %eax,%eax
}
10c011: c9 leave
10c012: c3 ret
10c013: 90 nop
int pthread_condattr_init(
pthread_condattr_t *attr
)
{
if ( !attr )
return EINVAL;
10c014: b8 16 00 00 00 mov $0x16,%eax
*attr = _POSIX_Condition_variables_Default_attributes;
return 0;
}
10c019: c9 leave
10c01a: c3 ret
0010c01c <pthread_condattr_setpshared>:
int pthread_condattr_setpshared(
pthread_condattr_t *attr,
int pshared
)
{
10c01c: 55 push %ebp
10c01d: 89 e5 mov %esp,%ebp
10c01f: 8b 45 08 mov 0x8(%ebp),%eax
10c022: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr )
10c025: 85 c0 test %eax,%eax
10c027: 74 05 je 10c02e <pthread_condattr_setpshared+0x12>
return EINVAL;
switch ( pshared ) {
10c029: 83 fa 01 cmp $0x1,%edx
10c02c: 76 0a jbe 10c038 <pthread_condattr_setpshared+0x1c>
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
return 0;
default:
return EINVAL;
10c02e: b8 16 00 00 00 mov $0x16,%eax
}
}
10c033: c9 leave
10c034: c3 ret
10c035: 8d 76 00 lea 0x0(%esi),%esi
return EINVAL;
switch ( pshared ) {
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
10c038: 89 50 04 mov %edx,0x4(%eax)
return 0;
10c03b: 31 c0 xor %eax,%eax
default:
return EINVAL;
}
}
10c03d: c9 leave
10c03e: c3 ret
0010b6d8 <pthread_create>:
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)( void * ),
void *arg
)
{
10b6d8: 55 push %ebp
10b6d9: 89 e5 mov %esp,%ebp
10b6db: 57 push %edi
10b6dc: 56 push %esi
10b6dd: 53 push %ebx
10b6de: 83 ec 5c sub $0x5c,%esp
10b6e1: 8b 5d 0c mov 0xc(%ebp),%ebx
int schedpolicy = SCHED_RR;
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
10b6e4: 8b 75 10 mov 0x10(%ebp),%esi
10b6e7: 85 f6 test %esi,%esi
10b6e9: 0f 84 8d 01 00 00 je 10b87c <pthread_create+0x1a4>
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
10b6ef: 85 db test %ebx,%ebx
10b6f1: 74 65 je 10b758 <pthread_create+0x80>
if ( !the_attr->is_initialized )
10b6f3: 8b 0b mov (%ebx),%ecx
10b6f5: 85 c9 test %ecx,%ecx
10b6f7: 74 1e je 10b717 <pthread_create+0x3f>
* stack space if it is allowed to allocate it itself.
*
* NOTE: If the user provides the stack we will let it drop below
* twice the minimum.
*/
if ( the_attr->stackaddr && !_Stack_Is_enough(the_attr->stacksize) )
10b6f9: 8b 53 04 mov 0x4(%ebx),%edx
10b6fc: 85 d2 test %edx,%edx
10b6fe: 74 0a je 10b70a <pthread_create+0x32>
10b700: a1 f8 4d 12 00 mov 0x124df8,%eax
10b705: 39 43 08 cmp %eax,0x8(%ebx)
10b708: 72 0d jb 10b717 <pthread_create+0x3f>
* If inheritsched is set to PTHREAD_INHERIT_SCHED, then this thread
* inherits scheduling attributes from the creating thread. If it is
* PTHREAD_EXPLICIT_SCHED, then scheduling parameters come from the
* attributes structure.
*/
switch ( the_attr->inheritsched ) {
10b70a: 8b 43 10 mov 0x10(%ebx),%eax
10b70d: 83 f8 01 cmp $0x1,%eax
10b710: 74 4e je 10b760 <pthread_create+0x88>
10b712: 83 f8 02 cmp $0x2,%eax
10b715: 74 11 je 10b728 <pthread_create+0x50>
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
return EINVAL;
10b717: ba 16 00 00 00 mov $0x16,%edx
*/
*thread = the_thread->Object.id;
_RTEMS_Unlock_allocator();
return 0;
}
10b71c: 89 d0 mov %edx,%eax
10b71e: 8d 65 f4 lea -0xc(%ebp),%esp
10b721: 5b pop %ebx
10b722: 5e pop %esi
10b723: 5f pop %edi
10b724: c9 leave
10b725: c3 ret
10b726: 66 90 xchg %ax,%ax
schedpolicy = api->schedpolicy;
schedparam = api->schedparam;
break;
case PTHREAD_EXPLICIT_SCHED:
schedpolicy = the_attr->schedpolicy;
10b728: 8b 4b 14 mov 0x14(%ebx),%ecx
10b72b: 89 4d b0 mov %ecx,-0x50(%ebp)
schedparam = the_attr->schedparam;
10b72e: 8d 45 c4 lea -0x3c(%ebp),%eax
10b731: 89 45 b4 mov %eax,-0x4c(%ebp)
10b734: 8d 73 18 lea 0x18(%ebx),%esi
10b737: b9 07 00 00 00 mov $0x7,%ecx
10b73c: 89 c7 mov %eax,%edi
10b73e: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/*
* Check the contentionscope since rtems only supports PROCESS wide
* contention (i.e. no system wide contention).
*/
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
10b740: 8b 43 0c mov 0xc(%ebx),%eax
10b743: 85 c0 test %eax,%eax
10b745: 74 49 je 10b790 <pthread_create+0xb8> <== ALWAYS TAKEN
return ENOTSUP;
10b747: ba 86 00 00 00 mov $0x86,%edx
*/
*thread = the_thread->Object.id;
_RTEMS_Unlock_allocator();
return 0;
}
10b74c: 89 d0 mov %edx,%eax
10b74e: 8d 65 f4 lea -0xc(%ebp),%esp
10b751: 5b pop %ebx
10b752: 5e pop %esi
10b753: 5f pop %edi
10b754: c9 leave
10b755: c3 ret
10b756: 66 90 xchg %ax,%ax
int rc;
if ( !start_routine )
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
10b758: bb a0 27 12 00 mov $0x1227a0,%ebx
10b75d: eb 94 jmp 10b6f3 <pthread_create+0x1b>
10b75f: 90 nop
* PTHREAD_EXPLICIT_SCHED, then scheduling parameters come from the
* attributes structure.
*/
switch ( the_attr->inheritsched ) {
case PTHREAD_INHERIT_SCHED:
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
10b760: a1 f8 96 12 00 mov 0x1296f8,%eax
10b765: 8b b0 ec 00 00 00 mov 0xec(%eax),%esi
schedpolicy = api->schedpolicy;
10b76b: 8b 8e 84 00 00 00 mov 0x84(%esi),%ecx
10b771: 89 4d b0 mov %ecx,-0x50(%ebp)
schedparam = api->schedparam;
10b774: 8d 45 c4 lea -0x3c(%ebp),%eax
10b777: 89 45 b4 mov %eax,-0x4c(%ebp)
10b77a: 81 c6 88 00 00 00 add $0x88,%esi
10b780: b9 07 00 00 00 mov $0x7,%ecx
10b785: 89 c7 mov %eax,%edi
10b787: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/*
* Check the contentionscope since rtems only supports PROCESS wide
* contention (i.e. no system wide contention).
*/
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
10b789: 8b 43 0c mov 0xc(%ebx),%eax
10b78c: 85 c0 test %eax,%eax
10b78e: 75 b7 jne 10b747 <pthread_create+0x6f>
return ENOTSUP;
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
10b790: 83 ec 0c sub $0xc,%esp
10b793: ff 75 c4 pushl -0x3c(%ebp)
10b796: e8 95 62 00 00 call 111a30 <_POSIX_Priority_Is_valid>
10b79b: 83 c4 10 add $0x10,%esp
10b79e: 84 c0 test %al,%al
10b7a0: 0f 84 71 ff ff ff je 10b717 <pthread_create+0x3f> <== NEVER TAKEN
return EINVAL;
core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
10b7a6: 8b 7d c4 mov -0x3c(%ebp),%edi
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
10b7a9: 0f b6 35 fc 4d 12 00 movzbl 0x124dfc,%esi
/*
* Set the core scheduling policy information.
*/
rc = _POSIX_Thread_Translate_sched_param(
10b7b0: 8d 45 e0 lea -0x20(%ebp),%eax
10b7b3: 50 push %eax
10b7b4: 8d 45 e4 lea -0x1c(%ebp),%eax
10b7b7: 50 push %eax
10b7b8: ff 75 b4 pushl -0x4c(%ebp)
10b7bb: ff 75 b0 pushl -0x50(%ebp)
10b7be: e8 89 62 00 00 call 111a4c <_POSIX_Thread_Translate_sched_param>
10b7c3: 89 c2 mov %eax,%edx
schedpolicy,
&schedparam,
&budget_algorithm,
&budget_callout
);
if ( rc )
10b7c5: 83 c4 10 add $0x10,%esp
10b7c8: 85 c0 test %eax,%eax
10b7ca: 0f 85 4c ff ff ff jne 10b71c <pthread_create+0x44>
#endif
/*
* Lock the allocator mutex for protection
*/
_RTEMS_Lock_allocator();
10b7d0: 83 ec 0c sub $0xc,%esp
10b7d3: ff 35 fc 91 12 00 pushl 0x1291fc
10b7d9: 89 45 a0 mov %eax,-0x60(%ebp)
10b7dc: e8 bf 17 00 00 call 10cfa0 <_API_Mutex_Lock>
* _POSIX_Threads_Allocate
*/
RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void )
{
return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information );
10b7e1: c7 04 24 e0 93 12 00 movl $0x1293e0,(%esp)
10b7e8: e8 d7 21 00 00 call 10d9c4 <_Objects_Allocate>
10b7ed: 89 45 ac mov %eax,-0x54(%ebp)
* Allocate the thread control block.
*
* NOTE: Global threads are not currently supported.
*/
the_thread = _POSIX_Threads_Allocate();
if ( !the_thread ) {
10b7f0: 83 c4 10 add $0x10,%esp
10b7f3: 85 c0 test %eax,%eax
10b7f5: 8b 55 a0 mov -0x60(%ebp),%edx
10b7f8: 0f 84 0f 01 00 00 je 10b90d <pthread_create+0x235>
/*
* Initialize the core thread for this task.
*/
name.name_p = NULL; /* posix threads don't have a name by default */
status = _Thread_Initialize(
10b7fe: 8b 4d e0 mov -0x20(%ebp),%ecx
10b801: 8b 45 e4 mov -0x1c(%ebp),%eax
10b804: 89 45 a4 mov %eax,-0x5c(%ebp)
10b807: 8b 43 08 mov 0x8(%ebx),%eax
10b80a: 89 45 a8 mov %eax,-0x58(%ebp)
10b80d: a1 f8 4d 12 00 mov 0x124df8,%eax
10b812: d1 e0 shl %eax
10b814: 3b 45 a8 cmp -0x58(%ebp),%eax
10b817: 73 03 jae 10b81c <pthread_create+0x144>
10b819: 8b 45 a8 mov -0x58(%ebp),%eax
10b81c: 83 ec 04 sub $0x4,%esp
10b81f: 6a 00 push $0x0
10b821: 6a 00 push $0x0
10b823: 51 push %ecx
10b824: ff 75 a4 pushl -0x5c(%ebp)
10b827: 6a 01 push $0x1
10b829: 81 e6 ff 00 00 00 and $0xff,%esi
10b82f: 29 fe sub %edi,%esi
10b831: 56 push %esi
10b832: 6a 01 push $0x1
10b834: 50 push %eax
10b835: ff 73 04 pushl 0x4(%ebx)
10b838: ff 75 ac pushl -0x54(%ebp)
10b83b: 68 e0 93 12 00 push $0x1293e0
10b840: 89 55 a0 mov %edx,-0x60(%ebp)
10b843: e8 80 31 00 00 call 10e9c8 <_Thread_Initialize>
budget_callout,
0, /* isr level */
name /* posix threads don't have a name */
);
if ( !status ) {
10b848: 83 c4 30 add $0x30,%esp
10b84b: 84 c0 test %al,%al
10b84d: 8b 55 a0 mov -0x60(%ebp),%edx
10b850: 75 34 jne 10b886 <pthread_create+0x1ae>
RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free (
Thread_Control *the_pthread
)
{
_Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object );
10b852: 83 ec 08 sub $0x8,%esp
10b855: ff 75 ac pushl -0x54(%ebp)
10b858: 68 e0 93 12 00 push $0x1293e0
10b85d: e8 da 24 00 00 call 10dd3c <_Objects_Free>
_POSIX_Threads_Free( the_thread );
_RTEMS_Unlock_allocator();
10b862: 59 pop %ecx
10b863: ff 35 fc 91 12 00 pushl 0x1291fc
10b869: e8 7a 17 00 00 call 10cfe8 <_API_Mutex_Unlock>
return EAGAIN;
10b86e: 83 c4 10 add $0x10,%esp
10b871: ba 0b 00 00 00 mov $0xb,%edx
10b876: e9 a1 fe ff ff jmp 10b71c <pthread_create+0x44>
10b87b: 90 nop
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
return EFAULT;
10b87c: ba 0e 00 00 00 mov $0xe,%edx
10b881: e9 96 fe ff ff jmp 10b71c <pthread_create+0x44>
}
/*
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10b886: 8b 4d ac mov -0x54(%ebp),%ecx
10b889: 8b 89 ec 00 00 00 mov 0xec(%ecx),%ecx
10b88f: 89 4d a8 mov %ecx,-0x58(%ebp)
api->Attributes = *the_attr;
10b892: b9 10 00 00 00 mov $0x10,%ecx
10b897: 8b 7d a8 mov -0x58(%ebp),%edi
10b89a: 89 de mov %ebx,%esi
10b89c: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
api->detachstate = the_attr->detachstate;
10b89e: 8b 43 3c mov 0x3c(%ebx),%eax
10b8a1: 8b 4d a8 mov -0x58(%ebp),%ecx
10b8a4: 89 41 40 mov %eax,0x40(%ecx)
api->schedpolicy = schedpolicy;
10b8a7: 8b 45 b0 mov -0x50(%ebp),%eax
10b8aa: 89 81 84 00 00 00 mov %eax,0x84(%ecx)
api->schedparam = schedparam;
10b8b0: 89 cf mov %ecx,%edi
10b8b2: 81 c7 88 00 00 00 add $0x88,%edi
10b8b8: b9 07 00 00 00 mov $0x7,%ecx
10b8bd: 8b 75 b4 mov -0x4c(%ebp),%esi
10b8c0: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
10b8c2: 83 ec 0c sub $0xc,%esp
10b8c5: 6a 00 push $0x0
10b8c7: ff 75 14 pushl 0x14(%ebp)
10b8ca: ff 75 10 pushl 0x10(%ebp)
10b8cd: 6a 01 push $0x1
10b8cf: ff 75 ac pushl -0x54(%ebp)
10b8d2: 89 55 a0 mov %edx,-0x60(%ebp)
10b8d5: e8 66 3a 00 00 call 10f340 <_Thread_Start>
_RTEMS_Unlock_allocator();
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
10b8da: 83 c4 20 add $0x20,%esp
10b8dd: 83 7d b0 04 cmpl $0x4,-0x50(%ebp)
10b8e1: 8b 55 a0 mov -0x60(%ebp),%edx
10b8e4: 74 42 je 10b928 <pthread_create+0x250>
}
/*
* Return the id and indicate we successfully created the thread
*/
*thread = the_thread->Object.id;
10b8e6: 8b 45 ac mov -0x54(%ebp),%eax
10b8e9: 8b 48 08 mov 0x8(%eax),%ecx
10b8ec: 8b 45 08 mov 0x8(%ebp),%eax
10b8ef: 89 08 mov %ecx,(%eax)
_RTEMS_Unlock_allocator();
10b8f1: 83 ec 0c sub $0xc,%esp
10b8f4: ff 35 fc 91 12 00 pushl 0x1291fc
10b8fa: 89 55 a0 mov %edx,-0x60(%ebp)
10b8fd: e8 e6 16 00 00 call 10cfe8 <_API_Mutex_Unlock>
return 0;
10b902: 83 c4 10 add $0x10,%esp
10b905: 8b 55 a0 mov -0x60(%ebp),%edx
10b908: e9 0f fe ff ff jmp 10b71c <pthread_create+0x44>
*
* NOTE: Global threads are not currently supported.
*/
the_thread = _POSIX_Threads_Allocate();
if ( !the_thread ) {
_RTEMS_Unlock_allocator();
10b90d: 83 ec 0c sub $0xc,%esp
10b910: ff 35 fc 91 12 00 pushl 0x1291fc
10b916: e8 cd 16 00 00 call 10cfe8 <_API_Mutex_Unlock>
return EAGAIN;
10b91b: 83 c4 10 add $0x10,%esp
10b91e: ba 0b 00 00 00 mov $0xb,%edx
10b923: e9 f4 fd ff ff jmp 10b71c <pthread_create+0x44>
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
_Watchdog_Insert_ticks(
10b928: 83 ec 0c sub $0xc,%esp
&api->Sporadic_timer,
_Timespec_To_ticks( &api->schedparam.sched_ss_repl_period )
10b92b: 8b 45 a8 mov -0x58(%ebp),%eax
10b92e: 05 90 00 00 00 add $0x90,%eax
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
_Watchdog_Insert_ticks(
10b933: 50 push %eax
10b934: e8 a3 3b 00 00 call 10f4dc <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10b939: 8b 4d a8 mov -0x58(%ebp),%ecx
10b93c: 89 81 b4 00 00 00 mov %eax,0xb4(%ecx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10b942: 58 pop %eax
10b943: 5a pop %edx
10b944: 89 c8 mov %ecx,%eax
10b946: 05 a8 00 00 00 add $0xa8,%eax
10b94b: 50 push %eax
10b94c: 68 1c 92 12 00 push $0x12921c
10b951: e8 b6 3e 00 00 call 10f80c <_Watchdog_Insert>
10b956: 83 c4 10 add $0x10,%esp
10b959: 8b 55 a0 mov -0x60(%ebp),%edx
10b95c: eb 88 jmp 10b8e6 <pthread_create+0x20e>
00112e78 <pthread_exit>:
}
void pthread_exit(
void *value_ptr
)
{
112e78: 55 push %ebp
112e79: 89 e5 mov %esp,%ebp
112e7b: 83 ec 10 sub $0x10,%esp
_POSIX_Thread_Exit( _Thread_Executing, value_ptr );
112e7e: ff 75 08 pushl 0x8(%ebp)
112e81: ff 35 18 84 12 00 pushl 0x128418
112e87: e8 88 ff ff ff call 112e14 <_POSIX_Thread_Exit>
112e8c: 83 c4 10 add $0x10,%esp
}
112e8f: c9 leave <== NOT EXECUTED
112e90: c3 ret <== NOT EXECUTED
0010d8d0 <pthread_getschedparam>:
int pthread_getschedparam(
pthread_t thread,
int *policy,
struct sched_param *param
)
{
10d8d0: 55 push %ebp
10d8d1: 89 e5 mov %esp,%ebp
10d8d3: 57 push %edi
10d8d4: 56 push %esi
10d8d5: 53 push %ebx
10d8d6: 83 ec 1c sub $0x1c,%esp
10d8d9: 8b 7d 0c mov 0xc(%ebp),%edi
10d8dc: 8b 5d 10 mov 0x10(%ebp),%ebx
Objects_Locations location;
POSIX_API_Control *api;
register Thread_Control *the_thread;
if ( !policy || !param )
10d8df: 85 ff test %edi,%edi
10d8e1: 74 69 je 10d94c <pthread_getschedparam+0x7c>
10d8e3: 85 db test %ebx,%ebx
10d8e5: 74 65 je 10d94c <pthread_getschedparam+0x7c>
pthread_t id,
Objects_Locations *location
)
{
return (Thread_Control *)
_Objects_Get( &_POSIX_Threads_Information, (Objects_Id)id, location );
10d8e7: 51 push %ecx
return EINVAL;
the_thread = _POSIX_Threads_Get( thread, &location );
10d8e8: 8d 45 e4 lea -0x1c(%ebp),%eax
10d8eb: 50 push %eax
10d8ec: ff 75 08 pushl 0x8(%ebp)
10d8ef: 68 60 d0 12 00 push $0x12d060
10d8f4: e8 07 24 00 00 call 10fd00 <_Objects_Get>
switch ( location ) {
10d8f9: 83 c4 10 add $0x10,%esp
10d8fc: 8b 55 e4 mov -0x1c(%ebp),%edx
10d8ff: 85 d2 test %edx,%edx
10d901: 75 39 jne 10d93c <pthread_getschedparam+0x6c>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10d903: 8b b0 ec 00 00 00 mov 0xec(%eax),%esi
if ( policy )
*policy = api->schedpolicy;
10d909: 8b 96 84 00 00 00 mov 0x84(%esi),%edx
10d90f: 89 17 mov %edx,(%edi)
if ( param ) {
*param = api->schedparam;
10d911: 81 c6 88 00 00 00 add $0x88,%esi
10d917: b9 07 00 00 00 mov $0x7,%ecx
10d91c: 89 df mov %ebx,%edi
10d91e: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
RTEMS_INLINE_ROUTINE int _POSIX_Priority_From_core(
Priority_Control priority
)
{
return (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
10d920: 0f b6 15 1c 8a 12 00 movzbl 0x128a1c,%edx
10d927: 2b 50 14 sub 0x14(%eax),%edx
10d92a: 89 13 mov %edx,(%ebx)
param->sched_priority =
_POSIX_Priority_From_core( the_thread->current_priority );
}
_Thread_Enable_dispatch();
10d92c: e8 83 2e 00 00 call 1107b4 <_Thread_Enable_dispatch>
return 0;
10d931: 31 c0 xor %eax,%eax
break;
}
return ESRCH;
}
10d933: 8d 65 f4 lea -0xc(%ebp),%esp
10d936: 5b pop %ebx
10d937: 5e pop %esi
10d938: 5f pop %edi
10d939: c9 leave
10d93a: c3 ret
10d93b: 90 nop
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
10d93c: b8 03 00 00 00 mov $0x3,%eax
}
10d941: 8d 65 f4 lea -0xc(%ebp),%esp
10d944: 5b pop %ebx
10d945: 5e pop %esi
10d946: 5f pop %edi
10d947: c9 leave
10d948: c3 ret
10d949: 8d 76 00 lea 0x0(%esi),%esi
Objects_Locations location;
POSIX_API_Control *api;
register Thread_Control *the_thread;
if ( !policy || !param )
return EINVAL;
10d94c: b8 16 00 00 00 mov $0x16,%eax
break;
}
return ESRCH;
}
10d951: 8d 65 f4 lea -0xc(%ebp),%esp
10d954: 5b pop %ebx
10d955: 5e pop %esi
10d956: 5f pop %edi
10d957: c9 leave
10d958: c3 ret
0010b6b8 <pthread_getspecific>:
*/
void *pthread_getspecific(
pthread_key_t key
)
{
10b6b8: 55 push %ebp
10b6b9: 89 e5 mov %esp,%ebp
10b6bb: 83 ec 2c sub $0x2c,%esp
uint32_t api;
uint32_t index;
Objects_Locations location;
void *key_data;
the_key = _POSIX_Keys_Get( key, &location );
10b6be: 8d 45 f4 lea -0xc(%ebp),%eax
pthread_key_t id,
Objects_Locations *location
)
{
return (POSIX_Keys_Control *)
_Objects_Get( &_POSIX_Keys_Information, (Objects_Id) id, location );
10b6c1: 50 push %eax
10b6c2: ff 75 08 pushl 0x8(%ebp)
10b6c5: 68 e0 a1 12 00 push $0x12a1e0
10b6ca: e8 a5 25 00 00 call 10dc74 <_Objects_Get>
switch ( location ) {
10b6cf: 83 c4 10 add $0x10,%esp
10b6d2: 8b 55 f4 mov -0xc(%ebp),%edx
10b6d5: 85 d2 test %edx,%edx
10b6d7: 75 2b jne 10b704 <pthread_getspecific+0x4c>
case OBJECTS_LOCAL:
api = _Objects_Get_API( _Thread_Executing->Object.id );
10b6d9: 8b 15 18 a3 12 00 mov 0x12a318,%edx
10b6df: 8b 4a 08 mov 0x8(%edx),%ecx
*/
RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API(
Objects_Id id
)
{
return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS);
10b6e2: 89 ca mov %ecx,%edx
10b6e4: c1 ea 18 shr $0x18,%edx
10b6e7: 83 e2 07 and $0x7,%edx
index = _Objects_Get_index( _Thread_Executing->Object.id );
10b6ea: 0f b7 c9 movzwl %cx,%ecx
key_data = (void *) the_key->Values[ api ][ index ];
10b6ed: 8b 44 90 14 mov 0x14(%eax,%edx,4),%eax
10b6f1: 8b 04 88 mov (%eax,%ecx,4),%eax
_Thread_Enable_dispatch();
10b6f4: 89 45 e4 mov %eax,-0x1c(%ebp)
10b6f7: e8 2c 30 00 00 call 10e728 <_Thread_Enable_dispatch>
return key_data;
10b6fc: 8b 45 e4 mov -0x1c(%ebp),%eax
case OBJECTS_ERROR:
break;
}
return NULL;
}
10b6ff: c9 leave
10b700: c3 ret
10b701: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return NULL;
10b704: 31 c0 xor %eax,%eax
}
10b706: c9 leave
10b707: c3 ret
00111118 <pthread_join>:
int pthread_join(
pthread_t thread,
void **value_ptr
)
{
111118: 55 push %ebp
111119: 89 e5 mov %esp,%ebp
11111b: 53 push %ebx
11111c: 83 ec 18 sub $0x18,%esp
11111f: 8b 5d 0c mov 0xc(%ebp),%ebx
register Thread_Control *the_thread;
POSIX_API_Control *api;
Objects_Locations location;
void *return_pointer;
the_thread = _POSIX_Threads_Get( thread, &location );
111122: 8d 45 f4 lea -0xc(%ebp),%eax
111125: 50 push %eax
111126: ff 75 08 pushl 0x8(%ebp)
111129: 68 00 2b 13 00 push $0x132b00
11112e: e8 11 24 00 00 call 113544 <_Objects_Get>
switch ( location ) {
111133: 83 c4 10 add $0x10,%esp
111136: 8b 55 f4 mov -0xc(%ebp),%edx
111139: 85 d2 test %edx,%edx
11113b: 74 0b je 111148 <pthread_join+0x30>
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
11113d: b8 03 00 00 00 mov $0x3,%eax
}
111142: 8b 5d fc mov -0x4(%ebp),%ebx
111145: c9 leave
111146: c3 ret
111147: 90 nop
the_thread = _POSIX_Threads_Get( thread, &location );
switch ( location ) {
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
111148: 8b 90 ec 00 00 00 mov 0xec(%eax),%edx
if ( api->detachstate == PTHREAD_CREATE_DETACHED ) {
11114e: 8b 4a 40 mov 0x40(%edx),%ecx
111151: 85 c9 test %ecx,%ecx
111153: 74 43 je 111198 <pthread_join+0x80>
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
111155: 8b 0d 18 2e 13 00 mov 0x132e18,%ecx
_Thread_Enable_dispatch();
return EINVAL;
}
if ( _Thread_Is_executing( the_thread ) ) {
11115b: 39 c8 cmp %ecx,%eax
11115d: 74 49 je 1111a8 <pthread_join+0x90>
/*
* Put ourself on the threads join list
*/
_Thread_Executing->Wait.return_argument = &return_pointer;
11115f: 8d 45 f0 lea -0x10(%ebp),%eax
111162: 89 41 28 mov %eax,0x28(%ecx)
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
111165: c7 42 74 01 00 00 00 movl $0x1,0x74(%edx)
_Thread_queue_Enter_critical_section( &api->Join_List );
_Thread_queue_Enqueue( &api->Join_List, WATCHDOG_NO_TIMEOUT );
11116c: 50 push %eax
11116d: 68 00 48 11 00 push $0x114800
111172: 6a 00 push $0x0
111174: 83 c2 44 add $0x44,%edx
111177: 52 push %edx
111178: e8 57 33 00 00 call 1144d4 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
11117d: e8 76 2e 00 00 call 113ff8 <_Thread_Enable_dispatch>
if ( value_ptr )
111182: 83 c4 10 add $0x10,%esp
111185: 85 db test %ebx,%ebx
111187: 74 2b je 1111b4 <pthread_join+0x9c>
*value_ptr = return_pointer;
111189: 8b 45 f0 mov -0x10(%ebp),%eax
11118c: 89 03 mov %eax,(%ebx)
return 0;
11118e: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
111190: 8b 5d fc mov -0x4(%ebp),%ebx
111193: c9 leave
111194: c3 ret
111195: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( api->detachstate == PTHREAD_CREATE_DETACHED ) {
_Thread_Enable_dispatch();
111198: e8 5b 2e 00 00 call 113ff8 <_Thread_Enable_dispatch>
return EINVAL;
11119d: b8 16 00 00 00 mov $0x16,%eax
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
1111a2: 8b 5d fc mov -0x4(%ebp),%ebx
1111a5: c9 leave
1111a6: c3 ret
1111a7: 90 nop
_Thread_Enable_dispatch();
return EINVAL;
}
if ( _Thread_Is_executing( the_thread ) ) {
_Thread_Enable_dispatch();
1111a8: e8 4b 2e 00 00 call 113ff8 <_Thread_Enable_dispatch>
return EDEADLK;
1111ad: b8 2d 00 00 00 mov $0x2d,%eax
1111b2: eb 8e jmp 111142 <pthread_join+0x2a>
_Thread_Enable_dispatch();
if ( value_ptr )
*value_ptr = return_pointer;
return 0;
1111b4: 31 c0 xor %eax,%eax
1111b6: eb 8a jmp 111142 <pthread_join+0x2a>
0010b544 <pthread_key_create>:
int pthread_key_create(
pthread_key_t *key,
void (*destructor)( void * )
)
{
10b544: 55 push %ebp
10b545: 89 e5 mov %esp,%ebp
10b547: 57 push %edi
10b548: 56 push %esi
10b549: 53 push %ebx
10b54a: 83 ec 28 sub $0x28,%esp
10b54d: a1 30 9d 12 00 mov 0x129d30,%eax
10b552: 40 inc %eax
10b553: a3 30 9d 12 00 mov %eax,0x129d30
* 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 );
10b558: 68 e0 a1 12 00 push $0x12a1e0
10b55d: e8 5a 22 00 00 call 10d7bc <_Objects_Allocate>
10b562: 89 c6 mov %eax,%esi
_Thread_Disable_dispatch();
the_key = _POSIX_Keys_Allocate();
if ( !the_key ) {
10b564: 83 c4 10 add $0x10,%esp
10b567: 85 c0 test %eax,%eax
10b569: 74 79 je 10b5e4 <pthread_key_create+0xa0>
_Thread_Enable_dispatch();
return EAGAIN;
}
the_key->destructor = destructor;
10b56b: 8b 45 0c mov 0xc(%ebp),%eax
10b56e: 89 46 10 mov %eax,0x10(%esi)
* This is a bit more complex than one might initially expect because
* APIs are optional.
*
* NOTE: Currently RTEMS Classic API tasks are always enabled.
*/
for ( the_api = 1; the_api <= OBJECTS_APIS_LAST; the_api++ ) {
10b571: bb 01 00 00 00 mov $0x1,%ebx
the_key->Values[ the_api ] = NULL;
10b576: c7 44 9e 14 00 00 00 movl $0x0,0x14(%esi,%ebx,4)
10b57d: 00
INTERNAL_ERROR_IMPLEMENTATION_KEY_CREATE_INCONSISTENCY
);
#endif
bytes_to_allocate = sizeof( void * ) *
(_Objects_Information_table[ the_api ][ 1 ]->maximum + 1);
10b57e: 8b 04 9d 08 9d 12 00 mov 0x129d08(,%ebx,4),%eax
10b585: 8b 40 04 mov 0x4(%eax),%eax
10b588: 0f b7 40 10 movzwl 0x10(%eax),%eax
true,
INTERNAL_ERROR_IMPLEMENTATION_KEY_CREATE_INCONSISTENCY
);
#endif
bytes_to_allocate = sizeof( void * ) *
10b58c: 8d 0c 85 04 00 00 00 lea 0x4(,%eax,4),%ecx
(_Objects_Information_table[ the_api ][ 1 ]->maximum + 1);
table = _Workspace_Allocate( bytes_to_allocate );
10b593: 83 ec 0c sub $0xc,%esp
10b596: 51 push %ecx
10b597: 89 4d e4 mov %ecx,-0x1c(%ebp)
10b59a: e8 fd 42 00 00 call 10f89c <_Workspace_Allocate>
if ( !table ) {
10b59f: 83 c4 10 add $0x10,%esp
10b5a2: 85 c0 test %eax,%eax
10b5a4: 8b 4d e4 mov -0x1c(%ebp),%ecx
10b5a7: 74 4f je 10b5f8 <pthread_key_create+0xb4>
_POSIX_Keys_Free( the_key );
_Thread_Enable_dispatch();
return ENOMEM;
}
the_key->Values[ the_api ] = table;
10b5a9: 89 44 9e 14 mov %eax,0x14(%esi,%ebx,4)
memset( table, '\0', bytes_to_allocate );
10b5ad: 89 c7 mov %eax,%edi
10b5af: 31 c0 xor %eax,%eax
10b5b1: f3 aa rep stos %al,%es:(%edi)
* This is a bit more complex than one might initially expect because
* APIs are optional.
*
* NOTE: Currently RTEMS Classic API tasks are always enabled.
*/
for ( the_api = 1; the_api <= OBJECTS_APIS_LAST; the_api++ ) {
10b5b3: 43 inc %ebx
10b5b4: 83 fb 04 cmp $0x4,%ebx
10b5b7: 75 bd jne 10b576 <pthread_key_create+0x32>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10b5b9: 8b 46 08 mov 0x8(%esi),%eax
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10b5bc: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10b5bf: 8b 15 fc a1 12 00 mov 0x12a1fc,%edx
10b5c5: 89 34 8a mov %esi,(%edx,%ecx,4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
10b5c8: c7 46 0c 00 00 00 00 movl $0x0,0xc(%esi)
the_key->Values[ the_api ] = table;
memset( table, '\0', bytes_to_allocate );
}
_Objects_Open_u32( &_POSIX_Keys_Information, &the_key->Object, 0 );
*key = the_key->Object.id;
10b5cf: 8b 55 08 mov 0x8(%ebp),%edx
10b5d2: 89 02 mov %eax,(%edx)
_Thread_Enable_dispatch();
10b5d4: e8 4f 31 00 00 call 10e728 <_Thread_Enable_dispatch>
return 0;
10b5d9: 31 c0 xor %eax,%eax
}
10b5db: 8d 65 f4 lea -0xc(%ebp),%esp
10b5de: 5b pop %ebx
10b5df: 5e pop %esi
10b5e0: 5f pop %edi
10b5e1: c9 leave
10b5e2: c3 ret
10b5e3: 90 nop
_Thread_Disable_dispatch();
the_key = _POSIX_Keys_Allocate();
if ( !the_key ) {
_Thread_Enable_dispatch();
10b5e4: e8 3f 31 00 00 call 10e728 <_Thread_Enable_dispatch>
return EAGAIN;
10b5e9: b8 0b 00 00 00 mov $0xb,%eax
_Objects_Open_u32( &_POSIX_Keys_Information, &the_key->Object, 0 );
*key = the_key->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10b5ee: 8d 65 f4 lea -0xc(%ebp),%esp
10b5f1: 5b pop %ebx
10b5f2: 5e pop %esi
10b5f3: 5f pop %edi
10b5f4: c9 leave
10b5f5: c3 ret
10b5f6: 66 90 xchg %ax,%ax
bytes_to_allocate = sizeof( void * ) *
(_Objects_Information_table[ the_api ][ 1 ]->maximum + 1);
table = _Workspace_Allocate( bytes_to_allocate );
if ( !table ) {
_POSIX_Keys_Free_memory( the_key );
10b5f8: 83 ec 0c sub $0xc,%esp
10b5fb: 56 push %esi
10b5fc: e8 87 00 00 00 call 10b688 <_POSIX_Keys_Free_memory>
*/
RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free (
POSIX_Keys_Control *the_key
)
{
_Objects_Free( &_POSIX_Keys_Information, &the_key->Object );
10b601: 58 pop %eax
10b602: 5a pop %edx
10b603: 56 push %esi
10b604: 68 e0 a1 12 00 push $0x12a1e0
10b609: e8 26 25 00 00 call 10db34 <_Objects_Free>
_POSIX_Keys_Free( the_key );
_Thread_Enable_dispatch();
10b60e: e8 15 31 00 00 call 10e728 <_Thread_Enable_dispatch>
return ENOMEM;
10b613: 83 c4 10 add $0x10,%esp
10b616: b8 0c 00 00 00 mov $0xc,%eax
_Objects_Open_u32( &_POSIX_Keys_Information, &the_key->Object, 0 );
*key = the_key->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10b61b: 8d 65 f4 lea -0xc(%ebp),%esp
10b61e: 5b pop %ebx
10b61f: 5e pop %esi
10b620: 5f pop %edi
10b621: c9 leave
10b622: c3 ret
0010b624 <pthread_key_delete>:
* 17.1.3 Thread-Specific Data Key Deletion, P1003.1c/Draft 10, p. 167
*/
int pthread_key_delete(
pthread_key_t key
)
{
10b624: 55 push %ebp
10b625: 89 e5 mov %esp,%ebp
10b627: 53 push %ebx
10b628: 83 ec 18 sub $0x18,%esp
POSIX_Keys_Control *the_key;
Objects_Locations location;
the_key = _POSIX_Keys_Get( key, &location );
10b62b: 8d 45 f4 lea -0xc(%ebp),%eax
pthread_key_t id,
Objects_Locations *location
)
{
return (POSIX_Keys_Control *)
_Objects_Get( &_POSIX_Keys_Information, (Objects_Id) id, location );
10b62e: 50 push %eax
10b62f: ff 75 08 pushl 0x8(%ebp)
10b632: 68 e0 a1 12 00 push $0x12a1e0
10b637: e8 38 26 00 00 call 10dc74 <_Objects_Get>
10b63c: 89 c3 mov %eax,%ebx
switch ( location ) {
10b63e: 83 c4 10 add $0x10,%esp
10b641: 8b 4d f4 mov -0xc(%ebp),%ecx
10b644: 85 c9 test %ecx,%ecx
10b646: 75 34 jne 10b67c <pthread_key_delete+0x58>
case OBJECTS_LOCAL:
_Objects_Close( &_POSIX_Keys_Information, &the_key->Object );
10b648: 83 ec 08 sub $0x8,%esp
10b64b: 50 push %eax
10b64c: 68 e0 a1 12 00 push $0x12a1e0
10b651: e8 e2 21 00 00 call 10d838 <_Objects_Close>
_POSIX_Keys_Free_memory( the_key );
10b656: 89 1c 24 mov %ebx,(%esp)
10b659: e8 2a 00 00 00 call 10b688 <_POSIX_Keys_Free_memory>
*/
RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free (
POSIX_Keys_Control *the_key
)
{
_Objects_Free( &_POSIX_Keys_Information, &the_key->Object );
10b65e: 58 pop %eax
10b65f: 5a pop %edx
10b660: 53 push %ebx
10b661: 68 e0 a1 12 00 push $0x12a1e0
10b666: e8 c9 24 00 00 call 10db34 <_Objects_Free>
/*
* NOTE: The destructor is not called and it is the responsibility
* of the application to free the memory.
*/
_POSIX_Keys_Free( the_key );
_Thread_Enable_dispatch();
10b66b: e8 b8 30 00 00 call 10e728 <_Thread_Enable_dispatch>
return 0;
10b670: 83 c4 10 add $0x10,%esp
10b673: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10b675: 8b 5d fc mov -0x4(%ebp),%ebx
10b678: c9 leave
10b679: c3 ret
10b67a: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10b67c: b8 16 00 00 00 mov $0x16,%eax
}
10b681: 8b 5d fc mov -0x4(%ebp),%ebx
10b684: c9 leave
10b685: c3 ret
00124e3c <pthread_kill>:
int pthread_kill(
pthread_t thread,
int sig
)
{
124e3c: 55 push %ebp
124e3d: 89 e5 mov %esp,%ebp
124e3f: 57 push %edi
124e40: 56 push %esi
124e41: 53 push %ebx
124e42: 83 ec 1c sub $0x1c,%esp
124e45: 8b 5d 0c mov 0xc(%ebp),%ebx
POSIX_API_Control *api;
Thread_Control *the_thread;
Objects_Locations location;
if ( !sig )
124e48: 85 db test %ebx,%ebx
124e4a: 0f 84 84 00 00 00 je 124ed4 <pthread_kill+0x98>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
124e50: 8d 7b ff lea -0x1(%ebx),%edi
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
124e53: 83 ff 1f cmp $0x1f,%edi
124e56: 77 7c ja 124ed4 <pthread_kill+0x98>
pthread_t id,
Objects_Locations *location
)
{
return (Thread_Control *)
_Objects_Get( &_POSIX_Threads_Information, (Objects_Id)id, location );
124e58: 56 push %esi
rtems_set_errno_and_return_minus_one( EINVAL );
the_thread = _POSIX_Threads_Get( thread, &location );
124e59: 8d 45 e4 lea -0x1c(%ebp),%eax
124e5c: 50 push %eax
124e5d: ff 75 08 pushl 0x8(%ebp)
124e60: 68 60 ee 12 00 push $0x12ee60
124e65: e8 7e d0 fe ff call 111ee8 <_Objects_Get>
124e6a: 89 c6 mov %eax,%esi
switch ( location ) {
124e6c: 83 c4 10 add $0x10,%esp
124e6f: 8b 4d e4 mov -0x1c(%ebp),%ecx
124e72: 85 c9 test %ecx,%ecx
124e74: 75 72 jne 124ee8 <pthread_kill+0xac>
case OBJECTS_LOCAL:
/*
* If sig == 0 then just validate arguments
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
124e76: 8b 90 ec 00 00 00 mov 0xec(%eax),%edx
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
124e7c: 8d 04 5b lea (%ebx,%ebx,2),%eax
124e7f: 83 3c 85 e8 f1 12 00 cmpl $0x1,0x12f1e8(,%eax,4)
124e86: 01
124e87: 74 2d je 124eb6 <pthread_kill+0x7a>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
124e89: b8 01 00 00 00 mov $0x1,%eax
124e8e: 89 f9 mov %edi,%ecx
124e90: d3 e0 shl %cl,%eax
return 0;
}
/* XXX critical section */
api->signals_pending |= signo_to_mask( sig );
124e92: 09 82 d4 00 00 00 or %eax,0xd4(%edx)
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
124e98: 52 push %edx
124e99: 6a 00 push $0x0
124e9b: 53 push %ebx
124e9c: 56 push %esi
124e9d: e8 7a fe ff ff call 124d1c <_POSIX_signals_Unblock_thread>
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
124ea2: 83 c4 10 add $0x10,%esp
124ea5: a1 74 f1 12 00 mov 0x12f174,%eax
124eaa: 85 c0 test %eax,%eax
124eac: 74 08 je 124eb6 <pthread_kill+0x7a>
124eae: 3b 35 78 f1 12 00 cmp 0x12f178,%esi
124eb4: 74 12 je 124ec8 <pthread_kill+0x8c>
_Thread_Dispatch_necessary = true;
}
_Thread_Enable_dispatch();
124eb6: e8 61 db fe ff call 112a1c <_Thread_Enable_dispatch>
return 0;
124ebb: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
}
124ebd: 8d 65 f4 lea -0xc(%ebp),%esp
124ec0: 5b pop %ebx
124ec1: 5e pop %esi
124ec2: 5f pop %edi
124ec3: c9 leave
124ec4: c3 ret
124ec5: 8d 76 00 lea 0x0(%esi),%esi
api->signals_pending |= signo_to_mask( sig );
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
124ec8: c6 05 84 f1 12 00 01 movb $0x1,0x12f184
124ecf: eb e5 jmp 124eb6 <pthread_kill+0x7a>
124ed1: 8d 76 00 lea 0x0(%esi),%esi
if ( !sig )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
rtems_set_errno_and_return_minus_one( EINVAL );
124ed4: e8 13 36 ff ff call 1184ec <__errno>
124ed9: c7 00 16 00 00 00 movl $0x16,(%eax)
124edf: b8 ff ff ff ff mov $0xffffffff,%eax
124ee4: eb d7 jmp 124ebd <pthread_kill+0x81>
124ee6: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
124ee8: e8 ff 35 ff ff call 1184ec <__errno>
124eed: c7 00 03 00 00 00 movl $0x3,(%eax)
124ef3: b8 ff ff ff ff mov $0xffffffff,%eax
124ef8: eb c3 jmp 124ebd <pthread_kill+0x81>
0010d19c <pthread_mutex_getprioceiling>:
int pthread_mutex_getprioceiling(
pthread_mutex_t *mutex,
int *prioceiling
)
{
10d19c: 55 push %ebp
10d19d: 89 e5 mov %esp,%ebp
10d19f: 53 push %ebx
10d1a0: 83 ec 14 sub $0x14,%esp
10d1a3: 8b 5d 0c mov 0xc(%ebp),%ebx
register POSIX_Mutex_Control *the_mutex;
Objects_Locations location;
if ( !prioceiling )
10d1a6: 85 db test %ebx,%ebx
10d1a8: 74 19 je 10d1c3 <pthread_mutex_getprioceiling+0x27>
return EINVAL;
the_mutex = _POSIX_Mutex_Get( mutex, &location );
10d1aa: 83 ec 08 sub $0x8,%esp
10d1ad: 8d 45 f4 lea -0xc(%ebp),%eax
10d1b0: 50 push %eax
10d1b1: ff 75 08 pushl 0x8(%ebp)
10d1b4: e8 3b ff ff ff call 10d0f4 <_POSIX_Mutex_Get>
switch ( location ) {
10d1b9: 83 c4 10 add $0x10,%esp
10d1bc: 8b 55 f4 mov -0xc(%ebp),%edx
10d1bf: 85 d2 test %edx,%edx
10d1c1: 74 0d je 10d1d0 <pthread_mutex_getprioceiling+0x34>
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10d1c3: b8 16 00 00 00 mov $0x16,%eax
}
10d1c8: 8b 5d fc mov -0x4(%ebp),%ebx
10d1cb: c9 leave
10d1cc: c3 ret
10d1cd: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE int _POSIX_Priority_From_core(
Priority_Control priority
)
{
return (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
10d1d0: 0f b6 15 1c 8a 12 00 movzbl 0x128a1c,%edx
10d1d7: 2b 50 60 sub 0x60(%eax),%edx
10d1da: 89 13 mov %edx,(%ebx)
case OBJECTS_LOCAL:
*prioceiling = _POSIX_Priority_From_core(
the_mutex->Mutex.Attributes.priority_ceiling
);
_Thread_Enable_dispatch();
10d1dc: e8 d3 35 00 00 call 1107b4 <_Thread_Enable_dispatch>
return 0;
10d1e1: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10d1e3: 8b 5d fc mov -0x4(%ebp),%ebx
10d1e6: c9 leave
10d1e7: c3 ret
0010d1e8 <pthread_mutex_init>:
int pthread_mutex_init(
pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr
)
{
10d1e8: 55 push %ebp
10d1e9: 89 e5 mov %esp,%ebp
10d1eb: 57 push %edi
10d1ec: 56 push %esi
10d1ed: 53 push %ebx
10d1ee: 83 ec 1c sub $0x1c,%esp
10d1f1: 8b 75 08 mov 0x8(%ebp),%esi
10d1f4: 8b 5d 0c mov 0xc(%ebp),%ebx
POSIX_Mutex_Control *the_mutex;
CORE_mutex_Attributes *the_mutex_attr;
const pthread_mutexattr_t *the_attr;
CORE_mutex_Disciplines the_discipline;
if ( attr ) the_attr = attr;
10d1f7: 85 db test %ebx,%ebx
10d1f9: 0f 84 09 01 00 00 je 10d308 <pthread_mutex_init+0x120>
else the_attr = &_POSIX_Mutex_Default_attributes;
/* Check for NULL mutex */
if ( !mutex )
10d1ff: 85 f6 test %esi,%esi
10d201: 0f 84 e5 00 00 00 je 10d2ec <pthread_mutex_init+0x104>
}
}
}
#endif
if ( !the_attr->is_initialized )
10d207: 8b 13 mov (%ebx),%edx
10d209: 85 d2 test %edx,%edx
10d20b: 0f 84 db 00 00 00 je 10d2ec <pthread_mutex_init+0x104>
return EINVAL;
/*
* We only support process private mutexes.
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
10d211: 8b 43 04 mov 0x4(%ebx),%eax
10d214: 83 f8 01 cmp $0x1,%eax
10d217: 0f 84 f7 00 00 00 je 10d314 <pthread_mutex_init+0x12c>
return ENOSYS;
if ( the_attr->process_shared != PTHREAD_PROCESS_PRIVATE )
10d21d: 85 c0 test %eax,%eax
10d21f: 0f 85 c7 00 00 00 jne 10d2ec <pthread_mutex_init+0x104>
return EINVAL;
/*
* Determine the discipline of the mutex
*/
switch ( the_attr->protocol ) {
10d225: 8b 43 0c mov 0xc(%ebx),%eax
10d228: 83 f8 01 cmp $0x1,%eax
10d22b: 0f 84 eb 00 00 00 je 10d31c <pthread_mutex_init+0x134>
10d231: 83 f8 02 cmp $0x2,%eax
10d234: 0f 84 c2 00 00 00 je 10d2fc <pthread_mutex_init+0x114>
10d23a: 85 c0 test %eax,%eax
10d23c: 0f 85 aa 00 00 00 jne 10d2ec <pthread_mutex_init+0x104>
case PTHREAD_PRIO_NONE:
the_discipline = CORE_MUTEX_DISCIPLINES_FIFO;
10d242: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
}
/*
* Validate the priority ceiling field -- should always be valid.
*/
if ( !_POSIX_Priority_Is_valid( the_attr->prio_ceiling ) )
10d249: 83 ec 0c sub $0xc,%esp
10d24c: ff 73 08 pushl 0x8(%ebx)
10d24f: e8 58 03 00 00 call 10d5ac <_POSIX_Priority_Is_valid>
10d254: 83 c4 10 add $0x10,%esp
10d257: 84 c0 test %al,%al
10d259: 0f 84 8d 00 00 00 je 10d2ec <pthread_mutex_init+0x104>
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
/*
* Validate the mutex type and set appropriate SuperCore mutex
* attributes.
*/
switch ( the_attr->type ) {
10d25f: 83 7b 10 03 cmpl $0x3,0x10(%ebx)
10d263: 0f 87 83 00 00 00 ja 10d2ec <pthread_mutex_init+0x104>
10d269: a1 90 cd 12 00 mov 0x12cd90,%eax
10d26e: 40 inc %eax
10d26f: a3 90 cd 12 00 mov %eax,0x12cd90
* _POSIX_Mutex_Allocate
*/
RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Allocate( void )
{
return (POSIX_Mutex_Control *) _Objects_Allocate( &_POSIX_Mutex_Information );
10d274: 83 ec 0c sub $0xc,%esp
10d277: 68 a0 d1 12 00 push $0x12d1a0
10d27c: e8 c7 25 00 00 call 10f848 <_Objects_Allocate>
10d281: 89 c7 mov %eax,%edi
*/
_Thread_Disable_dispatch();
the_mutex = _POSIX_Mutex_Allocate();
if ( !the_mutex ) {
10d283: 83 c4 10 add $0x10,%esp
10d286: 85 c0 test %eax,%eax
10d288: 0f 84 9a 00 00 00 je 10d328 <pthread_mutex_init+0x140>
_Thread_Enable_dispatch();
return EAGAIN;
}
the_mutex->process_shared = the_attr->process_shared;
10d28e: 8b 43 04 mov 0x4(%ebx),%eax
10d291: 89 47 10 mov %eax,0x10(%edi)
the_mutex_attr = &the_mutex->Mutex.Attributes;
10d294: 8d 57 54 lea 0x54(%edi),%edx
if ( the_attr->recursive )
the_mutex_attr->lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
10d297: 31 c0 xor %eax,%eax
10d299: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
10d29d: 0f 94 c0 sete %al
10d2a0: 89 47 54 mov %eax,0x54(%edi)
else
the_mutex_attr->lock_nesting_behavior = CORE_MUTEX_NESTING_IS_ERROR;
the_mutex_attr->only_owner_release = true;
10d2a3: c6 47 58 01 movb $0x1,0x58(%edi)
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
10d2a7: 0f b6 05 1c 8a 12 00 movzbl 0x128a1c,%eax
10d2ae: 2b 43 08 sub 0x8(%ebx),%eax
10d2b1: 89 47 60 mov %eax,0x60(%edi)
the_mutex_attr->priority_ceiling =
_POSIX_Priority_To_core( the_attr->prio_ceiling );
the_mutex_attr->discipline = the_discipline;
10d2b4: 8b 45 e4 mov -0x1c(%ebp),%eax
10d2b7: 89 47 5c mov %eax,0x5c(%edi)
/*
* Must be initialized to unlocked.
*/
_CORE_mutex_Initialize(
10d2ba: 50 push %eax
10d2bb: 6a 01 push $0x1
10d2bd: 52 push %edx
10d2be: 8d 47 14 lea 0x14(%edi),%eax
10d2c1: 50 push %eax
10d2c2: e8 0d 1d 00 00 call 10efd4 <_CORE_mutex_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10d2c7: 8b 47 08 mov 0x8(%edi),%eax
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10d2ca: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10d2cd: 8b 15 bc d1 12 00 mov 0x12d1bc,%edx
10d2d3: 89 3c 8a mov %edi,(%edx,%ecx,4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
10d2d6: c7 47 0c 00 00 00 00 movl $0x0,0xc(%edi)
CORE_MUTEX_UNLOCKED
);
_Objects_Open_u32( &_POSIX_Mutex_Information, &the_mutex->Object, 0 );
*mutex = the_mutex->Object.id;
10d2dd: 89 06 mov %eax,(%esi)
_Thread_Enable_dispatch();
10d2df: e8 d0 34 00 00 call 1107b4 <_Thread_Enable_dispatch>
return 0;
10d2e4: 83 c4 10 add $0x10,%esp
10d2e7: 31 c0 xor %eax,%eax
10d2e9: eb 06 jmp 10d2f1 <pthread_mutex_init+0x109>
10d2eb: 90 nop
case PTHREAD_MUTEX_ERRORCHECK:
case PTHREAD_MUTEX_DEFAULT:
break;
default:
return EINVAL;
10d2ec: b8 16 00 00 00 mov $0x16,%eax
*mutex = the_mutex->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10d2f1: 8d 65 f4 lea -0xc(%ebp),%esp
10d2f4: 5b pop %ebx
10d2f5: 5e pop %esi
10d2f6: 5f pop %edi
10d2f7: c9 leave
10d2f8: c3 ret
10d2f9: 8d 76 00 lea 0x0(%esi),%esi
break;
case PTHREAD_PRIO_INHERIT:
the_discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
break;
case PTHREAD_PRIO_PROTECT:
the_discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
10d2fc: c7 45 e4 03 00 00 00 movl $0x3,-0x1c(%ebp)
break;
10d303: e9 41 ff ff ff jmp 10d249 <pthread_mutex_init+0x61>
CORE_mutex_Attributes *the_mutex_attr;
const pthread_mutexattr_t *the_attr;
CORE_mutex_Disciplines the_discipline;
if ( attr ) the_attr = attr;
else the_attr = &_POSIX_Mutex_Default_attributes;
10d308: bb 20 d2 12 00 mov $0x12d220,%ebx
10d30d: e9 ed fe ff ff jmp 10d1ff <pthread_mutex_init+0x17>
10d312: 66 90 xchg %ax,%ax
/*
* We only support process private mutexes.
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
return ENOSYS;
10d314: b8 58 00 00 00 mov $0x58,%eax
10d319: eb d6 jmp 10d2f1 <pthread_mutex_init+0x109>
10d31b: 90 nop
switch ( the_attr->protocol ) {
case PTHREAD_PRIO_NONE:
the_discipline = CORE_MUTEX_DISCIPLINES_FIFO;
break;
case PTHREAD_PRIO_INHERIT:
the_discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
10d31c: c7 45 e4 02 00 00 00 movl $0x2,-0x1c(%ebp)
10d323: e9 21 ff ff ff jmp 10d249 <pthread_mutex_init+0x61>
_Thread_Disable_dispatch();
the_mutex = _POSIX_Mutex_Allocate();
if ( !the_mutex ) {
_Thread_Enable_dispatch();
10d328: e8 87 34 00 00 call 1107b4 <_Thread_Enable_dispatch>
return EAGAIN;
10d32d: b8 0b 00 00 00 mov $0xb,%eax
10d332: eb bd jmp 10d2f1 <pthread_mutex_init+0x109>
0010d440 <pthread_mutex_timedlock>:
int pthread_mutex_timedlock(
pthread_mutex_t *mutex,
const struct timespec *abstime
)
{
10d440: 55 push %ebp
10d441: 89 e5 mov %esp,%ebp
10d443: 56 push %esi
10d444: 53 push %ebx
10d445: 83 ec 18 sub $0x18,%esp
10d448: 8b 75 08 mov 0x8(%ebp),%esi
*
* If the status is POSIX_ABSOLUTE_TIMEOUT_INVALID,
* POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST, or POSIX_ABSOLUTE_TIMEOUT_IS_NOW,
* then we should not wait.
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
10d44b: 8d 45 f4 lea -0xc(%ebp),%eax
10d44e: 50 push %eax
10d44f: ff 75 0c pushl 0xc(%ebp)
10d452: e8 cd 00 00 00 call 10d524 <_POSIX_Absolute_timeout_to_ticks>
10d457: 89 c3 mov %eax,%ebx
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
10d459: 83 c4 10 add $0x10,%esp
10d45c: 83 f8 03 cmp $0x3,%eax
10d45f: 74 2f je 10d490 <pthread_mutex_timedlock+0x50>
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
10d461: 50 push %eax
10d462: ff 75 f4 pushl -0xc(%ebp)
10d465: 6a 00 push $0x0
10d467: 56 push %esi
10d468: e8 db fe ff ff call 10d348 <_POSIX_Mutex_Lock_support>
* This service only gives us the option to block. We used a polling
* attempt to lock if the abstime was not in the future. If we did
* not obtain the mutex, then not look at the status immediately,
* make sure the right reason is returned.
*/
if ( !do_wait && (lock_status == EBUSY) ) {
10d46d: 83 c4 10 add $0x10,%esp
10d470: 83 f8 10 cmp $0x10,%eax
10d473: 74 07 je 10d47c <pthread_mutex_timedlock+0x3c><== ALWAYS TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return lock_status;
}
10d475: 8d 65 f8 lea -0x8(%ebp),%esp
10d478: 5b pop %ebx
10d479: 5e pop %esi
10d47a: c9 leave
10d47b: c3 ret
* attempt to lock if the abstime was not in the future. If we did
* not obtain the mutex, then not look at the status immediately,
* make sure the right reason is returned.
*/
if ( !do_wait && (lock_status == EBUSY) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
10d47c: 85 db test %ebx,%ebx
10d47e: 74 28 je 10d4a8 <pthread_mutex_timedlock+0x68><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10d480: 4b dec %ebx
10d481: 83 fb 01 cmp $0x1,%ebx
10d484: 77 ef ja 10d475 <pthread_mutex_timedlock+0x35><== NEVER TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
10d486: b8 74 00 00 00 mov $0x74,%eax
10d48b: eb e8 jmp 10d475 <pthread_mutex_timedlock+0x35>
10d48d: 8d 76 00 lea 0x0(%esi),%esi
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
10d490: 52 push %edx
10d491: ff 75 f4 pushl -0xc(%ebp)
10d494: 6a 01 push $0x1
10d496: 56 push %esi
10d497: e8 ac fe ff ff call 10d348 <_POSIX_Mutex_Lock_support>
10d49c: 83 c4 10 add $0x10,%esp
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return lock_status;
}
10d49f: 8d 65 f8 lea -0x8(%ebp),%esp
10d4a2: 5b pop %ebx
10d4a3: 5e pop %esi
10d4a4: c9 leave
10d4a5: c3 ret
10d4a6: 66 90 xchg %ax,%ax
* not obtain the mutex, then not look at the status immediately,
* make sure the right reason is returned.
*/
if ( !do_wait && (lock_status == EBUSY) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
10d4a8: b8 16 00 00 00 mov $0x16,%eax <== NOT EXECUTED
10d4ad: eb c6 jmp 10d475 <pthread_mutex_timedlock+0x35><== NOT EXECUTED
0010cf24 <pthread_mutexattr_destroy>:
*/
int pthread_mutexattr_destroy(
pthread_mutexattr_t *attr
)
{
10cf24: 55 push %ebp
10cf25: 89 e5 mov %esp,%ebp
10cf27: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || !attr->is_initialized )
10cf2a: 85 c0 test %eax,%eax
10cf2c: 74 12 je 10cf40 <pthread_mutexattr_destroy+0x1c>
10cf2e: 8b 10 mov (%eax),%edx
10cf30: 85 d2 test %edx,%edx
10cf32: 74 0c je 10cf40 <pthread_mutexattr_destroy+0x1c>
return EINVAL;
attr->is_initialized = false;
10cf34: c7 00 00 00 00 00 movl $0x0,(%eax)
return 0;
10cf3a: 31 c0 xor %eax,%eax
}
10cf3c: c9 leave
10cf3d: c3 ret
10cf3e: 66 90 xchg %ax,%ax
int pthread_mutexattr_destroy(
pthread_mutexattr_t *attr
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
10cf40: b8 16 00 00 00 mov $0x16,%eax
attr->is_initialized = false;
return 0;
}
10cf45: c9 leave
10cf46: c3 ret
0010cfec <pthread_mutexattr_setprioceiling>:
int pthread_mutexattr_setprioceiling(
pthread_mutexattr_t *attr,
int prioceiling
)
{
10cfec: 55 push %ebp
10cfed: 89 e5 mov %esp,%ebp
10cfef: 56 push %esi
10cff0: 53 push %ebx
10cff1: 8b 5d 08 mov 0x8(%ebp),%ebx
10cff4: 8b 75 0c mov 0xc(%ebp),%esi
if ( !attr || !attr->is_initialized )
10cff7: 85 db test %ebx,%ebx
10cff9: 74 06 je 10d001 <pthread_mutexattr_setprioceiling+0x15><== NEVER TAKEN
10cffb: 8b 03 mov (%ebx),%eax
10cffd: 85 c0 test %eax,%eax
10cfff: 75 0f jne 10d010 <pthread_mutexattr_setprioceiling+0x24>
return EINVAL;
if ( !_POSIX_Priority_Is_valid( prioceiling ) )
return EINVAL;
10d001: b8 16 00 00 00 mov $0x16,%eax
attr->prio_ceiling = prioceiling;
return 0;
}
10d006: 8d 65 f8 lea -0x8(%ebp),%esp
10d009: 5b pop %ebx
10d00a: 5e pop %esi
10d00b: c9 leave
10d00c: c3 ret
10d00d: 8d 76 00 lea 0x0(%esi),%esi
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( prioceiling ) )
10d010: 83 ec 0c sub $0xc,%esp
10d013: 56 push %esi
10d014: e8 93 05 00 00 call 10d5ac <_POSIX_Priority_Is_valid>
10d019: 83 c4 10 add $0x10,%esp
10d01c: 84 c0 test %al,%al
10d01e: 74 e1 je 10d001 <pthread_mutexattr_setprioceiling+0x15>
return EINVAL;
attr->prio_ceiling = prioceiling;
10d020: 89 73 08 mov %esi,0x8(%ebx)
return 0;
10d023: 31 c0 xor %eax,%eax
}
10d025: 8d 65 f8 lea -0x8(%ebp),%esp
10d028: 5b pop %ebx
10d029: 5e pop %esi
10d02a: c9 leave
10d02b: c3 ret
0010d054 <pthread_mutexattr_setpshared>:
int pthread_mutexattr_setpshared(
pthread_mutexattr_t *attr,
int pshared
)
{
10d054: 55 push %ebp
10d055: 89 e5 mov %esp,%ebp
10d057: 8b 45 08 mov 0x8(%ebp),%eax
10d05a: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
10d05d: 85 c0 test %eax,%eax
10d05f: 74 0b je 10d06c <pthread_mutexattr_setpshared+0x18>
10d061: 8b 08 mov (%eax),%ecx
10d063: 85 c9 test %ecx,%ecx
10d065: 74 05 je 10d06c <pthread_mutexattr_setpshared+0x18>
return EINVAL;
switch ( pshared ) {
10d067: 83 fa 01 cmp $0x1,%edx
10d06a: 76 08 jbe 10d074 <pthread_mutexattr_setpshared+0x20><== ALWAYS TAKEN
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
return 0;
default:
return EINVAL;
10d06c: b8 16 00 00 00 mov $0x16,%eax
}
}
10d071: c9 leave
10d072: c3 ret
10d073: 90 nop
return EINVAL;
switch ( pshared ) {
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
10d074: 89 50 04 mov %edx,0x4(%eax)
return 0;
10d077: 31 c0 xor %eax,%eax
default:
return EINVAL;
}
}
10d079: c9 leave
10d07a: c3 ret
0010b248 <pthread_mutexattr_settype>:
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
int pthread_mutexattr_settype(
pthread_mutexattr_t *attr,
int type
)
{
10b248: 55 push %ebp
10b249: 89 e5 mov %esp,%ebp
10b24b: 8b 45 08 mov 0x8(%ebp),%eax
10b24e: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
10b251: 85 c0 test %eax,%eax
10b253: 74 0b je 10b260 <pthread_mutexattr_settype+0x18>
10b255: 8b 08 mov (%eax),%ecx
10b257: 85 c9 test %ecx,%ecx
10b259: 74 05 je 10b260 <pthread_mutexattr_settype+0x18><== NEVER TAKEN
return EINVAL;
switch ( type ) {
10b25b: 83 fa 03 cmp $0x3,%edx
10b25e: 76 08 jbe 10b268 <pthread_mutexattr_settype+0x20>
case PTHREAD_MUTEX_DEFAULT:
attr->type = type;
return 0;
default:
return EINVAL;
10b260: b8 16 00 00 00 mov $0x16,%eax
}
}
10b265: c9 leave
10b266: c3 ret
10b267: 90 nop
switch ( type ) {
case PTHREAD_MUTEX_NORMAL:
case PTHREAD_MUTEX_RECURSIVE:
case PTHREAD_MUTEX_ERRORCHECK:
case PTHREAD_MUTEX_DEFAULT:
attr->type = type;
10b268: 89 50 10 mov %edx,0x10(%eax)
return 0;
10b26b: 31 c0 xor %eax,%eax
default:
return EINVAL;
}
}
10b26d: c9 leave
10b26e: c3 ret
0010bd9c <pthread_once>:
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
10bd9c: 55 push %ebp
10bd9d: 89 e5 mov %esp,%ebp
10bd9f: 57 push %edi
10bda0: 56 push %esi
10bda1: 53 push %ebx
10bda2: 83 ec 1c sub $0x1c,%esp
10bda5: 8b 5d 08 mov 0x8(%ebp),%ebx
10bda8: 8b 75 0c mov 0xc(%ebp),%esi
if ( !once_control || !init_routine )
10bdab: 85 db test %ebx,%ebx
10bdad: 74 51 je 10be00 <pthread_once+0x64>
10bdaf: 85 f6 test %esi,%esi
10bdb1: 74 4d je 10be00 <pthread_once+0x64>
return EINVAL;
if ( !once_control->init_executed ) {
10bdb3: 8b 7b 04 mov 0x4(%ebx),%edi
10bdb6: 85 ff test %edi,%edi
10bdb8: 74 0a je 10bdc4 <pthread_once+0x28>
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
10bdba: 31 c0 xor %eax,%eax
}
10bdbc: 8d 65 f4 lea -0xc(%ebp),%esp
10bdbf: 5b pop %ebx
10bdc0: 5e pop %esi
10bdc1: 5f pop %edi
10bdc2: c9 leave
10bdc3: c3 ret
if ( !once_control || !init_routine )
return EINVAL;
if ( !once_control->init_executed ) {
rtems_mode saveMode;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
10bdc4: 51 push %ecx
10bdc5: 8d 7d e4 lea -0x1c(%ebp),%edi
10bdc8: 57 push %edi
10bdc9: 68 00 01 00 00 push $0x100
10bdce: 68 00 01 00 00 push $0x100
10bdd3: e8 f4 0b 00 00 call 10c9cc <rtems_task_mode>
if ( !once_control->init_executed ) {
10bdd8: 83 c4 10 add $0x10,%esp
10bddb: 8b 53 04 mov 0x4(%ebx),%edx
10bdde: 85 d2 test %edx,%edx
10bde0: 74 2e je 10be10 <pthread_once+0x74> <== ALWAYS TAKEN
once_control->is_initialized = true;
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
10bde2: 50 push %eax
10bde3: 57 push %edi
10bde4: 68 00 01 00 00 push $0x100
10bde9: ff 75 e4 pushl -0x1c(%ebp)
10bdec: e8 db 0b 00 00 call 10c9cc <rtems_task_mode>
10bdf1: 83 c4 10 add $0x10,%esp
}
return 0;
10bdf4: 31 c0 xor %eax,%eax
}
10bdf6: 8d 65 f4 lea -0xc(%ebp),%esp
10bdf9: 5b pop %ebx
10bdfa: 5e pop %esi
10bdfb: 5f pop %edi
10bdfc: c9 leave
10bdfd: c3 ret
10bdfe: 66 90 xchg %ax,%ax
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
if ( !once_control || !init_routine )
return EINVAL;
10be00: b8 16 00 00 00 mov $0x16,%eax
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
}
10be05: 8d 65 f4 lea -0xc(%ebp),%esp
10be08: 5b pop %ebx
10be09: 5e pop %esi
10be0a: 5f pop %edi
10be0b: c9 leave
10be0c: c3 ret
10be0d: 8d 76 00 lea 0x0(%esi),%esi
if ( !once_control->init_executed ) {
rtems_mode saveMode;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
if ( !once_control->init_executed ) {
once_control->is_initialized = true;
10be10: c7 03 01 00 00 00 movl $0x1,(%ebx)
once_control->init_executed = true;
10be16: c7 43 04 01 00 00 00 movl $0x1,0x4(%ebx)
(*init_routine)();
10be1d: ff d6 call *%esi
10be1f: eb c1 jmp 10bde2 <pthread_once+0x46>
0010c480 <pthread_rwlock_destroy>:
*/
int pthread_rwlock_destroy(
pthread_rwlock_t *rwlock
)
{
10c480: 55 push %ebp
10c481: 89 e5 mov %esp,%ebp
10c483: 53 push %ebx
10c484: 83 ec 14 sub $0x14,%esp
10c487: 8b 45 08 mov 0x8(%ebp),%eax
POSIX_RWLock_Control *the_rwlock = NULL;
Objects_Locations location;
if ( !rwlock )
10c48a: 85 c0 test %eax,%eax
10c48c: 74 42 je 10c4d0 <pthread_rwlock_destroy+0x50>
RTEMS_INLINE_ROUTINE POSIX_RWLock_Control *_POSIX_RWLock_Get (
pthread_rwlock_t *RWLock,
Objects_Locations *location
)
{
return (POSIX_RWLock_Control *) _Objects_Get(
10c48e: 53 push %ebx
return EINVAL;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
10c48f: 8d 55 f4 lea -0xc(%ebp),%edx
10c492: 52 push %edx
10c493: ff 30 pushl (%eax)
10c495: 68 40 ba 12 00 push $0x12ba40
10c49a: e8 e1 2b 00 00 call 10f080 <_Objects_Get>
10c49f: 89 c3 mov %eax,%ebx
switch ( location ) {
10c4a1: 83 c4 10 add $0x10,%esp
10c4a4: 8b 4d f4 mov -0xc(%ebp),%ecx
10c4a7: 85 c9 test %ecx,%ecx
10c4a9: 75 25 jne 10c4d0 <pthread_rwlock_destroy+0x50>
case OBJECTS_LOCAL:
/*
* If there is at least one thread waiting, then do not delete it.
*/
if ( _Thread_queue_First( &the_rwlock->RWLock.Wait_queue ) != NULL ) {
10c4ab: 83 ec 0c sub $0xc,%esp
10c4ae: 8d 40 10 lea 0x10(%eax),%eax
10c4b1: 50 push %eax
10c4b2: e8 81 3e 00 00 call 110338 <_Thread_queue_First>
10c4b7: 83 c4 10 add $0x10,%esp
10c4ba: 85 c0 test %eax,%eax
10c4bc: 74 1e je 10c4dc <pthread_rwlock_destroy+0x5c>
_Thread_Enable_dispatch();
10c4be: e8 71 36 00 00 call 10fb34 <_Thread_Enable_dispatch>
return EBUSY;
10c4c3: b8 10 00 00 00 mov $0x10,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c4c8: 8b 5d fc mov -0x4(%ebp),%ebx
10c4cb: c9 leave
10c4cc: c3 ret
10c4cd: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10c4d0: b8 16 00 00 00 mov $0x16,%eax
}
10c4d5: 8b 5d fc mov -0x4(%ebp),%ebx
10c4d8: c9 leave
10c4d9: c3 ret
10c4da: 66 90 xchg %ax,%ax
/*
* POSIX doesn't require behavior when it is locked.
*/
_Objects_Close( &_POSIX_RWLock_Information, &the_rwlock->Object );
10c4dc: 83 ec 08 sub $0x8,%esp
10c4df: 53 push %ebx
10c4e0: 68 40 ba 12 00 push $0x12ba40
10c4e5: e8 5a 27 00 00 call 10ec44 <_Objects_Close>
*/
RTEMS_INLINE_ROUTINE void _POSIX_RWLock_Free (
POSIX_RWLock_Control *the_RWLock
)
{
_Objects_Free( &_POSIX_RWLock_Information, &the_RWLock->Object );
10c4ea: 58 pop %eax
10c4eb: 5a pop %edx
10c4ec: 53 push %ebx
10c4ed: 68 40 ba 12 00 push $0x12ba40
10c4f2: e8 49 2a 00 00 call 10ef40 <_Objects_Free>
_POSIX_RWLock_Free( the_rwlock );
_Thread_Enable_dispatch();
10c4f7: e8 38 36 00 00 call 10fb34 <_Thread_Enable_dispatch>
return 0;
10c4fc: 83 c4 10 add $0x10,%esp
10c4ff: 31 c0 xor %eax,%eax
10c501: eb d2 jmp 10c4d5 <pthread_rwlock_destroy+0x55>
0010c504 <pthread_rwlock_init>:
int pthread_rwlock_init(
pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr
)
{
10c504: 55 push %ebp
10c505: 89 e5 mov %esp,%ebp
10c507: 56 push %esi
10c508: 53 push %ebx
10c509: 83 ec 20 sub $0x20,%esp
10c50c: 8b 5d 08 mov 0x8(%ebp),%ebx
10c50f: 8b 75 0c mov 0xc(%ebp),%esi
const pthread_rwlockattr_t *the_attr;
/*
* Error check parameters
*/
if ( !rwlock )
10c512: 85 db test %ebx,%ebx
10c514: 74 15 je 10c52b <pthread_rwlock_init+0x27>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
10c516: 85 f6 test %esi,%esi
10c518: 0f 84 8e 00 00 00 je 10c5ac <pthread_rwlock_init+0xa8>
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
10c51e: 8b 16 mov (%esi),%edx
10c520: 85 d2 test %edx,%edx
10c522: 74 07 je 10c52b <pthread_rwlock_init+0x27><== NEVER TAKEN
return EINVAL;
switch ( the_attr->process_shared ) {
10c524: 8b 46 04 mov 0x4(%esi),%eax
10c527: 85 c0 test %eax,%eax
10c529: 74 0d je 10c538 <pthread_rwlock_init+0x34><== ALWAYS TAKEN
case PTHREAD_PROCESS_PRIVATE: /* only supported values */
break;
case PTHREAD_PROCESS_SHARED:
default:
return EINVAL;
10c52b: b8 16 00 00 00 mov $0x16,%eax
*rwlock = the_rwlock->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10c530: 8d 65 f8 lea -0x8(%ebp),%esp
10c533: 5b pop %ebx
10c534: 5e pop %esi
10c535: c9 leave
10c536: c3 ret
10c537: 90 nop
*/
RTEMS_INLINE_ROUTINE void _CORE_RWLock_Initialize_attributes(
CORE_RWLock_Attributes *the_attributes
)
{
the_attributes->XXX = 0;
10c538: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp)
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10c53f: a1 b0 b7 12 00 mov 0x12b7b0,%eax
10c544: 40 inc %eax
10c545: a3 b0 b7 12 00 mov %eax,0x12b7b0
* the inactive chain of free RWLock control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_RWLock_Control *_POSIX_RWLock_Allocate( void )
{
return (POSIX_RWLock_Control *)
_Objects_Allocate( &_POSIX_RWLock_Information );
10c54a: 83 ec 0c sub $0xc,%esp
10c54d: 68 40 ba 12 00 push $0x12ba40
10c552: e8 71 26 00 00 call 10ebc8 <_Objects_Allocate>
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
10c557: 83 c4 10 add $0x10,%esp
10c55a: 85 c0 test %eax,%eax
10c55c: 74 42 je 10c5a0 <pthread_rwlock_init+0x9c>
_Thread_Enable_dispatch();
return EAGAIN;
}
_CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes );
10c55e: 83 ec 08 sub $0x8,%esp
10c561: 8d 55 f4 lea -0xc(%ebp),%edx
10c564: 52 push %edx
10c565: 8d 50 10 lea 0x10(%eax),%edx
10c568: 52 push %edx
10c569: 89 45 e4 mov %eax,-0x1c(%ebp)
10c56c: e8 3f 1e 00 00 call 10e3b0 <_CORE_RWLock_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10c571: 8b 45 e4 mov -0x1c(%ebp),%eax
10c574: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10c577: 0f b7 f2 movzwl %dx,%esi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10c57a: 8b 0d 5c ba 12 00 mov 0x12ba5c,%ecx
10c580: 89 04 b1 mov %eax,(%ecx,%esi,4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
10c583: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
&_POSIX_RWLock_Information,
&the_rwlock->Object,
0
);
*rwlock = the_rwlock->Object.id;
10c58a: 89 13 mov %edx,(%ebx)
_Thread_Enable_dispatch();
10c58c: e8 a3 35 00 00 call 10fb34 <_Thread_Enable_dispatch>
return 0;
10c591: 83 c4 10 add $0x10,%esp
10c594: 31 c0 xor %eax,%eax
}
10c596: 8d 65 f8 lea -0x8(%ebp),%esp
10c599: 5b pop %ebx
10c59a: 5e pop %esi
10c59b: c9 leave
10c59c: c3 ret
10c59d: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
_Thread_Enable_dispatch();
10c5a0: e8 8f 35 00 00 call 10fb34 <_Thread_Enable_dispatch>
return EAGAIN;
10c5a5: b8 0b 00 00 00 mov $0xb,%eax
10c5aa: eb 84 jmp 10c530 <pthread_rwlock_init+0x2c>
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
the_attr = attr;
} else {
(void) pthread_rwlockattr_init( &default_attr );
10c5ac: 83 ec 0c sub $0xc,%esp
10c5af: 8d 75 ec lea -0x14(%ebp),%esi
10c5b2: 56 push %esi
10c5b3: e8 84 09 00 00 call 10cf3c <pthread_rwlockattr_init>
10c5b8: 83 c4 10 add $0x10,%esp
10c5bb: e9 5e ff ff ff jmp 10c51e <pthread_rwlock_init+0x1a>
0010c628 <pthread_rwlock_timedrdlock>:
int pthread_rwlock_timedrdlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
10c628: 55 push %ebp
10c629: 89 e5 mov %esp,%ebp
10c62b: 56 push %esi
10c62c: 53 push %ebx
10c62d: 83 ec 20 sub $0x20,%esp
10c630: 8b 5d 08 mov 0x8(%ebp),%ebx
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
10c633: 85 db test %ebx,%ebx
10c635: 74 7d je 10c6b4 <pthread_rwlock_timedrdlock+0x8c>
*
* If the status is POSIX_ABSOLUTE_TIMEOUT_INVALID,
* POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST, or POSIX_ABSOLUTE_TIMEOUT_IS_NOW,
* then we should not wait.
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
10c637: 83 ec 08 sub $0x8,%esp
10c63a: 8d 45 f0 lea -0x10(%ebp),%eax
10c63d: 50 push %eax
10c63e: ff 75 0c pushl 0xc(%ebp)
10c641: e8 ae 62 00 00 call 1128f4 <_POSIX_Absolute_timeout_to_ticks>
10c646: 89 c6 mov %eax,%esi
10c648: 83 c4 0c add $0xc,%esp
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
10c64b: 8d 45 f4 lea -0xc(%ebp),%eax
10c64e: 50 push %eax
10c64f: ff 33 pushl (%ebx)
10c651: 68 40 ba 12 00 push $0x12ba40
10c656: e8 25 2a 00 00 call 10f080 <_Objects_Get>
switch ( location ) {
10c65b: 83 c4 10 add $0x10,%esp
10c65e: 8b 55 f4 mov -0xc(%ebp),%edx
10c661: 85 d2 test %edx,%edx
10c663: 75 4f jne 10c6b4 <pthread_rwlock_timedrdlock+0x8c>
int _EXFUN(pthread_rwlock_init,
(pthread_rwlock_t *__rwlock, _CONST pthread_rwlockattr_t *__attr));
int _EXFUN(pthread_rwlock_destroy, (pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_rdlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_tryrdlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_timedrdlock,
10c665: 83 fe 03 cmp $0x3,%esi
10c668: 0f 94 c2 sete %dl
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_reading(
10c66b: 83 ec 0c sub $0xc,%esp
10c66e: 6a 00 push $0x0
10c670: ff 75 f0 pushl -0x10(%ebp)
10c673: 0f b6 ca movzbl %dl,%ecx
10c676: 51 push %ecx
10c677: ff 33 pushl (%ebx)
10c679: 83 c0 10 add $0x10,%eax
10c67c: 50 push %eax
10c67d: 88 55 e4 mov %dl,-0x1c(%ebp)
10c680: e8 5f 1d 00 00 call 10e3e4 <_CORE_RWLock_Obtain_for_reading>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
10c685: 83 c4 20 add $0x20,%esp
10c688: e8 a7 34 00 00 call 10fb34 <_Thread_Enable_dispatch>
if ( !do_wait ) {
10c68d: 8a 55 e4 mov -0x1c(%ebp),%dl
10c690: 84 d2 test %dl,%dl
10c692: 75 40 jne 10c6d4 <pthread_rwlock_timedrdlock+0xac>
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
10c694: a1 98 bd 12 00 mov 0x12bd98,%eax
10c699: 8b 40 34 mov 0x34(%eax),%eax
10c69c: 83 f8 02 cmp $0x2,%eax
10c69f: 74 1f je 10c6c0 <pthread_rwlock_timedrdlock+0x98>
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
10c6a1: 83 ec 0c sub $0xc,%esp
10c6a4: 50 push %eax
10c6a5: e8 ee 00 00 00 call 10c798 <_POSIX_RWLock_Translate_core_RWLock_return_code>
10c6aa: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c6ad: 8d 65 f8 lea -0x8(%ebp),%esp
10c6b0: 5b pop %ebx
10c6b1: 5e pop %esi
10c6b2: c9 leave
10c6b3: c3 ret
_Thread_Enable_dispatch();
if ( !do_wait ) {
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
10c6b4: b8 16 00 00 00 mov $0x16,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c6b9: 8d 65 f8 lea -0x8(%ebp),%esp
10c6bc: 5b pop %ebx
10c6bd: 5e pop %esi
10c6be: c9 leave
10c6bf: c3 ret
);
_Thread_Enable_dispatch();
if ( !do_wait ) {
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
10c6c0: 85 f6 test %esi,%esi
10c6c2: 74 f0 je 10c6b4 <pthread_rwlock_timedrdlock+0x8c><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10c6c4: 4e dec %esi
10c6c5: 83 fe 01 cmp $0x1,%esi
10c6c8: 77 d7 ja 10c6a1 <pthread_rwlock_timedrdlock+0x79><== NEVER TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
10c6ca: b8 74 00 00 00 mov $0x74,%eax
10c6cf: eb e8 jmp 10c6b9 <pthread_rwlock_timedrdlock+0x91>
10c6d1: 8d 76 00 lea 0x0(%esi),%esi
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait ) {
10c6d4: a1 98 bd 12 00 mov 0x12bd98,%eax
10c6d9: 8b 40 34 mov 0x34(%eax),%eax
10c6dc: eb c3 jmp 10c6a1 <pthread_rwlock_timedrdlock+0x79>
0010c6e0 <pthread_rwlock_timedwrlock>:
int pthread_rwlock_timedwrlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
10c6e0: 55 push %ebp
10c6e1: 89 e5 mov %esp,%ebp
10c6e3: 56 push %esi
10c6e4: 53 push %ebx
10c6e5: 83 ec 20 sub $0x20,%esp
10c6e8: 8b 5d 08 mov 0x8(%ebp),%ebx
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
10c6eb: 85 db test %ebx,%ebx
10c6ed: 74 7d je 10c76c <pthread_rwlock_timedwrlock+0x8c>
*
* If the status is POSIX_ABSOLUTE_TIMEOUT_INVALID,
* POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST, or POSIX_ABSOLUTE_TIMEOUT_IS_NOW,
* then we should not wait.
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
10c6ef: 83 ec 08 sub $0x8,%esp
10c6f2: 8d 45 f0 lea -0x10(%ebp),%eax
10c6f5: 50 push %eax
10c6f6: ff 75 0c pushl 0xc(%ebp)
10c6f9: e8 f6 61 00 00 call 1128f4 <_POSIX_Absolute_timeout_to_ticks>
10c6fe: 89 c6 mov %eax,%esi
10c700: 83 c4 0c add $0xc,%esp
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
10c703: 8d 45 f4 lea -0xc(%ebp),%eax
10c706: 50 push %eax
10c707: ff 33 pushl (%ebx)
10c709: 68 40 ba 12 00 push $0x12ba40
10c70e: e8 6d 29 00 00 call 10f080 <_Objects_Get>
switch ( location ) {
10c713: 83 c4 10 add $0x10,%esp
10c716: 8b 55 f4 mov -0xc(%ebp),%edx
10c719: 85 d2 test %edx,%edx
10c71b: 75 4f jne 10c76c <pthread_rwlock_timedwrlock+0x8c>
(pthread_rwlock_t *__rwlock, _CONST struct timespec *__abstime));
int _EXFUN(pthread_rwlock_unlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_wrlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_trywrlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_timedwrlock,
10c71d: 83 fe 03 cmp $0x3,%esi
10c720: 0f 94 c2 sete %dl
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_writing(
10c723: 83 ec 0c sub $0xc,%esp
10c726: 6a 00 push $0x0
10c728: ff 75 f0 pushl -0x10(%ebp)
10c72b: 0f b6 ca movzbl %dl,%ecx
10c72e: 51 push %ecx
10c72f: ff 33 pushl (%ebx)
10c731: 83 c0 10 add $0x10,%eax
10c734: 50 push %eax
10c735: 88 55 e4 mov %dl,-0x1c(%ebp)
10c738: e8 6f 1d 00 00 call 10e4ac <_CORE_RWLock_Obtain_for_writing>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
10c73d: 83 c4 20 add $0x20,%esp
10c740: e8 ef 33 00 00 call 10fb34 <_Thread_Enable_dispatch>
if ( !do_wait &&
10c745: 8a 55 e4 mov -0x1c(%ebp),%dl
10c748: 84 d2 test %dl,%dl
10c74a: 75 40 jne 10c78c <pthread_rwlock_timedwrlock+0xac>
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
10c74c: a1 98 bd 12 00 mov 0x12bd98,%eax
10c751: 8b 40 34 mov 0x34(%eax),%eax
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
10c754: 83 f8 02 cmp $0x2,%eax
10c757: 74 1f je 10c778 <pthread_rwlock_timedwrlock+0x98>
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
10c759: 83 ec 0c sub $0xc,%esp
10c75c: 50 push %eax
10c75d: e8 36 00 00 00 call 10c798 <_POSIX_RWLock_Translate_core_RWLock_return_code>
10c762: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c765: 8d 65 f8 lea -0x8(%ebp),%esp
10c768: 5b pop %ebx
10c769: 5e pop %esi
10c76a: c9 leave
10c76b: c3 ret
_Thread_Enable_dispatch();
if ( !do_wait &&
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
10c76c: b8 16 00 00 00 mov $0x16,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c771: 8d 65 f8 lea -0x8(%ebp),%esp
10c774: 5b pop %ebx
10c775: 5e pop %esi
10c776: c9 leave
10c777: c3 ret
);
_Thread_Enable_dispatch();
if ( !do_wait &&
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
10c778: 85 f6 test %esi,%esi
10c77a: 74 f0 je 10c76c <pthread_rwlock_timedwrlock+0x8c><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10c77c: 4e dec %esi
10c77d: 83 fe 01 cmp $0x1,%esi
10c780: 77 d7 ja 10c759 <pthread_rwlock_timedwrlock+0x79><== NEVER TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
10c782: b8 74 00 00 00 mov $0x74,%eax
10c787: eb e8 jmp 10c771 <pthread_rwlock_timedwrlock+0x91>
10c789: 8d 76 00 lea 0x0(%esi),%esi
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
10c78c: a1 98 bd 12 00 mov 0x12bd98,%eax
10c791: 8b 40 34 mov 0x34(%eax),%eax
10c794: eb c3 jmp 10c759 <pthread_rwlock_timedwrlock+0x79>
0010cef4 <pthread_rwlockattr_destroy>:
*/
int pthread_rwlockattr_destroy(
pthread_rwlockattr_t *attr
)
{
10cef4: 55 push %ebp
10cef5: 89 e5 mov %esp,%ebp
10cef7: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || attr->is_initialized == false )
10cefa: 85 c0 test %eax,%eax
10cefc: 74 12 je 10cf10 <pthread_rwlockattr_destroy+0x1c>
10cefe: 8b 10 mov (%eax),%edx
10cf00: 85 d2 test %edx,%edx
10cf02: 74 0c je 10cf10 <pthread_rwlockattr_destroy+0x1c>
return EINVAL;
attr->is_initialized = false;
10cf04: c7 00 00 00 00 00 movl $0x0,(%eax)
return 0;
10cf0a: 31 c0 xor %eax,%eax
}
10cf0c: c9 leave
10cf0d: c3 ret
10cf0e: 66 90 xchg %ax,%ax
int pthread_rwlockattr_destroy(
pthread_rwlockattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
return EINVAL;
10cf10: b8 16 00 00 00 mov $0x16,%eax
attr->is_initialized = false;
return 0;
}
10cf15: c9 leave
10cf16: c3 ret
0010cf60 <pthread_rwlockattr_setpshared>:
int pthread_rwlockattr_setpshared(
pthread_rwlockattr_t *attr,
int pshared
)
{
10cf60: 55 push %ebp
10cf61: 89 e5 mov %esp,%ebp
10cf63: 8b 45 08 mov 0x8(%ebp),%eax
10cf66: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr )
10cf69: 85 c0 test %eax,%eax
10cf6b: 74 0b je 10cf78 <pthread_rwlockattr_setpshared+0x18>
return EINVAL;
if ( !attr->is_initialized )
10cf6d: 8b 08 mov (%eax),%ecx
10cf6f: 85 c9 test %ecx,%ecx
10cf71: 74 05 je 10cf78 <pthread_rwlockattr_setpshared+0x18>
return EINVAL;
switch ( pshared ) {
10cf73: 83 fa 01 cmp $0x1,%edx
10cf76: 76 08 jbe 10cf80 <pthread_rwlockattr_setpshared+0x20><== ALWAYS TAKEN
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
return 0;
default:
return EINVAL;
10cf78: b8 16 00 00 00 mov $0x16,%eax
}
}
10cf7d: c9 leave
10cf7e: c3 ret
10cf7f: 90 nop
return EINVAL;
switch ( pshared ) {
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
10cf80: 89 50 04 mov %edx,0x4(%eax)
return 0;
10cf83: 31 c0 xor %eax,%eax
default:
return EINVAL;
}
}
10cf85: c9 leave
10cf86: c3 ret
0010b214 <pthread_setcancelstate>:
int pthread_setcancelstate(
int state,
int *oldstate
)
{
10b214: 55 push %ebp
10b215: 89 e5 mov %esp,%ebp
10b217: 53 push %ebx
10b218: 83 ec 04 sub $0x4,%esp
10b21b: 8b 55 08 mov 0x8(%ebp),%edx
10b21e: 8b 45 0c mov 0xc(%ebp),%eax
* Don't even think about deleting a resource from an ISR.
* Besides this request is supposed to be for _Thread_Executing
* and the ISR context is not a thread.
*/
if ( _ISR_Is_in_progress() )
10b221: 8b 0d 14 97 12 00 mov 0x129714,%ecx
10b227: 85 c9 test %ecx,%ecx
10b229: 75 15 jne 10b240 <pthread_setcancelstate+0x2c>
return EPROTO;
if ( !oldstate )
10b22b: 85 c0 test %eax,%eax
10b22d: 74 05 je 10b234 <pthread_setcancelstate+0x20>
return EINVAL;
if ( state != PTHREAD_CANCEL_ENABLE && state != PTHREAD_CANCEL_DISABLE )
10b22f: 83 fa 01 cmp $0x1,%edx
10b232: 76 18 jbe 10b24c <pthread_setcancelstate+0x38>
return EINVAL;
10b234: b8 16 00 00 00 mov $0x16,%eax
/*
* _Thread_Enable_dispatch is invoked by above call.
*/
return 0;
}
10b239: 8b 5d fc mov -0x4(%ebp),%ebx
10b23c: c9 leave
10b23d: c3 ret
10b23e: 66 90 xchg %ax,%ax
* Besides this request is supposed to be for _Thread_Executing
* and the ISR context is not a thread.
*/
if ( _ISR_Is_in_progress() )
return EPROTO;
10b240: b8 47 00 00 00 mov $0x47,%eax
/*
* _Thread_Enable_dispatch is invoked by above call.
*/
return 0;
}
10b245: 8b 5d fc mov -0x4(%ebp),%ebx
10b248: c9 leave
10b249: c3 ret
10b24a: 66 90 xchg %ax,%ax
return EINVAL;
if ( state != PTHREAD_CANCEL_ENABLE && state != PTHREAD_CANCEL_DISABLE )
return EINVAL;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
10b24c: 8b 0d 18 97 12 00 mov 0x129718,%ecx
10b252: 8b 89 ec 00 00 00 mov 0xec(%ecx),%ecx
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b258: 8b 1d 30 91 12 00 mov 0x129130,%ebx
10b25e: 43 inc %ebx
10b25f: 89 1d 30 91 12 00 mov %ebx,0x129130
_Thread_Disable_dispatch();
*oldstate = thread_support->cancelability_state;
10b265: 8b 99 d8 00 00 00 mov 0xd8(%ecx),%ebx
10b26b: 89 18 mov %ebx,(%eax)
thread_support->cancelability_state = state;
10b26d: 89 91 d8 00 00 00 mov %edx,0xd8(%ecx)
_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch(_Thread_Executing);
10b273: 83 ec 0c sub $0xc,%esp
10b276: ff 35 18 97 12 00 pushl 0x129718
10b27c: e8 5b 54 00 00 call 1106dc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>
/*
* _Thread_Enable_dispatch is invoked by above call.
*/
return 0;
10b281: 83 c4 10 add $0x10,%esp
10b284: 31 c0 xor %eax,%eax
}
10b286: 8b 5d fc mov -0x4(%ebp),%ebx
10b289: c9 leave
10b28a: c3 ret
0010b28c <pthread_setcanceltype>:
int pthread_setcanceltype(
int type,
int *oldtype
)
{
10b28c: 55 push %ebp
10b28d: 89 e5 mov %esp,%ebp
10b28f: 53 push %ebx
10b290: 83 ec 04 sub $0x4,%esp
10b293: 8b 55 08 mov 0x8(%ebp),%edx
10b296: 8b 45 0c mov 0xc(%ebp),%eax
* Don't even think about deleting a resource from an ISR.
* Besides this request is supposed to be for _Thread_Executing
* and the ISR context is not a thread.
*/
if ( _ISR_Is_in_progress() )
10b299: 8b 0d 14 97 12 00 mov 0x129714,%ecx
10b29f: 85 c9 test %ecx,%ecx
10b2a1: 75 15 jne 10b2b8 <pthread_setcanceltype+0x2c>
return EPROTO;
if ( !oldtype )
10b2a3: 85 c0 test %eax,%eax
10b2a5: 74 05 je 10b2ac <pthread_setcanceltype+0x20>
return EINVAL;
if ( type != PTHREAD_CANCEL_DEFERRED && type != PTHREAD_CANCEL_ASYNCHRONOUS )
10b2a7: 83 fa 01 cmp $0x1,%edx
10b2aa: 76 18 jbe 10b2c4 <pthread_setcanceltype+0x38>
return EINVAL;
10b2ac: b8 16 00 00 00 mov $0x16,%eax
/*
* _Thread_Enable_dispatch is invoked by above call.
*/
return 0;
}
10b2b1: 8b 5d fc mov -0x4(%ebp),%ebx
10b2b4: c9 leave
10b2b5: c3 ret
10b2b6: 66 90 xchg %ax,%ax
* Besides this request is supposed to be for _Thread_Executing
* and the ISR context is not a thread.
*/
if ( _ISR_Is_in_progress() )
return EPROTO;
10b2b8: b8 47 00 00 00 mov $0x47,%eax
/*
* _Thread_Enable_dispatch is invoked by above call.
*/
return 0;
}
10b2bd: 8b 5d fc mov -0x4(%ebp),%ebx
10b2c0: c9 leave
10b2c1: c3 ret
10b2c2: 66 90 xchg %ax,%ax
return EINVAL;
if ( type != PTHREAD_CANCEL_DEFERRED && type != PTHREAD_CANCEL_ASYNCHRONOUS )
return EINVAL;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
10b2c4: 8b 0d 18 97 12 00 mov 0x129718,%ecx
10b2ca: 8b 89 ec 00 00 00 mov 0xec(%ecx),%ecx
10b2d0: 8b 1d 30 91 12 00 mov 0x129130,%ebx
10b2d6: 43 inc %ebx
10b2d7: 89 1d 30 91 12 00 mov %ebx,0x129130
_Thread_Disable_dispatch();
*oldtype = thread_support->cancelability_type;
10b2dd: 8b 99 dc 00 00 00 mov 0xdc(%ecx),%ebx
10b2e3: 89 18 mov %ebx,(%eax)
thread_support->cancelability_type = type;
10b2e5: 89 91 dc 00 00 00 mov %edx,0xdc(%ecx)
_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch(_Thread_Executing);
10b2eb: 83 ec 0c sub $0xc,%esp
10b2ee: ff 35 18 97 12 00 pushl 0x129718
10b2f4: e8 e3 53 00 00 call 1106dc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>
/*
* _Thread_Enable_dispatch is invoked by above call.
*/
return 0;
10b2f9: 83 c4 10 add $0x10,%esp
10b2fc: 31 c0 xor %eax,%eax
}
10b2fe: 8b 5d fc mov -0x4(%ebp),%ebx
10b301: c9 leave
10b302: c3 ret
0010dd14 <pthread_setschedparam>:
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
10dd14: 55 push %ebp
10dd15: 89 e5 mov %esp,%ebp
10dd17: 57 push %edi
10dd18: 56 push %esi
10dd19: 53 push %ebx
10dd1a: 83 ec 2c sub $0x2c,%esp
10dd1d: 8b 75 10 mov 0x10(%ebp),%esi
int rc;
/*
* Check all the parameters
*/
if ( !param )
10dd20: 85 f6 test %esi,%esi
10dd22: 0f 84 cc 00 00 00 je 10ddf4 <pthread_setschedparam+0xe0>
return EINVAL;
rc = _POSIX_Thread_Translate_sched_param(
10dd28: 8d 45 e0 lea -0x20(%ebp),%eax
10dd2b: 50 push %eax
10dd2c: 8d 45 e4 lea -0x1c(%ebp),%eax
10dd2f: 50 push %eax
10dd30: 56 push %esi
10dd31: ff 75 0c pushl 0xc(%ebp)
10dd34: e8 f7 5b 00 00 call 113930 <_POSIX_Thread_Translate_sched_param>
10dd39: 89 c3 mov %eax,%ebx
policy,
param,
&budget_algorithm,
&budget_callout
);
if ( rc )
10dd3b: 83 c4 10 add $0x10,%esp
10dd3e: 85 c0 test %eax,%eax
10dd40: 74 0a je 10dd4c <pthread_setschedparam+0x38>
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
10dd42: 89 d8 mov %ebx,%eax
10dd44: 8d 65 f4 lea -0xc(%ebp),%esp
10dd47: 5b pop %ebx
10dd48: 5e pop %esi
10dd49: 5f pop %edi
10dd4a: c9 leave
10dd4b: c3 ret
10dd4c: 50 push %eax
return rc;
/*
* Actually change the scheduling policy and parameters
*/
the_thread = _POSIX_Threads_Get( thread, &location );
10dd4d: 8d 45 dc lea -0x24(%ebp),%eax
10dd50: 50 push %eax
10dd51: ff 75 08 pushl 0x8(%ebp)
10dd54: 68 60 d0 12 00 push $0x12d060
10dd59: e8 a2 1f 00 00 call 10fd00 <_Objects_Get>
10dd5e: 89 c2 mov %eax,%edx
switch ( location ) {
10dd60: 83 c4 10 add $0x10,%esp
10dd63: 8b 7d dc mov -0x24(%ebp),%edi
10dd66: 85 ff test %edi,%edi
10dd68: 0f 85 96 00 00 00 jne 10de04 <pthread_setschedparam+0xf0>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10dd6e: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
10dd74: 89 45 d4 mov %eax,-0x2c(%ebp)
if ( api->schedpolicy == SCHED_SPORADIC )
10dd77: 83 b8 84 00 00 00 04 cmpl $0x4,0x84(%eax)
10dd7e: 0f 84 cc 00 00 00 je 10de50 <pthread_setschedparam+0x13c>
(void) _Watchdog_Remove( &api->Sporadic_timer );
api->schedpolicy = policy;
10dd84: 8b 45 0c mov 0xc(%ebp),%eax
10dd87: 8b 4d d4 mov -0x2c(%ebp),%ecx
10dd8a: 89 81 84 00 00 00 mov %eax,0x84(%ecx)
api->schedparam = *param;
10dd90: 89 cf mov %ecx,%edi
10dd92: 81 c7 88 00 00 00 add $0x88,%edi
10dd98: b9 07 00 00 00 mov $0x7,%ecx
10dd9d: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
the_thread->budget_algorithm = budget_algorithm;
10dd9f: 8b 45 e4 mov -0x1c(%ebp),%eax
10dda2: 89 42 7c mov %eax,0x7c(%edx)
the_thread->budget_callout = budget_callout;
10dda5: 8b 45 e0 mov -0x20(%ebp),%eax
10dda8: 89 82 80 00 00 00 mov %eax,0x80(%edx)
switch ( api->schedpolicy ) {
10ddae: 8b 75 0c mov 0xc(%ebp),%esi
10ddb1: 85 f6 test %esi,%esi
10ddb3: 78 2e js 10dde3 <pthread_setschedparam+0xcf><== NEVER TAKEN
10ddb5: 83 7d 0c 02 cmpl $0x2,0xc(%ebp)
10ddb9: 7f 59 jg 10de14 <pthread_setschedparam+0x100>
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
10ddbb: a1 60 cd 12 00 mov 0x12cd60,%eax
10ddc0: 89 42 78 mov %eax,0x78(%edx)
10ddc3: 0f b6 05 1c 8a 12 00 movzbl 0x128a1c,%eax
10ddca: 8b 4d d4 mov -0x2c(%ebp),%ecx
10ddcd: 2b 81 88 00 00 00 sub 0x88(%ecx),%eax
the_thread->real_priority =
10ddd3: 89 42 18 mov %eax,0x18(%edx)
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
10ddd6: 51 push %ecx
10ddd7: 6a 01 push $0x1
10ddd9: 50 push %eax
10ddda: 52 push %edx
10dddb: e8 20 25 00 00 call 110300 <_Thread_Change_priority>
the_thread,
the_thread->real_priority,
true
);
break;
10dde0: 83 c4 10 add $0x10,%esp
_Watchdog_Remove( &api->Sporadic_timer );
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
break;
}
_Thread_Enable_dispatch();
10dde3: e8 cc 29 00 00 call 1107b4 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
10dde8: 89 d8 mov %ebx,%eax
10ddea: 8d 65 f4 lea -0xc(%ebp),%esp
10dded: 5b pop %ebx
10ddee: 5e pop %esi
10ddef: 5f pop %edi
10ddf0: c9 leave
10ddf1: c3 ret
10ddf2: 66 90 xchg %ax,%ax
/*
* Check all the parameters
*/
if ( !param )
return EINVAL;
10ddf4: bb 16 00 00 00 mov $0x16,%ebx
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
10ddf9: 89 d8 mov %ebx,%eax
10ddfb: 8d 65 f4 lea -0xc(%ebp),%esp
10ddfe: 5b pop %ebx
10ddff: 5e pop %esi
10de00: 5f pop %edi
10de01: c9 leave
10de02: c3 ret
10de03: 90 nop
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
10de04: bb 03 00 00 00 mov $0x3,%ebx
}
10de09: 89 d8 mov %ebx,%eax
10de0b: 8d 65 f4 lea -0xc(%ebp),%esp
10de0e: 5b pop %ebx
10de0f: 5e pop %esi
10de10: 5f pop %edi
10de11: c9 leave
10de12: c3 ret
10de13: 90 nop
api->schedpolicy = policy;
api->schedparam = *param;
the_thread->budget_algorithm = budget_algorithm;
the_thread->budget_callout = budget_callout;
switch ( api->schedpolicy ) {
10de14: 83 7d 0c 04 cmpl $0x4,0xc(%ebp)
10de18: 75 c9 jne 10dde3 <pthread_setschedparam+0xcf><== NEVER TAKEN
true
);
break;
case SCHED_SPORADIC:
api->ss_high_priority = api->schedparam.sched_priority;
10de1a: 8b 4d d4 mov -0x2c(%ebp),%ecx
10de1d: 8b 81 88 00 00 00 mov 0x88(%ecx),%eax
10de23: 89 81 a4 00 00 00 mov %eax,0xa4(%ecx)
_Watchdog_Remove( &api->Sporadic_timer );
10de29: 83 ec 0c sub $0xc,%esp
10de2c: 89 c8 mov %ecx,%eax
10de2e: 05 a8 00 00 00 add $0xa8,%eax
10de33: 50 push %eax
10de34: 89 55 d0 mov %edx,-0x30(%ebp)
10de37: e8 10 3a 00 00 call 11184c <_Watchdog_Remove>
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
10de3c: 58 pop %eax
10de3d: 5a pop %edx
10de3e: 8b 55 d0 mov -0x30(%ebp),%edx
10de41: 52 push %edx
10de42: 6a 00 push $0x0
10de44: e8 af fd ff ff call 10dbf8 <_POSIX_Threads_Sporadic_budget_TSR>
break;
10de49: 83 c4 10 add $0x10,%esp
10de4c: eb 95 jmp 10dde3 <pthread_setschedparam+0xcf>
10de4e: 66 90 xchg %ax,%ax
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
10de50: 83 ec 0c sub $0xc,%esp
10de53: 05 a8 00 00 00 add $0xa8,%eax
10de58: 50 push %eax
10de59: 89 55 d0 mov %edx,-0x30(%ebp)
10de5c: e8 eb 39 00 00 call 11184c <_Watchdog_Remove>
10de61: 83 c4 10 add $0x10,%esp
10de64: 8b 55 d0 mov -0x30(%ebp),%edx
10de67: e9 18 ff ff ff jmp 10dd84 <pthread_setschedparam+0x70>
00111cf4 <pthread_sigmask>:
int pthread_sigmask(
int how,
const sigset_t *set,
sigset_t *oset
)
{
111cf4: 55 push %ebp
111cf5: 89 e5 mov %esp,%ebp
111cf7: 56 push %esi
111cf8: 53 push %ebx
111cf9: 8b 4d 08 mov 0x8(%ebp),%ecx
111cfc: 8b 55 0c mov 0xc(%ebp),%edx
111cff: 8b 5d 10 mov 0x10(%ebp),%ebx
POSIX_API_Control *api;
if ( !set && !oset )
111d02: 85 d2 test %edx,%edx
111d04: 0f 84 8a 00 00 00 je 111d94 <pthread_sigmask+0xa0>
rtems_set_errno_and_return_minus_one( EINVAL );
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
111d0a: a1 18 a4 12 00 mov 0x12a418,%eax
111d0f: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
if ( oset )
111d15: 85 db test %ebx,%ebx
111d17: 74 0c je 111d25 <pthread_sigmask+0x31>
*oset = api->signals_blocked;
111d19: 8b b0 d0 00 00 00 mov 0xd0(%eax),%esi
111d1f: 89 33 mov %esi,(%ebx)
if ( !set )
111d21: 85 d2 test %edx,%edx
111d23: 74 3b je 111d60 <pthread_sigmask+0x6c>
return 0;
switch ( how ) {
111d25: 83 f9 01 cmp $0x1,%ecx
111d28: 74 5e je 111d88 <pthread_sigmask+0x94>
111d2a: 83 f9 02 cmp $0x2,%ecx
111d2d: 74 39 je 111d68 <pthread_sigmask+0x74>
111d2f: 85 c9 test %ecx,%ecx
111d31: 75 41 jne 111d74 <pthread_sigmask+0x80>
break;
case SIG_UNBLOCK:
api->signals_blocked &= ~*set;
break;
case SIG_SETMASK:
api->signals_blocked = *set;
111d33: 8b 12 mov (%edx),%edx
111d35: 89 90 d0 00 00 00 mov %edx,0xd0(%eax)
/* XXX are there critical section problems here? */
/* XXX evaluate the new set */
if ( ~api->signals_blocked &
(api->signals_pending | _POSIX_signals_Pending) ) {
111d3b: 8b 15 88 a6 12 00 mov 0x12a688,%edx
111d41: 0b 90 d4 00 00 00 or 0xd4(%eax),%edx
/* XXX are there critical section problems here? */
/* XXX evaluate the new set */
if ( ~api->signals_blocked &
111d47: 8b 80 d0 00 00 00 mov 0xd0(%eax),%eax
111d4d: f7 d0 not %eax
111d4f: 85 c2 test %eax,%edx
111d51: 74 0d je 111d60 <pthread_sigmask+0x6c>
(api->signals_pending | _POSIX_signals_Pending) ) {
_Thread_Dispatch();
111d53: e8 1c c9 ff ff call 10e674 <_Thread_Dispatch>
}
return 0;
111d58: 31 c0 xor %eax,%eax
}
111d5a: 5b pop %ebx
111d5b: 5e pop %esi
111d5c: c9 leave
111d5d: c3 ret
111d5e: 66 90 xchg %ax,%ax
if ( ~api->signals_blocked &
(api->signals_pending | _POSIX_signals_Pending) ) {
_Thread_Dispatch();
}
return 0;
111d60: 31 c0 xor %eax,%eax
}
111d62: 5b pop %ebx
111d63: 5e pop %esi
111d64: c9 leave
111d65: c3 ret
111d66: 66 90 xchg %ax,%ax
switch ( how ) {
case SIG_BLOCK:
api->signals_blocked |= *set;
break;
case SIG_UNBLOCK:
api->signals_blocked &= ~*set;
111d68: 8b 12 mov (%edx),%edx
111d6a: f7 d2 not %edx
111d6c: 21 90 d0 00 00 00 and %edx,0xd0(%eax)
break;
111d72: eb c7 jmp 111d3b <pthread_sigmask+0x47>
case SIG_SETMASK:
api->signals_blocked = *set;
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
111d74: e8 a7 25 00 00 call 114320 <__errno>
111d79: c7 00 16 00 00 00 movl $0x16,(%eax)
111d7f: b8 ff ff ff ff mov $0xffffffff,%eax
(api->signals_pending | _POSIX_signals_Pending) ) {
_Thread_Dispatch();
}
return 0;
}
111d84: 5b pop %ebx
111d85: 5e pop %esi
111d86: c9 leave
111d87: c3 ret
if ( !set )
return 0;
switch ( how ) {
case SIG_BLOCK:
api->signals_blocked |= *set;
111d88: 8b 12 mov (%edx),%edx
111d8a: 09 90 d0 00 00 00 or %edx,0xd0(%eax)
break;
111d90: eb a9 jmp 111d3b <pthread_sigmask+0x47>
111d92: 66 90 xchg %ax,%ax
sigset_t *oset
)
{
POSIX_API_Control *api;
if ( !set && !oset )
111d94: 85 db test %ebx,%ebx
111d96: 74 dc je 111d74 <pthread_sigmask+0x80>
rtems_set_errno_and_return_minus_one( EINVAL );
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
111d98: a1 18 a4 12 00 mov 0x12a418,%eax
111d9d: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
111da3: e9 71 ff ff ff jmp 111d19 <pthread_sigmask+0x25>
0010bb84 <pthread_testcancel>:
*
* 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
*/
void pthread_testcancel( void )
{
10bb84: 55 push %ebp
10bb85: 89 e5 mov %esp,%ebp
10bb87: 83 ec 08 sub $0x8,%esp
* Don't even think about deleting a resource from an ISR.
* Besides this request is supposed to be for _Thread_Executing
* and the ISR context is not a thread.
*/
if ( _ISR_Is_in_progress() )
10bb8a: 8b 0d b4 9e 12 00 mov 0x129eb4,%ecx
10bb90: 85 c9 test %ecx,%ecx
10bb92: 75 44 jne 10bbd8 <pthread_testcancel+0x54><== NEVER TAKEN
return;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
10bb94: a1 b8 9e 12 00 mov 0x129eb8,%eax
10bb99: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
10bb9f: 8b 15 d0 98 12 00 mov 0x1298d0,%edx
10bba5: 42 inc %edx
10bba6: 89 15 d0 98 12 00 mov %edx,0x1298d0
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
10bbac: 8b 90 d8 00 00 00 mov 0xd8(%eax),%edx
10bbb2: 85 d2 test %edx,%edx
10bbb4: 75 26 jne 10bbdc <pthread_testcancel+0x58><== NEVER TAKEN
10bbb6: 8b 80 e0 00 00 00 mov 0xe0(%eax),%eax
10bbbc: 85 c0 test %eax,%eax
10bbbe: 74 1c je 10bbdc <pthread_testcancel+0x58>
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
10bbc0: e8 c3 28 00 00 call 10e488 <_Thread_Enable_dispatch>
if ( cancel )
_POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED );
10bbc5: 83 ec 08 sub $0x8,%esp
10bbc8: 6a ff push $0xffffffff
10bbca: ff 35 b8 9e 12 00 pushl 0x129eb8
10bbd0: e8 53 5b 00 00 call 111728 <_POSIX_Thread_Exit>
10bbd5: 83 c4 10 add $0x10,%esp
}
10bbd8: c9 leave
10bbd9: c3 ret
10bbda: 66 90 xchg %ax,%ax
10bbdc: c9 leave
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
10bbdd: e9 a6 28 00 00 jmp 10e488 <_Thread_Enable_dispatch>
0011f2bc <read>:
ssize_t read(
int fd,
void *buffer,
size_t count
)
{
11f2bc: 55 push %ebp
11f2bd: 89 e5 mov %esp,%ebp
11f2bf: 53 push %ebx
11f2c0: 83 ec 04 sub $0x4,%esp
11f2c3: 8b 4d 08 mov 0x8(%ebp),%ecx
11f2c6: 8b 45 0c mov 0xc(%ebp),%eax
11f2c9: 8b 55 10 mov 0x10(%ebp),%edx
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
11f2cc: 3b 0d 2c 3a 12 00 cmp 0x123a2c,%ecx
11f2d2: 73 50 jae 11f324 <read+0x68> <== NEVER TAKEN
iop = rtems_libio_iop( fd );
11f2d4: c1 e1 03 shl $0x3,%ecx
11f2d7: 8d 1c cd 00 00 00 00 lea 0x0(,%ecx,8),%ebx
11f2de: 29 cb sub %ecx,%ebx
11f2e0: 03 1d c0 7c 12 00 add 0x127cc0,%ebx
rtems_libio_check_is_open( iop );
11f2e6: 8b 4b 14 mov 0x14(%ebx),%ecx
11f2e9: f6 c5 01 test $0x1,%ch
11f2ec: 74 36 je 11f324 <read+0x68>
rtems_libio_check_buffer( buffer );
11f2ee: 85 c0 test %eax,%eax
11f2f0: 74 46 je 11f338 <read+0x7c> <== NEVER TAKEN
rtems_libio_check_count( count );
11f2f2: 85 d2 test %edx,%edx
11f2f4: 74 26 je 11f31c <read+0x60>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ );
11f2f6: 83 e1 02 and $0x2,%ecx
11f2f9: 74 3d je 11f338 <read+0x7c>
/*
* Now process the read().
*/
rc = (*iop->pathinfo.handlers->read_h)( iop, buffer, count );
11f2fb: 51 push %ecx
11f2fc: 8b 4b 20 mov 0x20(%ebx),%ecx
11f2ff: 52 push %edx
11f300: 50 push %eax
11f301: 53 push %ebx
11f302: ff 51 08 call *0x8(%ecx)
if ( rc > 0 )
11f305: 83 c4 10 add $0x10,%esp
11f308: 85 c0 test %eax,%eax
11f30a: 7e 0b jle 11f317 <read+0x5b>
iop->offset += rc;
11f30c: 89 c1 mov %eax,%ecx
11f30e: c1 f9 1f sar $0x1f,%ecx
11f311: 01 43 0c add %eax,0xc(%ebx)
11f314: 11 4b 10 adc %ecx,0x10(%ebx)
return rc;
}
11f317: 8b 5d fc mov -0x4(%ebp),%ebx
11f31a: c9 leave
11f31b: c3 ret
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open( iop );
rtems_libio_check_buffer( buffer );
rtems_libio_check_count( count );
11f31c: 31 c0 xor %eax,%eax
if ( rc > 0 )
iop->offset += rc;
return rc;
}
11f31e: 8b 5d fc mov -0x4(%ebp),%ebx
11f321: c9 leave
11f322: c3 ret
11f323: 90 nop
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open( iop );
11f324: e8 eb 3f ff ff call 113314 <__errno>
11f329: c7 00 09 00 00 00 movl $0x9,(%eax)
11f32f: b8 ff ff ff ff mov $0xffffffff,%eax
11f334: eb e1 jmp 11f317 <read+0x5b>
11f336: 66 90 xchg %ax,%ax
rtems_libio_check_buffer( buffer );
rtems_libio_check_count( count );
rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ );
11f338: e8 d7 3f ff ff call 113314 <__errno>
11f33d: c7 00 16 00 00 00 movl $0x16,(%eax)
11f343: b8 ff ff ff ff mov $0xffffffff,%eax
11f348: eb cd jmp 11f317 <read+0x5b>
0010b068 <readlink>:
ssize_t readlink(
const char *pathname,
char *buf,
size_t bufsize
)
{
10b068: 55 push %ebp
10b069: 89 e5 mov %esp,%ebp
10b06b: 57 push %edi
10b06c: 56 push %esi
10b06d: 53 push %ebx
10b06e: 83 ec 3c sub $0x3c,%esp
10b071: 8b 55 08 mov 0x8(%ebp),%edx
10b074: 8b 5d 0c mov 0xc(%ebp),%ebx
rtems_filesystem_location_info_t loc;
int result;
if (!buf)
10b077: 85 db test %ebx,%ebx
10b079: 74 6d je 10b0e8 <readlink+0x80>
rtems_set_errno_and_return_minus_one( EFAULT );
result = rtems_filesystem_evaluate_path( pathname, strlen( pathname ),
10b07b: 31 c0 xor %eax,%eax
10b07d: b9 ff ff ff ff mov $0xffffffff,%ecx
10b082: 89 d7 mov %edx,%edi
10b084: f2 ae repnz scas %es:(%edi),%al
10b086: f7 d1 not %ecx
10b088: 49 dec %ecx
10b089: 83 ec 0c sub $0xc,%esp
10b08c: 6a 00 push $0x0
10b08e: 8d 75 d4 lea -0x2c(%ebp),%esi
10b091: 56 push %esi
10b092: 6a 00 push $0x0
10b094: 51 push %ecx
10b095: 52 push %edx
10b096: e8 79 ee ff ff call 109f14 <rtems_filesystem_evaluate_path>
0, &loc, false );
if ( result != 0 )
10b09b: 83 c4 20 add $0x20,%esp
10b09e: 85 c0 test %eax,%eax
10b0a0: 74 0e je 10b0b0 <readlink+0x48> <== ALWAYS TAKEN
return -1;
10b0a2: b8 ff ff ff ff mov $0xffffffff,%eax <== NOT EXECUTED
result = (*loc.ops->readlink_h)( &loc, buf, bufsize );
rtems_filesystem_freenode( &loc );
return result;
}
10b0a7: 8d 65 f4 lea -0xc(%ebp),%esp
10b0aa: 5b pop %ebx
10b0ab: 5e pop %esi
10b0ac: 5f pop %edi
10b0ad: c9 leave
10b0ae: c3 ret
10b0af: 90 nop
result = rtems_filesystem_evaluate_path( pathname, strlen( pathname ),
0, &loc, false );
if ( result != 0 )
return -1;
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
10b0b0: 83 ec 0c sub $0xc,%esp
10b0b3: 56 push %esi
10b0b4: 8b 45 e0 mov -0x20(%ebp),%eax
10b0b7: ff 50 10 call *0x10(%eax)
10b0ba: 83 c4 10 add $0x10,%esp
10b0bd: 83 f8 04 cmp $0x4,%eax
10b0c0: 75 3e jne 10b100 <readlink+0x98>
rtems_filesystem_freenode( &loc );
rtems_set_errno_and_return_minus_one( EINVAL );
}
result = (*loc.ops->readlink_h)( &loc, buf, bufsize );
10b0c2: 50 push %eax
10b0c3: ff 75 10 pushl 0x10(%ebp)
10b0c6: 53 push %ebx
10b0c7: 56 push %esi
10b0c8: 8b 45 e0 mov -0x20(%ebp),%eax
10b0cb: ff 50 3c call *0x3c(%eax)
rtems_filesystem_freenode( &loc );
10b0ce: 89 34 24 mov %esi,(%esp)
10b0d1: 89 45 c4 mov %eax,-0x3c(%ebp)
10b0d4: e8 13 ef ff ff call 109fec <rtems_filesystem_freenode>
return result;
10b0d9: 83 c4 10 add $0x10,%esp
10b0dc: 8b 45 c4 mov -0x3c(%ebp),%eax
}
10b0df: 8d 65 f4 lea -0xc(%ebp),%esp
10b0e2: 5b pop %ebx
10b0e3: 5e pop %esi
10b0e4: 5f pop %edi
10b0e5: c9 leave
10b0e6: c3 ret
10b0e7: 90 nop
{
rtems_filesystem_location_info_t loc;
int result;
if (!buf)
rtems_set_errno_and_return_minus_one( EFAULT );
10b0e8: e8 53 ad 00 00 call 115e40 <__errno>
10b0ed: c7 00 0e 00 00 00 movl $0xe,(%eax)
10b0f3: b8 ff ff ff ff mov $0xffffffff,%eax
result = (*loc.ops->readlink_h)( &loc, buf, bufsize );
rtems_filesystem_freenode( &loc );
return result;
}
10b0f8: 8d 65 f4 lea -0xc(%ebp),%esp
10b0fb: 5b pop %ebx
10b0fc: 5e pop %esi
10b0fd: 5f pop %edi
10b0fe: c9 leave
10b0ff: c3 ret
0, &loc, false );
if ( result != 0 )
return -1;
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
rtems_filesystem_freenode( &loc );
10b100: 83 ec 0c sub $0xc,%esp
10b103: 56 push %esi
10b104: e8 e3 ee ff ff call 109fec <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( EINVAL );
10b109: e8 32 ad 00 00 call 115e40 <__errno>
10b10e: c7 00 16 00 00 00 movl $0x16,(%eax)
10b114: 83 c4 10 add $0x10,%esp
10b117: b8 ff ff ff ff mov $0xffffffff,%eax
10b11c: eb 89 jmp 10b0a7 <readlink+0x3f>
00109d2c <readv>:
ssize_t readv(
int fd,
const struct iovec *iov,
int iovcnt
)
{
109d2c: 55 push %ebp
109d2d: 89 e5 mov %esp,%ebp
109d2f: 57 push %edi
109d30: 56 push %esi
109d31: 53 push %ebx
109d32: 83 ec 1c sub $0x1c,%esp
109d35: 8b 45 08 mov 0x8(%ebp),%eax
109d38: 8b 5d 0c mov 0xc(%ebp),%ebx
int v;
int bytes;
rtems_libio_t *iop;
bool all_zeros;
rtems_libio_check_fd( fd );
109d3b: 3b 05 4c 41 12 00 cmp 0x12414c,%eax
109d41: 0f 83 ef 00 00 00 jae 109e36 <readv+0x10a>
iop = rtems_libio_iop( fd );
109d47: c1 e0 03 shl $0x3,%eax
109d4a: 8d 34 c5 00 00 00 00 lea 0x0(,%eax,8),%esi
109d51: 29 c6 sub %eax,%esi
109d53: 03 35 e0 83 12 00 add 0x1283e0,%esi
rtems_libio_check_is_open( iop );
109d59: 8b 46 14 mov 0x14(%esi),%eax
109d5c: f6 c4 01 test $0x1,%ah
109d5f: 0f 84 d1 00 00 00 je 109e36 <readv+0x10a>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ );
109d65: a8 02 test $0x2,%al
109d67: 0f 84 97 00 00 00 je 109e04 <readv+0xd8> <== NEVER TAKEN
/*
* Argument validation on IO vector
*/
if ( !iov )
109d6d: 85 db test %ebx,%ebx
109d6f: 0f 84 8f 00 00 00 je 109e04 <readv+0xd8>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt <= 0 )
109d75: 8b 7d 10 mov 0x10(%ebp),%edi
109d78: 85 ff test %edi,%edi
109d7a: 0f 8e 84 00 00 00 jle 109e04 <readv+0xd8>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt > IOV_MAX )
109d80: 81 7d 10 00 04 00 00 cmpl $0x400,0x10(%ebp)
109d87: 7f 7b jg 109e04 <readv+0xd8> <== NEVER TAKEN
109d89: c6 45 e4 01 movb $0x1,-0x1c(%ebp)
109d8d: 31 c0 xor %eax,%eax
109d8f: 31 d2 xor %edx,%edx
109d91: eb 03 jmp 109d96 <readv+0x6a>
109d93: 90 nop
if ( iov[v].iov_base == 0 )
rtems_set_errno_and_return_minus_one( EINVAL );
/* check for wrap */
old = total;
total += iov[v].iov_len;
109d94: 89 fa mov %edi,%edx
/*
* iov[v].iov_len cannot be less than 0 because size_t is unsigned.
* So we only check for zero.
*/
if ( iov[v].iov_base == 0 )
109d96: 8b 0c c3 mov (%ebx,%eax,8),%ecx
109d99: 85 c9 test %ecx,%ecx
109d9b: 74 67 je 109e04 <readv+0xd8>
rtems_set_errno_and_return_minus_one( EINVAL );
/* check for wrap */
old = total;
total += iov[v].iov_len;
109d9d: 8b 4c c3 04 mov 0x4(%ebx,%eax,8),%ecx
109da1: 8d 3c 0a lea (%edx,%ecx,1),%edi
if ( total < old )
109da4: 39 fa cmp %edi,%edx
109da6: 7f 5c jg 109e04 <readv+0xd8>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iov[v].iov_len )
109da8: 85 c9 test %ecx,%ecx
109daa: 74 04 je 109db0 <readv+0x84>
all_zeros = false;
109dac: c6 45 e4 00 movb $0x0,-0x1c(%ebp)
* are obvious errors in the iovec. So this extra loop ensures
* that we do not do anything if there is an argument error.
*/
all_zeros = true;
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
109db0: 40 inc %eax
109db1: 39 45 10 cmp %eax,0x10(%ebp)
109db4: 7f de jg 109d94 <readv+0x68>
/*
* A readv with all zeros logically has no effect. Even though
* OpenGroup didn't address this case as they did with writev(),
* we will handle it the same way for symmetry.
*/
if ( all_zeros == true ) {
109db6: 80 7d e4 00 cmpb $0x0,-0x1c(%ebp)
109dba: 75 68 jne 109e24 <readv+0xf8>
109dbc: 31 ff xor %edi,%edi
109dbe: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
109dc5: eb 1d jmp 109de4 <readv+0xb8>
109dc7: 90 nop
);
if ( bytes < 0 )
return -1;
if ( bytes > 0 ) {
109dc8: 74 0e je 109dd8 <readv+0xac> <== NEVER TAKEN
iop->offset += bytes;
109dca: 89 c1 mov %eax,%ecx
109dcc: c1 f9 1f sar $0x1f,%ecx
109dcf: 01 46 0c add %eax,0xc(%esi)
109dd2: 11 4e 10 adc %ecx,0x10(%esi)
total += bytes;
109dd5: 01 45 e4 add %eax,-0x1c(%ebp)
}
if (bytes != iov[ v ].iov_len)
109dd8: 3b 44 fb 04 cmp 0x4(%ebx,%edi,8),%eax
109ddc: 75 38 jne 109e16 <readv+0xea> <== NEVER TAKEN
}
/*
* Now process the readv().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
109dde: 47 inc %edi
109ddf: 39 7d 10 cmp %edi,0x10(%ebp)
109de2: 7e 32 jle 109e16 <readv+0xea>
bytes = (*iop->pathinfo.handlers->read_h)(
109de4: 50 push %eax
109de5: 8b 46 20 mov 0x20(%esi),%eax
109de8: ff 74 fb 04 pushl 0x4(%ebx,%edi,8)
109dec: ff 34 fb pushl (%ebx,%edi,8)
109def: 56 push %esi
109df0: ff 50 08 call *0x8(%eax)
iop,
iov[v].iov_base,
iov[v].iov_len
);
if ( bytes < 0 )
109df3: 83 c4 10 add $0x10,%esp
109df6: 83 f8 00 cmp $0x0,%eax
109df9: 7d cd jge 109dc8 <readv+0x9c> <== ALWAYS TAKEN
return -1;
109dfb: c7 45 e4 ff ff ff ff movl $0xffffffff,-0x1c(%ebp) <== NOT EXECUTED
109e02: eb 12 jmp 109e16 <readv+0xea> <== NOT EXECUTED
/* check for wrap */
old = total;
total += iov[v].iov_len;
if ( total < old )
rtems_set_errno_and_return_minus_one( EINVAL );
109e04: e8 9b a2 00 00 call 1140a4 <__errno>
109e09: c7 00 16 00 00 00 movl $0x16,(%eax)
109e0f: c7 45 e4 ff ff ff ff movl $0xffffffff,-0x1c(%ebp)
if (bytes != iov[ v ].iov_len)
break;
}
return total;
}
109e16: 8b 45 e4 mov -0x1c(%ebp),%eax
109e19: 8d 65 f4 lea -0xc(%ebp),%esp
109e1c: 5b pop %ebx
109e1d: 5e pop %esi
109e1e: 5f pop %edi
109e1f: c9 leave
109e20: c3 ret
109e21: 8d 76 00 lea 0x0(%esi),%esi
* A readv with all zeros logically has no effect. Even though
* OpenGroup didn't address this case as they did with writev(),
* we will handle it the same way for symmetry.
*/
if ( all_zeros == true ) {
return 0;
109e24: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
if (bytes != iov[ v ].iov_len)
break;
}
return total;
}
109e2b: 8b 45 e4 mov -0x1c(%ebp),%eax
109e2e: 8d 65 f4 lea -0xc(%ebp),%esp
109e31: 5b pop %ebx
109e32: 5e pop %esi
109e33: 5f pop %edi
109e34: c9 leave
109e35: c3 ret
rtems_libio_t *iop;
bool all_zeros;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open( iop );
109e36: e8 69 a2 00 00 call 1140a4 <__errno>
109e3b: c7 00 09 00 00 00 movl $0x9,(%eax)
109e41: c7 45 e4 ff ff ff ff movl $0xffffffff,-0x1c(%ebp)
109e48: eb cc jmp 109e16 <readv+0xea>
0011f3d8 <realloc>:
void *realloc(
void *ptr,
size_t size
)
{
11f3d8: 55 push %ebp
11f3d9: 89 e5 mov %esp,%ebp
11f3db: 57 push %edi
11f3dc: 56 push %esi
11f3dd: 53 push %ebx
11f3de: 83 ec 2c sub $0x2c,%esp
11f3e1: 8b 5d 08 mov 0x8(%ebp),%ebx
11f3e4: 8b 75 0c mov 0xc(%ebp),%esi
uintptr_t old_size;
char *new_area;
MSBUMP(realloc_calls, 1);
11f3e7: ff 05 f0 7c 12 00 incl 0x127cf0
/*
* Do not attempt to allocate memory if in a critical section or ISR.
*/
if (_System_state_Is_up(_System_state_Get())) {
11f3ed: 83 3d 00 80 12 00 03 cmpl $0x3,0x128000
11f3f4: 74 72 je 11f468 <realloc+0x90> <== ALWAYS TAKEN
}
/*
* Continue with realloc().
*/
if ( !ptr )
11f3f6: 85 db test %ebx,%ebx
11f3f8: 74 5e je 11f458 <realloc+0x80>
return malloc( size );
if ( !size ) {
11f3fa: 85 f6 test %esi,%esi
11f3fc: 74 3a je 11f438 <realloc+0x60> <== NEVER TAKEN
free( ptr );
return (void *) 0;
}
if ( !_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, ptr, &old_size) ) {
11f3fe: 52 push %edx
11f3ff: 8d 45 e4 lea -0x1c(%ebp),%eax
11f402: 50 push %eax
11f403: 53 push %ebx
11f404: ff 35 38 3a 12 00 pushl 0x123a38
11f40a: e8 49 01 00 00 call 11f558 <_Protected_heap_Get_block_size>
11f40f: 83 c4 10 add $0x10,%esp
11f412: 84 c0 test %al,%al
11f414: 74 32 je 11f448 <realloc+0x70>
}
/*
* Now resize it.
*/
if ( _Protected_heap_Resize_block( RTEMS_Malloc_Heap, ptr, size ) ) {
11f416: 50 push %eax
11f417: 56 push %esi
11f418: 53 push %ebx
11f419: ff 35 38 3a 12 00 pushl 0x123a38
11f41f: e8 6c 01 00 00 call 11f590 <_Protected_heap_Resize_block>
11f424: 83 c4 10 add $0x10,%esp
11f427: 84 c0 test %al,%al
11f429: 74 5d je 11f488 <realloc+0xb0>
memcpy( new_area, ptr, (size < old_size) ? size : old_size );
free( ptr );
return new_area;
}
11f42b: 89 d8 mov %ebx,%eax
11f42d: 8d 65 f4 lea -0xc(%ebp),%esp
11f430: 5b pop %ebx
11f431: 5e pop %esi
11f432: 5f pop %edi
11f433: c9 leave
11f434: c3 ret
11f435: 8d 76 00 lea 0x0(%esi),%esi
*/
if ( !ptr )
return malloc( size );
if ( !size ) {
free( ptr );
11f438: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
11f43b: 53 push %ebx <== NOT EXECUTED
11f43c: e8 73 8c fe ff call 1080b4 <free> <== NOT EXECUTED
return (void *) 0;
11f441: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
11f444: 31 db xor %ebx,%ebx <== NOT EXECUTED
11f446: eb e3 jmp 11f42b <realloc+0x53> <== NOT EXECUTED
}
if ( !_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, ptr, &old_size) ) {
errno = EINVAL;
11f448: e8 c7 3e ff ff call 113314 <__errno>
11f44d: c7 00 16 00 00 00 movl $0x16,(%eax)
return (void *) 0;
11f453: 31 db xor %ebx,%ebx
11f455: eb d4 jmp 11f42b <realloc+0x53>
11f457: 90 nop
/*
* Continue with realloc().
*/
if ( !ptr )
return malloc( size );
11f458: 83 ec 0c sub $0xc,%esp
11f45b: 56 push %esi
11f45c: e8 27 8f fe ff call 108388 <malloc>
11f461: 89 c3 mov %eax,%ebx
11f463: 83 c4 10 add $0x10,%esp
11f466: eb c3 jmp 11f42b <realloc+0x53>
/*
* Do not attempt to allocate memory if in a critical section or ISR.
*/
if (_System_state_Is_up(_System_state_Get())) {
if (_Thread_Dispatch_disable_level > 0)
11f468: a1 30 7e 12 00 mov 0x127e30,%eax
11f46d: 85 c0 test %eax,%eax
11f46f: 74 04 je 11f475 <realloc+0x9d> <== ALWAYS TAKEN
new_area = malloc( size );
MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */
if ( !new_area ) {
return (void *) 0;
11f471: 31 db xor %ebx,%ebx
11f473: eb b6 jmp 11f42b <realloc+0x53>
if (_System_state_Is_up(_System_state_Get())) {
if (_Thread_Dispatch_disable_level > 0)
return (void *) 0;
if (_ISR_Nest_level > 0)
11f475: 8b 0d 14 84 12 00 mov 0x128414,%ecx
11f47b: 85 c9 test %ecx,%ecx
11f47d: 0f 84 73 ff ff ff je 11f3f6 <realloc+0x1e> <== ALWAYS TAKEN
new_area = malloc( size );
MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */
if ( !new_area ) {
return (void *) 0;
11f483: 31 db xor %ebx,%ebx
11f485: eb a4 jmp 11f42b <realloc+0x53> <== NOT EXECUTED
11f487: 90 nop <== NOT EXECUTED
* There used to be a free on this error case but it is wrong to
* free the memory per OpenGroup Single UNIX Specification V2
* and the C Standard.
*/
new_area = malloc( size );
11f488: 83 ec 0c sub $0xc,%esp
11f48b: 56 push %esi
11f48c: e8 f7 8e fe ff call 108388 <malloc>
MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */
11f491: ff 0d e4 7c 12 00 decl 0x127ce4
if ( !new_area ) {
11f497: 83 c4 10 add $0x10,%esp
11f49a: 85 c0 test %eax,%eax
11f49c: 74 d3 je 11f471 <realloc+0x99>
return (void *) 0;
}
memcpy( new_area, ptr, (size < old_size) ? size : old_size );
11f49e: 8b 55 e4 mov -0x1c(%ebp),%edx
11f4a1: 89 f1 mov %esi,%ecx
11f4a3: 39 d6 cmp %edx,%esi
11f4a5: 76 02 jbe 11f4a9 <realloc+0xd1> <== NEVER TAKEN
11f4a7: 89 d1 mov %edx,%ecx
11f4a9: 89 c7 mov %eax,%edi
11f4ab: 89 de mov %ebx,%esi
11f4ad: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
free( ptr );
11f4af: 83 ec 0c sub $0xc,%esp
11f4b2: 53 push %ebx
11f4b3: 89 45 d4 mov %eax,-0x2c(%ebp)
11f4b6: e8 f9 8b fe ff call 1080b4 <free>
return new_area;
11f4bb: 83 c4 10 add $0x10,%esp
11f4be: 8b 45 d4 mov -0x2c(%ebp),%eax
11f4c1: 89 c3 mov %eax,%ebx
11f4c3: e9 63 ff ff ff jmp 11f42b <realloc+0x53>
00109300 <rmdir>:
#include <rtems/seterr.h>
int rmdir(
const char *pathname
)
{
109300: 55 push %ebp
109301: 89 e5 mov %esp,%ebp
109303: 57 push %edi
109304: 56 push %esi
109305: 53 push %ebx
109306: 83 ec 58 sub $0x58,%esp
109309: 8b 5d 08 mov 0x8(%ebp),%ebx
/*
* Get the parent node of the node we wish to remove. Find the parent path.
*/
parentpathlen = rtems_filesystem_dirname ( pathname );
10930c: 53 push %ebx
10930d: e8 46 f1 ff ff call 108458 <rtems_filesystem_dirname>
if ( parentpathlen == 0 )
109312: 83 c4 10 add $0x10,%esp
109315: 85 c0 test %eax,%eax
109317: 0f 85 0f 01 00 00 jne 10942c <rmdir+0x12c>
rtems_filesystem_get_start_loc( pathname, &i, &parentloc );
10931d: 50 push %eax
10931e: 8d 45 d0 lea -0x30(%ebp),%eax
109321: 89 45 b4 mov %eax,-0x4c(%ebp)
109324: 50 push %eax
109325: 8d 45 e4 lea -0x1c(%ebp),%eax
109328: 50 push %eax
109329: 53 push %ebx
10932a: e8 45 01 00 00 call 109474 <rtems_filesystem_get_start_loc>
10932f: 83 c4 10 add $0x10,%esp
109332: 31 d2 xor %edx,%edx
const char *name;
rtems_filesystem_location_info_t parentloc;
rtems_filesystem_location_info_t loc;
int i;
int result;
bool free_parentloc = false;
109334: c6 45 b3 00 movb $0x0,-0x4d(%ebp)
/*
* Start from the parent to find the node that should be under it.
*/
loc = parentloc;
109338: 8d 7d bc lea -0x44(%ebp),%edi
10933b: b9 05 00 00 00 mov $0x5,%ecx
109340: 8b 75 b4 mov -0x4c(%ebp),%esi
109343: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
name = pathname + parentpathlen;
109345: 01 d3 add %edx,%ebx
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
109347: be ff ff ff ff mov $0xffffffff,%esi
10934c: 89 f1 mov %esi,%ecx
10934e: 89 df mov %ebx,%edi
109350: 31 c0 xor %eax,%eax
109352: f2 ae repnz scas %es:(%edi),%al
109354: f7 d1 not %ecx
109356: 49 dec %ecx
109357: 83 ec 08 sub $0x8,%esp
10935a: 51 push %ecx
10935b: 53 push %ebx
10935c: e8 3b f1 ff ff call 10849c <rtems_filesystem_prefix_separators>
109361: 01 c3 add %eax,%ebx
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
109363: 89 f1 mov %esi,%ecx
109365: 89 df mov %ebx,%edi
109367: 31 c0 xor %eax,%eax
109369: f2 ae repnz scas %es:(%edi),%al
10936b: f7 d1 not %ecx
10936d: 49 dec %ecx
10936e: c7 04 24 00 00 00 00 movl $0x0,(%esp)
109375: 8d 75 bc lea -0x44(%ebp),%esi
109378: 56 push %esi
109379: 6a 00 push $0x0
10937b: 51 push %ecx
10937c: 53 push %ebx
10937d: e8 2a f0 ff ff call 1083ac <rtems_filesystem_evaluate_relative_path>
0, &loc, false );
if ( result != 0 ) {
109382: 83 c4 20 add $0x20,%esp
109385: 85 c0 test %eax,%eax
109387: 75 5b jne 1093e4 <rmdir+0xe4>
}
/*
* Verify you can remove this node as a directory.
*/
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
109389: 83 ec 0c sub $0xc,%esp
10938c: 56 push %esi
10938d: 8b 45 c8 mov -0x38(%ebp),%eax
109390: ff 50 10 call *0x10(%eax)
109393: 83 c4 10 add $0x10,%esp
109396: 48 dec %eax
109397: 75 5f jne 1093f8 <rmdir+0xf8>
/*
* Use the filesystems rmnod to remove the node.
*/
result = (*loc.handlers->rmnod_h)( &parentloc, &loc );
109399: 83 ec 08 sub $0x8,%esp
10939c: 56 push %esi
10939d: ff 75 b4 pushl -0x4c(%ebp)
1093a0: 8b 45 c4 mov -0x3c(%ebp),%eax
1093a3: ff 50 34 call *0x34(%eax)
rtems_filesystem_freenode( &loc );
1093a6: 89 34 24 mov %esi,(%esp)
1093a9: 89 45 ac mov %eax,-0x54(%ebp)
1093ac: e8 3b f1 ff ff call 1084ec <rtems_filesystem_freenode>
if ( free_parentloc )
1093b1: 83 c4 10 add $0x10,%esp
1093b4: 80 7d b3 00 cmpb $0x0,-0x4d(%ebp)
1093b8: 8b 45 ac mov -0x54(%ebp),%eax
1093bb: 75 0b jne 1093c8 <rmdir+0xc8>
rtems_filesystem_freenode( &parentloc );
return result;
}
1093bd: 8d 65 f4 lea -0xc(%ebp),%esp
1093c0: 5b pop %ebx
1093c1: 5e pop %esi
1093c2: 5f pop %edi
1093c3: c9 leave
1093c4: c3 ret
1093c5: 8d 76 00 lea 0x0(%esi),%esi
result = (*loc.handlers->rmnod_h)( &parentloc, &loc );
rtems_filesystem_freenode( &loc );
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
1093c8: 83 ec 0c sub $0xc,%esp
1093cb: ff 75 b4 pushl -0x4c(%ebp)
1093ce: e8 19 f1 ff ff call 1084ec <rtems_filesystem_freenode>
1093d3: 83 c4 10 add $0x10,%esp
1093d6: 8b 45 ac mov -0x54(%ebp),%eax
return result;
}
1093d9: 8d 65 f4 lea -0xc(%ebp),%esp
1093dc: 5b pop %ebx
1093dd: 5e pop %esi
1093de: 5f pop %edi
1093df: c9 leave
1093e0: c3 ret
1093e1: 8d 76 00 lea 0x0(%esi),%esi
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &loc, false );
if ( result != 0 ) {
if ( free_parentloc )
1093e4: 80 7d b3 00 cmpb $0x0,-0x4d(%ebp)
1093e8: 75 6f jne 109459 <rmdir+0x159>
rtems_filesystem_freenode( &parentloc );
return -1;
1093ea: b8 ff ff ff ff mov $0xffffffff,%eax
rtems_filesystem_freenode( &loc );
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
return result;
}
1093ef: 8d 65 f4 lea -0xc(%ebp),%esp
1093f2: 5b pop %ebx
1093f3: 5e pop %esi
1093f4: 5f pop %edi
1093f5: c9 leave
1093f6: c3 ret
1093f7: 90 nop
/*
* Verify you can remove this node as a directory.
*/
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
rtems_filesystem_freenode( &loc );
1093f8: 83 ec 0c sub $0xc,%esp
1093fb: 56 push %esi
1093fc: e8 eb f0 ff ff call 1084ec <rtems_filesystem_freenode>
if ( free_parentloc )
109401: 83 c4 10 add $0x10,%esp
109404: 80 7d b3 00 cmpb $0x0,-0x4d(%ebp)
109408: 74 0e je 109418 <rmdir+0x118> <== NEVER TAKEN
rtems_filesystem_freenode( &parentloc );
10940a: 83 ec 0c sub $0xc,%esp
10940d: ff 75 b4 pushl -0x4c(%ebp)
109410: e8 d7 f0 ff ff call 1084ec <rtems_filesystem_freenode>
109415: 83 c4 10 add $0x10,%esp
rtems_set_errno_and_return_minus_one( ENOTDIR );
109418: e8 8f a7 00 00 call 113bac <__errno>
10941d: c7 00 14 00 00 00 movl $0x14,(%eax)
109423: b8 ff ff ff ff mov $0xffffffff,%eax
109428: eb 93 jmp 1093bd <rmdir+0xbd>
10942a: 66 90 xchg %ax,%ax
parentpathlen = rtems_filesystem_dirname ( pathname );
if ( parentpathlen == 0 )
rtems_filesystem_get_start_loc( pathname, &i, &parentloc );
else {
result = rtems_filesystem_evaluate_path(pathname, parentpathlen,
10942c: 89 c2 mov %eax,%edx
10942e: 83 ec 0c sub $0xc,%esp
109431: 6a 00 push $0x0
109433: 8d 45 d0 lea -0x30(%ebp),%eax
109436: 89 45 b4 mov %eax,-0x4c(%ebp)
109439: 50 push %eax
10943a: 6a 02 push $0x2
10943c: 52 push %edx
10943d: 53 push %ebx
10943e: 89 55 ac mov %edx,-0x54(%ebp)
109441: e8 ce ef ff ff call 108414 <rtems_filesystem_evaluate_path>
RTEMS_LIBIO_PERMS_WRITE,
&parentloc,
false );
if ( result != 0 )
109446: 83 c4 20 add $0x20,%esp
109449: 85 c0 test %eax,%eax
10944b: 8b 55 ac mov -0x54(%ebp),%edx
10944e: 75 9a jne 1093ea <rmdir+0xea> <== NEVER TAKEN
return -1;
free_parentloc = true;
109450: c6 45 b3 01 movb $0x1,-0x4d(%ebp)
109454: e9 df fe ff ff jmp 109338 <rmdir+0x38>
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &loc, false );
if ( result != 0 ) {
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
109459: 83 ec 0c sub $0xc,%esp
10945c: ff 75 b4 pushl -0x4c(%ebp)
10945f: e8 88 f0 ff ff call 1084ec <rtems_filesystem_freenode>
109464: 83 c4 10 add $0x10,%esp
return -1;
109467: b8 ff ff ff ff mov $0xffffffff,%eax
10946c: e9 4c ff ff ff jmp 1093bd <rmdir+0xbd>
0010c550 <rtems_aio_enqueue>:
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
10c550: 55 push %ebp
10c551: 89 e5 mov %esp,%ebp
10c553: 57 push %edi
10c554: 56 push %esi
10c555: 53 push %ebx
10c556: 83 ec 58 sub $0x58,%esp
10c559: 8b 5d 08 mov 0x8(%ebp),%ebx
struct sched_param param;
/* The queue should be initialized */
AIO_assert (aio_request_queue.initialized == AIO_QUEUE_INITIALIZED);
result = pthread_mutex_lock (&aio_request_queue.mutex);
10c55c: 68 80 aa 12 00 push $0x12aa80
10c561: e8 86 09 00 00 call 10ceec <pthread_mutex_lock>
10c566: 89 c6 mov %eax,%esi
if (result != 0) {
10c568: 83 c4 10 add $0x10,%esp
10c56b: 85 c0 test %eax,%eax
10c56d: 0f 85 c1 00 00 00 jne 10c634 <rtems_aio_enqueue+0xe4><== NEVER TAKEN
return result;
}
/* _POSIX_PRIORITIZED_IO and _POSIX_PRIORITY_SCHEDULING are defined,
we can use aio_reqprio to lower the priority of the request */
pthread_getschedparam (pthread_self(), &policy, ¶m);
10c573: e8 24 12 00 00 call 10d79c <pthread_self>
10c578: 51 push %ecx
10c579: 8d 55 c4 lea -0x3c(%ebp),%edx
10c57c: 52 push %edx
10c57d: 8d 55 e0 lea -0x20(%ebp),%edx
10c580: 52 push %edx
10c581: 50 push %eax
10c582: e8 e1 0d 00 00 call 10d368 <pthread_getschedparam>
req->caller_thread = pthread_self ();
10c587: e8 10 12 00 00 call 10d79c <pthread_self>
10c58c: 89 43 10 mov %eax,0x10(%ebx)
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
10c58f: 8b 43 14 mov 0x14(%ebx),%eax
10c592: 8b 55 c4 mov -0x3c(%ebp),%edx
10c595: 2b 50 14 sub 0x14(%eax),%edx
10c598: 89 53 0c mov %edx,0xc(%ebx)
req->policy = policy;
10c59b: 8b 55 e0 mov -0x20(%ebp),%edx
10c59e: 89 53 08 mov %edx,0x8(%ebx)
req->aiocbp->error_code = EINPROGRESS;
10c5a1: c7 40 30 77 00 00 00 movl $0x77,0x30(%eax)
req->aiocbp->return_value = 0;
10c5a8: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
if ((aio_request_queue.idle_threads == 0) &&
10c5af: 83 c4 10 add $0x10,%esp
10c5b2: 8b 15 e8 aa 12 00 mov 0x12aae8,%edx
10c5b8: 85 d2 test %edx,%edx
10c5ba: 75 0d jne 10c5c9 <rtems_aio_enqueue+0x79><== NEVER TAKEN
10c5bc: 83 3d e4 aa 12 00 04 cmpl $0x4,0x12aae4
10c5c3: 0f 8e 83 00 00 00 jle 10c64c <rtems_aio_enqueue+0xfc>
else
{
/* the maximum number of threads has been already created
even though some of them might be idle.
The request belongs to one of the active fd chain */
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
10c5c9: 51 push %ecx
10c5ca: 6a 00 push $0x0
10c5cc: ff 30 pushl (%eax)
10c5ce: 68 c8 aa 12 00 push $0x12aac8
10c5d3: e8 28 fb ff ff call 10c100 <rtems_aio_search_fd>
10c5d8: 89 c7 mov %eax,%edi
req->aiocbp->aio_fildes, 0);
if (r_chain != NULL)
10c5da: 83 c4 10 add $0x10,%esp
10c5dd: 85 c0 test %eax,%eax
10c5df: 0f 84 df 00 00 00 je 10c6c4 <rtems_aio_enqueue+0x174>
{
pthread_mutex_lock (&r_chain->mutex);
10c5e5: 8d 57 1c lea 0x1c(%edi),%edx
10c5e8: 83 ec 0c sub $0xc,%esp
10c5eb: 52 push %edx
10c5ec: 89 55 b4 mov %edx,-0x4c(%ebp)
10c5ef: e8 f8 08 00 00 call 10ceec <pthread_mutex_lock>
rtems_aio_insert_prio (&r_chain->perfd, req);
10c5f4: 58 pop %eax
10c5f5: 5a pop %edx
10c5f6: 53 push %ebx
10c5f7: 8d 47 08 lea 0x8(%edi),%eax
10c5fa: 50 push %eax
10c5fb: e8 48 fe ff ff call 10c448 <rtems_aio_insert_prio>
pthread_cond_signal (&r_chain->cond);
10c600: 83 c7 20 add $0x20,%edi
10c603: 89 3c 24 mov %edi,(%esp)
10c606: e8 b1 04 00 00 call 10cabc <pthread_cond_signal>
pthread_mutex_unlock (&r_chain->mutex);
10c60b: 8b 55 b4 mov -0x4c(%ebp),%edx
10c60e: 89 14 24 mov %edx,(%esp)
10c611: e8 5e 09 00 00 call 10cf74 <pthread_mutex_unlock>
10c616: 83 c4 10 add $0x10,%esp
if (aio_request_queue.idle_threads > 0)
pthread_cond_signal (&aio_request_queue.new_req);
}
}
pthread_mutex_unlock (&aio_request_queue.mutex);
10c619: 83 ec 0c sub $0xc,%esp
10c61c: 68 80 aa 12 00 push $0x12aa80
10c621: e8 4e 09 00 00 call 10cf74 <pthread_mutex_unlock>
return 0;
10c626: 83 c4 10 add $0x10,%esp
}
10c629: 89 f0 mov %esi,%eax
10c62b: 8d 65 f4 lea -0xc(%ebp),%esp
10c62e: 5b pop %ebx
10c62f: 5e pop %esi
10c630: 5f pop %edi
10c631: c9 leave
10c632: c3 ret
10c633: 90 nop
/* The queue should be initialized */
AIO_assert (aio_request_queue.initialized == AIO_QUEUE_INITIALIZED);
result = pthread_mutex_lock (&aio_request_queue.mutex);
if (result != 0) {
free (req);
10c634: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c637: 53 push %ebx <== NOT EXECUTED
10c638: e8 f7 c4 ff ff call 108b34 <free> <== NOT EXECUTED
return result;
10c63d: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
}
pthread_mutex_unlock (&aio_request_queue.mutex);
return 0;
}
10c640: 89 f0 mov %esi,%eax <== NOT EXECUTED
10c642: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10c645: 5b pop %ebx <== NOT EXECUTED
10c646: 5e pop %esi <== NOT EXECUTED
10c647: 5f pop %edi <== NOT EXECUTED
10c648: c9 leave <== NOT EXECUTED
10c649: c3 ret <== NOT EXECUTED
10c64a: 66 90 xchg %ax,%ax <== NOT EXECUTED
if ((aio_request_queue.idle_threads == 0) &&
aio_request_queue.active_threads < AIO_MAX_THREADS)
/* we still have empty places on the active_threads chain */
{
chain = &aio_request_queue.work_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
10c64c: 57 push %edi
10c64d: 6a 01 push $0x1
10c64f: ff 30 pushl (%eax)
10c651: 68 c8 aa 12 00 push $0x12aac8
10c656: e8 a5 fa ff ff call 10c100 <rtems_aio_search_fd>
10c65b: 89 c7 mov %eax,%edi
if (r_chain->new_fd == 1) {
10c65d: 83 c4 10 add $0x10,%esp
10c660: 83 78 18 01 cmpl $0x1,0x18(%eax)
10c664: 0f 85 7b ff ff ff jne 10c5e5 <rtems_aio_enqueue+0x95>
RTEMS_INLINE_ROUTINE void _Chain_Prepend(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert(_Chain_Head(the_chain), the_node);
10c66a: 83 ec 08 sub $0x8,%esp
10c66d: 53 push %ebx
10c66e: 8d 40 08 lea 0x8(%eax),%eax
10c671: 50 push %eax
10c672: e8 85 22 00 00 call 10e8fc <_Chain_Insert>
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
10c677: c7 47 18 00 00 00 00 movl $0x0,0x18(%edi)
pthread_mutex_init (&r_chain->mutex, NULL);
10c67e: 5a pop %edx
10c67f: 59 pop %ecx
10c680: 6a 00 push $0x0
10c682: 8d 47 1c lea 0x1c(%edi),%eax
10c685: 50 push %eax
10c686: e8 15 07 00 00 call 10cda0 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
10c68b: 5b pop %ebx
10c68c: 58 pop %eax
10c68d: 6a 00 push $0x0
10c68f: 8d 47 20 lea 0x20(%edi),%eax
10c692: 50 push %eax
10c693: e8 70 03 00 00 call 10ca08 <pthread_cond_init>
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
10c698: 57 push %edi
10c699: 68 fc c1 10 00 push $0x10c1fc
10c69e: 68 88 aa 12 00 push $0x12aa88
10c6a3: 8d 45 e4 lea -0x1c(%ebp),%eax
10c6a6: 50 push %eax
10c6a7: e8 34 0a 00 00 call 10d0e0 <pthread_create>
10c6ac: 89 c3 mov %eax,%ebx
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
10c6ae: 83 c4 20 add $0x20,%esp
10c6b1: 85 c0 test %eax,%eax
10c6b3: 0f 85 8e 00 00 00 jne 10c747 <rtems_aio_enqueue+0x1f7><== NEVER TAKEN
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
}
++aio_request_queue.active_threads;
10c6b9: ff 05 e4 aa 12 00 incl 0x12aae4
10c6bf: e9 55 ff ff ff jmp 10c619 <rtems_aio_enqueue+0xc9>
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
10c6c4: 57 push %edi
10c6c5: 6a 01 push $0x1
10c6c7: 8b 43 14 mov 0x14(%ebx),%eax
10c6ca: ff 30 pushl (%eax)
10c6cc: 68 d4 aa 12 00 push $0x12aad4
10c6d1: e8 2a fa ff ff call 10c100 <rtems_aio_search_fd>
10c6d6: 89 c7 mov %eax,%edi
if (r_chain->new_fd == 1) {
10c6d8: 83 c4 10 add $0x10,%esp
10c6db: 83 78 18 01 cmpl $0x1,0x18(%eax)
10c6df: 74 33 je 10c714 <rtems_aio_enqueue+0x1c4>
r_chain->new_fd = 0;
pthread_mutex_init (&r_chain->mutex, NULL);
pthread_cond_init (&r_chain->cond, NULL);
} else
/* just insert the request in the existing fd chain */
rtems_aio_insert_prio (&r_chain->perfd, req);
10c6e1: 83 ec 08 sub $0x8,%esp
10c6e4: 53 push %ebx
10c6e5: 83 c7 08 add $0x8,%edi
10c6e8: 57 push %edi
10c6e9: e8 5a fd ff ff call 10c448 <rtems_aio_insert_prio>
10c6ee: 83 c4 10 add $0x10,%esp
if (aio_request_queue.idle_threads > 0)
10c6f1: 8b 0d e8 aa 12 00 mov 0x12aae8,%ecx
10c6f7: 85 c9 test %ecx,%ecx
10c6f9: 0f 8e 1a ff ff ff jle 10c619 <rtems_aio_enqueue+0xc9><== ALWAYS TAKEN
pthread_cond_signal (&aio_request_queue.new_req);
10c6ff: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c702: 68 84 aa 12 00 push $0x12aa84 <== NOT EXECUTED
10c707: e8 b0 03 00 00 call 10cabc <pthread_cond_signal> <== NOT EXECUTED
10c70c: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c70f: e9 05 ff ff ff jmp 10c619 <rtems_aio_enqueue+0xc9><== NOT EXECUTED
10c714: 83 ec 08 sub $0x8,%esp
10c717: 53 push %ebx
10c718: 8d 40 08 lea 0x8(%eax),%eax
10c71b: 50 push %eax
10c71c: e8 db 21 00 00 call 10e8fc <_Chain_Insert>
if (r_chain->new_fd == 1) {
/* If this is a new fd chain we signal the idle threads that
might be waiting for requests */
AIO_printf (" New chain on waiting queue \n ");
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
10c721: c7 47 18 00 00 00 00 movl $0x0,0x18(%edi)
pthread_mutex_init (&r_chain->mutex, NULL);
10c728: 5a pop %edx
10c729: 59 pop %ecx
10c72a: 6a 00 push $0x0
10c72c: 8d 47 1c lea 0x1c(%edi),%eax
10c72f: 50 push %eax
10c730: e8 6b 06 00 00 call 10cda0 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
10c735: 5b pop %ebx
10c736: 58 pop %eax
10c737: 6a 00 push $0x0
10c739: 83 c7 20 add $0x20,%edi
10c73c: 57 push %edi
10c73d: e8 c6 02 00 00 call 10ca08 <pthread_cond_init>
10c742: 83 c4 10 add $0x10,%esp
10c745: eb aa jmp 10c6f1 <rtems_aio_enqueue+0x1a1>
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
pthread_mutex_unlock (&aio_request_queue.mutex);
10c747: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c74a: 68 80 aa 12 00 push $0x12aa80 <== NOT EXECUTED
10c74f: e8 20 08 00 00 call 10cf74 <pthread_mutex_unlock> <== NOT EXECUTED
return result;
10c754: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c757: 89 de mov %ebx,%esi <== NOT EXECUTED
10c759: e9 cb fe ff ff jmp 10c629 <rtems_aio_enqueue+0xd9><== NOT EXECUTED
0010c1fc <rtems_aio_handle>:
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
10c1fc: 55 push %ebp
10c1fd: 89 e5 mov %esp,%ebp
10c1ff: 57 push %edi
10c200: 56 push %esi
10c201: 53 push %ebx
10c202: 83 ec 4c sub $0x4c,%esp
rtems_aio_request_chain *r_chain = arg;
10c205: 8b 7d 08 mov 0x8(%ebp),%edi
10c208: 8d 47 1c lea 0x1c(%edi),%eax
10c20b: 89 45 b4 mov %eax,-0x4c(%ebp)
10c20e: 66 90 xchg %ax,%ax
/* acquire the mutex of the current fd chain.
we don't need to lock the queue mutex since we can
add requests to idle fd chains or even active ones
if the working request has been extracted from the
chain */
result = pthread_mutex_lock (&r_chain->mutex);
10c210: 83 ec 0c sub $0xc,%esp
10c213: ff 75 b4 pushl -0x4c(%ebp)
10c216: e8 d1 0c 00 00 call 10ceec <pthread_mutex_lock>
if (result != 0)
10c21b: 83 c4 10 add $0x10,%esp
10c21e: 85 c0 test %eax,%eax
10c220: 0f 85 2a 01 00 00 jne 10c350 <rtems_aio_handle+0x154><== NEVER TAKEN
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c226: 8b 5f 08 mov 0x8(%edi),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10c229: 8d 47 0c lea 0xc(%edi),%eax
/* If the locked chain is not empty, take the first
request extract it, unlock the chain and process
the request, in this way the user can supply more
requests to this fd chain */
if (!rtems_chain_is_empty (chain)) {
10c22c: 39 c3 cmp %eax,%ebx
10c22e: 0f 84 d0 00 00 00 je 10c304 <rtems_aio_handle+0x108>
node = rtems_chain_first (chain);
req = (rtems_aio_request *) node;
/* See _POSIX_PRIORITIZE_IO and _POSIX_PRIORITY_SCHEDULING
discussion in rtems_aio_enqueue () */
pthread_getschedparam (pthread_self(), &policy, ¶m);
10c234: e8 63 15 00 00 call 10d79c <pthread_self>
10c239: 52 push %edx
10c23a: 8d 55 c0 lea -0x40(%ebp),%edx
10c23d: 52 push %edx
10c23e: 8d 55 e4 lea -0x1c(%ebp),%edx
10c241: 52 push %edx
10c242: 50 push %eax
10c243: e8 20 11 00 00 call 10d368 <pthread_getschedparam>
param.sched_priority = req->priority;
10c248: 8b 43 0c mov 0xc(%ebx),%eax
10c24b: 89 45 c0 mov %eax,-0x40(%ebp)
pthread_setschedparam (pthread_self(), req->policy, ¶m);
10c24e: 8b 73 08 mov 0x8(%ebx),%esi
10c251: e8 46 15 00 00 call 10d79c <pthread_self>
10c256: 83 c4 0c add $0xc,%esp
10c259: 8d 55 c0 lea -0x40(%ebp),%edx
10c25c: 52 push %edx
10c25d: 56 push %esi
10c25e: 50 push %eax
10c25f: e8 48 15 00 00 call 10d7ac <pthread_setschedparam>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
10c264: 89 1c 24 mov %ebx,(%esp)
10c267: e8 54 26 00 00 call 10e8c0 <_Chain_Extract>
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
10c26c: 5e pop %esi
10c26d: ff 75 b4 pushl -0x4c(%ebp)
10c270: e8 ff 0c 00 00 call 10cf74 <pthread_mutex_unlock>
switch (req->aiocbp->aio_lio_opcode) {
10c275: 8b 73 14 mov 0x14(%ebx),%esi
10c278: 83 c4 10 add $0x10,%esp
10c27b: 8b 46 2c mov 0x2c(%esi),%eax
10c27e: 83 f8 02 cmp $0x2,%eax
10c281: 74 21 je 10c2a4 <rtems_aio_handle+0xa8>
10c283: 83 f8 03 cmp $0x3,%eax
10c286: 74 6c je 10c2f4 <rtems_aio_handle+0xf8> <== NEVER TAKEN
10c288: 48 dec %eax
10c289: 74 4d je 10c2d8 <rtems_aio_handle+0xdc> <== ALWAYS TAKEN
default:
result = -1;
}
if (result == -1) {
req->aiocbp->return_value = -1;
10c28b: c7 46 34 ff ff ff ff movl $0xffffffff,0x34(%esi) <== NOT EXECUTED
req->aiocbp->error_code = errno;
10c292: e8 b5 99 00 00 call 115c4c <__errno> <== NOT EXECUTED
10c297: 8b 00 mov (%eax),%eax <== NOT EXECUTED
10c299: 89 46 30 mov %eax,0x30(%esi) <== NOT EXECUTED
10c29c: e9 6f ff ff ff jmp 10c210 <rtems_aio_handle+0x14> <== NOT EXECUTED
10c2a1: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_WRITE:
AIO_printf ("write\n");
result = pwrite (req->aiocbp->aio_fildes,
10c2a4: 83 ec 0c sub $0xc,%esp
10c2a7: ff 76 08 pushl 0x8(%esi)
10c2aa: ff 76 04 pushl 0x4(%esi)
10c2ad: ff 76 10 pushl 0x10(%esi)
10c2b0: ff 76 0c pushl 0xc(%esi)
10c2b3: ff 36 pushl (%esi)
10c2b5: e8 2a a4 00 00 call 1166e4 <pwrite>
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
10c2ba: 83 c4 20 add $0x20,%esp
break;
default:
result = -1;
}
if (result == -1) {
10c2bd: 83 f8 ff cmp $0xffffffff,%eax
10c2c0: 0f 84 78 01 00 00 je 10c43e <rtems_aio_handle+0x242><== NEVER TAKEN
req->aiocbp->return_value = -1;
req->aiocbp->error_code = errno;
} else {
req->aiocbp->return_value = result;
10c2c6: 8b 53 14 mov 0x14(%ebx),%edx
10c2c9: 89 42 34 mov %eax,0x34(%edx)
req->aiocbp->error_code = 0;
10c2cc: c7 42 30 00 00 00 00 movl $0x0,0x30(%edx)
10c2d3: e9 38 ff ff ff jmp 10c210 <rtems_aio_handle+0x14>
pthread_mutex_unlock (&r_chain->mutex);
switch (req->aiocbp->aio_lio_opcode) {
case LIO_READ:
AIO_printf ("read\n");
result = pread (req->aiocbp->aio_fildes,
10c2d8: 83 ec 0c sub $0xc,%esp
10c2db: ff 76 08 pushl 0x8(%esi)
10c2de: ff 76 04 pushl 0x4(%esi)
10c2e1: ff 76 10 pushl 0x10(%esi)
10c2e4: ff 76 0c pushl 0xc(%esi)
10c2e7: ff 36 pushl (%esi)
10c2e9: e8 42 a3 00 00 call 116630 <pread>
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
10c2ee: 83 c4 20 add $0x20,%esp
10c2f1: eb ca jmp 10c2bd <rtems_aio_handle+0xc1>
10c2f3: 90 nop
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_SYNC:
AIO_printf ("sync\n");
result = fsync (req->aiocbp->aio_fildes);
10c2f4: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c2f7: ff 36 pushl (%esi) <== NOT EXECUTED
10c2f9: e8 f6 66 00 00 call 1129f4 <fsync> <== NOT EXECUTED
break;
10c2fe: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c301: eb ba jmp 10c2bd <rtems_aio_handle+0xc1> <== NOT EXECUTED
10c303: 90 nop <== NOT EXECUTED
struct timespec timeout;
AIO_printf ("Chain is empty [WQ], wait for work\n");
pthread_mutex_unlock (&r_chain->mutex);
10c304: 83 ec 0c sub $0xc,%esp
10c307: ff 75 b4 pushl -0x4c(%ebp)
10c30a: e8 65 0c 00 00 call 10cf74 <pthread_mutex_unlock>
pthread_mutex_lock (&aio_request_queue.mutex);
10c30f: c7 04 24 80 aa 12 00 movl $0x12aa80,(%esp)
10c316: e8 d1 0b 00 00 call 10ceec <pthread_mutex_lock>
if (rtems_chain_is_empty (chain))
10c31b: 83 c4 10 add $0x10,%esp
10c31e: 3b 5f 08 cmp 0x8(%edi),%ebx
10c321: 74 39 je 10c35c <rtems_aio_handle+0x160><== ALWAYS TAKEN
}
}
/* If there was a request added in the initial fd chain then release
the mutex and process it */
pthread_mutex_unlock (&aio_request_queue.mutex);
10c323: 83 ec 0c sub $0xc,%esp
10c326: 68 80 aa 12 00 push $0x12aa80
10c32b: e8 44 0c 00 00 call 10cf74 <pthread_mutex_unlock>
10c330: 83 c4 10 add $0x10,%esp
10c333: e9 d8 fe ff ff jmp 10c210 <rtems_aio_handle+0x14>
/* If no new fd chain was added in the idle requests
then this thread is finished */
if (result == ETIMEDOUT) {
AIO_printf ("Etimeout\n");
--aio_request_queue.idle_threads;
10c338: ff 0d e8 aa 12 00 decl 0x12aae8
pthread_mutex_unlock (&aio_request_queue.mutex);
10c33e: 83 ec 0c sub $0xc,%esp
10c341: 68 80 aa 12 00 push $0x12aa80
10c346: e8 29 0c 00 00 call 10cf74 <pthread_mutex_unlock>
return NULL;
10c34b: 83 c4 10 add $0x10,%esp
10c34e: 66 90 xchg %ax,%ax
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c350: 31 c0 xor %eax,%eax
10c352: 8d 65 f4 lea -0xc(%ebp),%esp
10c355: 5b pop %ebx
10c356: 5e pop %esi
10c357: 5f pop %edi
10c358: c9 leave
10c359: c3 ret
10c35a: 66 90 xchg %ax,%ax
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
10c35c: 83 ec 08 sub $0x8,%esp
10c35f: 8d 45 dc lea -0x24(%ebp),%eax
10c362: 50 push %eax
10c363: 6a 01 push $0x1
10c365: e8 66 05 00 00 call 10c8d0 <clock_gettime>
timeout.tv_sec += 3;
10c36a: 83 45 dc 03 addl $0x3,-0x24(%ebp)
timeout.tv_nsec = 0;
10c36e: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
result = pthread_cond_timedwait (&r_chain->cond,
10c375: 8d 5f 20 lea 0x20(%edi),%ebx
10c378: 83 c4 0c add $0xc,%esp
10c37b: 8d 55 dc lea -0x24(%ebp),%edx
10c37e: 52 push %edx
10c37f: 68 80 aa 12 00 push $0x12aa80
10c384: 53 push %ebx
10c385: e8 b6 07 00 00 call 10cb40 <pthread_cond_timedwait>
&aio_request_queue.mutex,
&timeout);
/* If no requests were added to the chain we delete the fd chain from
the queue and start working with idle fd chains */
if (result == ETIMEDOUT) {
10c38a: 83 c4 10 add $0x10,%esp
10c38d: 83 f8 74 cmp $0x74,%eax
10c390: 75 91 jne 10c323 <rtems_aio_handle+0x127><== NEVER TAKEN
10c392: 83 ec 0c sub $0xc,%esp
10c395: 57 push %edi
10c396: e8 25 25 00 00 call 10e8c0 <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
pthread_mutex_destroy (&r_chain->mutex);
10c39b: 59 pop %ecx
10c39c: ff 75 b4 pushl -0x4c(%ebp)
10c39f: e8 dc 08 00 00 call 10cc80 <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->cond);
10c3a4: 89 1c 24 mov %ebx,(%esp)
10c3a7: e8 90 05 00 00 call 10c93c <pthread_cond_destroy>
free (r_chain);
10c3ac: 89 3c 24 mov %edi,(%esp)
10c3af: e8 80 c7 ff ff call 108b34 <free>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c3b4: 8b 3d d4 aa 12 00 mov 0x12aad4,%edi
pthread_cond_destroy (&r_chain->cond);
free (r_chain);
/* If the idle chain is empty sleep for 3 seconds and wait for a
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
10c3ba: 83 c4 10 add $0x10,%esp
10c3bd: 81 ff d8 aa 12 00 cmp $0x12aad8,%edi
10c3c3: 74 2b je 10c3f0 <rtems_aio_handle+0x1f4>
}
}
/* Otherwise move this chain to the working chain and
start the loop all over again */
AIO_printf ("Work on idle\n");
--aio_request_queue.idle_threads;
10c3c5: ff 0d e8 aa 12 00 decl 0x12aae8
++aio_request_queue.active_threads;
10c3cb: ff 05 e4 aa 12 00 incl 0x12aae4
10c3d1: 83 ec 0c sub $0xc,%esp
10c3d4: 57 push %edi
10c3d5: e8 e6 24 00 00 call 10e8c0 <_Chain_Extract>
node = rtems_chain_first (&aio_request_queue.idle_req);
rtems_chain_extract (node);
r_chain = (rtems_aio_request_chain *) node;
rtems_aio_move_to_work (r_chain);
10c3da: 89 3c 24 mov %edi,(%esp)
10c3dd: e8 de fd ff ff call 10c1c0 <rtems_aio_move_to_work>
10c3e2: 83 c4 10 add $0x10,%esp
10c3e5: 8d 47 1c lea 0x1c(%edi),%eax
10c3e8: 89 45 b4 mov %eax,-0x4c(%ebp)
10c3eb: e9 33 ff ff ff jmp 10c323 <rtems_aio_handle+0x127>
/* If the idle chain is empty sleep for 3 seconds and wait for a
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
AIO_printf ("Chain is empty [IQ], wait for work\n");
++aio_request_queue.idle_threads;
10c3f0: ff 05 e8 aa 12 00 incl 0x12aae8
--aio_request_queue.active_threads;
10c3f6: ff 0d e4 aa 12 00 decl 0x12aae4
clock_gettime (CLOCK_REALTIME, &timeout);
10c3fc: 52 push %edx
10c3fd: 52 push %edx
10c3fe: 8d 45 dc lea -0x24(%ebp),%eax
10c401: 50 push %eax
10c402: 6a 01 push $0x1
10c404: e8 c7 04 00 00 call 10c8d0 <clock_gettime>
timeout.tv_sec += 3;
10c409: 83 45 dc 03 addl $0x3,-0x24(%ebp)
timeout.tv_nsec = 0;
10c40d: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
result = pthread_cond_timedwait (&aio_request_queue.new_req,
10c414: 83 c4 0c add $0xc,%esp
10c417: 8d 55 dc lea -0x24(%ebp),%edx
10c41a: 52 push %edx
10c41b: 68 80 aa 12 00 push $0x12aa80
10c420: 68 84 aa 12 00 push $0x12aa84
10c425: e8 16 07 00 00 call 10cb40 <pthread_cond_timedwait>
&aio_request_queue.mutex,
&timeout);
/* If no new fd chain was added in the idle requests
then this thread is finished */
if (result == ETIMEDOUT) {
10c42a: 83 c4 10 add $0x10,%esp
10c42d: 83 f8 74 cmp $0x74,%eax
10c430: 0f 84 02 ff ff ff je 10c338 <rtems_aio_handle+0x13c><== ALWAYS TAKEN
10c436: 8b 3d d4 aa 12 00 mov 0x12aad4,%edi <== NOT EXECUTED
10c43c: eb 87 jmp 10c3c5 <rtems_aio_handle+0x1c9><== NOT EXECUTED
break;
default:
result = -1;
}
if (result == -1) {
10c43e: 8b 73 14 mov 0x14(%ebx),%esi <== NOT EXECUTED
10c441: e9 45 fe ff ff jmp 10c28b <rtems_aio_handle+0x8f> <== NOT EXECUTED
0010bfd8 <rtems_aio_init>:
* 0 - if initialization succeeded
*/
int
rtems_aio_init (void)
{
10bfd8: 55 push %ebp
10bfd9: 89 e5 mov %esp,%ebp
10bfdb: 53 push %ebx
10bfdc: 83 ec 10 sub $0x10,%esp
int result = 0;
result = pthread_attr_init (&aio_request_queue.attr);
10bfdf: 68 88 aa 12 00 push $0x12aa88
10bfe4: e8 a3 10 00 00 call 10d08c <pthread_attr_init>
10bfe9: 89 c3 mov %eax,%ebx
if (result != 0)
10bfeb: 83 c4 10 add $0x10,%esp
10bfee: 85 c0 test %eax,%eax
10bff0: 74 0a je 10bffc <rtems_aio_init+0x24> <== ALWAYS TAKEN
aio_request_queue.active_threads = 0;
aio_request_queue.idle_threads = 0;
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
return result;
}
10bff2: 89 d8 mov %ebx,%eax <== NOT EXECUTED
10bff4: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
10bff7: c9 leave <== NOT EXECUTED
10bff8: c3 ret <== NOT EXECUTED
10bff9: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
result = pthread_attr_init (&aio_request_queue.attr);
if (result != 0)
return result;
result =
10bffc: 83 ec 08 sub $0x8,%esp
10bfff: 6a 00 push $0x0
10c001: 68 88 aa 12 00 push $0x12aa88
10c006: e8 ad 10 00 00 call 10d0b8 <pthread_attr_setdetachstate>
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
10c00b: 83 c4 10 add $0x10,%esp
10c00e: 85 c0 test %eax,%eax
10c010: 0f 85 96 00 00 00 jne 10c0ac <rtems_aio_init+0xd4> <== NEVER TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
10c016: 83 ec 08 sub $0x8,%esp
10c019: 6a 00 push $0x0
10c01b: 68 80 aa 12 00 push $0x12aa80
10c020: e8 7b 0d 00 00 call 10cda0 <pthread_mutex_init>
if (result != 0)
10c025: 83 c4 10 add $0x10,%esp
10c028: 85 c0 test %eax,%eax
10c02a: 0f 85 b8 00 00 00 jne 10c0e8 <rtems_aio_init+0x110> <== NEVER TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
10c030: 83 ec 08 sub $0x8,%esp
10c033: 6a 00 push $0x0
10c035: 68 84 aa 12 00 push $0x12aa84
10c03a: e8 c9 09 00 00 call 10ca08 <pthread_cond_init>
10c03f: 89 c3 mov %eax,%ebx
if (result != 0) {
10c041: 83 c4 10 add $0x10,%esp
10c044: 85 c0 test %eax,%eax
10c046: 75 7c jne 10c0c4 <rtems_aio_init+0xec> <== NEVER TAKEN
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10c048: c7 05 c8 aa 12 00 cc movl $0x12aacc,0x12aac8
10c04f: aa 12 00
head->previous = NULL;
10c052: c7 05 cc aa 12 00 00 movl $0x0,0x12aacc
10c059: 00 00 00
tail->previous = head;
10c05c: c7 05 d0 aa 12 00 c8 movl $0x12aac8,0x12aad0
10c063: aa 12 00
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10c066: c7 05 d4 aa 12 00 d8 movl $0x12aad8,0x12aad4
10c06d: aa 12 00
head->previous = NULL;
10c070: c7 05 d8 aa 12 00 00 movl $0x0,0x12aad8
10c077: 00 00 00
tail->previous = head;
10c07a: c7 05 dc aa 12 00 d4 movl $0x12aad4,0x12aadc
10c081: aa 12 00
}
rtems_chain_initialize_empty (&aio_request_queue.work_req);
rtems_chain_initialize_empty (&aio_request_queue.idle_req);
aio_request_queue.active_threads = 0;
10c084: c7 05 e4 aa 12 00 00 movl $0x0,0x12aae4
10c08b: 00 00 00
aio_request_queue.idle_threads = 0;
10c08e: c7 05 e8 aa 12 00 00 movl $0x0,0x12aae8
10c095: 00 00 00
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
10c098: c7 05 e0 aa 12 00 0b movl $0xb00b,0x12aae0
10c09f: b0 00 00
return result;
}
10c0a2: 89 d8 mov %ebx,%eax
10c0a4: 8b 5d fc mov -0x4(%ebp),%ebx
10c0a7: c9 leave
10c0a8: c3 ret
10c0a9: 8d 76 00 lea 0x0(%esi),%esi
result =
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
pthread_attr_destroy (&aio_request_queue.attr);
10c0ac: 83 ec 0c sub $0xc,%esp
10c0af: 68 88 aa 12 00 push $0x12aa88 <== NOT EXECUTED
10c0b4: e8 af 0f 00 00 call 10d068 <pthread_attr_destroy> <== NOT EXECUTED
10c0b9: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c0bc: e9 55 ff ff ff jmp 10c016 <rtems_aio_init+0x3e> <== NOT EXECUTED
10c0c1: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
if (result != 0) {
pthread_mutex_destroy (&aio_request_queue.mutex);
10c0c4: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c0c7: 68 80 aa 12 00 push $0x12aa80 <== NOT EXECUTED
10c0cc: e8 af 0b 00 00 call 10cc80 <pthread_mutex_destroy> <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
10c0d1: c7 04 24 88 aa 12 00 movl $0x12aa88,(%esp) <== NOT EXECUTED
10c0d8: e8 8b 0f 00 00 call 10d068 <pthread_attr_destroy> <== NOT EXECUTED
10c0dd: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c0e0: e9 63 ff ff ff jmp 10c048 <rtems_aio_init+0x70> <== NOT EXECUTED
10c0e5: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
if (result != 0)
pthread_attr_destroy (&aio_request_queue.attr);
10c0e8: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c0eb: 68 88 aa 12 00 push $0x12aa88 <== NOT EXECUTED
10c0f0: e8 73 0f 00 00 call 10d068 <pthread_attr_destroy> <== NOT EXECUTED
10c0f5: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c0f8: e9 33 ff ff ff jmp 10c030 <rtems_aio_init+0x58> <== NOT EXECUTED
0010c448 <rtems_aio_insert_prio>:
* NONE
*/
void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
10c448: 55 push %ebp
10c449: 89 e5 mov %esp,%ebp
10c44b: 56 push %esi
10c44c: 53 push %ebx
10c44d: 8b 55 08 mov 0x8(%ebp),%edx
10c450: 8b 75 0c mov 0xc(%ebp),%esi
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c453: 8b 02 mov (%edx),%eax
10c455: 8d 4a 04 lea 0x4(%edx),%ecx
rtems_chain_node *node;
AIO_printf ("FD exists \n");
node = rtems_chain_first (chain);
if (rtems_chain_is_empty (chain)) {
10c458: 39 c8 cmp %ecx,%eax
10c45a: 74 27 je 10c483 <rtems_aio_insert_prio+0x3b><== NEVER TAKEN
rtems_chain_prepend (chain, &req->next_prio);
} else {
AIO_printf ("Add by priority \n");
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
while (req->aiocbp->aio_reqprio > prio &&
10c45c: 8b 56 14 mov 0x14(%esi),%edx
10c45f: 8b 5a 14 mov 0x14(%edx),%ebx
if (rtems_chain_is_empty (chain)) {
AIO_printf ("First in chain \n");
rtems_chain_prepend (chain, &req->next_prio);
} else {
AIO_printf ("Add by priority \n");
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
10c462: 8b 50 14 mov 0x14(%eax),%edx
while (req->aiocbp->aio_reqprio > prio &&
10c465: 39 5a 14 cmp %ebx,0x14(%edx)
10c468: 7c 06 jl 10c470 <rtems_aio_insert_prio+0x28><== NEVER TAKEN
10c46a: eb 0e jmp 10c47a <rtems_aio_insert_prio+0x32>
10c46c: 39 c8 cmp %ecx,%eax <== NOT EXECUTED
10c46e: 74 1c je 10c48c <rtems_aio_insert_prio+0x44><== NOT EXECUTED
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c470: 8b 00 mov (%eax),%eax <== NOT EXECUTED
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
while (req->aiocbp->aio_reqprio > prio &&
!rtems_chain_is_tail (chain, node)) {
node = rtems_chain_next (node);
prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
10c472: 8b 50 14 mov 0x14(%eax),%edx <== NOT EXECUTED
rtems_chain_prepend (chain, &req->next_prio);
} else {
AIO_printf ("Add by priority \n");
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
while (req->aiocbp->aio_reqprio > prio &&
10c475: 39 5a 14 cmp %ebx,0x14(%edx) <== NOT EXECUTED
10c478: 7c f2 jl 10c46c <rtems_aio_insert_prio+0x24><== NOT EXECUTED
RTEMS_INLINE_ROUTINE void rtems_chain_insert(
rtems_chain_node *after_node,
rtems_chain_node *the_node
)
{
_Chain_Insert( after_node, the_node );
10c47a: 89 75 0c mov %esi,0xc(%ebp)
10c47d: 8b 40 04 mov 0x4(%eax),%eax
10c480: 89 45 08 mov %eax,0x8(%ebp)
}
rtems_chain_insert (node->previous, &req->next_prio);
}
}
10c483: 5b pop %ebx
10c484: 5e pop %esi
10c485: c9 leave
10c486: e9 71 24 00 00 jmp 10e8fc <_Chain_Insert>
10c48b: 90 nop
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c48c: 89 c8 mov %ecx,%eax <== NOT EXECUTED
10c48e: eb ea jmp 10c47a <rtems_aio_insert_prio+0x32><== NOT EXECUTED
0010c1c0 <rtems_aio_move_to_work>:
* NONE
*/
void
rtems_aio_move_to_work (rtems_aio_request_chain *r_chain)
{
10c1c0: 55 push %ebp
10c1c1: 89 e5 mov %esp,%ebp
10c1c3: 83 ec 08 sub $0x8,%esp
10c1c6: 8b 4d 08 mov 0x8(%ebp),%ecx
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c1c9: a1 c8 aa 12 00 mov 0x12aac8,%eax
rtems_chain_node *node;
node = rtems_chain_first (&aio_request_queue.work_req);
temp = (rtems_aio_request_chain *) node;
while (temp->fildes < r_chain->fildes &&
10c1ce: 8b 51 14 mov 0x14(%ecx),%edx
10c1d1: 39 50 14 cmp %edx,0x14(%eax)
10c1d4: 7c 09 jl 10c1df <rtems_aio_move_to_work+0x1f><== ALWAYS TAKEN
10c1d6: eb 13 jmp 10c1eb <rtems_aio_move_to_work+0x2b><== NOT EXECUTED
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c1d8: 8b 00 mov (%eax),%eax
rtems_chain_node *node;
node = rtems_chain_first (&aio_request_queue.work_req);
temp = (rtems_aio_request_chain *) node;
while (temp->fildes < r_chain->fildes &&
10c1da: 39 50 14 cmp %edx,0x14(%eax)
10c1dd: 7d 0c jge 10c1eb <rtems_aio_move_to_work+0x2b>
10c1df: 3d cc aa 12 00 cmp $0x12aacc,%eax
10c1e4: 75 f2 jne 10c1d8 <rtems_aio_move_to_work+0x18><== ALWAYS TAKEN
10c1e6: b8 cc aa 12 00 mov $0x12aacc,%eax <== NOT EXECUTED
10c1eb: 83 ec 08 sub $0x8,%esp
10c1ee: 51 push %ecx
10c1ef: ff 70 04 pushl 0x4(%eax)
10c1f2: e8 05 27 00 00 call 10e8fc <_Chain_Insert>
10c1f7: 83 c4 10 add $0x10,%esp
node = rtems_chain_next (node);
temp = (rtems_aio_request_chain *) node;
}
rtems_chain_insert (rtems_chain_previous (node), &r_chain->next_fd);
}
10c1fa: c9 leave
10c1fb: c3 ret
0010c490 <rtems_aio_remove_fd>:
* Output parameters:
* NONE
*/
void rtems_aio_remove_fd (rtems_aio_request_chain *r_chain)
{
10c490: 55 push %ebp
10c491: 89 e5 mov %esp,%ebp
10c493: 57 push %edi
10c494: 56 push %esi
10c495: 53 push %ebx
10c496: 83 ec 0c sub $0xc,%esp
10c499: 8b 7d 08 mov 0x8(%ebp),%edi
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c49c: 8b 5f 08 mov 0x8(%edi),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
10c49f: 83 c7 0c add $0xc,%edi
rtems_chain_control *chain;
rtems_chain_node *node;
chain = &r_chain->perfd;
node = rtems_chain_first (chain);
while (!rtems_chain_is_tail (chain, node))
10c4a2: 39 fb cmp %edi,%ebx
10c4a4: 75 04 jne 10c4aa <rtems_aio_remove_fd+0x1a><== ALWAYS TAKEN
10c4a6: eb 2d jmp 10c4d5 <rtems_aio_remove_fd+0x45><== NOT EXECUTED
{
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
node = rtems_chain_next (node);
10c4a8: 89 f3 mov %esi,%ebx
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
10c4aa: 83 ec 0c sub $0xc,%esp
10c4ad: 53 push %ebx
10c4ae: e8 0d 24 00 00 call 10e8c0 <_Chain_Extract>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c4b3: 8b 33 mov (%ebx),%esi
while (!rtems_chain_is_tail (chain, node))
{
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
node = rtems_chain_next (node);
req->aiocbp->error_code = ECANCELED;
10c4b5: 8b 43 14 mov 0x14(%ebx),%eax
10c4b8: c7 40 30 8c 00 00 00 movl $0x8c,0x30(%eax)
req->aiocbp->return_value = -1;
10c4bf: c7 40 34 ff ff ff ff movl $0xffffffff,0x34(%eax)
free (req);
10c4c6: 89 1c 24 mov %ebx,(%esp)
10c4c9: e8 66 c6 ff ff call 108b34 <free>
rtems_chain_control *chain;
rtems_chain_node *node;
chain = &r_chain->perfd;
node = rtems_chain_first (chain);
while (!rtems_chain_is_tail (chain, node))
10c4ce: 83 c4 10 add $0x10,%esp
10c4d1: 39 fe cmp %edi,%esi
10c4d3: 75 d3 jne 10c4a8 <rtems_aio_remove_fd+0x18>
node = rtems_chain_next (node);
req->aiocbp->error_code = ECANCELED;
req->aiocbp->return_value = -1;
free (req);
}
}
10c4d5: 8d 65 f4 lea -0xc(%ebp),%esp
10c4d8: 5b pop %ebx
10c4d9: 5e pop %esi
10c4da: 5f pop %edi
10c4db: c9 leave
10c4dc: c3 ret
0010c4e0 <rtems_aio_remove_req>:
* AIO_NOTCANCELED - if request was not canceled
* AIO_CANCELED - if request was canceled
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
10c4e0: 55 push %ebp
10c4e1: 89 e5 mov %esp,%ebp
10c4e3: 53 push %ebx
10c4e4: 83 ec 04 sub $0x4,%esp
10c4e7: 8b 55 08 mov 0x8(%ebp),%edx
10c4ea: 8b 4d 0c mov 0xc(%ebp),%ecx
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c4ed: 8b 02 mov (%edx),%eax
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10c4ef: 83 c2 04 add $0x4,%edx
* AIO_CANCELED - if request was canceled
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
if (rtems_chain_is_empty (chain))
10c4f2: 39 d0 cmp %edx,%eax
10c4f4: 74 4e je 10c544 <rtems_aio_remove_req+0x64>
return AIO_ALLDONE;
rtems_chain_node *node = rtems_chain_first (chain);
rtems_aio_request *current;
current = (rtems_aio_request *) node;
10c4f6: 89 c3 mov %eax,%ebx
while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) {
10c4f8: 39 48 14 cmp %ecx,0x14(%eax)
10c4fb: 75 0a jne 10c507 <rtems_aio_remove_req+0x27><== NEVER TAKEN
10c4fd: eb 19 jmp 10c518 <rtems_aio_remove_req+0x38>
10c4ff: 90 nop
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
10c500: 89 c3 mov %eax,%ebx <== NOT EXECUTED
rtems_chain_node *node = rtems_chain_first (chain);
rtems_aio_request *current;
current = (rtems_aio_request *) node;
while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) {
10c502: 39 48 14 cmp %ecx,0x14(%eax) <== NOT EXECUTED
10c505: 74 11 je 10c518 <rtems_aio_remove_req+0x38><== NOT EXECUTED
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c507: 8b 00 mov (%eax),%eax <== NOT EXECUTED
rtems_chain_node *node = rtems_chain_first (chain);
rtems_aio_request *current;
current = (rtems_aio_request *) node;
while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) {
10c509: 39 d0 cmp %edx,%eax <== NOT EXECUTED
10c50b: 75 f3 jne 10c500 <rtems_aio_remove_req+0x20><== NOT EXECUTED
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
}
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
10c50d: b8 01 00 00 00 mov $0x1,%eax <== NOT EXECUTED
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
}
10c512: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
10c515: c9 leave <== NOT EXECUTED
10c516: c3 ret <== NOT EXECUTED
10c517: 90 nop <== NOT EXECUTED
10c518: 83 ec 0c sub $0xc,%esp
10c51b: 50 push %eax
10c51c: e8 9f 23 00 00 call 10e8c0 <_Chain_Extract>
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
else
{
rtems_chain_extract (node);
current->aiocbp->error_code = ECANCELED;
10c521: 8b 43 14 mov 0x14(%ebx),%eax
10c524: c7 40 30 8c 00 00 00 movl $0x8c,0x30(%eax)
current->aiocbp->return_value = -1;
10c52b: c7 40 34 ff ff ff ff movl $0xffffffff,0x34(%eax)
free (current);
10c532: 89 1c 24 mov %ebx,(%esp)
10c535: e8 fa c5 ff ff call 108b34 <free>
}
return AIO_CANCELED;
10c53a: 83 c4 10 add $0x10,%esp
10c53d: 31 c0 xor %eax,%eax
}
10c53f: 8b 5d fc mov -0x4(%ebp),%ebx
10c542: c9 leave
10c543: c3 ret
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
if (rtems_chain_is_empty (chain))
return AIO_ALLDONE;
10c544: b8 02 00 00 00 mov $0x2,%eax
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
}
10c549: 8b 5d fc mov -0x4(%ebp),%ebx
10c54c: c9 leave
10c54d: c3 ret
0010c100 <rtems_aio_search_fd>:
*
*/
rtems_aio_request_chain *
rtems_aio_search_fd (rtems_chain_control *chain, int fildes, int create)
{
10c100: 55 push %ebp
10c101: 89 e5 mov %esp,%ebp
10c103: 57 push %edi
10c104: 56 push %esi
10c105: 53 push %ebx
10c106: 83 ec 1c sub $0x1c,%esp
10c109: 8b 75 08 mov 0x8(%ebp),%esi
10c10c: 8b 5d 0c mov 0xc(%ebp),%ebx
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c10f: 8b 06 mov (%esi),%eax
rtems_chain_node *node;
node = rtems_chain_first (chain);
r_chain = (rtems_aio_request_chain *) node;
while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) {
10c111: 8b 50 14 mov 0x14(%eax),%edx
10c114: 39 d3 cmp %edx,%ebx
10c116: 7e 28 jle 10c140 <rtems_aio_search_fd+0x40>
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
10c118: 8d 4e 04 lea 0x4(%esi),%ecx
10c11b: eb 0c jmp 10c129 <rtems_aio_search_fd+0x29>
10c11d: 8d 76 00 lea 0x0(%esi),%esi
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c120: 8b 00 mov (%eax),%eax
rtems_chain_node *node;
node = rtems_chain_first (chain);
r_chain = (rtems_aio_request_chain *) node;
while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) {
10c122: 8b 50 14 mov 0x14(%eax),%edx
10c125: 39 da cmp %ebx,%edx
10c127: 7d 17 jge 10c140 <rtems_aio_search_fd+0x40>
10c129: 39 c8 cmp %ecx,%eax
10c12b: 75 f3 jne 10c120 <rtems_aio_search_fd+0x20>
10c12d: 89 c7 mov %eax,%edi
}
if (r_chain->fildes == fildes)
r_chain->new_fd = 0;
else {
if (create == 0)
10c12f: 8b 45 10 mov 0x10(%ebp),%eax
10c132: 85 c0 test %eax,%eax
10c134: 75 1f jne 10c155 <rtems_aio_search_fd+0x55>
r_chain = NULL;
10c136: 31 c0 xor %eax,%eax
r_chain->new_fd = 1;
r_chain->fildes = fildes;
}
}
return r_chain;
}
10c138: 8d 65 f4 lea -0xc(%ebp),%esp
10c13b: 5b pop %ebx
10c13c: 5e pop %esi
10c13d: 5f pop %edi
10c13e: c9 leave
10c13f: c3 ret
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c140: 89 c7 mov %eax,%edi
while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) {
node = rtems_chain_next (node);
r_chain = (rtems_aio_request_chain *) node;
}
if (r_chain->fildes == fildes)
10c142: 39 d3 cmp %edx,%ebx
10c144: 75 e9 jne 10c12f <rtems_aio_search_fd+0x2f>
r_chain->new_fd = 0;
10c146: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
r_chain->new_fd = 1;
r_chain->fildes = fildes;
}
}
return r_chain;
}
10c14d: 8d 65 f4 lea -0xc(%ebp),%esp
10c150: 5b pop %ebx
10c151: 5e pop %esi
10c152: 5f pop %edi
10c153: c9 leave
10c154: c3 ret
r_chain->new_fd = 0;
else {
if (create == 0)
r_chain = NULL;
else {
r_chain = malloc (sizeof (rtems_aio_request_chain));
10c155: 83 ec 0c sub $0xc,%esp
10c158: 6a 24 push $0x24
10c15a: e8 e9 ce ff ff call 109048 <malloc>
10c15f: 89 c2 mov %eax,%edx
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
10c161: 8d 4a 0c lea 0xc(%edx),%ecx
10c164: 89 4a 08 mov %ecx,0x8(%edx)
head->next = tail;
head->previous = NULL;
10c167: c7 42 0c 00 00 00 00 movl $0x0,0xc(%edx)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
10c16e: 8d 4a 08 lea 0x8(%edx),%ecx
10c171: 89 4a 10 mov %ecx,0x10(%edx)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10c174: 8d 4e 04 lea 0x4(%esi),%ecx
rtems_chain_initialize_empty (&r_chain->perfd);
if (rtems_chain_is_empty (chain))
10c177: 83 c4 10 add $0x10,%esp
10c17a: 39 0e cmp %ecx,(%esi)
10c17c: 74 27 je 10c1a5 <rtems_aio_search_fd+0xa5>
RTEMS_INLINE_ROUTINE void rtems_chain_insert(
rtems_chain_node *after_node,
rtems_chain_node *the_node
)
{
_Chain_Insert( after_node, the_node );
10c17e: 83 ec 08 sub $0x8,%esp
10c181: 52 push %edx
10c182: ff 77 04 pushl 0x4(%edi)
10c185: 89 45 e4 mov %eax,-0x1c(%ebp)
10c188: 89 55 e0 mov %edx,-0x20(%ebp)
10c18b: e8 6c 27 00 00 call 10e8fc <_Chain_Insert>
10c190: 83 c4 10 add $0x10,%esp
10c193: 8b 55 e0 mov -0x20(%ebp),%edx
10c196: 8b 45 e4 mov -0x1c(%ebp),%eax
rtems_chain_prepend (chain, &r_chain->next_fd);
else
rtems_chain_insert (rtems_chain_previous (node), &r_chain->next_fd);
r_chain->new_fd = 1;
10c199: c7 42 18 01 00 00 00 movl $0x1,0x18(%edx)
r_chain->fildes = fildes;
10c1a0: 89 5a 14 mov %ebx,0x14(%edx)
10c1a3: eb a8 jmp 10c14d <rtems_aio_search_fd+0x4d>
RTEMS_INLINE_ROUTINE void _Chain_Prepend(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert(_Chain_Head(the_chain), the_node);
10c1a5: 83 ec 08 sub $0x8,%esp
10c1a8: 52 push %edx
10c1a9: 56 push %esi
10c1aa: 89 45 e4 mov %eax,-0x1c(%ebp)
10c1ad: 89 55 e0 mov %edx,-0x20(%ebp)
10c1b0: e8 47 27 00 00 call 10e8fc <_Chain_Insert>
10c1b5: 83 c4 10 add $0x10,%esp
10c1b8: 8b 45 e4 mov -0x1c(%ebp),%eax
10c1bb: 8b 55 e0 mov -0x20(%ebp),%edx
10c1be: eb d9 jmp 10c199 <rtems_aio_search_fd+0x99>
001087ec <rtems_assoc_local_by_name>:
uint32_t rtems_assoc_local_by_name(
const rtems_assoc_t *ap,
const char *name
)
{
1087ec: 55 push %ebp
1087ed: 89 e5 mov %esp,%ebp
1087ef: 83 ec 10 sub $0x10,%esp
const rtems_assoc_t *nap;
nap = rtems_assoc_ptr_by_name(ap, name);
1087f2: ff 75 0c pushl 0xc(%ebp)
1087f5: ff 75 08 pushl 0x8(%ebp)
1087f8: e8 13 02 00 00 call 108a10 <rtems_assoc_ptr_by_name>
if (nap)
1087fd: 83 c4 10 add $0x10,%esp
108800: 85 c0 test %eax,%eax
108802: 74 08 je 10880c <rtems_assoc_local_by_name+0x20>
return nap->local_value;
108804: 8b 40 04 mov 0x4(%eax),%eax
return 0;
}
108807: c9 leave
108808: c3 ret
108809: 8d 76 00 lea 0x0(%esi),%esi
nap = rtems_assoc_ptr_by_name(ap, name);
if (nap)
return nap->local_value;
return 0;
10880c: 31 c0 xor %eax,%eax
}
10880e: c9 leave
10880f: c3 ret
0010fb90 <rtems_assoc_local_by_remote>:
uint32_t rtems_assoc_local_by_remote(
const rtems_assoc_t *ap,
uint32_t remote_value
)
{
10fb90: 55 push %ebp
10fb91: 89 e5 mov %esp,%ebp
10fb93: 83 ec 10 sub $0x10,%esp
const rtems_assoc_t *nap;
nap = rtems_assoc_ptr_by_remote(ap, remote_value);
10fb96: ff 75 0c pushl 0xc(%ebp)
10fb99: ff 75 08 pushl 0x8(%ebp)
10fb9c: e8 13 00 00 00 call 10fbb4 <rtems_assoc_ptr_by_remote>
if (nap)
10fba1: 83 c4 10 add $0x10,%esp
10fba4: 85 c0 test %eax,%eax
10fba6: 74 08 je 10fbb0 <rtems_assoc_local_by_remote+0x20>
return nap->local_value;
10fba8: 8b 40 04 mov 0x4(%eax),%eax
return 0;
}
10fbab: c9 leave
10fbac: c3 ret
10fbad: 8d 76 00 lea 0x0(%esi),%esi
nap = rtems_assoc_ptr_by_remote(ap, remote_value);
if (nap)
return nap->local_value;
return 0;
10fbb0: 31 c0 xor %eax,%eax
}
10fbb2: c9 leave
10fbb3: c3 ret
00112b00 <rtems_assoc_local_by_remote_bitfield>:
uint32_t rtems_assoc_local_by_remote_bitfield(
const rtems_assoc_t *ap,
uint32_t remote_value
)
{
112b00: 55 push %ebp
112b01: 89 e5 mov %esp,%ebp
112b03: 57 push %edi
112b04: 56 push %esi
112b05: 53 push %ebx
112b06: 83 ec 1c sub $0x1c,%esp
112b09: 8b 7d 0c mov 0xc(%ebp),%edi
112b0c: be 20 00 00 00 mov $0x20,%esi
uint32_t b;
uint32_t local_value = 0;
112b11: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
for (b = 1; b; b <<= 1) {
112b18: bb 01 00 00 00 mov $0x1,%ebx
112b1d: eb 06 jmp 112b25 <rtems_assoc_local_by_remote_bitfield+0x25>
112b1f: 90 nop
112b20: d1 e3 shl %ebx
112b22: 4e dec %esi
112b23: 74 1b je 112b40 <rtems_assoc_local_by_remote_bitfield+0x40>
if (b & remote_value)
112b25: 85 fb test %edi,%ebx
112b27: 74 f7 je 112b20 <rtems_assoc_local_by_remote_bitfield+0x20>
local_value |= rtems_assoc_local_by_remote(ap, b);
112b29: 83 ec 08 sub $0x8,%esp
112b2c: 53 push %ebx
112b2d: ff 75 08 pushl 0x8(%ebp)
112b30: e8 5b d0 ff ff call 10fb90 <rtems_assoc_local_by_remote>
112b35: 09 45 e4 or %eax,-0x1c(%ebp)
112b38: 83 c4 10 add $0x10,%esp
)
{
uint32_t b;
uint32_t local_value = 0;
for (b = 1; b; b <<= 1) {
112b3b: d1 e3 shl %ebx
112b3d: 4e dec %esi
112b3e: 75 e5 jne 112b25 <rtems_assoc_local_by_remote_bitfield+0x25><== ALWAYS TAKEN
if (b & remote_value)
local_value |= rtems_assoc_local_by_remote(ap, b);
}
return local_value;
}
112b40: 8b 45 e4 mov -0x1c(%ebp),%eax
112b43: 8d 65 f4 lea -0xc(%ebp),%esp
112b46: 5b pop %ebx
112b47: 5e pop %esi
112b48: 5f pop %edi
112b49: c9 leave
112b4a: c3 ret
00114ce4 <rtems_assoc_name_by_local>:
const char *rtems_assoc_name_by_local(
const rtems_assoc_t *ap,
uint32_t local_value
)
{
114ce4: 55 push %ebp
114ce5: 89 e5 mov %esp,%ebp
114ce7: 53 push %ebx
114ce8: 83 ec 0c sub $0xc,%esp
114ceb: 8b 5d 0c mov 0xc(%ebp),%ebx
const rtems_assoc_t *nap;
nap = rtems_assoc_ptr_by_local(ap, local_value);
114cee: 53 push %ebx
114cef: ff 75 08 pushl 0x8(%ebp)
114cf2: e8 1d 00 00 00 call 114d14 <rtems_assoc_ptr_by_local>
if (nap)
114cf7: 83 c4 10 add $0x10,%esp
114cfa: 85 c0 test %eax,%eax
114cfc: 74 0a je 114d08 <rtems_assoc_name_by_local+0x24>
return nap->name;
114cfe: 8b 00 mov (%eax),%eax
return rtems_assoc_name_bad(local_value);
}
114d00: 8b 5d fc mov -0x4(%ebp),%ebx
114d03: c9 leave
114d04: c3 ret
114d05: 8d 76 00 lea 0x0(%esi),%esi
nap = rtems_assoc_ptr_by_local(ap, local_value);
if (nap)
return nap->name;
return rtems_assoc_name_bad(local_value);
114d08: 89 5d 08 mov %ebx,0x8(%ebp)
}
114d0b: 8b 5d fc mov -0x4(%ebp),%ebx
114d0e: c9 leave
nap = rtems_assoc_ptr_by_local(ap, local_value);
if (nap)
return nap->name;
return rtems_assoc_name_bad(local_value);
114d0f: e9 4c 31 00 00 jmp 117e60 <rtems_assoc_name_bad>
00108988 <rtems_assoc_name_by_remote>:
const char *rtems_assoc_name_by_remote(
const rtems_assoc_t *ap,
uint32_t remote_value
)
{
108988: 55 push %ebp
108989: 89 e5 mov %esp,%ebp
10898b: 53 push %ebx
10898c: 83 ec 0c sub $0xc,%esp
10898f: 8b 5d 0c mov 0xc(%ebp),%ebx
const rtems_assoc_t *nap;
nap = rtems_assoc_ptr_by_remote(ap, remote_value);
108992: 53 push %ebx
108993: ff 75 08 pushl 0x8(%ebp)
108996: e8 ed 00 00 00 call 108a88 <rtems_assoc_ptr_by_remote>
if (nap)
10899b: 83 c4 10 add $0x10,%esp
10899e: 85 c0 test %eax,%eax
1089a0: 74 0a je 1089ac <rtems_assoc_name_by_remote+0x24>
return nap->name;
1089a2: 8b 00 mov (%eax),%eax
return rtems_assoc_name_bad(remote_value);
}
1089a4: 8b 5d fc mov -0x4(%ebp),%ebx
1089a7: c9 leave
1089a8: c3 ret
1089a9: 8d 76 00 lea 0x0(%esi),%esi
nap = rtems_assoc_ptr_by_remote(ap, remote_value);
if (nap)
return nap->name;
return rtems_assoc_name_bad(remote_value);
1089ac: 89 5d 08 mov %ebx,0x8(%ebp)
}
1089af: 8b 5d fc mov -0x4(%ebp),%ebx
1089b2: c9 leave
nap = rtems_assoc_ptr_by_remote(ap, remote_value);
if (nap)
return nap->name;
return rtems_assoc_name_bad(remote_value);
1089b3: e9 c8 7e 00 00 jmp 110880 <rtems_assoc_name_bad>
00114d14 <rtems_assoc_ptr_by_local>:
const rtems_assoc_t *rtems_assoc_ptr_by_local(
const rtems_assoc_t *ap,
uint32_t local_value
)
{
114d14: 55 push %ebp
114d15: 89 e5 mov %esp,%ebp
114d17: 57 push %edi
114d18: 56 push %esi
114d19: 53 push %ebx
114d1a: 8b 45 08 mov 0x8(%ebp),%eax
114d1d: 8b 55 0c mov 0xc(%ebp),%edx
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
114d20: 8b 30 mov (%eax),%esi
114d22: 85 f6 test %esi,%esi
114d24: 74 3e je 114d64 <rtems_assoc_ptr_by_local+0x50>
114d26: bf 78 7d 12 00 mov $0x127d78,%edi
114d2b: b9 0a 00 00 00 mov $0xa,%ecx
114d30: f3 a6 repz cmpsb %es:(%edi),%ds:(%esi)
114d32: 74 18 je 114d4c <rtems_assoc_ptr_by_local+0x38>
const rtems_assoc_t *rtems_assoc_ptr_by_local(
const rtems_assoc_t *ap,
uint32_t local_value
)
{
const rtems_assoc_t *default_ap = 0;
114d34: 31 c9 xor %ecx,%ecx
114d36: eb 09 jmp 114d41 <rtems_assoc_ptr_by_local+0x2d>
if (rtems_assoc_is_default(ap))
default_ap = ap++;
for ( ; ap->name; ap++)
114d38: 83 c0 0c add $0xc,%eax
114d3b: 8b 18 mov (%eax),%ebx
114d3d: 85 db test %ebx,%ebx
114d3f: 74 1b je 114d5c <rtems_assoc_ptr_by_local+0x48>
if (ap->local_value == local_value)
114d41: 39 50 04 cmp %edx,0x4(%eax)
114d44: 75 f2 jne 114d38 <rtems_assoc_ptr_by_local+0x24>
return ap;
return default_ap;
}
114d46: 5b pop %ebx
114d47: 5e pop %esi
114d48: 5f pop %edi
114d49: c9 leave
114d4a: c3 ret
114d4b: 90 nop
)
{
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
default_ap = ap++;
114d4c: 8d 58 0c lea 0xc(%eax),%ebx
for ( ; ap->name; ap++)
114d4f: 8b 70 0c mov 0xc(%eax),%esi
114d52: 85 f6 test %esi,%esi
114d54: 74 f0 je 114d46 <rtems_assoc_ptr_by_local+0x32><== NEVER TAKEN
114d56: 89 c1 mov %eax,%ecx
114d58: 89 d8 mov %ebx,%eax
114d5a: eb e5 jmp 114d41 <rtems_assoc_ptr_by_local+0x2d>
114d5c: 89 c8 mov %ecx,%eax
if (ap->local_value == local_value)
return ap;
return default_ap;
}
114d5e: 5b pop %ebx
114d5f: 5e pop %esi
114d60: 5f pop %edi
114d61: c9 leave
114d62: c3 ret
114d63: 90 nop
const rtems_assoc_t *rtems_assoc_ptr_by_local(
const rtems_assoc_t *ap,
uint32_t local_value
)
{
const rtems_assoc_t *default_ap = 0;
114d64: 31 c0 xor %eax,%eax
for ( ; ap->name; ap++)
if (ap->local_value == local_value)
return ap;
return default_ap;
}
114d66: 5b pop %ebx
114d67: 5e pop %esi
114d68: 5f pop %edi
114d69: c9 leave
114d6a: c3 ret
00108a10 <rtems_assoc_ptr_by_name>:
const rtems_assoc_t *rtems_assoc_ptr_by_name(
const rtems_assoc_t *ap,
const char *name
)
{
108a10: 55 push %ebp
108a11: 89 e5 mov %esp,%ebp
108a13: 57 push %edi
108a14: 56 push %esi
108a15: 53 push %ebx
108a16: 83 ec 0c sub $0xc,%esp
108a19: 8b 5d 08 mov 0x8(%ebp),%ebx
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
108a1c: 8b 03 mov (%ebx),%eax
108a1e: 85 c0 test %eax,%eax
108a20: 74 5a je 108a7c <rtems_assoc_ptr_by_name+0x6c>
108a22: bf 1d 0c 12 00 mov $0x120c1d,%edi
108a27: b9 0a 00 00 00 mov $0xa,%ecx
108a2c: 89 c6 mov %eax,%esi
108a2e: f3 a6 repz cmpsb %es:(%edi),%ds:(%esi)
108a30: 74 2e je 108a60 <rtems_assoc_ptr_by_name+0x50>
const rtems_assoc_t *rtems_assoc_ptr_by_name(
const rtems_assoc_t *ap,
const char *name
)
{
const rtems_assoc_t *default_ap = 0;
108a32: 31 f6 xor %esi,%esi
108a34: eb 0b jmp 108a41 <rtems_assoc_ptr_by_name+0x31>
108a36: 66 90 xchg %ax,%ax
if (rtems_assoc_is_default(ap))
default_ap = ap++;
for ( ; ap->name; ap++)
108a38: 83 c3 0c add $0xc,%ebx
108a3b: 8b 03 mov (%ebx),%eax
108a3d: 85 c0 test %eax,%eax
108a3f: 74 2f je 108a70 <rtems_assoc_ptr_by_name+0x60>
if (strcmp(ap->name, name) == 0)
108a41: 83 ec 08 sub $0x8,%esp
108a44: ff 75 0c pushl 0xc(%ebp)
108a47: 50 push %eax
108a48: e8 2f c1 00 00 call 114b7c <strcmp>
108a4d: 83 c4 10 add $0x10,%esp
108a50: 85 c0 test %eax,%eax
108a52: 75 e4 jne 108a38 <rtems_assoc_ptr_by_name+0x28>
return ap;
return default_ap;
}
108a54: 89 d8 mov %ebx,%eax
108a56: 8d 65 f4 lea -0xc(%ebp),%esp
108a59: 5b pop %ebx
108a5a: 5e pop %esi
108a5b: 5f pop %edi
108a5c: c9 leave
108a5d: c3 ret
108a5e: 66 90 xchg %ax,%ax
)
{
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
default_ap = ap++;
108a60: 8d 53 0c lea 0xc(%ebx),%edx
for ( ; ap->name; ap++)
108a63: 8b 43 0c mov 0xc(%ebx),%eax
108a66: 85 c0 test %eax,%eax
108a68: 74 ea je 108a54 <rtems_assoc_ptr_by_name+0x44><== NEVER TAKEN
108a6a: 89 de mov %ebx,%esi
108a6c: 89 d3 mov %edx,%ebx
108a6e: eb d1 jmp 108a41 <rtems_assoc_ptr_by_name+0x31>
108a70: 89 f3 mov %esi,%ebx
if (strcmp(ap->name, name) == 0)
return ap;
return default_ap;
}
108a72: 89 d8 mov %ebx,%eax
108a74: 8d 65 f4 lea -0xc(%ebp),%esp
108a77: 5b pop %ebx
108a78: 5e pop %esi
108a79: 5f pop %edi
108a7a: c9 leave
108a7b: c3 ret
const rtems_assoc_t *rtems_assoc_ptr_by_name(
const rtems_assoc_t *ap,
const char *name
)
{
const rtems_assoc_t *default_ap = 0;
108a7c: 31 db xor %ebx,%ebx
for ( ; ap->name; ap++)
if (strcmp(ap->name, name) == 0)
return ap;
return default_ap;
}
108a7e: 89 d8 mov %ebx,%eax
108a80: 8d 65 f4 lea -0xc(%ebp),%esp
108a83: 5b pop %ebx
108a84: 5e pop %esi
108a85: 5f pop %edi
108a86: c9 leave
108a87: c3 ret
0010fbb4 <rtems_assoc_ptr_by_remote>:
const rtems_assoc_t *rtems_assoc_ptr_by_remote(
const rtems_assoc_t *ap,
uint32_t remote_value
)
{
10fbb4: 55 push %ebp
10fbb5: 89 e5 mov %esp,%ebp
10fbb7: 57 push %edi
10fbb8: 56 push %esi
10fbb9: 53 push %ebx
10fbba: 8b 45 08 mov 0x8(%ebp),%eax
10fbbd: 8b 55 0c mov 0xc(%ebp),%edx
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
10fbc0: 8b 30 mov (%eax),%esi
10fbc2: 85 f6 test %esi,%esi
10fbc4: 74 3e je 10fc04 <rtems_assoc_ptr_by_remote+0x50>
10fbc6: bf d8 19 12 00 mov $0x1219d8,%edi
10fbcb: b9 0a 00 00 00 mov $0xa,%ecx
10fbd0: f3 a6 repz cmpsb %es:(%edi),%ds:(%esi)
10fbd2: 74 18 je 10fbec <rtems_assoc_ptr_by_remote+0x38>
const rtems_assoc_t *rtems_assoc_ptr_by_remote(
const rtems_assoc_t *ap,
uint32_t remote_value
)
{
const rtems_assoc_t *default_ap = 0;
10fbd4: 31 c9 xor %ecx,%ecx
10fbd6: eb 09 jmp 10fbe1 <rtems_assoc_ptr_by_remote+0x2d>
if (rtems_assoc_is_default(ap))
default_ap = ap++;
for ( ; ap->name; ap++)
10fbd8: 83 c0 0c add $0xc,%eax
10fbdb: 8b 18 mov (%eax),%ebx
10fbdd: 85 db test %ebx,%ebx
10fbdf: 74 1b je 10fbfc <rtems_assoc_ptr_by_remote+0x48>
if (ap->remote_value == remote_value)
10fbe1: 39 50 08 cmp %edx,0x8(%eax)
10fbe4: 75 f2 jne 10fbd8 <rtems_assoc_ptr_by_remote+0x24>
return ap;
return default_ap;
}
10fbe6: 5b pop %ebx
10fbe7: 5e pop %esi
10fbe8: 5f pop %edi
10fbe9: c9 leave
10fbea: c3 ret
10fbeb: 90 nop
)
{
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
default_ap = ap++;
10fbec: 8d 58 0c lea 0xc(%eax),%ebx
for ( ; ap->name; ap++)
10fbef: 8b 70 0c mov 0xc(%eax),%esi
10fbf2: 85 f6 test %esi,%esi
10fbf4: 74 f0 je 10fbe6 <rtems_assoc_ptr_by_remote+0x32><== NEVER TAKEN
10fbf6: 89 c1 mov %eax,%ecx
10fbf8: 89 d8 mov %ebx,%eax
10fbfa: eb e5 jmp 10fbe1 <rtems_assoc_ptr_by_remote+0x2d>
10fbfc: 89 c8 mov %ecx,%eax
if (ap->remote_value == remote_value)
return ap;
return default_ap;
}
10fbfe: 5b pop %ebx
10fbff: 5e pop %esi
10fc00: 5f pop %edi
10fc01: c9 leave
10fc02: c3 ret
10fc03: 90 nop
const rtems_assoc_t *rtems_assoc_ptr_by_remote(
const rtems_assoc_t *ap,
uint32_t remote_value
)
{
const rtems_assoc_t *default_ap = 0;
10fc04: 31 c0 xor %eax,%eax
for ( ; ap->name; ap++)
if (ap->remote_value == remote_value)
return ap;
return default_ap;
}
10fc06: 5b pop %ebx
10fc07: 5e pop %esi
10fc08: 5f pop %edi
10fc09: c9 leave
10fc0a: c3 ret
00108b2c <rtems_assoc_remote_by_local>:
uint32_t rtems_assoc_remote_by_local(
const rtems_assoc_t *ap,
uint32_t local_value
)
{
108b2c: 55 push %ebp
108b2d: 89 e5 mov %esp,%ebp
108b2f: 83 ec 10 sub $0x10,%esp
const rtems_assoc_t *nap;
nap = rtems_assoc_ptr_by_local(ap, local_value);
108b32: ff 75 0c pushl 0xc(%ebp)
108b35: ff 75 08 pushl 0x8(%ebp)
108b38: e8 7b fe ff ff call 1089b8 <rtems_assoc_ptr_by_local>
if (nap)
108b3d: 83 c4 10 add $0x10,%esp
108b40: 85 c0 test %eax,%eax
108b42: 74 08 je 108b4c <rtems_assoc_remote_by_local+0x20>
return nap->remote_value;
108b44: 8b 40 08 mov 0x8(%eax),%eax
return 0;
}
108b47: c9 leave
108b48: c3 ret
108b49: 8d 76 00 lea 0x0(%esi),%esi
nap = rtems_assoc_ptr_by_local(ap, local_value);
if (nap)
return nap->remote_value;
return 0;
108b4c: 31 c0 xor %eax,%eax
}
108b4e: c9 leave
108b4f: c3 ret
00108ae0 <rtems_assoc_remote_by_local_bitfield>:
uint32_t rtems_assoc_remote_by_local_bitfield(
const rtems_assoc_t *ap,
uint32_t local_value
)
{
108ae0: 55 push %ebp
108ae1: 89 e5 mov %esp,%ebp
108ae3: 57 push %edi
108ae4: 56 push %esi
108ae5: 53 push %ebx
108ae6: 83 ec 1c sub $0x1c,%esp
108ae9: 8b 7d 0c mov 0xc(%ebp),%edi
108aec: be 20 00 00 00 mov $0x20,%esi
uint32_t b;
uint32_t remote_value = 0;
108af1: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
for (b = 1; b; b <<= 1)
108af8: bb 01 00 00 00 mov $0x1,%ebx
108afd: eb 06 jmp 108b05 <rtems_assoc_remote_by_local_bitfield+0x25>
108aff: 90 nop
108b00: d1 e3 shl %ebx
108b02: 4e dec %esi
108b03: 74 1b je 108b20 <rtems_assoc_remote_by_local_bitfield+0x40>
if (b & local_value)
108b05: 85 fb test %edi,%ebx
108b07: 74 f7 je 108b00 <rtems_assoc_remote_by_local_bitfield+0x20>
remote_value |= rtems_assoc_remote_by_local(ap, b);
108b09: 83 ec 08 sub $0x8,%esp
108b0c: 53 push %ebx
108b0d: ff 75 08 pushl 0x8(%ebp)
108b10: e8 17 00 00 00 call 108b2c <rtems_assoc_remote_by_local>
108b15: 09 45 e4 or %eax,-0x1c(%ebp)
108b18: 83 c4 10 add $0x10,%esp
)
{
uint32_t b;
uint32_t remote_value = 0;
for (b = 1; b; b <<= 1)
108b1b: d1 e3 shl %ebx
108b1d: 4e dec %esi
108b1e: 75 e5 jne 108b05 <rtems_assoc_remote_by_local_bitfield+0x25><== ALWAYS TAKEN
if (b & local_value)
remote_value |= rtems_assoc_remote_by_local(ap, b);
return remote_value;
}
108b20: 8b 45 e4 mov -0x1c(%ebp),%eax
108b23: 8d 65 f4 lea -0xc(%ebp),%esp
108b26: 5b pop %ebx
108b27: 5e pop %esi
108b28: 5f pop %edi
108b29: c9 leave
108b2a: c3 ret
00108b50 <rtems_assoc_remote_by_name>:
uint32_t rtems_assoc_remote_by_name(
const rtems_assoc_t *ap,
const char *name
)
{
108b50: 55 push %ebp
108b51: 89 e5 mov %esp,%ebp
108b53: 83 ec 10 sub $0x10,%esp
const rtems_assoc_t *nap;
nap = rtems_assoc_ptr_by_name(ap, name);
108b56: ff 75 0c pushl 0xc(%ebp)
108b59: ff 75 08 pushl 0x8(%ebp)
108b5c: e8 af fe ff ff call 108a10 <rtems_assoc_ptr_by_name>
if (nap)
108b61: 83 c4 10 add $0x10,%esp
108b64: 85 c0 test %eax,%eax
108b66: 74 08 je 108b70 <rtems_assoc_remote_by_name+0x20>
return nap->remote_value;
108b68: 8b 40 08 mov 0x8(%eax),%eax
return 0;
}
108b6b: c9 leave
108b6c: c3 ret
108b6d: 8d 76 00 lea 0x0(%esi),%esi
nap = rtems_assoc_ptr_by_name(ap, name);
if (nap)
return nap->remote_value;
return 0;
108b70: 31 c0 xor %eax,%eax
}
108b72: c9 leave
108b73: c3 ret
00113684 <rtems_barrier_create>:
rtems_name name,
rtems_attribute attribute_set,
uint32_t maximum_waiters,
rtems_id *id
)
{
113684: 55 push %ebp
113685: 89 e5 mov %esp,%ebp
113687: 57 push %edi
113688: 56 push %esi
113689: 53 push %ebx
11368a: 83 ec 2c sub $0x2c,%esp
11368d: 8b 5d 08 mov 0x8(%ebp),%ebx
113690: 8b 7d 0c mov 0xc(%ebp),%edi
113693: 8b 45 10 mov 0x10(%ebp),%eax
113696: 8b 75 14 mov 0x14(%ebp),%esi
Barrier_Control *the_barrier;
CORE_barrier_Attributes the_attributes;
if ( !rtems_is_name_valid( name ) )
113699: 85 db test %ebx,%ebx
11369b: 0f 84 87 00 00 00 je 113728 <rtems_barrier_create+0xa4>
return RTEMS_INVALID_NAME;
if ( !id )
1136a1: 85 f6 test %esi,%esi
1136a3: 0f 84 bf 00 00 00 je 113768 <rtems_barrier_create+0xe4><== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
/* Initialize core barrier attributes */
if ( _Attributes_Is_barrier_automatic( attribute_set ) ) {
1136a9: f7 c7 10 00 00 00 test $0x10,%edi
1136af: 0f 84 83 00 00 00 je 113738 <rtems_barrier_create+0xb4>
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
1136b5: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
if ( maximum_waiters == 0 )
1136bc: 85 c0 test %eax,%eax
1136be: 0f 84 80 00 00 00 je 113744 <rtems_barrier_create+0xc0><== NEVER TAKEN
return RTEMS_INVALID_NUMBER;
} else
the_attributes.discipline = CORE_BARRIER_MANUAL_RELEASE;
the_attributes.maximum_count = maximum_waiters;
1136c4: 89 45 e4 mov %eax,-0x1c(%ebp)
1136c7: a1 30 a8 12 00 mov 0x12a830,%eax
1136cc: 40 inc %eax
1136cd: a3 30 a8 12 00 mov %eax,0x12a830
* This function allocates a barrier control block from
* the inactive chain of free barrier control blocks.
*/
RTEMS_INLINE_ROUTINE Barrier_Control *_Barrier_Allocate( void )
{
return (Barrier_Control *) _Objects_Allocate( &_Barrier_Information );
1136d2: 83 ec 0c sub $0xc,%esp
1136d5: 68 60 b2 12 00 push $0x12b260
1136da: e8 85 b0 ff ff call 10e764 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _Barrier_Allocate();
if ( !the_barrier ) {
1136df: 83 c4 10 add $0x10,%esp
1136e2: 85 c0 test %eax,%eax
1136e4: 74 6e je 113754 <rtems_barrier_create+0xd0>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_barrier->attribute_set = attribute_set;
1136e6: 89 78 10 mov %edi,0x10(%eax)
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
1136e9: 83 ec 08 sub $0x8,%esp
1136ec: 8d 55 e0 lea -0x20(%ebp),%edx
1136ef: 52 push %edx
1136f0: 8d 50 14 lea 0x14(%eax),%edx
1136f3: 52 push %edx
1136f4: 89 45 d4 mov %eax,-0x2c(%ebp)
1136f7: e8 c0 07 00 00 call 113ebc <_CORE_barrier_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
1136fc: 8b 45 d4 mov -0x2c(%ebp),%eax
1136ff: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
113702: 0f b7 fa movzwl %dx,%edi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
113705: 8b 0d 7c b2 12 00 mov 0x12b27c,%ecx
11370b: 89 04 b9 mov %eax,(%ecx,%edi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
11370e: 89 58 0c mov %ebx,0xc(%eax)
&_Barrier_Information,
&the_barrier->Object,
(Objects_Name) name
);
*id = the_barrier->Object.id;
113711: 89 16 mov %edx,(%esi)
_Thread_Enable_dispatch();
113713: e8 e8 bf ff ff call 10f700 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
113718: 83 c4 10 add $0x10,%esp
11371b: 31 c0 xor %eax,%eax
}
11371d: 8d 65 f4 lea -0xc(%ebp),%esp
113720: 5b pop %ebx
113721: 5e pop %esi
113722: 5f pop %edi
113723: c9 leave
113724: c3 ret
113725: 8d 76 00 lea 0x0(%esi),%esi
{
Barrier_Control *the_barrier;
CORE_barrier_Attributes the_attributes;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
113728: b8 03 00 00 00 mov $0x3,%eax
*id = the_barrier->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
11372d: 8d 65 f4 lea -0xc(%ebp),%esp
113730: 5b pop %ebx
113731: 5e pop %esi
113732: 5f pop %edi
113733: c9 leave
113734: c3 ret
113735: 8d 76 00 lea 0x0(%esi),%esi
if ( _Attributes_Is_barrier_automatic( attribute_set ) ) {
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
if ( maximum_waiters == 0 )
return RTEMS_INVALID_NUMBER;
} else
the_attributes.discipline = CORE_BARRIER_MANUAL_RELEASE;
113738: c7 45 e0 01 00 00 00 movl $0x1,-0x20(%ebp)
11373f: eb 83 jmp 1136c4 <rtems_barrier_create+0x40>
113741: 8d 76 00 lea 0x0(%esi),%esi
/* Initialize core barrier attributes */
if ( _Attributes_Is_barrier_automatic( attribute_set ) ) {
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
if ( maximum_waiters == 0 )
return RTEMS_INVALID_NUMBER;
113744: b8 0a 00 00 00 mov $0xa,%eax
*id = the_barrier->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
113749: 8d 65 f4 lea -0xc(%ebp),%esp
11374c: 5b pop %ebx
11374d: 5e pop %esi
11374e: 5f pop %edi
11374f: c9 leave
113750: c3 ret
113751: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _Barrier_Allocate();
if ( !the_barrier ) {
_Thread_Enable_dispatch();
113754: e8 a7 bf ff ff call 10f700 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
113759: b8 05 00 00 00 mov $0x5,%eax
*id = the_barrier->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
11375e: 8d 65 f4 lea -0xc(%ebp),%esp
113761: 5b pop %ebx
113762: 5e pop %esi
113763: 5f pop %edi
113764: c9 leave
113765: c3 ret
113766: 66 90 xchg %ax,%ax
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
113768: b8 09 00 00 00 mov $0x9,%eax
11376d: eb ae jmp 11371d <rtems_barrier_create+0x99>
00107d4c <rtems_bsp_cmdline_get_param>:
const char *rtems_bsp_cmdline_get_param(
const char *name,
char *value,
size_t length
)
{
107d4c: 55 push %ebp
107d4d: 89 e5 mov %esp,%ebp
107d4f: 57 push %edi
107d50: 56 push %esi
107d51: 53 push %ebx
107d52: 83 ec 1c sub $0x1c,%esp
107d55: 8b 45 08 mov 0x8(%ebp),%eax
107d58: 8b 5d 0c mov 0xc(%ebp),%ebx
107d5b: 8b 75 10 mov 0x10(%ebp),%esi
const char *p;
if ( !name )
107d5e: 85 c0 test %eax,%eax
107d60: 75 0a jne 107d6c <rtems_bsp_cmdline_get_param+0x20>
value[0] = '\0';
p = rtems_bsp_cmdline_get_param_raw( name );
if ( !p )
return NULL;
107d62: 31 c0 xor %eax,%eax
copy_string( p, value, length );
return value;
}
107d64: 8d 65 f4 lea -0xc(%ebp),%esp
107d67: 5b pop %ebx
107d68: 5e pop %esi
107d69: 5f pop %edi
107d6a: c9 leave
107d6b: c3 ret
const char *p;
if ( !name )
return NULL;
if ( !value )
107d6c: 85 db test %ebx,%ebx
107d6e: 74 f2 je 107d62 <rtems_bsp_cmdline_get_param+0x16>
return NULL;
if ( !length )
107d70: 85 f6 test %esi,%esi
107d72: 74 ee je 107d62 <rtems_bsp_cmdline_get_param+0x16>
return NULL;
value[0] = '\0';
107d74: c6 03 00 movb $0x0,(%ebx)
p = rtems_bsp_cmdline_get_param_raw( name );
107d77: 83 ec 0c sub $0xc,%esp
107d7a: 50 push %eax
107d7b: e8 4c 00 00 00 call 107dcc <rtems_bsp_cmdline_get_param_raw>
if ( !p )
107d80: 83 c4 10 add $0x10,%esp
107d83: 85 c0 test %eax,%eax
107d85: 74 db je 107d62 <rtems_bsp_cmdline_get_param+0x16>
int i;
int quotes;
const char *p = start;
quotes=0;
for (i=0 ; *p && i<length-1; ) {
107d87: 8a 08 mov (%eax),%cl
107d89: 84 c9 test %cl,%cl
107d8b: 74 3a je 107dc7 <rtems_bsp_cmdline_get_param+0x7b><== NEVER TAKEN
107d8d: 4e dec %esi
107d8e: 89 75 e4 mov %esi,-0x1c(%ebp)
107d91: 74 34 je 107dc7 <rtems_bsp_cmdline_get_param+0x7b><== NEVER TAKEN
107d93: 31 f6 xor %esi,%esi
107d95: 31 d2 xor %edx,%edx
107d97: 31 ff xor %edi,%edi
107d99: eb 24 jmp 107dbf <rtems_bsp_cmdline_get_param+0x73>
107d9b: 90 nop
if ( *p == '\"' ) {
quotes++;
} else if ( ((quotes % 2) == 0) && *p == ' ' )
107d9c: f7 c7 01 00 00 00 test $0x1,%edi
107da2: 75 05 jne 107da9 <rtems_bsp_cmdline_get_param+0x5d>
107da4: 80 f9 20 cmp $0x20,%cl
107da7: 74 1e je 107dc7 <rtems_bsp_cmdline_get_param+0x7b>
break;
value[i++] = *p++;
107da9: 88 0c 33 mov %cl,(%ebx,%esi,1)
107dac: 42 inc %edx
value[i] = '\0';
107dad: c6 04 13 00 movb $0x0,(%ebx,%edx,1)
int i;
int quotes;
const char *p = start;
quotes=0;
for (i=0 ; *p && i<length-1; ) {
107db1: 8a 0c 10 mov (%eax,%edx,1),%cl
107db4: 84 c9 test %cl,%cl
107db6: 74 0f je 107dc7 <rtems_bsp_cmdline_get_param+0x7b>
107db8: 3b 55 e4 cmp -0x1c(%ebp),%edx
107dbb: 73 0a jae 107dc7 <rtems_bsp_cmdline_get_param+0x7b>
107dbd: 89 d6 mov %edx,%esi
if ( *p == '\"' ) {
107dbf: 80 f9 22 cmp $0x22,%cl
107dc2: 75 d8 jne 107d9c <rtems_bsp_cmdline_get_param+0x50>
quotes++;
107dc4: 47 inc %edi
107dc5: eb e2 jmp 107da9 <rtems_bsp_cmdline_get_param+0x5d>
int i;
int quotes;
const char *p = start;
quotes=0;
for (i=0 ; *p && i<length-1; ) {
107dc7: 89 d8 mov %ebx,%eax
107dc9: eb 99 jmp 107d64 <rtems_bsp_cmdline_get_param+0x18>
00107dcc <rtems_bsp_cmdline_get_param_raw>:
extern const char *bsp_boot_cmdline;
const char *rtems_bsp_cmdline_get_param_raw(
const char *name
)
{
107dcc: 55 push %ebp
107dcd: 89 e5 mov %esp,%ebp
107dcf: 83 ec 08 sub $0x8,%esp
107dd2: 8b 45 08 mov 0x8(%ebp),%eax
const char *p;
if ( !name )
107dd5: 85 c0 test %eax,%eax
107dd7: 75 07 jne 107de0 <rtems_bsp_cmdline_get_param_raw+0x14>
return NULL;
if ( !bsp_boot_cmdline )
return NULL;
107dd9: 31 c0 xor %eax,%eax
p = strstr(bsp_boot_cmdline, name);
/* printf( "raw: %p (%s)\n", p, p ); */
return p;
}
107ddb: c9 leave
107ddc: c3 ret
107ddd: 8d 76 00 lea 0x0(%esi),%esi
const char *p;
if ( !name )
return NULL;
if ( !bsp_boot_cmdline )
107de0: 8b 15 b8 85 12 00 mov 0x1285b8,%edx
107de6: 85 d2 test %edx,%edx
107de8: 74 ef je 107dd9 <rtems_bsp_cmdline_get_param_raw+0xd>
return NULL;
p = strstr(bsp_boot_cmdline, name);
107dea: 83 ec 08 sub $0x8,%esp
107ded: 50 push %eax
107dee: 52 push %edx
107def: e8 58 ce 00 00 call 114c4c <strstr>
107df4: 83 c4 10 add $0x10,%esp
/* printf( "raw: %p (%s)\n", p, p ); */
return p;
}
107df7: c9 leave
107df8: c3 ret
0010c14c <rtems_chain_append_with_notification>:
rtems_chain_control *chain,
rtems_chain_node *node,
rtems_id task,
rtems_event_set events
)
{
10c14c: 55 push %ebp
10c14d: 89 e5 mov %esp,%ebp
10c14f: 56 push %esi
10c150: 53 push %ebx
10c151: 8b 5d 10 mov 0x10(%ebp),%ebx
10c154: 8b 75 14 mov 0x14(%ebp),%esi
RTEMS_INLINE_ROUTINE bool rtems_chain_append_with_empty_check(
rtems_chain_control *chain,
rtems_chain_node *node
)
{
return _Chain_Append_with_empty_check( chain, node );
10c157: 83 ec 08 sub $0x8,%esp
10c15a: ff 75 0c pushl 0xc(%ebp)
10c15d: ff 75 08 pushl 0x8(%ebp)
10c160: e8 e3 04 00 00 call 10c648 <_Chain_Append_with_empty_check>
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_append_with_empty_check( chain, node );
if ( was_empty ) {
10c165: 83 c4 10 add $0x10,%esp
10c168: 84 c0 test %al,%al
10c16a: 75 0c jne 10c178 <rtems_chain_append_with_notification+0x2c><== ALWAYS TAKEN
sc = rtems_event_send( task, events );
}
return sc;
}
10c16c: 31 c0 xor %eax,%eax
10c16e: 8d 65 f8 lea -0x8(%ebp),%esp
10c171: 5b pop %ebx
10c172: 5e pop %esi <== NOT EXECUTED
10c173: c9 leave <== NOT EXECUTED
10c174: c3 ret <== NOT EXECUTED
10c175: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_append_with_empty_check( chain, node );
if ( was_empty ) {
sc = rtems_event_send( task, events );
10c178: 89 75 0c mov %esi,0xc(%ebp)
10c17b: 89 5d 08 mov %ebx,0x8(%ebp)
}
return sc;
}
10c17e: 8d 65 f8 lea -0x8(%ebp),%esp
10c181: 5b pop %ebx
10c182: 5e pop %esi
10c183: c9 leave
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_append_with_empty_check( chain, node );
if ( was_empty ) {
sc = rtems_event_send( task, events );
10c184: e9 a3 f5 ff ff jmp 10b72c <rtems_event_send>
0010c18c <rtems_chain_get_with_notification>:
rtems_chain_control *chain,
rtems_id task,
rtems_event_set events,
rtems_chain_node **node
)
{
10c18c: 55 push %ebp
10c18d: 89 e5 mov %esp,%ebp
10c18f: 56 push %esi
10c190: 53 push %ebx
10c191: 8b 5d 0c mov 0xc(%ebp),%ebx
10c194: 8b 75 10 mov 0x10(%ebp),%esi
RTEMS_INLINE_ROUTINE bool rtems_chain_get_with_empty_check(
rtems_chain_control *chain,
rtems_chain_node **node
)
{
return _Chain_Get_with_empty_check( chain, node );
10c197: 83 ec 08 sub $0x8,%esp
10c19a: ff 75 14 pushl 0x14(%ebp)
10c19d: ff 75 08 pushl 0x8(%ebp)
10c1a0: e8 0b 05 00 00 call 10c6b0 <_Chain_Get_with_empty_check>
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool is_empty = rtems_chain_get_with_empty_check( chain, node );
if ( is_empty ) {
10c1a5: 83 c4 10 add $0x10,%esp
10c1a8: 84 c0 test %al,%al
10c1aa: 75 0c jne 10c1b8 <rtems_chain_get_with_notification+0x2c>
sc = rtems_event_send( task, events );
}
return sc;
}
10c1ac: 31 c0 xor %eax,%eax
10c1ae: 8d 65 f8 lea -0x8(%ebp),%esp
10c1b1: 5b pop %ebx
10c1b2: 5e pop %esi
10c1b3: c9 leave
10c1b4: c3 ret
10c1b5: 8d 76 00 lea 0x0(%esi),%esi
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool is_empty = rtems_chain_get_with_empty_check( chain, node );
if ( is_empty ) {
sc = rtems_event_send( task, events );
10c1b8: 89 75 0c mov %esi,0xc(%ebp)
10c1bb: 89 5d 08 mov %ebx,0x8(%ebp)
}
return sc;
}
10c1be: 8d 65 f8 lea -0x8(%ebp),%esp
10c1c1: 5b pop %ebx
10c1c2: 5e pop %esi
10c1c3: c9 leave
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool is_empty = rtems_chain_get_with_empty_check( chain, node );
if ( is_empty ) {
sc = rtems_event_send( task, events );
10c1c4: e9 63 f5 ff ff jmp 10b72c <rtems_event_send>
0010c1cc <rtems_chain_get_with_wait>:
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
10c1cc: 55 push %ebp
10c1cd: 89 e5 mov %esp,%ebp
10c1cf: 57 push %edi
10c1d0: 56 push %esi
10c1d1: 53 push %ebx
10c1d2: 83 ec 1c sub $0x1c,%esp
10c1d5: 8b 75 08 mov 0x8(%ebp),%esi
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
) {
rtems_event_set out;
sc = rtems_event_receive(
10c1d8: 8d 7d e4 lea -0x1c(%ebp),%edi
10c1db: 90 nop
*/
RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get(
rtems_chain_control *the_chain
)
{
return _Chain_Get( the_chain );
10c1dc: 83 ec 0c sub $0xc,%esp
10c1df: 56 push %esi
10c1e0: e8 07 05 00 00 call 10c6ec <_Chain_Get>
10c1e5: 89 c3 mov %eax,%ebx
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
10c1e7: 83 c4 10 add $0x10,%esp
10c1ea: 85 c0 test %eax,%eax
10c1ec: 75 22 jne 10c210 <rtems_chain_get_with_wait+0x44>
) {
rtems_event_set out;
sc = rtems_event_receive(
10c1ee: 57 push %edi
10c1ef: ff 75 10 pushl 0x10(%ebp)
10c1f2: 6a 00 push $0x0
10c1f4: ff 75 0c pushl 0xc(%ebp)
10c1f7: e8 a8 f3 ff ff call 10b5a4 <rtems_event_receive>
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
10c1fc: 83 c4 10 add $0x10,%esp
10c1ff: 85 c0 test %eax,%eax
10c201: 74 d9 je 10c1dc <rtems_chain_get_with_wait+0x10><== NEVER TAKEN
timeout,
&out
);
}
*node_ptr = node;
10c203: 8b 55 14 mov 0x14(%ebp),%edx
10c206: 89 1a mov %ebx,(%edx)
return sc;
}
10c208: 8d 65 f4 lea -0xc(%ebp),%esp
10c20b: 5b pop %ebx
10c20c: 5e pop %esi
10c20d: 5f pop %edi
10c20e: c9 leave
10c20f: c3 ret
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
10c210: 31 c0 xor %eax,%eax
timeout,
&out
);
}
*node_ptr = node;
10c212: 8b 55 14 mov 0x14(%ebp),%edx
10c215: 89 1a mov %ebx,(%edx)
return sc;
}
10c217: 8d 65 f4 lea -0xc(%ebp),%esp
10c21a: 5b pop %ebx
10c21b: 5e pop %esi
10c21c: 5f pop %edi
10c21d: c9 leave
10c21e: c3 ret
0010c220 <rtems_chain_prepend_with_notification>:
rtems_chain_control *chain,
rtems_chain_node *node,
rtems_id task,
rtems_event_set events
)
{
10c220: 55 push %ebp
10c221: 89 e5 mov %esp,%ebp
10c223: 56 push %esi
10c224: 53 push %ebx
10c225: 8b 5d 10 mov 0x10(%ebp),%ebx
10c228: 8b 75 14 mov 0x14(%ebp),%esi
RTEMS_INLINE_ROUTINE bool rtems_chain_prepend_with_empty_check(
rtems_chain_control *chain,
rtems_chain_node *node
)
{
return _Chain_Prepend_with_empty_check( chain, node );
10c22b: 83 ec 08 sub $0x8,%esp
10c22e: ff 75 0c pushl 0xc(%ebp)
10c231: ff 75 08 pushl 0x8(%ebp)
10c234: e8 f7 04 00 00 call 10c730 <_Chain_Prepend_with_empty_check>
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_prepend_with_empty_check( chain, node );
if (was_empty) {
10c239: 83 c4 10 add $0x10,%esp
10c23c: 84 c0 test %al,%al
10c23e: 75 0c jne 10c24c <rtems_chain_prepend_with_notification+0x2c><== ALWAYS TAKEN
sc = rtems_event_send( task, events );
}
return sc;
}
10c240: 31 c0 xor %eax,%eax
10c242: 8d 65 f8 lea -0x8(%ebp),%esp
10c245: 5b pop %ebx
10c246: 5e pop %esi <== NOT EXECUTED
10c247: c9 leave <== NOT EXECUTED
10c248: c3 ret <== NOT EXECUTED
10c249: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_prepend_with_empty_check( chain, node );
if (was_empty) {
sc = rtems_event_send( task, events );
10c24c: 89 75 0c mov %esi,0xc(%ebp)
10c24f: 89 5d 08 mov %ebx,0x8(%ebp)
}
return sc;
}
10c252: 8d 65 f8 lea -0x8(%ebp),%esp
10c255: 5b pop %ebx
10c256: 5e pop %esi
10c257: c9 leave
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_prepend_with_empty_check( chain, node );
if (was_empty) {
sc = rtems_event_send( task, events );
10c258: e9 cf f4 ff ff jmp 10b72c <rtems_event_send>
00115a60 <rtems_clock_get>:
rtems_status_code rtems_clock_get(
rtems_clock_get_options option,
void *time_buffer
)
{
115a60: 55 push %ebp
115a61: 89 e5 mov %esp,%ebp
115a63: 53 push %ebx
115a64: 83 ec 04 sub $0x4,%esp
115a67: 8b 45 08 mov 0x8(%ebp),%eax
115a6a: 8b 5d 0c mov 0xc(%ebp),%ebx
if ( !time_buffer )
115a6d: 85 db test %ebx,%ebx
115a6f: 74 3b je 115aac <rtems_clock_get+0x4c>
return RTEMS_INVALID_ADDRESS;
if ( option == RTEMS_CLOCK_GET_TOD )
115a71: 85 c0 test %eax,%eax
115a73: 74 2b je 115aa0 <rtems_clock_get+0x40>
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
if ( option == RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH )
115a75: 83 f8 01 cmp $0x1,%eax
115a78: 74 3e je 115ab8 <rtems_clock_get+0x58>
return rtems_clock_get_seconds_since_epoch((rtems_interval *)time_buffer);
if ( option == RTEMS_CLOCK_GET_TICKS_SINCE_BOOT ) {
115a7a: 83 f8 02 cmp $0x2,%eax
115a7d: 74 45 je 115ac4 <rtems_clock_get+0x64>
*interval = rtems_clock_get_ticks_since_boot();
return RTEMS_SUCCESSFUL;
}
if ( option == RTEMS_CLOCK_GET_TICKS_PER_SECOND ) {
115a7f: 83 f8 03 cmp $0x3,%eax
115a82: 74 4c je 115ad0 <rtems_clock_get+0x70>
*interval = rtems_clock_get_ticks_per_second();
return RTEMS_SUCCESSFUL;
}
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
115a84: 83 f8 04 cmp $0x4,%eax
115a87: 74 0b je 115a94 <rtems_clock_get+0x34>
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
return RTEMS_INVALID_NUMBER;
115a89: b8 0a 00 00 00 mov $0xa,%eax
}
115a8e: 5a pop %edx
115a8f: 5b pop %ebx
115a90: c9 leave
115a91: c3 ret
115a92: 66 90 xchg %ax,%ax
*interval = rtems_clock_get_ticks_per_second();
return RTEMS_SUCCESSFUL;
}
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
115a94: 89 5d 08 mov %ebx,0x8(%ebp)
return RTEMS_INVALID_NUMBER;
}
115a97: 59 pop %ecx
115a98: 5b pop %ebx
115a99: c9 leave
*interval = rtems_clock_get_ticks_per_second();
return RTEMS_SUCCESSFUL;
}
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
115a9a: e9 41 01 00 00 jmp 115be0 <rtems_clock_get_tod_timeval>
115a9f: 90 nop
{
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
if ( option == RTEMS_CLOCK_GET_TOD )
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
115aa0: 89 5d 08 mov %ebx,0x8(%ebp)
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
return RTEMS_INVALID_NUMBER;
}
115aa3: 58 pop %eax
115aa4: 5b pop %ebx
115aa5: c9 leave
{
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
if ( option == RTEMS_CLOCK_GET_TOD )
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
115aa6: e9 81 00 00 00 jmp 115b2c <rtems_clock_get_tod>
115aab: 90 nop
rtems_clock_get_options option,
void *time_buffer
)
{
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
115aac: b8 09 00 00 00 mov $0x9,%eax
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
return RTEMS_INVALID_NUMBER;
}
115ab1: 5a pop %edx
115ab2: 5b pop %ebx
115ab3: c9 leave
115ab4: c3 ret
115ab5: 8d 76 00 lea 0x0(%esi),%esi
if ( option == RTEMS_CLOCK_GET_TOD )
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
if ( option == RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH )
return rtems_clock_get_seconds_since_epoch((rtems_interval *)time_buffer);
115ab8: 89 5d 08 mov %ebx,0x8(%ebp)
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
return RTEMS_INVALID_NUMBER;
}
115abb: 5b pop %ebx
115abc: 5b pop %ebx
115abd: c9 leave
if ( option == RTEMS_CLOCK_GET_TOD )
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
if ( option == RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH )
return rtems_clock_get_seconds_since_epoch((rtems_interval *)time_buffer);
115abe: e9 19 00 00 00 jmp 115adc <rtems_clock_get_seconds_since_epoch>
115ac3: 90 nop
if ( option == RTEMS_CLOCK_GET_TICKS_SINCE_BOOT ) {
rtems_interval *interval = (rtems_interval *)time_buffer;
*interval = rtems_clock_get_ticks_since_boot();
115ac4: e8 57 00 00 00 call 115b20 <rtems_clock_get_ticks_since_boot>
115ac9: 89 03 mov %eax,(%ebx)
return RTEMS_SUCCESSFUL;
115acb: 31 c0 xor %eax,%eax
115acd: eb bf jmp 115a8e <rtems_clock_get+0x2e>
115acf: 90 nop
}
if ( option == RTEMS_CLOCK_GET_TICKS_PER_SECOND ) {
rtems_interval *interval = (rtems_interval *)time_buffer;
*interval = rtems_clock_get_ticks_per_second();
115ad0: e8 37 00 00 00 call 115b0c <rtems_clock_get_ticks_per_second>
115ad5: 89 03 mov %eax,(%ebx)
return RTEMS_SUCCESSFUL;
115ad7: 31 c0 xor %eax,%eax
115ad9: eb b3 jmp 115a8e <rtems_clock_get+0x2e>
00115be0 <rtems_clock_get_tod_timeval>:
#include <rtems/score/watchdog.h>
rtems_status_code rtems_clock_get_tod_timeval(
struct timeval *time
)
{
115be0: 55 push %ebp
115be1: 89 e5 mov %esp,%ebp
115be3: 56 push %esi
115be4: 53 push %ebx
115be5: 83 ec 10 sub $0x10,%esp
115be8: 8b 5d 08 mov 0x8(%ebp),%ebx
if ( !time )
115beb: 85 db test %ebx,%ebx
115bed: 74 51 je 115c40 <rtems_clock_get_tod_timeval+0x60>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Is_set )
115bef: 80 3d e4 2a 14 00 00 cmpb $0x0,0x142ae4
115bf6: 75 0c jne 115c04 <rtems_clock_get_tod_timeval+0x24>
return RTEMS_NOT_DEFINED;
115bf8: b8 0b 00 00 00 mov $0xb,%eax
_TOD_Get_timeval( time );
return RTEMS_SUCCESSFUL;
}
115bfd: 8d 65 f8 lea -0x8(%ebp),%esp
115c00: 5b pop %ebx
115c01: 5e pop %esi
115c02: c9 leave
115c03: c3 ret
{
ISR_Level level;
struct timespec now;
suseconds_t useconds;
_ISR_Disable(level);
115c04: 9c pushf
115c05: fa cli
115c06: 5e pop %esi
_TOD_Get( &now );
115c07: 83 ec 0c sub $0xc,%esp
115c0a: 8d 45 f0 lea -0x10(%ebp),%eax
115c0d: 50 push %eax
115c0e: e8 21 44 00 00 call 11a034 <_TOD_Get>
_ISR_Enable(level);
115c13: 56 push %esi
115c14: 9d popf
useconds = (suseconds_t)now.tv_nsec;
115c15: 8b 4d f4 mov -0xc(%ebp),%ecx
useconds /= (suseconds_t)TOD_NANOSECONDS_PER_MICROSECOND;
time->tv_sec = now.tv_sec;
115c18: 8b 45 f0 mov -0x10(%ebp),%eax
115c1b: 89 03 mov %eax,(%ebx)
_ISR_Disable(level);
_TOD_Get( &now );
_ISR_Enable(level);
useconds = (suseconds_t)now.tv_nsec;
useconds /= (suseconds_t)TOD_NANOSECONDS_PER_MICROSECOND;
115c1d: b8 d3 4d 62 10 mov $0x10624dd3,%eax
115c22: f7 e9 imul %ecx
115c24: 89 d0 mov %edx,%eax
115c26: c1 f8 06 sar $0x6,%eax
115c29: c1 f9 1f sar $0x1f,%ecx
115c2c: 29 c8 sub %ecx,%eax
115c2e: 89 43 04 mov %eax,0x4(%ebx)
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
_TOD_Get_timeval( time );
return RTEMS_SUCCESSFUL;
115c31: 83 c4 10 add $0x10,%esp
115c34: 31 c0 xor %eax,%eax
}
115c36: 8d 65 f8 lea -0x8(%ebp),%esp
115c39: 5b pop %ebx
115c3a: 5e pop %esi
115c3b: c9 leave
115c3c: c3 ret
115c3d: 8d 76 00 lea 0x0(%esi),%esi
rtems_status_code rtems_clock_get_tod_timeval(
struct timeval *time
)
{
if ( !time )
return RTEMS_INVALID_ADDRESS;
115c40: b8 09 00 00 00 mov $0x9,%eax
115c45: eb b6 jmp 115bfd <rtems_clock_get_tod_timeval+0x1d>
0010b1d4 <rtems_clock_get_uptime>:
* error code - if unsuccessful
*/
rtems_status_code rtems_clock_get_uptime(
struct timespec *uptime
)
{
10b1d4: 55 push %ebp
10b1d5: 89 e5 mov %esp,%ebp
10b1d7: 83 ec 08 sub $0x8,%esp
10b1da: 8b 45 08 mov 0x8(%ebp),%eax
if ( !uptime )
10b1dd: 85 c0 test %eax,%eax
10b1df: 74 13 je 10b1f4 <rtems_clock_get_uptime+0x20>
return RTEMS_INVALID_ADDRESS;
_TOD_Get_uptime_as_timespec( uptime );
10b1e1: 83 ec 0c sub $0xc,%esp
10b1e4: 50 push %eax
10b1e5: e8 7a 16 00 00 call 10c864 <_TOD_Get_uptime_as_timespec>
return RTEMS_SUCCESSFUL;
10b1ea: 83 c4 10 add $0x10,%esp
10b1ed: 31 c0 xor %eax,%eax
}
10b1ef: c9 leave
10b1f0: c3 ret
10b1f1: 8d 76 00 lea 0x0(%esi),%esi
rtems_status_code rtems_clock_get_uptime(
struct timespec *uptime
)
{
if ( !uptime )
return RTEMS_INVALID_ADDRESS;
10b1f4: b8 09 00 00 00 mov $0x9,%eax
_TOD_Get_uptime_as_timespec( uptime );
return RTEMS_SUCCESSFUL;
}
10b1f9: c9 leave
10b1fa: c3 ret
0010c124 <rtems_clock_set>:
*/
rtems_status_code rtems_clock_set(
rtems_time_of_day *time_buffer
)
{
10c124: 55 push %ebp
10c125: 89 e5 mov %esp,%ebp
10c127: 53 push %ebx
10c128: 83 ec 14 sub $0x14,%esp
10c12b: 8b 5d 08 mov 0x8(%ebp),%ebx
struct timespec newtime;
if ( !time_buffer )
10c12e: 85 db test %ebx,%ebx
10c130: 74 66 je 10c198 <rtems_clock_set+0x74>
return RTEMS_INVALID_ADDRESS;
if ( _TOD_Validate( time_buffer ) ) {
10c132: 83 ec 0c sub $0xc,%esp
10c135: 53 push %ebx
10c136: e8 39 01 00 00 call 10c274 <_TOD_Validate>
10c13b: 83 c4 10 add $0x10,%esp
10c13e: 84 c0 test %al,%al
10c140: 75 0a jne 10c14c <rtems_clock_set+0x28>
_Thread_Disable_dispatch();
_TOD_Set( &newtime );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
return RTEMS_INVALID_CLOCK;
10c142: b8 14 00 00 00 mov $0x14,%eax
}
10c147: 8b 5d fc mov -0x4(%ebp),%ebx
10c14a: c9 leave
10c14b: c3 ret
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
if ( _TOD_Validate( time_buffer ) ) {
newtime.tv_sec = _TOD_To_seconds( time_buffer );
10c14c: 83 ec 0c sub $0xc,%esp
10c14f: 53 push %ebx
10c150: e8 93 00 00 00 call 10c1e8 <_TOD_To_seconds>
10c155: 89 45 f0 mov %eax,-0x10(%ebp)
newtime.tv_nsec = time_buffer->ticks *
10c158: 8b 43 18 mov 0x18(%ebx),%eax
10c15b: 0f af 05 cc 72 12 00 imul 0x1272cc,%eax
10c162: 8d 04 80 lea (%eax,%eax,4),%eax
10c165: 8d 04 80 lea (%eax,%eax,4),%eax
10c168: 8d 04 80 lea (%eax,%eax,4),%eax
10c16b: c1 e0 03 shl $0x3,%eax
10c16e: 89 45 f4 mov %eax,-0xc(%ebp)
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10c171: a1 50 34 13 00 mov 0x133450,%eax
10c176: 40 inc %eax
10c177: a3 50 34 13 00 mov %eax,0x133450
rtems_configuration_get_nanoseconds_per_tick();
_Thread_Disable_dispatch();
_TOD_Set( &newtime );
10c17c: 8d 45 f0 lea -0x10(%ebp),%eax
10c17f: 89 04 24 mov %eax,(%esp)
10c182: e8 59 19 00 00 call 10dae0 <_TOD_Set>
_Thread_Enable_dispatch();
10c187: e8 e8 2e 00 00 call 10f074 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c18c: 83 c4 10 add $0x10,%esp
10c18f: 31 c0 xor %eax,%eax
}
return RTEMS_INVALID_CLOCK;
}
10c191: 8b 5d fc mov -0x4(%ebp),%ebx
10c194: c9 leave
10c195: c3 ret
10c196: 66 90 xchg %ax,%ax
)
{
struct timespec newtime;
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
10c198: b8 09 00 00 00 mov $0x9,%eax
_TOD_Set( &newtime );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
return RTEMS_INVALID_CLOCK;
}
10c19d: 8b 5d fc mov -0x4(%ebp),%ebx
10c1a0: c9 leave
10c1a1: c3 ret
0010afd0 <rtems_clock_tick>:
*
* NOTE: This routine only works for leap-years through 2099.
*/
rtems_status_code rtems_clock_tick( void )
{
10afd0: 55 push %ebp
10afd1: 89 e5 mov %esp,%ebp
10afd3: 83 ec 08 sub $0x8,%esp
_TOD_Tickle_ticks();
10afd6: e8 3d 15 00 00 call 10c518 <_TOD_Tickle_ticks>
*/
RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_ticks( void )
{
_Watchdog_Tickle( &_Watchdog_Ticks_chain );
10afdb: 83 ec 0c sub $0xc,%esp
10afde: 68 3c 7f 12 00 push $0x127f3c
10afe3: e8 bc 38 00 00 call 10e8a4 <_Watchdog_Tickle>
_Watchdog_Tickle_ticks();
_Thread_Tickle_timeslice();
10afe8: e8 77 33 00 00 call 10e364 <_Thread_Tickle_timeslice>
* otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_context_switch_necessary( void )
{
return ( _Thread_Dispatch_necessary );
10afed: a0 24 84 12 00 mov 0x128424,%al
if ( _Thread_Is_context_switch_necessary() &&
10aff2: 83 c4 10 add $0x10,%esp
10aff5: 84 c0 test %al,%al
10aff7: 74 09 je 10b002 <rtems_clock_tick+0x32>
* otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_dispatching_enabled( void )
{
return ( _Thread_Dispatch_disable_level == 0 );
10aff9: a1 30 7e 12 00 mov 0x127e30,%eax
10affe: 85 c0 test %eax,%eax
10b000: 74 06 je 10b008 <rtems_clock_tick+0x38>
_Thread_Is_dispatching_enabled() )
_Thread_Dispatch();
return RTEMS_SUCCESSFUL;
}
10b002: 31 c0 xor %eax,%eax
10b004: c9 leave
10b005: c3 ret
10b006: 66 90 xchg %ax,%ax
_Thread_Tickle_timeslice();
if ( _Thread_Is_context_switch_necessary() &&
_Thread_Is_dispatching_enabled() )
_Thread_Dispatch();
10b008: e8 6f 27 00 00 call 10d77c <_Thread_Dispatch>
return RTEMS_SUCCESSFUL;
}
10b00d: 31 c0 xor %eax,%eax
10b00f: c9 leave
10b010: c3 ret
00108400 <rtems_cpu_usage_report_with_plugin>:
void rtems_cpu_usage_report_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
108400: 55 push %ebp
108401: 89 e5 mov %esp,%ebp
108403: 57 push %edi
108404: 56 push %esi
108405: 53 push %ebx
108406: 83 ec 6c sub $0x6c,%esp
108409: 8b 7d 08 mov 0x8(%ebp),%edi
Timestamp_Control uptime, total, ran, last_context_switch;
#else
uint32_t total_units = 0;
#endif
if ( !print )
10840c: 8b 45 0c mov 0xc(%ebp),%eax
10840f: 85 c0 test %eax,%eax
108411: 0f 84 6f 01 00 00 je 108586 <rtems_cpu_usage_report_with_plugin+0x186><== NEVER TAKEN
* When not using nanosecond CPU usage resolution, we have to count
* the number of "ticks" we gave credit for to give the user a rough
* guideline as to what each number means proportionally.
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
last_context_switch = _Thread_Time_of_last_context_switch;
108417: a1 48 35 13 00 mov 0x133548,%eax
10841c: 8b 15 4c 35 13 00 mov 0x13354c,%edx
108422: 89 45 c0 mov %eax,-0x40(%ebp)
108425: 89 55 c4 mov %edx,-0x3c(%ebp)
_TOD_Get_uptime( &uptime );
108428: 83 ec 0c sub $0xc,%esp
10842b: 8d 45 d8 lea -0x28(%ebp),%eax
10842e: 50 push %eax
10842f: e8 24 56 00 00 call 10da58 <_TOD_Get_uptime>
_Timestamp_Subtract( &CPU_usage_Uptime_at_last_reset, &uptime, &total );
108434: 83 c4 0c add $0xc,%esp
108437: 8d 55 d0 lea -0x30(%ebp),%edx
10843a: 52 push %edx
10843b: 8d 4d d8 lea -0x28(%ebp),%ecx
10843e: 51 push %ecx
10843f: 68 e0 3a 13 00 push $0x133ae0
108444: e8 93 78 00 00 call 10fcdc <_Timespec_Subtract>
}
}
}
#endif
(*print)(
108449: 5b pop %ebx
10844a: 5e pop %esi
10844b: 68 10 3b 12 00 push $0x123b10
108450: 57 push %edi
108451: ff 55 0c call *0xc(%ebp)
108454: 83 c4 10 add $0x10,%esp
" ID | NAME | TICKS | PERCENT\n"
#endif
"------------+----------------------------------------+---------------+---------\n"
);
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
108457: c7 45 a4 01 00 00 00 movl $0x1,-0x5c(%ebp)
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
10845e: 8b 5d a4 mov -0x5c(%ebp),%ebx
108461: 8b 04 9d 28 34 13 00 mov 0x133428(,%ebx,4),%eax
108468: 8b 70 04 mov 0x4(%eax),%esi
if ( information ) {
10846b: 85 f6 test %esi,%esi
10846d: 0f 84 e9 00 00 00 je 10855c <rtems_cpu_usage_report_with_plugin+0x15c><== NEVER TAKEN
for ( i=1 ; i <= information->maximum ; i++ ) {
108473: 66 83 7e 10 00 cmpw $0x0,0x10(%esi)
108478: 0f 84 de 00 00 00 je 10855c <rtems_cpu_usage_report_with_plugin+0x15c>
10847e: bb 01 00 00 00 mov $0x1,%ebx
108483: 89 5d 94 mov %ebx,-0x6c(%ebp)
108486: eb 4a jmp 1084d2 <rtems_cpu_usage_report_with_plugin+0xd2>
108488: 8d 55 c8 lea -0x38(%ebp),%edx
if ( _Thread_Executing->Object.id == the_thread->Object.id ) {
Timestamp_Control used;
_Timestamp_Subtract( &last_context_switch, &uptime, &used );
_Timestamp_Add_to( &ran, &used );
};
_Timestamp_Divide( &ran, &total, &ival, &fval );
10848b: 8d 45 e0 lea -0x20(%ebp),%eax
10848e: 50 push %eax
10848f: 8d 4d e4 lea -0x1c(%ebp),%ecx
108492: 51 push %ecx
108493: 8d 5d d0 lea -0x30(%ebp),%ebx
108496: 53 push %ebx
108497: 52 push %edx
108498: e8 7b 77 00 00 call 10fc18 <_Timespec_Divide>
/*
* Print the information
*/
(*print)( context,
10849d: 58 pop %eax
10849e: 5a pop %edx
10849f: ff 75 e0 pushl -0x20(%ebp)
1084a2: ff 75 e4 pushl -0x1c(%ebp)
1084a5: ba d3 4d 62 10 mov $0x10624dd3,%edx
1084aa: 8b 45 cc mov -0x34(%ebp),%eax
1084ad: f7 e2 mul %edx
1084af: c1 ea 06 shr $0x6,%edx
1084b2: 52 push %edx
1084b3: ff 75 c8 pushl -0x38(%ebp)
1084b6: 68 83 3d 12 00 push $0x123d83
1084bb: 57 push %edi
1084bc: ff 55 0c call *0xc(%ebp)
1084bf: 83 c4 20 add $0x20,%esp
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
if ( information ) {
for ( i=1 ; i <= information->maximum ; i++ ) {
1084c2: ff 45 94 incl -0x6c(%ebp)
1084c5: 0f b7 46 10 movzwl 0x10(%esi),%eax
1084c9: 3b 45 94 cmp -0x6c(%ebp),%eax
1084cc: 0f 82 8a 00 00 00 jb 10855c <rtems_cpu_usage_report_with_plugin+0x15c>
the_thread = (Thread_Control *)information->local_table[ i ];
1084d2: 8b 46 1c mov 0x1c(%esi),%eax
1084d5: 8b 4d 94 mov -0x6c(%ebp),%ecx
1084d8: 8b 14 88 mov (%eax,%ecx,4),%edx
if ( !the_thread )
1084db: 85 d2 test %edx,%edx
1084dd: 74 e3 je 1084c2 <rtems_cpu_usage_report_with_plugin+0xc2><== NEVER TAKEN
continue;
rtems_object_get_name( the_thread->Object.id, sizeof(name), name );
1084df: 51 push %ecx
1084e0: 8d 5d ab lea -0x55(%ebp),%ebx
1084e3: 53 push %ebx
1084e4: 6a 0d push $0xd
1084e6: ff 72 08 pushl 0x8(%edx)
1084e9: 89 55 a0 mov %edx,-0x60(%ebp)
1084ec: e8 17 42 00 00 call 10c708 <rtems_object_get_name>
(*print)(
1084f1: 53 push %ebx
1084f2: 8b 55 a0 mov -0x60(%ebp),%edx
1084f5: ff 72 08 pushl 0x8(%edx)
1084f8: 68 70 3d 12 00 push $0x123d70
1084fd: 57 push %edi
1084fe: ff 55 0c call *0xc(%ebp)
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
/*
* If this is the currently executing thread, account for time
* since the last context switch.
*/
ran = the_thread->cpu_time_used;
108501: 8b 55 a0 mov -0x60(%ebp),%edx
108504: 8b 8a 84 00 00 00 mov 0x84(%edx),%ecx
10850a: 8b 9a 88 00 00 00 mov 0x88(%edx),%ebx
108510: 89 4d c8 mov %ecx,-0x38(%ebp)
108513: 89 5d cc mov %ebx,-0x34(%ebp)
if ( _Thread_Executing->Object.id == the_thread->Object.id ) {
108516: 83 c4 20 add $0x20,%esp
108519: a1 78 3a 13 00 mov 0x133a78,%eax
10851e: 8b 5a 08 mov 0x8(%edx),%ebx
108521: 39 58 08 cmp %ebx,0x8(%eax)
108524: 0f 85 5e ff ff ff jne 108488 <rtems_cpu_usage_report_with_plugin+0x88>
Timestamp_Control used;
_Timestamp_Subtract( &last_context_switch, &uptime, &used );
10852a: 50 push %eax
10852b: 8d 45 b8 lea -0x48(%ebp),%eax
10852e: 50 push %eax
10852f: 8d 55 d8 lea -0x28(%ebp),%edx
108532: 52 push %edx
108533: 8d 4d c0 lea -0x40(%ebp),%ecx
108536: 51 push %ecx
108537: e8 a0 77 00 00 call 10fcdc <_Timespec_Subtract>
_Timestamp_Add_to( &ran, &used );
10853c: 59 pop %ecx
10853d: 5b pop %ebx
10853e: 8d 5d b8 lea -0x48(%ebp),%ebx
108541: 53 push %ebx
108542: 8d 55 c8 lea -0x38(%ebp),%edx
108545: 52 push %edx
108546: 89 55 a0 mov %edx,-0x60(%ebp)
108549: e8 8e 76 00 00 call 10fbdc <_Timespec_Add_to>
10854e: 83 c4 10 add $0x10,%esp
108551: 8b 55 a0 mov -0x60(%ebp),%edx
108554: e9 32 ff ff ff jmp 10848b <rtems_cpu_usage_report_with_plugin+0x8b>
108559: 8d 76 00 lea 0x0(%esi),%esi
" ID | NAME | TICKS | PERCENT\n"
#endif
"------------+----------------------------------------+---------------+---------\n"
);
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
10855c: ff 45 a4 incl -0x5c(%ebp)
10855f: 83 7d a4 04 cmpl $0x4,-0x5c(%ebp)
108563: 0f 85 f5 fe ff ff jne 10845e <rtems_cpu_usage_report_with_plugin+0x5e>
}
}
}
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)(
108569: ba d3 4d 62 10 mov $0x10624dd3,%edx
10856e: 8b 45 d4 mov -0x2c(%ebp),%eax
108571: f7 e2 mul %edx
108573: c1 ea 06 shr $0x6,%edx
108576: 52 push %edx
108577: ff 75 d0 pushl -0x30(%ebp)
10857a: 68 84 3c 12 00 push $0x123c84
10857f: 57 push %edi
108580: ff 55 0c call *0xc(%ebp)
108583: 83 c4 10 add $0x10,%esp
"-------------------------------------------------------------------------------\n",
_Watchdog_Ticks_since_boot - CPU_usage_Ticks_at_last_reset,
total_units
);
#endif
}
108586: 8d 65 f4 lea -0xc(%ebp),%esp
108589: 5b pop %ebx
10858a: 5e pop %esi
10858b: 5f pop %edi
10858c: c9 leave
10858d: c3 ret
00113288 <rtems_deviceio_errno>:
[RTEMS_IO_ERROR] = EIO,
[RTEMS_PROXY_BLOCKING] = EIO
};
int rtems_deviceio_errno(rtems_status_code sc)
{
113288: 55 push %ebp
113289: 89 e5 mov %esp,%ebp
11328b: 53 push %ebx
11328c: 83 ec 04 sub $0x4,%esp
11328f: 8b 45 08 mov 0x8(%ebp),%eax
if (sc == RTEMS_SUCCESSFUL) {
113292: 85 c0 test %eax,%eax
113294: 75 06 jne 11329c <rtems_deviceio_errno+0x14>
return 0;
113296: 31 c0 xor %eax,%eax
errno = eno;
return -1;
}
}
113298: 5a pop %edx
113299: 5b pop %ebx
11329a: c9 leave
11329b: c3 ret
if (sc == RTEMS_SUCCESSFUL) {
return 0;
} else {
int eno = EINVAL;
if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) {
11329c: 83 f8 1c cmp $0x1c,%eax
11329f: 77 17 ja 1132b8 <rtems_deviceio_errno+0x30><== NEVER TAKEN
eno = status_code_to_errno [sc];
1132a1: 8b 1c 85 80 1c 12 00 mov 0x121c80(,%eax,4),%ebx
}
errno = eno;
1132a8: e8 67 00 00 00 call 113314 <__errno>
1132ad: 89 18 mov %ebx,(%eax)
return -1;
1132af: b8 ff ff ff ff mov $0xffffffff,%eax
1132b4: eb e2 jmp 113298 <rtems_deviceio_errno+0x10>
1132b6: 66 90 xchg %ax,%ax
int rtems_deviceio_errno(rtems_status_code sc)
{
if (sc == RTEMS_SUCCESSFUL) {
return 0;
} else {
int eno = EINVAL;
1132b8: bb 16 00 00 00 mov $0x16,%ebx <== NOT EXECUTED
1132bd: eb e9 jmp 1132a8 <rtems_deviceio_errno+0x20><== NOT EXECUTED
0010b19c <rtems_event_send>:
rtems_status_code rtems_event_send(
rtems_id id,
rtems_event_set event_in
)
{
10b19c: 55 push %ebp
10b19d: 89 e5 mov %esp,%ebp
10b19f: 53 push %ebx
10b1a0: 83 ec 1c sub $0x1c,%esp
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
the_thread = _Thread_Get( id, &location );
10b1a3: 8d 45 f4 lea -0xc(%ebp),%eax
10b1a6: 50 push %eax
10b1a7: ff 75 08 pushl 0x8(%ebp)
10b1aa: e8 69 27 00 00 call 10d918 <_Thread_Get>
switch ( location ) {
10b1af: 83 c4 10 add $0x10,%esp
10b1b2: 8b 55 f4 mov -0xc(%ebp),%edx
10b1b5: 85 d2 test %edx,%edx
10b1b7: 75 2b jne 10b1e4 <rtems_event_send+0x48>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
10b1b9: 8b 90 e8 00 00 00 mov 0xe8(%eax),%edx
rtems_event_set *the_event_set
)
{
ISR_Level level;
_ISR_Disable( level );
10b1bf: 9c pushf
10b1c0: fa cli
10b1c1: 59 pop %ecx
*the_event_set |= the_new_events;
10b1c2: 8b 5d 0c mov 0xc(%ebp),%ebx
10b1c5: 09 1a or %ebx,(%edx)
_ISR_Enable( level );
10b1c7: 51 push %ecx
10b1c8: 9d popf
_Event_sets_Post( event_in, &api->pending_events );
_Event_Surrender( the_thread );
10b1c9: 83 ec 0c sub $0xc,%esp
10b1cc: 50 push %eax
10b1cd: e8 1e 00 00 00 call 10b1f0 <_Event_Surrender>
_Thread_Enable_dispatch();
10b1d2: e8 1d 27 00 00 call 10d8f4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10b1d7: 83 c4 10 add $0x10,%esp
10b1da: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10b1dc: 8b 5d fc mov -0x4(%ebp),%ebx
10b1df: c9 leave
10b1e0: c3 ret
10b1e1: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b1e4: b8 04 00 00 00 mov $0x4,%eax
}
10b1e9: 8b 5d fc mov -0x4(%ebp),%ebx
10b1ec: c9 leave
10b1ed: c3 ret
0010d00c <rtems_extension_delete>:
#include <rtems/extension.h>
rtems_status_code rtems_extension_delete(
rtems_id id
)
{
10d00c: 55 push %ebp
10d00d: 89 e5 mov %esp,%ebp
10d00f: 53 push %ebx
10d010: 83 ec 18 sub $0x18,%esp
Extension_Control *the_extension;
Objects_Locations location;
the_extension = _Extension_Get( id, &location );
10d013: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Extension_Control *)
_Objects_Get( &_Extension_Information, id, location );
10d016: 50 push %eax
10d017: ff 75 08 pushl 0x8(%ebp)
10d01a: 68 c0 30 13 00 push $0x1330c0
10d01f: e8 24 12 00 00 call 10e248 <_Objects_Get>
10d024: 89 c3 mov %eax,%ebx
switch ( location ) {
10d026: 83 c4 10 add $0x10,%esp
10d029: 8b 55 f4 mov -0xc(%ebp),%edx
10d02c: 85 d2 test %edx,%edx
10d02e: 75 38 jne 10d068 <rtems_extension_delete+0x5c>
case OBJECTS_LOCAL:
_User_extensions_Remove_set( &the_extension->Extension );
10d030: 83 ec 0c sub $0xc,%esp
10d033: 8d 40 10 lea 0x10(%eax),%eax
10d036: 50 push %eax
10d037: e8 a4 29 00 00 call 10f9e0 <_User_extensions_Remove_set>
_Objects_Close( &_Extension_Information, &the_extension->Object );
10d03c: 59 pop %ecx
10d03d: 58 pop %eax
10d03e: 53 push %ebx
10d03f: 68 c0 30 13 00 push $0x1330c0
10d044: e8 c3 0d 00 00 call 10de0c <_Objects_Close>
RTEMS_INLINE_ROUTINE void _Extension_Free (
Extension_Control *the_extension
)
{
_Objects_Free( &_Extension_Information, &the_extension->Object );
10d049: 58 pop %eax
10d04a: 5a pop %edx
10d04b: 53 push %ebx
10d04c: 68 c0 30 13 00 push $0x1330c0
10d051: e8 b2 10 00 00 call 10e108 <_Objects_Free>
_Extension_Free( the_extension );
_Thread_Enable_dispatch();
10d056: e8 a1 1c 00 00 call 10ecfc <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10d05b: 83 c4 10 add $0x10,%esp
10d05e: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d060: 8b 5d fc mov -0x4(%ebp),%ebx
10d063: c9 leave
10d064: c3 ret
10d065: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10d068: b8 04 00 00 00 mov $0x4,%eax
}
10d06d: 8b 5d fc mov -0x4(%ebp),%ebx
10d070: c9 leave
10d071: c3 ret
0010800c <rtems_filesystem_dirname>:
int rtems_filesystem_dirname(
const char *pathname
)
{
10800c: 55 push %ebp
10800d: 89 e5 mov %esp,%ebp
10800f: 57 push %edi
108010: 56 push %esi
108011: 53 push %ebx
108012: 83 ec 0c sub $0xc,%esp
108015: 8b 5d 08 mov 0x8(%ebp),%ebx
int len = strlen( pathname );
108018: 31 c0 xor %eax,%eax
10801a: b9 ff ff ff ff mov $0xffffffff,%ecx
10801f: 89 df mov %ebx,%edi
108021: f2 ae repnz scas %es:(%edi),%al
108023: f7 d1 not %ecx
while ( len ) {
108025: 89 ce mov %ecx,%esi
108027: 4e dec %esi
108028: 75 06 jne 108030 <rtems_filesystem_dirname+0x24><== ALWAYS TAKEN
10802a: eb 19 jmp 108045 <rtems_filesystem_dirname+0x39><== NOT EXECUTED
10802c: 85 f6 test %esi,%esi
10802e: 74 15 je 108045 <rtems_filesystem_dirname+0x39>
len--;
108030: 4e dec %esi
if ( rtems_filesystem_is_separator( pathname[len] ) )
108031: 83 ec 0c sub $0xc,%esp
108034: 0f be 04 33 movsbl (%ebx,%esi,1),%eax
108038: 50 push %eax
108039: e8 da 0e 00 00 call 108f18 <rtems_filesystem_is_separator>
10803e: 83 c4 10 add $0x10,%esp
108041: 85 c0 test %eax,%eax
108043: 74 e7 je 10802c <rtems_filesystem_dirname+0x20>
break;
}
return len;
}
108045: 89 f0 mov %esi,%eax
108047: 8d 65 f4 lea -0xc(%ebp),%esp
10804a: 5b pop %ebx
10804b: 5e pop %esi
10804c: 5f pop %edi
10804d: c9 leave
10804e: c3 ret
0011007c <rtems_filesystem_get_mount_handler>:
rtems_filesystem_fsmount_me_t
rtems_filesystem_get_mount_handler(
const char *type
)
{
11007c: 55 push %ebp
11007d: 89 e5 mov %esp,%ebp
11007f: 83 ec 18 sub $0x18,%esp
110082: 8b 45 08 mov 0x8(%ebp),%eax
find_arg fa = {
110085: 89 45 f0 mov %eax,-0x10(%ebp)
110088: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp)
.type = type,
.mount_h = NULL
};
if ( type != NULL ) {
11008f: 85 c0 test %eax,%eax
110091: 74 19 je 1100ac <rtems_filesystem_get_mount_handler+0x30><== NEVER TAKEN
rtems_filesystem_iterate( find_handler, &fa );
110093: 83 ec 08 sub $0x8,%esp
110096: 8d 45 f0 lea -0x10(%ebp),%eax
110099: 50 push %eax
11009a: 68 9c ff 10 00 push $0x10ff9c
11009f: e8 34 ff ff ff call 10ffd8 <rtems_filesystem_iterate>
1100a4: 8b 45 f4 mov -0xc(%ebp),%eax
1100a7: 83 c4 10 add $0x10,%esp
}
return fa.mount_h;
}
1100aa: c9 leave
1100ab: c3 ret
find_arg fa = {
.type = type,
.mount_h = NULL
};
if ( type != NULL ) {
1100ac: 31 c0 xor %eax,%eax
rtems_filesystem_iterate( find_handler, &fa );
}
return fa.mount_h;
}
1100ae: c9 leave <== NOT EXECUTED
1100af: c3 ret <== NOT EXECUTED
00110238 <rtems_filesystem_get_sym_start_loc>:
#include "rtems/libio_.h"
void rtems_filesystem_get_sym_start_loc(const char *path,
int *index,
rtems_filesystem_location_info_t *loc)
{
110238: 55 push %ebp
110239: 89 e5 mov %esp,%ebp
11023b: 57 push %edi
11023c: 56 push %esi
11023d: 53 push %ebx
11023e: 83 ec 18 sub $0x18,%esp
110241: 8b 5d 0c mov 0xc(%ebp),%ebx
if (rtems_filesystem_is_separator(path[0])) {
110244: 8b 45 08 mov 0x8(%ebp),%eax
110247: 0f be 00 movsbl (%eax),%eax
11024a: 50 push %eax
11024b: e8 c8 8c ff ff call 108f18 <rtems_filesystem_is_separator>
110250: 83 c4 10 add $0x10,%esp
110253: 85 c0 test %eax,%eax
110255: 75 11 jne 110268 <rtems_filesystem_get_sym_start_loc+0x30>
*loc = rtems_filesystem_root;
*index = 1;
}
else {
*index = 0;
110257: c7 03 00 00 00 00 movl $0x0,(%ebx)
}
}
11025d: 8d 65 f4 lea -0xc(%ebp),%esp
110260: 5b pop %ebx
110261: 5e pop %esi
110262: 5f pop %edi
110263: c9 leave
110264: c3 ret
110265: 8d 76 00 lea 0x0(%esi),%esi
void rtems_filesystem_get_sym_start_loc(const char *path,
int *index,
rtems_filesystem_location_info_t *loc)
{
if (rtems_filesystem_is_separator(path[0])) {
*loc = rtems_filesystem_root;
110268: 8b 35 30 5a 12 00 mov 0x125a30,%esi
11026e: 83 c6 18 add $0x18,%esi
110271: b9 05 00 00 00 mov $0x5,%ecx
110276: 8b 7d 10 mov 0x10(%ebp),%edi
110279: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
*index = 1;
11027b: c7 03 01 00 00 00 movl $0x1,(%ebx)
}
else {
*index = 0;
}
}
110281: 8d 65 f4 lea -0xc(%ebp),%esp
110284: 5b pop %ebx
110285: 5e pop %esi
110286: 5f pop %edi
110287: c9 leave
110288: c3 ret
00107e3c <rtems_filesystem_initialize>:
* configuration is a single instantiation of the IMFS or miniIMFS with
* a single "/dev" directory in it.
*/
void rtems_filesystem_initialize( void )
{
107e3c: 55 push %ebp
107e3d: 89 e5 mov %esp,%ebp
107e3f: 57 push %edi
107e40: 56 push %esi
107e41: 53 push %ebx
107e42: 83 ec 2c sub $0x2c,%esp
/*
* Set the default umask to "022".
*/
rtems_filesystem_umask = 022;
107e45: a1 30 5a 12 00 mov 0x125a30,%eax
107e4a: c7 40 2c 12 00 00 00 movl $0x12,0x2c(%eax)
/*
* mount the first filesystem.
*/
if ( rtems_filesystem_mount_table_size == 0 )
107e51: a1 e0 f9 11 00 mov 0x11f9e0,%eax
107e56: 85 c0 test %eax,%eax
107e58: 0f 84 9f 00 00 00 je 107efd <rtems_filesystem_initialize+0xc1><== NEVER TAKEN
rtems_fatal_error_occurred( 0xABCD0001 );
mt = &rtems_filesystem_mount_table[0];
107e5e: a1 34 3a 12 00 mov 0x123a34,%eax
status = mount( mt->device, mt->mount_point, mt->type, mt->fsoptions, NULL );
107e63: 83 ec 0c sub $0xc,%esp
107e66: 6a 00 push $0x0
107e68: ff 70 04 pushl 0x4(%eax)
107e6b: ff 30 pushl (%eax)
107e6d: ff 70 0c pushl 0xc(%eax)
107e70: ff 70 08 pushl 0x8(%eax)
107e73: e8 fc 06 00 00 call 108574 <mount>
if ( status == -1 )
107e78: 83 c4 20 add $0x20,%esp
107e7b: 40 inc %eax
107e7c: 0f 84 95 00 00 00 je 107f17 <rtems_filesystem_initialize+0xdb><== NEVER TAKEN
rtems_fatal_error_occurred( 0xABCD0002 );
rtems_filesystem_link_counts = 0;
107e82: a1 30 5a 12 00 mov 0x125a30,%eax
107e87: 66 c7 40 30 00 00 movw $0x0,0x30(%eax)
* gonna hit performance.
*
* Till Straumann, 10/25/2002
*/
/* Clone the root pathloc */
rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0);
107e8d: 83 ec 0c sub $0xc,%esp
107e90: 6a 00 push $0x0
107e92: 8d 5d d4 lea -0x2c(%ebp),%ebx
107e95: 53 push %ebx
107e96: 6a 00 push $0x0
107e98: 6a 01 push $0x1
107e9a: 68 c7 13 12 00 push $0x1213c7
107e9f: e8 24 01 00 00 call 107fc8 <rtems_filesystem_evaluate_path>
rtems_filesystem_root = loc;
107ea4: 8b 3d 30 5a 12 00 mov 0x125a30,%edi
107eaa: 83 c7 18 add $0x18,%edi
107ead: b9 05 00 00 00 mov $0x5,%ecx
107eb2: 89 de mov %ebx,%esi
107eb4: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* One more clone for the current node */
rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0);
107eb6: 83 c4 14 add $0x14,%esp
107eb9: 6a 00 push $0x0
107ebb: 53 push %ebx
107ebc: 6a 00 push $0x0
107ebe: 6a 01 push $0x1
107ec0: 68 c7 13 12 00 push $0x1213c7
107ec5: e8 fe 00 00 00 call 107fc8 <rtems_filesystem_evaluate_path>
rtems_filesystem_current = loc;
107eca: 8b 3d 30 5a 12 00 mov 0x125a30,%edi
107ed0: 83 c7 04 add $0x4,%edi
107ed3: b9 05 00 00 00 mov $0x5,%ecx
107ed8: 89 de mov %ebx,%esi
107eda: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
*
* NOTE: UNIX root is 755 and owned by root/root (0/0). It is actually
* created that way by the IMFS.
*/
status = mkdir( "/dev", 0777);
107edc: 83 c4 18 add $0x18,%esp
107edf: 68 ff 01 00 00 push $0x1ff
107ee4: 68 c9 13 12 00 push $0x1213c9
107ee9: e8 42 05 00 00 call 108430 <mkdir>
if ( status != 0 )
107eee: 83 c4 10 add $0x10,%esp
107ef1: 85 c0 test %eax,%eax
107ef3: 75 15 jne 107f0a <rtems_filesystem_initialize+0xce><== NEVER TAKEN
* it will be mounted onto is created. Moreover, if it is going to
* use a device, then it is REALLY unfair to attempt this
* before device drivers are initialized. So we return via a base
* filesystem image and nothing auto-mounted at this point.
*/
}
107ef5: 8d 65 f4 lea -0xc(%ebp),%esp
107ef8: 5b pop %ebx
107ef9: 5e pop %esi
107efa: 5f pop %edi
107efb: c9 leave
107efc: c3 ret
/*
* mount the first filesystem.
*/
if ( rtems_filesystem_mount_table_size == 0 )
rtems_fatal_error_occurred( 0xABCD0001 );
107efd: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
107f00: 68 01 00 cd ab push $0xabcd0001 <== NOT EXECUTED
107f05: e8 f6 3d 00 00 call 10bd00 <rtems_fatal_error_occurred><== NOT EXECUTED
* created that way by the IMFS.
*/
status = mkdir( "/dev", 0777);
if ( status != 0 )
rtems_fatal_error_occurred( 0xABCD0003 );
107f0a: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
107f0d: 68 03 00 cd ab push $0xabcd0003 <== NOT EXECUTED
107f12: e8 e9 3d 00 00 call 10bd00 <rtems_fatal_error_occurred><== NOT EXECUTED
mt = &rtems_filesystem_mount_table[0];
status = mount( mt->device, mt->mount_point, mt->type, mt->fsoptions, NULL );
if ( status == -1 )
rtems_fatal_error_occurred( 0xABCD0002 );
107f17: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
107f1a: 68 02 00 cd ab push $0xabcd0002 <== NOT EXECUTED
107f1f: e8 dc 3d 00 00 call 10bd00 <rtems_fatal_error_occurred><== NOT EXECUTED
0010ffd8 <rtems_filesystem_iterate>:
bool rtems_filesystem_iterate(
rtems_per_filesystem_routine routine,
void *routine_arg
)
{
10ffd8: 55 push %ebp
10ffd9: 89 e5 mov %esp,%ebp
10ffdb: 57 push %edi
10ffdc: 56 push %esi
10ffdd: 53 push %ebx
10ffde: 83 ec 1c sub $0x1c,%esp
10ffe1: 8b 75 08 mov 0x8(%ebp),%esi
10ffe4: 8b 7d 0c mov 0xc(%ebp),%edi
const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0];
rtems_chain_node *node = NULL;
bool stop = false;
while ( table_entry->type && !stop ) {
10ffe7: 8b 1d c0 f9 11 00 mov 0x11f9c0,%ebx
10ffed: 85 db test %ebx,%ebx
10ffef: 74 24 je 110015 <rtems_filesystem_iterate+0x3d><== NEVER TAKEN
10fff1: bb c0 f9 11 00 mov $0x11f9c0,%ebx
10fff6: eb 04 jmp 10fffc <rtems_filesystem_iterate+0x24>
10fff8: 84 c0 test %al,%al
10fffa: 75 70 jne 11006c <rtems_filesystem_iterate+0x94>
stop = (*routine)( table_entry, routine_arg );
10fffc: 83 ec 08 sub $0x8,%esp
10ffff: 57 push %edi
110000: 53 push %ebx
110001: ff d6 call *%esi
110003: 88 c2 mov %al,%dl
++table_entry;
110005: 83 c3 08 add $0x8,%ebx
{
const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0];
rtems_chain_node *node = NULL;
bool stop = false;
while ( table_entry->type && !stop ) {
110008: 83 c4 10 add $0x10,%esp
11000b: 8b 0b mov (%ebx),%ecx
11000d: 85 c9 test %ecx,%ecx
11000f: 75 e7 jne 10fff8 <rtems_filesystem_iterate+0x20>
stop = (*routine)( table_entry, routine_arg );
++table_entry;
}
if ( !stop ) {
110011: 84 c0 test %al,%al
110013: 75 57 jne 11006c <rtems_filesystem_iterate+0x94>
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
110015: 50 push %eax
110016: 6a 00 push $0x0
110018: 6a 00 push $0x0
11001a: ff 35 c8 7c 12 00 pushl 0x127cc8
110020: e8 8b b6 ff ff call 10b6b0 <rtems_semaphore_obtain>
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
}
110025: 8b 1d 58 5a 12 00 mov 0x125a58,%ebx
++table_entry;
}
if ( !stop ) {
rtems_libio_lock();
for (
11002b: 83 c4 10 add $0x10,%esp
11002e: 81 fb 5c 5a 12 00 cmp $0x125a5c,%ebx
110034: 75 06 jne 11003c <rtems_filesystem_iterate+0x64>
110036: eb 3e jmp 110076 <rtems_filesystem_iterate+0x9e>
node = rtems_chain_first( &filesystem_chain );
!rtems_chain_is_tail( &filesystem_chain, node ) && !stop;
110038: 84 c0 test %al,%al
11003a: 75 19 jne 110055 <rtems_filesystem_iterate+0x7d><== NEVER TAKEN
node = rtems_chain_next( node )
) {
const filesystem_node *fsn = (filesystem_node *) node;
stop = (*routine)( &fsn->entry, routine_arg );
11003c: 83 ec 08 sub $0x8,%esp
11003f: 57 push %edi
110040: 8d 43 08 lea 0x8(%ebx),%eax
110043: 50 push %eax
110044: ff d6 call *%esi
110046: 88 c2 mov %al,%dl
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
}
110048: 8b 1b mov (%ebx),%ebx
++table_entry;
}
if ( !stop ) {
rtems_libio_lock();
for (
11004a: 83 c4 10 add $0x10,%esp
11004d: 81 fb 5c 5a 12 00 cmp $0x125a5c,%ebx
110053: 75 e3 jne 110038 <rtems_filesystem_iterate+0x60>
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
110055: 83 ec 0c sub $0xc,%esp
110058: ff 35 c8 7c 12 00 pushl 0x127cc8
11005e: 88 55 e4 mov %dl,-0x1c(%ebp)
110061: e8 46 b7 ff ff call 10b7ac <rtems_semaphore_release>
110066: 83 c4 10 add $0x10,%esp
110069: 8a 55 e4 mov -0x1c(%ebp),%dl
}
rtems_libio_unlock();
}
return stop;
}
11006c: 88 d0 mov %dl,%al
11006e: 8d 65 f4 lea -0xc(%ebp),%esp
110071: 5b pop %ebx
110072: 5e pop %esi
110073: 5f pop %edi
110074: c9 leave
110075: c3 ret
++table_entry;
}
if ( !stop ) {
rtems_libio_lock();
for (
110076: 31 d2 xor %edx,%edx
110078: eb db jmp 110055 <rtems_filesystem_iterate+0x7d>
00108504 <rtems_filesystem_mount_iterate>:
bool rtems_filesystem_mount_iterate(
rtems_per_filesystem_mount_routine routine,
void *routine_arg
)
{
108504: 55 push %ebp
108505: 89 e5 mov %esp,%ebp
108507: 57 push %edi
108508: 56 push %esi
108509: 53 push %ebx
10850a: 83 ec 20 sub $0x20,%esp
10850d: 8b 75 08 mov 0x8(%ebp),%esi
108510: 8b 7d 0c mov 0xc(%ebp),%edi
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
108513: 6a 00 push $0x0
108515: 6a 00 push $0x0
108517: ff 35 c8 7c 12 00 pushl 0x127cc8
10851d: e8 8e 31 00 00 call 10b6b0 <rtems_semaphore_obtain>
stop = (*routine)( mt_entry, routine_arg );
}
rtems_libio_unlock();
return stop;
}
108522: 8b 1d 04 59 12 00 mov 0x125904,%ebx
{
rtems_chain_node *node = NULL;
bool stop = false;
rtems_libio_lock();
for (
108528: 83 c4 10 add $0x10,%esp
10852b: 81 fb 08 59 12 00 cmp $0x125908,%ebx
108531: 75 09 jne 10853c <rtems_filesystem_mount_iterate+0x38><== ALWAYS TAKEN
108533: eb 3b jmp 108570 <rtems_filesystem_mount_iterate+0x6c><== NOT EXECUTED
108535: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
node = rtems_chain_first( &mount_chain );
!rtems_chain_is_tail( &mount_chain, node ) && !stop;
108538: 84 c0 test %al,%al
10853a: 75 16 jne 108552 <rtems_filesystem_mount_iterate+0x4e><== NEVER TAKEN
node = rtems_chain_next( node )
) {
const rtems_filesystem_mount_table_entry_t *mt_entry =
(rtems_filesystem_mount_table_entry_t *) node;
stop = (*routine)( mt_entry, routine_arg );
10853c: 83 ec 08 sub $0x8,%esp
10853f: 57 push %edi
108540: 53 push %ebx
108541: ff d6 call *%esi
108543: 88 c2 mov %al,%dl
}
rtems_libio_unlock();
return stop;
}
108545: 8b 1b mov (%ebx),%ebx
{
rtems_chain_node *node = NULL;
bool stop = false;
rtems_libio_lock();
for (
108547: 83 c4 10 add $0x10,%esp
10854a: 81 fb 08 59 12 00 cmp $0x125908,%ebx
108550: 75 e6 jne 108538 <rtems_filesystem_mount_iterate+0x34>
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
108552: 83 ec 0c sub $0xc,%esp
108555: ff 35 c8 7c 12 00 pushl 0x127cc8
10855b: 88 55 e4 mov %dl,-0x1c(%ebp)
10855e: e8 49 32 00 00 call 10b7ac <rtems_semaphore_release>
stop = (*routine)( mt_entry, routine_arg );
}
rtems_libio_unlock();
return stop;
}
108563: 8a 55 e4 mov -0x1c(%ebp),%dl
108566: 88 d0 mov %dl,%al
108568: 8d 65 f4 lea -0xc(%ebp),%esp
10856b: 5b pop %ebx
10856c: 5e pop %esi
10856d: 5f pop %edi
10856e: c9 leave
10856f: c3 ret
rtems_per_filesystem_mount_routine routine,
void *routine_arg
)
{
rtems_chain_node *node = NULL;
bool stop = false;
108570: 31 d2 xor %edx,%edx <== NOT EXECUTED
108572: eb de jmp 108552 <rtems_filesystem_mount_iterate+0x4e><== NOT EXECUTED
00108050 <rtems_filesystem_prefix_separators>:
int rtems_filesystem_prefix_separators(
const char *pathname,
int pathnamelen
)
{
108050: 55 push %ebp
108051: 89 e5 mov %esp,%ebp
108053: 57 push %edi
108054: 56 push %esi
108055: 53 push %ebx
108056: 83 ec 0c sub $0xc,%esp
108059: 8b 75 08 mov 0x8(%ebp),%esi
10805c: 8b 7d 0c mov 0xc(%ebp),%edi
/*
* Eat any separators at start of the path.
*/
int stripped = 0;
while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) )
10805f: 8a 06 mov (%esi),%al
108061: 84 c0 test %al,%al
108063: 74 34 je 108099 <rtems_filesystem_prefix_separators+0x49><== NEVER TAKEN
108065: 85 ff test %edi,%edi
108067: 74 30 je 108099 <rtems_filesystem_prefix_separators+0x49><== NEVER TAKEN
108069: 31 db xor %ebx,%ebx
10806b: eb 0f jmp 10807c <rtems_filesystem_prefix_separators+0x2c>
10806d: 8d 76 00 lea 0x0(%esi),%esi
{
pathname++;
pathnamelen--;
stripped++;
108070: 43 inc %ebx
{
/*
* Eat any separators at start of the path.
*/
int stripped = 0;
while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) )
108071: 8a 04 1e mov (%esi,%ebx,1),%al
108074: 84 c0 test %al,%al
108076: 74 17 je 10808f <rtems_filesystem_prefix_separators+0x3f><== NEVER TAKEN
108078: 39 df cmp %ebx,%edi
10807a: 74 13 je 10808f <rtems_filesystem_prefix_separators+0x3f><== NEVER TAKEN
10807c: 83 ec 0c sub $0xc,%esp
10807f: 0f be c0 movsbl %al,%eax
108082: 50 push %eax
108083: e8 90 0e 00 00 call 108f18 <rtems_filesystem_is_separator>
108088: 83 c4 10 add $0x10,%esp
10808b: 85 c0 test %eax,%eax
10808d: 75 e1 jne 108070 <rtems_filesystem_prefix_separators+0x20>
pathname++;
pathnamelen--;
stripped++;
}
return stripped;
}
10808f: 89 d8 mov %ebx,%eax
108091: 8d 65 f4 lea -0xc(%ebp),%esp
108094: 5b pop %ebx
108095: 5e pop %esi
108096: 5f pop %edi
108097: c9 leave
108098: c3 ret
)
{
/*
* Eat any separators at start of the path.
*/
int stripped = 0;
108099: 31 db xor %ebx,%ebx
10809b: eb f2 jmp 10808f <rtems_filesystem_prefix_separators+0x3f><== NOT EXECUTED
001100b0 <rtems_filesystem_register>:
int
rtems_filesystem_register(
const char *type,
rtems_filesystem_fsmount_me_t mount_h
)
{
1100b0: 55 push %ebp
1100b1: 89 e5 mov %esp,%ebp
1100b3: 57 push %edi
1100b4: 56 push %esi
1100b5: 53 push %ebx
1100b6: 83 ec 28 sub $0x28,%esp
size_t type_size = strlen(type) + 1;
1100b9: 31 c0 xor %eax,%eax
1100bb: b9 ff ff ff ff mov $0xffffffff,%ecx
1100c0: 8b 7d 08 mov 0x8(%ebp),%edi
1100c3: f2 ae repnz scas %es:(%edi),%al
1100c5: f7 d1 not %ecx
size_t fsn_size = sizeof( filesystem_node ) + type_size;
1100c7: 8d 41 10 lea 0x10(%ecx),%eax
filesystem_node *fsn = malloc( fsn_size );
1100ca: 50 push %eax
1100cb: 89 4d e4 mov %ecx,-0x1c(%ebp)
1100ce: e8 b5 82 ff ff call 108388 <malloc>
1100d3: 89 c3 mov %eax,%ebx
char *type_storage = (char *) fsn + sizeof( *fsn );
if ( fsn == NULL )
1100d5: 83 c4 10 add $0x10,%esp
1100d8: 85 c0 test %eax,%eax
1100da: 8b 4d e4 mov -0x1c(%ebp),%ecx
1100dd: 0f 84 8e 00 00 00 je 110171 <rtems_filesystem_register+0xc1>
)
{
size_t type_size = strlen(type) + 1;
size_t fsn_size = sizeof( filesystem_node ) + type_size;
filesystem_node *fsn = malloc( fsn_size );
char *type_storage = (char *) fsn + sizeof( *fsn );
1100e3: 8d 40 10 lea 0x10(%eax),%eax
if ( fsn == NULL )
rtems_set_errno_and_return_minus_one( ENOMEM );
memcpy(type_storage, type, type_size);
1100e6: 89 c7 mov %eax,%edi
1100e8: 8b 75 08 mov 0x8(%ebp),%esi
1100eb: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
fsn->entry.type = type_storage;
1100ed: 89 43 08 mov %eax,0x8(%ebx)
fsn->entry.mount_h = mount_h;
1100f0: 8b 45 0c mov 0xc(%ebp),%eax
1100f3: 89 43 0c mov %eax,0xc(%ebx)
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
1100f6: 50 push %eax
1100f7: 6a 00 push $0x0
1100f9: 6a 00 push $0x0
1100fb: ff 35 c8 7c 12 00 pushl 0x127cc8
110101: e8 aa b5 ff ff call 10b6b0 <rtems_semaphore_obtain>
rtems_libio_lock();
if ( rtems_filesystem_get_mount_handler( type ) == NULL ) {
110106: 5f pop %edi
110107: ff 75 08 pushl 0x8(%ebp)
11010a: e8 6d ff ff ff call 11007c <rtems_filesystem_get_mount_handler>
11010f: 83 c4 10 add $0x10,%esp
110112: 85 c0 test %eax,%eax
110114: 75 2a jne 110140 <rtems_filesystem_register+0x90>
110116: 83 ec 08 sub $0x8,%esp
110119: 53 push %ebx
11011a: 68 58 5a 12 00 push $0x125a58
11011f: e8 b8 be ff ff call 10bfdc <_Chain_Append>
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
110124: 5e pop %esi
110125: ff 35 c8 7c 12 00 pushl 0x127cc8
11012b: e8 7c b6 ff ff call 10b7ac <rtems_semaphore_release>
110130: 83 c4 10 add $0x10,%esp
rtems_set_errno_and_return_minus_one( EINVAL );
}
rtems_libio_unlock();
return 0;
110133: 31 c0 xor %eax,%eax
}
110135: 8d 65 f4 lea -0xc(%ebp),%esp
110138: 5b pop %ebx
110139: 5e pop %esi
11013a: 5f pop %edi
11013b: c9 leave
11013c: c3 ret
11013d: 8d 76 00 lea 0x0(%esi),%esi
110140: 83 ec 0c sub $0xc,%esp
110143: ff 35 c8 7c 12 00 pushl 0x127cc8
110149: e8 5e b6 ff ff call 10b7ac <rtems_semaphore_release>
rtems_libio_lock();
if ( rtems_filesystem_get_mount_handler( type ) == NULL ) {
rtems_chain_append( &filesystem_chain, &fsn->node );
} else {
rtems_libio_unlock();
free( fsn );
11014e: 89 1c 24 mov %ebx,(%esp)
110151: e8 5e 7f ff ff call 1080b4 <free>
rtems_set_errno_and_return_minus_one( EINVAL );
110156: e8 b9 31 00 00 call 113314 <__errno>
11015b: c7 00 16 00 00 00 movl $0x16,(%eax)
110161: 83 c4 10 add $0x10,%esp
110164: b8 ff ff ff ff mov $0xffffffff,%eax
}
rtems_libio_unlock();
return 0;
}
110169: 8d 65 f4 lea -0xc(%ebp),%esp
11016c: 5b pop %ebx
11016d: 5e pop %esi
11016e: 5f pop %edi
11016f: c9 leave
110170: c3 ret
size_t fsn_size = sizeof( filesystem_node ) + type_size;
filesystem_node *fsn = malloc( fsn_size );
char *type_storage = (char *) fsn + sizeof( *fsn );
if ( fsn == NULL )
rtems_set_errno_and_return_minus_one( ENOMEM );
110171: e8 9e 31 00 00 call 113314 <__errno>
110176: c7 00 0c 00 00 00 movl $0xc,(%eax)
11017c: b8 ff ff ff ff mov $0xffffffff,%eax
110181: eb b2 jmp 110135 <rtems_filesystem_register+0x85>
00110184 <rtems_filesystem_unregister>:
int
rtems_filesystem_unregister(
const char *type
)
{
110184: 55 push %ebp
110185: 89 e5 mov %esp,%ebp
110187: 56 push %esi
110188: 53 push %ebx
110189: 8b 75 08 mov 0x8(%ebp),%esi
rtems_chain_node *node = NULL;
if ( type == NULL ) {
11018c: 85 f6 test %esi,%esi
11018e: 0f 84 94 00 00 00 je 110228 <rtems_filesystem_unregister+0xa4>
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
110194: 51 push %ecx
110195: 6a 00 push $0x0
110197: 6a 00 push $0x0
110199: ff 35 c8 7c 12 00 pushl 0x127cc8
11019f: e8 0c b5 ff ff call 10b6b0 <rtems_semaphore_obtain>
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
}
1101a4: 8b 1d 58 5a 12 00 mov 0x125a58,%ebx
if ( type == NULL ) {
rtems_set_errno_and_return_minus_one( EINVAL );
}
rtems_libio_lock();
for (
1101aa: 83 c4 10 add $0x10,%esp
1101ad: 81 fb 5c 5a 12 00 cmp $0x125a5c,%ebx
1101b3: 75 0d jne 1101c2 <rtems_filesystem_unregister+0x3e>
1101b5: eb 49 jmp 110200 <rtems_filesystem_unregister+0x7c>
1101b7: 90 nop
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
}
1101b8: 8b 1b mov (%ebx),%ebx
if ( type == NULL ) {
rtems_set_errno_and_return_minus_one( EINVAL );
}
rtems_libio_lock();
for (
1101ba: 81 fb 5c 5a 12 00 cmp $0x125a5c,%ebx
1101c0: 74 3e je 110200 <rtems_filesystem_unregister+0x7c><== ALWAYS TAKEN
!rtems_chain_is_tail( &filesystem_chain, node );
node = rtems_chain_next( node )
) {
filesystem_node *fsn = (filesystem_node *) node;
if ( strcmp( fsn->entry.type, type ) == 0 ) {
1101c2: 83 ec 08 sub $0x8,%esp
1101c5: 56 push %esi
1101c6: ff 73 08 pushl 0x8(%ebx)
1101c9: e8 be 3d 00 00 call 113f8c <strcmp>
1101ce: 83 c4 10 add $0x10,%esp
1101d1: 85 c0 test %eax,%eax
1101d3: 75 e3 jne 1101b8 <rtems_filesystem_unregister+0x34>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
1101d5: 83 ec 0c sub $0xc,%esp
1101d8: 53 push %ebx
1101d9: e8 22 be ff ff call 10c000 <_Chain_Extract>
rtems_chain_extract( node );
free( fsn );
1101de: 89 1c 24 mov %ebx,(%esp)
1101e1: e8 ce 7e ff ff call 1080b4 <free>
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
1101e6: 5a pop %edx
1101e7: ff 35 c8 7c 12 00 pushl 0x127cc8
1101ed: e8 ba b5 ff ff call 10b7ac <rtems_semaphore_release>
1101f2: 83 c4 10 add $0x10,%esp
rtems_libio_unlock();
return 0;
1101f5: 31 c0 xor %eax,%eax
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
}
1101f7: 8d 65 f8 lea -0x8(%ebp),%esp
1101fa: 5b pop %ebx
1101fb: 5e pop %esi
1101fc: c9 leave
1101fd: c3 ret
1101fe: 66 90 xchg %ax,%ax
110200: 83 ec 0c sub $0xc,%esp
110203: ff 35 c8 7c 12 00 pushl 0x127cc8
110209: e8 9e b5 ff ff call 10b7ac <rtems_semaphore_release>
return 0;
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
11020e: e8 01 31 00 00 call 113314 <__errno>
110213: c7 00 02 00 00 00 movl $0x2,(%eax)
110219: 83 c4 10 add $0x10,%esp
11021c: b8 ff ff ff ff mov $0xffffffff,%eax
}
110221: 8d 65 f8 lea -0x8(%ebp),%esp
110224: 5b pop %ebx
110225: 5e pop %esi
110226: c9 leave
110227: c3 ret
)
{
rtems_chain_node *node = NULL;
if ( type == NULL ) {
rtems_set_errno_and_return_minus_one( EINVAL );
110228: e8 e7 30 00 00 call 113314 <__errno>
11022d: c7 00 16 00 00 00 movl $0x16,(%eax)
110233: 83 c8 ff or $0xffffffff,%eax
110236: eb e9 jmp 110221 <rtems_filesystem_unregister+0x9d>
0010897c <rtems_gxx_key_create>:
int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *))
{
10897c: 55 push %ebp
10897d: 89 e5 mov %esp,%ebp
10897f: 56 push %esi
108980: 53 push %ebx
108981: 8b 75 0c mov 0xc(%ebp),%esi
* pointer to the buffer that will hold the value of the key itself.
* We have to to this, because the others functions on this interface
* deal with the value of the key, as used with the POSIX API.
*/
/* Do not pull your hair, trust me this works. :-) */
__gthread_key_t new_key = (__gthread_key_t) malloc( sizeof( *new_key ) );
108984: 83 ec 0c sub $0xc,%esp
108987: 6a 08 push $0x8
108989: e8 c6 03 00 00 call 108d54 <malloc>
10898e: 89 c3 mov %eax,%ebx
*key = new_key;
108990: 8b 45 08 mov 0x8(%ebp),%eax
108993: 89 18 mov %ebx,(%eax)
new_key->val = NULL;
108995: c7 03 00 00 00 00 movl $0x0,(%ebx)
new_key->dtor = dtor;
10899b: 89 73 04 mov %esi,0x4(%ebx)
"gxx_wrappers: create key=%x, dtor=%x, new_key=%x\n", key, dtor, new_key
);
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)new_key, dtor );
10899e: 83 c4 0c add $0xc,%esp
1089a1: 56 push %esi
1089a2: 53 push %ebx
1089a3: 6a 00 push $0x0
1089a5: e8 a6 3c 00 00 call 10c650 <rtems_task_variable_add>
if ( status == RTEMS_SUCCESSFUL )
1089aa: 83 c4 10 add $0x10,%esp
1089ad: 85 c0 test %eax,%eax
1089af: 75 0b jne 1089bc <rtems_gxx_key_create+0x40><== NEVER TAKEN
return 0;
1089b1: 31 c0 xor %eax,%eax
free( new_key );
return -1;
}
1089b3: 8d 65 f8 lea -0x8(%ebp),%esp
1089b6: 5b pop %ebx
1089b7: 5e pop %esi
1089b8: c9 leave
1089b9: c3 ret
1089ba: 66 90 xchg %ax,%ax
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)new_key, dtor );
if ( status == RTEMS_SUCCESSFUL )
return 0;
free( new_key );
1089bc: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
1089bf: 53 push %ebx <== NOT EXECUTED
1089c0: e8 3f fe ff ff call 108804 <free> <== NOT EXECUTED
return -1;
1089c5: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
1089c8: b8 ff ff ff ff mov $0xffffffff,%eax <== NOT EXECUTED
1089cd: eb e4 jmp 1089b3 <rtems_gxx_key_create+0x37><== NOT EXECUTED
001089e0 <rtems_gxx_key_delete>:
int rtems_gxx_key_delete (__gthread_key_t key)
{
1089e0: 55 push %ebp
1089e1: 89 e5 mov %esp,%ebp
1089e3: 53 push %ebx
1089e4: 83 ec 0c sub $0xc,%esp
1089e7: 8b 5d 08 mov 0x8(%ebp),%ebx
#ifdef DEBUG_GXX_WRAPPERS
printk( "gxx_wrappers: delete key=%x\n", key );
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_delete( RTEMS_SELF, (void **)key );
1089ea: 53 push %ebx
1089eb: 6a 00 push $0x0
1089ed: e8 22 3d 00 00 call 10c714 <rtems_task_variable_delete>
if ( status == RTEMS_SUCCESSFUL ) {
1089f2: 83 c4 10 add $0x10,%esp
1089f5: 85 c0 test %eax,%eax
1089f7: 75 11 jne 108a0a <rtems_gxx_key_delete+0x2a><== NEVER TAKEN
/* Hmm - hopefully all tasks using this key have gone away... */
if ( key ) free( *(void **)key );
1089f9: 85 db test %ebx,%ebx
1089fb: 74 0d je 108a0a <rtems_gxx_key_delete+0x2a><== NEVER TAKEN
1089fd: 83 ec 0c sub $0xc,%esp
108a00: ff 33 pushl (%ebx)
108a02: e8 fd fd ff ff call 108804 <free>
108a07: 83 c4 10 add $0x10,%esp
return 0;
}
key = NULL;
return 0;
}
108a0a: 31 c0 xor %eax,%eax
108a0c: 8b 5d fc mov -0x4(%ebp),%ebx
108a0f: c9 leave
108a10: c3 ret
00108900 <rtems_gxx_once>:
/* uncomment this if you need to debug this interface */
/*#define DEBUG_GXX_WRAPPERS 1*/
int rtems_gxx_once(__gthread_once_t *once, void (*func) (void))
{
108900: 55 push %ebp
108901: 89 e5 mov %esp,%ebp
108903: 56 push %esi
108904: 53 push %ebx
108905: 83 ec 10 sub $0x10,%esp
108908: 8b 5d 08 mov 0x8(%ebp),%ebx
#ifdef DEBUG_GXX_WRAPPERS
printk( "gxx_wrappers: once=%x, func=%x\n", *once, func );
#endif
if ( *(volatile __gthread_once_t *)once == 0 ) {
10890b: 8b 03 mov (%ebx),%eax
10890d: 85 c0 test %eax,%eax
10890f: 74 0b je 10891c <rtems_gxx_once+0x1c>
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
if ( o == 0 )
(*func)();
}
return 0;
}
108911: 31 c0 xor %eax,%eax
108913: 8d 65 f8 lea -0x8(%ebp),%esp
108916: 5b pop %ebx
108917: 5e pop %esi
108918: c9 leave
108919: c3 ret
10891a: 66 90 xchg %ax,%ax
if ( *(volatile __gthread_once_t *)once == 0 ) {
rtems_mode saveMode;
__gthread_once_t o;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
10891c: 51 push %ecx
10891d: 8d 75 f4 lea -0xc(%ebp),%esi
108920: 56 push %esi
108921: 68 00 01 00 00 push $0x100
108926: 68 00 01 00 00 push $0x100
10892b: e8 48 3b 00 00 call 10c478 <rtems_task_mode>
if ( (o = *(volatile __gthread_once_t *)once) == 0 ) {
108930: 8b 03 mov (%ebx),%eax
108932: 83 c4 10 add $0x10,%esp
108935: 85 c0 test %eax,%eax
108937: 75 27 jne 108960 <rtems_gxx_once+0x60> <== NEVER TAKEN
*(volatile __gthread_once_t *)once = 1;
108939: c7 03 01 00 00 00 movl $0x1,(%ebx)
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
10893f: 52 push %edx
108940: 56 push %esi
108941: 68 00 01 00 00 push $0x100
108946: ff 75 f4 pushl -0xc(%ebp)
108949: e8 2a 3b 00 00 call 10c478 <rtems_task_mode>
if ( o == 0 )
(*func)();
10894e: ff 55 0c call *0xc(%ebp)
108951: 83 c4 10 add $0x10,%esp
}
return 0;
}
108954: 31 c0 xor %eax,%eax
108956: 8d 65 f8 lea -0x8(%ebp),%esp
108959: 5b pop %ebx
10895a: 5e pop %esi
10895b: c9 leave
10895c: c3 ret
10895d: 8d 76 00 lea 0x0(%esi),%esi
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
if ( (o = *(volatile __gthread_once_t *)once) == 0 ) {
*(volatile __gthread_once_t *)once = 1;
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
108960: 50 push %eax <== NOT EXECUTED
108961: 56 push %esi <== NOT EXECUTED
108962: 68 00 01 00 00 push $0x100 <== NOT EXECUTED
108967: ff 75 f4 pushl -0xc(%ebp) <== NOT EXECUTED
10896a: e8 09 3b 00 00 call 10c478 <rtems_task_mode> <== NOT EXECUTED
10896f: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
if ( o == 0 )
(*func)();
}
return 0;
}
108972: 31 c0 xor %eax,%eax <== NOT EXECUTED
108974: 8d 65 f8 lea -0x8(%ebp),%esp <== NOT EXECUTED
108977: 5b pop %ebx <== NOT EXECUTED
108978: 5e pop %esi <== NOT EXECUTED
108979: c9 leave <== NOT EXECUTED
10897a: c3 ret <== NOT EXECUTED
00108a70 <rtems_gxx_setspecific>:
#endif
return p;
}
int rtems_gxx_setspecific(__gthread_key_t key, const void *ptr)
{
108a70: 55 push %ebp
108a71: 89 e5 mov %esp,%ebp
108a73: 53 push %ebx
108a74: 83 ec 08 sub $0x8,%esp
108a77: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_task_self()
);
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)key, key->dtor );
108a7a: ff 73 04 pushl 0x4(%ebx)
108a7d: 53 push %ebx
108a7e: 6a 00 push $0x0
108a80: e8 cb 3b 00 00 call 10c650 <rtems_task_variable_add>
if ( status == RTEMS_SUCCESSFUL ) {
108a85: 83 c4 10 add $0x10,%esp
108a88: 85 c0 test %eax,%eax
108a8a: 75 0c jne 108a98 <rtems_gxx_setspecific+0x28><== NEVER TAKEN
/* now let's set the proper value */
key->val = (void *)ptr;
108a8c: 8b 45 0c mov 0xc(%ebp),%eax
108a8f: 89 03 mov %eax,(%ebx)
return 0;
108a91: 31 c0 xor %eax,%eax
}
return -1;
}
108a93: 8b 5d fc mov -0x4(%ebp),%ebx
108a96: c9 leave
108a97: c3 ret
if ( status == RTEMS_SUCCESSFUL ) {
/* now let's set the proper value */
key->val = (void *)ptr;
return 0;
}
return -1;
108a98: b8 ff ff ff ff mov $0xffffffff,%eax <== NOT EXECUTED
}
108a9d: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
108aa0: c9 leave <== NOT EXECUTED
108aa1: c3 ret <== NOT EXECUTED
0010bc38 <rtems_heap_allocate_aligned_with_boundary>:
void *rtems_heap_allocate_aligned_with_boundary(
size_t size,
uintptr_t alignment,
uintptr_t boundary
)
{
10bc38: 55 push %ebp
10bc39: 89 e5 mov %esp,%ebp
10bc3b: 83 ec 08 sub $0x8,%esp
if (
10bc3e: 83 3d 40 f5 12 00 03 cmpl $0x3,0x12f540
10bc45: 74 21 je 10bc68 <rtems_heap_allocate_aligned_with_boundary+0x30><== ALWAYS TAKEN
&& !malloc_is_system_state_OK()
) {
return NULL;
}
malloc_deferred_frees_process();
10bc47: e8 e0 ef ff ff call 10ac2c <malloc_deferred_frees_process>
/* FIXME: Statistics, boundary checks */
return _Protected_heap_Allocate_aligned_with_boundary(
10bc4c: ff 75 10 pushl 0x10(%ebp)
10bc4f: ff 75 0c pushl 0xc(%ebp)
10bc52: ff 75 08 pushl 0x8(%ebp)
10bc55: ff 35 38 a6 12 00 pushl 0x12a638
10bc5b: e8 0c 4e 00 00 call 110a6c <_Protected_heap_Allocate_aligned_with_boundary>
10bc60: 83 c4 10 add $0x10,%esp
RTEMS_Malloc_Heap,
size,
alignment,
boundary
);
}
10bc63: c9 leave
10bc64: c3 ret
10bc65: 8d 76 00 lea 0x0(%esi),%esi
uintptr_t boundary
)
{
if (
_System_state_Is_up( _System_state_Get() )
&& !malloc_is_system_state_OK()
10bc68: e8 7f ef ff ff call 10abec <malloc_is_system_state_OK>
10bc6d: 84 c0 test %al,%al
10bc6f: 75 d6 jne 10bc47 <rtems_heap_allocate_aligned_with_boundary+0xf>
) {
return NULL;
10bc71: 31 c0 xor %eax,%eax
RTEMS_Malloc_Heap,
size,
alignment,
boundary
);
}
10bc73: c9 leave
10bc74: c3 ret
00112ff8 <rtems_io_close>:
rtems_status_code rtems_io_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
112ff8: 55 push %ebp
112ff9: 89 e5 mov %esp,%ebp
112ffb: 53 push %ebx
112ffc: 83 ec 04 sub $0x4,%esp
112fff: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
113002: 39 05 e0 88 12 00 cmp %eax,0x1288e0
113008: 76 1a jbe 113024 <rtems_io_close+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].close_entry;
11300a: 8d 14 40 lea (%eax,%eax,2),%edx
11300d: c1 e2 03 shl $0x3,%edx
113010: 03 15 e4 88 12 00 add 0x1288e4,%edx
113016: 8b 52 08 mov 0x8(%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113019: 85 d2 test %edx,%edx
11301b: 74 13 je 113030 <rtems_io_close+0x38>
}
11301d: 59 pop %ecx
11301e: 5b pop %ebx
11301f: c9 leave
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].close_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113020: ff e2 jmp *%edx
113022: 66 90 xchg %ax,%ax
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
113024: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].close_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
113029: 5a pop %edx
11302a: 5b pop %ebx
11302b: c9 leave
11302c: c3 ret
11302d: 8d 76 00 lea 0x0(%esi),%esi
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].close_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113030: 31 c0 xor %eax,%eax
}
113032: 5a pop %edx
113033: 5b pop %ebx
113034: c9 leave
113035: c3 ret
00113038 <rtems_io_control>:
rtems_status_code rtems_io_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
113038: 55 push %ebp
113039: 89 e5 mov %esp,%ebp
11303b: 53 push %ebx
11303c: 83 ec 04 sub $0x4,%esp
11303f: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
113042: 39 05 e0 88 12 00 cmp %eax,0x1288e0
113048: 76 1a jbe 113064 <rtems_io_control+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].control_entry;
11304a: 8d 14 40 lea (%eax,%eax,2),%edx
11304d: c1 e2 03 shl $0x3,%edx
113050: 03 15 e4 88 12 00 add 0x1288e4,%edx
113056: 8b 52 14 mov 0x14(%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113059: 85 d2 test %edx,%edx
11305b: 74 13 je 113070 <rtems_io_control+0x38>
}
11305d: 59 pop %ecx
11305e: 5b pop %ebx
11305f: c9 leave
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].control_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113060: ff e2 jmp *%edx
113062: 66 90 xchg %ax,%ax
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
113064: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].control_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
113069: 5a pop %edx
11306a: 5b pop %ebx
11306b: c9 leave
11306c: c3 ret
11306d: 8d 76 00 lea 0x0(%esi),%esi
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].control_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113070: 31 c0 xor %eax,%eax
}
113072: 5a pop %edx
113073: 5b pop %ebx
113074: c9 leave
113075: c3 ret
00111014 <rtems_io_initialize>:
rtems_status_code rtems_io_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
111014: 55 push %ebp
111015: 89 e5 mov %esp,%ebp
111017: 53 push %ebx
111018: 83 ec 04 sub $0x4,%esp
11101b: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
11101e: 39 05 e0 88 12 00 cmp %eax,0x1288e0
111024: 76 1a jbe 111040 <rtems_io_initialize+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].initialization_entry;
111026: 8d 14 40 lea (%eax,%eax,2),%edx
111029: c1 e2 03 shl $0x3,%edx
11102c: 03 15 e4 88 12 00 add 0x1288e4,%edx
111032: 8b 12 mov (%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
111034: 85 d2 test %edx,%edx
111036: 74 14 je 11104c <rtems_io_initialize+0x38>
}
111038: 59 pop %ecx
111039: 5b pop %ebx
11103a: c9 leave
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].initialization_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
11103b: ff e2 jmp *%edx
11103d: 8d 76 00 lea 0x0(%esi),%esi
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
111040: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].initialization_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
111045: 5a pop %edx
111046: 5b pop %ebx
111047: c9 leave
111048: c3 ret
111049: 8d 76 00 lea 0x0(%esi),%esi
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].initialization_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
11104c: 31 c0 xor %eax,%eax
}
11104e: 5a pop %edx
11104f: 5b pop %ebx
111050: c9 leave
111051: c3 ret
00107d60 <rtems_io_lookup_name>:
rtems_status_code rtems_io_lookup_name(
const char *name,
rtems_driver_name_t *device_info
)
{
107d60: 55 push %ebp
107d61: 89 e5 mov %esp,%ebp
107d63: 57 push %edi
107d64: 56 push %esi
107d65: 53 push %ebx
107d66: 83 ec 48 sub $0x48,%esp
107d69: 8b 75 08 mov 0x8(%ebp),%esi
IMFS_jnode_t *the_jnode;
rtems_filesystem_location_info_t loc;
int result;
rtems_filesystem_node_types_t node_type;
result = rtems_filesystem_evaluate_path(
107d6c: b9 ff ff ff ff mov $0xffffffff,%ecx
107d71: 89 f7 mov %esi,%edi
107d73: 31 c0 xor %eax,%eax
107d75: f2 ae repnz scas %es:(%edi),%al
107d77: f7 d1 not %ecx
107d79: 49 dec %ecx
107d7a: 6a 01 push $0x1
107d7c: 8d 5d d4 lea -0x2c(%ebp),%ebx
107d7f: 53 push %ebx
107d80: 6a 00 push $0x0
107d82: 51 push %ecx
107d83: 56 push %esi
107d84: e8 3f 02 00 00 call 107fc8 <rtems_filesystem_evaluate_path>
107d89: 89 c7 mov %eax,%edi
name, strlen( name ), 0x00, &loc, true );
the_jnode = loc.node_access;
107d8b: 8b 55 d4 mov -0x2c(%ebp),%edx
107d8e: 89 55 c4 mov %edx,-0x3c(%ebp)
node_type = (*loc.ops->node_type_h)( &loc );
107d91: 83 c4 14 add $0x14,%esp
107d94: 53 push %ebx
107d95: 8b 45 e0 mov -0x20(%ebp),%eax
107d98: ff 50 10 call *0x10(%eax)
if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
107d9b: 83 c4 10 add $0x10,%esp
107d9e: 85 ff test %edi,%edi
107da0: 75 05 jne 107da7 <rtems_io_lookup_name+0x47><== NEVER TAKEN
107da2: 83 f8 02 cmp $0x2,%eax
107da5: 74 19 je 107dc0 <rtems_io_lookup_name+0x60>
rtems_filesystem_freenode( &loc );
107da7: 83 ec 0c sub $0xc,%esp
107daa: 53 push %ebx
107dab: e8 f0 02 00 00 call 1080a0 <rtems_filesystem_freenode>
return RTEMS_UNSATISFIED;
107db0: 83 c4 10 add $0x10,%esp
107db3: b8 0d 00 00 00 mov $0xd,%eax
device_info->minor = the_jnode->info.device.minor;
rtems_filesystem_freenode( &loc );
return RTEMS_SUCCESSFUL;
}
107db8: 8d 65 f4 lea -0xc(%ebp),%esp
107dbb: 5b pop %ebx
107dbc: 5e pop %esi
107dbd: 5f pop %edi
107dbe: c9 leave
107dbf: c3 ret
if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
rtems_filesystem_freenode( &loc );
return RTEMS_UNSATISFIED;
}
device_info->device_name = (char *) name;
107dc0: 8b 7d 0c mov 0xc(%ebp),%edi
107dc3: 89 37 mov %esi,(%edi)
device_info->device_name_length = strlen( name );
107dc5: b9 ff ff ff ff mov $0xffffffff,%ecx
107dca: 89 f7 mov %esi,%edi
107dcc: 31 c0 xor %eax,%eax
107dce: f2 ae repnz scas %es:(%edi),%al
107dd0: f7 d1 not %ecx
107dd2: 49 dec %ecx
107dd3: 8b 45 0c mov 0xc(%ebp),%eax
107dd6: 89 48 04 mov %ecx,0x4(%eax)
device_info->major = the_jnode->info.device.major;
107dd9: 8b 55 c4 mov -0x3c(%ebp),%edx
107ddc: 8b 42 50 mov 0x50(%edx),%eax
107ddf: 8b 7d 0c mov 0xc(%ebp),%edi
107de2: 89 47 08 mov %eax,0x8(%edi)
device_info->minor = the_jnode->info.device.minor;
107de5: 8b 42 54 mov 0x54(%edx),%eax
107de8: 89 47 0c mov %eax,0xc(%edi)
rtems_filesystem_freenode( &loc );
107deb: 83 ec 0c sub $0xc,%esp
107dee: 53 push %ebx
107def: e8 ac 02 00 00 call 1080a0 <rtems_filesystem_freenode>
return RTEMS_SUCCESSFUL;
107df4: 83 c4 10 add $0x10,%esp
107df7: 31 c0 xor %eax,%eax
107df9: eb bd jmp 107db8 <rtems_io_lookup_name+0x58>
00113078 <rtems_io_open>:
rtems_status_code rtems_io_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
113078: 55 push %ebp
113079: 89 e5 mov %esp,%ebp
11307b: 53 push %ebx
11307c: 83 ec 04 sub $0x4,%esp
11307f: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
113082: 39 05 e0 88 12 00 cmp %eax,0x1288e0
113088: 76 1a jbe 1130a4 <rtems_io_open+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].open_entry;
11308a: 8d 14 40 lea (%eax,%eax,2),%edx
11308d: c1 e2 03 shl $0x3,%edx
113090: 03 15 e4 88 12 00 add 0x1288e4,%edx
113096: 8b 52 04 mov 0x4(%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113099: 85 d2 test %edx,%edx
11309b: 74 13 je 1130b0 <rtems_io_open+0x38>
}
11309d: 59 pop %ecx
11309e: 5b pop %ebx
11309f: c9 leave
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].open_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
1130a0: ff e2 jmp *%edx
1130a2: 66 90 xchg %ax,%ax
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
1130a4: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].open_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
1130a9: 5a pop %edx
1130aa: 5b pop %ebx
1130ab: c9 leave
1130ac: c3 ret
1130ad: 8d 76 00 lea 0x0(%esi),%esi
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].open_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
1130b0: 31 c0 xor %eax,%eax
}
1130b2: 5a pop %edx
1130b3: 5b pop %ebx
1130b4: c9 leave
1130b5: c3 ret
001130b8 <rtems_io_read>:
rtems_status_code rtems_io_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
1130b8: 55 push %ebp
1130b9: 89 e5 mov %esp,%ebp
1130bb: 53 push %ebx
1130bc: 83 ec 04 sub $0x4,%esp
1130bf: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
1130c2: 39 05 e0 88 12 00 cmp %eax,0x1288e0
1130c8: 76 1a jbe 1130e4 <rtems_io_read+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].read_entry;
1130ca: 8d 14 40 lea (%eax,%eax,2),%edx
1130cd: c1 e2 03 shl $0x3,%edx
1130d0: 03 15 e4 88 12 00 add 0x1288e4,%edx
1130d6: 8b 52 0c mov 0xc(%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
1130d9: 85 d2 test %edx,%edx
1130db: 74 13 je 1130f0 <rtems_io_read+0x38>
}
1130dd: 59 pop %ecx
1130de: 5b pop %ebx
1130df: c9 leave
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].read_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
1130e0: ff e2 jmp *%edx
1130e2: 66 90 xchg %ax,%ax
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
1130e4: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].read_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
1130e9: 5a pop %edx
1130ea: 5b pop %ebx
1130eb: c9 leave
1130ec: c3 ret
1130ed: 8d 76 00 lea 0x0(%esi),%esi
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].read_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
1130f0: 31 c0 xor %eax,%eax
}
1130f2: 5a pop %edx
1130f3: 5b pop %ebx
1130f4: c9 leave
1130f5: c3 ret
0010cecc <rtems_io_register_driver>:
rtems_status_code rtems_io_register_driver(
rtems_device_major_number major,
const rtems_driver_address_table *driver_table,
rtems_device_major_number *registered_major
)
{
10cecc: 55 push %ebp
10cecd: 89 e5 mov %esp,%ebp
10cecf: 57 push %edi
10ced0: 56 push %esi
10ced1: 53 push %ebx
10ced2: 83 ec 0c sub $0xc,%esp
10ced5: 8b 5d 08 mov 0x8(%ebp),%ebx
10ced8: 8b 75 0c mov 0xc(%ebp),%esi
10cedb: 8b 55 10 mov 0x10(%ebp),%edx
rtems_device_major_number major_limit = _IO_Number_of_drivers;
10cede: a1 c0 c5 12 00 mov 0x12c5c0,%eax
if ( rtems_interrupt_is_in_progress() )
10cee3: 8b 0d f4 c0 12 00 mov 0x12c0f4,%ecx
10cee9: 85 c9 test %ecx,%ecx
10ceeb: 0f 85 ab 00 00 00 jne 10cf9c <rtems_io_register_driver+0xd0>
return RTEMS_CALLED_FROM_ISR;
if ( registered_major == NULL )
10cef1: 85 d2 test %edx,%edx
10cef3: 0f 84 e7 00 00 00 je 10cfe0 <rtems_io_register_driver+0x114>
return RTEMS_INVALID_ADDRESS;
/* Set it to an invalid value */
*registered_major = major_limit;
10cef9: 89 02 mov %eax,(%edx)
if ( driver_table == NULL )
10cefb: 85 f6 test %esi,%esi
10cefd: 0f 84 dd 00 00 00 je 10cfe0 <rtems_io_register_driver+0x114>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
10cf03: 8b 3e mov (%esi),%edi
10cf05: 85 ff test %edi,%edi
10cf07: 0f 84 c7 00 00 00 je 10cfd4 <rtems_io_register_driver+0x108>
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
10cf0d: 39 d8 cmp %ebx,%eax
10cf0f: 76 7b jbe 10cf8c <rtems_io_register_driver+0xc0>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10cf11: a1 10 bb 12 00 mov 0x12bb10,%eax
10cf16: 40 inc %eax
10cf17: a3 10 bb 12 00 mov %eax,0x12bb10
return RTEMS_INVALID_NUMBER;
_Thread_Disable_dispatch();
if ( major == 0 ) {
10cf1c: 85 db test %ebx,%ebx
10cf1e: 0f 85 88 00 00 00 jne 10cfac <rtems_io_register_driver+0xe0>
static rtems_status_code rtems_io_obtain_major_number(
rtems_device_major_number *major
)
{
rtems_device_major_number n = _IO_Number_of_drivers;
10cf24: 8b 0d c0 c5 12 00 mov 0x12c5c0,%ecx
rtems_device_major_number m = 0;
/* major is error checked by caller */
for ( m = 0; m < n; ++m ) {
10cf2a: 85 c9 test %ecx,%ecx
10cf2c: 0f 84 bb 00 00 00 je 10cfed <rtems_io_register_driver+0x121><== NEVER TAKEN
10cf32: 8b 3d c4 c5 12 00 mov 0x12c5c4,%edi
10cf38: 89 f8 mov %edi,%eax
10cf3a: eb 08 jmp 10cf44 <rtems_io_register_driver+0x78>
10cf3c: 43 inc %ebx
10cf3d: 83 c0 18 add $0x18,%eax
10cf40: 39 d9 cmp %ebx,%ecx
10cf42: 76 0b jbe 10cf4f <rtems_io_register_driver+0x83>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
10cf44: 83 38 00 cmpl $0x0,(%eax)
10cf47: 75 f3 jne 10cf3c <rtems_io_register_driver+0x70>
10cf49: 83 78 04 00 cmpl $0x0,0x4(%eax)
10cf4d: 75 ed jne 10cf3c <rtems_io_register_driver+0x70>
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
10cf4f: 89 1a mov %ebx,(%edx)
if ( m != n )
10cf51: 39 d9 cmp %ebx,%ecx
10cf53: 0f 84 9b 00 00 00 je 10cff4 <rtems_io_register_driver+0x128>
10cf59: 8d 04 5b lea (%ebx,%ebx,2),%eax
10cf5c: c1 e0 03 shl $0x3,%eax
}
*registered_major = major;
}
_IO_Driver_address_table [major] = *driver_table;
10cf5f: 01 c7 add %eax,%edi
10cf61: b9 06 00 00 00 mov $0x6,%ecx
10cf66: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
_Thread_Enable_dispatch();
10cf68: e8 a3 1c 00 00 call 10ec10 <_Thread_Enable_dispatch>
return rtems_io_initialize( major, 0, NULL );
10cf6d: c7 45 10 00 00 00 00 movl $0x0,0x10(%ebp)
10cf74: c7 45 0c 00 00 00 00 movl $0x0,0xc(%ebp)
10cf7b: 89 5d 08 mov %ebx,0x8(%ebp)
}
10cf7e: 83 c4 0c add $0xc,%esp
10cf81: 5b pop %ebx
10cf82: 5e pop %esi
10cf83: 5f pop %edi
10cf84: c9 leave
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
10cf85: e9 36 7e 00 00 jmp 114dc0 <rtems_io_initialize>
10cf8a: 66 90 xchg %ax,%ax
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
return RTEMS_INVALID_NUMBER;
10cf8c: b8 0a 00 00 00 mov $0xa,%eax
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
10cf91: 83 c4 0c add $0xc,%esp
10cf94: 5b pop %ebx
10cf95: 5e pop %esi
10cf96: 5f pop %edi
10cf97: c9 leave
10cf98: c3 ret
10cf99: 8d 76 00 lea 0x0(%esi),%esi
)
{
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
10cf9c: b8 12 00 00 00 mov $0x12,%eax
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
10cfa1: 83 c4 0c add $0xc,%esp
10cfa4: 5b pop %ebx
10cfa5: 5e pop %esi
10cfa6: 5f pop %edi
10cfa7: c9 leave
10cfa8: c3 ret
10cfa9: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Enable_dispatch();
return sc;
}
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
10cfac: 8d 04 5b lea (%ebx,%ebx,2),%eax
10cfaf: c1 e0 03 shl $0x3,%eax
10cfb2: 8b 0d c4 c5 12 00 mov 0x12c5c4,%ecx
10cfb8: 01 c1 add %eax,%ecx
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
10cfba: 8b 39 mov (%ecx),%edi
10cfbc: 85 ff test %edi,%edi
10cfbe: 74 40 je 10d000 <rtems_io_register_driver+0x134>
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
10cfc0: e8 4b 1c 00 00 call 10ec10 <_Thread_Enable_dispatch>
return RTEMS_RESOURCE_IN_USE;
10cfc5: b8 0c 00 00 00 mov $0xc,%eax
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
10cfca: 83 c4 0c add $0xc,%esp
10cfcd: 5b pop %ebx
10cfce: 5e pop %esi
10cfcf: 5f pop %edi
10cfd0: c9 leave
10cfd1: c3 ret
10cfd2: 66 90 xchg %ax,%ax
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
10cfd4: 8b 4e 04 mov 0x4(%esi),%ecx
10cfd7: 85 c9 test %ecx,%ecx
10cfd9: 0f 85 2e ff ff ff jne 10cf0d <rtems_io_register_driver+0x41>
10cfdf: 90 nop
if ( driver_table == NULL )
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
10cfe0: b8 09 00 00 00 mov $0x9,%eax
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
10cfe5: 83 c4 0c add $0xc,%esp
10cfe8: 5b pop %ebx
10cfe9: 5e pop %esi
10cfea: 5f pop %edi
10cfeb: c9 leave
10cfec: c3 ret
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
10cfed: c7 02 00 00 00 00 movl $0x0,(%edx) <== NOT EXECUTED
10cff3: 90 nop <== NOT EXECUTED
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
10cff4: e8 17 1c 00 00 call 10ec10 <_Thread_Enable_dispatch>
*major = m;
if ( m != n )
return RTEMS_SUCCESSFUL;
return RTEMS_TOO_MANY;
10cff9: b8 05 00 00 00 mov $0x5,%eax
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
return sc;
10cffe: eb 91 jmp 10cf91 <rtems_io_register_driver+0xc5>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
10d000: 8b 49 04 mov 0x4(%ecx),%ecx
10d003: 85 c9 test %ecx,%ecx
10d005: 75 b9 jne 10cfc0 <rtems_io_register_driver+0xf4>
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
*registered_major = major;
10d007: 89 1a mov %ebx,(%edx)
10d009: 8b 3d c4 c5 12 00 mov 0x12c5c4,%edi
10d00f: e9 4b ff ff ff jmp 10cf5f <rtems_io_register_driver+0x93>
0010d014 <rtems_io_unregister_driver>:
*/
rtems_status_code rtems_io_unregister_driver(
rtems_device_major_number major
)
{
10d014: 55 push %ebp
10d015: 89 e5 mov %esp,%ebp
10d017: 57 push %edi
10d018: 83 ec 04 sub $0x4,%esp
10d01b: 8b 45 08 mov 0x8(%ebp),%eax
if ( rtems_interrupt_is_in_progress() )
10d01e: 8b 0d f4 c0 12 00 mov 0x12c0f4,%ecx
10d024: 85 c9 test %ecx,%ecx
10d026: 75 44 jne 10d06c <rtems_io_unregister_driver+0x58>
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
10d028: 39 05 c0 c5 12 00 cmp %eax,0x12c5c0
10d02e: 77 0c ja 10d03c <rtems_io_unregister_driver+0x28>
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
return RTEMS_UNSATISFIED;
10d030: b8 0d 00 00 00 mov $0xd,%eax
}
10d035: 5a pop %edx
10d036: 5f pop %edi
10d037: c9 leave
10d038: c3 ret
10d039: 8d 76 00 lea 0x0(%esi),%esi
10d03c: 8b 15 10 bb 12 00 mov 0x12bb10,%edx
10d042: 42 inc %edx
10d043: 89 15 10 bb 12 00 mov %edx,0x12bb10
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
_Thread_Disable_dispatch();
memset(
&_IO_Driver_address_table[major],
10d049: 8d 14 40 lea (%eax,%eax,2),%edx
10d04c: c1 e2 03 shl $0x3,%edx
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
_Thread_Disable_dispatch();
memset(
10d04f: 03 15 c4 c5 12 00 add 0x12c5c4,%edx
10d055: b9 18 00 00 00 mov $0x18,%ecx
10d05a: 31 c0 xor %eax,%eax
10d05c: 89 d7 mov %edx,%edi
10d05e: f3 aa rep stos %al,%es:(%edi)
&_IO_Driver_address_table[major],
0,
sizeof( rtems_driver_address_table )
);
_Thread_Enable_dispatch();
10d060: e8 ab 1b 00 00 call 10ec10 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10d065: 31 c0 xor %eax,%eax
}
return RTEMS_UNSATISFIED;
}
10d067: 5a pop %edx
10d068: 5f pop %edi
10d069: c9 leave
10d06a: c3 ret
10d06b: 90 nop
rtems_status_code rtems_io_unregister_driver(
rtems_device_major_number major
)
{
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
10d06c: b8 12 00 00 00 mov $0x12,%eax
return RTEMS_SUCCESSFUL;
}
return RTEMS_UNSATISFIED;
}
10d071: 5a pop %edx
10d072: 5f pop %edi
10d073: c9 leave
10d074: c3 ret
001130f8 <rtems_io_write>:
rtems_status_code rtems_io_write(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
1130f8: 55 push %ebp
1130f9: 89 e5 mov %esp,%ebp
1130fb: 53 push %ebx
1130fc: 83 ec 04 sub $0x4,%esp
1130ff: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
113102: 39 05 e0 88 12 00 cmp %eax,0x1288e0
113108: 76 1a jbe 113124 <rtems_io_write+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].write_entry;
11310a: 8d 14 40 lea (%eax,%eax,2),%edx
11310d: c1 e2 03 shl $0x3,%edx
113110: 03 15 e4 88 12 00 add 0x1288e4,%edx
113116: 8b 52 10 mov 0x10(%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113119: 85 d2 test %edx,%edx
11311b: 74 13 je 113130 <rtems_io_write+0x38>
}
11311d: 59 pop %ecx
11311e: 5b pop %ebx
11311f: c9 leave
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].write_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113120: ff e2 jmp *%edx
113122: 66 90 xchg %ax,%ax
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
113124: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].write_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
113129: 5a pop %edx
11312a: 5b pop %ebx
11312b: c9 leave
11312c: c3 ret
11312d: 8d 76 00 lea 0x0(%esi),%esi
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].write_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113130: 31 c0 xor %eax,%eax
}
113132: 5a pop %edx
113133: 5b pop %ebx
113134: c9 leave
113135: c3 ret
0010dfbc <rtems_iterate_over_all_threads>:
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
{
10dfbc: 55 push %ebp
10dfbd: 89 e5 mov %esp,%ebp
10dfbf: 57 push %edi
10dfc0: 56 push %esi
10dfc1: 53 push %ebx
10dfc2: 83 ec 1c sub $0x1c,%esp
10dfc5: 8b 7d 08 mov 0x8(%ebp),%edi
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
10dfc8: 85 ff test %edi,%edi
10dfca: 74 49 je 10e015 <rtems_iterate_over_all_threads+0x59><== NEVER TAKEN
10dfcc: c7 45 e4 01 00 00 00 movl $0x1,-0x1c(%ebp)
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
10dfd3: 8b 55 e4 mov -0x1c(%ebp),%edx
10dfd6: 8b 04 95 28 34 13 00 mov 0x133428(,%edx,4),%eax
10dfdd: 8b 70 04 mov 0x4(%eax),%esi
if ( !information )
10dfe0: 85 f6 test %esi,%esi
10dfe2: 74 28 je 10e00c <rtems_iterate_over_all_threads+0x50>
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
10dfe4: 66 83 7e 10 00 cmpw $0x0,0x10(%esi)
10dfe9: 74 21 je 10e00c <rtems_iterate_over_all_threads+0x50>
10dfeb: bb 01 00 00 00 mov $0x1,%ebx
the_thread = (Thread_Control *)information->local_table[ i ];
10dff0: 8b 46 1c mov 0x1c(%esi),%eax
10dff3: 8b 04 98 mov (%eax,%ebx,4),%eax
if ( !the_thread )
10dff6: 85 c0 test %eax,%eax
10dff8: 74 09 je 10e003 <rtems_iterate_over_all_threads+0x47><== NEVER TAKEN
continue;
(*routine)(the_thread);
10dffa: 83 ec 0c sub $0xc,%esp
10dffd: 50 push %eax
10dffe: ff d7 call *%edi
10e000: 83 c4 10 add $0x10,%esp
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
10e003: 43 inc %ebx
10e004: 0f b7 46 10 movzwl 0x10(%esi),%eax
10e008: 39 d8 cmp %ebx,%eax
10e00a: 73 e4 jae 10dff0 <rtems_iterate_over_all_threads+0x34>
Objects_Information *information;
if ( !routine )
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
10e00c: ff 45 e4 incl -0x1c(%ebp)
10e00f: 83 7d e4 04 cmpl $0x4,-0x1c(%ebp)
10e013: 75 be jne 10dfd3 <rtems_iterate_over_all_threads+0x17>
(*routine)(the_thread);
}
}
}
10e015: 8d 65 f4 lea -0xc(%ebp),%esp
10e018: 5b pop %ebx
10e019: 5e pop %esi
10e01a: 5f pop %edi
10e01b: c9 leave
10e01c: c3 ret
0010fe7c <rtems_libio_free>:
*/
void rtems_libio_free(
rtems_libio_t *iop
)
{
10fe7c: 55 push %ebp
10fe7d: 89 e5 mov %esp,%ebp
10fe7f: 53 push %ebx
10fe80: 83 ec 08 sub $0x8,%esp
10fe83: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
10fe86: 6a 00 push $0x0
10fe88: 6a 00 push $0x0
10fe8a: ff 35 c8 7c 12 00 pushl 0x127cc8
10fe90: e8 1b b8 ff ff call 10b6b0 <rtems_semaphore_obtain>
rtems_libio_lock();
if (iop->sem)
10fe95: 8b 43 2c mov 0x2c(%ebx),%eax
10fe98: 83 c4 10 add $0x10,%esp
10fe9b: 85 c0 test %eax,%eax
10fe9d: 74 0c je 10feab <rtems_libio_free+0x2f> <== NEVER TAKEN
rtems_semaphore_delete(iop->sem);
10fe9f: 83 ec 0c sub $0xc,%esp
10fea2: 50 push %eax
10fea3: e8 64 b7 ff ff call 10b60c <rtems_semaphore_delete>
10fea8: 83 c4 10 add $0x10,%esp
iop->flags &= ~LIBIO_FLAGS_OPEN;
10feab: 81 63 14 ff fe ff ff andl $0xfffffeff,0x14(%ebx)
iop->data1 = rtems_libio_iop_freelist;
10feb2: a1 c4 7c 12 00 mov 0x127cc4,%eax
10feb7: 89 43 34 mov %eax,0x34(%ebx)
rtems_libio_iop_freelist = iop;
10feba: 89 1d c4 7c 12 00 mov %ebx,0x127cc4
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
10fec0: a1 c8 7c 12 00 mov 0x127cc8,%eax
10fec5: 89 45 08 mov %eax,0x8(%ebp)
rtems_libio_unlock();
}
10fec8: 8b 5d fc mov -0x4(%ebp),%ebx
10fecb: c9 leave
10fecc: e9 db b8 ff ff jmp 10b7ac <rtems_semaphore_release>
001081b0 <rtems_libio_init>:
*
* Called by BSP startup code to initialize the libio subsystem.
*/
void rtems_libio_init( void )
{
1081b0: 55 push %ebp
1081b1: 89 e5 mov %esp,%ebp
1081b3: 53 push %ebx
1081b4: 83 ec 04 sub $0x4,%esp
rtems_status_code rc;
uint32_t i;
rtems_libio_t *iop;
if (rtems_libio_number_iops > 0)
1081b7: 8b 1d 2c 3a 12 00 mov 0x123a2c,%ebx
1081bd: 85 db test %ebx,%ebx
1081bf: 74 50 je 108211 <rtems_libio_init+0x61> <== NEVER TAKEN
{
rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops,
1081c1: 83 ec 08 sub $0x8,%esp
1081c4: 6a 38 push $0x38
1081c6: 53 push %ebx
1081c7: e8 58 fd ff ff call 107f24 <calloc>
1081cc: 89 c2 mov %eax,%edx
1081ce: a3 c0 7c 12 00 mov %eax,0x127cc0
sizeof(rtems_libio_t));
if (rtems_libio_iops == NULL)
1081d3: 83 c4 10 add $0x10,%esp
1081d6: 85 c0 test %eax,%eax
1081d8: 74 74 je 10824e <rtems_libio_init+0x9e>
rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
iop = rtems_libio_iop_freelist = rtems_libio_iops;
1081da: a3 c4 7c 12 00 mov %eax,0x127cc4
for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++)
1081df: 83 fb 01 cmp $0x1,%ebx
1081e2: 76 26 jbe 10820a <rtems_libio_init+0x5a> <== NEVER TAKEN
* rtems_libio_init
*
* Called by BSP startup code to initialize the libio subsystem.
*/
void rtems_libio_init( void )
1081e4: 8d 50 38 lea 0x38(%eax),%edx
1081e7: b9 01 00 00 00 mov $0x1,%ecx
if (rtems_libio_iops == NULL)
rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
iop = rtems_libio_iop_freelist = rtems_libio_iops;
for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++)
iop->data1 = iop + 1;
1081ec: 89 52 fc mov %edx,-0x4(%edx)
1081ef: 41 inc %ecx
1081f0: 83 c2 38 add $0x38,%edx
sizeof(rtems_libio_t));
if (rtems_libio_iops == NULL)
rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
iop = rtems_libio_iop_freelist = rtems_libio_iops;
for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++)
1081f3: 39 d9 cmp %ebx,%ecx
1081f5: 75 f5 jne 1081ec <rtems_libio_init+0x3c>
* rtems_libio_init
*
* Called by BSP startup code to initialize the libio subsystem.
*/
void rtems_libio_init( void )
1081f7: 8d 0c cd f8 ff ff ff lea -0x8(,%ecx,8),%ecx
1081fe: 8d 14 cd 00 00 00 00 lea 0x0(,%ecx,8),%edx
108205: 29 ca sub %ecx,%edx
sizeof(rtems_libio_t));
if (rtems_libio_iops == NULL)
rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
iop = rtems_libio_iop_freelist = rtems_libio_iops;
for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++)
108207: 8d 14 10 lea (%eax,%edx,1),%edx
iop->data1 = iop + 1;
iop->data1 = NULL;
10820a: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
/*
* Create the binary semaphore used to provide mutual exclusion
* on the IOP Table.
*/
rc = rtems_semaphore_create(
108211: 83 ec 0c sub $0xc,%esp
108214: 68 c8 7c 12 00 push $0x127cc8
108219: 6a 00 push $0x0
10821b: 6a 54 push $0x54
10821d: 6a 01 push $0x1
10821f: 68 4f 49 42 4c push $0x4c42494f
108224: e8 0b 32 00 00 call 10b434 <rtems_semaphore_create>
1,
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&rtems_libio_semaphore
);
if ( rc != RTEMS_SUCCESSFUL )
108229: 83 c4 20 add $0x20,%esp
10822c: 85 c0 test %eax,%eax
10822e: 75 15 jne 108245 <rtems_libio_init+0x95> <== NEVER TAKEN
/*
* Initialize the base file system infrastructure.
*/
if (rtems_fs_init_helper)
108230: a1 28 3a 12 00 mov 0x123a28,%eax
108235: 85 c0 test %eax,%eax
108237: 74 07 je 108240 <rtems_libio_init+0x90> <== NEVER TAKEN
(* rtems_fs_init_helper)();
}
108239: 8b 5d fc mov -0x4(%ebp),%ebx
10823c: c9 leave
/*
* Initialize the base file system infrastructure.
*/
if (rtems_fs_init_helper)
(* rtems_fs_init_helper)();
10823d: ff e0 jmp *%eax
10823f: 90 nop
}
108240: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
108243: c9 leave <== NOT EXECUTED
108244: c3 ret <== NOT EXECUTED
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&rtems_libio_semaphore
);
if ( rc != RTEMS_SUCCESSFUL )
rtems_fatal_error_occurred( rc );
108245: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
108248: 50 push %eax <== NOT EXECUTED
108249: e8 b2 3a 00 00 call 10bd00 <rtems_fatal_error_occurred><== NOT EXECUTED
if (rtems_libio_number_iops > 0)
{
rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops,
sizeof(rtems_libio_t));
if (rtems_libio_iops == NULL)
rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
10824e: 83 ec 0c sub $0xc,%esp
108251: 6a 1a push $0x1a
108253: e8 a8 3a 00 00 call 10bd00 <rtems_fatal_error_occurred>
0010ff38 <rtems_libio_is_file_open>:
*/
int rtems_libio_is_file_open(
void *node_access
)
{
10ff38: 55 push %ebp
10ff39: 89 e5 mov %esp,%ebp
10ff3b: 53 push %ebx
10ff3c: 83 ec 08 sub $0x8,%esp
10ff3f: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
10ff42: 6a 00 push $0x0
10ff44: 6a 00 push $0x0
10ff46: ff 35 c8 7c 12 00 pushl 0x127cc8
10ff4c: e8 5f b7 ff ff call 10b6b0 <rtems_semaphore_obtain>
/*
* Look for any active file descriptor entry.
*/
for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){
10ff51: a1 c0 7c 12 00 mov 0x127cc0,%eax
10ff56: 8b 0d 2c 3a 12 00 mov 0x123a2c,%ecx
10ff5c: 83 c4 10 add $0x10,%esp
10ff5f: 85 c9 test %ecx,%ecx
10ff61: 74 18 je 10ff7b <rtems_libio_is_file_open+0x43><== NEVER TAKEN
10ff63: 31 d2 xor %edx,%edx
10ff65: eb 04 jmp 10ff6b <rtems_libio_is_file_open+0x33>
10ff67: 90 nop
10ff68: 83 c0 38 add $0x38,%eax
if ((iop->flags & LIBIO_FLAGS_OPEN) != 0) {
10ff6b: f6 40 15 01 testb $0x1,0x15(%eax)
10ff6f: 74 05 je 10ff76 <rtems_libio_is_file_open+0x3e>
/*
* Check if this node is under the file system that we
* are trying to dismount.
*/
if ( iop->pathinfo.node_access == node_access ) {
10ff71: 39 58 18 cmp %ebx,0x18(%eax)
10ff74: 74 1e je 10ff94 <rtems_libio_is_file_open+0x5c>
/*
* Look for any active file descriptor entry.
*/
for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){
10ff76: 42 inc %edx
10ff77: 39 ca cmp %ecx,%edx
10ff79: 72 ed jb 10ff68 <rtems_libio_is_file_open+0x30>
int rtems_libio_is_file_open(
void *node_access
)
{
rtems_libio_t *iop;
int result=0;
10ff7b: 31 db xor %ebx,%ebx
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
10ff7d: 83 ec 0c sub $0xc,%esp
10ff80: ff 35 c8 7c 12 00 pushl 0x127cc8
10ff86: e8 21 b8 ff ff call 10b7ac <rtems_semaphore_release>
}
rtems_libio_unlock();
return result;
}
10ff8b: 89 d8 mov %ebx,%eax
10ff8d: 8b 5d fc mov -0x4(%ebp),%ebx
10ff90: c9 leave
10ff91: c3 ret
10ff92: 66 90 xchg %ax,%ax
* Check if this node is under the file system that we
* are trying to dismount.
*/
if ( iop->pathinfo.node_access == node_access ) {
result = 1;
10ff94: bb 01 00 00 00 mov $0x1,%ebx
10ff99: eb e2 jmp 10ff7d <rtems_libio_is_file_open+0x45>
0010fed4 <rtems_libio_is_open_files_in_fs>:
*/
int rtems_libio_is_open_files_in_fs(
rtems_filesystem_mount_table_entry_t * fs_mt_entry
)
{
10fed4: 55 push %ebp
10fed5: 89 e5 mov %esp,%ebp
10fed7: 53 push %ebx
10fed8: 83 ec 08 sub $0x8,%esp
10fedb: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
10fede: 6a 00 push $0x0
10fee0: 6a 00 push $0x0
10fee2: ff 35 c8 7c 12 00 pushl 0x127cc8
10fee8: e8 c3 b7 ff ff call 10b6b0 <rtems_semaphore_obtain>
/*
* Look for any active file descriptor entry.
*/
for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){
10feed: a1 c0 7c 12 00 mov 0x127cc0,%eax
10fef2: 8b 0d 2c 3a 12 00 mov 0x123a2c,%ecx
10fef8: 83 c4 10 add $0x10,%esp
10fefb: 85 c9 test %ecx,%ecx
10fefd: 74 18 je 10ff17 <rtems_libio_is_open_files_in_fs+0x43><== NEVER TAKEN
10feff: 31 d2 xor %edx,%edx
10ff01: eb 04 jmp 10ff07 <rtems_libio_is_open_files_in_fs+0x33>
10ff03: 90 nop
10ff04: 83 c0 38 add $0x38,%eax
if ((iop->flags & LIBIO_FLAGS_OPEN) != 0) {
10ff07: f6 40 15 01 testb $0x1,0x15(%eax)
10ff0b: 74 05 je 10ff12 <rtems_libio_is_open_files_in_fs+0x3e>
/*
* Check if this node is under the file system that we
* are trying to dismount.
*/
if ( iop->pathinfo.mt_entry == fs_mt_entry ) {
10ff0d: 39 58 28 cmp %ebx,0x28(%eax)
10ff10: 74 1e je 10ff30 <rtems_libio_is_open_files_in_fs+0x5c>
/*
* Look for any active file descriptor entry.
*/
for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){
10ff12: 42 inc %edx
10ff13: 39 ca cmp %ecx,%edx
10ff15: 72 ed jb 10ff04 <rtems_libio_is_open_files_in_fs+0x30>
int rtems_libio_is_open_files_in_fs(
rtems_filesystem_mount_table_entry_t * fs_mt_entry
)
{
rtems_libio_t *iop;
int result = 0;
10ff17: 31 db xor %ebx,%ebx
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
10ff19: 83 ec 0c sub $0xc,%esp
10ff1c: ff 35 c8 7c 12 00 pushl 0x127cc8
10ff22: e8 85 b8 ff ff call 10b7ac <rtems_semaphore_release>
}
rtems_libio_unlock();
return result;
}
10ff27: 89 d8 mov %ebx,%eax
10ff29: 8b 5d fc mov -0x4(%ebp),%ebx
10ff2c: c9 leave
10ff2d: c3 ret
10ff2e: 66 90 xchg %ax,%ax
* Check if this node is under the file system that we
* are trying to dismount.
*/
if ( iop->pathinfo.mt_entry == fs_mt_entry ) {
result = 1;
10ff30: bb 01 00 00 00 mov $0x1,%ebx
10ff35: eb e2 jmp 10ff19 <rtems_libio_is_open_files_in_fs+0x45>
00109590 <rtems_libio_set_private_env>:
rtems_status_code rtems_libio_set_private_env(void)
{
109590: 55 push %ebp
109591: 89 e5 mov %esp,%ebp
109593: 57 push %edi
109594: 56 push %esi
109595: 53 push %ebx
109596: 83 ec 5c sub $0x5c,%esp
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_id task_id = rtems_task_self();
109599: e8 0e 2e 00 00 call 10c3ac <rtems_task_self>
10959e: 89 45 b4 mov %eax,-0x4c(%ebp)
rtems_filesystem_location_info_t root_loc;
rtems_filesystem_location_info_t current_loc;
rtems_user_env_t *new_env = NULL;
int rv = 0;
rv = rtems_filesystem_evaluate_path("/", 1, 0, &root_loc, 0);
1095a1: 83 ec 0c sub $0xc,%esp
1095a4: 6a 00 push $0x0
1095a6: 8d 5d d4 lea -0x2c(%ebp),%ebx
1095a9: 53 push %ebx
1095aa: 6a 00 push $0x0
1095ac: 6a 01 push $0x1
1095ae: 68 e7 1c 12 00 push $0x121ce7
1095b3: e8 50 ee ff ff call 108408 <rtems_filesystem_evaluate_path>
if (rv != 0)
1095b8: 83 c4 20 add $0x20,%esp
1095bb: 85 c0 test %eax,%eax
1095bd: 74 0d je 1095cc <rtems_libio_set_private_env+0x3c><== ALWAYS TAKEN
error_1:
rtems_filesystem_freenode(&root_loc);
error_0:
return RTEMS_NO_MEMORY;
1095bf: b8 1a 00 00 00 mov $0x1a,%eax
}
1095c4: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
1095c7: 5b pop %ebx <== NOT EXECUTED
1095c8: 5e pop %esi <== NOT EXECUTED
1095c9: 5f pop %edi <== NOT EXECUTED
1095ca: c9 leave <== NOT EXECUTED
1095cb: c3 ret <== NOT EXECUTED
rv = rtems_filesystem_evaluate_path("/", 1, 0, &root_loc, 0);
if (rv != 0)
goto error_0;
rv = rtems_filesystem_evaluate_path("/", 1, 0, ¤t_loc, 0);
1095cc: 83 ec 0c sub $0xc,%esp
1095cf: 6a 00 push $0x0
1095d1: 8d 45 c0 lea -0x40(%ebp),%eax
1095d4: 89 45 a4 mov %eax,-0x5c(%ebp)
1095d7: 50 push %eax
1095d8: 6a 00 push $0x0
1095da: 6a 01 push $0x1
1095dc: 68 e7 1c 12 00 push $0x121ce7
1095e1: e8 22 ee ff ff call 108408 <rtems_filesystem_evaluate_path>
if (rv != 0)
1095e6: 83 c4 20 add $0x20,%esp
1095e9: 85 c0 test %eax,%eax
1095eb: 0f 85 9a 00 00 00 jne 10968b <rtems_libio_set_private_env+0xfb><== NEVER TAKEN
* Bharath: I'm not sure if the check can be reduced to
* if( rtems_current_user_env->task_id != task_id ) {
*/
if (
rtems_current_user_env == &rtems_global_user_env
1095f1: 8b 15 30 63 12 00 mov 0x126330,%edx
/*
* Bharath: I'm not sure if the check can be reduced to
* if( rtems_current_user_env->task_id != task_id ) {
*/
if (
1095f7: 81 fa 20 86 12 00 cmp $0x128620,%edx
1095fd: 74 07 je 109606 <rtems_libio_set_private_env+0x76>
rtems_current_user_env == &rtems_global_user_env
|| rtems_current_user_env->task_id != task_id
1095ff: 8b 45 b4 mov -0x4c(%ebp),%eax
109602: 39 02 cmp %eax,(%edx)
109604: 74 3a je 109640 <rtems_libio_set_private_env+0xb0>
) {
new_env = malloc(sizeof(rtems_user_env_t));
109606: 83 ec 0c sub $0xc,%esp
109609: 6a 48 push $0x48
10960b: e8 14 f4 ff ff call 108a24 <malloc>
109610: 89 c2 mov %eax,%edx
109612: 89 c6 mov %eax,%esi
if (new_env == NULL)
109614: 83 c4 10 add $0x10,%esp
109617: 85 c0 test %eax,%eax
109619: 74 61 je 10967c <rtems_libio_set_private_env+0xec>
#ifdef HAVE_USERENV_REFCNT
new_env->refcnt = 1;
#endif
sc = rtems_task_variable_add(
10961b: 50 push %eax
10961c: 68 50 95 10 00 push $0x109550
109621: 68 30 63 12 00 push $0x126330
109626: 6a 00 push $0x0
109628: 89 55 b0 mov %edx,-0x50(%ebp)
10962b: e8 00 2e 00 00 call 10c430 <rtems_task_variable_add>
RTEMS_SELF,
(void*)&rtems_current_user_env,
(void(*)(void *))free_user_env
);
if (sc != RTEMS_SUCCESSFUL)
109630: 83 c4 10 add $0x10,%esp
109633: 85 c0 test %eax,%eax
109635: 8b 55 b0 mov -0x50(%ebp),%edx
109638: 75 36 jne 109670 <rtems_libio_set_private_env+0xe0>
goto error_3;
rtems_current_user_env = new_env;
10963a: 89 15 30 63 12 00 mov %edx,0x126330
}
/* Inherit the global values */
*rtems_current_user_env = rtems_global_user_env;
109640: be 20 86 12 00 mov $0x128620,%esi
109645: b9 12 00 00 00 mov $0x12,%ecx
10964a: 89 d7 mov %edx,%edi
10964c: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
rtems_current_user_env->task_id = task_id;
10964e: 8b 75 b4 mov -0x4c(%ebp),%esi
109651: 89 32 mov %esi,(%edx)
* Clone the pathlocs. In contrast to most other code we must _not_ free the
* original locs because what we are trying to do here is forking off clones.
* The reason is a pathloc can be allocated by the file system and needs to
* be freed when deleting the environment.
*/
rtems_filesystem_root = root_loc;
109653: 8d 7a 18 lea 0x18(%edx),%edi
109656: b1 05 mov $0x5,%cl
109658: 89 de mov %ebx,%esi
10965a: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
rtems_filesystem_current = current_loc;
10965c: 8d 7a 04 lea 0x4(%edx),%edi
10965f: b1 05 mov $0x5,%cl
109661: 8b 75 a4 mov -0x5c(%ebp),%esi
109664: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return RTEMS_SUCCESSFUL;
109666: 31 c0 xor %eax,%eax
error_1:
rtems_filesystem_freenode(&root_loc);
error_0:
return RTEMS_NO_MEMORY;
}
109668: 8d 65 f4 lea -0xc(%ebp),%esp
10966b: 5b pop %ebx
10966c: 5e pop %esi
10966d: 5f pop %edi
10966e: c9 leave
10966f: c3 ret
rtems_filesystem_current = current_loc;
return RTEMS_SUCCESSFUL;
error_3:
free(new_env);
109670: 83 ec 0c sub $0xc,%esp
109673: 56 push %esi
109674: e8 7b ee ff ff call 1084f4 <free>
109679: 83 c4 10 add $0x10,%esp
error_2:
rtems_filesystem_freenode(¤t_loc);
10967c: 83 ec 0c sub $0xc,%esp
10967f: 8d 45 c0 lea -0x40(%ebp),%eax
109682: 50 push %eax
109683: e8 58 ee ff ff call 1084e0 <rtems_filesystem_freenode>
109688: 83 c4 10 add $0x10,%esp
error_1:
rtems_filesystem_freenode(&root_loc);
10968b: 83 ec 0c sub $0xc,%esp
10968e: 53 push %ebx
10968f: e8 4c ee ff ff call 1084e0 <rtems_filesystem_freenode>
109694: 83 c4 10 add $0x10,%esp
error_0:
return RTEMS_NO_MEMORY;
109697: b8 1a 00 00 00 mov $0x1a,%eax
}
10969c: 8d 65 f4 lea -0xc(%ebp),%esp
10969f: 5b pop %ebx
1096a0: 5e pop %esi
1096a1: 5f pop %edi
1096a2: c9 leave
1096a3: c3 ret
001096a4 <rtems_libio_share_private_env>:
* b) mutex access to rtems_filesystem_current, rtems_filesytem_root
* while changing any of those (chdir(), chroot()).
*/
rtems_status_code rtems_libio_share_private_env(rtems_id task_id)
{
1096a4: 55 push %ebp
1096a5: 89 e5 mov %esp,%ebp
1096a7: 56 push %esi
1096a8: 53 push %ebx
1096a9: 83 ec 20 sub $0x20,%esp
1096ac: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_id current_task_id;
/*
* get current task id
*/
current_task_id = rtems_task_self();
1096af: e8 f8 2c 00 00 call 10c3ac <rtems_task_self>
1096b4: 89 c6 mov %eax,%esi
/*
* If this was an attempt to share the task with self,
* if somebody wanted to do it... Lets tell them, its shared
*/
if( task_id == current_task_id )
1096b6: 39 c3 cmp %eax,%ebx
1096b8: 74 32 je 1096ec <rtems_libio_share_private_env+0x48><== NEVER TAKEN
return RTEMS_SUCCESSFUL;
/*
* Try to get the requested user environment
*/
sc = rtems_task_variable_get(
1096ba: 52 push %edx
task_id,
(void*)&rtems_current_user_env,
(void*)&shared_user_env );
1096bb: 8d 45 f4 lea -0xc(%ebp),%eax
if( task_id == current_task_id )
return RTEMS_SUCCESSFUL;
/*
* Try to get the requested user environment
*/
sc = rtems_task_variable_get(
1096be: 50 push %eax
1096bf: 68 30 63 12 00 push $0x126330
1096c4: 53 push %ebx
1096c5: e8 2a 2e 00 00 call 10c4f4 <rtems_task_variable_get>
(void*)&shared_user_env );
/*
* If it was not successful, return the error code
*/
if (sc != RTEMS_SUCCESSFUL)
1096ca: 83 c4 10 add $0x10,%esp
1096cd: 85 c0 test %eax,%eax
1096cf: 75 13 jne 1096e4 <rtems_libio_share_private_env+0x40>
* If we have a current environment in place, we need to
* free it, since we will be sharing the variable with the
* shared_user_env
*/
if (rtems_current_user_env->task_id==current_task_id) {
1096d1: 8b 15 30 63 12 00 mov 0x126330,%edx
1096d7: 39 32 cmp %esi,(%edx)
1096d9: 74 1d je 1096f8 <rtems_libio_share_private_env+0x54>
rtems_user_env_t *tmp = rtems_current_user_env;
free_user_env( tmp );
}
/* the current_user_env is the same pointer that remote env */
rtems_current_user_env = shared_user_env;
1096db: 8b 55 f4 mov -0xc(%ebp),%edx
1096de: 89 15 30 63 12 00 mov %edx,0x126330
#ifdef HAVE_USERENV_REFCNT
rtems_current_user_env->refcnt++;
#endif
return RTEMS_SUCCESSFUL;
}
1096e4: 8d 65 f8 lea -0x8(%ebp),%esp
1096e7: 5b pop %ebx
1096e8: 5e pop %esi
1096e9: c9 leave
1096ea: c3 ret
1096eb: 90 nop
* If this was an attempt to share the task with self,
* if somebody wanted to do it... Lets tell them, its shared
*/
if( task_id == current_task_id )
return RTEMS_SUCCESSFUL;
1096ec: 31 c0 xor %eax,%eax
#ifdef HAVE_USERENV_REFCNT
rtems_current_user_env->refcnt++;
#endif
return RTEMS_SUCCESSFUL;
}
1096ee: 8d 65 f8 lea -0x8(%ebp),%esp <== NOT EXECUTED
1096f1: 5b pop %ebx <== NOT EXECUTED
1096f2: 5e pop %esi <== NOT EXECUTED
1096f3: c9 leave <== NOT EXECUTED
1096f4: c3 ret <== NOT EXECUTED
1096f5: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
* shared_user_env
*/
if (rtems_current_user_env->task_id==current_task_id) {
rtems_user_env_t *tmp = rtems_current_user_env;
free_user_env( tmp );
1096f8: 83 ec 0c sub $0xc,%esp
1096fb: 52 push %edx
1096fc: 89 45 e4 mov %eax,-0x1c(%ebp)
1096ff: e8 4c fe ff ff call 109550 <free_user_env>
109704: 83 c4 10 add $0x10,%esp
109707: 8b 45 e4 mov -0x1c(%ebp),%eax
10970a: eb cf jmp 1096db <rtems_libio_share_private_env+0x37>
0010fd94 <rtems_libio_to_fcntl_flags>:
*/
uint32_t rtems_libio_to_fcntl_flags(
uint32_t flags
)
{
10fd94: 55 push %ebp
10fd95: 89 e5 mov %esp,%ebp
10fd97: 8b 55 08 mov 0x8(%ebp),%edx
uint32_t fcntl_flags = 0;
if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) {
10fd9a: 89 d0 mov %edx,%eax
10fd9c: 83 e0 06 and $0x6,%eax
10fd9f: 83 f8 06 cmp $0x6,%eax
10fda2: 74 2c je 10fdd0 <rtems_libio_to_fcntl_flags+0x3c>
fcntl_flags |= O_RDWR;
} else if ( (flags & LIBIO_FLAGS_READ) == LIBIO_FLAGS_READ) {
10fda4: f6 c2 02 test $0x2,%dl
10fda7: 75 23 jne 10fdcc <rtems_libio_to_fcntl_flags+0x38><== ALWAYS TAKEN
)
{
uint32_t fcntl_flags = 0;
if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) {
fcntl_flags |= O_RDWR;
10fda9: 31 c0 xor %eax,%eax
10fdab: f6 c2 04 test $0x4,%dl <== NOT EXECUTED
10fdae: 0f 95 c0 setne %al <== NOT EXECUTED
fcntl_flags |= O_RDONLY;
} else if ( (flags & LIBIO_FLAGS_WRITE) == LIBIO_FLAGS_WRITE) {
fcntl_flags |= O_WRONLY;
}
if ( (flags & LIBIO_FLAGS_NO_DELAY) == LIBIO_FLAGS_NO_DELAY ) {
10fdb1: f6 c2 01 test $0x1,%dl
10fdb4: 74 03 je 10fdb9 <rtems_libio_to_fcntl_flags+0x25>
fcntl_flags |= O_NONBLOCK;
10fdb6: 80 cc 40 or $0x40,%ah
}
if ( (flags & LIBIO_FLAGS_APPEND) == LIBIO_FLAGS_APPEND ) {
10fdb9: f6 c6 02 test $0x2,%dh
10fdbc: 74 03 je 10fdc1 <rtems_libio_to_fcntl_flags+0x2d>
fcntl_flags |= O_APPEND;
10fdbe: 83 c8 08 or $0x8,%eax
}
if ( (flags & LIBIO_FLAGS_CREATE) == LIBIO_FLAGS_CREATE ) {
10fdc1: 80 e6 04 and $0x4,%dh
10fdc4: 74 03 je 10fdc9 <rtems_libio_to_fcntl_flags+0x35>
fcntl_flags |= O_CREAT;
10fdc6: 80 cc 02 or $0x2,%ah
}
return fcntl_flags;
}
10fdc9: c9 leave
10fdca: c3 ret
10fdcb: 90 nop
uint32_t fcntl_flags = 0;
if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) {
fcntl_flags |= O_RDWR;
} else if ( (flags & LIBIO_FLAGS_READ) == LIBIO_FLAGS_READ) {
fcntl_flags |= O_RDONLY;
10fdcc: 31 c0 xor %eax,%eax
10fdce: eb e1 jmp 10fdb1 <rtems_libio_to_fcntl_flags+0x1d>
)
{
uint32_t fcntl_flags = 0;
if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) {
fcntl_flags |= O_RDWR;
10fdd0: b8 02 00 00 00 mov $0x2,%eax
10fdd5: eb da jmp 10fdb1 <rtems_libio_to_fcntl_flags+0x1d>
0010af10 <rtems_malloc_statistics_at_free>:
* size and thus we skip updating the statistics.
*/
static void rtems_malloc_statistics_at_free(
void *pointer
)
{
10af10: 55 push %ebp
10af11: 89 e5 mov %esp,%ebp
10af13: 83 ec 1c sub $0x1c,%esp
uintptr_t size;
if (_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &size) ) {
10af16: 8d 45 f4 lea -0xc(%ebp),%eax
10af19: 50 push %eax
10af1a: ff 75 08 pushl 0x8(%ebp)
10af1d: ff 35 38 a6 12 00 pushl 0x12a638
10af23: e8 ec 5b 00 00 call 110b14 <_Protected_heap_Get_block_size>
10af28: 83 c4 10 add $0x10,%esp
10af2b: 84 c0 test %al,%al
10af2d: 74 11 je 10af40 <rtems_malloc_statistics_at_free+0x30><== NEVER TAKEN
MSBUMP(lifetime_freed, size);
10af2f: 8b 45 f4 mov -0xc(%ebp),%eax
10af32: 31 d2 xor %edx,%edx
10af34: 01 05 44 f2 12 00 add %eax,0x12f244
10af3a: 11 15 48 f2 12 00 adc %edx,0x12f248
}
}
10af40: c9 leave
10af41: c3 ret
0010af44 <rtems_malloc_statistics_at_malloc>:
}
static void rtems_malloc_statistics_at_malloc(
void *pointer
)
{
10af44: 55 push %ebp
10af45: 89 e5 mov %esp,%ebp
10af47: 83 ec 18 sub $0x18,%esp
10af4a: 8b 45 08 mov 0x8(%ebp),%eax
uintptr_t actual_size = 0;
10af4d: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp)
uint32_t current_depth;
rtems_malloc_statistics_t *s = &rtems_malloc_statistics;
if ( !pointer )
10af54: 85 c0 test %eax,%eax
10af56: 74 43 je 10af9b <rtems_malloc_statistics_at_malloc+0x57><== NEVER TAKEN
return;
_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &actual_size);
10af58: 52 push %edx
10af59: 8d 55 f4 lea -0xc(%ebp),%edx
10af5c: 52 push %edx
10af5d: 50 push %eax
10af5e: ff 35 38 a6 12 00 pushl 0x12a638
10af64: e8 ab 5b 00 00 call 110b14 <_Protected_heap_Get_block_size>
MSBUMP(lifetime_allocated, actual_size);
10af69: 8b 45 f4 mov -0xc(%ebp),%eax
10af6c: 31 d2 xor %edx,%edx
10af6e: 03 05 3c f2 12 00 add 0x12f23c,%eax
10af74: 13 15 40 f2 12 00 adc 0x12f240,%edx
10af7a: a3 3c f2 12 00 mov %eax,0x12f23c
10af7f: 89 15 40 f2 12 00 mov %edx,0x12f240
current_depth = (uint32_t) (s->lifetime_allocated - s->lifetime_freed);
10af85: 2b 05 44 f2 12 00 sub 0x12f244,%eax
if (current_depth > s->max_depth)
10af8b: 83 c4 10 add $0x10,%esp
10af8e: 3b 05 38 f2 12 00 cmp 0x12f238,%eax
10af94: 76 05 jbe 10af9b <rtems_malloc_statistics_at_malloc+0x57>
s->max_depth = current_depth;
10af96: a3 38 f2 12 00 mov %eax,0x12f238
}
10af9b: c9 leave
10af9c: c3 ret
00113d98 <rtems_memalign>:
int rtems_memalign(
void **pointer,
size_t alignment,
size_t size
)
{
113d98: 55 push %ebp
113d99: 89 e5 mov %esp,%ebp
113d9b: 53 push %ebx
113d9c: 83 ec 14 sub $0x14,%esp
113d9f: 8b 5d 08 mov 0x8(%ebp),%ebx
void *return_this;
/*
* Parameter error checks
*/
if ( !pointer )
113da2: 85 db test %ebx,%ebx
113da4: 74 5b je 113e01 <rtems_memalign+0x69>
return EINVAL;
*pointer = NULL;
113da6: c7 03 00 00 00 00 movl $0x0,(%ebx)
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
113dac: 83 3d e0 bc 12 00 03 cmpl $0x3,0x12bce0
113db3: 74 43 je 113df8 <rtems_memalign+0x60> <== ALWAYS TAKEN
return EINVAL;
/*
* If some free's have been deferred, then do them now.
*/
malloc_deferred_frees_process();
113db5: e8 a6 53 ff ff call 109160 <malloc_deferred_frees_process>
Heap_Control *heap,
uintptr_t size,
uintptr_t alignment
)
{
return
113dba: 6a 00 push $0x0
113dbc: ff 75 0c pushl 0xc(%ebp)
113dbf: ff 75 10 pushl 0x10(%ebp)
113dc2: ff 35 78 76 12 00 pushl 0x127678
113dc8: e8 d7 a5 ff ff call 10e3a4 <_Protected_heap_Allocate_aligned_with_boundary>
return_this = _Protected_heap_Allocate_aligned(
RTEMS_Malloc_Heap,
size,
alignment
);
if ( !return_this )
113dcd: 83 c4 10 add $0x10,%esp
113dd0: 85 c0 test %eax,%eax
113dd2: 74 38 je 113e0c <rtems_memalign+0x74>
return ENOMEM;
/*
* If configured, update the more involved statistics
*/
if ( rtems_malloc_statistics_helpers )
113dd4: 8b 15 c8 9c 12 00 mov 0x129cc8,%edx
113dda: 85 d2 test %edx,%edx
113ddc: 74 10 je 113dee <rtems_memalign+0x56>
(*rtems_malloc_statistics_helpers->at_malloc)(pointer);
113dde: 83 ec 0c sub $0xc,%esp
113de1: 53 push %ebx
113de2: 89 45 f4 mov %eax,-0xc(%ebp)
113de5: ff 52 04 call *0x4(%edx)
113de8: 83 c4 10 add $0x10,%esp
113deb: 8b 45 f4 mov -0xc(%ebp),%eax
*pointer = return_this;
113dee: 89 03 mov %eax,(%ebx)
return 0;
113df0: 31 c0 xor %eax,%eax
}
113df2: 8b 5d fc mov -0x4(%ebp),%ebx
113df5: c9 leave
113df6: c3 ret
113df7: 90 nop
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
!malloc_is_system_state_OK() )
113df8: e8 23 53 ff ff call 109120 <malloc_is_system_state_OK>
*pointer = NULL;
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
113dfd: 84 c0 test %al,%al
113dff: 75 b4 jne 113db5 <rtems_memalign+0x1d> <== ALWAYS TAKEN
!malloc_is_system_state_OK() )
return EINVAL;
113e01: b8 16 00 00 00 mov $0x16,%eax
if ( rtems_malloc_statistics_helpers )
(*rtems_malloc_statistics_helpers->at_malloc)(pointer);
*pointer = return_this;
return 0;
}
113e06: 8b 5d fc mov -0x4(%ebp),%ebx
113e09: c9 leave
113e0a: c3 ret
113e0b: 90 nop
RTEMS_Malloc_Heap,
size,
alignment
);
if ( !return_this )
return ENOMEM;
113e0c: b8 0c 00 00 00 mov $0xc,%eax
113e11: eb df jmp 113df2 <rtems_memalign+0x5a>
001163bc <rtems_message_queue_broadcast>:
rtems_id id,
const void *buffer,
size_t size,
uint32_t *count
)
{
1163bc: 55 push %ebp
1163bd: 89 e5 mov %esp,%ebp
1163bf: 57 push %edi
1163c0: 56 push %esi
1163c1: 53 push %ebx
1163c2: 83 ec 1c sub $0x1c,%esp
1163c5: 8b 7d 08 mov 0x8(%ebp),%edi
1163c8: 8b 5d 0c mov 0xc(%ebp),%ebx
1163cb: 8b 75 14 mov 0x14(%ebp),%esi
register Message_queue_Control *the_message_queue;
Objects_Locations location;
CORE_message_queue_Status core_status;
if ( !buffer )
1163ce: 85 db test %ebx,%ebx
1163d0: 74 62 je 116434 <rtems_message_queue_broadcast+0x78>
return RTEMS_INVALID_ADDRESS;
if ( !count )
1163d2: 85 f6 test %esi,%esi
1163d4: 74 5e je 116434 <rtems_message_queue_broadcast+0x78>
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
1163d6: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
1163d7: 8d 45 e4 lea -0x1c(%ebp),%eax
1163da: 50 push %eax
1163db: 57 push %edi
1163dc: 68 00 35 14 00 push $0x143500
1163e1: e8 fe 4e 00 00 call 11b2e4 <_Objects_Get>
switch ( location ) {
1163e6: 83 c4 10 add $0x10,%esp
1163e9: 8b 55 e4 mov -0x1c(%ebp),%edx
1163ec: 85 d2 test %edx,%edx
1163ee: 74 10 je 116400 <rtems_message_queue_broadcast+0x44>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1163f0: b8 04 00 00 00 mov $0x4,%eax
}
1163f5: 8d 65 f4 lea -0xc(%ebp),%esp
1163f8: 5b pop %ebx
1163f9: 5e pop %esi
1163fa: 5f pop %edi
1163fb: c9 leave
1163fc: c3 ret
1163fd: 8d 76 00 lea 0x0(%esi),%esi
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
core_status = _CORE_message_queue_Broadcast(
116400: 83 ec 08 sub $0x8,%esp
116403: 56 push %esi
116404: 6a 00 push $0x0
116406: 57 push %edi
116407: ff 75 10 pushl 0x10(%ebp)
11640a: 53 push %ebx
11640b: 83 c0 14 add $0x14,%eax
11640e: 50 push %eax
11640f: e8 cc 34 00 00 call 1198e0 <_CORE_message_queue_Broadcast>
116414: 89 c3 mov %eax,%ebx
NULL,
#endif
count
);
_Thread_Enable_dispatch();
116416: 83 c4 20 add $0x20,%esp
116419: e8 7a 59 00 00 call 11bd98 <_Thread_Enable_dispatch>
return
11641e: 83 ec 0c sub $0xc,%esp
116421: 53 push %ebx
116422: e8 69 03 00 00 call 116790 <_Message_queue_Translate_core_message_queue_return_code>
116427: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11642a: 8d 65 f4 lea -0xc(%ebp),%esp
11642d: 5b pop %ebx
11642e: 5e pop %esi
11642f: 5f pop %edi
116430: c9 leave
116431: c3 ret
116432: 66 90 xchg %ax,%ax
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
if ( !count )
return RTEMS_INVALID_ADDRESS;
116434: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116439: 8d 65 f4 lea -0xc(%ebp),%esp
11643c: 5b pop %ebx
11643d: 5e pop %esi
11643e: 5f pop %edi
11643f: c9 leave
116440: c3 ret
00113858 <rtems_message_queue_create>:
uint32_t count,
size_t max_message_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
113858: 55 push %ebp
113859: 89 e5 mov %esp,%ebp
11385b: 57 push %edi
11385c: 56 push %esi
11385d: 53 push %ebx
11385e: 83 ec 2c sub $0x2c,%esp
113861: 8b 5d 08 mov 0x8(%ebp),%ebx
113864: 8b 75 0c mov 0xc(%ebp),%esi
113867: 8b 4d 10 mov 0x10(%ebp),%ecx
11386a: 8b 7d 18 mov 0x18(%ebp),%edi
CORE_message_queue_Attributes the_msgq_attributes;
#if defined(RTEMS_MULTIPROCESSING)
bool is_global;
#endif
if ( !rtems_is_name_valid( name ) )
11386d: 85 db test %ebx,%ebx
11386f: 74 2f je 1138a0 <rtems_message_queue_create+0x48>
return RTEMS_INVALID_NAME;
if ( !id )
113871: 85 ff test %edi,%edi
113873: 0f 84 a3 00 00 00 je 11391c <rtems_message_queue_create+0xc4>
if ( (is_global = _Attributes_Is_global( attribute_set ) ) &&
!_System_state_Is_multiprocessing )
return RTEMS_MP_NOT_CONFIGURED;
#endif
if ( count == 0 )
113879: 85 f6 test %esi,%esi
11387b: 74 13 je 113890 <rtems_message_queue_create+0x38>
return RTEMS_INVALID_NUMBER;
if ( max_message_size == 0 )
11387d: 85 c9 test %ecx,%ecx
11387f: 75 2f jne 1138b0 <rtems_message_queue_create+0x58>
return RTEMS_INVALID_SIZE;
113881: b8 08 00 00 00 mov $0x8,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
113886: 8d 65 f4 lea -0xc(%ebp),%esp
113889: 5b pop %ebx
11388a: 5e pop %esi
11388b: 5f pop %edi
11388c: c9 leave
11388d: c3 ret
11388e: 66 90 xchg %ax,%ax
!_System_state_Is_multiprocessing )
return RTEMS_MP_NOT_CONFIGURED;
#endif
if ( count == 0 )
return RTEMS_INVALID_NUMBER;
113890: b8 0a 00 00 00 mov $0xa,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
113895: 8d 65 f4 lea -0xc(%ebp),%esp
113898: 5b pop %ebx
113899: 5e pop %esi
11389a: 5f pop %edi
11389b: c9 leave
11389c: c3 ret
11389d: 8d 76 00 lea 0x0(%esi),%esi
#if defined(RTEMS_MULTIPROCESSING)
bool is_global;
#endif
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
1138a0: b8 03 00 00 00 mov $0x3,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
1138a5: 8d 65 f4 lea -0xc(%ebp),%esp
1138a8: 5b pop %ebx
1138a9: 5e pop %esi
1138aa: 5f pop %edi
1138ab: c9 leave
1138ac: c3 ret
1138ad: 8d 76 00 lea 0x0(%esi),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
1138b0: a1 f0 06 13 00 mov 0x1306f0,%eax
1138b5: 40 inc %eax
1138b6: a3 f0 06 13 00 mov %eax,0x1306f0
#endif
#endif
_Thread_Disable_dispatch(); /* protects object pointer */
the_message_queue = _Message_queue_Allocate();
1138bb: 89 4d d4 mov %ecx,-0x2c(%ebp)
1138be: e8 d9 5f 00 00 call 11989c <_Message_queue_Allocate>
1138c3: 89 c2 mov %eax,%edx
if ( !the_message_queue ) {
1138c5: 85 c0 test %eax,%eax
1138c7: 8b 4d d4 mov -0x2c(%ebp),%ecx
1138ca: 74 7c je 113948 <rtems_message_queue_create+0xf0>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_message_queue->attribute_set = attribute_set;
1138cc: 8b 45 14 mov 0x14(%ebp),%eax
1138cf: 89 42 10 mov %eax,0x10(%edx)
if (_Attributes_Is_priority( attribute_set ) )
the_msgq_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY;
1138d2: a8 04 test $0x4,%al
1138d4: 0f 95 c0 setne %al
1138d7: 0f b6 c0 movzbl %al,%eax
1138da: 89 45 e4 mov %eax,-0x1c(%ebp)
else
the_msgq_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
if ( ! _CORE_message_queue_Initialize(
1138dd: 51 push %ecx
1138de: 56 push %esi
1138df: 8d 45 e4 lea -0x1c(%ebp),%eax
1138e2: 50 push %eax
1138e3: 8d 42 14 lea 0x14(%edx),%eax
1138e6: 50 push %eax
1138e7: 89 55 d4 mov %edx,-0x2c(%ebp)
1138ea: e8 31 11 00 00 call 114a20 <_CORE_message_queue_Initialize>
1138ef: 83 c4 10 add $0x10,%esp
1138f2: 84 c0 test %al,%al
1138f4: 8b 55 d4 mov -0x2c(%ebp),%edx
1138f7: 75 2f jne 113928 <rtems_message_queue_create+0xd0>
*/
RTEMS_INLINE_ROUTINE void _Message_queue_Free (
Message_queue_Control *the_message_queue
)
{
_Objects_Free( &_Message_queue_Information, &the_message_queue->Object );
1138f9: 83 ec 08 sub $0x8,%esp
1138fc: 52 push %edx
1138fd: 68 20 11 13 00 push $0x131120
113902: e8 b9 1f 00 00 call 1158c0 <_Objects_Free>
_Objects_MP_Close(
&_Message_queue_Information, the_message_queue->Object.id);
#endif
_Message_queue_Free( the_message_queue );
_Thread_Enable_dispatch();
113907: e8 28 2c 00 00 call 116534 <_Thread_Enable_dispatch>
return RTEMS_UNSATISFIED;
11390c: 83 c4 10 add $0x10,%esp
11390f: b8 0d 00 00 00 mov $0xd,%eax
113914: e9 6d ff ff ff jmp 113886 <rtems_message_queue_create+0x2e>
113919: 8d 76 00 lea 0x0(%esi),%esi
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
11391c: b8 09 00 00 00 mov $0x9,%eax
113921: e9 60 ff ff ff jmp 113886 <rtems_message_queue_create+0x2e>
113926: 66 90 xchg %ax,%ax
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
113928: 8b 42 08 mov 0x8(%edx),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
11392b: 0f b7 f0 movzwl %ax,%esi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
11392e: 8b 0d 3c 11 13 00 mov 0x13113c,%ecx
113934: 89 14 b1 mov %edx,(%ecx,%esi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
113937: 89 5a 0c mov %ebx,0xc(%edx)
&_Message_queue_Information,
&the_message_queue->Object,
(Objects_Name) name
);
*id = the_message_queue->Object.id;
11393a: 89 07 mov %eax,(%edi)
name,
0
);
#endif
_Thread_Enable_dispatch();
11393c: e8 f3 2b 00 00 call 116534 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
113941: 31 c0 xor %eax,%eax
113943: e9 3e ff ff ff jmp 113886 <rtems_message_queue_create+0x2e>
_Thread_Disable_dispatch(); /* protects object pointer */
the_message_queue = _Message_queue_Allocate();
if ( !the_message_queue ) {
_Thread_Enable_dispatch();
113948: e8 e7 2b 00 00 call 116534 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
11394d: b8 05 00 00 00 mov $0x5,%eax
113952: e9 2f ff ff ff jmp 113886 <rtems_message_queue_create+0x2e>
00116544 <rtems_message_queue_delete>:
*/
rtems_status_code rtems_message_queue_delete(
rtems_id id
)
{
116544: 55 push %ebp
116545: 89 e5 mov %esp,%ebp
116547: 53 push %ebx
116548: 83 ec 18 sub $0x18,%esp
register Message_queue_Control *the_message_queue;
Objects_Locations location;
the_message_queue = _Message_queue_Get( id, &location );
11654b: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
11654e: 50 push %eax
11654f: ff 75 08 pushl 0x8(%ebp)
116552: 68 00 35 14 00 push $0x143500
116557: e8 88 4d 00 00 call 11b2e4 <_Objects_Get>
11655c: 89 c3 mov %eax,%ebx
switch ( location ) {
11655e: 83 c4 10 add $0x10,%esp
116561: 8b 4d f4 mov -0xc(%ebp),%ecx
116564: 85 c9 test %ecx,%ecx
116566: 75 3c jne 1165a4 <rtems_message_queue_delete+0x60>
case OBJECTS_LOCAL:
_Objects_Close( &_Message_queue_Information,
116568: 83 ec 08 sub $0x8,%esp
11656b: 50 push %eax
11656c: 68 00 35 14 00 push $0x143500
116571: e8 f6 48 00 00 call 11ae6c <_Objects_Close>
&the_message_queue->Object );
_CORE_message_queue_Close(
116576: 83 c4 0c add $0xc,%esp
116579: 6a 05 push $0x5
11657b: 6a 00 push $0x0
11657d: 8d 43 14 lea 0x14(%ebx),%eax
116580: 50 push %eax
116581: e8 de 33 00 00 call 119964 <_CORE_message_queue_Close>
*/
RTEMS_INLINE_ROUTINE void _Message_queue_Free (
Message_queue_Control *the_message_queue
)
{
_Objects_Free( &_Message_queue_Information, &the_message_queue->Object );
116586: 58 pop %eax
116587: 5a pop %edx
116588: 53 push %ebx
116589: 68 00 35 14 00 push $0x143500
11658e: e8 d5 4b 00 00 call 11b168 <_Objects_Free>
0, /* Not used */
0
);
}
#endif
_Thread_Enable_dispatch();
116593: e8 00 58 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
116598: 83 c4 10 add $0x10,%esp
11659b: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11659d: 8b 5d fc mov -0x4(%ebp),%ebx
1165a0: c9 leave
1165a1: c3 ret
1165a2: 66 90 xchg %ax,%ax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1165a4: b8 04 00 00 00 mov $0x4,%eax
}
1165a9: 8b 5d fc mov -0x4(%ebp),%ebx
1165ac: c9 leave
1165ad: c3 ret
001165b0 <rtems_message_queue_flush>:
rtems_status_code rtems_message_queue_flush(
rtems_id id,
uint32_t *count
)
{
1165b0: 55 push %ebp
1165b1: 89 e5 mov %esp,%ebp
1165b3: 53 push %ebx
1165b4: 83 ec 14 sub $0x14,%esp
1165b7: 8b 5d 0c mov 0xc(%ebp),%ebx
register Message_queue_Control *the_message_queue;
Objects_Locations location;
if ( !count )
1165ba: 85 db test %ebx,%ebx
1165bc: 74 46 je 116604 <rtems_message_queue_flush+0x54>
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
1165be: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
1165bf: 8d 45 f4 lea -0xc(%ebp),%eax
1165c2: 50 push %eax
1165c3: ff 75 08 pushl 0x8(%ebp)
1165c6: 68 00 35 14 00 push $0x143500
1165cb: e8 14 4d 00 00 call 11b2e4 <_Objects_Get>
switch ( location ) {
1165d0: 83 c4 10 add $0x10,%esp
1165d3: 8b 55 f4 mov -0xc(%ebp),%edx
1165d6: 85 d2 test %edx,%edx
1165d8: 74 0a je 1165e4 <rtems_message_queue_flush+0x34>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1165da: b8 04 00 00 00 mov $0x4,%eax
}
1165df: 8b 5d fc mov -0x4(%ebp),%ebx
1165e2: c9 leave
1165e3: c3 ret
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
*count = _CORE_message_queue_Flush( &the_message_queue->message_queue );
1165e4: 83 ec 0c sub $0xc,%esp
1165e7: 83 c0 14 add $0x14,%eax
1165ea: 50 push %eax
1165eb: e8 b0 33 00 00 call 1199a0 <_CORE_message_queue_Flush>
1165f0: 89 03 mov %eax,(%ebx)
_Thread_Enable_dispatch();
1165f2: e8 a1 57 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
1165f7: 83 c4 10 add $0x10,%esp
1165fa: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1165fc: 8b 5d fc mov -0x4(%ebp),%ebx
1165ff: c9 leave
116600: c3 ret
116601: 8d 76 00 lea 0x0(%esi),%esi
{
register Message_queue_Control *the_message_queue;
Objects_Locations location;
if ( !count )
return RTEMS_INVALID_ADDRESS;
116604: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116609: 8b 5d fc mov -0x4(%ebp),%ebx
11660c: c9 leave
11660d: c3 ret
00116610 <rtems_message_queue_get_number_pending>:
rtems_status_code rtems_message_queue_get_number_pending(
rtems_id id,
uint32_t *count
)
{
116610: 55 push %ebp
116611: 89 e5 mov %esp,%ebp
116613: 53 push %ebx
116614: 83 ec 14 sub $0x14,%esp
116617: 8b 5d 0c mov 0xc(%ebp),%ebx
register Message_queue_Control *the_message_queue;
Objects_Locations location;
if ( !count )
11661a: 85 db test %ebx,%ebx
11661c: 74 3a je 116658 <rtems_message_queue_get_number_pending+0x48>
11661e: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
11661f: 8d 45 f4 lea -0xc(%ebp),%eax
116622: 50 push %eax
116623: ff 75 08 pushl 0x8(%ebp)
116626: 68 00 35 14 00 push $0x143500
11662b: e8 b4 4c 00 00 call 11b2e4 <_Objects_Get>
switch ( location ) {
116630: 83 c4 10 add $0x10,%esp
116633: 8b 55 f4 mov -0xc(%ebp),%edx
116636: 85 d2 test %edx,%edx
116638: 74 0a je 116644 <rtems_message_queue_get_number_pending+0x34>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
11663a: b8 04 00 00 00 mov $0x4,%eax
}
11663f: 8b 5d fc mov -0x4(%ebp),%ebx
116642: c9 leave
116643: c3 ret
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
*count = the_message_queue->message_queue.number_of_pending_messages;
116644: 8b 40 5c mov 0x5c(%eax),%eax
116647: 89 03 mov %eax,(%ebx)
_Thread_Enable_dispatch();
116649: e8 4a 57 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
11664e: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116650: 8b 5d fc mov -0x4(%ebp),%ebx
116653: c9 leave
116654: c3 ret
116655: 8d 76 00 lea 0x0(%esi),%esi
{
register Message_queue_Control *the_message_queue;
Objects_Locations location;
if ( !count )
return RTEMS_INVALID_ADDRESS;
116658: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11665d: 8b 5d fc mov -0x4(%ebp),%ebx
116660: c9 leave
116661: c3 ret
0011397c <rtems_message_queue_receive>:
void *buffer,
size_t *size,
rtems_option option_set,
rtems_interval timeout
)
{
11397c: 55 push %ebp
11397d: 89 e5 mov %esp,%ebp
11397f: 56 push %esi
113980: 53 push %ebx
113981: 83 ec 10 sub $0x10,%esp
113984: 8b 5d 0c mov 0xc(%ebp),%ebx
113987: 8b 75 10 mov 0x10(%ebp),%esi
register Message_queue_Control *the_message_queue;
Objects_Locations location;
bool wait;
if ( !buffer )
11398a: 85 db test %ebx,%ebx
11398c: 74 6e je 1139fc <rtems_message_queue_receive+0x80>
return RTEMS_INVALID_ADDRESS;
if ( !size )
11398e: 85 f6 test %esi,%esi
113990: 74 6a je 1139fc <rtems_message_queue_receive+0x80>
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
113992: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
113993: 8d 45 f4 lea -0xc(%ebp),%eax
113996: 50 push %eax
113997: ff 75 08 pushl 0x8(%ebp)
11399a: 68 20 11 13 00 push $0x131120
11399f: e8 5c 20 00 00 call 115a00 <_Objects_Get>
switch ( location ) {
1139a4: 83 c4 10 add $0x10,%esp
1139a7: 8b 55 f4 mov -0xc(%ebp),%edx
1139aa: 85 d2 test %edx,%edx
1139ac: 75 42 jne 1139f0 <rtems_message_queue_receive+0x74>
if ( _Options_Is_no_wait( option_set ) )
wait = false;
else
wait = true;
_CORE_message_queue_Seize(
1139ae: 83 ec 08 sub $0x8,%esp
1139b1: ff 75 18 pushl 0x18(%ebp)
*/
RTEMS_INLINE_ROUTINE bool _Options_Is_no_wait (
rtems_option option_set
)
{
return (option_set & RTEMS_NO_WAIT) ? true : false;
1139b4: 8b 55 14 mov 0x14(%ebp),%edx
1139b7: 83 e2 01 and $0x1,%edx
1139ba: 83 f2 01 xor $0x1,%edx
1139bd: 52 push %edx
1139be: 56 push %esi
1139bf: 53 push %ebx
1139c0: ff 70 08 pushl 0x8(%eax)
1139c3: 83 c0 14 add $0x14,%eax
1139c6: 50 push %eax
1139c7: e8 04 11 00 00 call 114ad0 <_CORE_message_queue_Seize>
buffer,
size,
wait,
timeout
);
_Thread_Enable_dispatch();
1139cc: 83 c4 20 add $0x20,%esp
1139cf: e8 60 2b 00 00 call 116534 <_Thread_Enable_dispatch>
return _Message_queue_Translate_core_message_queue_return_code(
1139d4: 83 ec 0c sub $0xc,%esp
_Thread_Executing->Wait.return_code
1139d7: a1 d8 0c 13 00 mov 0x130cd8,%eax
size,
wait,
timeout
);
_Thread_Enable_dispatch();
return _Message_queue_Translate_core_message_queue_return_code(
1139dc: ff 70 34 pushl 0x34(%eax)
1139df: e8 a0 00 00 00 call 113a84 <_Message_queue_Translate_core_message_queue_return_code>
1139e4: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1139e7: 8d 65 f8 lea -0x8(%ebp),%esp
1139ea: 5b pop %ebx
1139eb: 5e pop %esi
1139ec: c9 leave
1139ed: c3 ret
1139ee: 66 90 xchg %ax,%ax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1139f0: b8 04 00 00 00 mov $0x4,%eax
}
1139f5: 8d 65 f8 lea -0x8(%ebp),%esp
1139f8: 5b pop %ebx
1139f9: 5e pop %esi
1139fa: c9 leave
1139fb: c3 ret
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
if ( !size )
return RTEMS_INVALID_ADDRESS;
1139fc: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
113a01: 8d 65 f8 lea -0x8(%ebp),%esp
113a04: 5b pop %ebx
113a05: 5e pop %esi
113a06: c9 leave
113a07: c3 ret
0010b3a8 <rtems_message_queue_send>:
rtems_status_code rtems_message_queue_send(
rtems_id id,
const void *buffer,
size_t size
)
{
10b3a8: 55 push %ebp
10b3a9: 89 e5 mov %esp,%ebp
10b3ab: 56 push %esi
10b3ac: 53 push %ebx
10b3ad: 83 ec 10 sub $0x10,%esp
10b3b0: 8b 75 08 mov 0x8(%ebp),%esi
10b3b3: 8b 5d 0c mov 0xc(%ebp),%ebx
register Message_queue_Control *the_message_queue;
Objects_Locations location;
CORE_message_queue_Status status;
if ( !buffer )
10b3b6: 85 db test %ebx,%ebx
10b3b8: 74 5e je 10b418 <rtems_message_queue_send+0x70>
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
10b3ba: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
10b3bb: 8d 45 f4 lea -0xc(%ebp),%eax
10b3be: 50 push %eax
10b3bf: 56 push %esi
10b3c0: 68 60 88 12 00 push $0x128860
10b3c5: e8 76 1a 00 00 call 10ce40 <_Objects_Get>
switch ( location ) {
10b3ca: 83 c4 10 add $0x10,%esp
10b3cd: 8b 55 f4 mov -0xc(%ebp),%edx
10b3d0: 85 d2 test %edx,%edx
10b3d2: 74 0c je 10b3e0 <rtems_message_queue_send+0x38>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b3d4: b8 04 00 00 00 mov $0x4,%eax
}
10b3d9: 8d 65 f8 lea -0x8(%ebp),%esp
10b3dc: 5b pop %ebx
10b3dd: 5e pop %esi
10b3de: c9 leave
10b3df: c3 ret
CORE_message_queue_API_mp_support_callout api_message_queue_mp_support,
bool wait,
Watchdog_Interval timeout
)
{
return _CORE_message_queue_Submit(
10b3e0: 6a 00 push $0x0
10b3e2: 6a 00 push $0x0
10b3e4: 68 ff ff ff 7f push $0x7fffffff
10b3e9: 6a 00 push $0x0
10b3eb: 56 push %esi
10b3ec: ff 75 10 pushl 0x10(%ebp)
10b3ef: 53 push %ebx
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
status = _CORE_message_queue_Send(
10b3f0: 83 c0 14 add $0x14,%eax
10b3f3: 50 push %eax
10b3f4: e8 43 0c 00 00 call 10c03c <_CORE_message_queue_Submit>
10b3f9: 89 c3 mov %eax,%ebx
MESSAGE_QUEUE_MP_HANDLER,
false, /* sender does not block */
0 /* no timeout */
);
_Thread_Enable_dispatch();
10b3fb: 83 c4 20 add $0x20,%esp
10b3fe: e8 f1 24 00 00 call 10d8f4 <_Thread_Enable_dispatch>
/*
* Since this API does not allow for blocking sends, we can directly
* return the returned status.
*/
return _Message_queue_Translate_core_message_queue_return_code(status);
10b403: 83 ec 0c sub $0xc,%esp
10b406: 53 push %ebx
10b407: e8 18 00 00 00 call 10b424 <_Message_queue_Translate_core_message_queue_return_code>
10b40c: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10b40f: 8d 65 f8 lea -0x8(%ebp),%esp
10b412: 5b pop %ebx
10b413: 5e pop %esi
10b414: c9 leave
10b415: c3 ret
10b416: 66 90 xchg %ax,%ax
register Message_queue_Control *the_message_queue;
Objects_Locations location;
CORE_message_queue_Status status;
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
10b418: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10b41d: 8d 65 f8 lea -0x8(%ebp),%esp
10b420: 5b pop %ebx
10b421: 5e pop %esi
10b422: c9 leave
10b423: c3 ret
001167a0 <rtems_message_queue_urgent>:
rtems_status_code rtems_message_queue_urgent(
rtems_id id,
const void *buffer,
size_t size
)
{
1167a0: 55 push %ebp
1167a1: 89 e5 mov %esp,%ebp
1167a3: 56 push %esi
1167a4: 53 push %ebx
1167a5: 83 ec 10 sub $0x10,%esp
1167a8: 8b 75 08 mov 0x8(%ebp),%esi
1167ab: 8b 5d 0c mov 0xc(%ebp),%ebx
register Message_queue_Control *the_message_queue;
Objects_Locations location;
CORE_message_queue_Status status;
if ( !buffer )
1167ae: 85 db test %ebx,%ebx
1167b0: 74 5e je 116810 <rtems_message_queue_urgent+0x70>
1167b2: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
1167b3: 8d 45 f4 lea -0xc(%ebp),%eax
1167b6: 50 push %eax
1167b7: 56 push %esi
1167b8: 68 00 35 14 00 push $0x143500
1167bd: e8 22 4b 00 00 call 11b2e4 <_Objects_Get>
switch ( location ) {
1167c2: 83 c4 10 add $0x10,%esp
1167c5: 8b 55 f4 mov -0xc(%ebp),%edx
1167c8: 85 d2 test %edx,%edx
1167ca: 74 0c je 1167d8 <rtems_message_queue_urgent+0x38>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1167cc: b8 04 00 00 00 mov $0x4,%eax
}
1167d1: 8d 65 f8 lea -0x8(%ebp),%esp
1167d4: 5b pop %ebx
1167d5: 5e pop %esi
1167d6: c9 leave
1167d7: c3 ret
CORE_message_queue_API_mp_support_callout api_message_queue_mp_support,
bool wait,
Watchdog_Interval timeout
)
{
return _CORE_message_queue_Submit(
1167d8: 6a 00 push $0x0
1167da: 6a 00 push $0x0
1167dc: 68 00 00 00 80 push $0x80000000
1167e1: 6a 00 push $0x0
1167e3: 56 push %esi
1167e4: ff 75 10 pushl 0x10(%ebp)
1167e7: 53 push %ebx
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
status = _CORE_message_queue_Urgent(
1167e8: 83 c0 14 add $0x14,%eax
1167eb: 50 push %eax
1167ec: e8 ef 33 00 00 call 119be0 <_CORE_message_queue_Submit>
1167f1: 89 c3 mov %eax,%ebx
id,
MESSAGE_QUEUE_MP_HANDLER,
false, /* sender does not block */
0 /* no timeout */
);
_Thread_Enable_dispatch();
1167f3: 83 c4 20 add $0x20,%esp
1167f6: e8 9d 55 00 00 call 11bd98 <_Thread_Enable_dispatch>
/*
* Since this API does not allow for blocking sends, we can directly
* return the returned status.
*/
return _Message_queue_Translate_core_message_queue_return_code(status);
1167fb: 83 ec 0c sub $0xc,%esp
1167fe: 53 push %ebx
1167ff: e8 8c ff ff ff call 116790 <_Message_queue_Translate_core_message_queue_return_code>
116804: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116807: 8d 65 f8 lea -0x8(%ebp),%esp
11680a: 5b pop %ebx
11680b: 5e pop %esi
11680c: c9 leave
11680d: c3 ret
11680e: 66 90 xchg %ax,%ax
register Message_queue_Control *the_message_queue;
Objects_Locations location;
CORE_message_queue_Status status;
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
116810: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116815: 8d 65 f8 lea -0x8(%ebp),%esp
116818: 5b pop %ebx
116819: 5e pop %esi
11681a: c9 leave
11681b: c3 ret
001124ac <rtems_mkdir>:
return (retval);
}
int
rtems_mkdir(const char *path, mode_t mode)
{
1124ac: 55 push %ebp
1124ad: 89 e5 mov %esp,%ebp
1124af: 57 push %edi
1124b0: 56 push %esi
1124b1: 53 push %ebx
1124b2: 83 ec 78 sub $0x78,%esp
int success = 0;
char *dup_path = strdup(path);
1124b5: ff 75 08 pushl 0x8(%ebp)
1124b8: e8 97 36 00 00 call 115b54 <strdup>
1124bd: 89 c7 mov %eax,%edi
if (dup_path != NULL) {
1124bf: 83 c4 10 add $0x10,%esp
1124c2: 85 c0 test %eax,%eax
1124c4: 0f 84 0a 01 00 00 je 1125d4 <rtems_mkdir+0x128> <== NEVER TAKEN
char *p;
p = path;
oumask = 0;
retval = 1;
if (p[0] == '/') /* Skip leading '/'. */
1124ca: 8a 10 mov (%eax),%dl
1124cc: 80 fa 2f cmp $0x2f,%dl
1124cf: 0f 84 0f 01 00 00 je 1125e4 <rtems_mkdir+0x138>
1124d5: 89 c3 mov %eax,%ebx
1124d7: c7 45 94 00 00 00 00 movl $0x0,-0x6c(%ebp)
1124de: b8 01 00 00 00 mov $0x1,%eax
++p;
for (first = 1, last = 0; !last ; ++p) {
if (p[0] == '\0')
1124e3: 84 d2 test %dl,%dl
1124e5: 74 11 je 1124f8 <rtems_mkdir+0x4c> <== NEVER TAKEN
1124e7: 90 nop
last = 1;
else if (p[0] != '/')
1124e8: 80 fa 2f cmp $0x2f,%dl
1124eb: 0f 84 83 00 00 00 je 112574 <rtems_mkdir+0xc8>
p = path;
oumask = 0;
retval = 1;
if (p[0] == '/') /* Skip leading '/'. */
++p;
for (first = 1, last = 0; !last ; ++p) {
1124f1: 43 inc %ebx
1124f2: 8a 13 mov (%ebx),%dl
if (p[0] == '\0')
1124f4: 84 d2 test %dl,%dl
1124f6: 75 f0 jne 1124e8 <rtems_mkdir+0x3c>
last = 1;
else if (p[0] != '/')
continue;
*p = '\0';
1124f8: c6 03 00 movb $0x0,(%ebx)
1124fb: be 01 00 00 00 mov $0x1,%esi
if (!last && p[1] == '\0')
last = 1;
if (first) {
112500: 85 c0 test %eax,%eax
112502: 75 54 jne 112558 <rtems_mkdir+0xac>
oumask = umask(0);
numask = oumask & ~(S_IWUSR | S_IXUSR);
(void)umask(numask);
first = 0;
}
if (last)
112504: 85 f6 test %esi,%esi
112506: 75 3c jne 112544 <rtems_mkdir+0x98>
(void)umask(oumask);
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
112508: b8 ff 01 00 00 mov $0x1ff,%eax
11250d: 83 ec 08 sub $0x8,%esp
112510: 50 push %eax
112511: 57 push %edi
112512: e8 ed 71 ff ff call 109704 <mkdir>
112517: 83 c4 10 add $0x10,%esp
11251a: 85 c0 test %eax,%eax
11251c: 78 6a js 112588 <rtems_mkdir+0xdc>
} else {
retval = 0;
break;
}
}
if (!last)
11251e: 85 f6 test %esi,%esi
112520: 75 0a jne 11252c <rtems_mkdir+0x80>
*p = '/';
112522: c6 03 2f movb $0x2f,(%ebx)
112525: 31 c0 xor %eax,%eax
112527: eb c8 jmp 1124f1 <rtems_mkdir+0x45>
112529: 8d 76 00 lea 0x0(%esi),%esi
int success = 0;
char *dup_path = strdup(path);
if (dup_path != NULL) {
success = build(dup_path, mode);
free(dup_path);
11252c: 83 ec 0c sub $0xc,%esp
11252f: 57 push %edi
112530: e8 d7 6b ff ff call 10910c <free>
112535: 83 c4 10 add $0x10,%esp
}
return success != 0 ? 0 : -1;
112538: 31 c0 xor %eax,%eax
}
11253a: 8d 65 f4 lea -0xc(%ebp),%esp
11253d: 5b pop %ebx
11253e: 5e pop %esi
11253f: 5f pop %edi
112540: c9 leave
112541: c3 ret
112542: 66 90 xchg %ax,%ax
numask = oumask & ~(S_IWUSR | S_IXUSR);
(void)umask(numask);
first = 0;
}
if (last)
(void)umask(oumask);
112544: 83 ec 0c sub $0xc,%esp
112547: ff 75 94 pushl -0x6c(%ebp)
11254a: e8 81 01 00 00 call 1126d0 <umask>
11254f: 83 c4 10 add $0x10,%esp
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
112552: 8b 45 0c mov 0xc(%ebp),%eax
112555: eb b6 jmp 11250d <rtems_mkdir+0x61>
112557: 90 nop
* mkdir [-m mode] dir
*
* We change the user's umask and then restore it,
* instead of doing chmod's.
*/
oumask = umask(0);
112558: 83 ec 0c sub $0xc,%esp
11255b: 6a 00 push $0x0
11255d: e8 6e 01 00 00 call 1126d0 <umask>
112562: 89 45 94 mov %eax,-0x6c(%ebp)
numask = oumask & ~(S_IWUSR | S_IXUSR);
112565: 24 3f and $0x3f,%al
(void)umask(numask);
112567: 89 04 24 mov %eax,(%esp)
11256a: e8 61 01 00 00 call 1126d0 <umask>
11256f: 83 c4 10 add $0x10,%esp
112572: eb 90 jmp 112504 <rtems_mkdir+0x58>
for (first = 1, last = 0; !last ; ++p) {
if (p[0] == '\0')
last = 1;
else if (p[0] != '/')
continue;
*p = '\0';
112574: c6 03 00 movb $0x0,(%ebx)
if (!last && p[1] == '\0')
112577: 31 d2 xor %edx,%edx
112579: 80 7b 01 00 cmpb $0x0,0x1(%ebx)
11257d: 0f 94 c2 sete %dl
112580: 89 d6 mov %edx,%esi
112582: e9 79 ff ff ff jmp 112500 <rtems_mkdir+0x54>
112587: 90 nop
first = 0;
}
if (last)
(void)umask(oumask);
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
if (errno == EEXIST || errno == EISDIR) {
112588: e8 3f 29 00 00 call 114ecc <__errno>
11258d: 83 38 11 cmpl $0x11,(%eax)
112590: 74 0a je 11259c <rtems_mkdir+0xf0>
112592: e8 35 29 00 00 call 114ecc <__errno>
112597: 83 38 15 cmpl $0x15,(%eax)
11259a: 75 53 jne 1125ef <rtems_mkdir+0x143> <== ALWAYS TAKEN
if (stat(path, &sb) < 0) {
11259c: 83 ec 08 sub $0x8,%esp
11259f: 8d 45 a0 lea -0x60(%ebp),%eax
1125a2: 50 push %eax
1125a3: 57 push %edi
1125a4: e8 7f 00 00 00 call 112628 <stat>
1125a9: 83 c4 10 add $0x10,%esp
1125ac: 85 c0 test %eax,%eax
1125ae: 78 3f js 1125ef <rtems_mkdir+0x143> <== NEVER TAKEN
retval = 0;
break;
} else if (!S_ISDIR(sb.st_mode)) {
1125b0: 8b 45 ac mov -0x54(%ebp),%eax
1125b3: 25 00 f0 00 00 and $0xf000,%eax
1125b8: 3d 00 40 00 00 cmp $0x4000,%eax
1125bd: 0f 84 5b ff ff ff je 11251e <rtems_mkdir+0x72>
if (last)
1125c3: 85 f6 test %esi,%esi
1125c5: 74 53 je 11261a <rtems_mkdir+0x16e>
errno = EEXIST;
1125c7: e8 00 29 00 00 call 114ecc <__errno>
1125cc: c7 00 11 00 00 00 movl $0x11,(%eax)
1125d2: eb 2d jmp 112601 <rtems_mkdir+0x155>
if (dup_path != NULL) {
success = build(dup_path, mode);
free(dup_path);
}
return success != 0 ? 0 : -1;
1125d4: b8 ff ff ff ff mov $0xffffffff,%eax <== NOT EXECUTED
}
1125d9: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
1125dc: 5b pop %ebx <== NOT EXECUTED
1125dd: 5e pop %esi <== NOT EXECUTED
1125de: 5f pop %edi <== NOT EXECUTED
1125df: c9 leave <== NOT EXECUTED
1125e0: c3 ret <== NOT EXECUTED
1125e1: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
p = path;
oumask = 0;
retval = 1;
if (p[0] == '/') /* Skip leading '/'. */
++p;
1125e4: 8d 58 01 lea 0x1(%eax),%ebx
1125e7: 8a 50 01 mov 0x1(%eax),%dl
1125ea: e9 e8 fe ff ff jmp 1124d7 <rtems_mkdir+0x2b>
}
}
if (!last)
*p = '/';
}
if (!first && !last)
1125ef: 85 f6 test %esi,%esi
1125f1: 75 0e jne 112601 <rtems_mkdir+0x155> <== ALWAYS TAKEN
(void)umask(oumask);
1125f3: 83 ec 0c sub $0xc,%esp
1125f6: ff 75 94 pushl -0x6c(%ebp)
1125f9: e8 d2 00 00 00 call 1126d0 <umask>
1125fe: 83 c4 10 add $0x10,%esp
int success = 0;
char *dup_path = strdup(path);
if (dup_path != NULL) {
success = build(dup_path, mode);
free(dup_path);
112601: 83 ec 0c sub $0xc,%esp
112604: 57 push %edi
112605: e8 02 6b ff ff call 10910c <free>
11260a: 83 c4 10 add $0x10,%esp
}
return success != 0 ? 0 : -1;
11260d: b8 ff ff ff ff mov $0xffffffff,%eax
}
112612: 8d 65 f4 lea -0xc(%ebp),%esp
112615: 5b pop %ebx
112616: 5e pop %esi
112617: 5f pop %edi
112618: c9 leave
112619: c3 ret
break;
} else if (!S_ISDIR(sb.st_mode)) {
if (last)
errno = EEXIST;
else
errno = ENOTDIR;
11261a: e8 ad 28 00 00 call 114ecc <__errno>
11261f: c7 00 14 00 00 00 movl $0x14,(%eax)
112625: eb cc jmp 1125f3 <rtems_mkdir+0x147>
0010b978 <rtems_object_get_api_name>:
};
const char *rtems_object_get_api_name(
int api
)
{
10b978: 55 push %ebp
10b979: 89 e5 mov %esp,%ebp
10b97b: 83 ec 10 sub $0x10,%esp
const rtems_assoc_t *api_assoc;
api_assoc = rtems_assoc_ptr_by_local( rtems_objects_api_assoc, api );
10b97e: ff 75 08 pushl 0x8(%ebp)
10b981: 68 e0 7c 12 00 push $0x127ce0
10b986: e8 b9 49 00 00 call 110344 <rtems_assoc_ptr_by_local>
if ( api_assoc )
10b98b: 83 c4 10 add $0x10,%esp
10b98e: 85 c0 test %eax,%eax
10b990: 74 06 je 10b998 <rtems_object_get_api_name+0x20>
return api_assoc->name;
10b992: 8b 00 mov (%eax),%eax
return "BAD CLASS";
}
10b994: c9 leave
10b995: c3 ret
10b996: 66 90 xchg %ax,%ax
const rtems_assoc_t *api_assoc;
api_assoc = rtems_assoc_ptr_by_local( rtems_objects_api_assoc, api );
if ( api_assoc )
return api_assoc->name;
return "BAD CLASS";
10b998: b8 03 2d 12 00 mov $0x122d03,%eax
}
10b99d: c9 leave
10b99e: c3 ret
0010cf60 <rtems_object_get_class_information>:
rtems_status_code rtems_object_get_class_information(
int the_api,
int the_class,
rtems_object_api_class_information *info
)
{
10cf60: 55 push %ebp
10cf61: 89 e5 mov %esp,%ebp
10cf63: 57 push %edi
10cf64: 56 push %esi
10cf65: 53 push %ebx
10cf66: 83 ec 0c sub $0xc,%esp
10cf69: 8b 5d 10 mov 0x10(%ebp),%ebx
int i;
/*
* Validate parameters and look up information structure.
*/
if ( !info )
10cf6c: 85 db test %ebx,%ebx
10cf6e: 74 60 je 10cfd0 <rtems_object_get_class_information+0x70>
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
10cf70: 83 ec 08 sub $0x8,%esp
10cf73: 0f b7 45 0c movzwl 0xc(%ebp),%eax
10cf77: 50 push %eax
10cf78: ff 75 08 pushl 0x8(%ebp)
10cf7b: e8 54 1b 00 00 call 10ead4 <_Objects_Get_information>
if ( !obj_info )
10cf80: 83 c4 10 add $0x10,%esp
10cf83: 85 c0 test %eax,%eax
10cf85: 74 59 je 10cfe0 <rtems_object_get_class_information+0x80>
return RTEMS_INVALID_NUMBER;
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
10cf87: 8b 50 08 mov 0x8(%eax),%edx
10cf8a: 89 13 mov %edx,(%ebx)
info->maximum_id = obj_info->maximum_id;
10cf8c: 8b 50 0c mov 0xc(%eax),%edx
10cf8f: 89 53 04 mov %edx,0x4(%ebx)
info->auto_extend = obj_info->auto_extend;
10cf92: 8a 50 12 mov 0x12(%eax),%dl
10cf95: 88 53 0c mov %dl,0xc(%ebx)
info->maximum = obj_info->maximum;
10cf98: 0f b7 70 10 movzwl 0x10(%eax),%esi
10cf9c: 89 73 08 mov %esi,0x8(%ebx)
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
10cf9f: 85 f6 test %esi,%esi
10cfa1: 74 44 je 10cfe7 <rtems_object_get_class_information+0x87><== NEVER TAKEN
10cfa3: 8b 78 1c mov 0x1c(%eax),%edi
10cfa6: b9 01 00 00 00 mov $0x1,%ecx
10cfab: b8 01 00 00 00 mov $0x1,%eax
10cfb0: 31 d2 xor %edx,%edx
10cfb2: 66 90 xchg %ax,%ax
if ( !obj_info->local_table[i] )
unallocated++;
10cfb4: 83 3c 8f 01 cmpl $0x1,(%edi,%ecx,4)
10cfb8: 83 d2 00 adc $0x0,%edx
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
10cfbb: 40 inc %eax
10cfbc: 89 c1 mov %eax,%ecx
10cfbe: 39 c6 cmp %eax,%esi
10cfc0: 73 f2 jae 10cfb4 <rtems_object_get_class_information+0x54>
if ( !obj_info->local_table[i] )
unallocated++;
info->unallocated = unallocated;
10cfc2: 89 53 10 mov %edx,0x10(%ebx)
return RTEMS_SUCCESSFUL;
10cfc5: 31 c0 xor %eax,%eax
}
10cfc7: 8d 65 f4 lea -0xc(%ebp),%esp
10cfca: 5b pop %ebx
10cfcb: 5e pop %esi
10cfcc: 5f pop %edi
10cfcd: c9 leave
10cfce: c3 ret
10cfcf: 90 nop
/*
* Validate parameters and look up information structure.
*/
if ( !info )
return RTEMS_INVALID_ADDRESS;
10cfd0: b8 09 00 00 00 mov $0x9,%eax
unallocated++;
info->unallocated = unallocated;
return RTEMS_SUCCESSFUL;
}
10cfd5: 8d 65 f4 lea -0xc(%ebp),%esp
10cfd8: 5b pop %ebx
10cfd9: 5e pop %esi
10cfda: 5f pop %edi
10cfdb: c9 leave
10cfdc: c3 ret
10cfdd: 8d 76 00 lea 0x0(%esi),%esi
if ( !info )
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
if ( !obj_info )
return RTEMS_INVALID_NUMBER;
10cfe0: b8 0a 00 00 00 mov $0xa,%eax
10cfe5: eb e0 jmp 10cfc7 <rtems_object_get_class_information+0x67>
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
10cfe7: 31 d2 xor %edx,%edx <== NOT EXECUTED
10cfe9: eb d7 jmp 10cfc2 <rtems_object_get_class_information+0x62><== NOT EXECUTED
0010c520 <rtems_object_get_classic_name>:
rtems_status_code rtems_object_get_classic_name(
rtems_id id,
rtems_name *name
)
{
10c520: 55 push %ebp
10c521: 89 e5 mov %esp,%ebp
10c523: 53 push %ebx
10c524: 83 ec 14 sub $0x14,%esp
10c527: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Name_or_id_lookup_errors status;
Objects_Name name_u;
if ( !name )
10c52a: 85 db test %ebx,%ebx
10c52c: 74 26 je 10c554 <rtems_object_get_classic_name+0x34>
return RTEMS_INVALID_ADDRESS;
status = _Objects_Id_to_name( id, &name_u );
10c52e: 83 ec 08 sub $0x8,%esp
10c531: 8d 45 f4 lea -0xc(%ebp),%eax
10c534: 50 push %eax
10c535: ff 75 08 pushl 0x8(%ebp)
10c538: e8 af 1b 00 00 call 10e0ec <_Objects_Id_to_name>
*name = name_u.name_u32;
10c53d: 8b 55 f4 mov -0xc(%ebp),%edx
10c540: 89 13 mov %edx,(%ebx)
return _Status_Object_name_errors_to_status[ status ];
10c542: 8b 04 85 ec 38 12 00 mov 0x1238ec(,%eax,4),%eax
10c549: 83 c4 10 add $0x10,%esp
}
10c54c: 8b 5d fc mov -0x4(%ebp),%ebx
10c54f: c9 leave
10c550: c3 ret
10c551: 8d 76 00 lea 0x0(%esi),%esi
{
Objects_Name_or_id_lookup_errors status;
Objects_Name name_u;
if ( !name )
return RTEMS_INVALID_ADDRESS;
10c554: b8 09 00 00 00 mov $0x9,%eax
status = _Objects_Id_to_name( id, &name_u );
*name = name_u.name_u32;
return _Status_Object_name_errors_to_status[ status ];
}
10c559: 8b 5d fc mov -0x4(%ebp),%ebx
10c55c: c9 leave
10c55d: c3 ret
0010b9ac <rtems_object_set_name>:
*/
rtems_status_code rtems_object_set_name(
rtems_id id,
const char *name
)
{
10b9ac: 55 push %ebp
10b9ad: 89 e5 mov %esp,%ebp
10b9af: 57 push %edi
10b9b0: 56 push %esi
10b9b1: 53 push %ebx
10b9b2: 83 ec 1c sub $0x1c,%esp
10b9b5: 8b 75 08 mov 0x8(%ebp),%esi
10b9b8: 8b 7d 0c mov 0xc(%ebp),%edi
Objects_Information *information;
Objects_Locations location;
Objects_Control *the_object;
Objects_Id tmpId;
if ( !name )
10b9bb: 85 ff test %edi,%edi
10b9bd: 74 61 je 10ba20 <rtems_object_set_name+0x74>
return RTEMS_INVALID_ADDRESS;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
10b9bf: 85 f6 test %esi,%esi
10b9c1: 74 35 je 10b9f8 <rtems_object_set_name+0x4c>
information = _Objects_Get_information_id( tmpId );
10b9c3: 83 ec 0c sub $0xc,%esp
10b9c6: 56 push %esi
10b9c7: e8 2c 19 00 00 call 10d2f8 <_Objects_Get_information_id>
10b9cc: 89 c3 mov %eax,%ebx
if ( !information )
10b9ce: 83 c4 10 add $0x10,%esp
10b9d1: 85 c0 test %eax,%eax
10b9d3: 74 16 je 10b9eb <rtems_object_set_name+0x3f>
return RTEMS_INVALID_ID;
the_object = _Objects_Get( information, tmpId, &location );
10b9d5: 50 push %eax
10b9d6: 8d 45 e4 lea -0x1c(%ebp),%eax
10b9d9: 50 push %eax
10b9da: 56 push %esi
10b9db: 53 push %ebx
10b9dc: e8 cf 1a 00 00 call 10d4b0 <_Objects_Get>
switch ( location ) {
10b9e1: 83 c4 10 add $0x10,%esp
10b9e4: 8b 4d e4 mov -0x1c(%ebp),%ecx
10b9e7: 85 c9 test %ecx,%ecx
10b9e9: 74 19 je 10ba04 <rtems_object_set_name+0x58>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b9eb: b8 04 00 00 00 mov $0x4,%eax
}
10b9f0: 8d 65 f4 lea -0xc(%ebp),%esp
10b9f3: 5b pop %ebx
10b9f4: 5e pop %esi
10b9f5: 5f pop %edi
10b9f6: c9 leave
10b9f7: c3 ret
Objects_Id tmpId;
if ( !name )
return RTEMS_INVALID_ADDRESS;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
10b9f8: a1 d8 a6 12 00 mov 0x12a6d8,%eax
10b9fd: 8b 70 08 mov 0x8(%eax),%esi
10ba00: eb c1 jmp 10b9c3 <rtems_object_set_name+0x17>
10ba02: 66 90 xchg %ax,%ax
the_object = _Objects_Get( information, tmpId, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_Objects_Set_name( information, the_object, name );
10ba04: 52 push %edx
10ba05: 57 push %edi
10ba06: 50 push %eax
10ba07: 53 push %ebx
10ba08: e8 9f 1c 00 00 call 10d6ac <_Objects_Set_name>
_Thread_Enable_dispatch();
10ba0d: e8 36 26 00 00 call 10e048 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10ba12: 83 c4 10 add $0x10,%esp
10ba15: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10ba17: 8d 65 f4 lea -0xc(%ebp),%esp
10ba1a: 5b pop %ebx
10ba1b: 5e pop %esi
10ba1c: 5f pop %edi
10ba1d: c9 leave
10ba1e: c3 ret
10ba1f: 90 nop
Objects_Locations location;
Objects_Control *the_object;
Objects_Id tmpId;
if ( !name )
return RTEMS_INVALID_ADDRESS;
10ba20: b8 09 00 00 00 mov $0x9,%eax
10ba25: eb c9 jmp 10b9f0 <rtems_object_set_name+0x44>
0011681c <rtems_partition_create>:
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
11681c: 55 push %ebp
11681d: 89 e5 mov %esp,%ebp
11681f: 57 push %edi
116820: 56 push %esi
116821: 53 push %ebx
116822: 83 ec 1c sub $0x1c,%esp
116825: 8b 5d 08 mov 0x8(%ebp),%ebx
116828: 8b 75 0c mov 0xc(%ebp),%esi
11682b: 8b 55 10 mov 0x10(%ebp),%edx
11682e: 8b 7d 14 mov 0x14(%ebp),%edi
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
116831: 85 db test %ebx,%ebx
116833: 74 47 je 11687c <rtems_partition_create+0x60>
return RTEMS_INVALID_NAME;
if ( !starting_address )
116835: 85 f6 test %esi,%esi
116837: 74 23 je 11685c <rtems_partition_create+0x40>
return RTEMS_INVALID_ADDRESS;
if ( !id )
116839: 8b 45 1c mov 0x1c(%ebp),%eax
11683c: 85 c0 test %eax,%eax
11683e: 74 1c je 11685c <rtems_partition_create+0x40><== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
116840: 85 d2 test %edx,%edx
116842: 74 28 je 11686c <rtems_partition_create+0x50>
116844: 85 ff test %edi,%edi
116846: 74 24 je 11686c <rtems_partition_create+0x50>
116848: 39 fa cmp %edi,%edx
11684a: 72 20 jb 11686c <rtems_partition_create+0x50>
11684c: f7 c7 03 00 00 00 test $0x3,%edi
116852: 75 18 jne 11686c <rtems_partition_create+0x50>
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
116854: f7 c6 03 00 00 00 test $0x3,%esi
11685a: 74 30 je 11688c <rtems_partition_create+0x70>
return RTEMS_INVALID_ADDRESS;
11685c: b8 09 00 00 00 mov $0x9,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
116861: 8d 65 f4 lea -0xc(%ebp),%esp
116864: 5b pop %ebx
116865: 5e pop %esi
116866: 5f pop %edi
116867: c9 leave
116868: c3 ret
116869: 8d 76 00 lea 0x0(%esi),%esi
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
11686c: b8 08 00 00 00 mov $0x8,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
116871: 8d 65 f4 lea -0xc(%ebp),%esp
116874: 5b pop %ebx
116875: 5e pop %esi
116876: 5f pop %edi
116877: c9 leave
116878: c3 ret
116879: 8d 76 00 lea 0x0(%esi),%esi
)
{
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
11687c: b8 03 00 00 00 mov $0x3,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
116881: 8d 65 f4 lea -0xc(%ebp),%esp
116884: 5b pop %ebx
116885: 5e pop %esi
116886: 5f pop %edi
116887: c9 leave
116888: c3 ret
116889: 8d 76 00 lea 0x0(%esi),%esi
11688c: a1 d0 2a 14 00 mov 0x142ad0,%eax
116891: 40 inc %eax
116892: a3 d0 2a 14 00 mov %eax,0x142ad0
* This function allocates a partition control block from
* the inactive chain of free partition control blocks.
*/
RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Allocate ( void )
{
return (Partition_Control *) _Objects_Allocate( &_Partition_Information );
116897: 83 ec 0c sub $0xc,%esp
11689a: 68 60 29 14 00 push $0x142960
11689f: 89 55 e0 mov %edx,-0x20(%ebp)
1168a2: e8 49 45 00 00 call 11adf0 <_Objects_Allocate>
1168a7: 89 45 e4 mov %eax,-0x1c(%ebp)
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
1168aa: 83 c4 10 add $0x10,%esp
1168ad: 85 c0 test %eax,%eax
1168af: 8b 55 e0 mov -0x20(%ebp),%edx
1168b2: 74 58 je 11690c <rtems_partition_create+0xf0>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
1168b4: 8b 45 e4 mov -0x1c(%ebp),%eax
1168b7: 89 70 10 mov %esi,0x10(%eax)
the_partition->length = length;
1168ba: 89 50 14 mov %edx,0x14(%eax)
the_partition->buffer_size = buffer_size;
1168bd: 89 78 18 mov %edi,0x18(%eax)
the_partition->attribute_set = attribute_set;
1168c0: 8b 4d 18 mov 0x18(%ebp),%ecx
1168c3: 89 48 1c mov %ecx,0x1c(%eax)
the_partition->number_of_used_blocks = 0;
1168c6: c7 40 20 00 00 00 00 movl $0x0,0x20(%eax)
_Chain_Initialize( &the_partition->Memory, starting_address,
1168cd: 57 push %edi
1168ce: 89 d0 mov %edx,%eax
1168d0: 31 d2 xor %edx,%edx
1168d2: f7 f7 div %edi
1168d4: 50 push %eax
1168d5: 56 push %esi
1168d6: 8b 45 e4 mov -0x1c(%ebp),%eax
1168d9: 83 c0 24 add $0x24,%eax
1168dc: 50 push %eax
1168dd: e8 a2 2f 00 00 call 119884 <_Chain_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
1168e2: 8b 7d e4 mov -0x1c(%ebp),%edi
1168e5: 8b 47 08 mov 0x8(%edi),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
1168e8: 0f b7 f0 movzwl %ax,%esi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
1168eb: 8b 15 7c 29 14 00 mov 0x14297c,%edx
1168f1: 89 3c b2 mov %edi,(%edx,%esi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
1168f4: 89 5f 0c mov %ebx,0xc(%edi)
&_Partition_Information,
&the_partition->Object,
(Objects_Name) name
);
*id = the_partition->Object.id;
1168f7: 8b 55 1c mov 0x1c(%ebp),%edx
1168fa: 89 02 mov %eax,(%edx)
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
1168fc: e8 97 54 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
116901: 83 c4 10 add $0x10,%esp
116904: 31 c0 xor %eax,%eax
116906: e9 66 ff ff ff jmp 116871 <rtems_partition_create+0x55>
11690b: 90 nop
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
_Thread_Enable_dispatch();
11690c: e8 87 54 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
116911: b8 05 00 00 00 mov $0x5,%eax
116916: e9 56 ff ff ff jmp 116871 <rtems_partition_create+0x55>
00116988 <rtems_partition_get_buffer>:
rtems_status_code rtems_partition_get_buffer(
rtems_id id,
void **buffer
)
{
116988: 55 push %ebp
116989: 89 e5 mov %esp,%ebp
11698b: 56 push %esi
11698c: 53 push %ebx
11698d: 83 ec 20 sub $0x20,%esp
116990: 8b 5d 0c mov 0xc(%ebp),%ebx
register Partition_Control *the_partition;
Objects_Locations location;
void *the_buffer;
if ( !buffer )
116993: 85 db test %ebx,%ebx
116995: 74 59 je 1169f0 <rtems_partition_get_buffer+0x68>
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
_Objects_Get( &_Partition_Information, id, location );
116997: 52 push %edx
return RTEMS_INVALID_ADDRESS;
the_partition = _Partition_Get( id, &location );
116998: 8d 45 f4 lea -0xc(%ebp),%eax
11699b: 50 push %eax
11699c: ff 75 08 pushl 0x8(%ebp)
11699f: 68 60 29 14 00 push $0x142960
1169a4: e8 3b 49 00 00 call 11b2e4 <_Objects_Get>
1169a9: 89 c6 mov %eax,%esi
switch ( location ) {
1169ab: 83 c4 10 add $0x10,%esp
1169ae: 8b 45 f4 mov -0xc(%ebp),%eax
1169b1: 85 c0 test %eax,%eax
1169b3: 75 2f jne 1169e4 <rtems_partition_get_buffer+0x5c>
*/
RTEMS_INLINE_ROUTINE void *_Partition_Allocate_buffer (
Partition_Control *the_partition
)
{
return _Chain_Get( &the_partition->Memory );
1169b5: 83 ec 0c sub $0xc,%esp
1169b8: 8d 46 24 lea 0x24(%esi),%eax
1169bb: 50 push %eax
1169bc: e8 9f 2e 00 00 call 119860 <_Chain_Get>
case OBJECTS_LOCAL:
the_buffer = _Partition_Allocate_buffer( the_partition );
if ( the_buffer ) {
1169c1: 83 c4 10 add $0x10,%esp
1169c4: 85 c0 test %eax,%eax
1169c6: 74 34 je 1169fc <rtems_partition_get_buffer+0x74>
the_partition->number_of_used_blocks += 1;
1169c8: ff 46 20 incl 0x20(%esi)
_Thread_Enable_dispatch();
1169cb: 89 45 e4 mov %eax,-0x1c(%ebp)
1169ce: e8 c5 53 00 00 call 11bd98 <_Thread_Enable_dispatch>
*buffer = the_buffer;
1169d3: 8b 45 e4 mov -0x1c(%ebp),%eax
1169d6: 89 03 mov %eax,(%ebx)
return RTEMS_SUCCESSFUL;
1169d8: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1169da: 8d 65 f8 lea -0x8(%ebp),%esp
1169dd: 5b pop %ebx
1169de: 5e pop %esi
1169df: c9 leave
1169e0: c3 ret
1169e1: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1169e4: b8 04 00 00 00 mov $0x4,%eax
}
1169e9: 8d 65 f8 lea -0x8(%ebp),%esp
1169ec: 5b pop %ebx
1169ed: 5e pop %esi
1169ee: c9 leave
1169ef: c3 ret
register Partition_Control *the_partition;
Objects_Locations location;
void *the_buffer;
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
1169f0: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1169f5: 8d 65 f8 lea -0x8(%ebp),%esp
1169f8: 5b pop %ebx
1169f9: 5e pop %esi
1169fa: c9 leave
1169fb: c3 ret
the_partition->number_of_used_blocks += 1;
_Thread_Enable_dispatch();
*buffer = the_buffer;
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
1169fc: e8 97 53 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_UNSATISFIED;
116a01: b8 0d 00 00 00 mov $0xd,%eax
116a06: eb e1 jmp 1169e9 <rtems_partition_get_buffer+0x61>
00116a2c <rtems_partition_return_buffer>:
rtems_status_code rtems_partition_return_buffer(
rtems_id id,
void *buffer
)
{
116a2c: 55 push %ebp
116a2d: 89 e5 mov %esp,%ebp
116a2f: 56 push %esi
116a30: 53 push %ebx
116a31: 83 ec 14 sub $0x14,%esp
116a34: 8b 75 0c mov 0xc(%ebp),%esi
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
116a37: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
_Objects_Get( &_Partition_Information, id, location );
116a3a: 50 push %eax
116a3b: ff 75 08 pushl 0x8(%ebp)
116a3e: 68 60 29 14 00 push $0x142960
116a43: e8 9c 48 00 00 call 11b2e4 <_Objects_Get>
116a48: 89 c3 mov %eax,%ebx
switch ( location ) {
116a4a: 83 c4 10 add $0x10,%esp
116a4d: 8b 45 f4 mov -0xc(%ebp),%eax
116a50: 85 c0 test %eax,%eax
116a52: 74 0c je 116a60 <rtems_partition_return_buffer+0x34>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
116a54: b8 04 00 00 00 mov $0x4,%eax
}
116a59: 8d 65 f8 lea -0x8(%ebp),%esp
116a5c: 5b pop %ebx
116a5d: 5e pop %esi
116a5e: c9 leave
116a5f: c3 ret
)
{
void *starting;
void *ending;
starting = the_partition->starting_address;
116a60: 8b 43 10 mov 0x10(%ebx),%eax
ending = _Addresses_Add_offset( starting, the_partition->length );
116a63: 8b 53 14 mov 0x14(%ebx),%edx
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
116a66: 39 c6 cmp %eax,%esi
116a68: 72 3a jb 116aa4 <rtems_partition_return_buffer+0x78>
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
116a6a: 8d 14 10 lea (%eax,%edx,1),%edx
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
116a6d: 39 d6 cmp %edx,%esi
116a6f: 77 33 ja 116aa4 <rtems_partition_return_buffer+0x78><== NEVER TAKEN
RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract (
const void *left,
const void *right
)
{
return (int32_t) ((const char *) left - (const char *) right);
116a71: 89 f2 mov %esi,%edx
116a73: 29 c2 sub %eax,%edx
116a75: 89 d0 mov %edx,%eax
offset = (uint32_t) _Addresses_Subtract(
the_buffer,
the_partition->starting_address
);
return ((offset % the_partition->buffer_size) == 0);
116a77: 31 d2 xor %edx,%edx
116a79: f7 73 18 divl 0x18(%ebx)
starting = the_partition->starting_address;
ending = _Addresses_Add_offset( starting, the_partition->length );
return (
_Addresses_Is_in_range( the_buffer, starting, ending ) &&
116a7c: 85 d2 test %edx,%edx
116a7e: 75 24 jne 116aa4 <rtems_partition_return_buffer+0x78>
RTEMS_INLINE_ROUTINE void _Partition_Free_buffer (
Partition_Control *the_partition,
Chain_Node *the_buffer
)
{
_Chain_Append( &the_partition->Memory, the_buffer );
116a80: 83 ec 08 sub $0x8,%esp
116a83: 56 push %esi
116a84: 8d 43 24 lea 0x24(%ebx),%eax
116a87: 50 push %eax
116a88: e8 97 2d 00 00 call 119824 <_Chain_Append>
switch ( location ) {
case OBJECTS_LOCAL:
if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) {
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
116a8d: ff 4b 20 decl 0x20(%ebx)
_Thread_Enable_dispatch();
116a90: e8 03 53 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
116a95: 83 c4 10 add $0x10,%esp
116a98: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116a9a: 8d 65 f8 lea -0x8(%ebp),%esp
116a9d: 5b pop %ebx
116a9e: 5e pop %esi
116a9f: c9 leave
116aa0: c3 ret
116aa1: 8d 76 00 lea 0x0(%esi),%esi
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
116aa4: e8 ef 52 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
116aa9: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116aae: 8d 65 f8 lea -0x8(%ebp),%esp
116ab1: 5b pop %ebx
116ab2: 5e pop %esi
116ab3: c9 leave
116ab4: c3 ret
00115e50 <rtems_port_create>:
void *internal_start,
void *external_start,
uint32_t length,
rtems_id *id
)
{
115e50: 55 push %ebp
115e51: 89 e5 mov %esp,%ebp
115e53: 57 push %edi
115e54: 56 push %esi
115e55: 53 push %ebx
115e56: 83 ec 1c sub $0x1c,%esp
115e59: 8b 5d 08 mov 0x8(%ebp),%ebx
115e5c: 8b 55 0c mov 0xc(%ebp),%edx
115e5f: 8b 7d 10 mov 0x10(%ebp),%edi
115e62: 8b 75 18 mov 0x18(%ebp),%esi
register Dual_ported_memory_Control *the_port;
if ( !rtems_is_name_valid( name ) )
115e65: 85 db test %ebx,%ebx
115e67: 74 1b je 115e84 <rtems_port_create+0x34>
return RTEMS_INVALID_NAME;
if ( !id )
115e69: 85 f6 test %esi,%esi
115e6b: 74 08 je 115e75 <rtems_port_create+0x25>
* id - port id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_port_create(
115e6d: 89 f8 mov %edi,%eax
115e6f: 09 d0 or %edx,%eax
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( !_Addresses_Is_aligned( internal_start ) ||
115e71: a8 03 test $0x3,%al
115e73: 74 1f je 115e94 <rtems_port_create+0x44>
!_Addresses_Is_aligned( external_start ) )
return RTEMS_INVALID_ADDRESS;
115e75: b8 09 00 00 00 mov $0x9,%eax
);
*id = the_port->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
115e7a: 8d 65 f4 lea -0xc(%ebp),%esp
115e7d: 5b pop %ebx
115e7e: 5e pop %esi
115e7f: 5f pop %edi
115e80: c9 leave
115e81: c3 ret
115e82: 66 90 xchg %ax,%ax
)
{
register Dual_ported_memory_Control *the_port;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
115e84: b8 03 00 00 00 mov $0x3,%eax
);
*id = the_port->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
115e89: 8d 65 f4 lea -0xc(%ebp),%esp
115e8c: 5b pop %ebx
115e8d: 5e pop %esi
115e8e: 5f pop %edi
115e8f: c9 leave
115e90: c3 ret
115e91: 8d 76 00 lea 0x0(%esi),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
115e94: a1 d0 2a 14 00 mov 0x142ad0,%eax
115e99: 40 inc %eax
115e9a: a3 d0 2a 14 00 mov %eax,0x142ad0
*/
RTEMS_INLINE_ROUTINE Dual_ported_memory_Control
*_Dual_ported_memory_Allocate ( void )
{
return (Dual_ported_memory_Control *)
_Objects_Allocate( &_Dual_ported_memory_Information );
115e9f: 83 ec 0c sub $0xc,%esp
115ea2: 68 20 29 14 00 push $0x142920
115ea7: 89 55 e4 mov %edx,-0x1c(%ebp)
115eaa: e8 41 4f 00 00 call 11adf0 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* to prevent deletion */
the_port = _Dual_ported_memory_Allocate();
if ( !the_port ) {
115eaf: 83 c4 10 add $0x10,%esp
115eb2: 85 c0 test %eax,%eax
115eb4: 8b 55 e4 mov -0x1c(%ebp),%edx
115eb7: 74 33 je 115eec <rtems_port_create+0x9c>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_port->internal_base = internal_start;
115eb9: 89 50 10 mov %edx,0x10(%eax)
the_port->external_base = external_start;
115ebc: 89 78 14 mov %edi,0x14(%eax)
the_port->length = length - 1;
115ebf: 8b 55 14 mov 0x14(%ebp),%edx
115ec2: 4a dec %edx
115ec3: 89 50 18 mov %edx,0x18(%eax)
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
115ec6: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
115ec9: 0f b7 fa movzwl %dx,%edi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
115ecc: 8b 0d 3c 29 14 00 mov 0x14293c,%ecx
115ed2: 89 04 b9 mov %eax,(%ecx,%edi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
115ed5: 89 58 0c mov %ebx,0xc(%eax)
&_Dual_ported_memory_Information,
&the_port->Object,
(Objects_Name) name
);
*id = the_port->Object.id;
115ed8: 89 16 mov %edx,(%esi)
_Thread_Enable_dispatch();
115eda: e8 b9 5e 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
115edf: 31 c0 xor %eax,%eax
}
115ee1: 8d 65 f4 lea -0xc(%ebp),%esp
115ee4: 5b pop %ebx
115ee5: 5e pop %esi
115ee6: 5f pop %edi
115ee7: c9 leave
115ee8: c3 ret
115ee9: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* to prevent deletion */
the_port = _Dual_ported_memory_Allocate();
if ( !the_port ) {
_Thread_Enable_dispatch();
115eec: e8 a7 5e 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
115ef1: b8 05 00 00 00 mov $0x5,%eax
115ef6: eb 82 jmp 115e7a <rtems_port_create+0x2a>
00115ef8 <rtems_port_delete>:
*/
rtems_status_code rtems_port_delete(
rtems_id id
)
{
115ef8: 55 push %ebp
115ef9: 89 e5 mov %esp,%ebp
115efb: 83 ec 2c sub $0x2c,%esp
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
the_port = _Dual_ported_memory_Get( id, &location );
115efe: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Dual_ported_memory_Control *)
_Objects_Get( &_Dual_ported_memory_Information, id, location );
115f01: 50 push %eax
115f02: ff 75 08 pushl 0x8(%ebp)
115f05: 68 20 29 14 00 push $0x142920
115f0a: e8 d5 53 00 00 call 11b2e4 <_Objects_Get>
switch ( location ) {
115f0f: 83 c4 10 add $0x10,%esp
115f12: 8b 4d f4 mov -0xc(%ebp),%ecx
115f15: 85 c9 test %ecx,%ecx
115f17: 75 2f jne 115f48 <rtems_port_delete+0x50>
case OBJECTS_LOCAL:
_Objects_Close( &_Dual_ported_memory_Information, &the_port->Object );
115f19: 83 ec 08 sub $0x8,%esp
115f1c: 50 push %eax
115f1d: 68 20 29 14 00 push $0x142920
115f22: 89 45 e4 mov %eax,-0x1c(%ebp)
115f25: e8 42 4f 00 00 call 11ae6c <_Objects_Close>
*/
RTEMS_INLINE_ROUTINE void _Dual_ported_memory_Free (
Dual_ported_memory_Control *the_port
)
{
_Objects_Free( &_Dual_ported_memory_Information, &the_port->Object );
115f2a: 58 pop %eax
115f2b: 5a pop %edx
115f2c: 8b 45 e4 mov -0x1c(%ebp),%eax
115f2f: 50 push %eax
115f30: 68 20 29 14 00 push $0x142920
115f35: e8 2e 52 00 00 call 11b168 <_Objects_Free>
_Dual_ported_memory_Free( the_port );
_Thread_Enable_dispatch();
115f3a: e8 59 5e 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
115f3f: 83 c4 10 add $0x10,%esp
115f42: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
115f44: c9 leave
115f45: c3 ret
115f46: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
115f48: b8 04 00 00 00 mov $0x4,%eax
}
115f4d: c9 leave
115f4e: c3 ret
00115f50 <rtems_port_external_to_internal>:
rtems_status_code rtems_port_external_to_internal(
rtems_id id,
void *external,
void **internal
)
{
115f50: 55 push %ebp
115f51: 89 e5 mov %esp,%ebp
115f53: 56 push %esi
115f54: 53 push %ebx
115f55: 83 ec 10 sub $0x10,%esp
115f58: 8b 75 0c mov 0xc(%ebp),%esi
115f5b: 8b 5d 10 mov 0x10(%ebp),%ebx
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !internal )
115f5e: 85 db test %ebx,%ebx
115f60: 74 4e je 115fb0 <rtems_port_external_to_internal+0x60>
Objects_Id id,
Objects_Locations *location
)
{
return (Dual_ported_memory_Control *)
_Objects_Get( &_Dual_ported_memory_Information, id, location );
115f62: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_port = _Dual_ported_memory_Get( id, &location );
115f63: 8d 45 f4 lea -0xc(%ebp),%eax
115f66: 50 push %eax
115f67: ff 75 08 pushl 0x8(%ebp)
115f6a: 68 20 29 14 00 push $0x142920
115f6f: e8 70 53 00 00 call 11b2e4 <_Objects_Get>
switch ( location ) {
115f74: 83 c4 10 add $0x10,%esp
115f77: 8b 55 f4 mov -0xc(%ebp),%edx
115f7a: 85 d2 test %edx,%edx
115f7c: 74 0e je 115f8c <rtems_port_external_to_internal+0x3c>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
115f7e: b8 04 00 00 00 mov $0x4,%eax
}
115f83: 8d 65 f8 lea -0x8(%ebp),%esp
115f86: 5b pop %ebx
115f87: 5e pop %esi
115f88: c9 leave
115f89: c3 ret
115f8a: 66 90 xchg %ax,%ax
RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract (
const void *left,
const void *right
)
{
return (int32_t) ((const char *) left - (const char *) right);
115f8c: 89 f2 mov %esi,%edx
115f8e: 2b 50 14 sub 0x14(%eax),%edx
the_port = _Dual_ported_memory_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
ending = _Addresses_Subtract( external, the_port->external_base );
if ( ending > the_port->length )
115f91: 3b 50 18 cmp 0x18(%eax),%edx
115f94: 77 16 ja 115fac <rtems_port_external_to_internal+0x5c>
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
115f96: 03 50 10 add 0x10(%eax),%edx
115f99: 89 13 mov %edx,(%ebx)
*internal = external;
else
*internal = _Addresses_Add_offset( the_port->internal_base,
ending );
_Thread_Enable_dispatch();
115f9b: e8 f8 5d 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
115fa0: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
115fa2: 8d 65 f8 lea -0x8(%ebp),%esp
115fa5: 5b pop %ebx
115fa6: 5e pop %esi
115fa7: c9 leave
115fa8: c3 ret
115fa9: 8d 76 00 lea 0x0(%esi),%esi
the_port = _Dual_ported_memory_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
ending = _Addresses_Subtract( external, the_port->external_base );
if ( ending > the_port->length )
*internal = external;
115fac: 89 33 mov %esi,(%ebx)
115fae: eb eb jmp 115f9b <rtems_port_external_to_internal+0x4b>
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !internal )
return RTEMS_INVALID_ADDRESS;
115fb0: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
115fb5: 8d 65 f8 lea -0x8(%ebp),%esp
115fb8: 5b pop %ebx
115fb9: 5e pop %esi
115fba: c9 leave
115fbb: c3 ret
00115fe0 <rtems_port_internal_to_external>:
rtems_status_code rtems_port_internal_to_external(
rtems_id id,
void *internal,
void **external
)
{
115fe0: 55 push %ebp
115fe1: 89 e5 mov %esp,%ebp
115fe3: 56 push %esi
115fe4: 53 push %ebx
115fe5: 83 ec 10 sub $0x10,%esp
115fe8: 8b 75 0c mov 0xc(%ebp),%esi
115feb: 8b 5d 10 mov 0x10(%ebp),%ebx
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !external )
115fee: 85 db test %ebx,%ebx
115ff0: 74 4e je 116040 <rtems_port_internal_to_external+0x60><== NEVER TAKEN
115ff2: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_port = _Dual_ported_memory_Get( id, &location );
115ff3: 8d 45 f4 lea -0xc(%ebp),%eax
115ff6: 50 push %eax
115ff7: ff 75 08 pushl 0x8(%ebp)
115ffa: 68 20 29 14 00 push $0x142920
115fff: e8 e0 52 00 00 call 11b2e4 <_Objects_Get>
switch ( location ) {
116004: 83 c4 10 add $0x10,%esp
116007: 8b 55 f4 mov -0xc(%ebp),%edx
11600a: 85 d2 test %edx,%edx
11600c: 74 0e je 11601c <rtems_port_internal_to_external+0x3c>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
11600e: b8 04 00 00 00 mov $0x4,%eax
}
116013: 8d 65 f8 lea -0x8(%ebp),%esp
116016: 5b pop %ebx
116017: 5e pop %esi
116018: c9 leave
116019: c3 ret
11601a: 66 90 xchg %ax,%ax
RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract (
const void *left,
const void *right
)
{
return (int32_t) ((const char *) left - (const char *) right);
11601c: 89 f2 mov %esi,%edx
11601e: 2b 50 10 sub 0x10(%eax),%edx
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 )
116021: 3b 50 18 cmp 0x18(%eax),%edx
116024: 77 16 ja 11603c <rtems_port_internal_to_external+0x5c>
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
116026: 03 50 14 add 0x14(%eax),%edx
116029: 89 13 mov %edx,(%ebx)
*external = internal;
else
*external = _Addresses_Add_offset( the_port->external_base,
ending );
_Thread_Enable_dispatch();
11602b: e8 68 5d 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
116030: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116032: 8d 65 f8 lea -0x8(%ebp),%esp
116035: 5b pop %ebx
116036: 5e pop %esi
116037: c9 leave
116038: c3 ret
116039: 8d 76 00 lea 0x0(%esi),%esi
switch ( location ) {
case OBJECTS_LOCAL:
ending = _Addresses_Subtract( internal, the_port->internal_base );
if ( ending > the_port->length )
*external = internal;
11603c: 89 33 mov %esi,(%ebx)
11603e: eb eb jmp 11602b <rtems_port_internal_to_external+0x4b>
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !external )
return RTEMS_INVALID_ADDRESS;
116040: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116045: 8d 65 f8 lea -0x8(%ebp),%esp
116048: 5b pop %ebx
116049: 5e pop %esi
11604a: c9 leave
11604b: c3 ret
00107830 <rtems_print_buffer>:
void rtems_print_buffer(
const unsigned char *buffer,
int length
)
{
107830: 55 push %ebp
107831: 89 e5 mov %esp,%ebp
107833: 57 push %edi
107834: 56 push %esi
107835: 53 push %ebx
107836: 81 ec 9c 00 00 00 sub $0x9c,%esp
10783c: 8b 75 0c mov 0xc(%ebp),%esi
int i, mod, max;
if ( !length ) return;
10783f: 85 f6 test %esi,%esi
107841: 0f 84 00 01 00 00 je 107947 <rtems_print_buffer+0x117>
mod = length % 16;
107847: 89 f0 mov %esi,%eax
107849: 25 0f 00 00 80 and $0x8000000f,%eax
10784e: 89 85 60 ff ff ff mov %eax,-0xa0(%ebp)
107854: 0f 88 21 02 00 00 js 107a7b <rtems_print_buffer+0x24b>
10785a: 8b 85 60 ff ff ff mov -0xa0(%ebp),%eax
107860: 89 85 58 ff ff ff mov %eax,-0xa8(%ebp)
max = length - mod;
107866: 29 c6 sub %eax,%esi
107868: 89 b5 5c ff ff ff mov %esi,-0xa4(%ebp)
for ( i=0 ; i<max ; i+=16 )
10786e: 85 f6 test %esi,%esi
107870: 0f 8e c7 00 00 00 jle 10793d <rtems_print_buffer+0x10d>
107876: c7 85 64 ff ff ff 00 movl $0x0,-0x9c(%ebp)
10787d: 00 00 00
107880: 8d 9d 70 ff ff ff lea -0x90(%ebp),%ebx
107886: 66 90 xchg %ax,%ax
static inline void Dump_Line(
const unsigned char *buffer,
int length
);
void rtems_print_buffer(
107888: 8b 75 08 mov 0x8(%ebp),%esi
10788b: 03 b5 64 ff ff ff add -0x9c(%ebp),%esi
{
int i;
char line_buffer[120];
line_buffer[0] = '\0';
107891: c6 85 70 ff ff ff 00 movb $0x0,-0x90(%ebp)
for( i=0 ; i<length ; i++ )
107898: 31 ff xor %edi,%edi
10789a: 66 90 xchg %ax,%ax
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
10789c: 0f b6 04 3e movzbl (%esi,%edi,1),%eax
1078a0: 50 push %eax
1078a1: 53 push %ebx
1078a2: 68 93 14 12 00 push $0x121493
1078a7: 53 push %ebx
1078a8: e8 5f c6 00 00 call 113f0c <sprintf>
int i;
char line_buffer[120];
line_buffer[0] = '\0';
for( i=0 ; i<length ; i++ )
1078ad: 47 inc %edi
1078ae: 83 c4 10 add $0x10,%esp
1078b1: 83 ff 10 cmp $0x10,%edi
1078b4: 75 e6 jne 10789c <rtems_print_buffer+0x6c>
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
1078b6: 31 c0 xor %eax,%eax
1078b8: b9 ff ff ff ff mov $0xffffffff,%ecx
1078bd: 89 df mov %ebx,%edi
1078bf: f2 ae repnz scas %es:(%edi),%al
1078c1: f7 d1 not %ecx
1078c3: 66 c7 44 0b ff 7c 00 movw $0x7c,-0x1(%ebx,%ecx,1)
for( i=0 ; i<length ; i++ )
1078ca: 31 ff xor %edi,%edi
sprintf( line_buffer, "%s%c", line_buffer,
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
1078cc: 0f b6 04 3e movzbl (%esi,%edi,1),%eax
1078d0: 8b 15 b4 5c 12 00 mov 0x125cb4,%edx
1078d6: 0f be 54 02 01 movsbl 0x1(%edx,%eax,1),%edx
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%c", line_buffer,
1078db: 81 e2 97 00 00 00 and $0x97,%edx
1078e1: 75 05 jne 1078e8 <rtems_print_buffer+0xb8>
1078e3: b8 2e 00 00 00 mov $0x2e,%eax
1078e8: 50 push %eax
1078e9: 53 push %ebx
1078ea: 68 9b 14 12 00 push $0x12149b
1078ef: 53 push %ebx
1078f0: e8 17 c6 00 00 call 113f0c <sprintf>
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
1078f5: 47 inc %edi
1078f6: 83 c4 10 add $0x10,%esp
1078f9: 83 ff 10 cmp $0x10,%edi
1078fc: 75 ce jne 1078cc <rtems_print_buffer+0x9c>
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|\n" );
1078fe: 31 c0 xor %eax,%eax
107900: b9 ff ff ff ff mov $0xffffffff,%ecx
107905: 89 df mov %ebx,%edi
107907: f2 ae repnz scas %es:(%edi),%al
107909: f7 d1 not %ecx
10790b: 8d 44 0b ff lea -0x1(%ebx,%ecx,1),%eax
10790f: 66 c7 00 7c 0a movw $0xa7c,(%eax)
107914: c6 40 02 00 movb $0x0,0x2(%eax)
printk( line_buffer );
107918: 83 ec 0c sub $0xc,%esp
10791b: 53 push %ebx
10791c: e8 17 18 00 00 call 109138 <printk>
mod = length % 16;
max = length - mod;
for ( i=0 ; i<max ; i+=16 )
107921: 83 85 64 ff ff ff 10 addl $0x10,-0x9c(%ebp)
107928: 83 c4 10 add $0x10,%esp
10792b: 8b 85 64 ff ff ff mov -0x9c(%ebp),%eax
107931: 39 85 5c ff ff ff cmp %eax,-0xa4(%ebp)
107937: 0f 8f 4b ff ff ff jg 107888 <rtems_print_buffer+0x58>
Dump_Line( &buffer[ i ], 16 );
if ( mod )
10793d: 8b 8d 60 ff ff ff mov -0xa0(%ebp),%ecx
107943: 85 c9 test %ecx,%ecx
107945: 75 08 jne 10794f <rtems_print_buffer+0x11f>
Dump_Line( &buffer[ max ], mod );
}
107947: 8d 65 f4 lea -0xc(%ebp),%esp
10794a: 5b pop %ebx
10794b: 5e pop %esi
10794c: 5f pop %edi
10794d: c9 leave
10794e: c3 ret
for ( i=0 ; i<max ; i+=16 )
Dump_Line( &buffer[ i ], 16 );
if ( mod )
Dump_Line( &buffer[ max ], mod );
10794f: 8b 75 08 mov 0x8(%ebp),%esi
107952: 03 b5 5c ff ff ff add -0xa4(%ebp),%esi
{
int i;
char line_buffer[120];
line_buffer[0] = '\0';
107958: c6 85 70 ff ff ff 00 movb $0x0,-0x90(%ebp)
for( i=0 ; i<length ; i++ )
10795f: 8b 95 60 ff ff ff mov -0xa0(%ebp),%edx
107965: 85 d2 test %edx,%edx
107967: 0f 8e 2a 01 00 00 jle 107a97 <rtems_print_buffer+0x267>
10796d: 31 ff xor %edi,%edi
10796f: 8d 9d 70 ff ff ff lea -0x90(%ebp),%ebx
107975: 8d 76 00 lea 0x0(%esi),%esi
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
107978: 0f b6 04 3e movzbl (%esi,%edi,1),%eax
10797c: 50 push %eax
10797d: 53 push %ebx
10797e: 68 93 14 12 00 push $0x121493
107983: 53 push %ebx
107984: e8 83 c5 00 00 call 113f0c <sprintf>
int i;
char line_buffer[120];
line_buffer[0] = '\0';
for( i=0 ; i<length ; i++ )
107989: 47 inc %edi
10798a: 83 c4 10 add $0x10,%esp
10798d: 39 bd 60 ff ff ff cmp %edi,-0xa0(%ebp)
107993: 7f e3 jg 107978 <rtems_print_buffer+0x148>
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
for( ; i<16 ; i++ )
107995: 83 bd 60 ff ff ff 0f cmpl $0xf,-0xa0(%ebp)
10799c: 0f 8f 02 01 00 00 jg 107aa4 <rtems_print_buffer+0x274><== NEVER TAKEN
1079a2: 8b 95 60 ff ff ff mov -0xa0(%ebp),%edx
strcat( line_buffer, " " );
1079a8: 31 c0 xor %eax,%eax
1079aa: 66 90 xchg %ax,%ax
1079ac: b9 ff ff ff ff mov $0xffffffff,%ecx
1079b1: 89 df mov %ebx,%edi
1079b3: f2 ae repnz scas %es:(%edi),%al
1079b5: f7 d1 not %ecx
1079b7: c7 44 0b ff 20 20 20 movl $0x202020,-0x1(%ebx,%ecx,1)
1079be: 00
line_buffer[0] = '\0';
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
for( ; i<16 ; i++ )
1079bf: 42 inc %edx
1079c0: 83 fa 0f cmp $0xf,%edx
1079c3: 7e e7 jle 1079ac <rtems_print_buffer+0x17c>
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
1079c5: 31 c0 xor %eax,%eax
1079c7: b9 ff ff ff ff mov $0xffffffff,%ecx
1079cc: 89 df mov %ebx,%edi
1079ce: f2 ae repnz scas %es:(%edi),%al
1079d0: f7 d1 not %ecx
1079d2: 66 c7 44 0b ff 7c 00 movw $0x7c,-0x1(%ebx,%ecx,1)
for( i=0 ; i<length ; i++ )
1079d9: 8b 85 60 ff ff ff mov -0xa0(%ebp),%eax
1079df: 85 c0 test %eax,%eax
1079e1: 0f 8e a4 00 00 00 jle 107a8b <rtems_print_buffer+0x25b>
1079e7: 31 ff xor %edi,%edi
1079e9: 8d 76 00 lea 0x0(%esi),%esi
sprintf( line_buffer, "%s%c", line_buffer,
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
1079ec: 0f b6 04 3e movzbl (%esi,%edi,1),%eax
1079f0: 8b 15 b4 5c 12 00 mov 0x125cb4,%edx
1079f6: 0f be 54 02 01 movsbl 0x1(%edx,%eax,1),%edx
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%c", line_buffer,
1079fb: 81 e2 97 00 00 00 and $0x97,%edx
107a01: 75 05 jne 107a08 <rtems_print_buffer+0x1d8>
107a03: b8 2e 00 00 00 mov $0x2e,%eax
107a08: 50 push %eax
107a09: 53 push %ebx
107a0a: 68 9b 14 12 00 push $0x12149b
107a0f: 53 push %ebx
107a10: e8 f7 c4 00 00 call 113f0c <sprintf>
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
107a15: 47 inc %edi
107a16: 83 c4 10 add $0x10,%esp
107a19: 39 bd 60 ff ff ff cmp %edi,-0xa0(%ebp)
107a1f: 7f cb jg 1079ec <rtems_print_buffer+0x1bc>
sprintf( line_buffer, "%s%c", line_buffer,
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
for( ; i<16 ; i++ )
107a21: 83 bd 60 ff ff ff 0f cmpl $0xf,-0xa0(%ebp)
107a28: 7f 23 jg 107a4d <rtems_print_buffer+0x21d><== NEVER TAKEN
strcat( line_buffer, " " );
107a2a: ba ff ff ff ff mov $0xffffffff,%edx
107a2f: 31 c0 xor %eax,%eax
107a31: 8b b5 58 ff ff ff mov -0xa8(%ebp),%esi
107a37: 90 nop
107a38: 89 d1 mov %edx,%ecx
107a3a: 89 df mov %ebx,%edi
107a3c: f2 ae repnz scas %es:(%edi),%al
107a3e: f7 d1 not %ecx
107a40: 66 c7 44 0b ff 20 00 movw $0x20,-0x1(%ebx,%ecx,1)
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%c", line_buffer,
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
for( ; i<16 ; i++ )
107a47: 46 inc %esi
107a48: 83 fe 0f cmp $0xf,%esi
107a4b: 7e eb jle 107a38 <rtems_print_buffer+0x208>
strcat( line_buffer, " " );
strcat( line_buffer, "|\n" );
107a4d: 31 c0 xor %eax,%eax
107a4f: b9 ff ff ff ff mov $0xffffffff,%ecx
107a54: 89 df mov %ebx,%edi
107a56: f2 ae repnz scas %es:(%edi),%al
107a58: f7 d1 not %ecx
107a5a: 8d 44 0b ff lea -0x1(%ebx,%ecx,1),%eax
107a5e: 66 c7 00 7c 0a movw $0xa7c,(%eax)
107a63: c6 40 02 00 movb $0x0,0x2(%eax)
printk( line_buffer );
107a67: 83 ec 0c sub $0xc,%esp
107a6a: 53 push %ebx
107a6b: e8 c8 16 00 00 call 109138 <printk>
107a70: 83 c4 10 add $0x10,%esp
for ( i=0 ; i<max ; i+=16 )
Dump_Line( &buffer[ i ], 16 );
if ( mod )
Dump_Line( &buffer[ max ], mod );
}
107a73: 8d 65 f4 lea -0xc(%ebp),%esp
107a76: 5b pop %ebx
107a77: 5e pop %esi
107a78: 5f pop %edi
107a79: c9 leave
107a7a: c3 ret
int i, mod, max;
if ( !length ) return;
mod = length % 16;
107a7b: 48 dec %eax
107a7c: 83 c8 f0 or $0xfffffff0,%eax
107a7f: 40 inc %eax
107a80: 89 85 60 ff ff ff mov %eax,-0xa0(%ebp)
107a86: e9 cf fd ff ff jmp 10785a <rtems_print_buffer+0x2a>
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
107a8b: c7 85 58 ff ff ff 00 movl $0x0,-0xa8(%ebp)
107a92: 00 00 00
107a95: eb 93 jmp 107a2a <rtems_print_buffer+0x1fa>
int i;
char line_buffer[120];
line_buffer[0] = '\0';
for( i=0 ; i<length ; i++ )
107a97: 31 d2 xor %edx,%edx
107a99: 8d 9d 70 ff ff ff lea -0x90(%ebp),%ebx
107a9f: e9 04 ff ff ff jmp 1079a8 <rtems_print_buffer+0x178>
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
107aa4: 31 c0 xor %eax,%eax
107aa6: 83 c9 ff or $0xffffffff,%ecx <== NOT EXECUTED
107aa9: 89 df mov %ebx,%edi <== NOT EXECUTED
107aab: f2 ae repnz scas %es:(%edi),%al <== NOT EXECUTED
107aad: f7 d1 not %ecx <== NOT EXECUTED
107aaf: 66 c7 44 0b ff 7c 00 movw $0x7c,-0x1(%ebx,%ecx,1) <== NOT EXECUTED
107ab6: e9 2c ff ff ff jmp 1079e7 <rtems_print_buffer+0x1b7><== NOT EXECUTED
00116ab8 <rtems_rate_monotonic_cancel>:
*/
rtems_status_code rtems_rate_monotonic_cancel(
rtems_id id
)
{
116ab8: 55 push %ebp
116ab9: 89 e5 mov %esp,%ebp
116abb: 53 push %ebx
116abc: 83 ec 18 sub $0x18,%esp
Rate_monotonic_Control *the_period;
Objects_Locations location;
the_period = _Rate_monotonic_Get( id, &location );
116abf: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Rate_monotonic_Control *)
_Objects_Get( &_Rate_monotonic_Information, id, location );
116ac2: 50 push %eax
116ac3: ff 75 08 pushl 0x8(%ebp)
116ac6: 68 a0 29 14 00 push $0x1429a0
116acb: e8 14 48 00 00 call 11b2e4 <_Objects_Get>
116ad0: 89 c3 mov %eax,%ebx
switch ( location ) {
116ad2: 83 c4 10 add $0x10,%esp
116ad5: 8b 45 f4 mov -0xc(%ebp),%eax
116ad8: 85 c0 test %eax,%eax
116ada: 74 0c je 116ae8 <rtems_rate_monotonic_cancel+0x30>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
116adc: b8 04 00 00 00 mov $0x4,%eax
}
116ae1: 8b 5d fc mov -0x4(%ebp),%ebx
116ae4: c9 leave
116ae5: c3 ret
116ae6: 66 90 xchg %ax,%ax
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
116ae8: a1 b8 30 14 00 mov 0x1430b8,%eax
116aed: 39 43 40 cmp %eax,0x40(%ebx)
116af0: 74 12 je 116b04 <rtems_rate_monotonic_cancel+0x4c>
_Thread_Enable_dispatch();
116af2: e8 a1 52 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_NOT_OWNER_OF_RESOURCE;
116af7: b8 17 00 00 00 mov $0x17,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116afc: 8b 5d fc mov -0x4(%ebp),%ebx
116aff: c9 leave
116b00: c3 ret
116b01: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
(void) _Watchdog_Remove( &the_period->Timer );
116b04: 83 ec 0c sub $0xc,%esp
116b07: 8d 43 10 lea 0x10(%ebx),%eax
116b0a: 50 push %eax
116b0b: e8 60 64 00 00 call 11cf70 <_Watchdog_Remove>
the_period->state = RATE_MONOTONIC_INACTIVE;
116b10: c7 43 38 00 00 00 00 movl $0x0,0x38(%ebx)
_Thread_Enable_dispatch();
116b17: e8 7c 52 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
116b1c: 83 c4 10 add $0x10,%esp
116b1f: 31 c0 xor %eax,%eax
116b21: eb be jmp 116ae1 <rtems_rate_monotonic_cancel+0x29>
0010c340 <rtems_rate_monotonic_create>:
rtems_status_code rtems_rate_monotonic_create(
rtems_name name,
rtems_id *id
)
{
10c340: 55 push %ebp
10c341: 89 e5 mov %esp,%ebp
10c343: 57 push %edi
10c344: 56 push %esi
10c345: 53 push %ebx
10c346: 83 ec 1c sub $0x1c,%esp
10c349: 8b 5d 08 mov 0x8(%ebp),%ebx
10c34c: 8b 75 0c mov 0xc(%ebp),%esi
Rate_monotonic_Control *the_period;
if ( !rtems_is_name_valid( name ) )
10c34f: 85 db test %ebx,%ebx
10c351: 0f 84 a9 00 00 00 je 10c400 <rtems_rate_monotonic_create+0xc0>
return RTEMS_INVALID_NAME;
if ( !id )
10c357: 85 f6 test %esi,%esi
10c359: 0f 84 c5 00 00 00 je 10c424 <rtems_rate_monotonic_create+0xe4>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10c35f: a1 b0 b1 12 00 mov 0x12b1b0,%eax
10c364: 40 inc %eax
10c365: a3 b0 b1 12 00 mov %eax,0x12b1b0
* the inactive chain of free period control blocks.
*/
RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Allocate( void )
{
return (Rate_monotonic_Control *)
_Objects_Allocate( &_Rate_monotonic_Information );
10c36a: 83 ec 0c sub $0xc,%esp
10c36d: 68 c0 b0 12 00 push $0x12b0c0
10c372: e8 25 1f 00 00 call 10e29c <_Objects_Allocate>
10c377: 89 c2 mov %eax,%edx
_Thread_Disable_dispatch(); /* to prevent deletion */
the_period = _Rate_monotonic_Allocate();
if ( !the_period ) {
10c379: 83 c4 10 add $0x10,%esp
10c37c: 85 c0 test %eax,%eax
10c37e: 0f 84 8c 00 00 00 je 10c410 <rtems_rate_monotonic_create+0xd0>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_period->owner = _Thread_Executing;
10c384: a1 98 b7 12 00 mov 0x12b798,%eax
10c389: 89 42 40 mov %eax,0x40(%edx)
the_period->state = RATE_MONOTONIC_INACTIVE;
10c38c: c7 42 38 00 00 00 00 movl $0x0,0x38(%edx)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10c393: c7 42 18 00 00 00 00 movl $0x0,0x18(%edx)
the_watchdog->routine = routine;
10c39a: c7 42 2c 00 00 00 00 movl $0x0,0x2c(%edx)
the_watchdog->id = id;
10c3a1: c7 42 30 00 00 00 00 movl $0x0,0x30(%edx)
the_watchdog->user_data = user_data;
10c3a8: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
_Watchdog_Initialize( &the_period->Timer, NULL, 0, NULL );
_Rate_monotonic_Reset_statistics( the_period );
10c3af: 8d 42 54 lea 0x54(%edx),%eax
10c3b2: 89 45 e4 mov %eax,-0x1c(%ebp)
10c3b5: b9 38 00 00 00 mov $0x38,%ecx
10c3ba: 31 c0 xor %eax,%eax
10c3bc: 8b 7d e4 mov -0x1c(%ebp),%edi
10c3bf: f3 aa rep stos %al,%es:(%edi)
10c3c1: c7 42 5c ff ff ff 7f movl $0x7fffffff,0x5c(%edx)
10c3c8: c7 42 60 ff ff ff 7f movl $0x7fffffff,0x60(%edx)
10c3cf: c7 42 74 ff ff ff 7f movl $0x7fffffff,0x74(%edx)
10c3d6: c7 42 78 ff ff ff 7f movl $0x7fffffff,0x78(%edx)
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10c3dd: 8b 42 08 mov 0x8(%edx),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
10c3e0: 0f b7 f8 movzwl %ax,%edi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10c3e3: 8b 0d dc b0 12 00 mov 0x12b0dc,%ecx
10c3e9: 89 14 b9 mov %edx,(%ecx,%edi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
10c3ec: 89 5a 0c mov %ebx,0xc(%edx)
&_Rate_monotonic_Information,
&the_period->Object,
(Objects_Name) name
);
*id = the_period->Object.id;
10c3ef: 89 06 mov %eax,(%esi)
_Thread_Enable_dispatch();
10c3f1: e8 fa 2e 00 00 call 10f2f0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c3f6: 31 c0 xor %eax,%eax
}
10c3f8: 8d 65 f4 lea -0xc(%ebp),%esp
10c3fb: 5b pop %ebx
10c3fc: 5e pop %esi
10c3fd: 5f pop %edi
10c3fe: c9 leave
10c3ff: c3 ret
)
{
Rate_monotonic_Control *the_period;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
10c400: b8 03 00 00 00 mov $0x3,%eax
);
*id = the_period->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c405: 8d 65 f4 lea -0xc(%ebp),%esp
10c408: 5b pop %ebx
10c409: 5e pop %esi
10c40a: 5f pop %edi
10c40b: c9 leave
10c40c: c3 ret
10c40d: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* to prevent deletion */
the_period = _Rate_monotonic_Allocate();
if ( !the_period ) {
_Thread_Enable_dispatch();
10c410: e8 db 2e 00 00 call 10f2f0 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
10c415: b8 05 00 00 00 mov $0x5,%eax
);
*id = the_period->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c41a: 8d 65 f4 lea -0xc(%ebp),%esp
10c41d: 5b pop %ebx
10c41e: 5e pop %esi
10c41f: 5f pop %edi
10c420: c9 leave
10c421: c3 ret
10c422: 66 90 xchg %ax,%ax
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
10c424: b8 09 00 00 00 mov $0x9,%eax
);
*id = the_period->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c429: 8d 65 f4 lea -0xc(%ebp),%esp
10c42c: 5b pop %ebx
10c42d: 5e pop %esi
10c42e: 5f pop %edi
10c42f: c9 leave
10c430: c3 ret
001128d0 <rtems_rate_monotonic_get_status>:
rtems_status_code rtems_rate_monotonic_get_status(
rtems_id id,
rtems_rate_monotonic_period_status *status
)
{
1128d0: 55 push %ebp
1128d1: 89 e5 mov %esp,%ebp
1128d3: 53 push %ebx
1128d4: 83 ec 24 sub $0x24,%esp
1128d7: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Locations location;
Rate_monotonic_Period_time_t since_last_period;
Rate_monotonic_Control *the_period;
bool valid_status;
if ( !status )
1128da: 85 db test %ebx,%ebx
1128dc: 0f 84 92 00 00 00 je 112974 <rtems_rate_monotonic_get_status+0xa4>
1128e2: 50 push %eax
return RTEMS_INVALID_ADDRESS;
the_period = _Rate_monotonic_Get( id, &location );
1128e3: 8d 45 f4 lea -0xc(%ebp),%eax
1128e6: 50 push %eax
1128e7: ff 75 08 pushl 0x8(%ebp)
1128ea: 68 c0 b0 12 00 push $0x12b0c0
1128ef: e8 48 bf ff ff call 10e83c <_Objects_Get>
switch ( location ) {
1128f4: 83 c4 10 add $0x10,%esp
1128f7: 8b 4d f4 mov -0xc(%ebp),%ecx
1128fa: 85 c9 test %ecx,%ecx
1128fc: 74 0a je 112908 <rtems_rate_monotonic_get_status+0x38>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1128fe: b8 04 00 00 00 mov $0x4,%eax
}
112903: 8b 5d fc mov -0x4(%ebp),%ebx
112906: c9 leave
112907: c3 ret
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
status->owner = the_period->owner->Object.id;
112908: 8b 50 40 mov 0x40(%eax),%edx
11290b: 8b 52 08 mov 0x8(%edx),%edx
11290e: 89 13 mov %edx,(%ebx)
status->state = the_period->state;
112910: 8b 50 38 mov 0x38(%eax),%edx
112913: 89 53 04 mov %edx,0x4(%ebx)
/*
* If the period is inactive, there is no information.
*/
if ( status->state == RATE_MONOTONIC_INACTIVE ) {
112916: 85 d2 test %edx,%edx
112918: 75 2a jne 112944 <rtems_rate_monotonic_get_status+0x74>
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timespec_Set_to_zero( &status->since_last_period );
11291a: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx)
112921: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
_Timespec_Set_to_zero( &status->executed_since_last_period );
112928: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx)
11292f: c7 43 14 00 00 00 00 movl $0x0,0x14(%ebx)
status->since_last_period = since_last_period;
status->executed_since_last_period = executed;
#endif
}
_Thread_Enable_dispatch();
112936: e8 b5 c9 ff ff call 10f2f0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
11293b: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11293d: 8b 5d fc mov -0x4(%ebp),%ebx
112940: c9 leave
112941: c3 ret
112942: 66 90 xchg %ax,%ax
} else {
/*
* Grab the current status.
*/
valid_status =
112944: 52 push %edx
_Rate_monotonic_Get_status(
112945: 8d 55 ec lea -0x14(%ebp),%edx
} else {
/*
* Grab the current status.
*/
valid_status =
112948: 52 push %edx
_Rate_monotonic_Get_status(
112949: 8d 55 e4 lea -0x1c(%ebp),%edx
} else {
/*
* Grab the current status.
*/
valid_status =
11294c: 52 push %edx
11294d: 50 push %eax
11294e: e8 05 9b ff ff call 10c458 <_Rate_monotonic_Get_status>
_Rate_monotonic_Get_status(
the_period, &since_last_period, &executed
);
if (!valid_status) {
112953: 83 c4 10 add $0x10,%esp
112956: 84 c0 test %al,%al
112958: 74 26 je 112980 <rtems_rate_monotonic_get_status+0xb0>
_Thread_Enable_dispatch();
return RTEMS_NOT_DEFINED;
}
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_To_timespec(
11295a: 8b 45 e4 mov -0x1c(%ebp),%eax
11295d: 8b 55 e8 mov -0x18(%ebp),%edx
112960: 89 43 08 mov %eax,0x8(%ebx)
112963: 89 53 0c mov %edx,0xc(%ebx)
&since_last_period, &status->since_last_period
);
_Timestamp_To_timespec(
112966: 8b 45 ec mov -0x14(%ebp),%eax
112969: 8b 55 f0 mov -0x10(%ebp),%edx
11296c: 89 43 10 mov %eax,0x10(%ebx)
11296f: 89 53 14 mov %edx,0x14(%ebx)
112972: eb c2 jmp 112936 <rtems_rate_monotonic_get_status+0x66>
Rate_monotonic_Period_time_t since_last_period;
Rate_monotonic_Control *the_period;
bool valid_status;
if ( !status )
return RTEMS_INVALID_ADDRESS;
112974: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
112979: 8b 5d fc mov -0x4(%ebp),%ebx
11297c: c9 leave
11297d: c3 ret
11297e: 66 90 xchg %ax,%ax
valid_status =
_Rate_monotonic_Get_status(
the_period, &since_last_period, &executed
);
if (!valid_status) {
_Thread_Enable_dispatch();
112980: e8 6b c9 ff ff call 10f2f0 <_Thread_Enable_dispatch>
return RTEMS_NOT_DEFINED;
112985: b8 0b 00 00 00 mov $0xb,%eax
11298a: e9 74 ff ff ff jmp 112903 <rtems_rate_monotonic_get_status+0x33>
0010c654 <rtems_rate_monotonic_period>:
rtems_status_code rtems_rate_monotonic_period(
rtems_id id,
rtems_interval length
)
{
10c654: 55 push %ebp
10c655: 89 e5 mov %esp,%ebp
10c657: 57 push %edi
10c658: 56 push %esi
10c659: 53 push %ebx
10c65a: 83 ec 30 sub $0x30,%esp
10c65d: 8b 5d 08 mov 0x8(%ebp),%ebx
10c660: 8b 75 0c mov 0xc(%ebp),%esi
Objects_Locations location;
rtems_status_code return_value;
rtems_rate_monotonic_period_states local_state;
ISR_Level level;
the_period = _Rate_monotonic_Get( id, &location );
10c663: 8d 45 e4 lea -0x1c(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Rate_monotonic_Control *)
_Objects_Get( &_Rate_monotonic_Information, id, location );
10c666: 50 push %eax
10c667: 53 push %ebx
10c668: 68 c0 b0 12 00 push $0x12b0c0
10c66d: e8 ca 21 00 00 call 10e83c <_Objects_Get>
switch ( location ) {
10c672: 83 c4 10 add $0x10,%esp
10c675: 8b 55 e4 mov -0x1c(%ebp),%edx
10c678: 85 d2 test %edx,%edx
10c67a: 74 10 je 10c68c <rtems_rate_monotonic_period+0x38>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10c67c: b8 04 00 00 00 mov $0x4,%eax
}
10c681: 8d 65 f4 lea -0xc(%ebp),%esp
10c684: 5b pop %ebx
10c685: 5e pop %esi
10c686: 5f pop %edi
10c687: c9 leave
10c688: c3 ret
10c689: 8d 76 00 lea 0x0(%esi),%esi
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
10c68c: 8b 15 98 b7 12 00 mov 0x12b798,%edx
10c692: 39 50 40 cmp %edx,0x40(%eax)
10c695: 74 15 je 10c6ac <rtems_rate_monotonic_period+0x58>
_Thread_Enable_dispatch();
10c697: e8 54 2c 00 00 call 10f2f0 <_Thread_Enable_dispatch>
return RTEMS_NOT_OWNER_OF_RESOURCE;
10c69c: b8 17 00 00 00 mov $0x17,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c6a1: 8d 65 f4 lea -0xc(%ebp),%esp
10c6a4: 5b pop %ebx
10c6a5: 5e pop %esi
10c6a6: 5f pop %edi
10c6a7: c9 leave
10c6a8: c3 ret
10c6a9: 8d 76 00 lea 0x0(%esi),%esi
if ( !_Thread_Is_executing( the_period->owner ) ) {
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
10c6ac: 85 f6 test %esi,%esi
10c6ae: 75 1c jne 10c6cc <rtems_rate_monotonic_period+0x78>
switch ( the_period->state ) {
10c6b0: 8b 40 38 mov 0x38(%eax),%eax
10c6b3: 83 f8 04 cmp $0x4,%eax
10c6b6: 77 6c ja 10c724 <rtems_rate_monotonic_period+0xd0><== NEVER TAKEN
10c6b8: 8b 04 85 bc 3d 12 00 mov 0x123dbc(,%eax,4),%eax
case RATE_MONOTONIC_ACTIVE:
default: /* unreached -- only to remove warnings */
return_value = RTEMS_SUCCESSFUL;
break;
}
_Thread_Enable_dispatch();
10c6bf: 89 45 d4 mov %eax,-0x2c(%ebp)
10c6c2: e8 29 2c 00 00 call 10f2f0 <_Thread_Enable_dispatch>
return( return_value );
10c6c7: 8b 45 d4 mov -0x2c(%ebp),%eax
10c6ca: eb b5 jmp 10c681 <rtems_rate_monotonic_period+0x2d>
}
_ISR_Disable( level );
10c6cc: 9c pushf
10c6cd: fa cli
10c6ce: 5f pop %edi
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
10c6cf: 8b 50 38 mov 0x38(%eax),%edx
10c6d2: 85 d2 test %edx,%edx
10c6d4: 74 52 je 10c728 <rtems_rate_monotonic_period+0xd4>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
10c6d6: 83 fa 02 cmp $0x2,%edx
10c6d9: 0f 84 9e 00 00 00 je 10c77d <rtems_rate_monotonic_period+0x129>
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_EXPIRED ) {
10c6df: 83 fa 04 cmp $0x4,%edx
10c6e2: 75 98 jne 10c67c <rtems_rate_monotonic_period+0x28><== NEVER TAKEN
/*
* Update statistics from the concluding period
*/
_Rate_monotonic_Update_statistics( the_period );
10c6e4: 83 ec 0c sub $0xc,%esp
10c6e7: 50 push %eax
10c6e8: 89 45 d4 mov %eax,-0x2c(%ebp)
10c6eb: e8 74 fe ff ff call 10c564 <_Rate_monotonic_Update_statistics>
_ISR_Enable( level );
10c6f0: 57 push %edi
10c6f1: 9d popf
the_period->state = RATE_MONOTONIC_ACTIVE;
10c6f2: 8b 45 d4 mov -0x2c(%ebp),%eax
10c6f5: c7 40 38 02 00 00 00 movl $0x2,0x38(%eax)
the_period->next_length = length;
10c6fc: 89 70 3c mov %esi,0x3c(%eax)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10c6ff: 89 70 1c mov %esi,0x1c(%eax)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10c702: 5b pop %ebx
10c703: 5e pop %esi
_Watchdog_Insert_ticks( &the_period->Timer, length );
10c704: 83 c0 10 add $0x10,%eax
10c707: 50 push %eax
10c708: 68 bc b2 12 00 push $0x12b2bc
10c70d: e8 e6 3a 00 00 call 1101f8 <_Watchdog_Insert>
_Thread_Enable_dispatch();
10c712: e8 d9 2b 00 00 call 10f2f0 <_Thread_Enable_dispatch>
return RTEMS_TIMEOUT;
10c717: 83 c4 10 add $0x10,%esp
10c71a: b8 06 00 00 00 mov $0x6,%eax
10c71f: e9 5d ff ff ff jmp 10c681 <rtems_rate_monotonic_period+0x2d>
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
switch ( the_period->state ) {
10c724: 31 c0 xor %eax,%eax
10c726: eb 97 jmp 10c6bf <rtems_rate_monotonic_period+0x6b><== NOT EXECUTED
return( return_value );
}
_ISR_Disable( level );
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
_ISR_Enable( level );
10c728: 57 push %edi
10c729: 9d popf
/*
* Baseline statistics information for the beginning of a period.
*/
_Rate_monotonic_Initiate_statistics( the_period );
10c72a: 83 ec 0c sub $0xc,%esp
10c72d: 50 push %eax
10c72e: 89 45 d4 mov %eax,-0x2c(%ebp)
10c731: e8 ba fd ff ff call 10c4f0 <_Rate_monotonic_Initiate_statistics>
the_period->state = RATE_MONOTONIC_ACTIVE;
10c736: 8b 45 d4 mov -0x2c(%ebp),%eax
10c739: c7 40 38 02 00 00 00 movl $0x2,0x38(%eax)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10c740: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
the_watchdog->routine = routine;
10c747: c7 40 2c ac ca 10 00 movl $0x10caac,0x2c(%eax)
the_watchdog->id = id;
10c74e: 89 58 30 mov %ebx,0x30(%eax)
the_watchdog->user_data = user_data;
10c751: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
_Rate_monotonic_Timeout,
id,
NULL
);
the_period->next_length = length;
10c758: 89 70 3c mov %esi,0x3c(%eax)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10c75b: 89 70 1c mov %esi,0x1c(%eax)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10c75e: 5e pop %esi
10c75f: 5f pop %edi
_Watchdog_Insert_ticks( &the_period->Timer, length );
10c760: 83 c0 10 add $0x10,%eax
10c763: 50 push %eax
10c764: 68 bc b2 12 00 push $0x12b2bc
10c769: e8 8a 3a 00 00 call 1101f8 <_Watchdog_Insert>
_Thread_Enable_dispatch();
10c76e: e8 7d 2b 00 00 call 10f2f0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c773: 83 c4 10 add $0x10,%esp
10c776: 31 c0 xor %eax,%eax
10c778: e9 04 ff ff ff jmp 10c681 <rtems_rate_monotonic_period+0x2d>
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
/*
* Update statistics from the concluding period.
*/
_Rate_monotonic_Update_statistics( the_period );
10c77d: 83 ec 0c sub $0xc,%esp
10c780: 50 push %eax
10c781: 89 45 d4 mov %eax,-0x2c(%ebp)
10c784: e8 db fd ff ff call 10c564 <_Rate_monotonic_Update_statistics>
/*
* This tells the _Rate_monotonic_Timeout that this task is
* in the process of blocking on the period and that we
* may be changing the length of the next period.
*/
the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING;
10c789: 8b 45 d4 mov -0x2c(%ebp),%eax
10c78c: c7 40 38 01 00 00 00 movl $0x1,0x38(%eax)
the_period->next_length = length;
10c793: 89 70 3c mov %esi,0x3c(%eax)
_ISR_Enable( level );
10c796: 57 push %edi
10c797: 9d popf
_Thread_Executing->Wait.id = the_period->Object.id;
10c798: 8b 15 98 b7 12 00 mov 0x12b798,%edx
10c79e: 8b 48 08 mov 0x8(%eax),%ecx
10c7a1: 89 4a 20 mov %ecx,0x20(%edx)
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
10c7a4: 59 pop %ecx
10c7a5: 5b pop %ebx
10c7a6: 68 00 40 00 00 push $0x4000
10c7ab: 52 push %edx
10c7ac: 89 45 d4 mov %eax,-0x2c(%ebp)
10c7af: e8 a0 33 00 00 call 10fb54 <_Thread_Set_state>
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
10c7b4: 9c pushf
10c7b5: fa cli
10c7b6: 59 pop %ecx
local_state = the_period->state;
10c7b7: 8b 45 d4 mov -0x2c(%ebp),%eax
10c7ba: 8b 50 38 mov 0x38(%eax),%edx
the_period->state = RATE_MONOTONIC_ACTIVE;
10c7bd: c7 40 38 02 00 00 00 movl $0x2,0x38(%eax)
_ISR_Enable( level );
10c7c4: 51 push %ecx
10c7c5: 9d popf
/*
* If it did, then we want to unblock ourself and continue as
* if nothing happen. The period was reset in the timeout routine.
*/
if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING )
10c7c6: 83 c4 10 add $0x10,%esp
10c7c9: 83 fa 03 cmp $0x3,%edx
10c7cc: 74 0c je 10c7da <rtems_rate_monotonic_period+0x186>
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
_Thread_Enable_dispatch();
10c7ce: e8 1d 2b 00 00 call 10f2f0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c7d3: 31 c0 xor %eax,%eax
10c7d5: e9 a7 fe ff ff jmp 10c681 <rtems_rate_monotonic_period+0x2d>
/*
* If it did, then we want to unblock ourself and continue as
* if nothing happen. The period was reset in the timeout routine.
*/
if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING )
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
10c7da: 57 push %edi
10c7db: 57 push %edi
10c7dc: 68 00 40 00 00 push $0x4000
10c7e1: ff 35 98 b7 12 00 pushl 0x12b798
10c7e7: e8 84 27 00 00 call 10ef70 <_Thread_Clear_state>
10c7ec: 83 c4 10 add $0x10,%esp
10c7ef: eb dd jmp 10c7ce <rtems_rate_monotonic_period+0x17a>
0010c7f4 <rtems_rate_monotonic_report_statistics_with_plugin>:
*/
void rtems_rate_monotonic_report_statistics_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
10c7f4: 55 push %ebp
10c7f5: 89 e5 mov %esp,%ebp
10c7f7: 57 push %edi
10c7f8: 56 push %esi
10c7f9: 53 push %ebx
10c7fa: 81 ec 8c 00 00 00 sub $0x8c,%esp
10c800: 8b 75 08 mov 0x8(%ebp),%esi
rtems_id id;
rtems_rate_monotonic_period_statistics the_stats;
rtems_rate_monotonic_period_status the_status;
char name[5];
if ( !print )
10c803: 8b 7d 0c mov 0xc(%ebp),%edi
10c806: 85 ff test %edi,%edi
10c808: 0f 84 be 00 00 00 je 10c8cc <rtems_rate_monotonic_report_statistics_with_plugin+0xd8><== NEVER TAKEN
return;
(*print)( context, "Period information by period\n" );
10c80e: 83 ec 08 sub $0x8,%esp
10c811: 68 d0 3d 12 00 push $0x123dd0
10c816: 56 push %esi
10c817: ff 55 0c call *0xc(%ebp)
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)( context, "--- CPU times are in seconds ---\n" );
10c81a: 59 pop %ecx
10c81b: 5b pop %ebx
10c81c: 68 08 3e 12 00 push $0x123e08
10c821: 56 push %esi
10c822: ff 55 0c call *0xc(%ebp)
(*print)( context, "--- Wall times are in seconds ---\n" );
10c825: 58 pop %eax
10c826: 5a pop %edx
10c827: 68 2c 3e 12 00 push $0x123e2c
10c82c: 56 push %esi
10c82d: ff 55 0c call *0xc(%ebp)
Be sure to test the various cases.
(*print)( context,"\
1234567890123456789012345678901234567890123456789012345678901234567890123456789\
\n");
*/
(*print)( context, " ID OWNER COUNT MISSED "
10c830: 5b pop %ebx
10c831: 5f pop %edi
10c832: 68 50 3e 12 00 push $0x123e50
10c837: 56 push %esi
10c838: ff 55 0c call *0xc(%ebp)
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
10c83b: 5a pop %edx
10c83c: 59 pop %ecx
10c83d: 68 9c 3e 12 00 push $0x123e9c
10c842: 56 push %esi
10c843: ff 55 0c call *0xc(%ebp)
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
10c846: 8b 1d c8 b0 12 00 mov 0x12b0c8,%ebx
10c84c: 83 c4 10 add $0x10,%esp
10c84f: 3b 1d cc b0 12 00 cmp 0x12b0cc,%ebx
10c855: 77 75 ja 10c8cc <rtems_rate_monotonic_report_statistics_with_plugin+0xd8><== NEVER TAKEN
10c857: 8d 7d 88 lea -0x78(%ebp),%edi
10c85a: eb 09 jmp 10c865 <rtems_rate_monotonic_report_statistics_with_plugin+0x71>
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
10c85c: 43 inc %ebx
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
10c85d: 39 1d cc b0 12 00 cmp %ebx,0x12b0cc
10c863: 72 67 jb 10c8cc <rtems_rate_monotonic_report_statistics_with_plugin+0xd8>
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
status = rtems_rate_monotonic_get_statistics( id, &the_stats );
10c865: 83 ec 08 sub $0x8,%esp
10c868: 57 push %edi
10c869: 53 push %ebx
10c86a: e8 b5 5f 00 00 call 112824 <rtems_rate_monotonic_get_statistics>
if ( status != RTEMS_SUCCESSFUL )
10c86f: 83 c4 10 add $0x10,%esp
10c872: 85 c0 test %eax,%eax
10c874: 75 e6 jne 10c85c <rtems_rate_monotonic_report_statistics_with_plugin+0x68>
#if defined(RTEMS_DEBUG)
status = rtems_rate_monotonic_get_status( id, &the_status );
if ( status != RTEMS_SUCCESSFUL )
continue;
#else
(void) rtems_rate_monotonic_get_status( id, &the_status );
10c876: 83 ec 08 sub $0x8,%esp
10c879: 8d 45 c0 lea -0x40(%ebp),%eax
10c87c: 50 push %eax
10c87d: 53 push %ebx
10c87e: e8 4d 60 00 00 call 1128d0 <rtems_rate_monotonic_get_status>
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
10c883: 83 c4 0c add $0xc,%esp
10c886: 8d 55 e3 lea -0x1d(%ebp),%edx
10c889: 52 push %edx
10c88a: 6a 05 push $0x5
10c88c: ff 75 c0 pushl -0x40(%ebp)
10c88f: e8 b4 02 00 00 call 10cb48 <rtems_object_get_name>
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
10c894: 59 pop %ecx
10c895: 58 pop %eax
10c896: ff 75 8c pushl -0x74(%ebp)
10c899: ff 75 88 pushl -0x78(%ebp)
10c89c: 8d 45 e3 lea -0x1d(%ebp),%eax
10c89f: 50 push %eax
10c8a0: 53 push %ebx
10c8a1: 68 ee 3d 12 00 push $0x123dee
10c8a6: 56 push %esi
10c8a7: ff 55 0c call *0xc(%ebp)
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
10c8aa: 8b 45 88 mov -0x78(%ebp),%eax
10c8ad: 83 c4 20 add $0x20,%esp
10c8b0: 85 c0 test %eax,%eax
10c8b2: 75 20 jne 10c8d4 <rtems_rate_monotonic_report_statistics_with_plugin+0xe0>
(*print)( context, "\n" );
10c8b4: 83 ec 08 sub $0x8,%esp
10c8b7: 68 d9 1e 12 00 push $0x121ed9
10c8bc: 56 push %esi
10c8bd: ff 55 0c call *0xc(%ebp)
continue;
10c8c0: 83 c4 10 add $0x10,%esp
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
10c8c3: 43 inc %ebx
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
10c8c4: 39 1d cc b0 12 00 cmp %ebx,0x12b0cc
10c8ca: 73 99 jae 10c865 <rtems_rate_monotonic_report_statistics_with_plugin+0x71><== ALWAYS TAKEN
the_stats.min_wall_time, the_stats.max_wall_time, ival_wall, fval_wall
);
#endif
}
}
}
10c8cc: 8d 65 f4 lea -0xc(%ebp),%esp
10c8cf: 5b pop %ebx
10c8d0: 5e pop %esi
10c8d1: 5f pop %edi
10c8d2: c9 leave
10c8d3: c3 ret
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
10c8d4: 52 push %edx
10c8d5: 8d 55 d8 lea -0x28(%ebp),%edx
10c8d8: 52 push %edx
10c8d9: 50 push %eax
10c8da: 8d 45 a0 lea -0x60(%ebp),%eax
10c8dd: 50 push %eax
10c8de: e8 75 35 00 00 call 10fe58 <_Timespec_Divide_by_integer>
(*print)( context,
10c8e3: b9 d3 4d 62 10 mov $0x10624dd3,%ecx
10c8e8: 8b 45 dc mov -0x24(%ebp),%eax
10c8eb: f7 e9 imul %ecx
10c8ed: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c8f3: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c8f9: c1 f8 06 sar $0x6,%eax
10c8fc: 8b 55 dc mov -0x24(%ebp),%edx
10c8ff: c1 fa 1f sar $0x1f,%edx
10c902: 29 d0 sub %edx,%eax
10c904: 50 push %eax
10c905: ff 75 d8 pushl -0x28(%ebp)
10c908: 8b 45 9c mov -0x64(%ebp),%eax
10c90b: f7 e9 imul %ecx
10c90d: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c913: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c919: c1 f8 06 sar $0x6,%eax
10c91c: 8b 55 9c mov -0x64(%ebp),%edx
10c91f: c1 fa 1f sar $0x1f,%edx
10c922: 29 d0 sub %edx,%eax
10c924: 50 push %eax
10c925: ff 75 98 pushl -0x68(%ebp)
10c928: 8b 45 94 mov -0x6c(%ebp),%eax
10c92b: f7 e9 imul %ecx
10c92d: 89 85 70 ff ff ff mov %eax,-0x90(%ebp)
10c933: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c939: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c93f: c1 f8 06 sar $0x6,%eax
10c942: 8b 55 94 mov -0x6c(%ebp),%edx
10c945: c1 fa 1f sar $0x1f,%edx
10c948: 29 d0 sub %edx,%eax
10c94a: 50 push %eax
10c94b: ff 75 90 pushl -0x70(%ebp)
10c94e: 68 e8 3e 12 00 push $0x123ee8
10c953: 56 push %esi
10c954: 89 4d 84 mov %ecx,-0x7c(%ebp)
10c957: ff 55 0c call *0xc(%ebp)
struct timespec wall_average;
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
10c95a: 83 c4 2c add $0x2c,%esp
10c95d: 8d 55 d8 lea -0x28(%ebp),%edx
10c960: 52 push %edx
10c961: ff 75 88 pushl -0x78(%ebp)
10c964: 8d 45 b8 lea -0x48(%ebp),%eax
10c967: 50 push %eax
10c968: e8 eb 34 00 00 call 10fe58 <_Timespec_Divide_by_integer>
(*print)( context,
10c96d: 8b 4d 84 mov -0x7c(%ebp),%ecx
10c970: 8b 45 dc mov -0x24(%ebp),%eax
10c973: f7 e9 imul %ecx
10c975: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c97b: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c981: c1 f8 06 sar $0x6,%eax
10c984: 8b 55 dc mov -0x24(%ebp),%edx
10c987: c1 fa 1f sar $0x1f,%edx
10c98a: 29 d0 sub %edx,%eax
10c98c: 50 push %eax
10c98d: ff 75 d8 pushl -0x28(%ebp)
10c990: 8b 45 b4 mov -0x4c(%ebp),%eax
10c993: f7 e9 imul %ecx
10c995: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c99b: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c9a1: c1 f8 06 sar $0x6,%eax
10c9a4: 8b 55 b4 mov -0x4c(%ebp),%edx
10c9a7: c1 fa 1f sar $0x1f,%edx
10c9aa: 29 d0 sub %edx,%eax
10c9ac: 50 push %eax
10c9ad: ff 75 b0 pushl -0x50(%ebp)
10c9b0: 8b 45 ac mov -0x54(%ebp),%eax
10c9b3: f7 e9 imul %ecx
10c9b5: 89 85 70 ff ff ff mov %eax,-0x90(%ebp)
10c9bb: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c9c1: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c9c7: c1 f8 06 sar $0x6,%eax
10c9ca: 8b 55 ac mov -0x54(%ebp),%edx
10c9cd: c1 fa 1f sar $0x1f,%edx
10c9d0: 29 d0 sub %edx,%eax
10c9d2: 50 push %eax
10c9d3: ff 75 a8 pushl -0x58(%ebp)
10c9d6: 68 08 3f 12 00 push $0x123f08
10c9db: 56 push %esi
10c9dc: ff 55 0c call *0xc(%ebp)
10c9df: 83 c4 30 add $0x30,%esp
10c9e2: e9 75 fe ff ff jmp 10c85c <rtems_rate_monotonic_report_statistics_with_plugin+0x68>
0010ca00 <rtems_rate_monotonic_reset_all_statistics>:
/*
* rtems_rate_monotonic_reset_all_statistics
*/
void rtems_rate_monotonic_reset_all_statistics( void )
{
10ca00: 55 push %ebp
10ca01: 89 e5 mov %esp,%ebp
10ca03: 53 push %ebx
10ca04: 83 ec 04 sub $0x4,%esp
10ca07: a1 b0 b1 12 00 mov 0x12b1b0,%eax
10ca0c: 40 inc %eax
10ca0d: a3 b0 b1 12 00 mov %eax,0x12b1b0
/*
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
10ca12: 8b 1d c8 b0 12 00 mov 0x12b0c8,%ebx
10ca18: 3b 1d cc b0 12 00 cmp 0x12b0cc,%ebx
10ca1e: 77 15 ja 10ca35 <rtems_rate_monotonic_reset_all_statistics+0x35><== NEVER TAKEN
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
(void) rtems_rate_monotonic_reset_statistics( id );
10ca20: 83 ec 0c sub $0xc,%esp
10ca23: 53 push %ebx
10ca24: e8 17 00 00 00 call 10ca40 <rtems_rate_monotonic_reset_statistics>
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
10ca29: 43 inc %ebx
/*
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
10ca2a: 83 c4 10 add $0x10,%esp
10ca2d: 39 1d cc b0 12 00 cmp %ebx,0x12b0cc
10ca33: 73 eb jae 10ca20 <rtems_rate_monotonic_reset_all_statistics+0x20>
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
}
10ca35: 8b 5d fc mov -0x4(%ebp),%ebx
10ca38: c9 leave
}
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
10ca39: e9 b2 28 00 00 jmp 10f2f0 <_Thread_Enable_dispatch>
0010ca40 <rtems_rate_monotonic_reset_statistics>:
*/
rtems_status_code rtems_rate_monotonic_reset_statistics(
rtems_id id
)
{
10ca40: 55 push %ebp
10ca41: 89 e5 mov %esp,%ebp
10ca43: 57 push %edi
10ca44: 53 push %ebx
10ca45: 83 ec 14 sub $0x14,%esp
Objects_Locations location;
Rate_monotonic_Control *the_period;
the_period = _Rate_monotonic_Get( id, &location );
10ca48: 8d 45 f4 lea -0xc(%ebp),%eax
10ca4b: 50 push %eax
10ca4c: ff 75 08 pushl 0x8(%ebp)
10ca4f: 68 c0 b0 12 00 push $0x12b0c0
10ca54: e8 e3 1d 00 00 call 10e83c <_Objects_Get>
10ca59: 89 c2 mov %eax,%edx
switch ( location ) {
10ca5b: 83 c4 10 add $0x10,%esp
10ca5e: 8b 45 f4 mov -0xc(%ebp),%eax
10ca61: 85 c0 test %eax,%eax
10ca63: 75 3b jne 10caa0 <rtems_rate_monotonic_reset_statistics+0x60>
case OBJECTS_LOCAL:
_Rate_monotonic_Reset_statistics( the_period );
10ca65: 8d 5a 54 lea 0x54(%edx),%ebx
10ca68: b9 38 00 00 00 mov $0x38,%ecx
10ca6d: 31 c0 xor %eax,%eax
10ca6f: 89 df mov %ebx,%edi
10ca71: f3 aa rep stos %al,%es:(%edi)
10ca73: c7 42 5c ff ff ff 7f movl $0x7fffffff,0x5c(%edx)
10ca7a: c7 42 60 ff ff ff 7f movl $0x7fffffff,0x60(%edx)
10ca81: c7 42 74 ff ff ff 7f movl $0x7fffffff,0x74(%edx)
10ca88: c7 42 78 ff ff ff 7f movl $0x7fffffff,0x78(%edx)
_Thread_Enable_dispatch();
10ca8f: e8 5c 28 00 00 call 10f2f0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10ca94: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10ca96: 8d 65 f8 lea -0x8(%ebp),%esp
10ca99: 5b pop %ebx
10ca9a: 5f pop %edi
10ca9b: c9 leave
10ca9c: c3 ret
10ca9d: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10caa0: b8 04 00 00 00 mov $0x4,%eax
}
10caa5: 8d 65 f8 lea -0x8(%ebp),%esp
10caa8: 5b pop %ebx
10caa9: 5f pop %edi
10caaa: c9 leave
10caab: c3 ret
0011724c <rtems_region_create>:
uintptr_t length,
uintptr_t page_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
11724c: 55 push %ebp
11724d: 89 e5 mov %esp,%ebp
11724f: 57 push %edi
117250: 56 push %esi
117251: 53 push %ebx
117252: 83 ec 1c sub $0x1c,%esp
117255: 8b 7d 08 mov 0x8(%ebp),%edi
117258: 8b 75 0c mov 0xc(%ebp),%esi
rtems_status_code return_status;
Region_Control *the_region;
if ( !rtems_is_name_valid( name ) )
11725b: 85 ff test %edi,%edi
11725d: 0f 84 c1 00 00 00 je 117324 <rtems_region_create+0xd8>
return RTEMS_INVALID_NAME;
if ( !starting_address )
117263: 85 f6 test %esi,%esi
117265: 0f 84 e1 00 00 00 je 11734c <rtems_region_create+0x100>
return RTEMS_INVALID_ADDRESS;
if ( !id )
11726b: 8b 45 1c mov 0x1c(%ebp),%eax
11726e: 85 c0 test %eax,%eax
117270: 0f 84 d6 00 00 00 je 11734c <rtems_region_create+0x100>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator(); /* to prevent deletion */
117276: 83 ec 0c sub $0xc,%esp
117279: ff 35 bc 2b 14 00 pushl 0x142bbc
11727f: e8 28 25 00 00 call 1197ac <_API_Mutex_Lock>
* This function allocates a region control block from
* the inactive chain of free region control blocks.
*/
RTEMS_INLINE_ROUTINE Region_Control *_Region_Allocate( void )
{
return (Region_Control *) _Objects_Allocate( &_Region_Information );
117284: c7 04 24 e0 29 14 00 movl $0x1429e0,(%esp)
11728b: e8 60 3b 00 00 call 11adf0 <_Objects_Allocate>
117290: 89 c3 mov %eax,%ebx
the_region = _Region_Allocate();
if ( !the_region )
117292: 83 c4 10 add $0x10,%esp
117295: 85 c0 test %eax,%eax
117297: 0f 84 bf 00 00 00 je 11735c <rtems_region_create+0x110>
return_status = RTEMS_TOO_MANY;
else {
the_region->maximum_segment_size = _Heap_Initialize(
11729d: ff 75 14 pushl 0x14(%ebp)
1172a0: ff 75 10 pushl 0x10(%ebp)
1172a3: 56 push %esi
1172a4: 8d 40 68 lea 0x68(%eax),%eax
1172a7: 50 push %eax
1172a8: e8 4f 37 00 00 call 11a9fc <_Heap_Initialize>
1172ad: 89 43 5c mov %eax,0x5c(%ebx)
&the_region->Memory, starting_address, length, page_size
);
if ( !the_region->maximum_segment_size ) {
1172b0: 83 c4 10 add $0x10,%esp
1172b3: 85 c0 test %eax,%eax
1172b5: 74 7d je 117334 <rtems_region_create+0xe8>
return_status = RTEMS_INVALID_SIZE;
}
else {
the_region->starting_address = starting_address;
1172b7: 89 73 50 mov %esi,0x50(%ebx)
the_region->length = length;
1172ba: 8b 45 10 mov 0x10(%ebp),%eax
1172bd: 89 43 54 mov %eax,0x54(%ebx)
the_region->page_size = page_size;
1172c0: 8b 55 14 mov 0x14(%ebp),%edx
1172c3: 89 53 58 mov %edx,0x58(%ebx)
the_region->attribute_set = attribute_set;
1172c6: 8b 45 18 mov 0x18(%ebp),%eax
1172c9: 89 43 60 mov %eax,0x60(%ebx)
the_region->number_of_used_blocks = 0;
1172cc: c7 43 64 00 00 00 00 movl $0x0,0x64(%ebx)
_Thread_queue_Initialize(
1172d3: 6a 06 push $0x6
1172d5: 6a 40 push $0x40
1172d7: a8 04 test $0x4,%al
1172d9: 0f 95 c0 setne %al
1172dc: 0f b6 c0 movzbl %al,%eax
1172df: 50 push %eax
1172e0: 8d 43 10 lea 0x10(%ebx),%eax
1172e3: 50 push %eax
1172e4: e8 f3 51 00 00 call 11c4dc <_Thread_queue_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
1172e9: 8b 43 08 mov 0x8(%ebx),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
1172ec: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
1172ef: 8b 15 fc 29 14 00 mov 0x1429fc,%edx
1172f5: 89 1c 8a mov %ebx,(%edx,%ecx,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
1172f8: 89 7b 0c mov %edi,0xc(%ebx)
&_Region_Information,
&the_region->Object,
(Objects_Name) name
);
*id = the_region->Object.id;
1172fb: 8b 55 1c mov 0x1c(%ebp),%edx
1172fe: 89 02 mov %eax,(%edx)
117300: 83 c4 10 add $0x10,%esp
return_status = RTEMS_SUCCESSFUL;
117303: 31 c0 xor %eax,%eax
}
}
_RTEMS_Unlock_allocator();
117305: 83 ec 0c sub $0xc,%esp
117308: ff 35 bc 2b 14 00 pushl 0x142bbc
11730e: 89 45 e4 mov %eax,-0x1c(%ebp)
117311: e8 de 24 00 00 call 1197f4 <_API_Mutex_Unlock>
return return_status;
117316: 83 c4 10 add $0x10,%esp
117319: 8b 45 e4 mov -0x1c(%ebp),%eax
}
11731c: 8d 65 f4 lea -0xc(%ebp),%esp
11731f: 5b pop %ebx
117320: 5e pop %esi
117321: 5f pop %edi
117322: c9 leave
117323: c3 ret
{
rtems_status_code return_status;
Region_Control *the_region;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
117324: b8 03 00 00 00 mov $0x3,%eax
}
}
_RTEMS_Unlock_allocator();
return return_status;
}
117329: 8d 65 f4 lea -0xc(%ebp),%esp
11732c: 5b pop %ebx
11732d: 5e pop %esi
11732e: 5f pop %edi
11732f: c9 leave
117330: c3 ret
117331: 8d 76 00 lea 0x0(%esi),%esi
*/
RTEMS_INLINE_ROUTINE void _Region_Free (
Region_Control *the_region
)
{
_Objects_Free( &_Region_Information, &the_region->Object );
117334: 83 ec 08 sub $0x8,%esp
117337: 53 push %ebx
117338: 68 e0 29 14 00 push $0x1429e0
11733d: e8 26 3e 00 00 call 11b168 <_Objects_Free>
117342: 83 c4 10 add $0x10,%esp
&the_region->Memory, starting_address, length, page_size
);
if ( !the_region->maximum_segment_size ) {
_Region_Free( the_region );
return_status = RTEMS_INVALID_SIZE;
117345: b8 08 00 00 00 mov $0x8,%eax
11734a: eb b9 jmp 117305 <rtems_region_create+0xb9>
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
if ( !id )
return RTEMS_INVALID_ADDRESS;
11734c: b8 09 00 00 00 mov $0x9,%eax
}
}
_RTEMS_Unlock_allocator();
return return_status;
}
117351: 8d 65 f4 lea -0xc(%ebp),%esp
117354: 5b pop %ebx
117355: 5e pop %esi
117356: 5f pop %edi
117357: c9 leave
117358: c3 ret
117359: 8d 76 00 lea 0x0(%esi),%esi
_RTEMS_Lock_allocator(); /* to prevent deletion */
the_region = _Region_Allocate();
if ( !the_region )
return_status = RTEMS_TOO_MANY;
11735c: b8 05 00 00 00 mov $0x5,%eax
117361: eb a2 jmp 117305 <rtems_region_create+0xb9>
00117364 <rtems_region_delete>:
*/
rtems_status_code rtems_region_delete(
rtems_id id
)
{
117364: 55 push %ebp
117365: 89 e5 mov %esp,%ebp
117367: 53 push %ebx
117368: 83 ec 30 sub $0x30,%esp
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
_RTEMS_Lock_allocator();
11736b: ff 35 bc 2b 14 00 pushl 0x142bbc
117371: e8 36 24 00 00 call 1197ac <_API_Mutex_Lock>
Objects_Id id,
Objects_Locations *location
)
{
return (Region_Control *)
_Objects_Get_no_protection( &_Region_Information, id, location );
117376: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
117379: 8d 45 f4 lea -0xc(%ebp),%eax
11737c: 50 push %eax
11737d: ff 75 08 pushl 0x8(%ebp)
117380: 68 e0 29 14 00 push $0x1429e0
117385: e8 1e 3f 00 00 call 11b2a8 <_Objects_Get_no_protection>
switch ( location ) {
11738a: 83 c4 10 add $0x10,%esp
11738d: 8b 5d f4 mov -0xc(%ebp),%ebx
117390: 85 db test %ebx,%ebx
117392: 74 1c je 1173b0 <rtems_region_delete+0x4c>
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
117394: bb 04 00 00 00 mov $0x4,%ebx
break;
}
_RTEMS_Unlock_allocator();
117399: 83 ec 0c sub $0xc,%esp
11739c: ff 35 bc 2b 14 00 pushl 0x142bbc
1173a2: e8 4d 24 00 00 call 1197f4 <_API_Mutex_Unlock>
return return_status;
}
1173a7: 89 d8 mov %ebx,%eax
1173a9: 8b 5d fc mov -0x4(%ebp),%ebx
1173ac: c9 leave
1173ad: c3 ret
1173ae: 66 90 xchg %ax,%ax
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_Region_Debug_Walk( the_region, 5 );
if ( the_region->number_of_used_blocks != 0 )
1173b0: 8b 48 64 mov 0x64(%eax),%ecx
1173b3: 85 c9 test %ecx,%ecx
1173b5: 74 09 je 1173c0 <rtems_region_delete+0x5c>
return_status = RTEMS_RESOURCE_IN_USE;
1173b7: bb 0c 00 00 00 mov $0xc,%ebx
1173bc: eb db jmp 117399 <rtems_region_delete+0x35>
1173be: 66 90 xchg %ax,%ax
else {
_Objects_Close( &_Region_Information, &the_region->Object );
1173c0: 83 ec 08 sub $0x8,%esp
1173c3: 50 push %eax
1173c4: 68 e0 29 14 00 push $0x1429e0
1173c9: 89 45 e4 mov %eax,-0x1c(%ebp)
1173cc: e8 9b 3a 00 00 call 11ae6c <_Objects_Close>
*/
RTEMS_INLINE_ROUTINE void _Region_Free (
Region_Control *the_region
)
{
_Objects_Free( &_Region_Information, &the_region->Object );
1173d1: 58 pop %eax
1173d2: 5a pop %edx
1173d3: 8b 45 e4 mov -0x1c(%ebp),%eax
1173d6: 50 push %eax
1173d7: 68 e0 29 14 00 push $0x1429e0
1173dc: e8 87 3d 00 00 call 11b168 <_Objects_Free>
1173e1: 83 c4 10 add $0x10,%esp
_Region_Free( the_region );
return_status = RTEMS_SUCCESSFUL;
1173e4: 31 db xor %ebx,%ebx
1173e6: eb b1 jmp 117399 <rtems_region_delete+0x35>
001173e8 <rtems_region_extend>:
rtems_status_code rtems_region_extend(
rtems_id id,
void *starting_address,
uintptr_t length
)
{
1173e8: 55 push %ebp
1173e9: 89 e5 mov %esp,%ebp
1173eb: 56 push %esi
1173ec: 53 push %ebx
1173ed: 83 ec 10 sub $0x10,%esp
1173f0: 8b 5d 0c mov 0xc(%ebp),%ebx
bool extend_ok;
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
if ( !starting_address )
1173f3: 85 db test %ebx,%ebx
1173f5: 74 75 je 11746c <rtems_region_extend+0x84>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator(); /* to prevent deletion */
1173f7: 83 ec 0c sub $0xc,%esp
1173fa: ff 35 bc 2b 14 00 pushl 0x142bbc
117400: e8 a7 23 00 00 call 1197ac <_API_Mutex_Lock>
Objects_Id id,
Objects_Locations *location
)
{
return (Region_Control *)
_Objects_Get_no_protection( &_Region_Information, id, location );
117405: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
117408: 8d 45 f0 lea -0x10(%ebp),%eax
11740b: 50 push %eax
11740c: ff 75 08 pushl 0x8(%ebp)
11740f: 68 e0 29 14 00 push $0x1429e0
117414: e8 8f 3e 00 00 call 11b2a8 <_Objects_Get_no_protection>
117419: 89 c6 mov %eax,%esi
switch ( location ) {
11741b: 83 c4 10 add $0x10,%esp
11741e: 8b 45 f0 mov -0x10(%ebp),%eax
117421: 85 c0 test %eax,%eax
117423: 74 1f je 117444 <rtems_region_extend+0x5c>
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
117425: bb 04 00 00 00 mov $0x4,%ebx
break;
}
_RTEMS_Unlock_allocator();
11742a: 83 ec 0c sub $0xc,%esp
11742d: ff 35 bc 2b 14 00 pushl 0x142bbc
117433: e8 bc 23 00 00 call 1197f4 <_API_Mutex_Unlock>
return return_status;
117438: 83 c4 10 add $0x10,%esp
}
11743b: 89 d8 mov %ebx,%eax
11743d: 8d 65 f8 lea -0x8(%ebp),%esp
117440: 5b pop %ebx
117441: 5e pop %esi
117442: c9 leave
117443: c3 ret
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
extend_ok = _Heap_Extend(
117444: 8d 45 f4 lea -0xc(%ebp),%eax
117447: 50 push %eax
117448: ff 75 10 pushl 0x10(%ebp)
11744b: 53 push %ebx
11744c: 8d 46 68 lea 0x68(%esi),%eax
11744f: 50 push %eax
117450: e8 9b 2f 00 00 call 11a3f0 <_Heap_Extend>
starting_address,
length,
&amount_extended
);
if ( extend_ok ) {
117455: 83 c4 10 add $0x10,%esp
117458: 84 c0 test %al,%al
11745a: 74 20 je 11747c <rtems_region_extend+0x94>
the_region->length += amount_extended;
11745c: 8b 45 f4 mov -0xc(%ebp),%eax
11745f: 01 46 54 add %eax,0x54(%esi)
the_region->maximum_segment_size += amount_extended;
117462: 01 46 5c add %eax,0x5c(%esi)
return_status = RTEMS_SUCCESSFUL;
117465: 31 db xor %ebx,%ebx
117467: eb c1 jmp 11742a <rtems_region_extend+0x42>
117469: 8d 76 00 lea 0x0(%esi),%esi
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
11746c: bb 09 00 00 00 mov $0x9,%ebx
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
117471: 89 d8 mov %ebx,%eax
117473: 8d 65 f8 lea -0x8(%ebp),%esp
117476: 5b pop %ebx
117477: 5e pop %esi
117478: c9 leave
117479: c3 ret
11747a: 66 90 xchg %ax,%ax
if ( extend_ok ) {
the_region->length += amount_extended;
the_region->maximum_segment_size += amount_extended;
return_status = RTEMS_SUCCESSFUL;
} else {
return_status = RTEMS_INVALID_ADDRESS;
11747c: bb 09 00 00 00 mov $0x9,%ebx
117481: eb a7 jmp 11742a <rtems_region_extend+0x42>
00117484 <rtems_region_get_free_information>:
rtems_status_code rtems_region_get_free_information(
rtems_id id,
Heap_Information_block *the_info
)
{
117484: 55 push %ebp
117485: 89 e5 mov %esp,%ebp
117487: 53 push %ebx
117488: 83 ec 14 sub $0x14,%esp
11748b: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Locations location;
rtems_status_code return_status;
register Region_Control *the_region;
if ( !the_info )
11748e: 85 db test %ebx,%ebx
117490: 74 76 je 117508 <rtems_region_get_free_information+0x84>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
117492: 83 ec 0c sub $0xc,%esp
117495: ff 35 bc 2b 14 00 pushl 0x142bbc
11749b: e8 0c 23 00 00 call 1197ac <_API_Mutex_Lock>
1174a0: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
1174a3: 8d 45 f4 lea -0xc(%ebp),%eax
1174a6: 50 push %eax
1174a7: ff 75 08 pushl 0x8(%ebp)
1174aa: 68 e0 29 14 00 push $0x1429e0
1174af: e8 f4 3d 00 00 call 11b2a8 <_Objects_Get_no_protection>
switch ( location ) {
1174b4: 83 c4 10 add $0x10,%esp
1174b7: 8b 55 f4 mov -0xc(%ebp),%edx
1174ba: 85 d2 test %edx,%edx
1174bc: 74 1e je 1174dc <rtems_region_get_free_information+0x58>
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
1174be: bb 04 00 00 00 mov $0x4,%ebx
break;
}
_RTEMS_Unlock_allocator();
1174c3: 83 ec 0c sub $0xc,%esp
1174c6: ff 35 bc 2b 14 00 pushl 0x142bbc
1174cc: e8 23 23 00 00 call 1197f4 <_API_Mutex_Unlock>
return return_status;
1174d1: 83 c4 10 add $0x10,%esp
}
1174d4: 89 d8 mov %ebx,%eax
1174d6: 8b 5d fc mov -0x4(%ebp),%ebx
1174d9: c9 leave
1174da: c3 ret
1174db: 90 nop
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
the_info->Used.number = 0;
1174dc: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
the_info->Used.total = 0;
1174e3: c7 43 14 00 00 00 00 movl $0x0,0x14(%ebx)
the_info->Used.largest = 0;
1174ea: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx)
_Heap_Get_free_information( &the_region->Memory, &the_info->Free );
1174f1: 83 ec 08 sub $0x8,%esp
1174f4: 53 push %ebx
1174f5: 83 c0 68 add $0x68,%eax
1174f8: 50 push %eax
1174f9: e8 da 32 00 00 call 11a7d8 <_Heap_Get_free_information>
return_status = RTEMS_SUCCESSFUL;
break;
1174fe: 83 c4 10 add $0x10,%esp
the_info->Used.total = 0;
the_info->Used.largest = 0;
_Heap_Get_free_information( &the_region->Memory, &the_info->Free );
return_status = RTEMS_SUCCESSFUL;
117501: 31 db xor %ebx,%ebx
break;
117503: eb be jmp 1174c3 <rtems_region_get_free_information+0x3f>
117505: 8d 76 00 lea 0x0(%esi),%esi
Objects_Locations location;
rtems_status_code return_status;
register Region_Control *the_region;
if ( !the_info )
return RTEMS_INVALID_ADDRESS;
117508: bb 09 00 00 00 mov $0x9,%ebx
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
11750d: 89 d8 mov %ebx,%eax
11750f: 8b 5d fc mov -0x4(%ebp),%ebx
117512: c9 leave
117513: c3 ret
0011758c <rtems_region_get_segment>:
uintptr_t size,
rtems_option option_set,
rtems_interval timeout,
void **segment
)
{
11758c: 55 push %ebp
11758d: 89 e5 mov %esp,%ebp
11758f: 57 push %edi
117590: 56 push %esi
117591: 53 push %ebx
117592: 83 ec 2c sub $0x2c,%esp
117595: 8b 75 0c mov 0xc(%ebp),%esi
117598: 8b 5d 18 mov 0x18(%ebp),%ebx
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
void *the_segment;
if ( !segment )
11759b: 85 db test %ebx,%ebx
11759d: 0f 84 a1 00 00 00 je 117644 <rtems_region_get_segment+0xb8>
return RTEMS_INVALID_ADDRESS;
*segment = NULL;
1175a3: c7 03 00 00 00 00 movl $0x0,(%ebx)
if ( size == 0 )
1175a9: 85 f6 test %esi,%esi
1175ab: 75 0f jne 1175bc <rtems_region_get_segment+0x30>
return RTEMS_INVALID_SIZE;
1175ad: b8 08 00 00 00 mov $0x8,%eax
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
1175b2: 8d 65 f4 lea -0xc(%ebp),%esp
1175b5: 5b pop %ebx
1175b6: 5e pop %esi
1175b7: 5f pop %edi
1175b8: c9 leave
1175b9: c3 ret
1175ba: 66 90 xchg %ax,%ax
*segment = NULL;
if ( size == 0 )
return RTEMS_INVALID_SIZE;
_RTEMS_Lock_allocator();
1175bc: 83 ec 0c sub $0xc,%esp
1175bf: ff 35 bc 2b 14 00 pushl 0x142bbc
1175c5: e8 e2 21 00 00 call 1197ac <_API_Mutex_Lock>
executing = _Thread_Executing;
1175ca: a1 b8 30 14 00 mov 0x1430b8,%eax
1175cf: 89 45 d4 mov %eax,-0x2c(%ebp)
1175d2: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
1175d5: 8d 45 e4 lea -0x1c(%ebp),%eax
1175d8: 50 push %eax
1175d9: ff 75 08 pushl 0x8(%ebp)
1175dc: 68 e0 29 14 00 push $0x1429e0
1175e1: e8 c2 3c 00 00 call 11b2a8 <_Objects_Get_no_protection>
1175e6: 89 c7 mov %eax,%edi
switch ( location ) {
1175e8: 83 c4 10 add $0x10,%esp
1175eb: 8b 45 e4 mov -0x1c(%ebp),%eax
1175ee: 85 c0 test %eax,%eax
1175f0: 75 2a jne 11761c <rtems_region_get_segment+0x90>
case OBJECTS_LOCAL:
if ( size > the_region->maximum_segment_size )
1175f2: 3b 77 5c cmp 0x5c(%edi),%esi
1175f5: 76 2d jbe 117624 <rtems_region_get_segment+0x98>
return_status = RTEMS_INVALID_SIZE;
1175f7: b8 08 00 00 00 mov $0x8,%eax
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
1175fc: 83 ec 0c sub $0xc,%esp
1175ff: ff 35 bc 2b 14 00 pushl 0x142bbc
117605: 89 45 d0 mov %eax,-0x30(%ebp)
117608: e8 e7 21 00 00 call 1197f4 <_API_Mutex_Unlock>
return return_status;
11760d: 83 c4 10 add $0x10,%esp
117610: 8b 45 d0 mov -0x30(%ebp),%eax
}
117613: 8d 65 f4 lea -0xc(%ebp),%esp
117616: 5b pop %ebx
117617: 5e pop %esi
117618: 5f pop %edi
117619: c9 leave
11761a: c3 ret
11761b: 90 nop
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
11761c: b8 04 00 00 00 mov $0x4,%eax
117621: eb d9 jmp 1175fc <rtems_region_get_segment+0x70>
117623: 90 nop
* @brief See _Heap_Allocate_aligned_with_boundary() with alignment and
* boundary equals zero.
*/
RTEMS_INLINE_ROUTINE void *_Heap_Allocate( Heap_Control *heap, uintptr_t size )
{
return _Heap_Allocate_aligned_with_boundary( heap, size, 0, 0 );
117624: 6a 00 push $0x0
117626: 6a 00 push $0x0
117628: 56 push %esi
RTEMS_INLINE_ROUTINE void *_Region_Allocate_segment (
Region_Control *the_region,
uintptr_t size
)
{
return _Heap_Allocate( &the_region->Memory, size );
117629: 8d 47 68 lea 0x68(%edi),%eax
11762c: 50 push %eax
11762d: e8 ea 2b 00 00 call 11a21c <_Heap_Allocate_aligned_with_boundary>
the_segment = _Region_Allocate_segment( the_region, size );
_Region_Debug_Walk( the_region, 2 );
if ( the_segment ) {
117632: 83 c4 10 add $0x10,%esp
117635: 85 c0 test %eax,%eax
117637: 74 17 je 117650 <rtems_region_get_segment+0xc4>
the_region->number_of_used_blocks += 1;
117639: ff 47 64 incl 0x64(%edi)
*segment = the_segment;
11763c: 89 03 mov %eax,(%ebx)
return_status = RTEMS_SUCCESSFUL;
11763e: 31 c0 xor %eax,%eax
117640: eb ba jmp 1175fc <rtems_region_get_segment+0x70>
117642: 66 90 xchg %ax,%ax
rtems_status_code return_status;
Region_Control *the_region;
void *the_segment;
if ( !segment )
return RTEMS_INVALID_ADDRESS;
117644: b8 09 00 00 00 mov $0x9,%eax
117649: e9 64 ff ff ff jmp 1175b2 <rtems_region_get_segment+0x26>
11764e: 66 90 xchg %ax,%ax
if ( the_segment ) {
the_region->number_of_used_blocks += 1;
*segment = the_segment;
return_status = RTEMS_SUCCESSFUL;
} else if ( _Options_Is_no_wait( option_set ) ) {
117650: f6 45 10 01 testb $0x1,0x10(%ebp)
117654: 74 07 je 11765d <rtems_region_get_segment+0xd1>
return_status = RTEMS_UNSATISFIED;
117656: b8 0d 00 00 00 mov $0xd,%eax
11765b: eb 9f jmp 1175fc <rtems_region_get_segment+0x70>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
11765d: a1 d0 2a 14 00 mov 0x142ad0,%eax
117662: 40 inc %eax
117663: a3 d0 2a 14 00 mov %eax,0x142ad0
* Switch from using the memory allocation mutex to using a
* dispatching disabled critical section. We have to do this
* because this thread is going to block.
*/
_Thread_Disable_dispatch();
_RTEMS_Unlock_allocator();
117668: 83 ec 0c sub $0xc,%esp
11766b: ff 35 bc 2b 14 00 pushl 0x142bbc
117671: e8 7e 21 00 00 call 1197f4 <_API_Mutex_Unlock>
executing->Wait.queue = &the_region->Wait_queue;
117676: 8d 47 10 lea 0x10(%edi),%eax
117679: 8b 55 d4 mov -0x2c(%ebp),%edx
11767c: 89 42 44 mov %eax,0x44(%edx)
executing->Wait.id = id;
11767f: 8b 4d 08 mov 0x8(%ebp),%ecx
117682: 89 4a 20 mov %ecx,0x20(%edx)
executing->Wait.count = size;
117685: 89 72 24 mov %esi,0x24(%edx)
executing->Wait.return_argument = segment;
117688: 89 5a 28 mov %ebx,0x28(%edx)
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
11768b: c7 47 40 01 00 00 00 movl $0x1,0x40(%edi)
_Thread_queue_Enter_critical_section( &the_region->Wait_queue );
_Thread_queue_Enqueue( &the_region->Wait_queue, timeout );
117692: 83 c4 0c add $0xc,%esp
117695: 68 a0 c5 11 00 push $0x11c5a0
11769a: ff 75 14 pushl 0x14(%ebp)
11769d: 50 push %eax
11769e: e8 d1 4b 00 00 call 11c274 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
1176a3: e8 f0 46 00 00 call 11bd98 <_Thread_Enable_dispatch>
return (rtems_status_code) executing->Wait.return_code;
1176a8: 8b 55 d4 mov -0x2c(%ebp),%edx
1176ab: 8b 42 34 mov 0x34(%edx),%eax
1176ae: 83 c4 10 add $0x10,%esp
1176b1: e9 fc fe ff ff jmp 1175b2 <rtems_region_get_segment+0x26>
0011776c <rtems_region_resize_segment>:
rtems_id id,
void *segment,
uintptr_t size,
uintptr_t *old_size
)
{
11776c: 55 push %ebp
11776d: 89 e5 mov %esp,%ebp
11776f: 56 push %esi
117770: 53 push %ebx
117771: 83 ec 20 sub $0x20,%esp
117774: 8b 5d 14 mov 0x14(%ebp),%ebx
uintptr_t osize;
rtems_status_code return_status;
Heap_Resize_status status;
register Region_Control *the_region;
if ( !old_size )
117777: 85 db test %ebx,%ebx
117779: 0f 84 89 00 00 00 je 117808 <rtems_region_resize_segment+0x9c>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
11777f: 83 ec 0c sub $0xc,%esp
117782: ff 35 bc 2b 14 00 pushl 0x142bbc
117788: e8 1f 20 00 00 call 1197ac <_API_Mutex_Lock>
11778d: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
117790: 8d 45 f0 lea -0x10(%ebp),%eax
117793: 50 push %eax
117794: ff 75 08 pushl 0x8(%ebp)
117797: 68 e0 29 14 00 push $0x1429e0
11779c: e8 07 3b 00 00 call 11b2a8 <_Objects_Get_no_protection>
1177a1: 89 c6 mov %eax,%esi
switch ( location ) {
1177a3: 83 c4 10 add $0x10,%esp
1177a6: 8b 45 f0 mov -0x10(%ebp),%eax
1177a9: 85 c0 test %eax,%eax
1177ab: 74 1f je 1177cc <rtems_region_resize_segment+0x60>
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
1177ad: 83 ec 0c sub $0xc,%esp
1177b0: ff 35 bc 2b 14 00 pushl 0x142bbc
1177b6: e8 39 20 00 00 call 1197f4 <_API_Mutex_Unlock>
return return_status;
1177bb: 83 c4 10 add $0x10,%esp
1177be: b8 04 00 00 00 mov $0x4,%eax
}
1177c3: 8d 65 f8 lea -0x8(%ebp),%esp
1177c6: 5b pop %ebx
1177c7: 5e pop %esi
1177c8: c9 leave
1177c9: c3 ret
1177ca: 66 90 xchg %ax,%ax
case OBJECTS_LOCAL:
_Region_Debug_Walk( the_region, 7 );
status = _Heap_Resize_block(
1177cc: 83 ec 0c sub $0xc,%esp
1177cf: 8d 45 f4 lea -0xc(%ebp),%eax
1177d2: 50 push %eax
1177d3: 8d 45 ec lea -0x14(%ebp),%eax
1177d6: 50 push %eax
1177d7: ff 75 10 pushl 0x10(%ebp)
1177da: ff 75 0c pushl 0xc(%ebp)
1177dd: 8d 46 68 lea 0x68(%esi),%eax
1177e0: 50 push %eax
1177e1: e8 1e 34 00 00 call 11ac04 <_Heap_Resize_block>
segment,
(uint32_t) size,
&osize,
&avail_size
);
*old_size = (uint32_t) osize;
1177e6: 8b 55 ec mov -0x14(%ebp),%edx
1177e9: 89 13 mov %edx,(%ebx)
_Region_Debug_Walk( the_region, 8 );
if ( status == HEAP_RESIZE_SUCCESSFUL )
1177eb: 83 c4 20 add $0x20,%esp
1177ee: 85 c0 test %eax,%eax
1177f0: 75 22 jne 117814 <rtems_region_resize_segment+0xa8>
_Region_Process_queue( the_region ); /* unlocks allocator */
1177f2: 83 ec 0c sub $0xc,%esp
1177f5: 56 push %esi
1177f6: e8 b5 7c 00 00 call 11f4b0 <_Region_Process_queue>
1177fb: 83 c4 10 add $0x10,%esp
else
_RTEMS_Unlock_allocator();
if (status == HEAP_RESIZE_SUCCESSFUL)
return RTEMS_SUCCESSFUL;
1177fe: 31 c0 xor %eax,%eax
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
117800: 8d 65 f8 lea -0x8(%ebp),%esp
117803: 5b pop %ebx
117804: 5e pop %esi
117805: c9 leave
117806: c3 ret
117807: 90 nop
rtems_status_code return_status;
Heap_Resize_status status;
register Region_Control *the_region;
if ( !old_size )
return RTEMS_INVALID_ADDRESS;
117808: b8 09 00 00 00 mov $0x9,%eax
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
11780d: 8d 65 f8 lea -0x8(%ebp),%esp
117810: 5b pop %ebx
117811: 5e pop %esi
117812: c9 leave
117813: c3 ret
_Region_Debug_Walk( the_region, 8 );
if ( status == HEAP_RESIZE_SUCCESSFUL )
_Region_Process_queue( the_region ); /* unlocks allocator */
else
_RTEMS_Unlock_allocator();
117814: 83 ec 0c sub $0xc,%esp
117817: ff 35 bc 2b 14 00 pushl 0x142bbc
11781d: 89 45 e4 mov %eax,-0x1c(%ebp)
117820: e8 cf 1f 00 00 call 1197f4 <_API_Mutex_Unlock>
if (status == HEAP_RESIZE_SUCCESSFUL)
return RTEMS_SUCCESSFUL;
if (status == HEAP_RESIZE_UNSATISFIED)
117825: 83 c4 10 add $0x10,%esp
return RTEMS_UNSATISFIED;
117828: 8b 45 e4 mov -0x1c(%ebp),%eax
11782b: 48 dec %eax
11782c: 0f 94 c0 sete %al
11782f: 0f b6 c0 movzbl %al,%eax
117832: 8d 04 85 09 00 00 00 lea 0x9(,%eax,4),%eax
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
117839: 8d 65 f8 lea -0x8(%ebp),%esp
11783c: 5b pop %ebx
11783d: 5e pop %esi
11783e: c9 leave
11783f: c3 ret
00117840 <rtems_region_return_segment>:
rtems_status_code rtems_region_return_segment(
rtems_id id,
void *segment
)
{
117840: 55 push %ebp
117841: 89 e5 mov %esp,%ebp
117843: 53 push %ebx
117844: 83 ec 20 sub $0x20,%esp
uint32_t size;
#endif
int status;
register Region_Control *the_region;
_RTEMS_Lock_allocator();
117847: ff 35 bc 2b 14 00 pushl 0x142bbc
11784d: e8 5a 1f 00 00 call 1197ac <_API_Mutex_Lock>
117852: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
117855: 8d 45 f4 lea -0xc(%ebp),%eax
117858: 50 push %eax
117859: ff 75 08 pushl 0x8(%ebp)
11785c: 68 e0 29 14 00 push $0x1429e0
117861: e8 42 3a 00 00 call 11b2a8 <_Objects_Get_no_protection>
117866: 89 c3 mov %eax,%ebx
switch ( location ) {
117868: 83 c4 10 add $0x10,%esp
11786b: 8b 45 f4 mov -0xc(%ebp),%eax
11786e: 85 c0 test %eax,%eax
117870: 75 1e jne 117890 <rtems_region_return_segment+0x50>
RTEMS_INLINE_ROUTINE bool _Region_Free_segment (
Region_Control *the_region,
void *the_segment
)
{
return _Heap_Free( &the_region->Memory, the_segment );
117872: 83 ec 08 sub $0x8,%esp
117875: ff 75 0c pushl 0xc(%ebp)
117878: 8d 43 68 lea 0x68(%ebx),%eax
11787b: 50 push %eax
11787c: e8 07 2e 00 00 call 11a688 <_Heap_Free>
#endif
status = _Region_Free_segment( the_region, segment );
_Region_Debug_Walk( the_region, 4 );
if ( !status )
117881: 83 c4 10 add $0x10,%esp
117884: 84 c0 test %al,%al
117886: 75 28 jne 1178b0 <rtems_region_return_segment+0x70>
return_status = RTEMS_INVALID_ADDRESS;
117888: bb 09 00 00 00 mov $0x9,%ebx
11788d: eb 06 jmp 117895 <rtems_region_return_segment+0x55>
11788f: 90 nop
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
117890: bb 04 00 00 00 mov $0x4,%ebx
break;
}
_RTEMS_Unlock_allocator();
117895: 83 ec 0c sub $0xc,%esp
117898: ff 35 bc 2b 14 00 pushl 0x142bbc
11789e: e8 51 1f 00 00 call 1197f4 <_API_Mutex_Unlock>
return return_status;
1178a3: 83 c4 10 add $0x10,%esp
}
1178a6: 89 d8 mov %ebx,%eax
1178a8: 8b 5d fc mov -0x4(%ebp),%ebx
1178ab: c9 leave
1178ac: c3 ret
1178ad: 8d 76 00 lea 0x0(%esi),%esi
_Region_Debug_Walk( the_region, 4 );
if ( !status )
return_status = RTEMS_INVALID_ADDRESS;
else {
the_region->number_of_used_blocks -= 1;
1178b0: ff 4b 64 decl 0x64(%ebx)
_Region_Process_queue(the_region); /* unlocks allocator */
1178b3: 83 ec 0c sub $0xc,%esp
1178b6: 53 push %ebx
1178b7: e8 f4 7b 00 00 call 11f4b0 <_Region_Process_queue>
return RTEMS_SUCCESSFUL;
1178bc: 83 c4 10 add $0x10,%esp
1178bf: 31 db xor %ebx,%ebx
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
1178c1: 89 d8 mov %ebx,%eax
1178c3: 8b 5d fc mov -0x4(%ebp),%ebx
1178c6: c9 leave
1178c7: c3 ret
0010b434 <rtems_semaphore_create>:
uint32_t count,
rtems_attribute attribute_set,
rtems_task_priority priority_ceiling,
rtems_id *id
)
{
10b434: 55 push %ebp
10b435: 89 e5 mov %esp,%ebp
10b437: 57 push %edi
10b438: 56 push %esi
10b439: 53 push %ebx
10b43a: 83 ec 3c sub $0x3c,%esp
10b43d: 8b 75 08 mov 0x8(%ebp),%esi
10b440: 8b 5d 10 mov 0x10(%ebp),%ebx
10b443: 8b 7d 18 mov 0x18(%ebp),%edi
register Semaphore_Control *the_semaphore;
CORE_mutex_Attributes the_mutex_attr;
CORE_semaphore_Attributes the_semaphore_attr;
CORE_mutex_Status mutex_status;
if ( !rtems_is_name_valid( name ) )
10b446: 85 f6 test %esi,%esi
10b448: 74 4a je 10b494 <rtems_semaphore_create+0x60>
return RTEMS_INVALID_NAME;
if ( !id )
10b44a: 85 ff test %edi,%edi
10b44c: 0f 84 f6 00 00 00 je 10b548 <rtems_semaphore_create+0x114>
return RTEMS_NOT_DEFINED;
} else
#endif
if ( _Attributes_Is_inherit_priority( attribute_set ) ||
10b452: 89 da mov %ebx,%edx
10b454: 81 e2 c0 00 00 00 and $0xc0,%edx
10b45a: 74 48 je 10b4a4 <rtems_semaphore_create+0x70>
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_binary_semaphore(
rtems_attribute attribute_set
)
{
return ((attribute_set & RTEMS_SEMAPHORE_CLASS) == RTEMS_BINARY_SEMAPHORE);
10b45c: 89 d8 mov %ebx,%eax
10b45e: 83 e0 30 and $0x30,%eax
_Attributes_Is_priority_ceiling( attribute_set ) ) {
if ( ! (_Attributes_Is_binary_semaphore( attribute_set ) &&
10b461: 83 f8 10 cmp $0x10,%eax
10b464: 74 0e je 10b474 <rtems_semaphore_create+0x40>
}
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
_Attributes_Is_priority_ceiling( attribute_set ) )
return RTEMS_NOT_DEFINED;
10b466: b8 0b 00 00 00 mov $0xb,%eax
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10b46b: 8d 65 f4 lea -0xc(%ebp),%esp
10b46e: 5b pop %ebx
10b46f: 5e pop %esi
10b470: 5f pop %edi
10b471: c9 leave
10b472: c3 ret
10b473: 90 nop
#endif
if ( _Attributes_Is_inherit_priority( attribute_set ) ||
_Attributes_Is_priority_ceiling( attribute_set ) ) {
if ( ! (_Attributes_Is_binary_semaphore( attribute_set ) &&
10b474: f6 c3 04 test $0x4,%bl
10b477: 74 ed je 10b466 <rtems_semaphore_create+0x32>
_Attributes_Is_priority( attribute_set ) ) )
return RTEMS_NOT_DEFINED;
}
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
10b479: 81 fa c0 00 00 00 cmp $0xc0,%edx
10b47f: 74 e5 je 10b466 <rtems_semaphore_create+0x32>
10b481: b9 10 00 00 00 mov $0x10,%ecx
_Attributes_Is_priority_ceiling( attribute_set ) )
return RTEMS_NOT_DEFINED;
if ( !_Attributes_Is_counting_semaphore( attribute_set ) && ( count > 1 ) )
10b486: 83 7d 0c 01 cmpl $0x1,0xc(%ebp)
10b48a: 76 1f jbe 10b4ab <rtems_semaphore_create+0x77>
return RTEMS_INVALID_NUMBER;
10b48c: b8 0a 00 00 00 mov $0xa,%eax
10b491: eb d8 jmp 10b46b <rtems_semaphore_create+0x37>
10b493: 90 nop
CORE_mutex_Attributes the_mutex_attr;
CORE_semaphore_Attributes the_semaphore_attr;
CORE_mutex_Status mutex_status;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
10b494: b8 03 00 00 00 mov $0x3,%eax
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10b499: 8d 65 f4 lea -0xc(%ebp),%esp
10b49c: 5b pop %ebx
10b49d: 5e pop %esi
10b49e: 5f pop %edi
10b49f: c9 leave
10b4a0: c3 ret
10b4a1: 8d 76 00 lea 0x0(%esi),%esi
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
_Attributes_Is_priority_ceiling( attribute_set ) )
return RTEMS_NOT_DEFINED;
if ( !_Attributes_Is_counting_semaphore( attribute_set ) && ( count > 1 ) )
10b4a4: 89 d9 mov %ebx,%ecx
10b4a6: 83 e1 30 and $0x30,%ecx
10b4a9: 75 db jne 10b486 <rtems_semaphore_create+0x52>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b4ab: a1 30 7e 12 00 mov 0x127e30,%eax
10b4b0: 40 inc %eax
10b4b1: a3 30 7e 12 00 mov %eax,0x127e30
* This function allocates a semaphore control block from
* the inactive chain of free semaphore control blocks.
*/
RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Allocate( void )
{
return (Semaphore_Control *) _Objects_Allocate( &_Semaphore_Information );
10b4b6: 83 ec 0c sub $0xc,%esp
10b4b9: 68 80 7d 12 00 push $0x127d80
10b4be: 89 4d c4 mov %ecx,-0x3c(%ebp)
10b4c1: e8 c2 14 00 00 call 10c988 <_Objects_Allocate>
10b4c6: 89 c2 mov %eax,%edx
_Thread_Disable_dispatch(); /* prevents deletion */
the_semaphore = _Semaphore_Allocate();
if ( !the_semaphore ) {
10b4c8: 83 c4 10 add $0x10,%esp
10b4cb: 85 c0 test %eax,%eax
10b4cd: 8b 4d c4 mov -0x3c(%ebp),%ecx
10b4d0: 0f 84 ba 00 00 00 je 10b590 <rtems_semaphore_create+0x15c>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_semaphore->attribute_set = attribute_set;
10b4d6: 89 58 10 mov %ebx,0x10(%eax)
/*
* Initialize it as a counting semaphore.
*/
if ( _Attributes_Is_counting_semaphore( attribute_set ) ) {
10b4d9: 85 c9 test %ecx,%ecx
10b4db: 74 77 je 10b554 <rtems_semaphore_create+0x120>
/*
* It is either simple binary semaphore or a more powerful mutex
* style binary semaphore. This is the mutex style.
*/
if ( _Attributes_Is_priority( attribute_set ) )
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY;
10b4dd: 31 c0 xor %eax,%eax
10b4df: f6 c3 04 test $0x4,%bl
10b4e2: 0f 95 c0 setne %al
10b4e5: 89 45 d8 mov %eax,-0x28(%ebp)
else
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
10b4e8: 83 f9 10 cmp $0x10,%ecx
10b4eb: 0f 84 ae 00 00 00 je 10b59f <rtems_semaphore_create+0x16b>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
the_mutex_attr.only_owner_release = true;
}
}
} else /* must be simple binary semaphore */ {
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_BLOCKS;
10b4f1: c7 45 d0 02 00 00 00 movl $0x2,-0x30(%ebp)
the_mutex_attr.only_owner_release = false;
10b4f8: c6 45 d4 00 movb $0x0,-0x2c(%ebp)
}
mutex_status = _CORE_mutex_Initialize(
10b4fc: 50 push %eax
10b4fd: 31 c0 xor %eax,%eax
10b4ff: 83 7d 0c 01 cmpl $0x1,0xc(%ebp)
10b503: 0f 94 c0 sete %al
10b506: 50 push %eax
10b507: 8d 45 d0 lea -0x30(%ebp),%eax
10b50a: 50 push %eax
10b50b: 8d 42 14 lea 0x14(%edx),%eax
10b50e: 50 push %eax
10b50f: 89 55 c4 mov %edx,-0x3c(%ebp)
10b512: e8 69 0c 00 00 call 10c180 <_CORE_mutex_Initialize>
&the_semaphore->Core_control.mutex,
&the_mutex_attr,
(count == 1) ? CORE_MUTEX_UNLOCKED : CORE_MUTEX_LOCKED
);
if ( mutex_status == CORE_MUTEX_STATUS_CEILING_VIOLATED ) {
10b517: 83 c4 10 add $0x10,%esp
10b51a: 83 f8 06 cmp $0x6,%eax
10b51d: 8b 55 c4 mov -0x3c(%ebp),%edx
10b520: 0f 84 a9 00 00 00 je 10b5cf <rtems_semaphore_create+0x19b>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10b526: 8b 42 08 mov 0x8(%edx),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
10b529: 0f b7 d8 movzwl %ax,%ebx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10b52c: 8b 0d 9c 7d 12 00 mov 0x127d9c,%ecx
10b532: 89 14 99 mov %edx,(%ecx,%ebx,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
10b535: 89 72 0c mov %esi,0xc(%edx)
&_Semaphore_Information,
&the_semaphore->Object,
(Objects_Name) name
);
*id = the_semaphore->Object.id;
10b538: 89 07 mov %eax,(%edi)
the_semaphore->Object.id,
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
10b53a: e8 b5 23 00 00 call 10d8f4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10b53f: 31 c0 xor %eax,%eax
10b541: e9 25 ff ff ff jmp 10b46b <rtems_semaphore_create+0x37>
10b546: 66 90 xchg %ax,%ax
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
10b548: b8 09 00 00 00 mov $0x9,%eax
10b54d: e9 19 ff ff ff jmp 10b46b <rtems_semaphore_create+0x37>
10b552: 66 90 xchg %ax,%ax
*/
if ( _Attributes_Is_counting_semaphore( attribute_set ) ) {
/*
* This effectively disables limit checking.
*/
the_semaphore_attr.maximum_count = 0xFFFFFFFF;
10b554: c7 45 e0 ff ff ff ff movl $0xffffffff,-0x20(%ebp)
if ( _Attributes_Is_priority( attribute_set ) )
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_PRIORITY;
10b55b: 31 c0 xor %eax,%eax
10b55d: f6 c3 04 test $0x4,%bl
10b560: 0f 95 c0 setne %al
10b563: 89 45 e4 mov %eax,-0x1c(%ebp)
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
/*
* The following are just to make Purify happy.
*/
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
10b566: c7 45 d0 00 00 00 00 movl $0x0,-0x30(%ebp)
the_mutex_attr.priority_ceiling = PRIORITY_MINIMUM;
10b56d: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp)
_CORE_semaphore_Initialize(
10b574: 51 push %ecx
10b575: ff 75 0c pushl 0xc(%ebp)
10b578: 8d 45 e0 lea -0x20(%ebp),%eax
10b57b: 50 push %eax
10b57c: 8d 42 14 lea 0x14(%edx),%eax
10b57f: 50 push %eax
10b580: 89 55 c4 mov %edx,-0x3c(%ebp)
10b583: e8 88 0e 00 00 call 10c410 <_CORE_semaphore_Initialize>
10b588: 83 c4 10 add $0x10,%esp
10b58b: 8b 55 c4 mov -0x3c(%ebp),%edx
10b58e: eb 96 jmp 10b526 <rtems_semaphore_create+0xf2>
_Thread_Disable_dispatch(); /* prevents deletion */
the_semaphore = _Semaphore_Allocate();
if ( !the_semaphore ) {
_Thread_Enable_dispatch();
10b590: e8 5f 23 00 00 call 10d8f4 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
10b595: b8 05 00 00 00 mov $0x5,%eax
10b59a: e9 cc fe ff ff jmp 10b46b <rtems_semaphore_create+0x37>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY;
else
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
the_mutex_attr.priority_ceiling = priority_ceiling;
10b59f: 8b 45 14 mov 0x14(%ebp),%eax
10b5a2: 89 45 dc mov %eax,-0x24(%ebp)
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
10b5a5: c7 45 d0 00 00 00 00 movl $0x0,-0x30(%ebp)
the_mutex_attr.only_owner_release = false;
10b5ac: c6 45 d4 00 movb $0x0,-0x2c(%ebp)
if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
10b5b0: 83 7d d8 01 cmpl $0x1,-0x28(%ebp)
10b5b4: 0f 85 42 ff ff ff jne 10b4fc <rtems_semaphore_create+0xc8>
if ( _Attributes_Is_inherit_priority( attribute_set ) ) {
10b5ba: f6 c3 40 test $0x40,%bl
10b5bd: 74 30 je 10b5ef <rtems_semaphore_create+0x1bb>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
10b5bf: c7 45 d8 02 00 00 00 movl $0x2,-0x28(%ebp)
the_mutex_attr.only_owner_release = true;
10b5c6: c6 45 d4 01 movb $0x1,-0x2c(%ebp)
10b5ca: e9 2d ff ff ff jmp 10b4fc <rtems_semaphore_create+0xc8>
*/
RTEMS_INLINE_ROUTINE void _Semaphore_Free (
Semaphore_Control *the_semaphore
)
{
_Objects_Free( &_Semaphore_Information, &the_semaphore->Object );
10b5cf: 83 ec 08 sub $0x8,%esp
10b5d2: 52 push %edx
10b5d3: 68 80 7d 12 00 push $0x127d80
10b5d8: e8 23 17 00 00 call 10cd00 <_Objects_Free>
(count == 1) ? CORE_MUTEX_UNLOCKED : CORE_MUTEX_LOCKED
);
if ( mutex_status == CORE_MUTEX_STATUS_CEILING_VIOLATED ) {
_Semaphore_Free( the_semaphore );
_Thread_Enable_dispatch();
10b5dd: e8 12 23 00 00 call 10d8f4 <_Thread_Enable_dispatch>
return RTEMS_INVALID_PRIORITY;
10b5e2: 83 c4 10 add $0x10,%esp
10b5e5: b8 13 00 00 00 mov $0x13,%eax
10b5ea: e9 7c fe ff ff jmp 10b46b <rtems_semaphore_create+0x37>
if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
if ( _Attributes_Is_inherit_priority( attribute_set ) ) {
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
the_mutex_attr.only_owner_release = true;
} else if ( _Attributes_Is_priority_ceiling( attribute_set ) ) {
10b5ef: 81 e3 80 00 00 00 and $0x80,%ebx
10b5f5: 0f 84 01 ff ff ff je 10b4fc <rtems_semaphore_create+0xc8>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
10b5fb: c7 45 d8 03 00 00 00 movl $0x3,-0x28(%ebp)
the_mutex_attr.only_owner_release = true;
10b602: c6 45 d4 01 movb $0x1,-0x2c(%ebp)
10b606: e9 f1 fe ff ff jmp 10b4fc <rtems_semaphore_create+0xc8>
0010b60c <rtems_semaphore_delete>:
#endif
rtems_status_code rtems_semaphore_delete(
rtems_id id
)
{
10b60c: 55 push %ebp
10b60d: 89 e5 mov %esp,%ebp
10b60f: 53 push %ebx
10b610: 83 ec 18 sub $0x18,%esp
register Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _Semaphore_Get( id, &location );
10b613: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Semaphore_Control *)
_Objects_Get( &_Semaphore_Information, id, location );
10b616: 50 push %eax
10b617: ff 75 08 pushl 0x8(%ebp)
10b61a: 68 80 7d 12 00 push $0x127d80
10b61f: e8 1c 18 00 00 call 10ce40 <_Objects_Get>
10b624: 89 c3 mov %eax,%ebx
switch ( location ) {
10b626: 83 c4 10 add $0x10,%esp
10b629: 8b 4d f4 mov -0xc(%ebp),%ecx
10b62c: 85 c9 test %ecx,%ecx
10b62e: 74 0c je 10b63c <rtems_semaphore_delete+0x30>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b630: b8 04 00 00 00 mov $0x4,%eax
}
10b635: 8b 5d fc mov -0x4(%ebp),%ebx
10b638: c9 leave
10b639: c3 ret
10b63a: 66 90 xchg %ax,%ax
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_counting_semaphore(
rtems_attribute attribute_set
)
{
return ((attribute_set & RTEMS_SEMAPHORE_CLASS) == RTEMS_COUNTING_SEMAPHORE);
10b63c: 8b 40 10 mov 0x10(%eax),%eax
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
10b63f: 83 e0 30 and $0x30,%eax
10b642: 74 58 je 10b69c <rtems_semaphore_delete+0x90>
if ( _CORE_mutex_Is_locked( &the_semaphore->Core_control.mutex ) &&
10b644: 8b 53 64 mov 0x64(%ebx),%edx
10b647: 85 d2 test %edx,%edx
10b649: 75 15 jne 10b660 <rtems_semaphore_delete+0x54>
10b64b: 83 f8 20 cmp $0x20,%eax
10b64e: 74 10 je 10b660 <rtems_semaphore_delete+0x54>
!_Attributes_Is_simple_binary_semaphore(
the_semaphore->attribute_set ) ) {
_Thread_Enable_dispatch();
10b650: e8 9f 22 00 00 call 10d8f4 <_Thread_Enable_dispatch>
return RTEMS_RESOURCE_IN_USE;
10b655: b8 0c 00 00 00 mov $0xc,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10b65a: 8b 5d fc mov -0x4(%ebp),%ebx
10b65d: c9 leave
10b65e: c3 ret
10b65f: 90 nop
!_Attributes_Is_simple_binary_semaphore(
the_semaphore->attribute_set ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
_CORE_mutex_Flush(
10b660: 50 push %eax
10b661: 6a 04 push $0x4
10b663: 6a 00 push $0x0
10b665: 8d 43 14 lea 0x14(%ebx),%eax
10b668: 50 push %eax
10b669: e8 06 0b 00 00 call 10c174 <_CORE_mutex_Flush>
10b66e: 83 c4 10 add $0x10,%esp
SEMAPHORE_MP_OBJECT_WAS_DELETED,
CORE_SEMAPHORE_WAS_DELETED
);
}
_Objects_Close( &_Semaphore_Information, &the_semaphore->Object );
10b671: 83 ec 08 sub $0x8,%esp
10b674: 53 push %ebx
10b675: 68 80 7d 12 00 push $0x127d80
10b67a: e8 85 13 00 00 call 10ca04 <_Objects_Close>
*/
RTEMS_INLINE_ROUTINE void _Semaphore_Free (
Semaphore_Control *the_semaphore
)
{
_Objects_Free( &_Semaphore_Information, &the_semaphore->Object );
10b67f: 58 pop %eax
10b680: 5a pop %edx
10b681: 53 push %ebx
10b682: 68 80 7d 12 00 push $0x127d80
10b687: e8 74 16 00 00 call 10cd00 <_Objects_Free>
0, /* Not used */
0 /* Not used */
);
}
#endif
_Thread_Enable_dispatch();
10b68c: e8 63 22 00 00 call 10d8f4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10b691: 83 c4 10 add $0x10,%esp
10b694: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10b696: 8b 5d fc mov -0x4(%ebp),%ebx
10b699: c9 leave
10b69a: c3 ret
10b69b: 90 nop
&the_semaphore->Core_control.mutex,
SEMAPHORE_MP_OBJECT_WAS_DELETED,
CORE_MUTEX_WAS_DELETED
);
} else {
_CORE_semaphore_Flush(
10b69c: 51 push %ecx
10b69d: 6a 02 push $0x2
10b69f: 6a 00 push $0x0
10b6a1: 8d 43 14 lea 0x14(%ebx),%eax
10b6a4: 50 push %eax
10b6a5: e8 5a 0d 00 00 call 10c404 <_CORE_semaphore_Flush>
10b6aa: 83 c4 10 add $0x10,%esp
10b6ad: eb c2 jmp 10b671 <rtems_semaphore_delete+0x65>
0010b6b0 <rtems_semaphore_obtain>:
rtems_status_code rtems_semaphore_obtain(
rtems_id id,
rtems_option option_set,
rtems_interval timeout
)
{
10b6b0: 55 push %ebp
10b6b1: 89 e5 mov %esp,%ebp
10b6b3: 57 push %edi
10b6b4: 56 push %esi
10b6b5: 53 push %ebx
10b6b6: 83 ec 1c sub $0x1c,%esp
10b6b9: 8b 5d 08 mov 0x8(%ebp),%ebx
10b6bc: 8b 75 0c mov 0xc(%ebp),%esi
10b6bf: 8b 7d 10 mov 0x10(%ebp),%edi
register Semaphore_Control *the_semaphore;
Objects_Locations location;
ISR_Level level;
the_semaphore = _Semaphore_Get_interrupt_disable( id, &location, &level );
10b6c2: 8d 45 e0 lea -0x20(%ebp),%eax
Objects_Locations *location,
ISR_Level *level
)
{
return (Semaphore_Control *)
_Objects_Get_isr_disable( &_Semaphore_Information, id, location, level );
10b6c5: 50 push %eax
10b6c6: 8d 45 e4 lea -0x1c(%ebp),%eax
10b6c9: 50 push %eax
10b6ca: 53 push %ebx
10b6cb: 68 80 7d 12 00 push $0x127d80
10b6d0: e8 13 17 00 00 call 10cde8 <_Objects_Get_isr_disable>
switch ( location ) {
10b6d5: 83 c4 10 add $0x10,%esp
10b6d8: 8b 4d e4 mov -0x1c(%ebp),%ecx
10b6db: 85 c9 test %ecx,%ecx
10b6dd: 74 0d je 10b6ec <rtems_semaphore_obtain+0x3c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b6df: b8 04 00 00 00 mov $0x4,%eax
}
10b6e4: 8d 65 f4 lea -0xc(%ebp),%esp
10b6e7: 5b pop %ebx
10b6e8: 5e pop %esi
10b6e9: 5f pop %edi
10b6ea: c9 leave
10b6eb: c3 ret
the_semaphore = _Semaphore_Get_interrupt_disable( id, &location, &level );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
10b6ec: f6 40 10 30 testb $0x30,0x10(%eax)
10b6f0: 74 36 je 10b728 <rtems_semaphore_obtain+0x78>
_CORE_mutex_Seize(
10b6f2: 83 ec 0c sub $0xc,%esp
10b6f5: ff 75 e0 pushl -0x20(%ebp)
10b6f8: 57 push %edi
*/
RTEMS_INLINE_ROUTINE bool _Options_Is_no_wait (
rtems_option option_set
)
{
return (option_set & RTEMS_NO_WAIT) ? true : false;
10b6f9: 83 e6 01 and $0x1,%esi
10b6fc: 83 f6 01 xor $0x1,%esi
10b6ff: 56 push %esi
10b700: 53 push %ebx
10b701: 83 c0 14 add $0x14,%eax
10b704: 50 push %eax
10b705: e8 6e 0b 00 00 call 10c278 <_CORE_mutex_Seize>
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
level
);
return _Semaphore_Translate_core_mutex_return_code(
10b70a: 83 c4 14 add $0x14,%esp
_Thread_Executing->Wait.return_code );
10b70d: a1 18 84 12 00 mov 0x128418,%eax
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
level
);
return _Semaphore_Translate_core_mutex_return_code(
10b712: ff 70 34 pushl 0x34(%eax)
10b715: e8 12 01 00 00 call 10b82c <_Semaphore_Translate_core_mutex_return_code>
10b71a: 83 c4 10 add $0x10,%esp
break;
}
return RTEMS_INVALID_ID;
}
10b71d: 8d 65 f4 lea -0xc(%ebp),%esp
10b720: 5b pop %ebx
10b721: 5e pop %esi
10b722: 5f pop %edi
10b723: c9 leave
10b724: c3 ret
10b725: 8d 76 00 lea 0x0(%esi),%esi
{
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
10b728: 8b 15 18 84 12 00 mov 0x128418,%edx
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
10b72e: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
if ( the_semaphore->count != 0 ) {
10b735: 8b 48 5c mov 0x5c(%eax),%ecx
10b738: 85 c9 test %ecx,%ecx
10b73a: 75 2c jne 10b768 <rtems_semaphore_obtain+0xb8>
the_semaphore->count -= 1;
_ISR_Enable( *level_p );
return;
}
if ( !wait ) {
10b73c: 83 e6 01 and $0x1,%esi
10b73f: 74 33 je 10b774 <rtems_semaphore_obtain+0xc4>
_ISR_Enable( *level_p );
10b741: ff 75 e0 pushl -0x20(%ebp)
10b744: 9d popf
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT;
10b745: c7 42 34 01 00 00 00 movl $0x1,0x34(%edx)
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
&level
);
return _Semaphore_Translate_core_semaphore_return_code(
10b74c: 83 ec 0c sub $0xc,%esp
_Thread_Executing->Wait.return_code );
10b74f: a1 18 84 12 00 mov 0x128418,%eax
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
&level
);
return _Semaphore_Translate_core_semaphore_return_code(
10b754: ff 70 34 pushl 0x34(%eax)
10b757: e8 e0 00 00 00 call 10b83c <_Semaphore_Translate_core_semaphore_return_code>
10b75c: 83 c4 10 add $0x10,%esp
break;
}
return RTEMS_INVALID_ID;
}
10b75f: 8d 65 f4 lea -0xc(%ebp),%esp
10b762: 5b pop %ebx
10b763: 5e pop %esi
10b764: 5f pop %edi
10b765: c9 leave
10b766: c3 ret
10b767: 90 nop
/* disabled when you get here */
executing = _Thread_Executing;
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( the_semaphore->count != 0 ) {
the_semaphore->count -= 1;
10b768: 49 dec %ecx
10b769: 89 48 5c mov %ecx,0x5c(%eax)
_ISR_Enable( *level_p );
10b76c: ff 75 e0 pushl -0x20(%ebp)
10b76f: 9d popf
10b770: eb da jmp 10b74c <rtems_semaphore_obtain+0x9c>
10b772: 66 90 xchg %ax,%ax
10b774: 8b 0d 30 7e 12 00 mov 0x127e30,%ecx
10b77a: 41 inc %ecx
10b77b: 89 0d 30 7e 12 00 mov %ecx,0x127e30
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
10b781: c7 40 44 01 00 00 00 movl $0x1,0x44(%eax)
return;
}
_Thread_Disable_dispatch();
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
executing->Wait.queue = &the_semaphore->Wait_queue;
10b788: 83 c0 14 add $0x14,%eax
10b78b: 89 42 44 mov %eax,0x44(%edx)
executing->Wait.id = id;
10b78e: 89 5a 20 mov %ebx,0x20(%edx)
_ISR_Enable( *level_p );
10b791: ff 75 e0 pushl -0x20(%ebp)
10b794: 9d popf
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
10b795: 52 push %edx
10b796: 68 fc e0 10 00 push $0x10e0fc
10b79b: 57 push %edi
10b79c: 50 push %eax
10b79d: e8 2e 26 00 00 call 10ddd0 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
10b7a2: e8 4d 21 00 00 call 10d8f4 <_Thread_Enable_dispatch>
10b7a7: 83 c4 10 add $0x10,%esp
10b7aa: eb a0 jmp 10b74c <rtems_semaphore_obtain+0x9c>
0010b7ac <rtems_semaphore_release>:
#endif
rtems_status_code rtems_semaphore_release(
rtems_id id
)
{
10b7ac: 55 push %ebp
10b7ad: 89 e5 mov %esp,%ebp
10b7af: 53 push %ebx
10b7b0: 83 ec 18 sub $0x18,%esp
10b7b3: 8b 5d 08 mov 0x8(%ebp),%ebx
register Semaphore_Control *the_semaphore;
Objects_Locations location;
CORE_mutex_Status mutex_status;
CORE_semaphore_Status semaphore_status;
the_semaphore = _Semaphore_Get( id, &location );
10b7b6: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Semaphore_Control *)
_Objects_Get( &_Semaphore_Information, id, location );
10b7b9: 50 push %eax
10b7ba: 53 push %ebx
10b7bb: 68 80 7d 12 00 push $0x127d80
10b7c0: e8 7b 16 00 00 call 10ce40 <_Objects_Get>
switch ( location ) {
10b7c5: 83 c4 10 add $0x10,%esp
10b7c8: 8b 55 f4 mov -0xc(%ebp),%edx
10b7cb: 85 d2 test %edx,%edx
10b7cd: 74 0d je 10b7dc <rtems_semaphore_release+0x30>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b7cf: b8 04 00 00 00 mov $0x4,%eax
}
10b7d4: 8b 5d fc mov -0x4(%ebp),%ebx
10b7d7: c9 leave
10b7d8: c3 ret
10b7d9: 8d 76 00 lea 0x0(%esi),%esi
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
10b7dc: f6 40 10 30 testb $0x30,0x10(%eax)
10b7e0: 75 26 jne 10b808 <rtems_semaphore_release+0x5c>
MUTEX_MP_SUPPORT
);
_Thread_Enable_dispatch();
return _Semaphore_Translate_core_mutex_return_code( mutex_status );
} else {
semaphore_status = _CORE_semaphore_Surrender(
10b7e2: 52 push %edx
10b7e3: 6a 00 push $0x0
10b7e5: 53 push %ebx
10b7e6: 83 c0 14 add $0x14,%eax
10b7e9: 50 push %eax
10b7ea: e8 61 0c 00 00 call 10c450 <_CORE_semaphore_Surrender>
10b7ef: 89 c3 mov %eax,%ebx
&the_semaphore->Core_control.semaphore,
id,
MUTEX_MP_SUPPORT
);
_Thread_Enable_dispatch();
10b7f1: e8 fe 20 00 00 call 10d8f4 <_Thread_Enable_dispatch>
return
10b7f6: 89 1c 24 mov %ebx,(%esp)
10b7f9: e8 3e 00 00 00 call 10b83c <_Semaphore_Translate_core_semaphore_return_code>
10b7fe: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10b801: 8b 5d fc mov -0x4(%ebp),%ebx
10b804: c9 leave
10b805: c3 ret
10b806: 66 90 xchg %ax,%ax
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
mutex_status = _CORE_mutex_Surrender(
10b808: 51 push %ecx
10b809: 6a 00 push $0x0
10b80b: 53 push %ebx
10b80c: 83 c0 14 add $0x14,%eax
10b80f: 50 push %eax
10b810: e8 03 0b 00 00 call 10c318 <_CORE_mutex_Surrender>
10b815: 89 c3 mov %eax,%ebx
&the_semaphore->Core_control.mutex,
id,
MUTEX_MP_SUPPORT
);
_Thread_Enable_dispatch();
10b817: e8 d8 20 00 00 call 10d8f4 <_Thread_Enable_dispatch>
return _Semaphore_Translate_core_mutex_return_code( mutex_status );
10b81c: 89 1c 24 mov %ebx,(%esp)
10b81f: e8 08 00 00 00 call 10b82c <_Semaphore_Translate_core_mutex_return_code>
10b824: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10b827: 8b 5d fc mov -0x4(%ebp),%ebx
10b82a: c9 leave
10b82b: c3 ret
00117d60 <rtems_signal_send>:
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
117d60: 55 push %ebp
117d61: 89 e5 mov %esp,%ebp
117d63: 53 push %ebx
117d64: 83 ec 14 sub $0x14,%esp
117d67: 8b 5d 0c mov 0xc(%ebp),%ebx
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
117d6a: 85 db test %ebx,%ebx
117d6c: 75 0a jne 117d78 <rtems_signal_send+0x18>
return RTEMS_INVALID_NUMBER;
117d6e: b8 0a 00 00 00 mov $0xa,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
117d73: 8b 5d fc mov -0x4(%ebp),%ebx
117d76: c9 leave
117d77: c3 ret
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
117d78: 83 ec 08 sub $0x8,%esp
117d7b: 8d 45 f4 lea -0xc(%ebp),%eax
117d7e: 50 push %eax
117d7f: ff 75 08 pushl 0x8(%ebp)
117d82: e8 35 40 00 00 call 11bdbc <_Thread_Get>
switch ( location ) {
117d87: 83 c4 10 add $0x10,%esp
117d8a: 8b 55 f4 mov -0xc(%ebp),%edx
117d8d: 85 d2 test %edx,%edx
117d8f: 74 0b je 117d9c <rtems_signal_send+0x3c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
117d91: b8 04 00 00 00 mov $0x4,%eax
}
117d96: 8b 5d fc mov -0x4(%ebp),%ebx
117d99: c9 leave
117d9a: c3 ret
117d9b: 90 nop
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
117d9c: 8b 90 e8 00 00 00 mov 0xe8(%eax),%edx
asr = &api->Signal;
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
117da2: 8b 4a 0c mov 0xc(%edx),%ecx
117da5: 85 c9 test %ecx,%ecx
117da7: 74 3f je 117de8 <rtems_signal_send+0x88>
if ( asr->is_enabled ) {
117da9: 80 7a 08 00 cmpb $0x0,0x8(%edx)
117dad: 74 25 je 117dd4 <rtems_signal_send+0x74>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
117daf: 9c pushf
117db0: fa cli
117db1: 59 pop %ecx
*signal_set |= signals;
117db2: 09 5a 14 or %ebx,0x14(%edx)
_ISR_Enable( _level );
117db5: 51 push %ecx
117db6: 9d popf
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
117db7: 8b 15 b4 30 14 00 mov 0x1430b4,%edx
117dbd: 85 d2 test %edx,%edx
117dbf: 74 1b je 117ddc <rtems_signal_send+0x7c>
117dc1: 3b 05 b8 30 14 00 cmp 0x1430b8,%eax
117dc7: 75 13 jne 117ddc <rtems_signal_send+0x7c><== NEVER TAKEN
_Thread_Dispatch_necessary = true;
117dc9: c6 05 c4 30 14 00 01 movb $0x1,0x1430c4
117dd0: eb 0a jmp 117ddc <rtems_signal_send+0x7c>
117dd2: 66 90 xchg %ax,%ax
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
117dd4: 9c pushf
117dd5: fa cli
117dd6: 58 pop %eax
*signal_set |= signals;
117dd7: 09 5a 18 or %ebx,0x18(%edx)
_ISR_Enable( _level );
117dda: 50 push %eax
117ddb: 9d popf
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
117ddc: e8 b7 3f 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
117de1: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
117de3: 8b 5d fc mov -0x4(%ebp),%ebx
117de6: c9 leave
117de7: c3 ret
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
117de8: e8 ab 3f 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_NOT_DEFINED;
117ded: b8 0b 00 00 00 mov $0xb,%eax
117df2: e9 7c ff ff ff jmp 117d73 <rtems_signal_send+0x13>
00107ff0 <rtems_stack_checker_begin_extension>:
* rtems_stack_checker_Begin_extension
*/
void rtems_stack_checker_begin_extension(
Thread_Control *the_thread
)
{
107ff0: 55 push %ebp
107ff1: 89 e5 mov %esp,%ebp
107ff3: 57 push %edi
107ff4: 56 push %esi
107ff5: 8b 45 08 mov 0x8(%ebp),%eax
Stack_check_Control *the_pattern;
if ( the_thread->Object.id == 0 ) /* skip system tasks */
107ff8: 8b 48 08 mov 0x8(%eax),%ecx
107ffb: 85 c9 test %ecx,%ecx
107ffd: 74 15 je 108014 <rtems_stack_checker_begin_extension+0x24><== NEVER TAKEN
return;
the_pattern = Stack_check_Get_pattern_area(&the_thread->Start.Initial_stack);
*the_pattern = Stack_check_Pattern;
107fff: 8b b8 bc 00 00 00 mov 0xbc(%eax),%edi
108005: 83 c7 08 add $0x8,%edi
108008: be a0 a9 12 00 mov $0x12a9a0,%esi
10800d: b9 04 00 00 00 mov $0x4,%ecx
108012: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
}
108014: 5e pop %esi
108015: 5f pop %edi
108016: c9 leave
108017: c3 ret
00107fc8 <rtems_stack_checker_create_extension>:
*/
bool rtems_stack_checker_create_extension(
Thread_Control *running __attribute__((unused)),
Thread_Control *the_thread
)
{
107fc8: 55 push %ebp
107fc9: 89 e5 mov %esp,%ebp
107fcb: 57 push %edi
107fcc: 8b 7d 0c mov 0xc(%ebp),%edi
Stack_check_Initialize();
107fcf: e8 88 ff ff ff call 107f5c <Stack_check_Initialize>
if (the_thread)
107fd4: 85 ff test %edi,%edi
107fd6: 74 12 je 107fea <rtems_stack_checker_create_extension+0x22><== NEVER TAKEN
Stack_check_Dope_stack(&the_thread->Start.Initial_stack);
107fd8: 8b 8f b8 00 00 00 mov 0xb8(%edi),%ecx
107fde: 8b 97 bc 00 00 00 mov 0xbc(%edi),%edx
107fe4: b0 a5 mov $0xa5,%al
107fe6: 89 d7 mov %edx,%edi
107fe8: f3 aa rep stos %al,%es:(%edi)
return true;
}
107fea: b0 01 mov $0x1,%al
107fec: 5f pop %edi
107fed: c9 leave
107fee: c3 ret
0010812c <rtems_stack_checker_is_blown>:
/*
* Check if blown
*/
bool rtems_stack_checker_is_blown( void )
{
10812c: 55 push %ebp
10812d: 89 e5 mov %esp,%ebp
10812f: 57 push %edi
108130: 56 push %esi
Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack;
108131: a1 98 b1 12 00 mov 0x12b198,%eax
)
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
108136: 8b b0 bc 00 00 00 mov 0xbc(%eax),%esi
10813c: 39 f5 cmp %esi,%ebp
10813e: 72 3c jb 10817c <rtems_stack_checker_is_blown+0x50><== NEVER TAKEN
return false;
}
if ( sp > (the_stack->area + the_stack->size) ) {
108140: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax
108146: 8d 04 06 lea (%esi,%eax,1),%eax
}
/*
* Check if blown
*/
bool rtems_stack_checker_is_blown( void )
108149: 39 c5 cmp %eax,%ebp
10814b: 0f 96 c0 setbe %al
/*
* The stack checker must be initialized before the pattern is there
* to check.
*/
if ( Stack_check_Initialized ) {
10814e: 8b 15 48 a6 12 00 mov 0x12a648,%edx
108154: 85 d2 test %edx,%edx
108156: 74 30 je 108188 <rtems_stack_checker_is_blown+0x5c><== NEVER TAKEN
pattern_ok = (!memcmp(
108158: 83 c6 08 add $0x8,%esi
10815b: bf a0 a9 12 00 mov $0x12a9a0,%edi
108160: b9 10 00 00 00 mov $0x10,%ecx
108165: f3 a6 repz cmpsb %es:(%edi),%ds:(%esi)
108167: 0f 94 c2 sete %dl
/*
* Let's report as much as we can.
*/
if ( !sp_ok || !pattern_ok ) {
10816a: 84 c0 test %al,%al
10816c: 74 1e je 10818c <rtems_stack_checker_is_blown+0x60><== NEVER TAKEN
10816e: 84 d2 test %dl,%dl
108170: 74 1a je 10818c <rtems_stack_checker_is_blown+0x60><== NEVER TAKEN
/*
* The Stack Pointer and the Pattern Area are OK so return false.
*/
return false;
}
108172: 31 c0 xor %eax,%eax
108174: 8d 65 f8 lea -0x8(%ebp),%esp
108177: 5e pop %esi
108178: 5f pop %edi
108179: c9 leave
10817a: c3 ret
10817b: 90 nop
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
return false;
10817c: 31 c0 xor %eax,%eax
/*
* The stack checker must be initialized before the pattern is there
* to check.
*/
if ( Stack_check_Initialized ) {
10817e: 8b 15 48 a6 12 00 mov 0x12a648,%edx <== NOT EXECUTED
108184: 85 d2 test %edx,%edx <== NOT EXECUTED
108186: 75 d0 jne 108158 <rtems_stack_checker_is_blown+0x2c><== NOT EXECUTED
*/
bool rtems_stack_checker_is_blown( void )
{
Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack;
bool sp_ok;
bool pattern_ok = true;
108188: b2 01 mov $0x1,%dl <== NOT EXECUTED
10818a: eb de jmp 10816a <rtems_stack_checker_is_blown+0x3e><== NOT EXECUTED
/*
* Let's report as much as we can.
*/
if ( !sp_ok || !pattern_ok ) {
Stack_check_report_blown_task( _Thread_Executing, pattern_ok );
10818c: 57 push %edi <== NOT EXECUTED
10818d: 57 push %edi <== NOT EXECUTED
10818e: 0f b6 d2 movzbl %dl,%edx <== NOT EXECUTED
108191: 52 push %edx <== NOT EXECUTED
108192: ff 35 98 b1 12 00 pushl 0x12b198 <== NOT EXECUTED
108198: e8 7b fe ff ff call 108018 <Stack_check_report_blown_task><== NOT EXECUTED
00108208 <rtems_stack_checker_report_usage>:
void rtems_stack_checker_report_usage( void )
{
108208: 55 push %ebp <== NOT EXECUTED
108209: 89 e5 mov %esp,%ebp <== NOT EXECUTED
10820b: 83 ec 10 sub $0x10,%esp <== NOT EXECUTED
rtems_stack_checker_report_usage_with_plugin( NULL, printk_plugin );
10820e: 68 1c 9c 10 00 push $0x109c1c <== NOT EXECUTED
108213: 6a 00 push $0x0 <== NOT EXECUTED
108215: e8 86 ff ff ff call 1081a0 <rtems_stack_checker_report_usage_with_plugin><== NOT EXECUTED
10821a: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
10821d: c9 leave <== NOT EXECUTED
10821e: c3 ret <== NOT EXECUTED
001081a0 <rtems_stack_checker_report_usage_with_plugin>:
void rtems_stack_checker_report_usage_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
1081a0: 55 push %ebp <== NOT EXECUTED
1081a1: 89 e5 mov %esp,%ebp <== NOT EXECUTED
1081a3: 56 push %esi <== NOT EXECUTED
1081a4: 53 push %ebx <== NOT EXECUTED
1081a5: 8b 75 08 mov 0x8(%ebp),%esi <== NOT EXECUTED
1081a8: 8b 5d 0c mov 0xc(%ebp),%ebx <== NOT EXECUTED
if ( !print )
1081ab: 85 db test %ebx,%ebx <== NOT EXECUTED
1081ad: 74 50 je 1081ff <rtems_stack_checker_report_usage_with_plugin+0x5f><== NOT EXECUTED
return;
print_context = context;
1081af: 89 35 40 a6 12 00 mov %esi,0x12a640 <== NOT EXECUTED
print_handler = print;
1081b5: 89 1d 44 a6 12 00 mov %ebx,0x12a644 <== NOT EXECUTED
(*print)( context, "Stack usage by thread\n");
1081bb: 83 ec 08 sub $0x8,%esp <== NOT EXECUTED
1081be: 68 c8 3e 12 00 push $0x123ec8 <== NOT EXECUTED
1081c3: 56 push %esi <== NOT EXECUTED
1081c4: ff d3 call *%ebx <== NOT EXECUTED
(*print)( context,
1081c6: 59 pop %ecx <== NOT EXECUTED
1081c7: 58 pop %eax <== NOT EXECUTED
1081c8: 68 4c 3f 12 00 push $0x123f4c <== NOT EXECUTED
1081cd: 56 push %esi <== NOT EXECUTED
1081ce: ff d3 call *%ebx <== NOT EXECUTED
" ID NAME LOW HIGH CURRENT AVAILABLE USED\n"
);
/* iterate over all threads and dump the usage */
rtems_iterate_over_all_threads( Stack_check_Dump_threads_usage );
1081d0: c7 04 24 f0 7d 10 00 movl $0x107df0,(%esp) <== NOT EXECUTED
1081d7: e8 b0 70 00 00 call 10f28c <rtems_iterate_over_all_threads><== NOT EXECUTED
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
/* dump interrupt stack info if any */
Stack_check_Dump_threads_usage((Thread_Control *) -1);
1081dc: c7 04 24 ff ff ff ff movl $0xffffffff,(%esp) <== NOT EXECUTED
1081e3: e8 08 fc ff ff call 107df0 <Stack_check_Dump_threads_usage><== NOT EXECUTED
#endif
print_context = NULL;
1081e8: c7 05 40 a6 12 00 00 movl $0x0,0x12a640 <== NOT EXECUTED
1081ef: 00 00 00
print_handler = NULL;
1081f2: c7 05 44 a6 12 00 00 movl $0x0,0x12a644 <== NOT EXECUTED
1081f9: 00 00 00
1081fc: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
1081ff: 8d 65 f8 lea -0x8(%ebp),%esp <== NOT EXECUTED
108202: 5b pop %ebx <== NOT EXECUTED
108203: 5e pop %esi <== NOT EXECUTED
108204: c9 leave <== NOT EXECUTED
108205: c3 ret <== NOT EXECUTED
001080d4 <rtems_stack_checker_switch_extension>:
*/
void rtems_stack_checker_switch_extension(
Thread_Control *running __attribute__((unused)),
Thread_Control *heir __attribute__((unused))
)
{
1080d4: 55 push %ebp
1080d5: 89 e5 mov %esp,%ebp
1080d7: 57 push %edi
1080d8: 56 push %esi
1080d9: 8b 45 08 mov 0x8(%ebp),%eax
Stack_Control *the_stack = &running->Start.Initial_stack;
void *pattern;
bool sp_ok;
bool pattern_ok = true;
pattern = Stack_check_Get_pattern_area(the_stack);
1080dc: 8b 90 bc 00 00 00 mov 0xbc(%eax),%edx
1080e2: 8d 72 08 lea 0x8(%edx),%esi
)
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
1080e5: 39 d5 cmp %edx,%ebp
1080e7: 72 0a jb 1080f3 <rtems_stack_checker_switch_extension+0x1f><== NEVER TAKEN
return false;
}
if ( sp > (the_stack->area + the_stack->size) ) {
1080e9: 03 90 b8 00 00 00 add 0xb8(%eax),%edx
1080ef: 39 d5 cmp %edx,%ebp
1080f1: 76 1d jbe 108110 <rtems_stack_checker_switch_extension+0x3c><== ALWAYS TAKEN
/*
* Check for an out of bounds stack pointer or an overwrite
*/
sp_ok = Stack_check_Frame_pointer_in_range( the_stack );
pattern_ok = (!memcmp( pattern,
1080f3: bf a0 a9 12 00 mov $0x12a9a0,%edi <== NOT EXECUTED
1080f8: b9 10 00 00 00 mov $0x10,%ecx <== NOT EXECUTED
1080fd: f3 a6 repz cmpsb %es:(%edi),%ds:(%esi) <== NOT EXECUTED
1080ff: 0f 94 c2 sete %dl <== NOT EXECUTED
(void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES));
if ( !sp_ok || !pattern_ok ) {
Stack_check_report_blown_task( running, pattern_ok );
108102: 56 push %esi <== NOT EXECUTED
108103: 56 push %esi <== NOT EXECUTED
108104: 0f b6 d2 movzbl %dl,%edx <== NOT EXECUTED
108107: 52 push %edx <== NOT EXECUTED
108108: 50 push %eax <== NOT EXECUTED
108109: e8 0a ff ff ff call 108018 <Stack_check_report_blown_task><== NOT EXECUTED
10810e: 66 90 xchg %ax,%ax <== NOT EXECUTED
/*
* Check for an out of bounds stack pointer or an overwrite
*/
sp_ok = Stack_check_Frame_pointer_in_range( the_stack );
pattern_ok = (!memcmp( pattern,
108110: bf a0 a9 12 00 mov $0x12a9a0,%edi
108115: b9 10 00 00 00 mov $0x10,%ecx
(void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES));
if ( !sp_ok || !pattern_ok ) {
10811a: f3 a6 repz cmpsb %es:(%edi),%ds:(%esi)
10811c: 75 07 jne 108125 <rtems_stack_checker_switch_extension+0x51><== NEVER TAKEN
Stack_check_report_blown_task( running, pattern_ok );
}
}
10811e: 8d 65 f8 lea -0x8(%ebp),%esp
108121: 5e pop %esi
108122: 5f pop %edi
108123: c9 leave
108124: c3 ret
sp_ok = Stack_check_Frame_pointer_in_range( the_stack );
pattern_ok = (!memcmp( pattern,
(void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES));
if ( !sp_ok || !pattern_ok ) {
108125: 31 d2 xor %edx,%edx <== NOT EXECUTED
108127: eb d9 jmp 108102 <rtems_stack_checker_switch_extension+0x2e><== NOT EXECUTED
00110b40 <rtems_string_to_double>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
110b40: 55 push %ebp
110b41: 89 e5 mov %esp,%ebp
110b43: 57 push %edi
110b44: 56 push %esi
110b45: 53 push %ebx
110b46: 83 ec 2c sub $0x2c,%esp
110b49: 8b 75 08 mov 0x8(%ebp),%esi
110b4c: 8b 5d 0c mov 0xc(%ebp),%ebx
110b4f: 8b 7d 10 mov 0x10(%ebp),%edi
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
110b52: 85 db test %ebx,%ebx
110b54: 74 72 je 110bc8 <rtems_string_to_double+0x88>
return RTEMS_INVALID_ADDRESS;
errno = 0;
110b56: e8 f9 2e 00 00 call 113a54 <__errno>
110b5b: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
110b61: c7 03 00 00 00 00 movl $0x0,(%ebx)
110b67: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx)
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
110b6e: 83 ec 08 sub $0x8,%esp
110b71: 8d 45 e4 lea -0x1c(%ebp),%eax
110b74: 50 push %eax
110b75: 56 push %esi
110b76: e8 dd 58 00 00 call 116458 <strtod>
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110b7b: 83 c4 10 add $0x10,%esp
110b7e: 85 ff test %edi,%edi
110b80: 74 56 je 110bd8 <rtems_string_to_double+0x98>
*endptr = end;
110b82: 8b 45 e4 mov -0x1c(%ebp),%eax
110b85: 89 07 mov %eax,(%edi)
/* nothing was converted */
if ( end == s )
110b87: 39 c6 cmp %eax,%esi
110b89: 74 55 je 110be0 <rtems_string_to_double+0xa0>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
110b8b: dd 05 70 61 12 00 fldl 0x126170
110b91: d9 c9 fxch %st(1)
110b93: dd e1 fucom %st(1)
110b95: df e0 fnstsw %ax
110b97: dd d9 fstp %st(1)
110b99: f6 c4 45 test $0x45,%ah
110b9c: 74 0e je 110bac <rtems_string_to_double+0x6c>
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
110b9e: dd 1b fstpl (%ebx)
#endif
return RTEMS_SUCCESSFUL;
110ba0: 31 c0 xor %eax,%eax
}
110ba2: 8d 65 f4 lea -0xc(%ebp),%esp
110ba5: 5b pop %ebx
110ba6: 5e pop %esi
110ba7: 5f pop %edi
110ba8: c9 leave
110ba9: c3 ret
110baa: 66 90 xchg %ax,%ax
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
110bac: dd 5d c8 fstpl -0x38(%ebp)
110baf: e8 a0 2e 00 00 call 113a54 <__errno>
110bb4: 83 38 22 cmpl $0x22,(%eax)
110bb7: dd 45 c8 fldl -0x38(%ebp)
110bba: 75 e2 jne 110b9e <rtems_string_to_double+0x5e><== NEVER TAKEN
110bbc: dd d8 fstp %st(0)
return RTEMS_INVALID_NUMBER;
110bbe: b8 0a 00 00 00 mov $0xa,%eax
110bc3: eb dd jmp 110ba2 <rtems_string_to_double+0x62>
110bc5: 8d 76 00 lea 0x0(%esi),%esi
{
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
110bc8: b8 09 00 00 00 mov $0x9,%eax
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
#endif
return RTEMS_SUCCESSFUL;
}
110bcd: 8d 65 f4 lea -0xc(%ebp),%esp
110bd0: 5b pop %ebx
110bd1: 5e pop %esi
110bd2: 5f pop %edi
110bd3: c9 leave
110bd4: c3 ret
110bd5: 8d 76 00 lea 0x0(%esi),%esi
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110bd8: 8b 45 e4 mov -0x1c(%ebp),%eax
110bdb: eb aa jmp 110b87 <rtems_string_to_double+0x47>
110bdd: 8d 76 00 lea 0x0(%esi),%esi
110be0: dd d8 fstp %st(0)
*endptr = end;
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
110be2: b8 0b 00 00 00 mov $0xb,%eax
110be7: eb b9 jmp 110ba2 <rtems_string_to_double+0x62>
00110bec <rtems_string_to_float>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
110bec: 55 push %ebp
110bed: 89 e5 mov %esp,%ebp
110bef: 57 push %edi
110bf0: 56 push %esi
110bf1: 53 push %ebx
110bf2: 83 ec 2c sub $0x2c,%esp
110bf5: 8b 75 08 mov 0x8(%ebp),%esi
110bf8: 8b 5d 0c mov 0xc(%ebp),%ebx
110bfb: 8b 7d 10 mov 0x10(%ebp),%edi
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
110bfe: 85 db test %ebx,%ebx
110c00: 74 6a je 110c6c <rtems_string_to_float+0x80>
return RTEMS_INVALID_ADDRESS;
errno = 0;
110c02: e8 4d 2e 00 00 call 113a54 <__errno>
110c07: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
110c0d: c7 03 00 00 00 00 movl $0x0,(%ebx)
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
110c13: 83 ec 08 sub $0x8,%esp
110c16: 8d 45 e4 lea -0x1c(%ebp),%eax
110c19: 50 push %eax
110c1a: 56 push %esi
110c1b: e8 54 58 00 00 call 116474 <strtof>
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110c20: 83 c4 10 add $0x10,%esp
110c23: 85 ff test %edi,%edi
110c25: 74 55 je 110c7c <rtems_string_to_float+0x90>
*endptr = end;
110c27: 8b 45 e4 mov -0x1c(%ebp),%eax
110c2a: 89 07 mov %eax,(%edi)
/* nothing was converted */
if ( end == s )
110c2c: 39 c6 cmp %eax,%esi
110c2e: 74 54 je 110c84 <rtems_string_to_float+0x98>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
110c30: d9 05 78 61 12 00 flds 0x126178
110c36: d9 c9 fxch %st(1)
110c38: dd e1 fucom %st(1)
110c3a: df e0 fnstsw %ax
110c3c: dd d9 fstp %st(1)
110c3e: f6 c4 45 test $0x45,%ah
110c41: 74 0d je 110c50 <rtems_string_to_float+0x64>
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
110c43: d9 1b fstps (%ebx)
#endif
return RTEMS_SUCCESSFUL;
110c45: 31 c0 xor %eax,%eax
}
110c47: 8d 65 f4 lea -0xc(%ebp),%esp
110c4a: 5b pop %ebx
110c4b: 5e pop %esi
110c4c: 5f pop %edi
110c4d: c9 leave
110c4e: c3 ret
110c4f: 90 nop
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
110c50: d9 5d c8 fstps -0x38(%ebp)
110c53: e8 fc 2d 00 00 call 113a54 <__errno>
110c58: 83 38 22 cmpl $0x22,(%eax)
110c5b: d9 45 c8 flds -0x38(%ebp)
110c5e: 75 e3 jne 110c43 <rtems_string_to_float+0x57><== NEVER TAKEN
110c60: dd d8 fstp %st(0)
return RTEMS_INVALID_NUMBER;
110c62: b8 0a 00 00 00 mov $0xa,%eax
110c67: eb de jmp 110c47 <rtems_string_to_float+0x5b>
110c69: 8d 76 00 lea 0x0(%esi),%esi
{
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
110c6c: b8 09 00 00 00 mov $0x9,%eax
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
#endif
return RTEMS_SUCCESSFUL;
}
110c71: 8d 65 f4 lea -0xc(%ebp),%esp
110c74: 5b pop %ebx
110c75: 5e pop %esi
110c76: 5f pop %edi
110c77: c9 leave
110c78: c3 ret
110c79: 8d 76 00 lea 0x0(%esi),%esi
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110c7c: 8b 45 e4 mov -0x1c(%ebp),%eax
110c7f: eb ab jmp 110c2c <rtems_string_to_float+0x40>
110c81: 8d 76 00 lea 0x0(%esi),%esi
110c84: dd d8 fstp %st(0)
*endptr = end;
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
110c86: b8 0b 00 00 00 mov $0xb,%eax
110c8b: eb ba jmp 110c47 <rtems_string_to_float+0x5b>
00110c90 <rtems_string_to_int>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
110c90: 55 push %ebp
110c91: 89 e5 mov %esp,%ebp
110c93: 57 push %edi
110c94: 56 push %esi
110c95: 53 push %ebx
110c96: 83 ec 2c sub $0x2c,%esp
110c99: 8b 75 08 mov 0x8(%ebp),%esi
110c9c: 8b 5d 0c mov 0xc(%ebp),%ebx
110c9f: 8b 7d 10 mov 0x10(%ebp),%edi
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
110ca2: 85 db test %ebx,%ebx
110ca4: 74 5e je 110d04 <rtems_string_to_int+0x74>
return RTEMS_INVALID_ADDRESS;
errno = 0;
110ca6: e8 a9 2d 00 00 call 113a54 <__errno>
110cab: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
110cb1: c7 03 00 00 00 00 movl $0x0,(%ebx)
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
110cb7: 50 push %eax
110cb8: ff 75 14 pushl 0x14(%ebp)
110cbb: 8d 45 e4 lea -0x1c(%ebp),%eax
110cbe: 50 push %eax
110cbf: 56 push %esi
110cc0: e8 6f 59 00 00 call 116634 <strtol>
110cc5: 89 c2 mov %eax,%edx
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110cc7: 83 c4 10 add $0x10,%esp
110cca: 85 ff test %edi,%edi
110ccc: 74 46 je 110d14 <rtems_string_to_int+0x84>
*endptr = end;
110cce: 8b 45 e4 mov -0x1c(%ebp),%eax
110cd1: 89 07 mov %eax,(%edi)
/* nothing was converted */
if ( end == s )
110cd3: 39 c6 cmp %eax,%esi
110cd5: 74 45 je 110d1c <rtems_string_to_int+0x8c>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
110cd7: 81 fa ff ff ff 7f cmp $0x7fffffff,%edx
110cdd: 74 0d je 110cec <rtems_string_to_int+0x5c>
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
110cdf: 89 13 mov %edx,(%ebx)
#endif
return RTEMS_SUCCESSFUL;
110ce1: 31 c0 xor %eax,%eax
}
110ce3: 8d 65 f4 lea -0xc(%ebp),%esp
110ce6: 5b pop %ebx
110ce7: 5e pop %esi
110ce8: 5f pop %edi
110ce9: c9 leave
110cea: c3 ret
110ceb: 90 nop
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
110cec: 89 55 d4 mov %edx,-0x2c(%ebp)
110cef: e8 60 2d 00 00 call 113a54 <__errno>
110cf4: 83 38 22 cmpl $0x22,(%eax)
110cf7: 8b 55 d4 mov -0x2c(%ebp),%edx
110cfa: 75 e3 jne 110cdf <rtems_string_to_int+0x4f>
return RTEMS_INVALID_NUMBER;
110cfc: b8 0a 00 00 00 mov $0xa,%eax
110d01: eb e0 jmp 110ce3 <rtems_string_to_int+0x53>
110d03: 90 nop
{
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
110d04: b8 09 00 00 00 mov $0x9,%eax
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
#endif
return RTEMS_SUCCESSFUL;
}
110d09: 8d 65 f4 lea -0xc(%ebp),%esp
110d0c: 5b pop %ebx
110d0d: 5e pop %esi
110d0e: 5f pop %edi
110d0f: c9 leave
110d10: c3 ret
110d11: 8d 76 00 lea 0x0(%esi),%esi
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110d14: 8b 45 e4 mov -0x1c(%ebp),%eax
110d17: eb ba jmp 110cd3 <rtems_string_to_int+0x43>
110d19: 8d 76 00 lea 0x0(%esi),%esi
*endptr = end;
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
110d1c: b8 0b 00 00 00 mov $0xb,%eax
110d21: eb c0 jmp 110ce3 <rtems_string_to_int+0x53>
00110dd4 <rtems_string_to_long>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
110dd4: 55 push %ebp
110dd5: 89 e5 mov %esp,%ebp
110dd7: 57 push %edi
110dd8: 56 push %esi
110dd9: 53 push %ebx
110dda: 83 ec 1c sub $0x1c,%esp
110ddd: 8b 7d 08 mov 0x8(%ebp),%edi
110de0: 8b 5d 0c mov 0xc(%ebp),%ebx
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
110de3: 85 db test %ebx,%ebx
110de5: 74 69 je 110e50 <rtems_string_to_long+0x7c>
return RTEMS_INVALID_ADDRESS;
errno = 0;
110de7: e8 68 2c 00 00 call 113a54 <__errno>
110dec: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
110df2: c7 03 00 00 00 00 movl $0x0,(%ebx)
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
110df8: 52 push %edx
110df9: ff 75 14 pushl 0x14(%ebp)
110dfc: 8d 45 e4 lea -0x1c(%ebp),%eax
110dff: 50 push %eax
110e00: 57 push %edi
110e01: e8 2e 58 00 00 call 116634 <strtol>
110e06: 89 c6 mov %eax,%esi
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110e08: 83 c4 10 add $0x10,%esp
110e0b: 8b 45 10 mov 0x10(%ebp),%eax
110e0e: 85 c0 test %eax,%eax
110e10: 74 4e je 110e60 <rtems_string_to_long+0x8c>
*endptr = end;
110e12: 8b 45 e4 mov -0x1c(%ebp),%eax
110e15: 8b 55 10 mov 0x10(%ebp),%edx
110e18: 89 02 mov %eax,(%edx)
/* nothing was converted */
if ( end == s )
110e1a: 39 c7 cmp %eax,%edi
110e1c: 74 4a je 110e68 <rtems_string_to_long+0x94>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
110e1e: 81 fe ff ff ff 7f cmp $0x7fffffff,%esi
110e24: 74 16 je 110e3c <rtems_string_to_long+0x68>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MIN
/* there was an underflow */
if ( (result == STRING_TO_MIN) && (errno == ERANGE))
110e26: 81 fe 00 00 00 80 cmp $0x80000000,%esi
110e2c: 74 0e je 110e3c <rtems_string_to_long+0x68>
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
110e2e: 89 33 mov %esi,(%ebx)
#endif
return RTEMS_SUCCESSFUL;
110e30: 31 c0 xor %eax,%eax
}
110e32: 8d 65 f4 lea -0xc(%ebp),%esp
110e35: 5b pop %ebx
110e36: 5e pop %esi
110e37: 5f pop %edi
110e38: c9 leave
110e39: c3 ret
110e3a: 66 90 xchg %ax,%ax
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MIN
/* there was an underflow */
if ( (result == STRING_TO_MIN) && (errno == ERANGE))
110e3c: e8 13 2c 00 00 call 113a54 <__errno>
110e41: 83 38 22 cmpl $0x22,(%eax)
110e44: 75 e8 jne 110e2e <rtems_string_to_long+0x5a>
return RTEMS_INVALID_NUMBER;
110e46: b8 0a 00 00 00 mov $0xa,%eax
110e4b: eb e5 jmp 110e32 <rtems_string_to_long+0x5e>
110e4d: 8d 76 00 lea 0x0(%esi),%esi
{
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
110e50: b8 09 00 00 00 mov $0x9,%eax
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
#endif
return RTEMS_SUCCESSFUL;
}
110e55: 8d 65 f4 lea -0xc(%ebp),%esp
110e58: 5b pop %ebx
110e59: 5e pop %esi
110e5a: 5f pop %edi
110e5b: c9 leave
110e5c: c3 ret
110e5d: 8d 76 00 lea 0x0(%esi),%esi
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110e60: 8b 45 e4 mov -0x1c(%ebp),%eax
110e63: eb b5 jmp 110e1a <rtems_string_to_long+0x46>
110e65: 8d 76 00 lea 0x0(%esi),%esi
*endptr = end;
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
110e68: b8 0b 00 00 00 mov $0xb,%eax
110e6d: eb c3 jmp 110e32 <rtems_string_to_long+0x5e>
00110d24 <rtems_string_to_long_long>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
110d24: 55 push %ebp
110d25: 89 e5 mov %esp,%ebp
110d27: 57 push %edi
110d28: 56 push %esi
110d29: 53 push %ebx
110d2a: 83 ec 2c sub $0x2c,%esp
110d2d: 8b 5d 0c mov 0xc(%ebp),%ebx
110d30: 8b 7d 10 mov 0x10(%ebp),%edi
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
110d33: 85 db test %ebx,%ebx
110d35: 74 7d je 110db4 <rtems_string_to_long_long+0x90>
return RTEMS_INVALID_ADDRESS;
errno = 0;
110d37: e8 18 2d 00 00 call 113a54 <__errno>
110d3c: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
110d42: c7 03 00 00 00 00 movl $0x0,(%ebx)
110d48: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx)
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
110d4f: 50 push %eax
110d50: ff 75 14 pushl 0x14(%ebp)
110d53: 8d 45 e4 lea -0x1c(%ebp),%eax
110d56: 50 push %eax
110d57: ff 75 08 pushl 0x8(%ebp)
110d5a: e8 f1 58 00 00 call 116650 <strtoll>
110d5f: 89 c6 mov %eax,%esi
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110d61: 83 c4 10 add $0x10,%esp
110d64: 85 ff test %edi,%edi
110d66: 74 5c je 110dc4 <rtems_string_to_long_long+0xa0>
*endptr = end;
110d68: 8b 45 e4 mov -0x1c(%ebp),%eax
110d6b: 89 07 mov %eax,(%edi)
/* nothing was converted */
if ( end == s )
110d6d: 39 45 08 cmp %eax,0x8(%ebp)
110d70: 74 5a je 110dcc <rtems_string_to_long_long+0xa8>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
110d72: 89 d1 mov %edx,%ecx
110d74: 81 f1 ff ff ff 7f xor $0x7fffffff,%ecx
110d7a: 89 f0 mov %esi,%eax
110d7c: f7 d0 not %eax
110d7e: 09 c1 or %eax,%ecx
110d80: 74 1a je 110d9c <rtems_string_to_long_long+0x78>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MIN
/* there was an underflow */
if ( (result == STRING_TO_MIN) && (errno == ERANGE))
110d82: 8d 82 00 00 00 80 lea -0x80000000(%edx),%eax
110d88: 09 f0 or %esi,%eax
110d8a: 74 10 je 110d9c <rtems_string_to_long_long+0x78>
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
110d8c: 89 33 mov %esi,(%ebx)
110d8e: 89 53 04 mov %edx,0x4(%ebx)
#endif
return RTEMS_SUCCESSFUL;
110d91: 31 c0 xor %eax,%eax
}
110d93: 8d 65 f4 lea -0xc(%ebp),%esp
110d96: 5b pop %ebx
110d97: 5e pop %esi
110d98: 5f pop %edi
110d99: c9 leave
110d9a: c3 ret
110d9b: 90 nop
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MIN
/* there was an underflow */
if ( (result == STRING_TO_MIN) && (errno == ERANGE))
110d9c: 89 55 d4 mov %edx,-0x2c(%ebp)
110d9f: e8 b0 2c 00 00 call 113a54 <__errno>
110da4: 83 38 22 cmpl $0x22,(%eax)
110da7: 8b 55 d4 mov -0x2c(%ebp),%edx
110daa: 75 e0 jne 110d8c <rtems_string_to_long_long+0x68>
return RTEMS_INVALID_NUMBER;
110dac: b8 0a 00 00 00 mov $0xa,%eax
110db1: eb e0 jmp 110d93 <rtems_string_to_long_long+0x6f>
110db3: 90 nop
{
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
110db4: b8 09 00 00 00 mov $0x9,%eax
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
#endif
return RTEMS_SUCCESSFUL;
}
110db9: 8d 65 f4 lea -0xc(%ebp),%esp
110dbc: 5b pop %ebx
110dbd: 5e pop %esi
110dbe: 5f pop %edi
110dbf: c9 leave
110dc0: c3 ret
110dc1: 8d 76 00 lea 0x0(%esi),%esi
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110dc4: 8b 45 e4 mov -0x1c(%ebp),%eax
110dc7: eb a4 jmp 110d6d <rtems_string_to_long_long+0x49>
110dc9: 8d 76 00 lea 0x0(%esi),%esi
*endptr = end;
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
110dcc: b8 0b 00 00 00 mov $0xb,%eax
110dd1: eb c0 jmp 110d93 <rtems_string_to_long_long+0x6f>
00110e70 <rtems_string_to_pointer>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
110e70: 55 push %ebp
110e71: 89 e5 mov %esp,%ebp
110e73: 57 push %edi
110e74: 56 push %esi
110e75: 53 push %ebx
110e76: 83 ec 2c sub $0x2c,%esp
110e79: 8b 75 08 mov 0x8(%ebp),%esi
110e7c: 8b 5d 0c mov 0xc(%ebp),%ebx
110e7f: 8b 7d 10 mov 0x10(%ebp),%edi
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
110e82: 85 db test %ebx,%ebx
110e84: 74 5a je 110ee0 <rtems_string_to_pointer+0x70>
return RTEMS_INVALID_ADDRESS;
errno = 0;
110e86: e8 c9 2b 00 00 call 113a54 <__errno>
110e8b: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
110e91: c7 03 00 00 00 00 movl $0x0,(%ebx)
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
110e97: 50 push %eax
110e98: 6a 10 push $0x10
110e9a: 8d 45 e4 lea -0x1c(%ebp),%eax
110e9d: 50 push %eax
110e9e: 56 push %esi
110e9f: e8 4c 5c 00 00 call 116af0 <strtoul>
110ea4: 89 c2 mov %eax,%edx
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110ea6: 83 c4 10 add $0x10,%esp
110ea9: 85 ff test %edi,%edi
110eab: 74 43 je 110ef0 <rtems_string_to_pointer+0x80>
*endptr = end;
110ead: 8b 45 e4 mov -0x1c(%ebp),%eax
110eb0: 89 07 mov %eax,(%edi)
/* nothing was converted */
if ( end == s )
110eb2: 39 c6 cmp %eax,%esi
110eb4: 74 42 je 110ef8 <rtems_string_to_pointer+0x88>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
110eb6: 83 fa ff cmp $0xffffffff,%edx
110eb9: 74 0d je 110ec8 <rtems_string_to_pointer+0x58><== NEVER TAKEN
if ( (result == STRING_TO_MIN) && (errno == ERANGE))
return RTEMS_INVALID_NUMBER;
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
110ebb: 89 13 mov %edx,(%ebx)
#else
*n = (STRING_TO_TYPE) result;
#endif
return RTEMS_SUCCESSFUL;
110ebd: 31 c0 xor %eax,%eax
}
110ebf: 8d 65 f4 lea -0xc(%ebp),%esp
110ec2: 5b pop %ebx
110ec3: 5e pop %esi
110ec4: 5f pop %edi
110ec5: c9 leave
110ec6: c3 ret
110ec7: 90 nop
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
110ec8: 89 55 d4 mov %edx,-0x2c(%ebp) <== NOT EXECUTED
110ecb: e8 84 2b 00 00 call 113a54 <__errno> <== NOT EXECUTED
110ed0: 83 38 22 cmpl $0x22,(%eax) <== NOT EXECUTED
110ed3: 8b 55 d4 mov -0x2c(%ebp),%edx <== NOT EXECUTED
110ed6: 75 e3 jne 110ebb <rtems_string_to_pointer+0x4b><== NOT EXECUTED
return RTEMS_INVALID_NUMBER;
110ed8: b8 0a 00 00 00 mov $0xa,%eax <== NOT EXECUTED
110edd: eb e0 jmp 110ebf <rtems_string_to_pointer+0x4f><== NOT EXECUTED
110edf: 90 nop <== NOT EXECUTED
{
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
110ee0: b8 09 00 00 00 mov $0x9,%eax
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
#endif
return RTEMS_SUCCESSFUL;
}
110ee5: 8d 65 f4 lea -0xc(%ebp),%esp
110ee8: 5b pop %ebx
110ee9: 5e pop %esi
110eea: 5f pop %edi
110eeb: c9 leave
110eec: c3 ret
110eed: 8d 76 00 lea 0x0(%esi),%esi
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110ef0: 8b 45 e4 mov -0x1c(%ebp),%eax
110ef3: eb bd jmp 110eb2 <rtems_string_to_pointer+0x42>
110ef5: 8d 76 00 lea 0x0(%esi),%esi
*endptr = end;
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
110ef8: b8 0b 00 00 00 mov $0xb,%eax
110efd: eb c0 jmp 110ebf <rtems_string_to_pointer+0x4f>
00110f00 <rtems_string_to_unsigned_char>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
110f00: 55 push %ebp
110f01: 89 e5 mov %esp,%ebp
110f03: 57 push %edi
110f04: 56 push %esi
110f05: 53 push %ebx
110f06: 83 ec 1c sub $0x1c,%esp
110f09: 8b 75 08 mov 0x8(%ebp),%esi
110f0c: 8b 5d 0c mov 0xc(%ebp),%ebx
110f0f: 8b 7d 10 mov 0x10(%ebp),%edi
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
110f12: 85 db test %ebx,%ebx
110f14: 74 3a je 110f50 <rtems_string_to_unsigned_char+0x50>
return RTEMS_INVALID_ADDRESS;
errno = 0;
110f16: e8 39 2b 00 00 call 113a54 <__errno>
110f1b: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
110f21: c6 03 00 movb $0x0,(%ebx)
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
110f24: 50 push %eax
110f25: ff 75 14 pushl 0x14(%ebp)
110f28: 8d 45 e4 lea -0x1c(%ebp),%eax
110f2b: 50 push %eax
110f2c: 56 push %esi
110f2d: e8 be 5b 00 00 call 116af0 <strtoul>
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110f32: 83 c4 10 add $0x10,%esp
110f35: 85 ff test %edi,%edi
110f37: 74 27 je 110f60 <rtems_string_to_unsigned_char+0x60>
*endptr = end;
110f39: 8b 55 e4 mov -0x1c(%ebp),%edx
110f3c: 89 17 mov %edx,(%edi)
/* nothing was converted */
if ( end == s )
110f3e: 39 d6 cmp %edx,%esi
110f40: 74 26 je 110f68 <rtems_string_to_unsigned_char+0x68>
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
110f42: 88 03 mov %al,(%ebx)
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
#endif
return RTEMS_SUCCESSFUL;
110f44: 31 c0 xor %eax,%eax
}
110f46: 8d 65 f4 lea -0xc(%ebp),%esp
110f49: 5b pop %ebx
110f4a: 5e pop %esi
110f4b: 5f pop %edi
110f4c: c9 leave
110f4d: c3 ret
110f4e: 66 90 xchg %ax,%ax
{
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
110f50: b8 09 00 00 00 mov $0x9,%eax
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
#endif
return RTEMS_SUCCESSFUL;
}
110f55: 8d 65 f4 lea -0xc(%ebp),%esp
110f58: 5b pop %ebx
110f59: 5e pop %esi
110f5a: 5f pop %edi
110f5b: c9 leave
110f5c: c3 ret
110f5d: 8d 76 00 lea 0x0(%esi),%esi
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110f60: 8b 55 e4 mov -0x1c(%ebp),%edx
110f63: eb d9 jmp 110f3e <rtems_string_to_unsigned_char+0x3e>
110f65: 8d 76 00 lea 0x0(%esi),%esi
*endptr = end;
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
110f68: b8 0b 00 00 00 mov $0xb,%eax
110f6d: eb d7 jmp 110f46 <rtems_string_to_unsigned_char+0x46>
00110f70 <rtems_string_to_unsigned_int>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
110f70: 55 push %ebp
110f71: 89 e5 mov %esp,%ebp
110f73: 57 push %edi
110f74: 56 push %esi
110f75: 53 push %ebx
110f76: 83 ec 2c sub $0x2c,%esp
110f79: 8b 75 08 mov 0x8(%ebp),%esi
110f7c: 8b 5d 0c mov 0xc(%ebp),%ebx
110f7f: 8b 7d 10 mov 0x10(%ebp),%edi
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
110f82: 85 db test %ebx,%ebx
110f84: 74 5a je 110fe0 <rtems_string_to_unsigned_int+0x70>
return RTEMS_INVALID_ADDRESS;
errno = 0;
110f86: e8 c9 2a 00 00 call 113a54 <__errno>
110f8b: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
110f91: c7 03 00 00 00 00 movl $0x0,(%ebx)
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
110f97: 50 push %eax
110f98: ff 75 14 pushl 0x14(%ebp)
110f9b: 8d 45 e4 lea -0x1c(%ebp),%eax
110f9e: 50 push %eax
110f9f: 56 push %esi
110fa0: e8 4b 5b 00 00 call 116af0 <strtoul>
110fa5: 89 c2 mov %eax,%edx
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110fa7: 83 c4 10 add $0x10,%esp
110faa: 85 ff test %edi,%edi
110fac: 74 42 je 110ff0 <rtems_string_to_unsigned_int+0x80>
*endptr = end;
110fae: 8b 45 e4 mov -0x1c(%ebp),%eax
110fb1: 89 07 mov %eax,(%edi)
/* nothing was converted */
if ( end == s )
110fb3: 39 c6 cmp %eax,%esi
110fb5: 74 41 je 110ff8 <rtems_string_to_unsigned_int+0x88>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
110fb7: 83 fa ff cmp $0xffffffff,%edx
110fba: 74 0c je 110fc8 <rtems_string_to_unsigned_int+0x58>
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
110fbc: 89 13 mov %edx,(%ebx)
#endif
return RTEMS_SUCCESSFUL;
110fbe: 31 c0 xor %eax,%eax
}
110fc0: 8d 65 f4 lea -0xc(%ebp),%esp
110fc3: 5b pop %ebx
110fc4: 5e pop %esi
110fc5: 5f pop %edi
110fc6: c9 leave
110fc7: c3 ret
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
110fc8: 89 55 d4 mov %edx,-0x2c(%ebp)
110fcb: e8 84 2a 00 00 call 113a54 <__errno>
110fd0: 83 38 22 cmpl $0x22,(%eax)
110fd3: 8b 55 d4 mov -0x2c(%ebp),%edx
110fd6: 75 e4 jne 110fbc <rtems_string_to_unsigned_int+0x4c><== NEVER TAKEN
return RTEMS_INVALID_NUMBER;
110fd8: b8 0a 00 00 00 mov $0xa,%eax
110fdd: eb e1 jmp 110fc0 <rtems_string_to_unsigned_int+0x50>
110fdf: 90 nop
{
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
110fe0: b8 09 00 00 00 mov $0x9,%eax
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
#endif
return RTEMS_SUCCESSFUL;
}
110fe5: 8d 65 f4 lea -0xc(%ebp),%esp
110fe8: 5b pop %ebx
110fe9: 5e pop %esi
110fea: 5f pop %edi
110feb: c9 leave
110fec: c3 ret
110fed: 8d 76 00 lea 0x0(%esi),%esi
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
110ff0: 8b 45 e4 mov -0x1c(%ebp),%eax
110ff3: eb be jmp 110fb3 <rtems_string_to_unsigned_int+0x43>
110ff5: 8d 76 00 lea 0x0(%esi),%esi
*endptr = end;
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
110ff8: b8 0b 00 00 00 mov $0xb,%eax
110ffd: eb c1 jmp 110fc0 <rtems_string_to_unsigned_int+0x50>
0011109c <rtems_string_to_unsigned_long>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
11109c: 55 push %ebp
11109d: 89 e5 mov %esp,%ebp
11109f: 57 push %edi
1110a0: 56 push %esi
1110a1: 53 push %ebx
1110a2: 83 ec 2c sub $0x2c,%esp
1110a5: 8b 75 08 mov 0x8(%ebp),%esi
1110a8: 8b 5d 0c mov 0xc(%ebp),%ebx
1110ab: 8b 7d 10 mov 0x10(%ebp),%edi
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
1110ae: 85 db test %ebx,%ebx
1110b0: 74 5a je 11110c <rtems_string_to_unsigned_long+0x70>
return RTEMS_INVALID_ADDRESS;
errno = 0;
1110b2: e8 9d 29 00 00 call 113a54 <__errno>
1110b7: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
1110bd: c7 03 00 00 00 00 movl $0x0,(%ebx)
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
1110c3: 50 push %eax
1110c4: ff 75 14 pushl 0x14(%ebp)
1110c7: 8d 45 e4 lea -0x1c(%ebp),%eax
1110ca: 50 push %eax
1110cb: 56 push %esi
1110cc: e8 1f 5a 00 00 call 116af0 <strtoul>
1110d1: 89 c2 mov %eax,%edx
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
1110d3: 83 c4 10 add $0x10,%esp
1110d6: 85 ff test %edi,%edi
1110d8: 74 42 je 11111c <rtems_string_to_unsigned_long+0x80>
*endptr = end;
1110da: 8b 45 e4 mov -0x1c(%ebp),%eax
1110dd: 89 07 mov %eax,(%edi)
/* nothing was converted */
if ( end == s )
1110df: 39 c6 cmp %eax,%esi
1110e1: 74 41 je 111124 <rtems_string_to_unsigned_long+0x88>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
1110e3: 83 fa ff cmp $0xffffffff,%edx
1110e6: 74 0c je 1110f4 <rtems_string_to_unsigned_long+0x58>
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
1110e8: 89 13 mov %edx,(%ebx)
#endif
return RTEMS_SUCCESSFUL;
1110ea: 31 c0 xor %eax,%eax
}
1110ec: 8d 65 f4 lea -0xc(%ebp),%esp
1110ef: 5b pop %ebx
1110f0: 5e pop %esi
1110f1: 5f pop %edi
1110f2: c9 leave
1110f3: c3 ret
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
1110f4: 89 55 d4 mov %edx,-0x2c(%ebp)
1110f7: e8 58 29 00 00 call 113a54 <__errno>
1110fc: 83 38 22 cmpl $0x22,(%eax)
1110ff: 8b 55 d4 mov -0x2c(%ebp),%edx
111102: 75 e4 jne 1110e8 <rtems_string_to_unsigned_long+0x4c><== NEVER TAKEN
return RTEMS_INVALID_NUMBER;
111104: b8 0a 00 00 00 mov $0xa,%eax
111109: eb e1 jmp 1110ec <rtems_string_to_unsigned_long+0x50>
11110b: 90 nop
{
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
11110c: b8 09 00 00 00 mov $0x9,%eax
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
#endif
return RTEMS_SUCCESSFUL;
}
111111: 8d 65 f4 lea -0xc(%ebp),%esp
111114: 5b pop %ebx
111115: 5e pop %esi
111116: 5f pop %edi
111117: c9 leave
111118: c3 ret
111119: 8d 76 00 lea 0x0(%esi),%esi
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
11111c: 8b 45 e4 mov -0x1c(%ebp),%eax
11111f: eb be jmp 1110df <rtems_string_to_unsigned_long+0x43>
111121: 8d 76 00 lea 0x0(%esi),%esi
*endptr = end;
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
111124: b8 0b 00 00 00 mov $0xb,%eax
111129: eb c1 jmp 1110ec <rtems_string_to_unsigned_long+0x50>
00111000 <rtems_string_to_unsigned_long_long>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
111000: 55 push %ebp
111001: 89 e5 mov %esp,%ebp
111003: 57 push %edi
111004: 56 push %esi
111005: 53 push %ebx
111006: 83 ec 2c sub $0x2c,%esp
111009: 8b 5d 0c mov 0xc(%ebp),%ebx
11100c: 8b 7d 10 mov 0x10(%ebp),%edi
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
11100f: 85 db test %ebx,%ebx
111011: 74 69 je 11107c <rtems_string_to_unsigned_long_long+0x7c>
return RTEMS_INVALID_ADDRESS;
errno = 0;
111013: e8 3c 2a 00 00 call 113a54 <__errno>
111018: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
11101e: c7 03 00 00 00 00 movl $0x0,(%ebx)
111024: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx)
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
11102b: 50 push %eax
11102c: ff 75 14 pushl 0x14(%ebp)
11102f: 8d 45 e4 lea -0x1c(%ebp),%eax
111032: 50 push %eax
111033: ff 75 08 pushl 0x8(%ebp)
111036: e8 d1 5a 00 00 call 116b0c <strtoull>
11103b: 89 c6 mov %eax,%esi
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
11103d: 83 c4 10 add $0x10,%esp
111040: 85 ff test %edi,%edi
111042: 74 48 je 11108c <rtems_string_to_unsigned_long_long+0x8c>
*endptr = end;
111044: 8b 45 e4 mov -0x1c(%ebp),%eax
111047: 89 07 mov %eax,(%edi)
/* nothing was converted */
if ( end == s )
111049: 39 45 08 cmp %eax,0x8(%ebp)
11104c: 74 46 je 111094 <rtems_string_to_unsigned_long_long+0x94>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
11104e: 89 f0 mov %esi,%eax
111050: 21 d0 and %edx,%eax
111052: 40 inc %eax
111053: 74 0f je 111064 <rtems_string_to_unsigned_long_long+0x64>
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
111055: 89 33 mov %esi,(%ebx)
111057: 89 53 04 mov %edx,0x4(%ebx)
#endif
return RTEMS_SUCCESSFUL;
11105a: 31 c0 xor %eax,%eax
}
11105c: 8d 65 f4 lea -0xc(%ebp),%esp
11105f: 5b pop %ebx
111060: 5e pop %esi
111061: 5f pop %edi
111062: c9 leave
111063: c3 ret
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
111064: 89 55 d4 mov %edx,-0x2c(%ebp)
111067: e8 e8 29 00 00 call 113a54 <__errno>
11106c: 83 38 22 cmpl $0x22,(%eax)
11106f: 8b 55 d4 mov -0x2c(%ebp),%edx
111072: 75 e1 jne 111055 <rtems_string_to_unsigned_long_long+0x55><== NEVER TAKEN
return RTEMS_INVALID_NUMBER;
111074: b8 0a 00 00 00 mov $0xa,%eax
111079: eb e1 jmp 11105c <rtems_string_to_unsigned_long_long+0x5c>
11107b: 90 nop
{
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
11107c: b8 09 00 00 00 mov $0x9,%eax
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
#endif
return RTEMS_SUCCESSFUL;
}
111081: 8d 65 f4 lea -0xc(%ebp),%esp
111084: 5b pop %ebx
111085: 5e pop %esi
111086: 5f pop %edi
111087: c9 leave
111088: c3 ret
111089: 8d 76 00 lea 0x0(%esi),%esi
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
11108c: 8b 45 e4 mov -0x1c(%ebp),%eax
11108f: eb b8 jmp 111049 <rtems_string_to_unsigned_long_long+0x49>
111091: 8d 76 00 lea 0x0(%esi),%esi
*endptr = end;
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
111094: b8 0b 00 00 00 mov $0xb,%eax
111099: eb c1 jmp 11105c <rtems_string_to_unsigned_long_long+0x5c>
00107e24 <rtems_tarfs_load>:
int rtems_tarfs_load(
char *mountpoint,
uint8_t *tar_image,
size_t tar_size
)
{
107e24: 55 push %ebp
107e25: 89 e5 mov %esp,%ebp
107e27: 57 push %edi
107e28: 56 push %esi
107e29: 53 push %ebx
107e2a: 81 ec d8 01 00 00 sub $0x1d8,%esp
int offset;
unsigned long nblocks;
IMFS_jnode_t *node;
int status;
status = rtems_filesystem_evaluate_path(
107e30: 31 c0 xor %eax,%eax
107e32: b9 ff ff ff ff mov $0xffffffff,%ecx
107e37: 8b 7d 08 mov 0x8(%ebp),%edi
107e3a: f2 ae repnz scas %es:(%edi),%al
107e3c: f7 d1 not %ecx
107e3e: 49 dec %ecx
107e3f: 6a 00 push $0x0
107e41: 8d 45 d0 lea -0x30(%ebp),%eax
107e44: 89 85 2c fe ff ff mov %eax,-0x1d4(%ebp)
107e4a: 50 push %eax
107e4b: 6a 00 push $0x0
107e4d: 51 push %ecx
107e4e: ff 75 08 pushl 0x8(%ebp)
107e51: e8 9a 0a 00 00 call 1088f0 <rtems_filesystem_evaluate_path>
107e56: 89 85 44 fe ff ff mov %eax,-0x1bc(%ebp)
strlen(mountpoint),
0,
&root_loc,
0
);
if (status != 0)
107e5c: 83 c4 20 add $0x20,%esp
107e5f: 85 c0 test %eax,%eax
107e61: 0f 85 61 01 00 00 jne 107fc8 <rtems_tarfs_load+0x1a4>
return -1;
if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops)
107e67: 8b 45 dc mov -0x24(%ebp),%eax
107e6a: 3d 40 6e 12 00 cmp $0x126e40,%eax
107e6f: 0f 85 47 01 00 00 jne 107fbc <rtems_tarfs_load+0x198>
107e75: 31 db xor %ebx,%ebx
* should not have this path.
*/
else if (linkflag == REGTYPE) {
const char *name;
loc = root_loc;
107e77: 8d 45 bc lea -0x44(%ebp),%eax
107e7a: 89 85 30 fe ff ff mov %eax,-0x1d0(%ebp)
* - For directories, just create directories as usual. IMFS
* will take care of the rest.
* - For files, create a file node with special tarfs properties.
*/
if (linkflag == DIRTYPE) {
strcpy(full_filename, mountpoint);
107e80: 8d 95 58 fe ff ff lea -0x1a8(%ebp),%edx
107e86: 89 95 34 fe ff ff mov %edx,-0x1cc(%ebp)
107e8c: eb 15 jmp 107ea3 <rtems_tarfs_load+0x7f>
107e8e: 66 90 xchg %ax,%ax
* IMFS_create_node was ONLY passed a NULL when we created the
* root node. We added a new IMFS_create_root_node() so this
* path no longer existed. The result was simpler code which
* should not have this path.
*/
else if (linkflag == REGTYPE) {
107e90: 80 bd 53 fe ff ff 30 cmpb $0x30,-0x1ad(%ebp)
107e97: 0f 84 43 01 00 00 je 107fe0 <rtems_tarfs_load+0x1bc>
0
);
if (status != 0)
return -1;
if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops)
107e9d: 8b 9d 54 fe ff ff mov -0x1ac(%ebp),%ebx
/*
* Create an IMFS node structure pointing to tar image memory.
*/
offset = 0;
while (1) {
if (offset + 512 > tar_size)
107ea3: 8d 83 00 02 00 00 lea 0x200(%ebx),%eax
107ea9: 89 85 54 fe ff ff mov %eax,-0x1ac(%ebp)
107eaf: 8b 55 10 mov 0x10(%ebp),%edx
107eb2: 39 d0 cmp %edx,%eax
107eb4: 0f 87 18 01 00 00 ja 107fd2 <rtems_tarfs_load+0x1ae><== NEVER TAKEN
break;
/*
* Read a header.
*/
hdr_ptr = (char *) &tar_image[offset];
107eba: 03 5d 0c add 0xc(%ebp),%ebx
offset += 512;
if (strncmp(&hdr_ptr[257], "ustar", 5))
107ebd: 8d b3 01 01 00 00 lea 0x101(%ebx),%esi
107ec3: bf 88 6e 12 00 mov $0x126e88,%edi
107ec8: b9 05 00 00 00 mov $0x5,%ecx
107ecd: f3 a6 repz cmpsb %es:(%edi),%ds:(%esi)
107ecf: 0f 85 fd 00 00 00 jne 107fd2 <rtems_tarfs_load+0x1ae>
break;
strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE);
107ed5: 57 push %edi
107ed6: 6a 63 push $0x63
107ed8: 53 push %ebx
107ed9: 8d 85 58 ff ff ff lea -0xa8(%ebp),%eax
107edf: 50 push %eax
107ee0: e8 57 fe 00 00 call 117d3c <strncpy>
filename[MAX_NAME_FIELD_SIZE] = '\0';
107ee5: c6 45 bb 00 movb $0x0,-0x45(%ebp)
linkflag = hdr_ptr[156];
107ee9: 8a 93 9c 00 00 00 mov 0x9c(%ebx),%dl
107eef: 88 95 53 fe ff ff mov %dl,-0x1ad(%ebp)
file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8);
107ef5: 59 pop %ecx
107ef6: 5e pop %esi
107ef7: 6a 08 push $0x8
107ef9: 8d 43 64 lea 0x64(%ebx),%eax
107efc: 50 push %eax
107efd: e8 5e 7c 00 00 call 10fb60 <_rtems_octal2ulong>
107f02: 89 85 48 fe ff ff mov %eax,-0x1b8(%ebp)
file_size = _rtems_octal2ulong(&hdr_ptr[124], 12);
107f08: 58 pop %eax
107f09: 5a pop %edx
107f0a: 6a 0c push $0xc
107f0c: 8d 43 7c lea 0x7c(%ebx),%eax
107f0f: 50 push %eax
107f10: e8 4b 7c 00 00 call 10fb60 <_rtems_octal2ulong>
107f15: 89 85 4c fe ff ff mov %eax,-0x1b4(%ebp)
hdr_chksum = _rtems_octal2ulong(&hdr_ptr[148], 8);
107f1b: 5e pop %esi
107f1c: 5f pop %edi
107f1d: 6a 08 push $0x8
107f1f: 8d 83 94 00 00 00 lea 0x94(%ebx),%eax
107f25: 50 push %eax
107f26: e8 35 7c 00 00 call 10fb60 <_rtems_octal2ulong>
107f2b: 89 c6 mov %eax,%esi
if (_rtems_tar_header_checksum(hdr_ptr) != hdr_chksum)
107f2d: 89 1c 24 mov %ebx,(%esp)
107f30: e8 ff 80 00 00 call 110034 <_rtems_tar_header_checksum>
107f35: 83 c4 10 add $0x10,%esp
107f38: 39 f0 cmp %esi,%eax
107f3a: 0f 85 92 00 00 00 jne 107fd2 <rtems_tarfs_load+0x1ae><== NEVER TAKEN
* Generate an IMFS node depending on the file type.
* - For directories, just create directories as usual. IMFS
* will take care of the rest.
* - For files, create a file node with special tarfs properties.
*/
if (linkflag == DIRTYPE) {
107f40: 80 bd 53 fe ff ff 35 cmpb $0x35,-0x1ad(%ebp)
107f47: 0f 85 43 ff ff ff jne 107e90 <rtems_tarfs_load+0x6c>
strcpy(full_filename, mountpoint);
107f4d: 83 ec 08 sub $0x8,%esp
107f50: ff 75 08 pushl 0x8(%ebp)
107f53: 8d 85 58 fe ff ff lea -0x1a8(%ebp),%eax
107f59: 50 push %eax
107f5a: e8 75 fa 00 00 call 1179d4 <strcpy>
if (full_filename[strlen(full_filename)-1] != '/')
107f5f: 31 c0 xor %eax,%eax
107f61: b9 ff ff ff ff mov $0xffffffff,%ecx
107f66: 8b bd 34 fe ff ff mov -0x1cc(%ebp),%edi
107f6c: f2 ae repnz scas %es:(%edi),%al
107f6e: f7 d1 not %ecx
107f70: 49 dec %ecx
107f71: 83 c4 10 add $0x10,%esp
107f74: 80 bc 0d 57 fe ff ff cmpb $0x2f,-0x1a9(%ebp,%ecx,1)
107f7b: 2f
107f7c: 74 0a je 107f88 <rtems_tarfs_load+0x164><== ALWAYS TAKEN
strcat(full_filename, "/");
107f7e: 66 c7 84 0d 58 fe ff movw $0x2f,-0x1a8(%ebp,%ecx,1) <== NOT EXECUTED
107f85: ff 2f 00
strcat(full_filename, filename);
107f88: 83 ec 08 sub $0x8,%esp
107f8b: 8d 95 58 ff ff ff lea -0xa8(%ebp),%edx
107f91: 52 push %edx
107f92: 8d 85 58 fe ff ff lea -0x1a8(%ebp),%eax
107f98: 50 push %eax
107f99: e8 82 f8 00 00 call 117820 <strcat>
mkdir(full_filename, S_IRWXU | S_IRWXG | S_IRWXO);
107f9e: 5a pop %edx
107f9f: 59 pop %ecx
107fa0: 68 ff 01 00 00 push $0x1ff
107fa5: 8d 95 58 fe ff ff lea -0x1a8(%ebp),%edx
107fab: 52 push %edx
107fac: e8 fb 10 00 00 call 1090ac <mkdir>
107fb1: 83 c4 10 add $0x10,%esp
107fb4: e9 e4 fe ff ff jmp 107e9d <rtems_tarfs_load+0x79>
107fb9: 8d 76 00 lea 0x0(%esi),%esi
0
);
if (status != 0)
return -1;
if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops)
107fbc: 3d c0 78 12 00 cmp $0x1278c0,%eax
107fc1: 0f 84 ae fe ff ff je 107e75 <rtems_tarfs_load+0x51> <== NEVER TAKEN
107fc7: 90 nop
return -1;
107fc8: c7 85 44 fe ff ff ff movl $0xffffffff,-0x1bc(%ebp)
107fcf: ff ff ff
nblocks = (((file_size) + 511) & ~511) / 512;
offset += 512 * nblocks;
}
}
return status;
}
107fd2: 8b 85 44 fe ff ff mov -0x1bc(%ebp),%eax
107fd8: 8d 65 f4 lea -0xc(%ebp),%esp
107fdb: 5b pop %ebx
107fdc: 5e pop %esi
107fdd: 5f pop %edi
107fde: c9 leave
107fdf: c3 ret
* should not have this path.
*/
else if (linkflag == REGTYPE) {
const char *name;
loc = root_loc;
107fe0: 8b bd 30 fe ff ff mov -0x1d0(%ebp),%edi
107fe6: 8b b5 2c fe ff ff mov -0x1d4(%ebp),%esi
107fec: b9 05 00 00 00 mov $0x5,%ecx
107ff1: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) {
107ff3: 50 push %eax
107ff4: 8d 45 e4 lea -0x1c(%ebp),%eax
107ff7: 50 push %eax
107ff8: 8d 55 bc lea -0x44(%ebp),%edx
107ffb: 52 push %edx
107ffc: 8d 85 58 ff ff ff lea -0xa8(%ebp),%eax
108002: 50 push %eax
108003: e8 0c 88 00 00 call 110814 <IMFS_evaluate_for_make>
108008: 83 c4 10 add $0x10,%esp
10800b: 85 c0 test %eax,%eax
10800d: 74 1d je 10802c <rtems_tarfs_load+0x208><== ALWAYS TAKEN
);
node->info.linearfile.size = file_size;
node->info.linearfile.direct = &tar_image[offset];
}
nblocks = (((file_size) + 511) & ~511) / 512;
10800f: 8b 85 4c fe ff ff mov -0x1b4(%ebp),%eax
108015: 05 ff 01 00 00 add $0x1ff,%eax
offset += 512 * nblocks;
10801a: 25 00 fe ff ff and $0xfffffe00,%eax
10801f: 01 85 54 fe ff ff add %eax,-0x1ac(%ebp)
108025: e9 73 fe ff ff jmp 107e9d <rtems_tarfs_load+0x79>
10802a: 66 90 xchg %ax,%ax
else if (linkflag == REGTYPE) {
const char *name;
loc = root_loc;
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) {
node = IMFS_create_node(
10802c: 83 ec 0c sub $0xc,%esp
10802f: 6a 00 push $0x0
&loc,
IMFS_LINEAR_FILE, (char *)name,
(file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG,
108031: 8b 85 48 fe ff ff mov -0x1b8(%ebp),%eax
108037: 25 ff 01 00 00 and $0x1ff,%eax
else if (linkflag == REGTYPE) {
const char *name;
loc = root_loc;
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) {
node = IMFS_create_node(
10803c: 80 cc 80 or $0x80,%ah
10803f: 50 push %eax
108040: ff 75 e4 pushl -0x1c(%ebp)
108043: 6a 06 push $0x6
108045: 8d 55 bc lea -0x44(%ebp),%edx
108048: 52 push %edx
108049: e8 ce 81 00 00 call 11021c <IMFS_create_node>
&loc,
IMFS_LINEAR_FILE, (char *)name,
(file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG,
NULL
);
node->info.linearfile.size = file_size;
10804e: 8b 95 4c fe ff ff mov -0x1b4(%ebp),%edx
108054: 89 50 50 mov %edx,0x50(%eax)
108057: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
node->info.linearfile.direct = &tar_image[offset];
10805e: 8b 55 0c mov 0xc(%ebp),%edx
108061: 03 95 54 fe ff ff add -0x1ac(%ebp),%edx
108067: 89 50 58 mov %edx,0x58(%eax)
10806a: 83 c4 20 add $0x20,%esp
10806d: eb a0 jmp 10800f <rtems_tarfs_load+0x1eb>
0010b84c <rtems_task_create>:
size_t stack_size,
rtems_mode initial_modes,
rtems_attribute attribute_set,
rtems_id *id
)
{
10b84c: 55 push %ebp
10b84d: 89 e5 mov %esp,%ebp
10b84f: 57 push %edi
10b850: 56 push %esi
10b851: 53 push %ebx
10b852: 83 ec 1c sub $0x1c,%esp
10b855: 8b 5d 08 mov 0x8(%ebp),%ebx
10b858: 8b 7d 0c mov 0xc(%ebp),%edi
10b85b: 8b 75 1c mov 0x1c(%ebp),%esi
Priority_Control core_priority;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !id )
10b85e: 85 f6 test %esi,%esi
10b860: 0f 84 3e 01 00 00 je 10b9a4 <rtems_task_create+0x158>
return RTEMS_INVALID_ADDRESS;
if ( !rtems_is_name_valid( name ) )
10b866: 85 db test %ebx,%ebx
10b868: 0f 84 d2 00 00 00 je 10b940 <rtems_task_create+0xf4>
/*
* Validate the RTEMS API priority and convert it to the core priority range.
*/
if ( !_Attributes_Is_system_task( the_attribute_set ) ) {
10b86e: f7 45 18 00 80 00 00 testl $0x8000,0x18(%ebp)
10b875: 75 17 jne 10b88e <rtems_task_create+0x42>
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
10b877: 85 ff test %edi,%edi
10b879: 0f 84 b1 00 00 00 je 10b930 <rtems_task_create+0xe4>
( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
10b87f: 0f b6 05 f4 3a 12 00 movzbl 0x123af4,%eax
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
10b886: 39 c7 cmp %eax,%edi
10b888: 0f 87 a2 00 00 00 ja 10b930 <rtems_task_create+0xe4>
*/
/*
* Lock the allocator mutex for protection
*/
_RTEMS_Lock_allocator();
10b88e: 83 ec 0c sub $0xc,%esp
10b891: ff 35 1c 7f 12 00 pushl 0x127f1c
10b897: e8 c8 06 00 00 call 10bf64 <_API_Mutex_Lock>
* This function allocates a task control block from
* the inactive chain of free task control blocks.
*/
RTEMS_INLINE_ROUTINE Thread_Control *_RTEMS_tasks_Allocate( void )
{
return (Thread_Control *) _Objects_Allocate( &_RTEMS_tasks_Information );
10b89c: c7 04 24 c0 7d 12 00 movl $0x127dc0,(%esp)
10b8a3: e8 e0 10 00 00 call 10c988 <_Objects_Allocate>
10b8a8: 89 c2 mov %eax,%edx
* the event of an error.
*/
the_thread = _RTEMS_tasks_Allocate();
if ( !the_thread ) {
10b8aa: 83 c4 10 add $0x10,%esp
10b8ad: 85 c0 test %eax,%eax
10b8af: 0f 84 cf 00 00 00 je 10b984 <rtems_task_create+0x138>
/*
* Initialize the core thread for this task.
*/
status = _Thread_Initialize(
10b8b5: 50 push %eax
10b8b6: 53 push %ebx
*/
RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level (
Modes_Control mode_set
)
{
return ( mode_set & RTEMS_INTERRUPT_MASK );
10b8b7: 8b 45 14 mov 0x14(%ebp),%eax
10b8ba: 83 e0 01 and $0x1,%eax
10b8bd: 50 push %eax
10b8be: 6a 00 push $0x0
10b8c0: 31 c0 xor %eax,%eax
10b8c2: f7 45 14 00 02 00 00 testl $0x200,0x14(%ebp)
10b8c9: 0f 95 c0 setne %al
10b8cc: 50 push %eax
10b8cd: 31 c0 xor %eax,%eax
10b8cf: f7 45 14 00 01 00 00 testl $0x100,0x14(%ebp)
10b8d6: 0f 94 c0 sete %al
10b8d9: 50 push %eax
10b8da: 57 push %edi
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_floating_point(
rtems_attribute attribute_set
)
{
return ( attribute_set & RTEMS_FLOATING_POINT ) ? true : false;
10b8db: 8b 45 18 mov 0x18(%ebp),%eax
10b8de: 83 e0 01 and $0x1,%eax
10b8e1: 50 push %eax
10b8e2: ff 75 10 pushl 0x10(%ebp)
10b8e5: 6a 00 push $0x0
10b8e7: 52 push %edx
10b8e8: 68 c0 7d 12 00 push $0x127dc0
10b8ed: 89 55 e4 mov %edx,-0x1c(%ebp)
10b8f0: e8 97 20 00 00 call 10d98c <_Thread_Initialize>
NULL, /* no budget algorithm callout */
_Modes_Get_interrupt_level(initial_modes),
(Objects_Name) name
);
if ( !status ) {
10b8f5: 83 c4 30 add $0x30,%esp
10b8f8: 84 c0 test %al,%al
10b8fa: 8b 55 e4 mov -0x1c(%ebp),%edx
10b8fd: 74 51 je 10b950 <rtems_task_create+0x104>
_RTEMS_Unlock_allocator();
return RTEMS_UNSATISFIED;
}
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
10b8ff: 8b 82 e8 00 00 00 mov 0xe8(%edx),%eax
* id - thread id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_task_create(
10b905: f7 45 14 00 04 00 00 testl $0x400,0x14(%ebp)
}
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
asr->is_enabled = _Modes_Is_asr_disabled(initial_modes) ? false : true;
10b90c: 0f 94 40 08 sete 0x8(%eax)
*id = the_thread->Object.id;
10b910: 8b 42 08 mov 0x8(%edx),%eax
10b913: 89 06 mov %eax,(%esi)
);
}
#endif
_RTEMS_Unlock_allocator();
10b915: 83 ec 0c sub $0xc,%esp
10b918: ff 35 1c 7f 12 00 pushl 0x127f1c
10b91e: e8 89 06 00 00 call 10bfac <_API_Mutex_Unlock>
return RTEMS_SUCCESSFUL;
10b923: 83 c4 10 add $0x10,%esp
10b926: 31 c0 xor %eax,%eax
}
10b928: 8d 65 f4 lea -0xc(%ebp),%esp
10b92b: 5b pop %ebx
10b92c: 5e pop %esi
10b92d: 5f pop %edi
10b92e: c9 leave
10b92f: c3 ret
* Validate the RTEMS API priority and convert it to the core priority range.
*/
if ( !_Attributes_Is_system_task( the_attribute_set ) ) {
if ( !_RTEMS_tasks_Priority_is_valid( initial_priority ) )
return RTEMS_INVALID_PRIORITY;
10b930: b8 13 00 00 00 mov $0x13,%eax
}
#endif
_RTEMS_Unlock_allocator();
return RTEMS_SUCCESSFUL;
}
10b935: 8d 65 f4 lea -0xc(%ebp),%esp
10b938: 5b pop %ebx
10b939: 5e pop %esi
10b93a: 5f pop %edi
10b93b: c9 leave
10b93c: c3 ret
10b93d: 8d 76 00 lea 0x0(%esi),%esi
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
10b940: b8 03 00 00 00 mov $0x3,%eax
}
#endif
_RTEMS_Unlock_allocator();
return RTEMS_SUCCESSFUL;
}
10b945: 8d 65 f4 lea -0xc(%ebp),%esp
10b948: 5b pop %ebx
10b949: 5e pop %esi
10b94a: 5f pop %edi
10b94b: c9 leave
10b94c: c3 ret
10b94d: 8d 76 00 lea 0x0(%esi),%esi
*/
RTEMS_INLINE_ROUTINE void _RTEMS_tasks_Free (
Thread_Control *the_task
)
{
_Objects_Free(
10b950: 83 ec 0c sub $0xc,%esp
10b953: ff 72 08 pushl 0x8(%edx)
10b956: e8 15 14 00 00 call 10cd70 <_Objects_Get_information_id>
10b95b: 5a pop %edx
10b95c: 59 pop %ecx
10b95d: 8b 55 e4 mov -0x1c(%ebp),%edx
10b960: 52 push %edx
10b961: 50 push %eax
10b962: e8 99 13 00 00 call 10cd00 <_Objects_Free>
#if defined(RTEMS_MULTIPROCESSING)
if ( is_global )
_Objects_MP_Free_global_object( the_global_object );
#endif
_RTEMS_tasks_Free( the_thread );
_RTEMS_Unlock_allocator();
10b967: 58 pop %eax
10b968: ff 35 1c 7f 12 00 pushl 0x127f1c
10b96e: e8 39 06 00 00 call 10bfac <_API_Mutex_Unlock>
return RTEMS_UNSATISFIED;
10b973: 83 c4 10 add $0x10,%esp
10b976: b8 0d 00 00 00 mov $0xd,%eax
}
#endif
_RTEMS_Unlock_allocator();
return RTEMS_SUCCESSFUL;
}
10b97b: 8d 65 f4 lea -0xc(%ebp),%esp
10b97e: 5b pop %ebx
10b97f: 5e pop %esi
10b980: 5f pop %edi
10b981: c9 leave
10b982: c3 ret
10b983: 90 nop
*/
the_thread = _RTEMS_tasks_Allocate();
if ( !the_thread ) {
_RTEMS_Unlock_allocator();
10b984: 83 ec 0c sub $0xc,%esp
10b987: ff 35 1c 7f 12 00 pushl 0x127f1c
10b98d: e8 1a 06 00 00 call 10bfac <_API_Mutex_Unlock>
return RTEMS_TOO_MANY;
10b992: 83 c4 10 add $0x10,%esp
10b995: b8 05 00 00 00 mov $0x5,%eax
}
#endif
_RTEMS_Unlock_allocator();
return RTEMS_SUCCESSFUL;
}
10b99a: 8d 65 f4 lea -0xc(%ebp),%esp
10b99d: 5b pop %ebx
10b99e: 5e pop %esi
10b99f: 5f pop %edi
10b9a0: c9 leave
10b9a1: c3 ret
10b9a2: 66 90 xchg %ax,%ax
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !id )
return RTEMS_INVALID_ADDRESS;
10b9a4: b8 09 00 00 00 mov $0x9,%eax
10b9a9: eb 8a jmp 10b935 <rtems_task_create+0xe9>
0010b9ac <rtems_task_delete>:
*/
rtems_status_code rtems_task_delete(
rtems_id id
)
{
10b9ac: 55 push %ebp
10b9ad: 89 e5 mov %esp,%ebp
10b9af: 53 push %ebx
10b9b0: 83 ec 20 sub $0x20,%esp
register Thread_Control *the_thread;
Objects_Locations location;
Objects_Information *the_information;
_RTEMS_Lock_allocator();
10b9b3: ff 35 1c 7f 12 00 pushl 0x127f1c
10b9b9: e8 a6 05 00 00 call 10bf64 <_API_Mutex_Lock>
the_thread = _Thread_Get( id, &location );
10b9be: 5a pop %edx
10b9bf: 59 pop %ecx
10b9c0: 8d 45 f4 lea -0xc(%ebp),%eax
10b9c3: 50 push %eax
10b9c4: ff 75 08 pushl 0x8(%ebp)
10b9c7: e8 4c 1f 00 00 call 10d918 <_Thread_Get>
10b9cc: 89 c3 mov %eax,%ebx
switch ( location ) {
10b9ce: 83 c4 10 add $0x10,%esp
10b9d1: 8b 45 f4 mov -0xc(%ebp),%eax
10b9d4: 85 c0 test %eax,%eax
10b9d6: 75 44 jne 10ba1c <rtems_task_delete+0x70>
case OBJECTS_LOCAL:
the_information = _Objects_Get_information_id( the_thread->Object.id );
10b9d8: 83 ec 0c sub $0xc,%esp
10b9db: ff 73 08 pushl 0x8(%ebx)
10b9de: e8 8d 13 00 00 call 10cd70 <_Objects_Get_information_id>
0 /* Not used */
);
}
#endif
_Thread_Close( the_information, the_thread );
10b9e3: 5a pop %edx
10b9e4: 59 pop %ecx
10b9e5: 53 push %ebx
10b9e6: 50 push %eax
10b9e7: e8 c8 1b 00 00 call 10d5b4 <_Thread_Close>
10b9ec: 58 pop %eax
10b9ed: ff 73 08 pushl 0x8(%ebx)
10b9f0: e8 7b 13 00 00 call 10cd70 <_Objects_Get_information_id>
10b9f5: 5a pop %edx
10b9f6: 59 pop %ecx
10b9f7: 53 push %ebx
10b9f8: 50 push %eax
10b9f9: e8 02 13 00 00 call 10cd00 <_Objects_Free>
_RTEMS_tasks_Free( the_thread );
_RTEMS_Unlock_allocator();
10b9fe: 58 pop %eax
10b9ff: ff 35 1c 7f 12 00 pushl 0x127f1c
10ba05: e8 a2 05 00 00 call 10bfac <_API_Mutex_Unlock>
_Thread_Enable_dispatch();
10ba0a: e8 e5 1e 00 00 call 10d8f4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10ba0f: 83 c4 10 add $0x10,%esp
10ba12: 31 c0 xor %eax,%eax
break;
}
_RTEMS_Unlock_allocator();
return RTEMS_INVALID_ID;
}
10ba14: 8b 5d fc mov -0x4(%ebp),%ebx
10ba17: c9 leave
10ba18: c3 ret
10ba19: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_ERROR:
break;
}
_RTEMS_Unlock_allocator();
10ba1c: 83 ec 0c sub $0xc,%esp
10ba1f: ff 35 1c 7f 12 00 pushl 0x127f1c
10ba25: e8 82 05 00 00 call 10bfac <_API_Mutex_Unlock>
return RTEMS_INVALID_ID;
10ba2a: 83 c4 10 add $0x10,%esp
10ba2d: b8 04 00 00 00 mov $0x4,%eax
}
10ba32: 8b 5d fc mov -0x4(%ebp),%ebx
10ba35: c9 leave
10ba36: c3 ret
0010d4e4 <rtems_task_get_note>:
rtems_status_code rtems_task_get_note(
rtems_id id,
uint32_t notepad,
uint32_t *note
)
{
10d4e4: 55 push %ebp
10d4e5: 89 e5 mov %esp,%ebp
10d4e7: 56 push %esi
10d4e8: 53 push %ebx
10d4e9: 83 ec 10 sub $0x10,%esp
10d4ec: 8b 45 08 mov 0x8(%ebp),%eax
10d4ef: 8b 75 0c mov 0xc(%ebp),%esi
10d4f2: 8b 5d 10 mov 0x10(%ebp),%ebx
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
10d4f5: 80 3d 64 79 12 00 00 cmpb $0x0,0x127964
10d4fc: 74 6e je 10d56c <rtems_task_get_note+0x88>
return RTEMS_NOT_CONFIGURED;
if ( !note )
10d4fe: 85 db test %ebx,%ebx
10d500: 74 7e je 10d580 <rtems_task_get_note+0x9c>
/*
* NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would
* be checking an unsigned number for being negative.
*/
if ( notepad > RTEMS_NOTEPAD_LAST )
10d502: 83 fe 0f cmp $0xf,%esi
10d505: 77 3d ja 10d544 <rtems_task_get_note+0x60>
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d507: 85 c0 test %eax,%eax
10d509: 74 45 je 10d550 <rtems_task_get_note+0x6c>
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
10d50b: 8b 15 d8 c5 12 00 mov 0x12c5d8,%edx
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d511: 3b 42 08 cmp 0x8(%edx),%eax
10d514: 74 40 je 10d556 <rtems_task_get_note+0x72>
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
*note = api->Notepads[ notepad ];
return RTEMS_SUCCESSFUL;
}
the_thread = _Thread_Get( id, &location );
10d516: 83 ec 08 sub $0x8,%esp
10d519: 8d 55 f4 lea -0xc(%ebp),%edx
10d51c: 52 push %edx
10d51d: 50 push %eax
10d51e: e8 3d 22 00 00 call 10f760 <_Thread_Get>
switch ( location ) {
10d523: 83 c4 10 add $0x10,%esp
10d526: 8b 55 f4 mov -0xc(%ebp),%edx
10d529: 85 d2 test %edx,%edx
10d52b: 75 4b jne 10d578 <rtems_task_get_note+0x94>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
*note = api->Notepads[ notepad ];
10d52d: 8b 80 e8 00 00 00 mov 0xe8(%eax),%eax
10d533: 8b 44 b0 20 mov 0x20(%eax,%esi,4),%eax
10d537: 89 03 mov %eax,(%ebx)
_Thread_Enable_dispatch();
10d539: e8 fe 21 00 00 call 10f73c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10d53e: 31 c0 xor %eax,%eax
10d540: eb 07 jmp 10d549 <rtems_task_get_note+0x65>
10d542: 66 90 xchg %ax,%ax
* NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would
* be checking an unsigned number for being negative.
*/
if ( notepad > RTEMS_NOTEPAD_LAST )
return RTEMS_INVALID_NUMBER;
10d544: b8 0a 00 00 00 mov $0xa,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d549: 8d 65 f8 lea -0x8(%ebp),%esp
10d54c: 5b pop %ebx
10d54d: 5e pop %esi
10d54e: c9 leave
10d54f: c3 ret
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d550: 8b 15 d8 c5 12 00 mov 0x12c5d8,%edx
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
*note = api->Notepads[ notepad ];
10d556: 8b 82 e8 00 00 00 mov 0xe8(%edx),%eax
10d55c: 8b 44 b0 20 mov 0x20(%eax,%esi,4),%eax
10d560: 89 03 mov %eax,(%ebx)
return RTEMS_SUCCESSFUL;
10d562: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d564: 8d 65 f8 lea -0x8(%ebp),%esp
10d567: 5b pop %ebx
10d568: 5e pop %esi
10d569: c9 leave
10d56a: c3 ret
10d56b: 90 nop
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
return RTEMS_NOT_CONFIGURED;
10d56c: b8 16 00 00 00 mov $0x16,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d571: 8d 65 f8 lea -0x8(%ebp),%esp
10d574: 5b pop %ebx
10d575: 5e pop %esi
10d576: c9 leave
10d577: c3 ret
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10d578: b8 04 00 00 00 mov $0x4,%eax
10d57d: eb ca jmp 10d549 <rtems_task_get_note+0x65>
10d57f: 90 nop
if ( !rtems_configuration_get_notepads_enabled() )
return RTEMS_NOT_CONFIGURED;
if ( !note )
return RTEMS_INVALID_ADDRESS;
10d580: b8 09 00 00 00 mov $0x9,%eax
10d585: eb c2 jmp 10d549 <rtems_task_get_note+0x65>
00118144 <rtems_task_is_suspended>:
*/
rtems_status_code rtems_task_is_suspended(
rtems_id id
)
{
118144: 55 push %ebp
118145: 89 e5 mov %esp,%ebp
118147: 83 ec 20 sub $0x20,%esp
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
11814a: 8d 45 f4 lea -0xc(%ebp),%eax
11814d: 50 push %eax
11814e: ff 75 08 pushl 0x8(%ebp)
118151: e8 66 3c 00 00 call 11bdbc <_Thread_Get>
switch ( location ) {
118156: 83 c4 10 add $0x10,%esp
118159: 8b 55 f4 mov -0xc(%ebp),%edx
11815c: 85 d2 test %edx,%edx
11815e: 74 08 je 118168 <rtems_task_is_suspended+0x24>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
118160: b8 04 00 00 00 mov $0x4,%eax
}
118165: c9 leave
118166: c3 ret
118167: 90 nop
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_States_Is_suspended( the_thread->current_state ) ) {
118168: f6 40 10 02 testb $0x2,0x10(%eax)
11816c: 74 0e je 11817c <rtems_task_is_suspended+0x38>
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
11816e: e8 25 3c 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_ALREADY_SUSPENDED;
118173: b8 0f 00 00 00 mov $0xf,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118178: c9 leave
118179: c3 ret
11817a: 66 90 xchg %ax,%ax
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_States_Is_suspended( the_thread->current_state ) ) {
_Thread_Enable_dispatch();
11817c: e8 17 3c 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
118181: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118183: c9 leave
118184: c3 ret
00112e94 <rtems_task_mode>:
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
112e94: 55 push %ebp
112e95: 89 e5 mov %esp,%ebp
112e97: 57 push %edi
112e98: 56 push %esi
112e99: 53 push %ebx
112e9a: 83 ec 1c sub $0x1c,%esp
112e9d: 8b 4d 10 mov 0x10(%ebp),%ecx
ASR_Information *asr;
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
112ea0: 85 c9 test %ecx,%ecx
112ea2: 0f 84 40 01 00 00 je 112fe8 <rtems_task_mode+0x154>
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
112ea8: 8b 1d 18 84 12 00 mov 0x128418,%ebx
api = executing->API_Extensions[ THREAD_API_RTEMS ];
112eae: 8b bb e8 00 00 00 mov 0xe8(%ebx),%edi
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
112eb4: 80 7b 74 01 cmpb $0x1,0x74(%ebx)
112eb8: 19 f6 sbb %esi,%esi
112eba: 81 e6 00 01 00 00 and $0x100,%esi
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
112ec0: 8b 53 7c mov 0x7c(%ebx),%edx
112ec3: 85 d2 test %edx,%edx
112ec5: 0f 85 f1 00 00 00 jne 112fbc <rtems_task_mode+0x128>
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
112ecb: 80 7f 08 01 cmpb $0x1,0x8(%edi)
112ecf: 19 d2 sbb %edx,%edx
112ed1: 81 e2 00 04 00 00 and $0x400,%edx
old_mode |= _ISR_Get_level();
112ed7: 89 55 e4 mov %edx,-0x1c(%ebp)
112eda: 89 4d e0 mov %ecx,-0x20(%ebp)
112edd: e8 7a be ff ff call 10ed5c <_CPU_ISR_Get_level>
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
112ee2: 8b 55 e4 mov -0x1c(%ebp),%edx
112ee5: 09 d0 or %edx,%eax
old_mode |= _ISR_Get_level();
112ee7: 09 f0 or %esi,%eax
112ee9: 8b 4d e0 mov -0x20(%ebp),%ecx
112eec: 89 01 mov %eax,(%ecx)
*previous_mode_set = old_mode;
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
112eee: f7 45 0c 00 01 00 00 testl $0x100,0xc(%ebp)
112ef5: 74 0b je 112f02 <rtems_task_mode+0x6e>
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
112ef7: f7 45 08 00 01 00 00 testl $0x100,0x8(%ebp)
112efe: 0f 94 43 74 sete 0x74(%ebx)
if ( mask & RTEMS_TIMESLICE_MASK ) {
112f02: f7 45 0c 00 02 00 00 testl $0x200,0xc(%ebp)
112f09: 74 1c je 112f27 <rtems_task_mode+0x93>
if ( _Modes_Is_timeslice(mode_set) ) {
112f0b: f7 45 08 00 02 00 00 testl $0x200,0x8(%ebp)
112f12: 0f 84 b8 00 00 00 je 112fd0 <rtems_task_mode+0x13c>
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
112f18: c7 43 7c 01 00 00 00 movl $0x1,0x7c(%ebx)
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
112f1f: a1 00 7e 12 00 mov 0x127e00,%eax
112f24: 89 43 78 mov %eax,0x78(%ebx)
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
112f27: f6 45 0c 01 testb $0x1,0xc(%ebp)
112f2b: 74 0b je 112f38 <rtems_task_mode+0xa4>
*/
RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
Modes_Control mode_set
)
{
_ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
112f2d: f6 45 08 01 testb $0x1,0x8(%ebp)
112f31: 0f 84 91 00 00 00 je 112fc8 <rtems_task_mode+0x134>
112f37: fa cli
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
112f38: f7 45 0c 00 04 00 00 testl $0x400,0xc(%ebp)
112f3f: 74 3f je 112f80 <rtems_task_mode+0xec>
* Output:
* *previous_mode_set - previous mode set
* always return RTEMS_SUCCESSFUL;
*/
rtems_status_code rtems_task_mode(
112f41: f7 45 08 00 04 00 00 testl $0x400,0x8(%ebp)
112f48: 0f 94 c0 sete %al
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
if ( is_asr_enabled != asr->is_enabled ) {
112f4b: 38 47 08 cmp %al,0x8(%edi)
112f4e: 74 30 je 112f80 <rtems_task_mode+0xec>
asr->is_enabled = is_asr_enabled;
112f50: 88 47 08 mov %al,0x8(%edi)
)
{
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
112f53: 9c pushf
112f54: fa cli
112f55: 58 pop %eax
_signals = information->signals_pending;
112f56: 8b 57 18 mov 0x18(%edi),%edx
information->signals_pending = information->signals_posted;
112f59: 8b 4f 14 mov 0x14(%edi),%ecx
112f5c: 89 4f 18 mov %ecx,0x18(%edi)
information->signals_posted = _signals;
112f5f: 89 57 14 mov %edx,0x14(%edi)
_ISR_Enable( _level );
112f62: 50 push %eax
112f63: 9d popf
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
112f64: 8b 47 14 mov 0x14(%edi),%eax
112f67: 85 c0 test %eax,%eax
112f69: 0f 95 c0 setne %al
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
112f6c: 83 3d 00 80 12 00 03 cmpl $0x3,0x128000
112f73: 74 16 je 112f8b <rtems_task_mode+0xf7> <== ALWAYS TAKEN
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
112f75: 31 c0 xor %eax,%eax
}
112f77: 83 c4 1c add $0x1c,%esp
112f7a: 5b pop %ebx
112f7b: 5e pop %esi
112f7c: 5f pop %edi
112f7d: c9 leave
112f7e: c3 ret
112f7f: 90 nop
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
112f80: 31 c0 xor %eax,%eax
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
112f82: 83 3d 00 80 12 00 03 cmpl $0x3,0x128000
112f89: 75 ea jne 112f75 <rtems_task_mode+0xe1> <== NEVER TAKEN
bool are_signals_pending
)
{
Thread_Control *executing;
executing = _Thread_Executing;
112f8b: 8b 15 18 84 12 00 mov 0x128418,%edx
if ( are_signals_pending ||
112f91: 84 c0 test %al,%al
112f93: 75 0e jne 112fa3 <rtems_task_mode+0x10f>
112f95: 3b 15 1c 84 12 00 cmp 0x12841c,%edx
112f9b: 74 d8 je 112f75 <rtems_task_mode+0xe1>
(!_Thread_Is_heir( executing ) && executing->is_preemptible) ) {
112f9d: 80 7a 74 00 cmpb $0x0,0x74(%edx)
112fa1: 74 d2 je 112f75 <rtems_task_mode+0xe1> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
112fa3: c6 05 24 84 12 00 01 movb $0x1,0x128424
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
112faa: e8 cd a7 ff ff call 10d77c <_Thread_Dispatch>
}
return RTEMS_SUCCESSFUL;
112faf: 31 c0 xor %eax,%eax
}
112fb1: 83 c4 1c add $0x1c,%esp
112fb4: 5b pop %ebx
112fb5: 5e pop %esi
112fb6: 5f pop %edi
112fb7: c9 leave
112fb8: c3 ret
112fb9: 8d 76 00 lea 0x0(%esi),%esi
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
112fbc: 81 ce 00 02 00 00 or $0x200,%esi
112fc2: e9 04 ff ff ff jmp 112ecb <rtems_task_mode+0x37>
112fc7: 90 nop
112fc8: fb sti
112fc9: e9 6a ff ff ff jmp 112f38 <rtems_task_mode+0xa4>
112fce: 66 90 xchg %ax,%ax
if ( mask & RTEMS_TIMESLICE_MASK ) {
if ( _Modes_Is_timeslice(mode_set) ) {
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
} else
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
112fd0: c7 43 7c 00 00 00 00 movl $0x0,0x7c(%ebx)
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
112fd7: f6 45 0c 01 testb $0x1,0xc(%ebp)
112fdb: 0f 84 57 ff ff ff je 112f38 <rtems_task_mode+0xa4>
112fe1: e9 47 ff ff ff jmp 112f2d <rtems_task_mode+0x99>
112fe6: 66 90 xchg %ax,%ax
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
112fe8: b8 09 00 00 00 mov $0x9,%eax
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
}
112fed: 83 c4 1c add $0x1c,%esp
112ff0: 5b pop %ebx
112ff1: 5e pop %esi
112ff2: 5f pop %edi
112ff3: c9 leave
112ff4: c3 ret
0010ecdc <rtems_task_resume>:
*/
rtems_status_code rtems_task_resume(
rtems_id id
)
{
10ecdc: 55 push %ebp
10ecdd: 89 e5 mov %esp,%ebp
10ecdf: 83 ec 20 sub $0x20,%esp
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10ece2: 8d 45 f4 lea -0xc(%ebp),%eax
10ece5: 50 push %eax
10ece6: ff 75 08 pushl 0x8(%ebp)
10ece9: e8 62 1f 00 00 call 110c50 <_Thread_Get>
switch ( location ) {
10ecee: 83 c4 10 add $0x10,%esp
10ecf1: 8b 55 f4 mov -0xc(%ebp),%edx
10ecf4: 85 d2 test %edx,%edx
10ecf6: 74 08 je 10ed00 <rtems_task_resume+0x24>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10ecf8: b8 04 00 00 00 mov $0x4,%eax
}
10ecfd: c9 leave
10ecfe: c3 ret
10ecff: 90 nop
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( _States_Is_suspended( the_thread->current_state ) ) {
10ed00: f6 40 10 02 testb $0x2,0x10(%eax)
10ed04: 75 0e jne 10ed14 <rtems_task_resume+0x38>
_Thread_Resume( the_thread, true );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
10ed06: e8 21 1f 00 00 call 110c2c <_Thread_Enable_dispatch>
return RTEMS_INCORRECT_STATE;
10ed0b: b8 0e 00 00 00 mov $0xe,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10ed10: c9 leave
10ed11: c3 ret
10ed12: 66 90 xchg %ax,%ax
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( _States_Is_suspended( the_thread->current_state ) ) {
_Thread_Resume( the_thread, true );
10ed14: 83 ec 08 sub $0x8,%esp
10ed17: 6a 01 push $0x1
10ed19: 50 push %eax
10ed1a: e8 4d 27 00 00 call 11146c <_Thread_Resume>
_Thread_Enable_dispatch();
10ed1f: e8 08 1f 00 00 call 110c2c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10ed24: 83 c4 10 add $0x10,%esp
10ed27: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10ed29: c9 leave
10ed2a: c3 ret
0010d65c <rtems_task_set_note>:
rtems_status_code rtems_task_set_note(
rtems_id id,
uint32_t notepad,
uint32_t note
)
{
10d65c: 55 push %ebp
10d65d: 89 e5 mov %esp,%ebp
10d65f: 56 push %esi
10d660: 53 push %ebx
10d661: 83 ec 10 sub $0x10,%esp
10d664: 8b 45 08 mov 0x8(%ebp),%eax
10d667: 8b 5d 0c mov 0xc(%ebp),%ebx
10d66a: 8b 75 10 mov 0x10(%ebp),%esi
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
10d66d: 80 3d 64 79 12 00 00 cmpb $0x0,0x127964
10d674: 74 66 je 10d6dc <rtems_task_set_note+0x80>
/*
* NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would
* be checking an unsigned number for being negative.
*/
if ( notepad > RTEMS_NOTEPAD_LAST )
10d676: 83 fb 0f cmp $0xf,%ebx
10d679: 77 39 ja 10d6b4 <rtems_task_set_note+0x58>
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d67b: 85 c0 test %eax,%eax
10d67d: 74 41 je 10d6c0 <rtems_task_set_note+0x64>
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
10d67f: 8b 15 d8 c5 12 00 mov 0x12c5d8,%edx
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d685: 3b 42 08 cmp 0x8(%edx),%eax
10d688: 74 3c je 10d6c6 <rtems_task_set_note+0x6a>
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
api->Notepads[ notepad ] = note;
return RTEMS_SUCCESSFUL;
}
the_thread = _Thread_Get( id, &location );
10d68a: 83 ec 08 sub $0x8,%esp
10d68d: 8d 55 f4 lea -0xc(%ebp),%edx
10d690: 52 push %edx
10d691: 50 push %eax
10d692: e8 c9 20 00 00 call 10f760 <_Thread_Get>
switch ( location ) {
10d697: 83 c4 10 add $0x10,%esp
10d69a: 8b 55 f4 mov -0xc(%ebp),%edx
10d69d: 85 d2 test %edx,%edx
10d69f: 75 47 jne 10d6e8 <rtems_task_set_note+0x8c>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
api->Notepads[ notepad ] = note;
10d6a1: 8b 80 e8 00 00 00 mov 0xe8(%eax),%eax
10d6a7: 89 74 98 20 mov %esi,0x20(%eax,%ebx,4)
_Thread_Enable_dispatch();
10d6ab: e8 8c 20 00 00 call 10f73c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10d6b0: 31 c0 xor %eax,%eax
10d6b2: eb 05 jmp 10d6b9 <rtems_task_set_note+0x5d>
* NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would
* be checking an unsigned number for being negative.
*/
if ( notepad > RTEMS_NOTEPAD_LAST )
return RTEMS_INVALID_NUMBER;
10d6b4: b8 0a 00 00 00 mov $0xa,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d6b9: 8d 65 f8 lea -0x8(%ebp),%esp
10d6bc: 5b pop %ebx
10d6bd: 5e pop %esi
10d6be: c9 leave
10d6bf: c3 ret
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d6c0: 8b 15 d8 c5 12 00 mov 0x12c5d8,%edx
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
api->Notepads[ notepad ] = note;
10d6c6: 8b 82 e8 00 00 00 mov 0xe8(%edx),%eax
10d6cc: 89 74 98 20 mov %esi,0x20(%eax,%ebx,4)
return RTEMS_SUCCESSFUL;
10d6d0: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d6d2: 8d 65 f8 lea -0x8(%ebp),%esp
10d6d5: 5b pop %ebx
10d6d6: 5e pop %esi
10d6d7: c9 leave
10d6d8: c3 ret
10d6d9: 8d 76 00 lea 0x0(%esi),%esi
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
return RTEMS_NOT_CONFIGURED;
10d6dc: b8 16 00 00 00 mov $0x16,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d6e1: 8d 65 f8 lea -0x8(%ebp),%esp
10d6e4: 5b pop %ebx
10d6e5: 5e pop %esi
10d6e6: c9 leave
10d6e7: c3 ret
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10d6e8: b8 04 00 00 00 mov $0x4,%eax
}
10d6ed: 8d 65 f8 lea -0x8(%ebp),%esp
10d6f0: 5b pop %ebx
10d6f1: 5e pop %esi
10d6f2: c9 leave
10d6f3: c3 ret
0010f9a0 <rtems_task_set_priority>:
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
10f9a0: 55 push %ebp
10f9a1: 89 e5 mov %esp,%ebp
10f9a3: 56 push %esi
10f9a4: 53 push %ebx
10f9a5: 83 ec 10 sub $0x10,%esp
10f9a8: 8b 5d 0c mov 0xc(%ebp),%ebx
10f9ab: 8b 75 10 mov 0x10(%ebp),%esi
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
10f9ae: 85 db test %ebx,%ebx
10f9b0: 74 0b je 10f9bd <rtems_task_set_priority+0x1d>
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
10f9b2: 0f b6 05 b4 7a 12 00 movzbl 0x127ab4,%eax
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
10f9b9: 39 c3 cmp %eax,%ebx
10f9bb: 77 5f ja 10fa1c <rtems_task_set_priority+0x7c>
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
10f9bd: 85 f6 test %esi,%esi
10f9bf: 74 67 je 10fa28 <rtems_task_set_priority+0x88>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
10f9c1: 83 ec 08 sub $0x8,%esp
10f9c4: 8d 45 f4 lea -0xc(%ebp),%eax
10f9c7: 50 push %eax
10f9c8: ff 75 08 pushl 0x8(%ebp)
10f9cb: e8 c0 20 00 00 call 111a90 <_Thread_Get>
switch ( location ) {
10f9d0: 83 c4 10 add $0x10,%esp
10f9d3: 8b 55 f4 mov -0xc(%ebp),%edx
10f9d6: 85 d2 test %edx,%edx
10f9d8: 75 36 jne 10fa10 <rtems_task_set_priority+0x70>
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
10f9da: 8b 50 14 mov 0x14(%eax),%edx
10f9dd: 89 16 mov %edx,(%esi)
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
10f9df: 85 db test %ebx,%ebx
10f9e1: 74 1c je 10f9ff <rtems_task_set_priority+0x5f>
the_thread->real_priority = new_priority;
10f9e3: 89 58 18 mov %ebx,0x18(%eax)
if ( the_thread->resource_count == 0 ||
10f9e6: 8b 48 1c mov 0x1c(%eax),%ecx
10f9e9: 85 c9 test %ecx,%ecx
10f9eb: 74 05 je 10f9f2 <rtems_task_set_priority+0x52>
10f9ed: 3b 58 14 cmp 0x14(%eax),%ebx
10f9f0: 73 0d jae 10f9ff <rtems_task_set_priority+0x5f><== ALWAYS TAKEN
the_thread->current_priority > new_priority )
_Thread_Change_priority( the_thread, new_priority, false );
10f9f2: 52 push %edx
10f9f3: 6a 00 push $0x0
10f9f5: 53 push %ebx
10f9f6: 50 push %eax
10f9f7: e8 bc 1b 00 00 call 1115b8 <_Thread_Change_priority>
10f9fc: 83 c4 10 add $0x10,%esp
}
_Thread_Enable_dispatch();
10f9ff: e8 68 20 00 00 call 111a6c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10fa04: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10fa06: 8d 65 f8 lea -0x8(%ebp),%esp
10fa09: 5b pop %ebx
10fa0a: 5e pop %esi
10fa0b: c9 leave
10fa0c: c3 ret
10fa0d: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10fa10: b8 04 00 00 00 mov $0x4,%eax
}
10fa15: 8d 65 f8 lea -0x8(%ebp),%esp
10fa18: 5b pop %ebx
10fa19: 5e pop %esi
10fa1a: c9 leave
10fa1b: c3 ret
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
10fa1c: b8 13 00 00 00 mov $0x13,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10fa21: 8d 65 f8 lea -0x8(%ebp),%esp
10fa24: 5b pop %ebx
10fa25: 5e pop %esi
10fa26: c9 leave
10fa27: c3 ret
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
return RTEMS_INVALID_ADDRESS;
10fa28: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10fa2d: 8d 65 f8 lea -0x8(%ebp),%esp
10fa30: 5b pop %ebx
10fa31: 5e pop %esi
10fa32: c9 leave
10fa33: c3 ret
0010baf4 <rtems_task_start>:
rtems_status_code rtems_task_start(
rtems_id id,
rtems_task_entry entry_point,
rtems_task_argument argument
)
{
10baf4: 55 push %ebp
10baf5: 89 e5 mov %esp,%ebp
10baf7: 53 push %ebx
10baf8: 83 ec 14 sub $0x14,%esp
10bafb: 8b 5d 0c mov 0xc(%ebp),%ebx
register Thread_Control *the_thread;
Objects_Locations location;
if ( entry_point == NULL )
10bafe: 85 db test %ebx,%ebx
10bb00: 74 4e je 10bb50 <rtems_task_start+0x5c>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
10bb02: 83 ec 08 sub $0x8,%esp
10bb05: 8d 45 f4 lea -0xc(%ebp),%eax
10bb08: 50 push %eax
10bb09: ff 75 08 pushl 0x8(%ebp)
10bb0c: e8 07 1e 00 00 call 10d918 <_Thread_Get>
switch ( location ) {
10bb11: 83 c4 10 add $0x10,%esp
10bb14: 8b 55 f4 mov -0xc(%ebp),%edx
10bb17: 85 d2 test %edx,%edx
10bb19: 75 29 jne 10bb44 <rtems_task_start+0x50>
case OBJECTS_LOCAL:
if ( _Thread_Start(
10bb1b: 83 ec 0c sub $0xc,%esp
10bb1e: ff 75 10 pushl 0x10(%ebp)
10bb21: 6a 00 push $0x0
10bb23: 53 push %ebx
10bb24: 6a 00 push $0x0
10bb26: 50 push %eax
10bb27: e8 d8 27 00 00 call 10e304 <_Thread_Start>
10bb2c: 83 c4 20 add $0x20,%esp
10bb2f: 84 c0 test %al,%al
10bb31: 75 29 jne 10bb5c <rtems_task_start+0x68>
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
10bb33: e8 bc 1d 00 00 call 10d8f4 <_Thread_Enable_dispatch>
return RTEMS_INCORRECT_STATE;
10bb38: b8 0e 00 00 00 mov $0xe,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10bb3d: 8b 5d fc mov -0x4(%ebp),%ebx
10bb40: c9 leave
10bb41: c3 ret
10bb42: 66 90 xchg %ax,%ax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10bb44: b8 04 00 00 00 mov $0x4,%eax
}
10bb49: 8b 5d fc mov -0x4(%ebp),%ebx
10bb4c: c9 leave
10bb4d: c3 ret
10bb4e: 66 90 xchg %ax,%ax
{
register Thread_Control *the_thread;
Objects_Locations location;
if ( entry_point == NULL )
return RTEMS_INVALID_ADDRESS;
10bb50: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10bb55: 8b 5d fc mov -0x4(%ebp),%ebx
10bb58: c9 leave
10bb59: c3 ret
10bb5a: 66 90 xchg %ax,%ax
switch ( location ) {
case OBJECTS_LOCAL:
if ( _Thread_Start(
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
10bb5c: e8 93 1d 00 00 call 10d8f4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10bb61: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10bb63: 8b 5d fc mov -0x4(%ebp),%ebx
10bb66: c9 leave
10bb67: c3 ret
00110f40 <rtems_task_suspend>:
*/
rtems_status_code rtems_task_suspend(
rtems_id id
)
{
110f40: 55 push %ebp
110f41: 89 e5 mov %esp,%ebp
110f43: 83 ec 20 sub $0x20,%esp
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
110f46: 8d 45 f4 lea -0xc(%ebp),%eax
110f49: 50 push %eax
110f4a: ff 75 08 pushl 0x8(%ebp)
110f4d: e8 c6 c9 ff ff call 10d918 <_Thread_Get>
switch ( location ) {
110f52: 83 c4 10 add $0x10,%esp
110f55: 8b 55 f4 mov -0xc(%ebp),%edx
110f58: 85 d2 test %edx,%edx
110f5a: 74 08 je 110f64 <rtems_task_suspend+0x24>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
110f5c: b8 04 00 00 00 mov $0x4,%eax
}
110f61: c9 leave
110f62: c3 ret
110f63: 90 nop
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_States_Is_suspended( the_thread->current_state ) ) {
110f64: f6 40 10 02 testb $0x2,0x10(%eax)
110f68: 74 0e je 110f78 <rtems_task_suspend+0x38>
_Thread_Suspend( the_thread );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
110f6a: e8 85 c9 ff ff call 10d8f4 <_Thread_Enable_dispatch>
return RTEMS_ALREADY_SUSPENDED;
110f6f: b8 0f 00 00 00 mov $0xf,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
110f74: c9 leave
110f75: c3 ret
110f76: 66 90 xchg %ax,%ax
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_States_Is_suspended( the_thread->current_state ) ) {
_Thread_Suspend( the_thread );
110f78: 83 ec 0c sub $0xc,%esp
110f7b: 50 push %eax
110f7c: e8 f7 09 00 00 call 111978 <_Thread_Suspend>
_Thread_Enable_dispatch();
110f81: e8 6e c9 ff ff call 10d8f4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
110f86: 83 c4 10 add $0x10,%esp
110f89: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
110f8b: c9 leave
110f8c: c3 ret
0010c650 <rtems_task_variable_add>:
rtems_status_code rtems_task_variable_add(
rtems_id tid,
void **ptr,
void (*dtor)(void *)
)
{
10c650: 55 push %ebp
10c651: 89 e5 mov %esp,%ebp
10c653: 57 push %edi
10c654: 56 push %esi
10c655: 53 push %ebx
10c656: 83 ec 1c sub $0x1c,%esp
10c659: 8b 5d 0c mov 0xc(%ebp),%ebx
10c65c: 8b 7d 10 mov 0x10(%ebp),%edi
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *new;
if ( !ptr )
10c65f: 85 db test %ebx,%ebx
10c661: 0f 84 9d 00 00 00 je 10c704 <rtems_task_variable_add+0xb4>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
10c667: 83 ec 08 sub $0x8,%esp
10c66a: 8d 45 e4 lea -0x1c(%ebp),%eax
10c66d: 50 push %eax
10c66e: ff 75 08 pushl 0x8(%ebp)
10c671: e8 b2 1f 00 00 call 10e628 <_Thread_Get>
10c676: 89 c6 mov %eax,%esi
switch (location) {
10c678: 83 c4 10 add $0x10,%esp
10c67b: 8b 45 e4 mov -0x1c(%ebp),%eax
10c67e: 85 c0 test %eax,%eax
10c680: 74 0e je 10c690 <rtems_task_variable_add+0x40>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10c682: b8 04 00 00 00 mov $0x4,%eax
}
10c687: 8d 65 f4 lea -0xc(%ebp),%esp
10c68a: 5b pop %ebx
10c68b: 5e pop %esi
10c68c: 5f pop %edi
10c68d: c9 leave
10c68e: c3 ret
10c68f: 90 nop
case OBJECTS_LOCAL:
/*
* Figure out if the variable is already in this task's list.
*/
tvp = the_thread->task_variables;
10c690: 8b 86 f4 00 00 00 mov 0xf4(%esi),%eax
while (tvp) {
10c696: 85 c0 test %eax,%eax
10c698: 75 44 jne 10c6de <rtems_task_variable_add+0x8e>
10c69a: 66 90 xchg %ax,%ax
/*
* Now allocate memory for this task variable.
*/
new = (rtems_task_variable_t *)
_Workspace_Allocate(sizeof(rtems_task_variable_t));
10c69c: 83 ec 0c sub $0xc,%esp
10c69f: 6a 14 push $0x14
10c6a1: e8 ca 2f 00 00 call 10f670 <_Workspace_Allocate>
if (new == NULL) {
10c6a6: 83 c4 10 add $0x10,%esp
10c6a9: 85 c0 test %eax,%eax
10c6ab: 74 4b je 10c6f8 <rtems_task_variable_add+0xa8>
_Thread_Enable_dispatch();
return RTEMS_NO_MEMORY;
}
new->gval = *ptr;
10c6ad: 8b 13 mov (%ebx),%edx
10c6af: 89 50 08 mov %edx,0x8(%eax)
new->ptr = ptr;
10c6b2: 89 58 04 mov %ebx,0x4(%eax)
new->dtor = dtor;
10c6b5: 89 78 10 mov %edi,0x10(%eax)
new->next = (struct rtems_task_variable_tt *)the_thread->task_variables;
10c6b8: 8b 96 f4 00 00 00 mov 0xf4(%esi),%edx
10c6be: 89 10 mov %edx,(%eax)
the_thread->task_variables = new;
10c6c0: 89 86 f4 00 00 00 mov %eax,0xf4(%esi)
_Thread_Enable_dispatch();
10c6c6: e8 39 1f 00 00 call 10e604 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c6cb: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c6cd: 8d 65 f4 lea -0xc(%ebp),%esp
10c6d0: 5b pop %ebx
10c6d1: 5e pop %esi
10c6d2: 5f pop %edi
10c6d3: c9 leave
10c6d4: c3 ret
10c6d5: 8d 76 00 lea 0x0(%esi),%esi
if (tvp->ptr == ptr) {
tvp->dtor = dtor;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
10c6d8: 8b 00 mov (%eax),%eax
case OBJECTS_LOCAL:
/*
* Figure out if the variable is already in this task's list.
*/
tvp = the_thread->task_variables;
while (tvp) {
10c6da: 85 c0 test %eax,%eax
10c6dc: 74 be je 10c69c <rtems_task_variable_add+0x4c>
if (tvp->ptr == ptr) {
10c6de: 39 58 04 cmp %ebx,0x4(%eax)
10c6e1: 75 f5 jne 10c6d8 <rtems_task_variable_add+0x88>
tvp->dtor = dtor;
10c6e3: 89 78 10 mov %edi,0x10(%eax)
_Thread_Enable_dispatch();
10c6e6: e8 19 1f 00 00 call 10e604 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c6eb: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c6ed: 8d 65 f4 lea -0xc(%ebp),%esp
10c6f0: 5b pop %ebx
10c6f1: 5e pop %esi
10c6f2: 5f pop %edi
10c6f3: c9 leave
10c6f4: c3 ret
10c6f5: 8d 76 00 lea 0x0(%esi),%esi
* Now allocate memory for this task variable.
*/
new = (rtems_task_variable_t *)
_Workspace_Allocate(sizeof(rtems_task_variable_t));
if (new == NULL) {
_Thread_Enable_dispatch();
10c6f8: e8 07 1f 00 00 call 10e604 <_Thread_Enable_dispatch>
return RTEMS_NO_MEMORY;
10c6fd: b8 1a 00 00 00 mov $0x1a,%eax
10c702: eb 83 jmp 10c687 <rtems_task_variable_add+0x37>
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *new;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
10c704: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c709: 8d 65 f4 lea -0xc(%ebp),%esp
10c70c: 5b pop %ebx
10c70d: 5e pop %esi
10c70e: 5f pop %edi
10c70f: c9 leave
10c710: c3 ret
0010c714 <rtems_task_variable_delete>:
rtems_status_code rtems_task_variable_delete(
rtems_id tid,
void **ptr
)
{
10c714: 55 push %ebp
10c715: 89 e5 mov %esp,%ebp
10c717: 53 push %ebx
10c718: 83 ec 14 sub $0x14,%esp
10c71b: 8b 5d 0c mov 0xc(%ebp),%ebx
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
10c71e: 85 db test %ebx,%ebx
10c720: 74 76 je 10c798 <rtems_task_variable_delete+0x84>
return RTEMS_INVALID_ADDRESS;
prev = NULL;
the_thread = _Thread_Get (tid, &location);
10c722: 83 ec 08 sub $0x8,%esp
10c725: 8d 45 f4 lea -0xc(%ebp),%eax
10c728: 50 push %eax
10c729: ff 75 08 pushl 0x8(%ebp)
10c72c: e8 f7 1e 00 00 call 10e628 <_Thread_Get>
switch (location) {
10c731: 83 c4 10 add $0x10,%esp
10c734: 8b 55 f4 mov -0xc(%ebp),%edx
10c737: 85 d2 test %edx,%edx
10c739: 74 0d je 10c748 <rtems_task_variable_delete+0x34>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10c73b: b8 04 00 00 00 mov $0x4,%eax
}
10c740: 8b 5d fc mov -0x4(%ebp),%ebx
10c743: c9 leave
10c744: c3 ret
10c745: 8d 76 00 lea 0x0(%esi),%esi
the_thread = _Thread_Get (tid, &location);
switch (location) {
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
10c748: 8b 88 f4 00 00 00 mov 0xf4(%eax),%ecx
while (tvp) {
10c74e: 85 c9 test %ecx,%ecx
10c750: 74 17 je 10c769 <rtems_task_variable_delete+0x55>
if (tvp->ptr == ptr) {
10c752: 39 59 04 cmp %ebx,0x4(%ecx)
10c755: 75 0c jne 10c763 <rtems_task_variable_delete+0x4f>
10c757: eb 49 jmp 10c7a2 <rtems_task_variable_delete+0x8e>
10c759: 8d 76 00 lea 0x0(%esi),%esi
10c75c: 39 5a 04 cmp %ebx,0x4(%edx)
10c75f: 74 17 je 10c778 <rtems_task_variable_delete+0x64>
10c761: 89 d1 mov %edx,%ecx
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
10c763: 8b 11 mov (%ecx),%edx
the_thread = _Thread_Get (tid, &location);
switch (location) {
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
10c765: 85 d2 test %edx,%edx
10c767: 75 f3 jne 10c75c <rtems_task_variable_delete+0x48><== ALWAYS TAKEN
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
10c769: e8 96 1e 00 00 call 10e604 <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
10c76e: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c773: 8b 5d fc mov -0x4(%ebp),%ebx
10c776: c9 leave
10c777: c3 ret
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
if (tvp->ptr == ptr) {
if (prev)
prev->next = tvp->next;
10c778: 8b 1a mov (%edx),%ebx
10c77a: 89 19 mov %ebx,(%ecx)
else
the_thread->task_variables = (rtems_task_variable_t *)tvp->next;
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
10c77c: 83 ec 08 sub $0x8,%esp
10c77f: 52 push %edx
10c780: 50 push %eax
10c781: e8 b2 00 00 00 call 10c838 <_RTEMS_Tasks_Invoke_task_variable_dtor>
_Thread_Enable_dispatch();
10c786: e8 79 1e 00 00 call 10e604 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c78b: 83 c4 10 add $0x10,%esp
10c78e: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c790: 8b 5d fc mov -0x4(%ebp),%ebx
10c793: c9 leave
10c794: c3 ret
10c795: 8d 76 00 lea 0x0(%esi),%esi
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
10c798: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c79d: 8b 5d fc mov -0x4(%ebp),%ebx
10c7a0: c9 leave
10c7a1: c3 ret
while (tvp) {
if (tvp->ptr == ptr) {
if (prev)
prev->next = tvp->next;
else
the_thread->task_variables = (rtems_task_variable_t *)tvp->next;
10c7a2: 8b 11 mov (%ecx),%edx
10c7a4: 89 90 f4 00 00 00 mov %edx,0xf4(%eax)
10c7aa: 89 ca mov %ecx,%edx
10c7ac: eb ce jmp 10c77c <rtems_task_variable_delete+0x68>
0010c7b0 <rtems_task_variable_get>:
rtems_status_code rtems_task_variable_get(
rtems_id tid,
void **ptr,
void **result
)
{
10c7b0: 55 push %ebp
10c7b1: 89 e5 mov %esp,%ebp
10c7b3: 56 push %esi
10c7b4: 53 push %ebx
10c7b5: 83 ec 10 sub $0x10,%esp
10c7b8: 8b 5d 0c mov 0xc(%ebp),%ebx
10c7bb: 8b 75 10 mov 0x10(%ebp),%esi
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
10c7be: 85 db test %ebx,%ebx
10c7c0: 74 56 je 10c818 <rtems_task_variable_get+0x68>
return RTEMS_INVALID_ADDRESS;
if ( !result )
10c7c2: 85 f6 test %esi,%esi
10c7c4: 74 52 je 10c818 <rtems_task_variable_get+0x68>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
10c7c6: 83 ec 08 sub $0x8,%esp
10c7c9: 8d 45 f4 lea -0xc(%ebp),%eax
10c7cc: 50 push %eax
10c7cd: ff 75 08 pushl 0x8(%ebp)
10c7d0: e8 53 1e 00 00 call 10e628 <_Thread_Get>
switch (location) {
10c7d5: 83 c4 10 add $0x10,%esp
10c7d8: 8b 55 f4 mov -0xc(%ebp),%edx
10c7db: 85 d2 test %edx,%edx
10c7dd: 75 2d jne 10c80c <rtems_task_variable_get+0x5c>
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
10c7df: 8b 80 f4 00 00 00 mov 0xf4(%eax),%eax
while (tvp) {
10c7e5: 85 c0 test %eax,%eax
10c7e7: 75 09 jne 10c7f2 <rtems_task_variable_get+0x42>
10c7e9: eb 39 jmp 10c824 <rtems_task_variable_get+0x74>
10c7eb: 90 nop
*/
*result = tvp->tval;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
10c7ec: 8b 00 mov (%eax),%eax
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
while (tvp) {
10c7ee: 85 c0 test %eax,%eax
10c7f0: 74 32 je 10c824 <rtems_task_variable_get+0x74><== NEVER TAKEN
if (tvp->ptr == ptr) {
10c7f2: 39 58 04 cmp %ebx,0x4(%eax)
10c7f5: 75 f5 jne 10c7ec <rtems_task_variable_get+0x3c>
/*
* Should this return the current (i.e not the
* saved) value if `tid' is the current task?
*/
*result = tvp->tval;
10c7f7: 8b 40 0c mov 0xc(%eax),%eax
10c7fa: 89 06 mov %eax,(%esi)
_Thread_Enable_dispatch();
10c7fc: e8 03 1e 00 00 call 10e604 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c801: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c803: 8d 65 f8 lea -0x8(%ebp),%esp
10c806: 5b pop %ebx
10c807: 5e pop %esi
10c808: c9 leave
10c809: c3 ret
10c80a: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10c80c: b8 04 00 00 00 mov $0x4,%eax
}
10c811: 8d 65 f8 lea -0x8(%ebp),%esp
10c814: 5b pop %ebx
10c815: 5e pop %esi
10c816: c9 leave
10c817: c3 ret
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
if ( !result )
return RTEMS_INVALID_ADDRESS;
10c818: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c81d: 8d 65 f8 lea -0x8(%ebp),%esp
10c820: 5b pop %ebx
10c821: 5e pop %esi
10c822: c9 leave
10c823: c3 ret
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
10c824: e8 db 1d 00 00 call 10e604 <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
10c829: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c82e: 8d 65 f8 lea -0x8(%ebp),%esp
10c831: 5b pop %ebx
10c832: 5e pop %esi
10c833: c9 leave
10c834: c3 ret
0010c9cc <rtems_task_wake_when>:
*/
rtems_status_code rtems_task_wake_when(
rtems_time_of_day *time_buffer
)
{
10c9cc: 55 push %ebp
10c9cd: 89 e5 mov %esp,%ebp
10c9cf: 53 push %ebx
10c9d0: 83 ec 14 sub $0x14,%esp
10c9d3: 8b 5d 08 mov 0x8(%ebp),%ebx
Watchdog_Interval seconds;
if ( !_TOD_Is_set )
10c9d6: 80 3d 44 ab 12 00 00 cmpb $0x0,0x12ab44
10c9dd: 0f 84 a9 00 00 00 je 10ca8c <rtems_task_wake_when+0xc0>
return RTEMS_NOT_DEFINED;
if ( !time_buffer )
10c9e3: 85 db test %ebx,%ebx
10c9e5: 0f 84 ad 00 00 00 je 10ca98 <rtems_task_wake_when+0xcc>
return RTEMS_INVALID_ADDRESS;
time_buffer->ticks = 0;
10c9eb: c7 43 18 00 00 00 00 movl $0x0,0x18(%ebx)
if ( !_TOD_Validate( time_buffer ) )
10c9f2: 83 ec 0c sub $0xc,%esp
10c9f5: 53 push %ebx
10c9f6: e8 c5 f3 ff ff call 10bdc0 <_TOD_Validate>
10c9fb: 83 c4 10 add $0x10,%esp
10c9fe: 84 c0 test %al,%al
10ca00: 75 0a jne 10ca0c <rtems_task_wake_when+0x40>
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( time_buffer );
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
10ca02: b8 14 00 00 00 mov $0x14,%eax
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10ca07: 8b 5d fc mov -0x4(%ebp),%ebx
10ca0a: c9 leave
10ca0b: c3 ret
time_buffer->ticks = 0;
if ( !_TOD_Validate( time_buffer ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( time_buffer );
10ca0c: 83 ec 0c sub $0xc,%esp
10ca0f: 53 push %ebx
10ca10: e8 1f f3 ff ff call 10bd34 <_TOD_To_seconds>
if ( seconds <= _TOD_Seconds_since_epoch() )
10ca15: 83 c4 10 add $0x10,%esp
10ca18: 3b 05 04 ac 12 00 cmp 0x12ac04,%eax
10ca1e: 76 e2 jbe 10ca02 <rtems_task_wake_when+0x36>
10ca20: 8b 15 30 ab 12 00 mov 0x12ab30,%edx
10ca26: 42 inc %edx
10ca27: 89 15 30 ab 12 00 mov %edx,0x12ab30
return RTEMS_INVALID_CLOCK;
_Thread_Disable_dispatch();
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
10ca2d: 83 ec 08 sub $0x8,%esp
10ca30: 6a 10 push $0x10
10ca32: ff 35 18 b1 12 00 pushl 0x12b118
10ca38: 89 45 f4 mov %eax,-0xc(%ebp)
10ca3b: e8 68 26 00 00 call 10f0a8 <_Thread_Set_state>
_Watchdog_Initialize(
&_Thread_Executing->Timer,
_Thread_Delay_ended,
_Thread_Executing->Object.id,
10ca40: 8b 15 18 b1 12 00 mov 0x12b118,%edx
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
_Thread_Disable_dispatch();
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
_Watchdog_Initialize(
10ca46: 8b 4a 08 mov 0x8(%edx),%ecx
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10ca49: c7 42 50 00 00 00 00 movl $0x0,0x50(%edx)
the_watchdog->routine = routine;
10ca50: c7 42 64 90 e6 10 00 movl $0x10e690,0x64(%edx)
the_watchdog->id = id;
10ca57: 89 4a 68 mov %ecx,0x68(%edx)
the_watchdog->user_data = user_data;
10ca5a: c7 42 6c 00 00 00 00 movl $0x0,0x6c(%edx)
&_Thread_Executing->Timer,
_Thread_Delay_ended,
_Thread_Executing->Object.id,
NULL
);
_Watchdog_Insert_seconds(
10ca61: 8b 45 f4 mov -0xc(%ebp),%eax
10ca64: 2b 05 04 ac 12 00 sub 0x12ac04,%eax
10ca6a: 89 42 54 mov %eax,0x54(%edx)
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
10ca6d: 58 pop %eax
10ca6e: 59 pop %ecx
10ca6f: 83 c2 48 add $0x48,%edx
10ca72: 52 push %edx
10ca73: 68 30 ac 12 00 push $0x12ac30
10ca78: e8 43 2c 00 00 call 10f6c0 <_Watchdog_Insert>
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
10ca7d: e8 c2 1d 00 00 call 10e844 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10ca82: 83 c4 10 add $0x10,%esp
10ca85: 31 c0 xor %eax,%eax
10ca87: e9 7b ff ff ff jmp 10ca07 <rtems_task_wake_when+0x3b>
)
{
Watchdog_Interval seconds;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
10ca8c: b8 0b 00 00 00 mov $0xb,%eax
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10ca91: 8b 5d fc mov -0x4(%ebp),%ebx
10ca94: c9 leave
10ca95: c3 ret
10ca96: 66 90 xchg %ax,%ax
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
10ca98: b8 09 00 00 00 mov $0x9,%eax
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10ca9d: 8b 5d fc mov -0x4(%ebp),%ebx
10caa0: c9 leave
10caa1: c3 ret
0010a8cc <rtems_termios_baud_to_index>:
#include <rtems/termiostypes.h>
int rtems_termios_baud_to_index(
rtems_termios_baud_t termios_baud
)
{
10a8cc: 55 push %ebp
10a8cd: 89 e5 mov %esp,%ebp
10a8cf: 8b 45 08 mov 0x8(%ebp),%eax
int baud_index;
switch (termios_baud) {
10a8d2: 83 f8 09 cmp $0x9,%eax
10a8d5: 0f 84 f1 00 00 00 je 10a9cc <rtems_termios_baud_to_index+0x100>
10a8db: 7e 37 jle 10a914 <rtems_termios_baud_to_index+0x48>
10a8dd: 83 f8 0e cmp $0xe,%eax
10a8e0: 0f 84 f6 00 00 00 je 10a9dc <rtems_termios_baud_to_index+0x110>
10a8e6: 7e 5c jle 10a944 <rtems_termios_baud_to_index+0x78>
10a8e8: 3d 02 10 00 00 cmp $0x1002,%eax
10a8ed: 0f 84 01 01 00 00 je 10a9f4 <rtems_termios_baud_to_index+0x128>
10a8f3: 0f 8e 97 00 00 00 jle 10a990 <rtems_termios_baud_to_index+0xc4>
10a8f9: 3d 03 10 00 00 cmp $0x1003,%eax
10a8fe: 0f 84 e0 00 00 00 je 10a9e4 <rtems_termios_baud_to_index+0x118>
10a904: 3d 04 10 00 00 cmp $0x1004,%eax
10a909: 75 51 jne 10a95c <rtems_termios_baud_to_index+0x90><== NEVER TAKEN
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
case B115200: baud_index = 17; break;
case B230400: baud_index = 18; break;
case B460800: baud_index = 19; break;
10a90b: b8 13 00 00 00 mov $0x13,%eax
default: baud_index = -1; break;
}
return baud_index;
}
10a910: c9 leave
10a911: c3 ret
10a912: 66 90 xchg %ax,%ax
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
10a914: 83 f8 04 cmp $0x4,%eax
10a917: 0f 84 b7 00 00 00 je 10a9d4 <rtems_termios_baud_to_index+0x108>
10a91d: 7f 45 jg 10a964 <rtems_termios_baud_to_index+0x98>
10a91f: 83 f8 01 cmp $0x1,%eax
10a922: 0f 84 8c 00 00 00 je 10a9b4 <rtems_termios_baud_to_index+0xe8>
10a928: 0f 8e de 00 00 00 jle 10aa0c <rtems_termios_baud_to_index+0x140>
10a92e: 83 f8 02 cmp $0x2,%eax
10a931: 0f 84 c5 00 00 00 je 10a9fc <rtems_termios_baud_to_index+0x130>
10a937: 83 f8 03 cmp $0x3,%eax
10a93a: 75 20 jne 10a95c <rtems_termios_baud_to_index+0x90><== NEVER TAKEN
case B0: baud_index = 0; break;
case B50: baud_index = 1; break;
case B75: baud_index = 2; break;
case B110: baud_index = 3; break;
10a93c: b8 03 00 00 00 mov $0x3,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a941: c9 leave
10a942: c3 ret
10a943: 90 nop
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
10a944: 83 f8 0b cmp $0xb,%eax
10a947: 0f 84 9f 00 00 00 je 10a9ec <rtems_termios_baud_to_index+0x120>
10a94d: 7c 39 jl 10a988 <rtems_termios_baud_to_index+0xbc>
10a94f: 83 f8 0c cmp $0xc,%eax
10a952: 74 50 je 10a9a4 <rtems_termios_baud_to_index+0xd8>
10a954: 83 f8 0d cmp $0xd,%eax
10a957: 74 62 je 10a9bb <rtems_termios_baud_to_index+0xef><== ALWAYS TAKEN
10a959: 8d 76 00 lea 0x0(%esi),%esi
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
case B115200: baud_index = 17; break;
case B230400: baud_index = 18; break;
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
10a95c: b8 ff ff ff ff mov $0xffffffff,%eax
}
return baud_index;
}
10a961: c9 leave
10a962: c3 ret
10a963: 90 nop
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
10a964: 83 f8 06 cmp $0x6,%eax
10a967: 74 43 je 10a9ac <rtems_termios_baud_to_index+0xe0>
10a969: 7c 15 jl 10a980 <rtems_termios_baud_to_index+0xb4>
10a96b: 83 f8 07 cmp $0x7,%eax
10a96e: 0f 84 90 00 00 00 je 10aa04 <rtems_termios_baud_to_index+0x138>
10a974: 83 f8 08 cmp $0x8,%eax
10a977: 75 e3 jne 10a95c <rtems_termios_baud_to_index+0x90><== NEVER TAKEN
case B110: baud_index = 3; break;
case B134: baud_index = 4; break;
case B150: baud_index = 5; break;
case B200: baud_index = 6; break;
case B300: baud_index = 7; break;
case B600: baud_index = 8; break;
10a979: b8 08 00 00 00 mov $0x8,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a97e: c9 leave
10a97f: c3 ret
case B0: baud_index = 0; break;
case B50: baud_index = 1; break;
case B75: baud_index = 2; break;
case B110: baud_index = 3; break;
case B134: baud_index = 4; break;
case B150: baud_index = 5; break;
10a980: b8 05 00 00 00 mov $0x5,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a985: c9 leave
10a986: c3 ret
10a987: 90 nop
case B150: baud_index = 5; break;
case B200: baud_index = 6; break;
case B300: baud_index = 7; break;
case B600: baud_index = 8; break;
case B1200: baud_index = 9; break;
case B1800: baud_index = 10; break;
10a988: b8 0a 00 00 00 mov $0xa,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a98d: c9 leave
10a98e: c3 ret
10a98f: 90 nop
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
10a990: 83 f8 0f cmp $0xf,%eax
10a993: 74 2f je 10a9c4 <rtems_termios_baud_to_index+0xf8>
10a995: 3d 01 10 00 00 cmp $0x1001,%eax
10a99a: 75 c0 jne 10a95c <rtems_termios_baud_to_index+0x90><== NEVER TAKEN
case B2400: baud_index = 11; break;
case B4800: baud_index = 12; break;
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
10a99c: b8 10 00 00 00 mov $0x10,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a9a1: c9 leave
10a9a2: c3 ret
10a9a3: 90 nop
case B300: baud_index = 7; break;
case B600: baud_index = 8; break;
case B1200: baud_index = 9; break;
case B1800: baud_index = 10; break;
case B2400: baud_index = 11; break;
case B4800: baud_index = 12; break;
10a9a4: b8 0c 00 00 00 mov $0xc,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a9a9: c9 leave
10a9aa: c3 ret
10a9ab: 90 nop
case B50: baud_index = 1; break;
case B75: baud_index = 2; break;
case B110: baud_index = 3; break;
case B134: baud_index = 4; break;
case B150: baud_index = 5; break;
case B200: baud_index = 6; break;
10a9ac: b8 06 00 00 00 mov $0x6,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a9b1: c9 leave
10a9b2: c3 ret
10a9b3: 90 nop
{
int baud_index;
switch (termios_baud) {
case B0: baud_index = 0; break;
case B50: baud_index = 1; break;
10a9b4: b8 01 00 00 00 mov $0x1,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a9b9: c9 leave
10a9ba: c3 ret
case B600: baud_index = 8; break;
case B1200: baud_index = 9; break;
case B1800: baud_index = 10; break;
case B2400: baud_index = 11; break;
case B4800: baud_index = 12; break;
case B9600: baud_index = 13; break;
10a9bb: b8 0d 00 00 00 mov $0xd,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a9c0: c9 leave
10a9c1: c3 ret
10a9c2: 66 90 xchg %ax,%ax
case B1800: baud_index = 10; break;
case B2400: baud_index = 11; break;
case B4800: baud_index = 12; break;
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
10a9c4: b8 0f 00 00 00 mov $0xf,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a9c9: c9 leave
10a9ca: c3 ret
10a9cb: 90 nop
case B134: baud_index = 4; break;
case B150: baud_index = 5; break;
case B200: baud_index = 6; break;
case B300: baud_index = 7; break;
case B600: baud_index = 8; break;
case B1200: baud_index = 9; break;
10a9cc: b8 09 00 00 00 mov $0x9,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a9d1: c9 leave
10a9d2: c3 ret
10a9d3: 90 nop
switch (termios_baud) {
case B0: baud_index = 0; break;
case B50: baud_index = 1; break;
case B75: baud_index = 2; break;
case B110: baud_index = 3; break;
case B134: baud_index = 4; break;
10a9d4: b8 04 00 00 00 mov $0x4,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a9d9: c9 leave
10a9da: c3 ret
10a9db: 90 nop
case B1200: baud_index = 9; break;
case B1800: baud_index = 10; break;
case B2400: baud_index = 11; break;
case B4800: baud_index = 12; break;
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
10a9dc: b8 0e 00 00 00 mov $0xe,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a9e1: c9 leave
10a9e2: c3 ret
10a9e3: 90 nop
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
case B115200: baud_index = 17; break;
case B230400: baud_index = 18; break;
10a9e4: b8 12 00 00 00 mov $0x12,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a9e9: c9 leave
10a9ea: c3 ret
10a9eb: 90 nop
case B200: baud_index = 6; break;
case B300: baud_index = 7; break;
case B600: baud_index = 8; break;
case B1200: baud_index = 9; break;
case B1800: baud_index = 10; break;
case B2400: baud_index = 11; break;
10a9ec: b8 0b 00 00 00 mov $0xb,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a9f1: c9 leave
10a9f2: c3 ret
10a9f3: 90 nop
case B4800: baud_index = 12; break;
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
case B115200: baud_index = 17; break;
10a9f4: b8 11 00 00 00 mov $0x11,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10a9f9: c9 leave
10a9fa: c3 ret
10a9fb: 90 nop
int baud_index;
switch (termios_baud) {
case B0: baud_index = 0; break;
case B50: baud_index = 1; break;
case B75: baud_index = 2; break;
10a9fc: b8 02 00 00 00 mov $0x2,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10aa01: c9 leave
10aa02: c3 ret
10aa03: 90 nop
case B75: baud_index = 2; break;
case B110: baud_index = 3; break;
case B134: baud_index = 4; break;
case B150: baud_index = 5; break;
case B200: baud_index = 6; break;
case B300: baud_index = 7; break;
10aa04: b8 07 00 00 00 mov $0x7,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10aa09: c9 leave
10aa0a: c3 ret
10aa0b: 90 nop
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
10aa0c: 85 c0 test %eax,%eax
10aa0e: 0f 85 48 ff ff ff jne 10a95c <rtems_termios_baud_to_index+0x90>
case B0: baud_index = 0; break;
10aa14: 31 c0 xor %eax,%eax
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
}
return baud_index;
}
10aa16: c9 leave
10aa17: c3 ret
00108f38 <rtems_termios_baud_to_number>:
extern rtems_assoc_t termios_assoc_table[];
int32_t rtems_termios_baud_to_number(
int termios_baud
)
{
108f38: 55 push %ebp
108f39: 89 e5 mov %esp,%ebp
108f3b: 53 push %ebx
108f3c: 83 ec 0c sub $0xc,%esp
108f3f: 8b 5d 08 mov 0x8(%ebp),%ebx
int baud;
baud = rtems_assoc_local_by_remote( termios_assoc_table, termios_baud );
108f42: 53 push %ebx
108f43: 68 20 59 12 00 push $0x125920
108f48: e8 43 6c 00 00 call 10fb90 <rtems_assoc_local_by_remote>
if ( baud == 0 && termios_baud != 0 )
108f4d: 83 c4 10 add $0x10,%esp
108f50: 85 c0 test %eax,%eax
108f52: 74 08 je 108f5c <rtems_termios_baud_to_number+0x24>
return -1;
return baud;
}
108f54: 8b 5d fc mov -0x4(%ebp),%ebx
108f57: c9 leave
108f58: c3 ret
108f59: 8d 76 00 lea 0x0(%esi),%esi
)
{
int baud;
baud = rtems_assoc_local_by_remote( termios_assoc_table, termios_baud );
if ( baud == 0 && termios_baud != 0 )
108f5c: 83 fb 01 cmp $0x1,%ebx
108f5f: 19 c0 sbb %eax,%eax
108f61: f7 d0 not %eax
108f63: eb ef jmp 108f54 <rtems_termios_baud_to_number+0x1c>
001094bc <rtems_termios_close>:
}
}
rtems_status_code
rtems_termios_close (void *arg)
{
1094bc: 55 push %ebp
1094bd: 89 e5 mov %esp,%ebp
1094bf: 56 push %esi
1094c0: 53 push %ebx
1094c1: 8b 75 08 mov 0x8(%ebp),%esi
rtems_libio_open_close_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
1094c4: 8b 06 mov (%esi),%eax
1094c6: 8b 58 34 mov 0x34(%eax),%ebx
rtems_status_code sc;
sc = rtems_semaphore_obtain(
1094c9: 52 push %edx
1094ca: 6a 00 push $0x0
1094cc: 6a 00 push $0x0
1094ce: ff 35 0c 7d 12 00 pushl 0x127d0c
1094d4: e8 d7 21 00 00 call 10b6b0 <rtems_semaphore_obtain>
rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
1094d9: 83 c4 10 add $0x10,%esp
1094dc: 85 c0 test %eax,%eax
1094de: 0f 85 9a 01 00 00 jne 10967e <rtems_termios_close+0x1c2><== NEVER TAKEN
rtems_fatal_error_occurred (sc);
if (--tty->refcount == 0) {
1094e4: 8b 43 08 mov 0x8(%ebx),%eax
1094e7: 48 dec %eax
1094e8: 89 43 08 mov %eax,0x8(%ebx)
1094eb: 85 c0 test %eax,%eax
1094ed: 0f 85 bf 00 00 00 jne 1095b2 <rtems_termios_close+0xf6>
if (rtems_termios_linesw[tty->t_line].l_close != NULL) {
1094f3: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax
1094f9: c1 e0 05 shl $0x5,%eax
1094fc: 8b 80 a4 79 12 00 mov 0x1279a4(%eax),%eax
109502: 85 c0 test %eax,%eax
109504: 0f 84 0a 01 00 00 je 109614 <rtems_termios_close+0x158>
/*
* call discipline-specific close
*/
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
10950a: 83 ec 0c sub $0xc,%esp
10950d: 53 push %ebx
10950e: ff d0 call *%eax
109510: 83 c4 10 add $0x10,%esp
}
drainOutput (tty);
rtems_semaphore_release (tty->osem);
}
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
109513: 83 bb b4 00 00 00 02 cmpl $0x2,0xb4(%ebx)
10951a: 0f 84 2c 01 00 00 je 10964c <rtems_termios_close+0x190><== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_event_send( tty->txTaskId, TERMIOS_TX_TERMINATE_EVENT );
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
}
if (tty->device.lastClose)
109520: 8b 83 9c 00 00 00 mov 0x9c(%ebx),%eax
109526: 85 c0 test %eax,%eax
109528: 74 0d je 109537 <rtems_termios_close+0x7b>
(*tty->device.lastClose)(tty->major, tty->minor, arg);
10952a: 51 push %ecx
10952b: 56 push %esi
10952c: ff 73 10 pushl 0x10(%ebx)
10952f: ff 73 0c pushl 0xc(%ebx)
109532: ff d0 call *%eax
109534: 83 c4 10 add $0x10,%esp
if (tty->forw == NULL) {
109537: 8b 03 mov (%ebx),%eax
109539: 85 c0 test %eax,%eax
10953b: 0f 84 b7 00 00 00 je 1095f8 <rtems_termios_close+0x13c>
rtems_termios_ttyTail = tty->back;
if ( rtems_termios_ttyTail != NULL ) {
rtems_termios_ttyTail->forw = NULL;
}
} else {
tty->forw->back = tty->back;
109541: 8b 53 04 mov 0x4(%ebx),%edx
109544: 89 50 04 mov %edx,0x4(%eax)
109547: 8b 53 04 mov 0x4(%ebx),%edx
}
if (tty->back == NULL) {
10954a: 85 d2 test %edx,%edx
10954c: 0f 84 8a 00 00 00 je 1095dc <rtems_termios_close+0x120><== ALWAYS TAKEN
rtems_termios_ttyHead = tty->forw;
if ( rtems_termios_ttyHead != NULL ) {
rtems_termios_ttyHead->back = NULL;
}
} else {
tty->back->forw = tty->forw;
109552: 89 02 mov %eax,(%edx)
}
rtems_semaphore_delete (tty->isem);
109554: 83 ec 0c sub $0xc,%esp
109557: ff 73 14 pushl 0x14(%ebx)
10955a: e8 ad 20 00 00 call 10b60c <rtems_semaphore_delete>
rtems_semaphore_delete (tty->osem);
10955f: 5a pop %edx
109560: ff 73 18 pushl 0x18(%ebx)
109563: e8 a4 20 00 00 call 10b60c <rtems_semaphore_delete>
rtems_semaphore_delete (tty->rawOutBuf.Semaphore);
109568: 58 pop %eax
109569: ff b3 8c 00 00 00 pushl 0x8c(%ebx)
10956f: e8 98 20 00 00 call 10b60c <rtems_semaphore_delete>
if ((tty->device.pollRead == NULL) ||
109574: 83 c4 10 add $0x10,%esp
109577: 8b b3 a0 00 00 00 mov 0xa0(%ebx),%esi
10957d: 85 f6 test %esi,%esi
10957f: 74 4b je 1095cc <rtems_termios_close+0x110>
109581: 83 bb b4 00 00 00 02 cmpl $0x2,0xb4(%ebx)
109588: 74 42 je 1095cc <rtems_termios_close+0x110>
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN))
rtems_semaphore_delete (tty->rawInBuf.Semaphore);
free (tty->rawInBuf.theBuf);
10958a: 83 ec 0c sub $0xc,%esp
10958d: ff 73 58 pushl 0x58(%ebx)
109590: e8 1f eb ff ff call 1080b4 <free>
free (tty->rawOutBuf.theBuf);
109595: 59 pop %ecx
109596: ff 73 7c pushl 0x7c(%ebx)
109599: e8 16 eb ff ff call 1080b4 <free>
free (tty->cbuf);
10959e: 5a pop %edx
10959f: ff 73 1c pushl 0x1c(%ebx)
1095a2: e8 0d eb ff ff call 1080b4 <free>
free (tty);
1095a7: 89 1c 24 mov %ebx,(%esp)
1095aa: e8 05 eb ff ff call 1080b4 <free>
1095af: 83 c4 10 add $0x10,%esp
}
rtems_semaphore_release (rtems_termios_ttyMutex);
1095b2: 83 ec 0c sub $0xc,%esp
1095b5: ff 35 0c 7d 12 00 pushl 0x127d0c
1095bb: e8 ec 21 00 00 call 10b7ac <rtems_semaphore_release>
return RTEMS_SUCCESSFUL;
}
1095c0: 31 c0 xor %eax,%eax
1095c2: 8d 65 f8 lea -0x8(%ebp),%esp
1095c5: 5b pop %ebx
1095c6: 5e pop %esi
1095c7: c9 leave
1095c8: c3 ret
1095c9: 8d 76 00 lea 0x0(%esi),%esi
rtems_semaphore_delete (tty->isem);
rtems_semaphore_delete (tty->osem);
rtems_semaphore_delete (tty->rawOutBuf.Semaphore);
if ((tty->device.pollRead == NULL) ||
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN))
rtems_semaphore_delete (tty->rawInBuf.Semaphore);
1095cc: 83 ec 0c sub $0xc,%esp
1095cf: ff 73 68 pushl 0x68(%ebx)
1095d2: e8 35 20 00 00 call 10b60c <rtems_semaphore_delete>
1095d7: 83 c4 10 add $0x10,%esp
1095da: eb ae jmp 10958a <rtems_termios_close+0xce>
} else {
tty->forw->back = tty->back;
}
if (tty->back == NULL) {
rtems_termios_ttyHead = tty->forw;
1095dc: a3 14 7d 12 00 mov %eax,0x127d14
if ( rtems_termios_ttyHead != NULL ) {
1095e1: 85 c0 test %eax,%eax
1095e3: 0f 84 6b ff ff ff je 109554 <rtems_termios_close+0x98>
rtems_termios_ttyHead->back = NULL;
1095e9: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)
1095f0: e9 5f ff ff ff jmp 109554 <rtems_termios_close+0x98>
1095f5: 8d 76 00 lea 0x0(%esi),%esi
rtems_fatal_error_occurred (sc);
}
if (tty->device.lastClose)
(*tty->device.lastClose)(tty->major, tty->minor, arg);
if (tty->forw == NULL) {
rtems_termios_ttyTail = tty->back;
1095f8: 8b 53 04 mov 0x4(%ebx),%edx
1095fb: 89 15 10 7d 12 00 mov %edx,0x127d10
if ( rtems_termios_ttyTail != NULL ) {
109601: 85 d2 test %edx,%edx
109603: 74 d7 je 1095dc <rtems_termios_close+0x120>
rtems_termios_ttyTail->forw = NULL;
109605: c7 02 00 00 00 00 movl $0x0,(%edx)
10960b: 8b 03 mov (%ebx),%eax
10960d: e9 40 ff ff ff jmp 109552 <rtems_termios_close+0x96>
109612: 66 90 xchg %ax,%ax
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
} else {
/*
* default: just flush output buffer
*/
sc = rtems_semaphore_obtain(tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
109614: 50 push %eax
109615: 6a 00 push $0x0
109617: 6a 00 push $0x0
109619: ff 73 18 pushl 0x18(%ebx)
10961c: e8 8f 20 00 00 call 10b6b0 <rtems_semaphore_obtain>
if (sc != RTEMS_SUCCESSFUL) {
109621: 83 c4 10 add $0x10,%esp
109624: 85 c0 test %eax,%eax
109626: 75 56 jne 10967e <rtems_termios_close+0x1c2><== NEVER TAKEN
rtems_fatal_error_occurred (sc);
}
drainOutput (tty);
109628: 89 d8 mov %ebx,%eax
10962a: e8 75 f9 ff ff call 108fa4 <drainOutput>
rtems_semaphore_release (tty->osem);
10962f: 83 ec 0c sub $0xc,%esp
109632: ff 73 18 pushl 0x18(%ebx)
109635: e8 72 21 00 00 call 10b7ac <rtems_semaphore_release>
10963a: 83 c4 10 add $0x10,%esp
}
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
10963d: 83 bb b4 00 00 00 02 cmpl $0x2,0xb4(%ebx)
109644: 0f 85 d6 fe ff ff jne 109520 <rtems_termios_close+0x64>
10964a: 66 90 xchg %ax,%ax
/*
* send "terminate" to I/O tasks
*/
sc = rtems_event_send( tty->rxTaskId, TERMIOS_RX_TERMINATE_EVENT );
10964c: 83 ec 08 sub $0x8,%esp
10964f: 6a 01 push $0x1
109651: ff b3 c4 00 00 00 pushl 0xc4(%ebx)
109657: e8 40 1b 00 00 call 10b19c <rtems_event_send>
if (sc != RTEMS_SUCCESSFUL)
10965c: 83 c4 10 add $0x10,%esp
10965f: 85 c0 test %eax,%eax
109661: 75 1b jne 10967e <rtems_termios_close+0x1c2><== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_event_send( tty->txTaskId, TERMIOS_TX_TERMINATE_EVENT );
109663: 83 ec 08 sub $0x8,%esp
109666: 6a 01 push $0x1
109668: ff b3 c8 00 00 00 pushl 0xc8(%ebx)
10966e: e8 29 1b 00 00 call 10b19c <rtems_event_send>
if (sc != RTEMS_SUCCESSFUL)
109673: 83 c4 10 add $0x10,%esp
109676: 85 c0 test %eax,%eax
109678: 0f 84 a2 fe ff ff je 109520 <rtems_termios_close+0x64><== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
10967e: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
109681: 50 push %eax <== NOT EXECUTED
109682: e8 79 26 00 00 call 10bd00 <rtems_fatal_error_occurred><== NOT EXECUTED
0010ab64 <rtems_termios_dequeue_characters>:
* for each transmitted character.
* It returns number of characters left to transmit
*/
int
rtems_termios_dequeue_characters (void *ttyp, int len)
{
10ab64: 55 push %ebp
10ab65: 89 e5 mov %esp,%ebp
10ab67: 83 ec 08 sub $0x8,%esp
10ab6a: 8b 45 08 mov 0x8(%ebp),%eax
rtems_status_code sc;
/*
* sum up character count already sent
*/
tty->t_dqlen += len;
10ab6d: 8b 55 0c mov 0xc(%ebp),%edx
10ab70: 01 90 90 00 00 00 add %edx,0x90(%eax)
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
10ab76: 83 b8 b4 00 00 00 02 cmpl $0x2,0xb4(%eax)
10ab7d: 74 2d je 10abac <rtems_termios_dequeue_characters+0x48>
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
return 0; /* nothing to output in IRQ... */
}
if (tty->t_line == PPPDISC ) {
10ab7f: 83 b8 cc 00 00 00 05 cmpl $0x5,0xcc(%eax)
10ab86: 74 0c je 10ab94 <rtems_termios_dequeue_characters+0x30>
rtems_termios_linesw[tty->t_line].l_start(tty);
}
return 0; /* nothing to output in IRQ... */
}
return rtems_termios_refill_transmitter(tty);
10ab88: 89 45 08 mov %eax,0x8(%ebp)
}
10ab8b: c9 leave
rtems_termios_linesw[tty->t_line].l_start(tty);
}
return 0; /* nothing to output in IRQ... */
}
return rtems_termios_refill_transmitter(tty);
10ab8c: e9 27 fd ff ff jmp 10a8b8 <rtems_termios_refill_transmitter>
10ab91: 8d 76 00 lea 0x0(%esi),%esi
if (tty->t_line == PPPDISC ) {
/*
* call any line discipline start function
*/
if (rtems_termios_linesw[tty->t_line].l_start != NULL) {
10ab94: 8b 15 54 7a 12 00 mov 0x127a54,%edx
10ab9a: 85 d2 test %edx,%edx
10ab9c: 74 09 je 10aba7 <rtems_termios_dequeue_characters+0x43><== NEVER TAKEN
rtems_termios_linesw[tty->t_line].l_start(tty);
10ab9e: 83 ec 0c sub $0xc,%esp
10aba1: 50 push %eax
10aba2: ff d2 call *%edx
10aba4: 83 c4 10 add $0x10,%esp
}
return 0; /* nothing to output in IRQ... */
}
return rtems_termios_refill_transmitter(tty);
}
10aba7: 31 c0 xor %eax,%eax
10aba9: c9 leave
10abaa: c3 ret
10abab: 90 nop
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
/*
* send wake up to transmitter task
*/
sc = rtems_event_send(tty->txTaskId, TERMIOS_TX_START_EVENT);
10abac: 83 ec 08 sub $0x8,%esp
10abaf: 6a 02 push $0x2
10abb1: ff b0 c8 00 00 00 pushl 0xc8(%eax)
10abb7: e8 e0 05 00 00 call 10b19c <rtems_event_send>
if (sc != RTEMS_SUCCESSFUL)
10abbc: 83 c4 10 add $0x10,%esp
10abbf: 85 c0 test %eax,%eax
10abc1: 74 e4 je 10aba7 <rtems_termios_dequeue_characters+0x43><== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
10abc3: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10abc6: 50 push %eax <== NOT EXECUTED
10abc7: e8 34 11 00 00 call 10bd00 <rtems_fatal_error_occurred><== NOT EXECUTED
0010a540 <rtems_termios_enqueue_raw_characters>:
* device receive interrupt handler.
* Returns the number of characters dropped because of overflow.
*/
int
rtems_termios_enqueue_raw_characters (void *ttyp, char *buf, int len)
{
10a540: 55 push %ebp
10a541: 89 e5 mov %esp,%ebp
10a543: 57 push %edi
10a544: 56 push %esi
10a545: 53 push %ebx
10a546: 83 ec 3c sub $0x3c,%esp
10a549: 8b 5d 08 mov 0x8(%ebp),%ebx
10a54c: 8b 75 0c mov 0xc(%ebp),%esi
char c;
int dropped = 0;
bool flow_rcv = false; /* true, if flow control char received */
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
10a54f: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax
10a555: c1 e0 05 shl $0x5,%eax
10a558: 8b 80 b0 79 12 00 mov 0x1279b0(%eax),%eax
10a55e: 85 c0 test %eax,%eax
10a560: 0f 84 8a 00 00 00 je 10a5f0 <rtems_termios_enqueue_raw_characters+0xb0>
while (len--) {
10a566: 8b 4d 10 mov 0x10(%ebp),%ecx
10a569: 85 c9 test %ecx,%ecx
10a56b: 74 2a je 10a597 <rtems_termios_enqueue_raw_characters+0x57><== NEVER TAKEN
10a56d: 31 ff xor %edi,%edi
10a56f: eb 12 jmp 10a583 <rtems_termios_enqueue_raw_characters+0x43>
10a571: 8d 76 00 lea 0x0(%esi),%esi
10a574: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax
10a57a: c1 e0 05 shl $0x5,%eax
10a57d: 8b 80 b0 79 12 00 mov 0x1279b0(%eax),%eax
c = *buf++;
rtems_termios_linesw[tty->t_line].l_rint(c,tty);
10a583: 83 ec 08 sub $0x8,%esp
10a586: 53 push %ebx
10a587: 0f be 14 3e movsbl (%esi,%edi,1),%edx
10a58b: 52 push %edx
10a58c: ff d0 call *%eax
10a58e: 47 inc %edi
int dropped = 0;
bool flow_rcv = false; /* true, if flow control char received */
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
while (len--) {
10a58f: 83 c4 10 add $0x10,%esp
10a592: 3b 7d 10 cmp 0x10(%ebp),%edi
10a595: 75 dd jne 10a574 <rtems_termios_enqueue_raw_characters+0x34>
}
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
10a597: 8b 93 e4 00 00 00 mov 0xe4(%ebx),%edx
10a59d: 85 d2 test %edx,%edx
10a59f: 75 3b jne 10a5dc <rtems_termios_enqueue_raw_characters+0x9c><== NEVER TAKEN
10a5a1: 8b 83 dc 00 00 00 mov 0xdc(%ebx),%eax
10a5a7: 85 c0 test %eax,%eax
10a5a9: 74 31 je 10a5dc <rtems_termios_enqueue_raw_characters+0x9c><== NEVER TAKEN
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
10a5ab: 83 ec 08 sub $0x8,%esp
10a5ae: ff b3 e0 00 00 00 pushl 0xe0(%ebx)
10a5b4: 8d 53 30 lea 0x30(%ebx),%edx
10a5b7: 52 push %edx
10a5b8: ff d0 call *%eax
tty->tty_rcvwakeup = 1;
10a5ba: c7 83 e4 00 00 00 01 movl $0x1,0xe4(%ebx)
10a5c1: 00 00 00
10a5c4: 83 c4 10 add $0x10,%esp
}
return 0;
10a5c7: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
}
tty->rawInBufDropped += dropped;
rtems_semaphore_release (tty->rawInBuf.Semaphore);
return dropped;
}
10a5ce: 8b 45 e0 mov -0x20(%ebp),%eax
10a5d1: 8d 65 f4 lea -0xc(%ebp),%esp
10a5d4: 5b pop %ebx
10a5d5: 5e pop %esi
10a5d6: 5f pop %edi
10a5d7: c9 leave
10a5d8: c3 ret
10a5d9: 8d 76 00 lea 0x0(%esi),%esi
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
tty->tty_rcvwakeup = 1;
}
return 0;
10a5dc: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) <== NOT EXECUTED
}
tty->rawInBufDropped += dropped;
rtems_semaphore_release (tty->rawInBuf.Semaphore);
return dropped;
}
10a5e3: 8b 45 e0 mov -0x20(%ebp),%eax <== NOT EXECUTED
10a5e6: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10a5e9: 5b pop %ebx <== NOT EXECUTED
10a5ea: 5e pop %esi <== NOT EXECUTED
10a5eb: 5f pop %edi <== NOT EXECUTED
10a5ec: c9 leave <== NOT EXECUTED
10a5ed: c3 ret <== NOT EXECUTED
10a5ee: 66 90 xchg %ax,%ax <== NOT EXECUTED
char c;
int dropped = 0;
bool flow_rcv = false; /* true, if flow control char received */
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
10a5f0: 8b 7d 10 mov 0x10(%ebp),%edi
10a5f3: c6 45 db 00 movb $0x0,-0x25(%ebp)
10a5f7: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
10a5fe: 8d 43 30 lea 0x30(%ebx),%eax
10a601: 89 45 d0 mov %eax,-0x30(%ebp)
if ((tty->flow_ctrl & FL_OSTOP) ||
(tty->rawOutBufState == rob_idle)) {
/* if tx is stopped due to XOFF or out of data */
/* call write function here */
tty->flow_ctrl |= FL_ISNTXOF;
(*tty->device.write)(tty->minor,
10a604: 8d 53 4a lea 0x4a(%ebx),%edx
10a607: 89 55 cc mov %edx,-0x34(%ebp)
tty->tty_rcvwakeup = 1;
}
return 0;
}
while (len--) {
10a60a: 85 ff test %edi,%edi
10a60c: 0f 84 0b 01 00 00 je 10a71d <rtems_termios_enqueue_raw_characters+0x1dd><== NEVER TAKEN
10a612: 66 90 xchg %ax,%ax
c = *buf++;
10a614: 8a 06 mov (%esi),%al
10a616: 88 45 e7 mov %al,-0x19(%ebp)
10a619: 46 inc %esi
/* FIXME: implement IXANY: any character restarts output */
/* if incoming XON/XOFF controls outgoing stream: */
if (tty->flow_ctrl & FL_MDXON) {
10a61a: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
10a620: f6 c4 02 test $0x2,%ah
10a623: 74 1c je 10a641 <rtems_termios_enqueue_raw_characters+0x101>
/* if received char is V_STOP and V_START (both are equal value) */
if (c == tty->termios.c_cc[VSTOP]) {
10a625: 0f be 45 e7 movsbl -0x19(%ebp),%eax
10a629: 0f b6 53 4a movzbl 0x4a(%ebx),%edx
10a62d: 39 d0 cmp %edx,%eax
10a62f: 0f 84 07 01 00 00 je 10a73c <rtems_termios_enqueue_raw_characters+0x1fc>
/* stop output */
tty->flow_ctrl |= FL_ORCVXOF;
}
flow_rcv = true;
}
else if (c == tty->termios.c_cc[VSTART]) {
10a635: 0f b6 53 49 movzbl 0x49(%ebx),%edx
10a639: 39 d0 cmp %edx,%eax
10a63b: 0f 84 4f 01 00 00 je 10a790 <rtems_termios_enqueue_raw_characters+0x250><== NEVER TAKEN
/* restart output */
tty->flow_ctrl &= ~FL_ORCVXOF;
flow_rcv = true;
}
}
if (flow_rcv) {
10a641: 80 7d db 00 cmpb $0x0,-0x25(%ebp)
10a645: 0f 85 0c 01 00 00 jne 10a757 <rtems_termios_enqueue_raw_characters+0x217><== NEVER TAKEN
}
/* reenable interrupts */
rtems_interrupt_enable(level);
}
} else {
newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size;
10a64b: 8b 43 60 mov 0x60(%ebx),%eax
10a64e: 8b 53 64 mov 0x64(%ebx),%edx
10a651: 89 55 dc mov %edx,-0x24(%ebp)
10a654: 40 inc %eax
10a655: 31 d2 xor %edx,%edx
10a657: f7 75 dc divl -0x24(%ebp)
10a65a: 89 d1 mov %edx,%ecx
/* if chars_in_buffer > highwater */
rtems_interrupt_disable(level);
10a65c: 9c pushf
10a65d: fa cli
10a65e: 8f 45 d4 popl -0x2c(%ebp)
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
10a661: 8b 43 5c mov 0x5c(%ebx),%eax
10a664: 89 45 c4 mov %eax,-0x3c(%ebp)
10a667: 8b 43 64 mov 0x64(%ebx),%eax
% tty->rawInBuf.Size) > tty->highwater) &&
10a66a: 8b 53 64 mov 0x64(%ebx),%edx
10a66d: 89 55 dc mov %edx,-0x24(%ebp)
}
} else {
newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size;
/* if chars_in_buffer > highwater */
rtems_interrupt_disable(level);
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
10a670: 2b 45 c4 sub -0x3c(%ebp),%eax
10a673: 01 c8 add %ecx,%eax
% tty->rawInBuf.Size) > tty->highwater) &&
10a675: 31 d2 xor %edx,%edx
10a677: f7 75 dc divl -0x24(%ebp)
}
} else {
newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size;
/* if chars_in_buffer > highwater */
rtems_interrupt_disable(level);
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
10a67a: 3b 93 c0 00 00 00 cmp 0xc0(%ebx),%edx
10a680: 76 46 jbe 10a6c8 <rtems_termios_enqueue_raw_characters+0x188><== ALWAYS TAKEN
% tty->rawInBuf.Size) > tty->highwater) &&
!(tty->flow_ctrl & FL_IREQXOF)) {
10a682: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
} else {
newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size;
/* if chars_in_buffer > highwater */
rtems_interrupt_disable(level);
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
% tty->rawInBuf.Size) > tty->highwater) &&
10a688: a8 01 test $0x1,%al <== NOT EXECUTED
10a68a: 75 3c jne 10a6c8 <rtems_termios_enqueue_raw_characters+0x188><== NOT EXECUTED
!(tty->flow_ctrl & FL_IREQXOF)) {
/* incoming data stream should be stopped */
tty->flow_ctrl |= FL_IREQXOF;
10a68c: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10a692: 83 c8 01 or $0x1,%eax <== NOT EXECUTED
10a695: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF))
10a69b: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10a6a1: 25 02 04 00 00 and $0x402,%eax <== NOT EXECUTED
10a6a6: 3d 00 04 00 00 cmp $0x400,%eax <== NOT EXECUTED
10a6ab: 0f 84 22 01 00 00 je 10a7d3 <rtems_termios_enqueue_raw_characters+0x293><== NOT EXECUTED
/* call write function here */
tty->flow_ctrl |= FL_ISNTXOF;
(*tty->device.write)(tty->minor,
(void *)&(tty->termios.c_cc[VSTOP]), 1);
}
} else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) {
10a6b1: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10a6b7: 25 04 01 00 00 and $0x104,%eax <== NOT EXECUTED
10a6bc: 3d 00 01 00 00 cmp $0x100,%eax <== NOT EXECUTED
10a6c1: 0f 84 50 01 00 00 je 10a817 <rtems_termios_enqueue_raw_characters+0x2d7><== NOT EXECUTED
10a6c7: 90 nop <== NOT EXECUTED
}
}
}
/* reenable interrupts */
rtems_interrupt_enable(level);
10a6c8: ff 75 d4 pushl -0x2c(%ebp)
10a6cb: 9d popf
if (newTail == tty->rawInBuf.Head) {
10a6cc: 8b 43 5c mov 0x5c(%ebx),%eax
10a6cf: 39 c8 cmp %ecx,%eax
10a6d1: 0f 84 b1 00 00 00 je 10a788 <rtems_termios_enqueue_raw_characters+0x248><== NEVER TAKEN
dropped++;
} else {
tty->rawInBuf.theBuf[newTail] = c;
10a6d7: 8b 43 58 mov 0x58(%ebx),%eax
10a6da: 8a 55 e7 mov -0x19(%ebp),%dl
10a6dd: 88 14 08 mov %dl,(%eax,%ecx,1)
tty->rawInBuf.Tail = newTail;
10a6e0: 89 4b 60 mov %ecx,0x60(%ebx)
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
10a6e3: 8b 83 e4 00 00 00 mov 0xe4(%ebx),%eax
10a6e9: 85 c0 test %eax,%eax
10a6eb: 75 27 jne 10a714 <rtems_termios_enqueue_raw_characters+0x1d4><== NEVER TAKEN
10a6ed: 8b 83 dc 00 00 00 mov 0xdc(%ebx),%eax
10a6f3: 85 c0 test %eax,%eax
10a6f5: 74 1d je 10a714 <rtems_termios_enqueue_raw_characters+0x1d4><== ALWAYS TAKEN
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
10a6f7: 83 ec 08 sub $0x8,%esp <== NOT EXECUTED
10a6fa: ff b3 e0 00 00 00 pushl 0xe0(%ebx) <== NOT EXECUTED
10a700: ff 75 d0 pushl -0x30(%ebp) <== NOT EXECUTED
10a703: ff d0 call *%eax <== NOT EXECUTED
tty->tty_rcvwakeup = 1;
10a705: c7 83 e4 00 00 00 01 movl $0x1,0xe4(%ebx) <== NOT EXECUTED
10a70c: 00 00 00
10a70f: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10a712: 66 90 xchg %ax,%ax <== NOT EXECUTED
10a714: 4f dec %edi
tty->tty_rcvwakeup = 1;
}
return 0;
}
while (len--) {
10a715: 85 ff test %edi,%edi
10a717: 0f 85 f7 fe ff ff jne 10a614 <rtems_termios_enqueue_raw_characters+0xd4><== NEVER TAKEN
}
}
}
}
tty->rawInBufDropped += dropped;
10a71d: 8b 45 e0 mov -0x20(%ebp),%eax
10a720: 01 43 78 add %eax,0x78(%ebx)
rtems_semaphore_release (tty->rawInBuf.Semaphore);
10a723: 83 ec 0c sub $0xc,%esp
10a726: ff 73 68 pushl 0x68(%ebx)
10a729: e8 7e 10 00 00 call 10b7ac <rtems_semaphore_release>
return dropped;
10a72e: 83 c4 10 add $0x10,%esp
}
10a731: 8b 45 e0 mov -0x20(%ebp),%eax
10a734: 8d 65 f4 lea -0xc(%ebp),%esp
10a737: 5b pop %ebx
10a738: 5e pop %esi
10a739: 5f pop %edi
10a73a: c9 leave
10a73b: c3 ret
/* FIXME: implement IXANY: any character restarts output */
/* if incoming XON/XOFF controls outgoing stream: */
if (tty->flow_ctrl & FL_MDXON) {
/* if received char is V_STOP and V_START (both are equal value) */
if (c == tty->termios.c_cc[VSTOP]) {
if (c == tty->termios.c_cc[VSTART]) {
10a73c: 0f b6 53 49 movzbl 0x49(%ebx),%edx
10a740: 39 d0 cmp %edx,%eax
10a742: 74 7e je 10a7c2 <rtems_termios_enqueue_raw_characters+0x282><== NEVER TAKEN
tty->flow_ctrl = tty->flow_ctrl ^ FL_ORCVXOF;
}
else {
/* VSTOP received (other code than VSTART) */
/* stop output */
tty->flow_ctrl |= FL_ORCVXOF;
10a744: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
10a74a: 83 c8 10 or $0x10,%eax
10a74d: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx)
int dropped = 0;
bool flow_rcv = false; /* true, if flow control char received */
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
while (len--) {
10a753: c6 45 db 01 movb $0x1,-0x25(%ebp)
flow_rcv = true;
}
}
if (flow_rcv) {
/* restart output according to FL_ORCVXOF flag */
if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) {
10a757: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
10a75d: 83 e0 30 and $0x30,%eax
10a760: 83 f8 20 cmp $0x20,%eax
10a763: 75 af jne 10a714 <rtems_termios_enqueue_raw_characters+0x1d4><== ALWAYS TAKEN
/* disable interrupts */
rtems_interrupt_disable(level);
10a765: 9c pushf <== NOT EXECUTED
10a766: fa cli <== NOT EXECUTED
10a767: 5a pop %edx <== NOT EXECUTED
tty->flow_ctrl &= ~FL_OSTOP;
10a768: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10a76e: 83 e0 df and $0xffffffdf,%eax <== NOT EXECUTED
10a771: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
10a777: 8b 83 94 00 00 00 mov 0x94(%ebx),%eax <== NOT EXECUTED
10a77d: 85 c0 test %eax,%eax <== NOT EXECUTED
10a77f: 75 20 jne 10a7a1 <rtems_termios_enqueue_raw_characters+0x261><== NOT EXECUTED
/* if chars available, call write function... */
(*tty->device.write)(
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1);
}
/* reenable interrupts */
rtems_interrupt_enable(level);
10a781: 52 push %edx <== NOT EXECUTED
10a782: 9d popf <== NOT EXECUTED
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
tty->tty_rcvwakeup = 1;
10a783: 4f dec %edi <== NOT EXECUTED
10a784: eb 8f jmp 10a715 <rtems_termios_enqueue_raw_characters+0x1d5><== NOT EXECUTED
10a786: 66 90 xchg %ax,%ax <== NOT EXECUTED
/* reenable interrupts */
rtems_interrupt_enable(level);
if (newTail == tty->rawInBuf.Head) {
dropped++;
10a788: ff 45 e0 incl -0x20(%ebp) <== NOT EXECUTED
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
tty->tty_rcvwakeup = 1;
10a78b: 4f dec %edi <== NOT EXECUTED
10a78c: eb 87 jmp 10a715 <rtems_termios_enqueue_raw_characters+0x1d5><== NOT EXECUTED
10a78e: 66 90 xchg %ax,%ax <== NOT EXECUTED
flow_rcv = true;
}
else if (c == tty->termios.c_cc[VSTART]) {
/* VSTART received */
/* restart output */
tty->flow_ctrl &= ~FL_ORCVXOF;
10a790: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10a796: 83 e0 ef and $0xffffffef,%eax <== NOT EXECUTED
10a799: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
10a79f: eb b2 jmp 10a753 <rtems_termios_enqueue_raw_characters+0x213><== NOT EXECUTED
tty->flow_ctrl &= ~FL_OSTOP;
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
/* if chars available, call write function... */
(*tty->device.write)(
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1);
10a7a1: 8b 83 84 00 00 00 mov 0x84(%ebx),%eax <== NOT EXECUTED
rtems_interrupt_disable(level);
tty->flow_ctrl &= ~FL_OSTOP;
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
/* if chars available, call write function... */
(*tty->device.write)(
10a7a7: 51 push %ecx <== NOT EXECUTED
10a7a8: 6a 01 push $0x1 <== NOT EXECUTED
10a7aa: 03 43 7c add 0x7c(%ebx),%eax <== NOT EXECUTED
10a7ad: 50 push %eax <== NOT EXECUTED
10a7ae: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
10a7b1: 89 55 c8 mov %edx,-0x38(%ebp) <== NOT EXECUTED
10a7b4: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED
10a7ba: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10a7bd: 8b 55 c8 mov -0x38(%ebp),%edx <== NOT EXECUTED
10a7c0: eb bf jmp 10a781 <rtems_termios_enqueue_raw_characters+0x241><== NOT EXECUTED
/* if received char is V_STOP and V_START (both are equal value) */
if (c == tty->termios.c_cc[VSTOP]) {
if (c == tty->termios.c_cc[VSTART]) {
/* received VSTOP and VSTART==VSTOP? */
/* then toggle "stop output" status */
tty->flow_ctrl = tty->flow_ctrl ^ FL_ORCVXOF;
10a7c2: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10a7c8: 83 f0 10 xor $0x10,%eax <== NOT EXECUTED
10a7cb: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
10a7d1: eb 80 jmp 10a753 <rtems_termios_enqueue_raw_characters+0x213><== NOT EXECUTED
!(tty->flow_ctrl & FL_IREQXOF)) {
/* incoming data stream should be stopped */
tty->flow_ctrl |= FL_IREQXOF;
if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF))
== (FL_MDXOF ) ) {
if ((tty->flow_ctrl & FL_OSTOP) ||
10a7d3: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10a7d9: a8 20 test $0x20,%al <== NOT EXECUTED
10a7db: 75 0e jne 10a7eb <rtems_termios_enqueue_raw_characters+0x2ab><== NOT EXECUTED
10a7dd: 8b 83 94 00 00 00 mov 0x94(%ebx),%eax <== NOT EXECUTED
10a7e3: 85 c0 test %eax,%eax <== NOT EXECUTED
10a7e5: 0f 85 dd fe ff ff jne 10a6c8 <rtems_termios_enqueue_raw_characters+0x188><== NOT EXECUTED
(tty->rawOutBufState == rob_idle)) {
/* if tx is stopped due to XOFF or out of data */
/* call write function here */
tty->flow_ctrl |= FL_ISNTXOF;
10a7eb: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10a7f1: 83 c8 02 or $0x2,%eax <== NOT EXECUTED
10a7f4: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
(*tty->device.write)(tty->minor,
10a7fa: 52 push %edx <== NOT EXECUTED
10a7fb: 6a 01 push $0x1 <== NOT EXECUTED
10a7fd: ff 75 cc pushl -0x34(%ebp) <== NOT EXECUTED
10a800: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
10a803: 89 4d c8 mov %ecx,-0x38(%ebp) <== NOT EXECUTED
10a806: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED
10a80c: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10a80f: 8b 4d c8 mov -0x38(%ebp),%ecx <== NOT EXECUTED
10a812: e9 b1 fe ff ff jmp 10a6c8 <rtems_termios_enqueue_raw_characters+0x188><== NOT EXECUTED
(void *)&(tty->termios.c_cc[VSTOP]), 1);
}
} else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) {
tty->flow_ctrl |= FL_IRTSOFF;
10a817: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10a81d: 83 c8 04 or $0x4,%eax <== NOT EXECUTED
10a820: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
/* deactivate RTS line */
if (tty->device.stopRemoteTx != NULL) {
10a826: 8b 83 ac 00 00 00 mov 0xac(%ebx),%eax <== NOT EXECUTED
10a82c: 85 c0 test %eax,%eax <== NOT EXECUTED
10a82e: 0f 84 94 fe ff ff je 10a6c8 <rtems_termios_enqueue_raw_characters+0x188><== NOT EXECUTED
tty->device.stopRemoteTx(tty->minor);
10a834: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10a837: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
10a83a: 89 4d c8 mov %ecx,-0x38(%ebp) <== NOT EXECUTED
10a83d: ff d0 call *%eax <== NOT EXECUTED
10a83f: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10a842: 8b 4d c8 mov -0x38(%ebp),%ecx <== NOT EXECUTED
10a845: e9 7e fe ff ff jmp 10a6c8 <rtems_termios_enqueue_raw_characters+0x188><== NOT EXECUTED
00108f68 <rtems_termios_initialize>:
struct rtems_termios_tty *rtems_termios_ttyTail;
rtems_id rtems_termios_ttyMutex;
void
rtems_termios_initialize (void)
{
108f68: 55 push %ebp
108f69: 89 e5 mov %esp,%ebp
108f6b: 83 ec 08 sub $0x8,%esp
rtems_status_code sc;
/*
* Create the mutex semaphore for the tty list
*/
if (!rtems_termios_ttyMutex) {
108f6e: a1 0c 7d 12 00 mov 0x127d0c,%eax
108f73: 85 c0 test %eax,%eax
108f75: 74 05 je 108f7c <rtems_termios_initialize+0x14>
RTEMS_NO_PRIORITY,
&rtems_termios_ttyMutex);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
}
}
108f77: c9 leave
108f78: c3 ret
108f79: 8d 76 00 lea 0x0(%esi),%esi
/*
* Create the mutex semaphore for the tty list
*/
if (!rtems_termios_ttyMutex) {
sc = rtems_semaphore_create (
108f7c: 83 ec 0c sub $0xc,%esp
108f7f: 68 0c 7d 12 00 push $0x127d0c
108f84: 6a 00 push $0x0
108f86: 6a 54 push $0x54
108f88: 6a 01 push $0x1
108f8a: 68 69 6d 52 54 push $0x54526d69
108f8f: e8 a0 24 00 00 call 10b434 <rtems_semaphore_create>
rtems_build_name ('T', 'R', 'm', 'i'),
1,
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&rtems_termios_ttyMutex);
if (sc != RTEMS_SUCCESSFUL)
108f94: 83 c4 20 add $0x20,%esp
108f97: 85 c0 test %eax,%eax
108f99: 74 dc je 108f77 <rtems_termios_initialize+0xf>
rtems_fatal_error_occurred (sc);
108f9b: 83 ec 0c sub $0xc,%esp
108f9e: 50 push %eax
108f9f: e8 5c 2d 00 00 call 10bd00 <rtems_fatal_error_occurred>
001096a8 <rtems_termios_ioctl>:
}
}
rtems_status_code
rtems_termios_ioctl (void *arg)
{
1096a8: 55 push %ebp
1096a9: 89 e5 mov %esp,%ebp
1096ab: 57 push %edi
1096ac: 56 push %esi
1096ad: 53 push %ebx
1096ae: 83 ec 20 sub $0x20,%esp
1096b1: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_libio_ioctl_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
1096b4: 8b 03 mov (%ebx),%eax
1096b6: 8b 40 34 mov 0x34(%eax),%eax
1096b9: 89 45 e4 mov %eax,-0x1c(%ebp)
struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer;
1096bc: 8b 73 08 mov 0x8(%ebx),%esi
rtems_status_code sc;
args->ioctl_return = 0;
1096bf: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
1096c6: 6a 00 push $0x0
1096c8: 6a 00 push $0x0
1096ca: ff 70 18 pushl 0x18(%eax)
1096cd: e8 de 1f 00 00 call 10b6b0 <rtems_semaphore_obtain>
1096d2: 89 45 e0 mov %eax,-0x20(%ebp)
if (sc != RTEMS_SUCCESSFUL) {
1096d5: 83 c4 10 add $0x10,%esp
1096d8: 85 c0 test %eax,%eax
1096da: 75 24 jne 109700 <rtems_termios_ioctl+0x58><== NEVER TAKEN
args->ioctl_return = sc;
return sc;
}
switch (args->command) {
1096dc: 8b 43 04 mov 0x4(%ebx),%eax
1096df: 83 f8 04 cmp $0x4,%eax
1096e2: 74 70 je 109754 <rtems_termios_ioctl+0xac>
1096e4: 77 2a ja 109710 <rtems_termios_ioctl+0x68>
1096e6: 83 f8 02 cmp $0x2,%eax
1096e9: 0f 84 9d 00 00 00 je 10978c <rtems_termios_ioctl+0xe4>
1096ef: 0f 86 3f 02 00 00 jbe 109934 <rtems_termios_ioctl+0x28c>
if (tty->device.setAttributes)
(*tty->device.setAttributes)(tty->minor, &tty->termios);
break;
case RTEMS_IO_TCDRAIN:
drainOutput (tty);
1096f5: 8b 45 e4 mov -0x1c(%ebp),%eax
1096f8: e8 a7 f8 ff ff call 108fa4 <drainOutput>
break;
1096fd: eb 69 jmp 109768 <rtems_termios_ioctl+0xc0>
1096ff: 90 nop
rtems_status_code sc;
args->ioctl_return = 0;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL) {
args->ioctl_return = sc;
109700: 89 43 0c mov %eax,0xc(%ebx) <== NOT EXECUTED
}
rtems_semaphore_release (tty->osem);
args->ioctl_return = sc;
return sc;
}
109703: 8b 45 e0 mov -0x20(%ebp),%eax <== NOT EXECUTED
109706: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
109709: 5b pop %ebx <== NOT EXECUTED
10970a: 5e pop %esi <== NOT EXECUTED
10970b: 5f pop %edi <== NOT EXECUTED
10970c: c9 leave <== NOT EXECUTED
10970d: c3 ret <== NOT EXECUTED
10970e: 66 90 xchg %ax,%ax <== NOT EXECUTED
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL) {
args->ioctl_return = sc;
return sc;
}
switch (args->command) {
109710: 3d 7f 66 04 40 cmp $0x4004667f,%eax
109715: 0f 84 f1 01 00 00 je 10990c <rtems_termios_ioctl+0x264><== NEVER TAKEN
10971b: 0f 87 33 02 00 00 ja 109954 <rtems_termios_ioctl+0x2ac>
109721: 83 f8 05 cmp $0x5,%eax
109724: 0f 84 ae 02 00 00 je 1099d8 <rtems_termios_ioctl+0x330>
default:
if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) {
10972a: 8b 55 e4 mov -0x1c(%ebp),%edx
10972d: 8b 82 cc 00 00 00 mov 0xcc(%edx),%eax
109733: c1 e0 05 shl $0x5,%eax
109736: 8b 80 b8 79 12 00 mov 0x1279b8(%eax),%eax
10973c: 85 c0 test %eax,%eax
10973e: 0f 84 b8 02 00 00 je 1099fc <rtems_termios_ioctl+0x354><== NEVER TAKEN
sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args);
109744: 83 ec 08 sub $0x8,%esp
109747: 53 push %ebx
109748: 52 push %edx
109749: ff d0 call *%eax
10974b: 89 45 e0 mov %eax,-0x20(%ebp)
10974e: 83 c4 10 add $0x10,%esp
109751: eb 15 jmp 109768 <rtems_termios_ioctl+0xc0>
109753: 90 nop
case RTEMS_IO_SNDWAKEUP:
tty->tty_snd = *wakeup;
break;
case RTEMS_IO_RCVWAKEUP:
tty->tty_rcv = *wakeup;
109754: 8b 06 mov (%esi),%eax
109756: 8b 56 04 mov 0x4(%esi),%edx
109759: 8b 4d e4 mov -0x1c(%ebp),%ecx
10975c: 89 81 dc 00 00 00 mov %eax,0xdc(%ecx)
109762: 89 91 e0 00 00 00 mov %edx,0xe0(%ecx)
*(int *)args->buffer = tty->ccount - tty->cindex + rawnc;
}
break;
}
rtems_semaphore_release (tty->osem);
109768: 83 ec 0c sub $0xc,%esp
10976b: 8b 45 e4 mov -0x1c(%ebp),%eax
10976e: ff 70 18 pushl 0x18(%eax)
109771: e8 36 20 00 00 call 10b7ac <rtems_semaphore_release>
args->ioctl_return = sc;
109776: 8b 55 e0 mov -0x20(%ebp),%edx
109779: 89 53 0c mov %edx,0xc(%ebx)
return sc;
10977c: 83 c4 10 add $0x10,%esp
}
10977f: 8b 45 e0 mov -0x20(%ebp),%eax
109782: 8d 65 f4 lea -0xc(%ebp),%esp
109785: 5b pop %ebx
109786: 5e pop %esi
109787: 5f pop %edi
109788: c9 leave
109789: c3 ret
10978a: 66 90 xchg %ax,%ax
case RTEMS_IO_GET_ATTRIBUTES:
*(struct termios *)args->buffer = tty->termios;
break;
case RTEMS_IO_SET_ATTRIBUTES:
tty->termios = *(struct termios *)args->buffer;
10978c: 8b 73 08 mov 0x8(%ebx),%esi
10978f: 8b 4d e4 mov -0x1c(%ebp),%ecx
109792: 83 c1 30 add $0x30,%ecx
109795: 89 4d dc mov %ecx,-0x24(%ebp)
109798: b9 09 00 00 00 mov $0x9,%ecx
10979d: 8b 7d dc mov -0x24(%ebp),%edi
1097a0: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/*
* check for flow control options to be switched off
*/
/* check for outgoing XON/XOFF flow control switched off */
if (( tty->flow_ctrl & FL_MDXON) &&
1097a2: 8b 55 e4 mov -0x1c(%ebp),%edx
1097a5: 8b 82 b8 00 00 00 mov 0xb8(%edx),%eax
1097ab: f6 c4 02 test $0x2,%ah
1097ae: 74 44 je 1097f4 <rtems_termios_ioctl+0x14c>
1097b0: f6 42 31 04 testb $0x4,0x31(%edx)
1097b4: 75 3e jne 1097f4 <rtems_termios_ioctl+0x14c><== ALWAYS TAKEN
!(tty->termios.c_iflag & IXON)) {
/* clear related flags in flow_ctrl */
tty->flow_ctrl &= ~(FL_MDXON | FL_ORCVXOF);
1097b6: 8b 82 b8 00 00 00 mov 0xb8(%edx),%eax <== NOT EXECUTED
1097bc: 25 ef fd ff ff and $0xfffffdef,%eax <== NOT EXECUTED
1097c1: 89 82 b8 00 00 00 mov %eax,0xb8(%edx) <== NOT EXECUTED
/* has output been stopped due to received XOFF? */
if (tty->flow_ctrl & FL_OSTOP) {
1097c7: 8b 82 b8 00 00 00 mov 0xb8(%edx),%eax <== NOT EXECUTED
1097cd: a8 20 test $0x20,%al <== NOT EXECUTED
1097cf: 74 23 je 1097f4 <rtems_termios_ioctl+0x14c><== NOT EXECUTED
/* disable interrupts */
rtems_interrupt_disable(level);
1097d1: 9c pushf <== NOT EXECUTED
1097d2: fa cli <== NOT EXECUTED
1097d3: 5e pop %esi <== NOT EXECUTED
tty->flow_ctrl &= ~FL_OSTOP;
1097d4: 8b 82 b8 00 00 00 mov 0xb8(%edx),%eax <== NOT EXECUTED
1097da: 83 e0 df and $0xffffffdf,%eax <== NOT EXECUTED
1097dd: 89 82 b8 00 00 00 mov %eax,0xb8(%edx) <== NOT EXECUTED
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
1097e3: 8b ba 94 00 00 00 mov 0x94(%edx),%edi <== NOT EXECUTED
1097e9: 85 ff test %edi,%edi <== NOT EXECUTED
1097eb: 0f 85 bb 02 00 00 jne 109aac <rtems_termios_ioctl+0x404><== NOT EXECUTED
/* if chars available, call write function... */
(*tty->device.write)(
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
}
/* reenable interrupts */
rtems_interrupt_enable(level);
1097f1: 56 push %esi <== NOT EXECUTED
1097f2: 9d popf <== NOT EXECUTED
1097f3: 90 nop <== NOT EXECUTED
}
}
/* check for incoming XON/XOFF flow control switched off */
if (( tty->flow_ctrl & FL_MDXOF) && !(tty->termios.c_iflag & IXOFF)) {
1097f4: 8b 4d e4 mov -0x1c(%ebp),%ecx
1097f7: 8b 81 b8 00 00 00 mov 0xb8(%ecx),%eax
1097fd: f6 c4 04 test $0x4,%ah
109800: 74 24 je 109826 <rtems_termios_ioctl+0x17e><== ALWAYS TAKEN
109802: f6 41 31 10 testb $0x10,0x31(%ecx) <== NOT EXECUTED
109806: 75 1e jne 109826 <rtems_termios_ioctl+0x17e><== NOT EXECUTED
/* clear related flags in flow_ctrl */
tty->flow_ctrl &= ~(FL_MDXOF);
109808: 8b 81 b8 00 00 00 mov 0xb8(%ecx),%eax <== NOT EXECUTED
10980e: 80 e4 fb and $0xfb,%ah <== NOT EXECUTED
109811: 89 81 b8 00 00 00 mov %eax,0xb8(%ecx) <== NOT EXECUTED
/* FIXME: what happens, if we had sent XOFF but not yet XON? */
tty->flow_ctrl &= ~(FL_ISNTXOF);
109817: 8b 81 b8 00 00 00 mov 0xb8(%ecx),%eax <== NOT EXECUTED
10981d: 83 e0 fd and $0xfffffffd,%eax <== NOT EXECUTED
109820: 89 81 b8 00 00 00 mov %eax,0xb8(%ecx) <== NOT EXECUTED
}
/* check for incoming RTS/CTS flow control switched off */
if (( tty->flow_ctrl & FL_MDRTS) && !(tty->termios.c_cflag & CRTSCTS)) {
109826: 8b 55 e4 mov -0x1c(%ebp),%edx
109829: 8b 82 b8 00 00 00 mov 0xb8(%edx),%eax
10982f: f6 c4 01 test $0x1,%ah
109832: 0f 84 bc 01 00 00 je 1099f4 <rtems_termios_ioctl+0x34c><== ALWAYS TAKEN
109838: 8b 4d e4 mov -0x1c(%ebp),%ecx <== NOT EXECUTED
10983b: 8b 41 38 mov 0x38(%ecx),%eax <== NOT EXECUTED
10983e: 85 c0 test %eax,%eax <== NOT EXECUTED
109840: 0f 88 12 02 00 00 js 109a58 <rtems_termios_ioctl+0x3b0><== NOT EXECUTED
/* clear related flags in flow_ctrl */
tty->flow_ctrl &= ~(FL_MDRTS);
109846: 8b 91 b8 00 00 00 mov 0xb8(%ecx),%edx <== NOT EXECUTED
10984c: 80 e6 fe and $0xfe,%dh <== NOT EXECUTED
10984f: 89 91 b8 00 00 00 mov %edx,0xb8(%ecx) <== NOT EXECUTED
/* restart remote Tx, if it was stopped */
if ((tty->flow_ctrl & FL_IRTSOFF) && (tty->device.startRemoteTx != NULL)) {
109855: 8b 91 b8 00 00 00 mov 0xb8(%ecx),%edx <== NOT EXECUTED
10985b: 83 e2 04 and $0x4,%edx <== NOT EXECUTED
10985e: 74 1b je 10987b <rtems_termios_ioctl+0x1d3><== NOT EXECUTED
109860: 8b 91 b0 00 00 00 mov 0xb0(%ecx),%edx <== NOT EXECUTED
109866: 85 d2 test %edx,%edx <== NOT EXECUTED
109868: 74 11 je 10987b <rtems_termios_ioctl+0x1d3><== NOT EXECUTED
tty->device.startRemoteTx(tty->minor);
10986a: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10986d: ff 71 10 pushl 0x10(%ecx) <== NOT EXECUTED
109870: ff d2 call *%edx <== NOT EXECUTED
109872: 8b 55 e4 mov -0x1c(%ebp),%edx <== NOT EXECUTED
109875: 8b 42 38 mov 0x38(%edx),%eax <== NOT EXECUTED
109878: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
tty->flow_ctrl &= ~(FL_IRTSOFF);
10987b: 8b 4d e4 mov -0x1c(%ebp),%ecx <== NOT EXECUTED
10987e: 8b 91 b8 00 00 00 mov 0xb8(%ecx),%edx <== NOT EXECUTED
109884: 83 e2 fb and $0xfffffffb,%edx <== NOT EXECUTED
109887: 89 91 b8 00 00 00 mov %edx,0xb8(%ecx) <== NOT EXECUTED
/*
* check for flow control options to be switched on
*/
/* check for incoming RTS/CTS flow control switched on */
if (tty->termios.c_cflag & CRTSCTS) {
10988d: 85 c0 test %eax,%eax
10988f: 0f 88 c3 01 00 00 js 109a58 <rtems_termios_ioctl+0x3b0><== NEVER TAKEN
tty->flow_ctrl |= FL_MDRTS;
}
/* check for incoming XON/XOF flow control switched on */
if (tty->termios.c_iflag & IXOFF) {
109895: 8b 4d e4 mov -0x1c(%ebp),%ecx
109898: 8b 41 30 mov 0x30(%ecx),%eax
10989b: f6 c4 10 test $0x10,%ah
10989e: 74 0f je 1098af <rtems_termios_ioctl+0x207>
tty->flow_ctrl |= FL_MDXOF;
1098a0: 8b 91 b8 00 00 00 mov 0xb8(%ecx),%edx
1098a6: 80 ce 04 or $0x4,%dh
1098a9: 89 91 b8 00 00 00 mov %edx,0xb8(%ecx)
}
/* check for outgoing XON/XOF flow control switched on */
if (tty->termios.c_iflag & IXON) {
1098af: f6 c4 04 test $0x4,%ah
1098b2: 74 12 je 1098c6 <rtems_termios_ioctl+0x21e>
tty->flow_ctrl |= FL_MDXON;
1098b4: 8b 55 e4 mov -0x1c(%ebp),%edx
1098b7: 8b 82 b8 00 00 00 mov 0xb8(%edx),%eax
1098bd: 80 cc 02 or $0x2,%ah
1098c0: 89 82 b8 00 00 00 mov %eax,0xb8(%edx)
tty->termios = *(struct termios *)args->buffer;
/* check for and process change in flow control options */
termios_set_flowctrl(tty);
if (tty->termios.c_lflag & ICANON) {
1098c6: 8b 4d e4 mov -0x1c(%ebp),%ecx
1098c9: f6 41 3c 02 testb $0x2,0x3c(%ecx)
1098cd: 0f 84 41 01 00 00 je 109a14 <rtems_termios_ioctl+0x36c>
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
1098d3: c7 41 6c 00 00 00 00 movl $0x0,0x6c(%ecx)
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
1098da: c7 41 70 00 00 00 00 movl $0x0,0x70(%ecx)
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
1098e1: c7 41 74 00 00 00 00 movl $0x0,0x74(%ecx)
} else {
tty->rawInBufSemaphoreOptions = RTEMS_NO_WAIT;
}
}
}
if (tty->device.setAttributes)
1098e8: 8b 55 e4 mov -0x1c(%ebp),%edx
1098eb: 8b 82 a8 00 00 00 mov 0xa8(%edx),%eax
1098f1: 85 c0 test %eax,%eax
1098f3: 0f 84 6f fe ff ff je 109768 <rtems_termios_ioctl+0xc0><== NEVER TAKEN
(*tty->device.setAttributes)(tty->minor, &tty->termios);
1098f9: 83 ec 08 sub $0x8,%esp
1098fc: ff 75 dc pushl -0x24(%ebp)
1098ff: ff 72 10 pushl 0x10(%edx)
109902: ff d0 call *%eax
109904: 83 c4 10 add $0x10,%esp
109907: e9 5c fe ff ff jmp 109768 <rtems_termios_ioctl+0xc0>
case TIOCGETD:
*(int*)(args->buffer)=tty->t_line;
break;
#endif
case FIONREAD: {
int rawnc = tty->rawInBuf.Tail - tty->rawInBuf.Head;
10990c: 8b 55 e4 mov -0x1c(%ebp),%edx <== NOT EXECUTED
10990f: 8b 42 60 mov 0x60(%edx),%eax <== NOT EXECUTED
109912: 89 d1 mov %edx,%ecx <== NOT EXECUTED
109914: 8b 52 5c mov 0x5c(%edx),%edx <== NOT EXECUTED
if ( rawnc < 0 )
109917: 29 d0 sub %edx,%eax <== NOT EXECUTED
109919: 0f 88 e9 00 00 00 js 109a08 <rtems_termios_ioctl+0x360><== NOT EXECUTED
rawnc += tty->rawInBuf.Size;
/* Half guess that this is the right operation */
*(int *)args->buffer = tty->ccount - tty->cindex + rawnc;
10991f: 8b 53 08 mov 0x8(%ebx),%edx <== NOT EXECUTED
109922: 8b 4d e4 mov -0x1c(%ebp),%ecx <== NOT EXECUTED
109925: 03 41 20 add 0x20(%ecx),%eax <== NOT EXECUTED
109928: 2b 41 24 sub 0x24(%ecx),%eax <== NOT EXECUTED
10992b: 89 02 mov %eax,(%edx) <== NOT EXECUTED
}
break;
10992d: e9 36 fe ff ff jmp 109768 <rtems_termios_ioctl+0xc0><== NOT EXECUTED
109932: 66 90 xchg %ax,%ax <== NOT EXECUTED
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL) {
args->ioctl_return = sc;
return sc;
}
switch (args->command) {
109934: 48 dec %eax
109935: 0f 85 ef fd ff ff jne 10972a <rtems_termios_ioctl+0x82><== NEVER TAKEN
sc = RTEMS_INVALID_NUMBER;
}
break;
case RTEMS_IO_GET_ATTRIBUTES:
*(struct termios *)args->buffer = tty->termios;
10993b: 8b 43 08 mov 0x8(%ebx),%eax
10993e: 8b 75 e4 mov -0x1c(%ebp),%esi
109941: 83 c6 30 add $0x30,%esi
109944: b9 09 00 00 00 mov $0x9,%ecx
109949: 89 c7 mov %eax,%edi
10994b: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
break;
10994d: e9 16 fe ff ff jmp 109768 <rtems_termios_ioctl+0xc0>
109952: 66 90 xchg %ax,%ax
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL) {
args->ioctl_return = sc;
return sc;
}
switch (args->command) {
109954: 3d 1a 74 04 40 cmp $0x4004741a,%eax
109959: 74 69 je 1099c4 <rtems_termios_ioctl+0x31c>
10995b: 3d 1b 74 04 80 cmp $0x8004741b,%eax
109960: 0f 85 c4 fd ff ff jne 10972a <rtems_termios_ioctl+0x82><== NEVER TAKEN
#if 1 /* FIXME */
case TIOCSETD:
/*
* close old line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_close != NULL) {
109966: 8b 55 e4 mov -0x1c(%ebp),%edx
109969: 8b 82 cc 00 00 00 mov 0xcc(%edx),%eax
10996f: c1 e0 05 shl $0x5,%eax
109972: 8b 80 a4 79 12 00 mov 0x1279a4(%eax),%eax
109978: 85 c0 test %eax,%eax
10997a: 74 0c je 109988 <rtems_termios_ioctl+0x2e0>
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
10997c: 83 ec 0c sub $0xc,%esp
10997f: 52 push %edx
109980: ff d0 call *%eax
109982: 89 45 e0 mov %eax,-0x20(%ebp)
109985: 83 c4 10 add $0x10,%esp
}
tty->t_line=*(int*)(args->buffer);
109988: 8b 43 08 mov 0x8(%ebx),%eax
10998b: 8b 00 mov (%eax),%eax
10998d: 8b 4d e4 mov -0x1c(%ebp),%ecx
109990: 89 81 cc 00 00 00 mov %eax,0xcc(%ecx)
tty->t_sc = NULL; /* ensure that no more valid data */
109996: c7 81 d0 00 00 00 00 movl $0x0,0xd0(%ecx)
10999d: 00 00 00
/*
* open new line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_open != NULL) {
1099a0: c1 e0 05 shl $0x5,%eax
1099a3: 8b 80 a0 79 12 00 mov 0x1279a0(%eax),%eax
1099a9: 85 c0 test %eax,%eax
1099ab: 0f 84 b7 fd ff ff je 109768 <rtems_termios_ioctl+0xc0><== NEVER TAKEN
sc = rtems_termios_linesw[tty->t_line].l_open(tty);
1099b1: 83 ec 0c sub $0xc,%esp
1099b4: 51 push %ecx
1099b5: ff d0 call *%eax
1099b7: 89 45 e0 mov %eax,-0x20(%ebp)
1099ba: 83 c4 10 add $0x10,%esp
1099bd: e9 a6 fd ff ff jmp 109768 <rtems_termios_ioctl+0xc0>
1099c2: 66 90 xchg %ax,%ax
}
break;
case TIOCGETD:
*(int*)(args->buffer)=tty->t_line;
1099c4: 8b 43 08 mov 0x8(%ebx),%eax
1099c7: 8b 4d e4 mov -0x1c(%ebp),%ecx
1099ca: 8b 91 cc 00 00 00 mov 0xcc(%ecx),%edx
1099d0: 89 10 mov %edx,(%eax)
break;
1099d2: e9 91 fd ff ff jmp 109768 <rtems_termios_ioctl+0xc0>
1099d7: 90 nop
case RTEMS_IO_TCDRAIN:
drainOutput (tty);
break;
case RTEMS_IO_SNDWAKEUP:
tty->tty_snd = *wakeup;
1099d8: 8b 06 mov (%esi),%eax
1099da: 8b 56 04 mov 0x4(%esi),%edx
1099dd: 8b 4d e4 mov -0x1c(%ebp),%ecx
1099e0: 89 81 d4 00 00 00 mov %eax,0xd4(%ecx)
1099e6: 89 91 d8 00 00 00 mov %edx,0xd8(%ecx)
break;
1099ec: e9 77 fd ff ff jmp 109768 <rtems_termios_ioctl+0xc0>
1099f1: 8d 76 00 lea 0x0(%esi),%esi
/* FIXME: what happens, if we had sent XOFF but not yet XON? */
tty->flow_ctrl &= ~(FL_ISNTXOF);
}
/* check for incoming RTS/CTS flow control switched off */
if (( tty->flow_ctrl & FL_MDRTS) && !(tty->termios.c_cflag & CRTSCTS)) {
1099f4: 8b 42 38 mov 0x38(%edx),%eax
1099f7: e9 91 fe ff ff jmp 10988d <rtems_termios_ioctl+0x1e5>
default:
if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) {
sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args);
}
else {
sc = RTEMS_INVALID_NUMBER;
1099fc: c7 45 e0 0a 00 00 00 movl $0xa,-0x20(%ebp) <== NOT EXECUTED
109a03: e9 60 fd ff ff jmp 109768 <rtems_termios_ioctl+0xc0><== NOT EXECUTED
break;
#endif
case FIONREAD: {
int rawnc = tty->rawInBuf.Tail - tty->rawInBuf.Head;
if ( rawnc < 0 )
rawnc += tty->rawInBuf.Size;
109a08: 8b 51 64 mov 0x64(%ecx),%edx <== NOT EXECUTED
109a0b: 01 d0 add %edx,%eax <== NOT EXECUTED
109a0d: e9 0d ff ff ff jmp 10991f <rtems_termios_ioctl+0x277><== NOT EXECUTED
109a12: 66 90 xchg %ax,%ax <== NOT EXECUTED
if (tty->termios.c_lflag & ICANON) {
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
tty->vtimeTicks = tty->termios.c_cc[VTIME] *
109a14: 8b 45 e4 mov -0x1c(%ebp),%eax
109a17: 0f b6 70 46 movzbl 0x46(%eax),%esi
rtems_clock_get_ticks_per_second() / 10;
109a1b: e8 74 15 00 00 call 10af94 <rtems_clock_get_ticks_per_second>
if (tty->termios.c_lflag & ICANON) {
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
tty->vtimeTicks = tty->termios.c_cc[VTIME] *
109a20: 0f af c6 imul %esi,%eax
rtems_clock_get_ticks_per_second() / 10;
109a23: ba cd cc cc cc mov $0xcccccccd,%edx
109a28: f7 e2 mul %edx
109a2a: c1 ea 03 shr $0x3,%edx
if (tty->termios.c_lflag & ICANON) {
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
tty->vtimeTicks = tty->termios.c_cc[VTIME] *
109a2d: 8b 4d e4 mov -0x1c(%ebp),%ecx
109a30: 89 51 54 mov %edx,0x54(%ecx)
rtems_clock_get_ticks_per_second() / 10;
if (tty->termios.c_cc[VTIME]) {
109a33: 80 79 46 00 cmpb $0x0,0x46(%ecx)
109a37: 74 36 je 109a6f <rtems_termios_ioctl+0x3c7>
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
109a39: c7 41 6c 00 00 00 00 movl $0x0,0x6c(%ecx)
tty->rawInBufSemaphoreTimeout = tty->vtimeTicks;
109a40: 89 51 70 mov %edx,0x70(%ecx)
if (tty->termios.c_cc[VMIN])
109a43: 80 79 47 00 cmpb $0x0,0x47(%ecx)
109a47: 74 49 je 109a92 <rtems_termios_ioctl+0x3ea>
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
109a49: c7 41 74 00 00 00 00 movl $0x0,0x74(%ecx)
109a50: e9 93 fe ff ff jmp 1098e8 <rtems_termios_ioctl+0x240>
109a55: 8d 76 00 lea 0x0(%esi),%esi
/*
* check for flow control options to be switched on
*/
/* check for incoming RTS/CTS flow control switched on */
if (tty->termios.c_cflag & CRTSCTS) {
tty->flow_ctrl |= FL_MDRTS;
109a58: 8b 55 e4 mov -0x1c(%ebp),%edx <== NOT EXECUTED
109a5b: 8b 82 b8 00 00 00 mov 0xb8(%edx),%eax <== NOT EXECUTED
109a61: 80 cc 01 or $0x1,%ah <== NOT EXECUTED
109a64: 89 82 b8 00 00 00 mov %eax,0xb8(%edx) <== NOT EXECUTED
109a6a: e9 26 fe ff ff jmp 109895 <rtems_termios_ioctl+0x1ed><== NOT EXECUTED
if (tty->termios.c_cc[VMIN])
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
else
tty->rawInBufSemaphoreFirstTimeout = tty->vtimeTicks;
} else {
if (tty->termios.c_cc[VMIN]) {
109a6f: 8b 55 e4 mov -0x1c(%ebp),%edx
109a72: 80 7a 47 00 cmpb $0x0,0x47(%edx)
109a76: 74 25 je 109a9d <rtems_termios_ioctl+0x3f5><== ALWAYS TAKEN
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
109a78: c7 42 6c 00 00 00 00 movl $0x0,0x6c(%edx) <== NOT EXECUTED
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
109a7f: c7 42 70 00 00 00 00 movl $0x0,0x70(%edx) <== NOT EXECUTED
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
109a86: c7 42 74 00 00 00 00 movl $0x0,0x74(%edx) <== NOT EXECUTED
109a8d: e9 56 fe ff ff jmp 1098e8 <rtems_termios_ioctl+0x240><== NOT EXECUTED
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = tty->vtimeTicks;
if (tty->termios.c_cc[VMIN])
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
else
tty->rawInBufSemaphoreFirstTimeout = tty->vtimeTicks;
109a92: 8b 45 e4 mov -0x1c(%ebp),%eax
109a95: 89 50 74 mov %edx,0x74(%eax)
109a98: e9 4b fe ff ff jmp 1098e8 <rtems_termios_ioctl+0x240>
if (tty->termios.c_cc[VMIN]) {
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
tty->rawInBufSemaphoreOptions = RTEMS_NO_WAIT;
109a9d: 8b 4d e4 mov -0x1c(%ebp),%ecx
109aa0: c7 41 6c 01 00 00 00 movl $0x1,0x6c(%ecx)
109aa7: e9 3c fe ff ff jmp 1098e8 <rtems_termios_ioctl+0x240>
tty->flow_ctrl &= ~FL_OSTOP;
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
/* if chars available, call write function... */
(*tty->device.write)(
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
109aac: 8b 82 84 00 00 00 mov 0x84(%edx),%eax <== NOT EXECUTED
rtems_interrupt_disable(level);
tty->flow_ctrl &= ~FL_OSTOP;
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
/* if chars available, call write function... */
(*tty->device.write)(
109ab2: 51 push %ecx <== NOT EXECUTED
109ab3: 6a 01 push $0x1 <== NOT EXECUTED
109ab5: 03 42 7c add 0x7c(%edx),%eax <== NOT EXECUTED
109ab8: 50 push %eax <== NOT EXECUTED
109ab9: ff 72 10 pushl 0x10(%edx) <== NOT EXECUTED
109abc: ff 92 a4 00 00 00 call *0xa4(%edx) <== NOT EXECUTED
109ac2: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
109ac5: e9 27 fd ff ff jmp 1097f1 <rtems_termios_ioctl+0x149><== NOT EXECUTED
0010aa84 <rtems_termios_number_to_baud>:
extern rtems_assoc_t termios_assoc_table[];
int rtems_termios_number_to_baud(
int32_t baud
)
{
10aa84: 55 push %ebp
10aa85: 89 e5 mov %esp,%ebp
10aa87: 53 push %ebx
10aa88: 83 ec 0c sub $0xc,%esp
10aa8b: 8b 5d 08 mov 0x8(%ebp),%ebx
int termios_baud;
termios_baud = rtems_assoc_remote_by_local( termios_assoc_table, baud );
10aa8e: 53 push %ebx
10aa8f: 68 e0 91 12 00 push $0x1291e0
10aa94: e8 f7 6e 00 00 call 111990 <rtems_assoc_remote_by_local>
if ( termios_baud == 0 && baud != 0 )
10aa99: 83 c4 10 add $0x10,%esp
10aa9c: 85 c0 test %eax,%eax
10aa9e: 74 08 je 10aaa8 <rtems_termios_number_to_baud+0x24>
return -1;
return termios_baud;
}
10aaa0: 8b 5d fc mov -0x4(%ebp),%ebx
10aaa3: c9 leave
10aaa4: c3 ret
10aaa5: 8d 76 00 lea 0x0(%esi),%esi
)
{
int termios_baud;
termios_baud = rtems_assoc_remote_by_local( termios_assoc_table, baud );
if ( termios_baud == 0 && baud != 0 )
10aaa8: 85 db test %ebx,%ebx
10aaaa: 74 f4 je 10aaa0 <rtems_termios_number_to_baud+0x1c>
return -1;
10aaac: b8 ff ff ff ff mov $0xffffffff,%eax
10aab1: eb ed jmp 10aaa0 <rtems_termios_number_to_baud+0x1c>
00109014 <rtems_termios_open>:
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
const rtems_termios_callbacks *callbacks
)
{
109014: 55 push %ebp
109015: 89 e5 mov %esp,%ebp
109017: 57 push %edi
109018: 56 push %esi
109019: 53 push %ebx
10901a: 83 ec 40 sub $0x40,%esp
10901d: 8b 55 08 mov 0x8(%ebp),%edx
struct rtems_termios_tty *tty;
/*
* See if the device has already been opened
*/
sc = rtems_semaphore_obtain(
109020: 6a 00 push $0x0
109022: 6a 00 push $0x0
109024: ff 35 0c 7d 12 00 pushl 0x127d0c
10902a: 89 55 dc mov %edx,-0x24(%ebp)
10902d: e8 7e 26 00 00 call 10b6b0 <rtems_semaphore_obtain>
109032: 89 45 e4 mov %eax,-0x1c(%ebp)
rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
109035: 83 c4 10 add $0x10,%esp
109038: 85 c0 test %eax,%eax
10903a: 8b 55 dc mov -0x24(%ebp),%edx
10903d: 75 6d jne 1090ac <rtems_termios_open+0x98><== NEVER TAKEN
return sc;
for (tty = rtems_termios_ttyHead ; tty != NULL ; tty = tty->forw) {
10903f: 8b 35 14 7d 12 00 mov 0x127d14,%esi
109045: 85 f6 test %esi,%esi
109047: 0f 84 a7 00 00 00 je 1090f4 <rtems_termios_open+0xe0>
10904d: 89 f3 mov %esi,%ebx
10904f: 8b 45 0c mov 0xc(%ebp),%eax
109052: eb 0a jmp 10905e <rtems_termios_open+0x4a>
109054: 8b 1b mov (%ebx),%ebx
109056: 85 db test %ebx,%ebx
109058: 0f 84 96 00 00 00 je 1090f4 <rtems_termios_open+0xe0><== ALWAYS TAKEN
if ((tty->major == major) && (tty->minor == minor))
10905e: 39 53 0c cmp %edx,0xc(%ebx)
109061: 75 f1 jne 109054 <rtems_termios_open+0x40>
109063: 39 43 10 cmp %eax,0x10(%ebx)
109066: 75 ec jne 109054 <rtems_termios_open+0x40><== NEVER TAKEN
*/
if (c++ == 'z')
c = 'a';
}
args->iop->data1 = tty;
109068: 8b 75 10 mov 0x10(%ebp),%esi
10906b: 8b 06 mov (%esi),%eax
10906d: 89 58 34 mov %ebx,0x34(%eax)
if (!tty->refcount++) {
109070: 8b 43 08 mov 0x8(%ebx),%eax
109073: 8d 48 01 lea 0x1(%eax),%ecx
109076: 89 4b 08 mov %ecx,0x8(%ebx)
109079: 85 c0 test %eax,%eax
10907b: 75 1e jne 10909b <rtems_termios_open+0x87>
if (tty->device.firstOpen)
10907d: 8b 83 98 00 00 00 mov 0x98(%ebx),%eax
109083: 85 c0 test %eax,%eax
109085: 74 0b je 109092 <rtems_termios_open+0x7e>
(*tty->device.firstOpen)(major, minor, arg);
109087: 57 push %edi
109088: 56 push %esi
109089: ff 75 0c pushl 0xc(%ebp)
10908c: 52 push %edx
10908d: ff d0 call *%eax
10908f: 83 c4 10 add $0x10,%esp
/*
* start I/O tasks, if needed
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
109092: 83 bb b4 00 00 00 02 cmpl $0x2,0xb4(%ebx)
109099: 74 1c je 1090b7 <rtems_termios_open+0xa3>
tty->txTaskId, rtems_termios_txdaemon, (rtems_task_argument)tty);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
}
}
rtems_semaphore_release (rtems_termios_ttyMutex);
10909b: 83 ec 0c sub $0xc,%esp
10909e: ff 35 0c 7d 12 00 pushl 0x127d0c
1090a4: e8 03 27 00 00 call 10b7ac <rtems_semaphore_release>
return RTEMS_SUCCESSFUL;
1090a9: 83 c4 10 add $0x10,%esp
}
1090ac: 8b 45 e4 mov -0x1c(%ebp),%eax
1090af: 8d 65 f4 lea -0xc(%ebp),%esp
1090b2: 5b pop %ebx
1090b3: 5e pop %esi
1090b4: 5f pop %edi
1090b5: c9 leave
1090b6: c3 ret
/*
* start I/O tasks, if needed
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
sc = rtems_task_start(
1090b7: 56 push %esi
1090b8: 53 push %ebx
1090b9: 68 4c a8 10 00 push $0x10a84c
1090be: ff b3 c4 00 00 00 pushl 0xc4(%ebx)
1090c4: e8 2b 2a 00 00 call 10baf4 <rtems_task_start>
tty->rxTaskId, rtems_termios_rxdaemon, (rtems_task_argument)tty);
if (sc != RTEMS_SUCCESSFUL)
1090c9: 83 c4 10 add $0x10,%esp
1090cc: 85 c0 test %eax,%eax
1090ce: 0f 85 3f 03 00 00 jne 109413 <rtems_termios_open+0x3ff><== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_task_start(
1090d4: 51 push %ecx
1090d5: 53 push %ebx
1090d6: 68 fc aa 10 00 push $0x10aafc
1090db: ff b3 c8 00 00 00 pushl 0xc8(%ebx)
1090e1: e8 0e 2a 00 00 call 10baf4 <rtems_task_start>
tty->txTaskId, rtems_termios_txdaemon, (rtems_task_argument)tty);
if (sc != RTEMS_SUCCESSFUL)
1090e6: 83 c4 10 add $0x10,%esp
1090e9: 85 c0 test %eax,%eax
1090eb: 74 ae je 10909b <rtems_termios_open+0x87><== ALWAYS TAKEN
1090ed: e9 21 03 00 00 jmp 109413 <rtems_termios_open+0x3ff><== NOT EXECUTED
1090f2: 66 90 xchg %ax,%ax <== NOT EXECUTED
static char c = 'a';
/*
* Create a new device
*/
tty = calloc (1, sizeof (struct rtems_termios_tty));
1090f4: 83 ec 08 sub $0x8,%esp
1090f7: 68 e8 00 00 00 push $0xe8
1090fc: 6a 01 push $0x1
1090fe: 89 55 dc mov %edx,-0x24(%ebp)
109101: e8 1e ee ff ff call 107f24 <calloc>
109106: 89 45 e0 mov %eax,-0x20(%ebp)
109109: 89 c3 mov %eax,%ebx
if (tty == NULL) {
10910b: 83 c4 10 add $0x10,%esp
10910e: 85 c0 test %eax,%eax
109110: 8b 55 dc mov -0x24(%ebp),%edx
109113: 0f 84 75 02 00 00 je 10938e <rtems_termios_open+0x37a>
return RTEMS_NO_MEMORY;
}
/*
* allocate raw input buffer
*/
tty->rawInBuf.Size = RAW_INPUT_BUFFER_SIZE;
109119: a1 24 5a 12 00 mov 0x125a24,%eax
10911e: 8b 4d e0 mov -0x20(%ebp),%ecx
109121: 89 41 64 mov %eax,0x64(%ecx)
tty->rawInBuf.theBuf = malloc (tty->rawInBuf.Size);
109124: 8b 41 64 mov 0x64(%ecx),%eax
109127: 83 ec 0c sub $0xc,%esp
10912a: 50 push %eax
10912b: 89 55 dc mov %edx,-0x24(%ebp)
10912e: e8 55 f2 ff ff call 108388 <malloc>
109133: 89 45 c4 mov %eax,-0x3c(%ebp)
109136: 8b 7d e0 mov -0x20(%ebp),%edi
109139: 89 47 58 mov %eax,0x58(%edi)
if (tty->rawInBuf.theBuf == NULL) {
10913c: 83 c4 10 add $0x10,%esp
10913f: 85 c0 test %eax,%eax
109141: 8b 55 dc mov -0x24(%ebp),%edx
109144: 0f 84 61 02 00 00 je 1093ab <rtems_termios_open+0x397>
return RTEMS_NO_MEMORY;
}
/*
* allocate raw output buffer
*/
tty->rawOutBuf.Size = RAW_OUTPUT_BUFFER_SIZE;
10914a: a1 28 5a 12 00 mov 0x125a28,%eax
10914f: 8b 4d e0 mov -0x20(%ebp),%ecx
109152: 89 81 88 00 00 00 mov %eax,0x88(%ecx)
tty->rawOutBuf.theBuf = malloc (tty->rawOutBuf.Size);
109158: 8b 81 88 00 00 00 mov 0x88(%ecx),%eax
10915e: 83 ec 0c sub $0xc,%esp
109161: 50 push %eax
109162: 89 55 dc mov %edx,-0x24(%ebp)
109165: e8 1e f2 ff ff call 108388 <malloc>
10916a: 89 c7 mov %eax,%edi
10916c: 8b 45 e0 mov -0x20(%ebp),%eax
10916f: 89 78 7c mov %edi,0x7c(%eax)
if (tty->rawOutBuf.theBuf == NULL) {
109172: 83 c4 10 add $0x10,%esp
109175: 85 ff test %edi,%edi
109177: 8b 55 dc mov -0x24(%ebp),%edx
10917a: 0f 84 4f 02 00 00 je 1093cf <rtems_termios_open+0x3bb><== NEVER TAKEN
return RTEMS_NO_MEMORY;
}
/*
* allocate cooked buffer
*/
tty->cbuf = malloc (CBUFSIZE);
109180: 83 ec 0c sub $0xc,%esp
109183: ff 35 20 5a 12 00 pushl 0x125a20
109189: 89 55 dc mov %edx,-0x24(%ebp)
10918c: e8 f7 f1 ff ff call 108388 <malloc>
109191: 8b 4d e0 mov -0x20(%ebp),%ecx
109194: 89 41 1c mov %eax,0x1c(%ecx)
if (tty->cbuf == NULL) {
109197: 83 c4 10 add $0x10,%esp
10919a: 85 c0 test %eax,%eax
10919c: 8b 55 dc mov -0x24(%ebp),%edx
10919f: 0f 84 77 02 00 00 je 10941c <rtems_termios_open+0x408>
return RTEMS_NO_MEMORY;
}
/*
* Initialize wakeup callbacks
*/
tty->tty_snd.sw_pfn = NULL;
1091a5: 8b 7d e0 mov -0x20(%ebp),%edi
1091a8: c7 87 d4 00 00 00 00 movl $0x0,0xd4(%edi)
1091af: 00 00 00
tty->tty_snd.sw_arg = NULL;
1091b2: c7 87 d8 00 00 00 00 movl $0x0,0xd8(%edi)
1091b9: 00 00 00
tty->tty_rcv.sw_pfn = NULL;
1091bc: c7 87 dc 00 00 00 00 movl $0x0,0xdc(%edi)
1091c3: 00 00 00
tty->tty_rcv.sw_arg = NULL;
1091c6: c7 87 e0 00 00 00 00 movl $0x0,0xe0(%edi)
1091cd: 00 00 00
tty->tty_rcvwakeup = 0;
1091d0: c7 87 e4 00 00 00 00 movl $0x0,0xe4(%edi)
1091d7: 00 00 00
/*
* link tty
*/
tty->forw = rtems_termios_ttyHead;
1091da: 89 37 mov %esi,(%edi)
tty->back = NULL;
1091dc: c7 47 04 00 00 00 00 movl $0x0,0x4(%edi)
if (rtems_termios_ttyHead != NULL)
1091e3: 85 f6 test %esi,%esi
1091e5: 74 03 je 1091ea <rtems_termios_open+0x1d6>
rtems_termios_ttyHead->back = tty;
1091e7: 89 7e 04 mov %edi,0x4(%esi)
rtems_termios_ttyHead = tty;
1091ea: 8b 45 e0 mov -0x20(%ebp),%eax
1091ed: a3 14 7d 12 00 mov %eax,0x127d14
if (rtems_termios_ttyTail == NULL)
1091f2: 8b 0d 10 7d 12 00 mov 0x127d10,%ecx
1091f8: 85 c9 test %ecx,%ecx
1091fa: 0f 84 af 02 00 00 je 1094af <rtems_termios_open+0x49b>
rtems_termios_ttyTail = tty;
tty->minor = minor;
109200: 8b 75 0c mov 0xc(%ebp),%esi
109203: 8b 4d e0 mov -0x20(%ebp),%ecx
109206: 89 71 10 mov %esi,0x10(%ecx)
tty->major = major;
109209: 89 51 0c mov %edx,0xc(%ecx)
/*
* Set up mutex semaphores
*/
sc = rtems_semaphore_create (
10920c: 83 ec 0c sub $0xc,%esp
10920f: 89 c8 mov %ecx,%eax
109211: 83 c0 14 add $0x14,%eax
109214: 50 push %eax
109215: 6a 00 push $0x0
109217: 6a 54 push $0x54
109219: 6a 01 push $0x1
rtems_build_name ('T', 'R', 'i', c),
10921b: 0f be 05 2c 5a 12 00 movsbl 0x125a2c,%eax
tty->major = major;
/*
* Set up mutex semaphores
*/
sc = rtems_semaphore_create (
109222: 0d 00 69 52 54 or $0x54526900,%eax
109227: 50 push %eax
109228: 89 55 dc mov %edx,-0x24(%ebp)
10922b: e8 04 22 00 00 call 10b434 <rtems_semaphore_create>
rtems_build_name ('T', 'R', 'i', c),
1,
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&tty->isem);
if (sc != RTEMS_SUCCESSFUL)
109230: 83 c4 20 add $0x20,%esp
109233: 85 c0 test %eax,%eax
109235: 8b 55 dc mov -0x24(%ebp),%edx
109238: 0f 85 d5 01 00 00 jne 109413 <rtems_termios_open+0x3ff>
rtems_fatal_error_occurred (sc);
sc = rtems_semaphore_create (
10923e: 83 ec 0c sub $0xc,%esp
109241: 8b 45 e0 mov -0x20(%ebp),%eax
109244: 83 c0 18 add $0x18,%eax
109247: 50 push %eax
109248: 6a 00 push $0x0
10924a: 6a 54 push $0x54
10924c: 6a 01 push $0x1
rtems_build_name ('T', 'R', 'o', c),
10924e: 0f be 05 2c 5a 12 00 movsbl 0x125a2c,%eax
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&tty->isem);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
sc = rtems_semaphore_create (
109255: 0d 00 6f 52 54 or $0x54526f00,%eax
10925a: 50 push %eax
10925b: 89 55 dc mov %edx,-0x24(%ebp)
10925e: e8 d1 21 00 00 call 10b434 <rtems_semaphore_create>
rtems_build_name ('T', 'R', 'o', c),
1,
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&tty->osem);
if (sc != RTEMS_SUCCESSFUL)
109263: 83 c4 20 add $0x20,%esp
109266: 85 c0 test %eax,%eax
109268: 8b 55 dc mov -0x24(%ebp),%edx
10926b: 0f 85 a2 01 00 00 jne 109413 <rtems_termios_open+0x3ff>
rtems_fatal_error_occurred (sc);
sc = rtems_semaphore_create (
109271: 83 ec 0c sub $0xc,%esp
109274: 8b 45 e0 mov -0x20(%ebp),%eax
109277: 05 8c 00 00 00 add $0x8c,%eax
10927c: 50 push %eax
10927d: 6a 00 push $0x0
10927f: 6a 20 push $0x20
109281: 6a 00 push $0x0
rtems_build_name ('T', 'R', 'x', c),
109283: 0f be 05 2c 5a 12 00 movsbl 0x125a2c,%eax
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&tty->osem);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
sc = rtems_semaphore_create (
10928a: 0d 00 78 52 54 or $0x54527800,%eax
10928f: 50 push %eax
109290: 89 55 dc mov %edx,-0x24(%ebp)
109293: e8 9c 21 00 00 call 10b434 <rtems_semaphore_create>
rtems_build_name ('T', 'R', 'x', c),
0,
RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_FIFO,
RTEMS_NO_PRIORITY,
&tty->rawOutBuf.Semaphore);
if (sc != RTEMS_SUCCESSFUL)
109298: 83 c4 20 add $0x20,%esp
10929b: 85 c0 test %eax,%eax
10929d: 8b 55 dc mov -0x24(%ebp),%edx
1092a0: 0f 85 6d 01 00 00 jne 109413 <rtems_termios_open+0x3ff>
rtems_fatal_error_occurred (sc);
tty->rawOutBufState = rob_idle;
1092a6: 8b 7d e0 mov -0x20(%ebp),%edi
1092a9: c7 87 94 00 00 00 00 movl $0x0,0x94(%edi)
1092b0: 00 00 00
/*
* Set callbacks
*/
tty->device = *callbacks;
1092b3: 81 c7 98 00 00 00 add $0x98,%edi
1092b9: b9 08 00 00 00 mov $0x8,%ecx
1092be: 8b 75 14 mov 0x14(%ebp),%esi
1092c1: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/*
* Create I/O tasks
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
1092c3: 8b 7d e0 mov -0x20(%ebp),%edi
1092c6: 83 bf b4 00 00 00 02 cmpl $0x2,0xb4(%edi)
1092cd: 0f 84 64 01 00 00 je 109437 <rtems_termios_open+0x423><== NEVER TAKEN
&tty->rxTaskId);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
}
if ((tty->device.pollRead == NULL) ||
1092d3: 8b 45 e0 mov -0x20(%ebp),%eax
1092d6: 8b 88 a0 00 00 00 mov 0xa0(%eax),%ecx
1092dc: 85 c9 test %ecx,%ecx
1092de: 0f 84 fc 00 00 00 je 1093e0 <rtems_termios_open+0x3cc>
1092e4: 83 b8 b4 00 00 00 02 cmpl $0x2,0xb4(%eax)
1092eb: 0f 84 ef 00 00 00 je 1093e0 <rtems_termios_open+0x3cc><== NEVER TAKEN
}
/*
* Set default parameters
*/
tty->termios.c_iflag = BRKINT | ICRNL | IXON | IMAXBEL;
1092f1: 8b 4d e0 mov -0x20(%ebp),%ecx
1092f4: c7 41 30 02 25 00 00 movl $0x2502,0x30(%ecx)
tty->termios.c_oflag = OPOST | ONLCR | XTABS;
1092fb: c7 41 34 05 18 00 00 movl $0x1805,0x34(%ecx)
tty->termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL;
109302: c7 41 38 bd 08 00 00 movl $0x8bd,0x38(%ecx)
tty->termios.c_lflag =
109309: c7 41 3c 3b 82 00 00 movl $0x823b,0x3c(%ecx)
ISIG | ICANON | IEXTEN | ECHO | ECHOK | ECHOE | ECHOCTL;
tty->termios.c_cc[VINTR] = '\003';
109310: c6 41 41 03 movb $0x3,0x41(%ecx)
tty->termios.c_cc[VQUIT] = '\034';
109314: c6 41 42 1c movb $0x1c,0x42(%ecx)
tty->termios.c_cc[VERASE] = '\177';
109318: c6 41 43 7f movb $0x7f,0x43(%ecx)
tty->termios.c_cc[VKILL] = '\025';
10931c: c6 41 44 15 movb $0x15,0x44(%ecx)
tty->termios.c_cc[VEOF] = '\004';
109320: c6 41 45 04 movb $0x4,0x45(%ecx)
tty->termios.c_cc[VEOL] = '\000';
109324: c6 41 4c 00 movb $0x0,0x4c(%ecx)
tty->termios.c_cc[VEOL2] = '\000';
109328: c6 41 51 00 movb $0x0,0x51(%ecx)
tty->termios.c_cc[VSTART] = '\021';
10932c: c6 41 49 11 movb $0x11,0x49(%ecx)
tty->termios.c_cc[VSTOP] = '\023';
109330: c6 41 4a 13 movb $0x13,0x4a(%ecx)
tty->termios.c_cc[VSUSP] = '\032';
109334: c6 41 4b 1a movb $0x1a,0x4b(%ecx)
tty->termios.c_cc[VREPRINT] = '\022';
109338: c6 41 4d 12 movb $0x12,0x4d(%ecx)
tty->termios.c_cc[VDISCARD] = '\017';
10933c: c6 41 4e 0f movb $0xf,0x4e(%ecx)
tty->termios.c_cc[VWERASE] = '\027';
109340: c6 41 4f 17 movb $0x17,0x4f(%ecx)
tty->termios.c_cc[VLNEXT] = '\026';
109344: c6 41 50 16 movb $0x16,0x50(%ecx)
/* start with no flow control, clear flow control flags */
tty->flow_ctrl = 0;
109348: c7 81 b8 00 00 00 00 movl $0x0,0xb8(%ecx)
10934f: 00 00 00
/*
* set low/highwater mark for XON/XOFF support
*/
tty->lowwater = tty->rawInBuf.Size * 1/2;
109352: 8b 41 64 mov 0x64(%ecx),%eax
109355: d1 e8 shr %eax
109357: 89 81 bc 00 00 00 mov %eax,0xbc(%ecx)
tty->highwater = tty->rawInBuf.Size * 3/4;
10935d: 8b 41 64 mov 0x64(%ecx),%eax
109360: 8d 04 40 lea (%eax,%eax,2),%eax
109363: c1 e8 02 shr $0x2,%eax
109366: 89 81 c0 00 00 00 mov %eax,0xc0(%ecx)
/*
* Bump name characer
*/
if (c++ == 'z')
10936c: a0 2c 5a 12 00 mov 0x125a2c,%al
109371: 8d 48 01 lea 0x1(%eax),%ecx
109374: 88 0d 2c 5a 12 00 mov %cl,0x125a2c
10937a: 3c 7a cmp $0x7a,%al
10937c: 0f 85 e6 fc ff ff jne 109068 <rtems_termios_open+0x54>
c = 'a';
109382: c6 05 2c 5a 12 00 61 movb $0x61,0x125a2c
109389: e9 da fc ff ff jmp 109068 <rtems_termios_open+0x54>
/*
* Create a new device
*/
tty = calloc (1, sizeof (struct rtems_termios_tty));
if (tty == NULL) {
rtems_semaphore_release (rtems_termios_ttyMutex);
10938e: 83 ec 0c sub $0xc,%esp
109391: ff 35 0c 7d 12 00 pushl 0x127d0c
109397: e8 10 24 00 00 call 10b7ac <rtems_semaphore_release>
return RTEMS_NO_MEMORY;
10939c: 83 c4 10 add $0x10,%esp
10939f: c7 45 e4 1a 00 00 00 movl $0x1a,-0x1c(%ebp)
1093a6: e9 01 fd ff ff jmp 1090ac <rtems_termios_open+0x98>
* allocate raw input buffer
*/
tty->rawInBuf.Size = RAW_INPUT_BUFFER_SIZE;
tty->rawInBuf.theBuf = malloc (tty->rawInBuf.Size);
if (tty->rawInBuf.theBuf == NULL) {
free(tty);
1093ab: 83 ec 0c sub $0xc,%esp
1093ae: 57 push %edi
*/
tty->rawOutBuf.Size = RAW_OUTPUT_BUFFER_SIZE;
tty->rawOutBuf.theBuf = malloc (tty->rawOutBuf.Size);
if (tty->rawOutBuf.theBuf == NULL) {
free((void *)(tty->rawInBuf.theBuf));
free(tty);
1093af: e8 00 ed ff ff call 1080b4 <free>
rtems_semaphore_release (rtems_termios_ttyMutex);
1093b4: 5f pop %edi
1093b5: ff 35 0c 7d 12 00 pushl 0x127d0c
1093bb: e8 ec 23 00 00 call 10b7ac <rtems_semaphore_release>
return RTEMS_NO_MEMORY;
1093c0: 83 c4 10 add $0x10,%esp
1093c3: c7 45 e4 1a 00 00 00 movl $0x1a,-0x1c(%ebp)
1093ca: e9 dd fc ff ff jmp 1090ac <rtems_termios_open+0x98>
* allocate raw output buffer
*/
tty->rawOutBuf.Size = RAW_OUTPUT_BUFFER_SIZE;
tty->rawOutBuf.theBuf = malloc (tty->rawOutBuf.Size);
if (tty->rawOutBuf.theBuf == NULL) {
free((void *)(tty->rawInBuf.theBuf));
1093cf: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
1093d2: ff 75 c4 pushl -0x3c(%ebp) <== NOT EXECUTED
1093d5: e8 da ec ff ff call 1080b4 <free> <== NOT EXECUTED
free(tty);
1093da: 58 pop %eax <== NOT EXECUTED
1093db: ff 75 e0 pushl -0x20(%ebp) <== NOT EXECUTED
1093de: eb cf jmp 1093af <rtems_termios_open+0x39b><== NOT EXECUTED
rtems_fatal_error_occurred (sc);
}
if ((tty->device.pollRead == NULL) ||
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){
sc = rtems_semaphore_create (
1093e0: 83 ec 0c sub $0xc,%esp
1093e3: 8b 45 e0 mov -0x20(%ebp),%eax
1093e6: 83 c0 68 add $0x68,%eax
1093e9: 50 push %eax
1093ea: 6a 00 push $0x0
1093ec: 6a 24 push $0x24
1093ee: 6a 00 push $0x0
rtems_build_name ('T', 'R', 'r', c),
1093f0: 0f be 05 2c 5a 12 00 movsbl 0x125a2c,%eax
rtems_fatal_error_occurred (sc);
}
if ((tty->device.pollRead == NULL) ||
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){
sc = rtems_semaphore_create (
1093f7: 0d 00 72 52 54 or $0x54527200,%eax
1093fc: 50 push %eax
1093fd: 89 55 dc mov %edx,-0x24(%ebp)
109400: e8 2f 20 00 00 call 10b434 <rtems_semaphore_create>
rtems_build_name ('T', 'R', 'r', c),
0,
RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&tty->rawInBuf.Semaphore);
if (sc != RTEMS_SUCCESSFUL)
109405: 83 c4 20 add $0x20,%esp
109408: 85 c0 test %eax,%eax
10940a: 8b 55 dc mov -0x24(%ebp),%edx
10940d: 0f 84 de fe ff ff je 1092f1 <rtems_termios_open+0x2dd>
rtems_fatal_error_occurred (sc);
sc = rtems_task_start(
tty->txTaskId, rtems_termios_txdaemon, (rtems_task_argument)tty);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
109413: 83 ec 0c sub $0xc,%esp
109416: 50 push %eax
109417: e8 e4 28 00 00 call 10bd00 <rtems_fatal_error_occurred>
/*
* allocate cooked buffer
*/
tty->cbuf = malloc (CBUFSIZE);
if (tty->cbuf == NULL) {
free((void *)(tty->rawOutBuf.theBuf));
10941c: 83 ec 0c sub $0xc,%esp
10941f: 57 push %edi
109420: e8 8f ec ff ff call 1080b4 <free>
free((void *)(tty->rawInBuf.theBuf));
109425: 5e pop %esi
109426: ff 75 c4 pushl -0x3c(%ebp)
109429: e8 86 ec ff ff call 1080b4 <free>
free(tty);
10942e: 5b pop %ebx
10942f: ff 75 e0 pushl -0x20(%ebp)
109432: e9 78 ff ff ff jmp 1093af <rtems_termios_open+0x39b>
/*
* Create I/O tasks
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
sc = rtems_task_create (
109437: 50 push %eax
109438: 50 push %eax
109439: 89 f8 mov %edi,%eax
10943b: 05 c8 00 00 00 add $0xc8,%eax
109440: 50 push %eax
109441: 6a 00 push $0x0
109443: 68 00 05 00 00 push $0x500
109448: 68 00 04 00 00 push $0x400
10944d: 6a 0a push $0xa
rtems_build_name ('T', 'x', 'T', c),
10944f: 0f be 05 2c 5a 12 00 movsbl 0x125a2c,%eax
/*
* Create I/O tasks
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
sc = rtems_task_create (
109456: 0d 00 54 78 54 or $0x54785400,%eax
10945b: 50 push %eax
10945c: 89 55 dc mov %edx,-0x24(%ebp)
10945f: e8 e8 23 00 00 call 10b84c <rtems_task_create>
TERMIOS_TXTASK_STACKSIZE,
RTEMS_NO_PREEMPT | RTEMS_NO_TIMESLICE |
RTEMS_NO_ASR,
RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL,
&tty->txTaskId);
if (sc != RTEMS_SUCCESSFUL)
109464: 83 c4 20 add $0x20,%esp
109467: 85 c0 test %eax,%eax
109469: 8b 55 dc mov -0x24(%ebp),%edx
10946c: 75 a5 jne 109413 <rtems_termios_open+0x3ff><== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_task_create (
10946e: 56 push %esi
10946f: 56 push %esi
109470: 8b 45 e0 mov -0x20(%ebp),%eax
109473: 05 c4 00 00 00 add $0xc4,%eax
109478: 50 push %eax
109479: 6a 00 push $0x0
10947b: 68 00 05 00 00 push $0x500
109480: 68 00 04 00 00 push $0x400
109485: 6a 09 push $0x9
rtems_build_name ('R', 'x', 'T', c),
109487: 0f be 05 2c 5a 12 00 movsbl 0x125a2c,%eax
RTEMS_NO_ASR,
RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL,
&tty->txTaskId);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
sc = rtems_task_create (
10948e: 0d 00 54 78 52 or $0x52785400,%eax
109493: 50 push %eax
109494: 89 55 dc mov %edx,-0x24(%ebp)
109497: e8 b0 23 00 00 call 10b84c <rtems_task_create>
TERMIOS_RXTASK_STACKSIZE,
RTEMS_NO_PREEMPT | RTEMS_NO_TIMESLICE |
RTEMS_NO_ASR,
RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL,
&tty->rxTaskId);
if (sc != RTEMS_SUCCESSFUL)
10949c: 83 c4 20 add $0x20,%esp
10949f: 85 c0 test %eax,%eax
1094a1: 8b 55 dc mov -0x24(%ebp),%edx
1094a4: 0f 84 29 fe ff ff je 1092d3 <rtems_termios_open+0x2bf>
1094aa: e9 64 ff ff ff jmp 109413 <rtems_termios_open+0x3ff><== NOT EXECUTED
tty->back = NULL;
if (rtems_termios_ttyHead != NULL)
rtems_termios_ttyHead->back = tty;
rtems_termios_ttyHead = tty;
if (rtems_termios_ttyTail == NULL)
rtems_termios_ttyTail = tty;
1094af: a3 10 7d 12 00 mov %eax,0x127d10
1094b4: e9 47 fd ff ff jmp 109200 <rtems_termios_open+0x1ec>
00109acc <rtems_termios_puts>:
* Send characters to device-specific code
*/
void
rtems_termios_puts (
const void *_buf, int len, struct rtems_termios_tty *tty)
{
109acc: 55 push %ebp
109acd: 89 e5 mov %esp,%ebp
109acf: 57 push %edi
109ad0: 56 push %esi
109ad1: 53 push %ebx
109ad2: 83 ec 1c sub $0x1c,%esp
109ad5: 8b 45 08 mov 0x8(%ebp),%eax
109ad8: 8b 55 0c mov 0xc(%ebp),%edx
109adb: 89 55 e4 mov %edx,-0x1c(%ebp)
109ade: 8b 5d 10 mov 0x10(%ebp),%ebx
const unsigned char *buf = _buf;
109ae1: 89 c6 mov %eax,%esi
unsigned int newHead;
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) {
109ae3: 8b 8b b4 00 00 00 mov 0xb4(%ebx),%ecx
109ae9: 85 c9 test %ecx,%ecx
109aeb: 0f 84 eb 00 00 00 je 109bdc <rtems_termios_puts+0x110>
(*tty->device.write)(tty->minor, (void *)buf, len);
return;
}
newHead = tty->rawOutBuf.Head;
109af1: 8b 83 80 00 00 00 mov 0x80(%ebx),%eax
109af7: 89 45 e0 mov %eax,-0x20(%ebp)
while (len) {
109afa: 8b 55 e4 mov -0x1c(%ebp),%edx
109afd: 85 d2 test %edx,%edx
109aff: 0f 84 cf 00 00 00 je 109bd4 <rtems_termios_puts+0x108><== NEVER TAKEN
109b05: 8d 76 00 lea 0x0(%esi),%esi
* len -= ncopy
*
* To minimize latency, the memcpy should be done
* with interrupts enabled.
*/
newHead = (newHead + 1) % tty->rawOutBuf.Size;
109b08: 8b 45 e0 mov -0x20(%ebp),%eax
109b0b: 40 inc %eax
109b0c: 8b 8b 88 00 00 00 mov 0x88(%ebx),%ecx
109b12: 31 d2 xor %edx,%edx
109b14: f7 f1 div %ecx
109b16: 89 55 dc mov %edx,-0x24(%ebp)
109b19: 89 55 e0 mov %edx,-0x20(%ebp)
rtems_interrupt_disable (level);
109b1c: 9c pushf
109b1d: fa cli
109b1e: 5f pop %edi
while (newHead == tty->rawOutBuf.Tail) {
109b1f: 8b 93 84 00 00 00 mov 0x84(%ebx),%edx
109b25: 3b 55 e0 cmp -0x20(%ebp),%edx
109b28: 75 3e jne 109b68 <rtems_termios_puts+0x9c>
109b2a: 89 f8 mov %edi,%eax
109b2c: 89 f7 mov %esi,%edi
109b2e: 89 d6 mov %edx,%esi
tty->rawOutBufState = rob_wait;
109b30: c7 83 94 00 00 00 02 movl $0x2,0x94(%ebx)
109b37: 00 00 00
rtems_interrupt_enable (level);
109b3a: 50 push %eax
109b3b: 9d popf
sc = rtems_semaphore_obtain(
109b3c: 50 push %eax
109b3d: 6a 00 push $0x0
109b3f: 6a 00 push $0x0
109b41: ff b3 8c 00 00 00 pushl 0x8c(%ebx)
109b47: e8 64 1b 00 00 call 10b6b0 <rtems_semaphore_obtain>
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
109b4c: 83 c4 10 add $0x10,%esp
109b4f: 85 c0 test %eax,%eax
109b51: 0f 85 a0 00 00 00 jne 109bf7 <rtems_termios_puts+0x12b><== NEVER TAKEN
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
109b57: 9c pushf
109b58: fa cli
109b59: 58 pop %eax
* To minimize latency, the memcpy should be done
* with interrupts enabled.
*/
newHead = (newHead + 1) % tty->rawOutBuf.Size;
rtems_interrupt_disable (level);
while (newHead == tty->rawOutBuf.Tail) {
109b5a: 8b 93 84 00 00 00 mov 0x84(%ebx),%edx
109b60: 39 f2 cmp %esi,%edx
109b62: 74 cc je 109b30 <rtems_termios_puts+0x64><== NEVER TAKEN
109b64: 89 fe mov %edi,%esi
109b66: 89 c7 mov %eax,%edi
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
}
tty->rawOutBuf.theBuf[tty->rawOutBuf.Head] = *buf++;
109b68: 8b 83 80 00 00 00 mov 0x80(%ebx),%eax
109b6e: 8b 4b 7c mov 0x7c(%ebx),%ecx
109b71: 8a 16 mov (%esi),%dl
109b73: 88 14 01 mov %dl,(%ecx,%eax,1)
tty->rawOutBuf.Head = newHead;
109b76: 8b 45 dc mov -0x24(%ebp),%eax
109b79: 89 83 80 00 00 00 mov %eax,0x80(%ebx)
if (tty->rawOutBufState == rob_idle) {
109b7f: 8b 8b 94 00 00 00 mov 0x94(%ebx),%ecx
109b85: 85 c9 test %ecx,%ecx
109b87: 75 23 jne 109bac <rtems_termios_puts+0xe0>
/* check, whether XOFF has been received */
if (!(tty->flow_ctrl & FL_ORCVXOF)) {
109b89: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
109b8f: a8 10 test $0x10,%al
109b91: 74 26 je 109bb9 <rtems_termios_puts+0xed><== ALWAYS TAKEN
(*tty->device.write)(tty->minor,
(char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
} else {
/* remember that output has been stopped due to flow ctrl*/
tty->flow_ctrl |= FL_OSTOP;
109b93: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
109b99: 83 c8 20 or $0x20,%eax
109b9c: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
}
tty->rawOutBufState = rob_busy;
109ba2: c7 83 94 00 00 00 01 movl $0x1,0x94(%ebx)
109ba9: 00 00 00
}
rtems_interrupt_enable (level);
109bac: 57 push %edi
109bad: 9d popf
if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) {
(*tty->device.write)(tty->minor, (void *)buf, len);
return;
}
newHead = tty->rawOutBuf.Head;
while (len) {
109bae: ff 4d e4 decl -0x1c(%ebp)
109bb1: 74 21 je 109bd4 <rtems_termios_puts+0x108>
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
}
tty->rawOutBuf.theBuf[tty->rawOutBuf.Head] = *buf++;
109bb3: 46 inc %esi
109bb4: e9 4f ff ff ff jmp 109b08 <rtems_termios_puts+0x3c>
tty->rawOutBuf.Head = newHead;
if (tty->rawOutBufState == rob_idle) {
/* check, whether XOFF has been received */
if (!(tty->flow_ctrl & FL_ORCVXOF)) {
(*tty->device.write)(tty->minor,
(char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
109bb9: 8b 83 84 00 00 00 mov 0x84(%ebx),%eax
tty->rawOutBuf.theBuf[tty->rawOutBuf.Head] = *buf++;
tty->rawOutBuf.Head = newHead;
if (tty->rawOutBufState == rob_idle) {
/* check, whether XOFF has been received */
if (!(tty->flow_ctrl & FL_ORCVXOF)) {
(*tty->device.write)(tty->minor,
109bbf: 52 push %edx
109bc0: 6a 01 push $0x1
109bc2: 03 43 7c add 0x7c(%ebx),%eax
109bc5: 50 push %eax
109bc6: ff 73 10 pushl 0x10(%ebx)
109bc9: ff 93 a4 00 00 00 call *0xa4(%ebx)
109bcf: 83 c4 10 add $0x10,%esp
109bd2: eb ce jmp 109ba2 <rtems_termios_puts+0xd6>
tty->rawOutBufState = rob_busy;
}
rtems_interrupt_enable (level);
len--;
}
}
109bd4: 8d 65 f4 lea -0xc(%ebp),%esp
109bd7: 5b pop %ebx
109bd8: 5e pop %esi
109bd9: 5f pop %edi
109bda: c9 leave
109bdb: c3 ret
unsigned int newHead;
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) {
(*tty->device.write)(tty->minor, (void *)buf, len);
109bdc: 89 55 10 mov %edx,0x10(%ebp)
109bdf: 89 45 0c mov %eax,0xc(%ebp)
109be2: 8b 43 10 mov 0x10(%ebx),%eax
109be5: 89 45 08 mov %eax,0x8(%ebp)
109be8: 8b 83 a4 00 00 00 mov 0xa4(%ebx),%eax
tty->rawOutBufState = rob_busy;
}
rtems_interrupt_enable (level);
len--;
}
}
109bee: 8d 65 f4 lea -0xc(%ebp),%esp
109bf1: 5b pop %ebx
109bf2: 5e pop %esi
109bf3: 5f pop %edi
109bf4: c9 leave
unsigned int newHead;
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) {
(*tty->device.write)(tty->minor, (void *)buf, len);
109bf5: ff e0 jmp *%eax
tty->rawOutBufState = rob_wait;
rtems_interrupt_enable (level);
sc = rtems_semaphore_obtain(
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
109bf7: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
109bfa: 50 push %eax <== NOT EXECUTED
109bfb: e8 00 21 00 00 call 10bd00 <rtems_fatal_error_occurred><== NOT EXECUTED
0010a1d8 <rtems_termios_read>:
return RTEMS_SUCCESSFUL;
}
rtems_status_code
rtems_termios_read (void *arg)
{
10a1d8: 55 push %ebp
10a1d9: 89 e5 mov %esp,%ebp
10a1db: 57 push %edi
10a1dc: 56 push %esi
10a1dd: 53 push %ebx
10a1de: 83 ec 30 sub $0x30,%esp
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
10a1e1: 8b 55 08 mov 0x8(%ebp),%edx
10a1e4: 8b 02 mov (%edx),%eax
10a1e6: 8b 58 34 mov 0x34(%eax),%ebx
uint32_t count = args->count;
10a1e9: 8b 4a 10 mov 0x10(%edx),%ecx
10a1ec: 89 4d dc mov %ecx,-0x24(%ebp)
char *buffer = args->buffer;
10a1ef: 8b 42 0c mov 0xc(%edx),%eax
10a1f2: 89 45 d8 mov %eax,-0x28(%ebp)
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
10a1f5: 6a 00 push $0x0
10a1f7: 6a 00 push $0x0
10a1f9: ff 73 14 pushl 0x14(%ebx)
10a1fc: e8 af 14 00 00 call 10b6b0 <rtems_semaphore_obtain>
10a201: 89 45 e0 mov %eax,-0x20(%ebp)
if (sc != RTEMS_SUCCESSFUL)
10a204: 83 c4 10 add $0x10,%esp
10a207: 85 c0 test %eax,%eax
10a209: 75 35 jne 10a240 <rtems_termios_read+0x68><== NEVER TAKEN
return sc;
if (rtems_termios_linesw[tty->t_line].l_read != NULL) {
10a20b: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax
10a211: c1 e0 05 shl $0x5,%eax
10a214: 8b 80 a8 79 12 00 mov 0x1279a8(%eax),%eax
10a21a: 85 c0 test %eax,%eax
10a21c: 74 2e je 10a24c <rtems_termios_read+0x74>
sc = rtems_termios_linesw[tty->t_line].l_read(tty,args);
10a21e: 83 ec 08 sub $0x8,%esp
10a221: ff 75 08 pushl 0x8(%ebp)
10a224: 53 push %ebx
10a225: ff d0 call *%eax
10a227: 89 45 e0 mov %eax,-0x20(%ebp)
tty->tty_rcvwakeup = 0;
10a22a: c7 83 e4 00 00 00 00 movl $0x0,0xe4(%ebx)
10a231: 00 00 00
rtems_semaphore_release (tty->isem);
10a234: 59 pop %ecx
10a235: ff 73 14 pushl 0x14(%ebx)
10a238: e8 6f 15 00 00 call 10b7ac <rtems_semaphore_release>
return sc;
10a23d: 83 c4 10 add $0x10,%esp
}
args->bytes_moved = args->count - count;
tty->tty_rcvwakeup = 0;
rtems_semaphore_release (tty->isem);
return sc;
}
10a240: 8b 45 e0 mov -0x20(%ebp),%eax
10a243: 8d 65 f4 lea -0xc(%ebp),%esp
10a246: 5b pop %ebx
10a247: 5e pop %esi
10a248: 5f pop %edi
10a249: c9 leave
10a24a: c3 ret
10a24b: 90 nop
tty->tty_rcvwakeup = 0;
rtems_semaphore_release (tty->isem);
return sc;
}
if (tty->cindex == tty->ccount) {
10a24c: 8b 53 20 mov 0x20(%ebx),%edx
10a24f: 39 53 24 cmp %edx,0x24(%ebx)
10a252: 74 5f je 10a2b3 <rtems_termios_read+0xdb><== ALWAYS TAKEN
sc = fillBufferQueue (tty);
if (sc != RTEMS_SUCCESSFUL)
tty->cindex = tty->ccount = 0;
}
while (count && (tty->cindex < tty->ccount)) {
10a254: 8b 45 dc mov -0x24(%ebp),%eax
10a257: 85 c0 test %eax,%eax
10a259: 74 29 je 10a284 <rtems_termios_read+0xac><== NEVER TAKEN
10a25b: 8b 43 24 mov 0x24(%ebx),%eax
10a25e: 3b 43 20 cmp 0x20(%ebx),%eax
10a261: 7d 21 jge 10a284 <rtems_termios_read+0xac><== NEVER TAKEN
10a263: 8b 55 d8 mov -0x28(%ebp),%edx
10a266: 8b 7d dc mov -0x24(%ebp),%edi
10a269: eb 06 jmp 10a271 <rtems_termios_read+0x99>
10a26b: 90 nop
10a26c: 39 43 20 cmp %eax,0x20(%ebx)
10a26f: 7e 10 jle 10a281 <rtems_termios_read+0xa9>
*buffer++ = tty->cbuf[tty->cindex++];
10a271: 8b 73 1c mov 0x1c(%ebx),%esi
10a274: 8a 0c 06 mov (%esi,%eax,1),%cl
10a277: 88 0a mov %cl,(%edx)
10a279: 42 inc %edx
10a27a: 40 inc %eax
10a27b: 89 43 24 mov %eax,0x24(%ebx)
sc = fillBufferQueue (tty);
if (sc != RTEMS_SUCCESSFUL)
tty->cindex = tty->ccount = 0;
}
while (count && (tty->cindex < tty->ccount)) {
10a27e: 4f dec %edi
10a27f: 75 eb jne 10a26c <rtems_termios_read+0x94>
10a281: 89 7d dc mov %edi,-0x24(%ebp)
*buffer++ = tty->cbuf[tty->cindex++];
count--;
}
args->bytes_moved = args->count - count;
10a284: 8b 55 08 mov 0x8(%ebp),%edx
10a287: 8b 42 10 mov 0x10(%edx),%eax
10a28a: 2b 45 dc sub -0x24(%ebp),%eax
10a28d: 89 42 18 mov %eax,0x18(%edx)
tty->tty_rcvwakeup = 0;
10a290: c7 83 e4 00 00 00 00 movl $0x0,0xe4(%ebx)
10a297: 00 00 00
rtems_semaphore_release (tty->isem);
10a29a: 83 ec 0c sub $0xc,%esp
10a29d: ff 73 14 pushl 0x14(%ebx)
10a2a0: e8 07 15 00 00 call 10b7ac <rtems_semaphore_release>
return sc;
10a2a5: 83 c4 10 add $0x10,%esp
}
10a2a8: 8b 45 e0 mov -0x20(%ebp),%eax
10a2ab: 8d 65 f4 lea -0xc(%ebp),%esp
10a2ae: 5b pop %ebx
10a2af: 5e pop %esi
10a2b0: 5f pop %edi
10a2b1: c9 leave
10a2b2: c3 ret
rtems_semaphore_release (tty->isem);
return sc;
}
if (tty->cindex == tty->ccount) {
tty->cindex = tty->ccount = 0;
10a2b3: c7 43 20 00 00 00 00 movl $0x0,0x20(%ebx)
10a2ba: c7 43 24 00 00 00 00 movl $0x0,0x24(%ebx)
tty->read_start_column = tty->column;
10a2c1: 8b 43 28 mov 0x28(%ebx),%eax
10a2c4: 89 43 2c mov %eax,0x2c(%ebx)
if (tty->device.pollRead != NULL &&
10a2c7: 8b 83 a0 00 00 00 mov 0xa0(%ebx),%eax
10a2cd: 85 c0 test %eax,%eax
10a2cf: 74 0e je 10a2df <rtems_termios_read+0x107>
10a2d1: 8b 93 b4 00 00 00 mov 0xb4(%ebx),%edx
10a2d7: 85 d2 test %edx,%edx
10a2d9: 0f 84 82 01 00 00 je 10a461 <rtems_termios_read+0x289>
* Fill the input buffer from the raw input queue
*/
static rtems_status_code
fillBufferQueue (struct rtems_termios_tty *tty)
{
rtems_interval timeout = tty->rawInBufSemaphoreFirstTimeout;
10a2df: 8b 73 74 mov 0x74(%ebx),%esi
rtems_status_code sc;
int wait = (int)1;
10a2e2: c7 45 e4 01 00 00 00 movl $0x1,-0x1c(%ebp)
if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF))
== (FL_MDXON | FL_ISNTXOF))
&& ((tty->rawOutBufState == rob_idle)
|| (tty->flow_ctrl & FL_OSTOP))) {
/* XON should be sent now... */
(*tty->device.write)(
10a2e9: 8d 4b 49 lea 0x49(%ebx),%ecx
10a2ec: 89 4d d4 mov %ecx,-0x2c(%ebp)
10a2ef: 90 nop
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
10a2f0: 8b 53 5c mov 0x5c(%ebx),%edx
10a2f3: 8b 43 60 mov 0x60(%ebx),%eax
10a2f6: 39 c2 cmp %eax,%edx
10a2f8: 0f 84 06 01 00 00 je 10a404 <rtems_termios_read+0x22c>
(tty->ccount < (CBUFSIZE-1))) {
10a2fe: a1 20 5a 12 00 mov 0x125a20,%eax
10a303: 48 dec %eax
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
10a304: 3b 43 20 cmp 0x20(%ebx),%eax
10a307: 7f 3c jg 10a345 <rtems_termios_read+0x16d><== ALWAYS TAKEN
10a309: e9 f6 00 00 00 jmp 10a404 <rtems_termios_read+0x22c><== NOT EXECUTED
10a30e: 66 90 xchg %ax,%ax <== NOT EXECUTED
}
}
/* continue processing new character */
if (tty->termios.c_lflag & ICANON) {
if (siproc (c, tty))
10a310: 0f b6 c1 movzbl %cl,%eax
10a313: 89 da mov %ebx,%edx
10a315: e8 9e fd ff ff call 10a0b8 <siproc>
10a31a: 85 c0 test %eax,%eax
10a31c: 74 07 je 10a325 <rtems_termios_read+0x14d>
wait = 0;
} else {
siproc (c, tty);
if (tty->ccount >= tty->termios.c_cc[VMIN])
wait = 0;
10a31e: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
}
timeout = tty->rawInBufSemaphoreTimeout;
10a325: 8b 73 70 mov 0x70(%ebx),%esi
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
10a328: 8b 53 5c mov 0x5c(%ebx),%edx
10a32b: 8b 43 60 mov 0x60(%ebx),%eax
10a32e: 39 c2 cmp %eax,%edx
10a330: 0f 84 ce 00 00 00 je 10a404 <rtems_termios_read+0x22c>
(tty->ccount < (CBUFSIZE-1))) {
10a336: a1 20 5a 12 00 mov 0x125a20,%eax
10a33b: 48 dec %eax
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
10a33c: 39 43 20 cmp %eax,0x20(%ebx)
10a33f: 0f 8d bf 00 00 00 jge 10a404 <rtems_termios_read+0x22c><== NEVER TAKEN
(tty->ccount < (CBUFSIZE-1))) {
unsigned char c;
unsigned int newHead;
newHead = (tty->rawInBuf.Head + 1) % tty->rawInBuf.Size;
10a345: 8b 43 5c mov 0x5c(%ebx),%eax
10a348: 8b 4b 64 mov 0x64(%ebx),%ecx
10a34b: 40 inc %eax
10a34c: 31 d2 xor %edx,%edx
10a34e: f7 f1 div %ecx
c = tty->rawInBuf.theBuf[newHead];
10a350: 8b 43 58 mov 0x58(%ebx),%eax
10a353: 8a 0c 10 mov (%eax,%edx,1),%cl
tty->rawInBuf.Head = newHead;
10a356: 89 53 5c mov %edx,0x5c(%ebx)
if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size)
10a359: 8b 43 60 mov 0x60(%ebx),%eax
10a35c: 8b 7b 64 mov 0x64(%ebx),%edi
% tty->rawInBuf.Size)
10a35f: 8b 73 64 mov 0x64(%ebx),%esi
unsigned int newHead;
newHead = (tty->rawInBuf.Head + 1) % tty->rawInBuf.Size;
c = tty->rawInBuf.theBuf[newHead];
tty->rawInBuf.Head = newHead;
if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size)
10a362: 8d 04 07 lea (%edi,%eax,1),%eax
10a365: 29 d0 sub %edx,%eax
% tty->rawInBuf.Size)
10a367: 31 d2 xor %edx,%edx
10a369: f7 f6 div %esi
unsigned int newHead;
newHead = (tty->rawInBuf.Head + 1) % tty->rawInBuf.Size;
c = tty->rawInBuf.theBuf[newHead];
tty->rawInBuf.Head = newHead;
if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size)
10a36b: 3b 93 bc 00 00 00 cmp 0xbc(%ebx),%edx
10a371: 73 5d jae 10a3d0 <rtems_termios_read+0x1f8><== NEVER TAKEN
% tty->rawInBuf.Size)
< tty->lowwater) {
tty->flow_ctrl &= ~FL_IREQXOF;
10a373: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
10a379: 83 e0 fe and $0xfffffffe,%eax
10a37c: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx)
/* if tx stopped and XON should be sent... */
if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF))
10a382: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
10a388: 25 02 02 00 00 and $0x202,%eax
10a38d: 3d 02 02 00 00 cmp $0x202,%eax
10a392: 0f 84 94 00 00 00 je 10a42c <rtems_termios_read+0x254><== NEVER TAKEN
&& ((tty->rawOutBufState == rob_idle)
|| (tty->flow_ctrl & FL_OSTOP))) {
/* XON should be sent now... */
(*tty->device.write)(
tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1);
} else if (tty->flow_ctrl & FL_MDRTS) {
10a398: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
10a39e: f6 c4 01 test $0x1,%ah
10a3a1: 74 2d je 10a3d0 <rtems_termios_read+0x1f8><== ALWAYS TAKEN
tty->flow_ctrl &= ~FL_IRTSOFF;
10a3a3: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10a3a9: 83 e0 fb and $0xfffffffb,%eax <== NOT EXECUTED
10a3ac: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
/* activate RTS line */
if (tty->device.startRemoteTx != NULL) {
10a3b2: 8b 83 b0 00 00 00 mov 0xb0(%ebx),%eax <== NOT EXECUTED
10a3b8: 85 c0 test %eax,%eax <== NOT EXECUTED
10a3ba: 74 14 je 10a3d0 <rtems_termios_read+0x1f8><== NOT EXECUTED
tty->device.startRemoteTx(tty->minor);
10a3bc: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10a3bf: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
10a3c2: 88 4d d0 mov %cl,-0x30(%ebp) <== NOT EXECUTED
10a3c5: ff d0 call *%eax <== NOT EXECUTED
10a3c7: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10a3ca: 8a 4d d0 mov -0x30(%ebp),%cl <== NOT EXECUTED
10a3cd: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
}
}
}
/* continue processing new character */
if (tty->termios.c_lflag & ICANON) {
10a3d0: f6 43 3c 02 testb $0x2,0x3c(%ebx)
10a3d4: 0f 85 36 ff ff ff jne 10a310 <rtems_termios_read+0x138><== ALWAYS TAKEN
if (siproc (c, tty))
wait = 0;
} else {
siproc (c, tty);
10a3da: 0f b6 c1 movzbl %cl,%eax <== NOT EXECUTED
10a3dd: 89 da mov %ebx,%edx <== NOT EXECUTED
10a3df: e8 d4 fc ff ff call 10a0b8 <siproc> <== NOT EXECUTED
if (tty->ccount >= tty->termios.c_cc[VMIN])
10a3e4: 0f b6 43 47 movzbl 0x47(%ebx),%eax <== NOT EXECUTED
10a3e8: 39 43 20 cmp %eax,0x20(%ebx) <== NOT EXECUTED
10a3eb: 0f 8d 2d ff ff ff jge 10a31e <rtems_termios_read+0x146><== NOT EXECUTED
wait = 0;
}
timeout = tty->rawInBufSemaphoreTimeout;
10a3f1: 8b 73 70 mov 0x70(%ebx),%esi <== NOT EXECUTED
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
10a3f4: 8b 53 5c mov 0x5c(%ebx),%edx <== NOT EXECUTED
10a3f7: 8b 43 60 mov 0x60(%ebx),%eax <== NOT EXECUTED
10a3fa: 39 c2 cmp %eax,%edx <== NOT EXECUTED
10a3fc: 0f 85 34 ff ff ff jne 10a336 <rtems_termios_read+0x15e><== NOT EXECUTED
10a402: 66 90 xchg %ax,%ax <== NOT EXECUTED
}
/*
* Wait for characters
*/
if ( wait ) {
10a404: 8b 4d e4 mov -0x1c(%ebp),%ecx
10a407: 85 c9 test %ecx,%ecx
10a409: 0f 84 45 fe ff ff je 10a254 <rtems_termios_read+0x7c>
sc = rtems_semaphore_obtain(
10a40f: 52 push %edx
10a410: 56 push %esi
10a411: ff 73 6c pushl 0x6c(%ebx)
10a414: ff 73 68 pushl 0x68(%ebx)
10a417: e8 94 12 00 00 call 10b6b0 <rtems_semaphore_obtain>
tty->rawInBuf.Semaphore, tty->rawInBufSemaphoreOptions, timeout);
if (sc != RTEMS_SUCCESSFUL)
10a41c: 83 c4 10 add $0x10,%esp
10a41f: 85 c0 test %eax,%eax
10a421: 0f 84 c9 fe ff ff je 10a2f0 <rtems_termios_read+0x118><== ALWAYS TAKEN
10a427: e9 28 fe ff ff jmp 10a254 <rtems_termios_read+0x7c><== NOT EXECUTED
< tty->lowwater) {
tty->flow_ctrl &= ~FL_IREQXOF;
/* if tx stopped and XON should be sent... */
if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF))
== (FL_MDXON | FL_ISNTXOF))
&& ((tty->rawOutBufState == rob_idle)
10a42c: 8b bb 94 00 00 00 mov 0x94(%ebx),%edi <== NOT EXECUTED
10a432: 85 ff test %edi,%edi <== NOT EXECUTED
10a434: 74 0e je 10a444 <rtems_termios_read+0x26c><== NOT EXECUTED
|| (tty->flow_ctrl & FL_OSTOP))) {
10a436: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10a43c: a8 20 test $0x20,%al <== NOT EXECUTED
10a43e: 0f 84 54 ff ff ff je 10a398 <rtems_termios_read+0x1c0><== NOT EXECUTED
/* XON should be sent now... */
(*tty->device.write)(
10a444: 56 push %esi <== NOT EXECUTED
10a445: 6a 01 push $0x1 <== NOT EXECUTED
10a447: ff 75 d4 pushl -0x2c(%ebp) <== NOT EXECUTED
10a44a: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
10a44d: 88 4d d0 mov %cl,-0x30(%ebp) <== NOT EXECUTED
10a450: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED
10a456: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10a459: 8a 4d d0 mov -0x30(%ebp),%cl <== NOT EXECUTED
10a45c: e9 6f ff ff ff jmp 10a3d0 <rtems_termios_read+0x1f8><== NOT EXECUTED
static rtems_status_code
fillBufferPoll (struct rtems_termios_tty *tty)
{
int n;
if (tty->termios.c_lflag & ICANON) {
10a461: f6 43 3c 02 testb $0x2,0x3c(%ebx)
10a465: 75 1d jne 10a484 <rtems_termios_read+0x2ac><== NEVER TAKEN
10a467: eb 39 jmp 10a4a2 <rtems_termios_read+0x2ca>
10a469: 8d 76 00 lea 0x0(%esi),%esi
for (;;) {
n = (*tty->device.pollRead)(tty->minor);
if (n < 0) {
rtems_task_wake_after (1);
} else {
if (siproc (n, tty))
10a46c: 0f b6 c0 movzbl %al,%eax
10a46f: 89 da mov %ebx,%edx
10a471: e8 42 fc ff ff call 10a0b8 <siproc>
10a476: 85 c0 test %eax,%eax
10a478: 0f 85 d6 fd ff ff jne 10a254 <rtems_termios_read+0x7c><== NEVER TAKEN
static rtems_status_code
fillBufferPoll (struct rtems_termios_tty *tty)
{
int n;
if (tty->termios.c_lflag & ICANON) {
10a47e: 8b 83 a0 00 00 00 mov 0xa0(%ebx),%eax
for (;;) {
n = (*tty->device.pollRead)(tty->minor);
10a484: 83 ec 0c sub $0xc,%esp
10a487: ff 73 10 pushl 0x10(%ebx)
10a48a: ff d0 call *%eax
if (n < 0) {
10a48c: 83 c4 10 add $0x10,%esp
10a48f: 85 c0 test %eax,%eax
10a491: 79 d9 jns 10a46c <rtems_termios_read+0x294><== NEVER TAKEN
rtems_task_wake_after (1);
10a493: 83 ec 0c sub $0xc,%esp
10a496: 6a 01 push $0x1
10a498: e8 cb 16 00 00 call 10bb68 <rtems_task_wake_after>
10a49d: 83 c4 10 add $0x10,%esp
10a4a0: eb dc jmp 10a47e <rtems_termios_read+0x2a6>
}
}
} else {
rtems_interval then, now;
then = rtems_clock_get_ticks_since_boot();
10a4a2: e8 01 0b 00 00 call 10afa8 <rtems_clock_get_ticks_since_boot>
10a4a7: 89 c6 mov %eax,%esi
10a4a9: 8d 76 00 lea 0x0(%esi),%esi
for (;;) {
n = (*tty->device.pollRead)(tty->minor);
10a4ac: 83 ec 0c sub $0xc,%esp
10a4af: ff 73 10 pushl 0x10(%ebx)
10a4b2: ff 93 a0 00 00 00 call *0xa0(%ebx)
if (n < 0) {
10a4b8: 83 c4 10 add $0x10,%esp
10a4bb: 85 c0 test %eax,%eax
10a4bd: 78 25 js 10a4e4 <rtems_termios_read+0x30c>
break;
}
}
rtems_task_wake_after (1);
} else {
siproc (n, tty);
10a4bf: 0f b6 c0 movzbl %al,%eax
10a4c2: 89 da mov %ebx,%edx
10a4c4: e8 ef fb ff ff call 10a0b8 <siproc>
if (tty->ccount >= tty->termios.c_cc[VMIN])
10a4c9: 8a 43 47 mov 0x47(%ebx),%al
10a4cc: 0f b6 d0 movzbl %al,%edx
10a4cf: 39 53 20 cmp %edx,0x20(%ebx)
10a4d2: 0f 8d 7c fd ff ff jge 10a254 <rtems_termios_read+0x7c><== NEVER TAKEN
break;
if (tty->termios.c_cc[VMIN] && tty->termios.c_cc[VTIME])
10a4d8: 84 c0 test %al,%al
10a4da: 74 d0 je 10a4ac <rtems_termios_read+0x2d4><== NEVER TAKEN
10a4dc: 80 7b 46 00 cmpb $0x0,0x46(%ebx)
10a4e0: 74 ca je 10a4ac <rtems_termios_read+0x2d4><== NEVER TAKEN
10a4e2: eb be jmp 10a4a2 <rtems_termios_read+0x2ca>
then = rtems_clock_get_ticks_since_boot();
for (;;) {
n = (*tty->device.pollRead)(tty->minor);
if (n < 0) {
if (tty->termios.c_cc[VMIN]) {
10a4e4: 80 7b 47 00 cmpb $0x0,0x47(%ebx)
10a4e8: 74 1d je 10a507 <rtems_termios_read+0x32f><== NEVER TAKEN
if (tty->termios.c_cc[VTIME] && tty->ccount) {
10a4ea: 80 7b 46 00 cmpb $0x0,0x46(%ebx)
10a4ee: 74 08 je 10a4f8 <rtems_termios_read+0x320><== NEVER TAKEN
10a4f0: 8b 43 20 mov 0x20(%ebx),%eax
10a4f3: 85 c0 test %eax,%eax
10a4f5: 75 1a jne 10a511 <rtems_termios_read+0x339>
10a4f7: 90 nop
now = rtems_clock_get_ticks_since_boot();
if ((now - then) > tty->vtimeTicks) {
break;
}
}
rtems_task_wake_after (1);
10a4f8: 83 ec 0c sub $0xc,%esp
10a4fb: 6a 01 push $0x1
10a4fd: e8 66 16 00 00 call 10bb68 <rtems_task_wake_after>
10a502: 83 c4 10 add $0x10,%esp
10a505: eb a5 jmp 10a4ac <rtems_termios_read+0x2d4>
if ((now - then) > tty->vtimeTicks) {
break;
}
}
} else {
if (!tty->termios.c_cc[VTIME])
10a507: 80 7b 46 00 cmpb $0x0,0x46(%ebx) <== NOT EXECUTED
10a50b: 0f 84 43 fd ff ff je 10a254 <rtems_termios_read+0x7c><== NOT EXECUTED
break;
now = rtems_clock_get_ticks_since_boot();
10a511: e8 92 0a 00 00 call 10afa8 <rtems_clock_get_ticks_since_boot>
if ((now - then) > tty->vtimeTicks) {
10a516: 29 f0 sub %esi,%eax
10a518: 3b 43 54 cmp 0x54(%ebx),%eax
10a51b: 76 db jbe 10a4f8 <rtems_termios_read+0x320>
10a51d: e9 32 fd ff ff jmp 10a254 <rtems_termios_read+0x7c>
0010a8b8 <rtems_termios_refill_transmitter>:
* in task-driven mode, this function is called in Tx task context
* in interrupt-driven mode, this function is called in TxIRQ context
*/
int
rtems_termios_refill_transmitter (struct rtems_termios_tty *tty)
{
10a8b8: 55 push %ebp
10a8b9: 89 e5 mov %esp,%ebp
10a8bb: 57 push %edi
10a8bc: 56 push %esi
10a8bd: 53 push %ebx
10a8be: 83 ec 0c sub $0xc,%esp
10a8c1: 8b 5d 08 mov 0x8(%ebp),%ebx
int nToSend;
rtems_interrupt_level level;
int len;
/* check for XOF/XON to send */
if ((tty->flow_ctrl & (FL_MDXOF | FL_IREQXOF | FL_ISNTXOF))
10a8c4: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
10a8ca: 25 03 04 00 00 and $0x403,%eax
10a8cf: 3d 01 04 00 00 cmp $0x401,%eax
10a8d4: 0f 84 62 01 00 00 je 10aa3c <rtems_termios_refill_transmitter+0x184><== NEVER TAKEN
tty->flow_ctrl |= FL_ISNTXOF;
rtems_interrupt_enable(level);
nToSend = 1;
} else if ((tty->flow_ctrl & (FL_IREQXOF | FL_ISNTXOF)) == FL_ISNTXOF) {
10a8da: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
10a8e0: 83 e0 03 and $0x3,%eax
10a8e3: 83 f8 02 cmp $0x2,%eax
10a8e6: 0f 84 8c 01 00 00 je 10aa78 <rtems_termios_refill_transmitter+0x1c0><== NEVER TAKEN
tty->flow_ctrl &= ~FL_ISNTXOF;
rtems_interrupt_enable(level);
nToSend = 1;
} else {
if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) {
10a8ec: 8b 93 80 00 00 00 mov 0x80(%ebx),%edx
10a8f2: 8b 83 84 00 00 00 mov 0x84(%ebx),%eax
10a8f8: 39 c2 cmp %eax,%edx
10a8fa: 0f 84 a4 00 00 00 je 10a9a4 <rtems_termios_refill_transmitter+0xec>
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
}
return 0;
}
rtems_interrupt_disable(level);
10a900: 9c pushf
10a901: fa cli
10a902: 58 pop %eax
len = tty->t_dqlen;
10a903: 8b b3 90 00 00 00 mov 0x90(%ebx),%esi
tty->t_dqlen = 0;
10a909: c7 83 90 00 00 00 00 movl $0x0,0x90(%ebx)
10a910: 00 00 00
rtems_interrupt_enable(level);
10a913: 50 push %eax
10a914: 9d popf
newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size;
10a915: 8b 83 84 00 00 00 mov 0x84(%ebx),%eax
10a91b: 8b 8b 88 00 00 00 mov 0x88(%ebx),%ecx
10a921: 8d 04 06 lea (%esi,%eax,1),%eax
10a924: 31 d2 xor %edx,%edx
10a926: f7 f1 div %ecx
10a928: 89 d6 mov %edx,%esi
tty->rawOutBuf.Tail = newTail;
10a92a: 89 93 84 00 00 00 mov %edx,0x84(%ebx)
if (tty->rawOutBufState == rob_wait) {
10a930: 83 bb 94 00 00 00 02 cmpl $0x2,0x94(%ebx)
10a937: 0f 84 e7 00 00 00 je 10aa24 <rtems_termios_refill_transmitter+0x16c>
* wake up any pending writer task
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
}
if (newTail == tty->rawOutBuf.Head) {
10a93d: 8b 83 80 00 00 00 mov 0x80(%ebx),%eax
10a943: 39 f0 cmp %esi,%eax
10a945: 74 79 je 10a9c0 <rtems_termios_refill_transmitter+0x108>
if ( tty->tty_snd.sw_pfn != NULL) {
(*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg);
}
}
/* check, whether output should stop due to received XOFF */
else if ((tty->flow_ctrl & (FL_MDXON | FL_ORCVXOF))
10a947: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
10a94d: 25 10 02 00 00 and $0x210,%eax
10a952: 3d 10 02 00 00 cmp $0x210,%eax
10a957: 0f 84 57 01 00 00 je 10aab4 <rtems_termios_refill_transmitter+0x1fc><== NEVER TAKEN
nToSend = 0;
} else {
/*
* Buffer not empty, start tranmitter
*/
if (newTail > tty->rawOutBuf.Head)
10a95d: 8b 83 80 00 00 00 mov 0x80(%ebx),%eax
10a963: 39 c6 cmp %eax,%esi
10a965: 0f 87 91 00 00 00 ja 10a9fc <rtems_termios_refill_transmitter+0x144>
nToSend = tty->rawOutBuf.Size - newTail;
else
nToSend = tty->rawOutBuf.Head - newTail;
10a96b: 8b bb 80 00 00 00 mov 0x80(%ebx),%edi
10a971: 29 f7 sub %esi,%edi
/* when flow control XON or XOF, don't send blocks of data */
/* to allow fast reaction on incoming flow ctrl and low latency*/
/* for outgoing flow control */
if (tty->flow_ctrl & (FL_MDXON | FL_MDXOF)) {
10a973: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
10a979: f6 c4 06 test $0x6,%ah
10a97c: 0f 85 91 00 00 00 jne 10aa13 <rtems_termios_refill_transmitter+0x15b>
10a982: 89 f8 mov %edi,%eax
nToSend = 1;
}
tty->rawOutBufState = rob_busy; /*apm*/
10a984: c7 83 94 00 00 00 01 movl $0x1,0x94(%ebx)
10a98b: 00 00 00
(*tty->device.write)(
10a98e: 52 push %edx
10a98f: 50 push %eax
10a990: 8b 43 7c mov 0x7c(%ebx),%eax
10a993: 01 f0 add %esi,%eax
10a995: 50 push %eax
10a996: ff 73 10 pushl 0x10(%ebx)
10a999: ff 93 a4 00 00 00 call *0xa4(%ebx)
10a99f: 83 c4 10 add $0x10,%esp
10a9a2: eb 48 jmp 10a9ec <rtems_termios_refill_transmitter+0x134>
} else {
if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) {
/*
* buffer was empty
*/
if (tty->rawOutBufState == rob_wait) {
10a9a4: 83 bb 94 00 00 00 02 cmpl $0x2,0x94(%ebx)
10a9ab: 0f 84 2b 01 00 00 je 10aadc <rtems_termios_refill_transmitter+0x224><== NEVER TAKEN
/*
* this should never happen...
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
}
return 0;
10a9b1: 31 ff xor %edi,%edi
tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend);
}
tty->rawOutBuf.Tail = newTail; /*apm*/
}
return nToSend;
}
10a9b3: 89 f8 mov %edi,%eax
10a9b5: 8d 65 f4 lea -0xc(%ebp),%esp
10a9b8: 5b pop %ebx
10a9b9: 5e pop %esi
10a9ba: 5f pop %edi
10a9bb: c9 leave
10a9bc: c3 ret
10a9bd: 8d 76 00 lea 0x0(%esi),%esi
if (newTail == tty->rawOutBuf.Head) {
/*
* Buffer has become empty
*/
tty->rawOutBufState = rob_idle;
10a9c0: c7 83 94 00 00 00 00 movl $0x0,0x94(%ebx)
10a9c7: 00 00 00
nToSend = 0;
/*
* check to see if snd wakeup callback was set
*/
if ( tty->tty_snd.sw_pfn != NULL) {
10a9ca: 8b 83 d4 00 00 00 mov 0xd4(%ebx),%eax
10a9d0: 85 c0 test %eax,%eax
10a9d2: 0f 84 1c 01 00 00 je 10aaf4 <rtems_termios_refill_transmitter+0x23c><== ALWAYS TAKEN
(*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg);
10a9d8: 83 ec 08 sub $0x8,%esp <== NOT EXECUTED
10a9db: ff b3 d8 00 00 00 pushl 0xd8(%ebx) <== NOT EXECUTED
10a9e1: 8d 53 30 lea 0x30(%ebx),%edx <== NOT EXECUTED
10a9e4: 52 push %edx <== NOT EXECUTED
10a9e5: ff d0 call *%eax <== NOT EXECUTED
10a9e7: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
if (newTail == tty->rawOutBuf.Head) {
/*
* Buffer has become empty
*/
tty->rawOutBufState = rob_idle;
nToSend = 0;
10a9ea: 31 ff xor %edi,%edi <== NOT EXECUTED
}
tty->rawOutBufState = rob_busy; /*apm*/
(*tty->device.write)(
tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend);
}
tty->rawOutBuf.Tail = newTail; /*apm*/
10a9ec: 89 b3 84 00 00 00 mov %esi,0x84(%ebx)
}
return nToSend;
}
10a9f2: 89 f8 mov %edi,%eax
10a9f4: 8d 65 f4 lea -0xc(%ebp),%esp
10a9f7: 5b pop %ebx
10a9f8: 5e pop %esi
10a9f9: 5f pop %edi
10a9fa: c9 leave
10a9fb: c3 ret
} else {
/*
* Buffer not empty, start tranmitter
*/
if (newTail > tty->rawOutBuf.Head)
nToSend = tty->rawOutBuf.Size - newTail;
10a9fc: 8b bb 88 00 00 00 mov 0x88(%ebx),%edi
10aa02: 29 f7 sub %esi,%edi
else
nToSend = tty->rawOutBuf.Head - newTail;
/* when flow control XON or XOF, don't send blocks of data */
/* to allow fast reaction on incoming flow ctrl and low latency*/
/* for outgoing flow control */
if (tty->flow_ctrl & (FL_MDXON | FL_MDXOF)) {
10aa04: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
10aa0a: f6 c4 06 test $0x6,%ah
10aa0d: 0f 84 6f ff ff ff je 10a982 <rtems_termios_refill_transmitter+0xca><== ALWAYS TAKEN
10aa13: b8 01 00 00 00 mov $0x1,%eax
nToSend = 1;
10aa18: bf 01 00 00 00 mov $0x1,%edi
10aa1d: e9 62 ff ff ff jmp 10a984 <rtems_termios_refill_transmitter+0xcc>
10aa22: 66 90 xchg %ax,%ax
tty->rawOutBuf.Tail = newTail;
if (tty->rawOutBufState == rob_wait) {
/*
* wake up any pending writer task
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
10aa24: 83 ec 0c sub $0xc,%esp
10aa27: ff b3 8c 00 00 00 pushl 0x8c(%ebx)
10aa2d: e8 7a 0d 00 00 call 10b7ac <rtems_semaphore_release>
10aa32: 83 c4 10 add $0x10,%esp
10aa35: e9 03 ff ff ff jmp 10a93d <rtems_termios_refill_transmitter+0x85>
10aa3a: 66 90 xchg %ax,%ax
/* check for XOF/XON to send */
if ((tty->flow_ctrl & (FL_MDXOF | FL_IREQXOF | FL_ISNTXOF))
== (FL_MDXOF | FL_IREQXOF)) {
/* XOFF should be sent now... */
(*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1);
10aa3c: 56 push %esi <== NOT EXECUTED
10aa3d: 6a 01 push $0x1 <== NOT EXECUTED
10aa3f: 8d 43 4a lea 0x4a(%ebx),%eax <== NOT EXECUTED
10aa42: 50 push %eax <== NOT EXECUTED
10aa43: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
10aa46: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED
rtems_interrupt_disable(level);
10aa4c: 9c pushf <== NOT EXECUTED
10aa4d: fa cli <== NOT EXECUTED
10aa4e: 5a pop %edx <== NOT EXECUTED
tty->t_dqlen--;
10aa4f: ff 8b 90 00 00 00 decl 0x90(%ebx) <== NOT EXECUTED
tty->flow_ctrl |= FL_ISNTXOF;
10aa55: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10aa5b: 83 c8 02 or $0x2,%eax <== NOT EXECUTED
10aa5e: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
rtems_interrupt_enable(level);
10aa64: 52 push %edx <== NOT EXECUTED
10aa65: 9d popf <== NOT EXECUTED
10aa66: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
nToSend = 1;
10aa69: bf 01 00 00 00 mov $0x1,%edi <== NOT EXECUTED
tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend);
}
tty->rawOutBuf.Tail = newTail; /*apm*/
}
return nToSend;
}
10aa6e: 89 f8 mov %edi,%eax <== NOT EXECUTED
10aa70: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10aa73: 5b pop %ebx <== NOT EXECUTED
10aa74: 5e pop %esi <== NOT EXECUTED
10aa75: 5f pop %edi <== NOT EXECUTED
10aa76: c9 leave <== NOT EXECUTED
10aa77: c3 ret <== NOT EXECUTED
* FIXME: this .write call will generate another
* dequeue callback. This will advance the "Tail" in the data
* buffer, although the corresponding data is not yet out!
* Therefore the dequeue "length" should be reduced by 1
*/
(*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1);
10aa78: 51 push %ecx <== NOT EXECUTED
10aa79: 6a 01 push $0x1 <== NOT EXECUTED
10aa7b: 8d 43 49 lea 0x49(%ebx),%eax <== NOT EXECUTED
10aa7e: 50 push %eax <== NOT EXECUTED
10aa7f: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
10aa82: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED
rtems_interrupt_disable(level);
10aa88: 9c pushf <== NOT EXECUTED
10aa89: fa cli <== NOT EXECUTED
10aa8a: 5a pop %edx <== NOT EXECUTED
tty->t_dqlen--;
10aa8b: ff 8b 90 00 00 00 decl 0x90(%ebx) <== NOT EXECUTED
tty->flow_ctrl &= ~FL_ISNTXOF;
10aa91: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10aa97: 83 e0 fd and $0xfffffffd,%eax <== NOT EXECUTED
10aa9a: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
rtems_interrupt_enable(level);
10aaa0: 52 push %edx <== NOT EXECUTED
10aaa1: 9d popf <== NOT EXECUTED
10aaa2: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
nToSend = 1;
10aaa5: bf 01 00 00 00 mov $0x1,%edi <== NOT EXECUTED
tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend);
}
tty->rawOutBuf.Tail = newTail; /*apm*/
}
return nToSend;
}
10aaaa: 89 f8 mov %edi,%eax <== NOT EXECUTED
10aaac: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10aaaf: 5b pop %ebx <== NOT EXECUTED
10aab0: 5e pop %esi <== NOT EXECUTED
10aab1: 5f pop %edi <== NOT EXECUTED
10aab2: c9 leave <== NOT EXECUTED
10aab3: c3 ret <== NOT EXECUTED
/* check, whether output should stop due to received XOFF */
else if ((tty->flow_ctrl & (FL_MDXON | FL_ORCVXOF))
== (FL_MDXON | FL_ORCVXOF)) {
/* Buffer not empty, but output stops due to XOFF */
/* set flag, that output has been stopped */
rtems_interrupt_disable(level);
10aab4: 9c pushf <== NOT EXECUTED
10aab5: fa cli <== NOT EXECUTED
10aab6: 5a pop %edx <== NOT EXECUTED
tty->flow_ctrl |= FL_OSTOP;
10aab7: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10aabd: 83 c8 20 or $0x20,%eax <== NOT EXECUTED
10aac0: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
tty->rawOutBufState = rob_busy; /*apm*/
10aac6: c7 83 94 00 00 00 01 movl $0x1,0x94(%ebx) <== NOT EXECUTED
10aacd: 00 00 00
rtems_interrupt_enable(level);
10aad0: 52 push %edx <== NOT EXECUTED
10aad1: 9d popf <== NOT EXECUTED
nToSend = 0;
10aad2: 31 ff xor %edi,%edi <== NOT EXECUTED
10aad4: e9 13 ff ff ff jmp 10a9ec <rtems_termios_refill_transmitter+0x134><== NOT EXECUTED
10aad9: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
*/
if (tty->rawOutBufState == rob_wait) {
/*
* this should never happen...
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
10aadc: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10aadf: ff b3 8c 00 00 00 pushl 0x8c(%ebx) <== NOT EXECUTED
10aae5: e8 c2 0c 00 00 call 10b7ac <rtems_semaphore_release><== NOT EXECUTED
10aaea: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
return 0;
10aaed: 31 ff xor %edi,%edi <== NOT EXECUTED
10aaef: e9 bf fe ff ff jmp 10a9b3 <rtems_termios_refill_transmitter+0xfb><== NOT EXECUTED
if (newTail == tty->rawOutBuf.Head) {
/*
* Buffer has become empty
*/
tty->rawOutBufState = rob_idle;
nToSend = 0;
10aaf4: 31 ff xor %edi,%edi
10aaf6: e9 f1 fe ff ff jmp 10a9ec <rtems_termios_refill_transmitter+0x134>
0010a84c <rtems_termios_rxdaemon>:
/*
* this task actually processes any receive events
*/
static rtems_task rtems_termios_rxdaemon(rtems_task_argument argument)
{
10a84c: 55 push %ebp
10a84d: 89 e5 mov %esp,%ebp
10a84f: 57 push %edi
10a850: 56 push %esi
10a851: 53 push %ebx
10a852: 83 ec 1c sub $0x1c,%esp
10a855: 8b 5d 08 mov 0x8(%ebp),%ebx
10a858: 8d 75 e0 lea -0x20(%ebp),%esi
10a85b: 8d 7d e7 lea -0x19(%ebp),%edi
10a85e: eb 14 jmp 10a874 <rtems_termios_rxdaemon+0x28>
}
/*
* do something
*/
c = tty->device.pollRead(tty->minor);
10a860: 83 ec 0c sub $0xc,%esp
10a863: ff 73 10 pushl 0x10(%ebx)
10a866: ff 93 a0 00 00 00 call *0xa0(%ebx)
if (c != EOF) {
10a86c: 83 c4 10 add $0x10,%esp
10a86f: 83 f8 ff cmp $0xffffffff,%eax
10a872: 75 30 jne 10a8a4 <rtems_termios_rxdaemon+0x58>
while (1) {
/*
* wait for rtems event
*/
rtems_event_receive(
10a874: 56 push %esi
10a875: 6a 00 push $0x0
10a877: 6a 02 push $0x2
10a879: 6a 03 push $0x3
10a87b: e8 94 07 00 00 call 10b014 <rtems_event_receive>
(TERMIOS_RX_PROC_EVENT | TERMIOS_RX_TERMINATE_EVENT),
RTEMS_EVENT_ANY | RTEMS_WAIT,
RTEMS_NO_TIMEOUT,
&the_event
);
if ((the_event & TERMIOS_RX_TERMINATE_EVENT) != 0) {
10a880: 83 c4 10 add $0x10,%esp
10a883: f6 45 e0 01 testb $0x1,-0x20(%ebp)
10a887: 74 d7 je 10a860 <rtems_termios_rxdaemon+0x14><== ALWAYS TAKEN
tty->rxTaskId = 0;
10a889: c7 83 c4 00 00 00 00 movl $0x0,0xc4(%ebx) <== NOT EXECUTED
10a890: 00 00 00
rtems_task_delete(RTEMS_SELF);
10a893: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10a896: 6a 00 push $0x0 <== NOT EXECUTED
10a898: e8 0f 11 00 00 call 10b9ac <rtems_task_delete> <== NOT EXECUTED
10a89d: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10a8a0: eb be jmp 10a860 <rtems_termios_rxdaemon+0x14><== NOT EXECUTED
10a8a2: 66 90 xchg %ax,%ax <== NOT EXECUTED
c = tty->device.pollRead(tty->minor);
if (c != EOF) {
/*
* pollRead did call enqueue on its own
*/
c_buf = c;
10a8a4: 88 45 e7 mov %al,-0x19(%ebp)
rtems_termios_enqueue_raw_characters ( tty,&c_buf,1);
10a8a7: 50 push %eax
10a8a8: 6a 01 push $0x1
10a8aa: 57 push %edi
10a8ab: 53 push %ebx
10a8ac: e8 8f fc ff ff call 10a540 <rtems_termios_enqueue_raw_characters>
10a8b1: 83 c4 10 add $0x10,%esp
10a8b4: eb be jmp 10a874 <rtems_termios_rxdaemon+0x28>
0010aafc <rtems_termios_txdaemon>:
/*
* this task actually processes any transmit events
*/
static rtems_task rtems_termios_txdaemon(rtems_task_argument argument)
{
10aafc: 55 push %ebp
10aafd: 89 e5 mov %esp,%ebp
10aaff: 56 push %esi
10ab00: 53 push %ebx
10ab01: 83 ec 10 sub $0x10,%esp
10ab04: 8b 5d 08 mov 0x8(%ebp),%ebx
10ab07: 8d 75 f4 lea -0xc(%ebp),%esi
10ab0a: eb 28 jmp 10ab34 <rtems_termios_txdaemon+0x38>
}
/*
* call any line discipline start function
*/
if (rtems_termios_linesw[tty->t_line].l_start != NULL) {
10ab0c: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax
10ab12: c1 e0 05 shl $0x5,%eax
10ab15: 8b 80 b4 79 12 00 mov 0x1279b4(%eax),%eax
10ab1b: 85 c0 test %eax,%eax
10ab1d: 74 09 je 10ab28 <rtems_termios_txdaemon+0x2c><== ALWAYS TAKEN
rtems_termios_linesw[tty->t_line].l_start(tty);
10ab1f: 83 ec 0c sub $0xc,%esp
10ab22: 53 push %ebx <== NOT EXECUTED
10ab23: ff d0 call *%eax <== NOT EXECUTED
10ab25: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
/*
* try to push further characters to device
*/
rtems_termios_refill_transmitter(tty);
10ab28: 83 ec 0c sub $0xc,%esp
10ab2b: 53 push %ebx
10ab2c: e8 87 fd ff ff call 10a8b8 <rtems_termios_refill_transmitter>
}
10ab31: 83 c4 10 add $0x10,%esp
while (1) {
/*
* wait for rtems event
*/
rtems_event_receive(
10ab34: 56 push %esi
10ab35: 6a 00 push $0x0
10ab37: 6a 02 push $0x2
10ab39: 6a 03 push $0x3
10ab3b: e8 d4 04 00 00 call 10b014 <rtems_event_receive>
(TERMIOS_TX_START_EVENT | TERMIOS_TX_TERMINATE_EVENT),
RTEMS_EVENT_ANY | RTEMS_WAIT,
RTEMS_NO_TIMEOUT,
&the_event
);
if ((the_event & TERMIOS_TX_TERMINATE_EVENT) != 0) {
10ab40: 83 c4 10 add $0x10,%esp
10ab43: f6 45 f4 01 testb $0x1,-0xc(%ebp)
10ab47: 74 c3 je 10ab0c <rtems_termios_txdaemon+0x10><== ALWAYS TAKEN
tty->txTaskId = 0;
10ab49: c7 83 c8 00 00 00 00 movl $0x0,0xc8(%ebx) <== NOT EXECUTED
10ab50: 00 00 00
rtems_task_delete(RTEMS_SELF);
10ab53: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10ab56: 6a 00 push $0x0 <== NOT EXECUTED
10ab58: e8 4f 0e 00 00 call 10b9ac <rtems_task_delete> <== NOT EXECUTED
10ab5d: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10ab60: eb aa jmp 10ab0c <rtems_termios_txdaemon+0x10><== NOT EXECUTED
0010a10c <rtems_termios_write>:
rtems_termios_puts (&c, 1, tty);
}
rtems_status_code
rtems_termios_write (void *arg)
{
10a10c: 55 push %ebp
10a10d: 89 e5 mov %esp,%ebp
10a10f: 57 push %edi
10a110: 56 push %esi
10a111: 53 push %ebx
10a112: 83 ec 20 sub $0x20,%esp
10a115: 8b 7d 08 mov 0x8(%ebp),%edi
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
10a118: 8b 07 mov (%edi),%eax
10a11a: 8b 70 34 mov 0x34(%eax),%esi
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
10a11d: 6a 00 push $0x0
10a11f: 6a 00 push $0x0
10a121: ff 76 18 pushl 0x18(%esi)
10a124: e8 87 15 00 00 call 10b6b0 <rtems_semaphore_obtain>
10a129: 89 45 e4 mov %eax,-0x1c(%ebp)
if (sc != RTEMS_SUCCESSFUL)
10a12c: 83 c4 10 add $0x10,%esp
10a12f: 85 c0 test %eax,%eax
10a131: 75 29 jne 10a15c <rtems_termios_write+0x50><== NEVER TAKEN
return sc;
if (rtems_termios_linesw[tty->t_line].l_write != NULL) {
10a133: 8b 86 cc 00 00 00 mov 0xcc(%esi),%eax
10a139: c1 e0 05 shl $0x5,%eax
10a13c: 8b 80 ac 79 12 00 mov 0x1279ac(%eax),%eax
10a142: 85 c0 test %eax,%eax
10a144: 74 22 je 10a168 <rtems_termios_write+0x5c>
sc = rtems_termios_linesw[tty->t_line].l_write(tty,args);
10a146: 83 ec 08 sub $0x8,%esp
10a149: 57 push %edi
10a14a: 56 push %esi
10a14b: ff d0 call *%eax
10a14d: 89 45 e4 mov %eax,-0x1c(%ebp)
rtems_semaphore_release (tty->osem);
10a150: 5f pop %edi
10a151: ff 76 18 pushl 0x18(%esi)
10a154: e8 53 16 00 00 call 10b7ac <rtems_semaphore_release>
return sc;
10a159: 83 c4 10 add $0x10,%esp
rtems_termios_puts (args->buffer, args->count, tty);
args->bytes_moved = args->count;
}
rtems_semaphore_release (tty->osem);
return sc;
}
10a15c: 8b 45 e4 mov -0x1c(%ebp),%eax
10a15f: 8d 65 f4 lea -0xc(%ebp),%esp
10a162: 5b pop %ebx
10a163: 5e pop %esi
10a164: 5f pop %edi
10a165: c9 leave
10a166: c3 ret
10a167: 90 nop
if (rtems_termios_linesw[tty->t_line].l_write != NULL) {
sc = rtems_termios_linesw[tty->t_line].l_write(tty,args);
rtems_semaphore_release (tty->osem);
return sc;
}
if (tty->termios.c_oflag & OPOST) {
10a168: f6 46 34 01 testb $0x1,0x34(%esi)
10a16c: 74 4e je 10a1bc <rtems_termios_write+0xb0><== NEVER TAKEN
uint32_t count = args->count;
10a16e: 8b 47 10 mov 0x10(%edi),%eax
10a171: 89 45 e0 mov %eax,-0x20(%ebp)
char *buffer = args->buffer;
10a174: 8b 47 0c mov 0xc(%edi),%eax
while (count--)
10a177: 8b 5d e0 mov -0x20(%ebp),%ebx
10a17a: 85 db test %ebx,%ebx
10a17c: 74 56 je 10a1d4 <rtems_termios_write+0xc8><== NEVER TAKEN
10a17e: 31 db xor %ebx,%ebx
10a180: 89 7d dc mov %edi,-0x24(%ebp)
10a183: 89 c7 mov %eax,%edi
10a185: 8d 76 00 lea 0x0(%esi),%esi
oproc (*buffer++, tty);
10a188: 0f b6 04 1f movzbl (%edi,%ebx,1),%eax
10a18c: 89 f2 mov %esi,%edx
10a18e: e8 6d fa ff ff call 109c00 <oproc>
10a193: 43 inc %ebx
return sc;
}
if (tty->termios.c_oflag & OPOST) {
uint32_t count = args->count;
char *buffer = args->buffer;
while (count--)
10a194: 39 5d e0 cmp %ebx,-0x20(%ebp)
10a197: 75 ef jne 10a188 <rtems_termios_write+0x7c>
10a199: 8b 7d dc mov -0x24(%ebp),%edi
10a19c: 8b 47 10 mov 0x10(%edi),%eax
oproc (*buffer++, tty);
args->bytes_moved = args->count;
10a19f: 89 47 18 mov %eax,0x18(%edi)
} else {
rtems_termios_puts (args->buffer, args->count, tty);
args->bytes_moved = args->count;
}
rtems_semaphore_release (tty->osem);
10a1a2: 83 ec 0c sub $0xc,%esp
10a1a5: ff 76 18 pushl 0x18(%esi)
10a1a8: e8 ff 15 00 00 call 10b7ac <rtems_semaphore_release>
return sc;
10a1ad: 83 c4 10 add $0x10,%esp
}
10a1b0: 8b 45 e4 mov -0x1c(%ebp),%eax
10a1b3: 8d 65 f4 lea -0xc(%ebp),%esp
10a1b6: 5b pop %ebx
10a1b7: 5e pop %esi
10a1b8: 5f pop %edi
10a1b9: c9 leave
10a1ba: c3 ret
10a1bb: 90 nop
char *buffer = args->buffer;
while (count--)
oproc (*buffer++, tty);
args->bytes_moved = args->count;
} else {
rtems_termios_puts (args->buffer, args->count, tty);
10a1bc: 51 push %ecx <== NOT EXECUTED
10a1bd: 56 push %esi <== NOT EXECUTED
10a1be: ff 77 10 pushl 0x10(%edi) <== NOT EXECUTED
10a1c1: ff 77 0c pushl 0xc(%edi) <== NOT EXECUTED
10a1c4: e8 03 f9 ff ff call 109acc <rtems_termios_puts> <== NOT EXECUTED
args->bytes_moved = args->count;
10a1c9: 8b 47 10 mov 0x10(%edi),%eax <== NOT EXECUTED
10a1cc: 89 47 18 mov %eax,0x18(%edi) <== NOT EXECUTED
10a1cf: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10a1d2: eb ce jmp 10a1a2 <rtems_termios_write+0x96><== NOT EXECUTED
return sc;
}
if (tty->termios.c_oflag & OPOST) {
uint32_t count = args->count;
char *buffer = args->buffer;
while (count--)
10a1d4: 31 c0 xor %eax,%eax <== NOT EXECUTED
10a1d6: eb c7 jmp 10a19f <rtems_termios_write+0x93><== NOT EXECUTED
001186e0 <rtems_timer_cancel>:
*/
rtems_status_code rtems_timer_cancel(
rtems_id id
)
{
1186e0: 55 push %ebp
1186e1: 89 e5 mov %esp,%ebp
1186e3: 83 ec 1c sub $0x1c,%esp
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
1186e6: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
1186e9: 50 push %eax
1186ea: ff 75 08 pushl 0x8(%ebp)
1186ed: 68 40 35 14 00 push $0x143540
1186f2: e8 ed 2b 00 00 call 11b2e4 <_Objects_Get>
switch ( location ) {
1186f7: 83 c4 10 add $0x10,%esp
1186fa: 8b 55 f4 mov -0xc(%ebp),%edx
1186fd: 85 d2 test %edx,%edx
1186ff: 74 07 je 118708 <rtems_timer_cancel+0x28>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
118701: b8 04 00 00 00 mov $0x4,%eax
}
118706: c9 leave
118707: c3 ret
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Timer_Is_dormant_class( the_timer->the_class ) )
118708: 83 78 38 04 cmpl $0x4,0x38(%eax)
11870c: 74 0f je 11871d <rtems_timer_cancel+0x3d><== NEVER TAKEN
(void) _Watchdog_Remove( &the_timer->Ticker );
11870e: 83 ec 0c sub $0xc,%esp
118711: 83 c0 10 add $0x10,%eax
118714: 50 push %eax
118715: e8 56 48 00 00 call 11cf70 <_Watchdog_Remove>
11871a: 83 c4 10 add $0x10,%esp
_Thread_Enable_dispatch();
11871d: e8 76 36 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
118722: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118724: c9 leave
118725: c3 ret
0010bffc <rtems_timer_create>:
rtems_status_code rtems_timer_create(
rtems_name name,
rtems_id *id
)
{
10bffc: 55 push %ebp
10bffd: 89 e5 mov %esp,%ebp
10bfff: 57 push %edi
10c000: 56 push %esi
10c001: 53 push %ebx
10c002: 83 ec 0c sub $0xc,%esp
10c005: 8b 5d 08 mov 0x8(%ebp),%ebx
10c008: 8b 75 0c mov 0xc(%ebp),%esi
Timer_Control *the_timer;
if ( !rtems_is_name_valid( name ) )
10c00b: 85 db test %ebx,%ebx
10c00d: 74 6d je 10c07c <rtems_timer_create+0x80>
return RTEMS_INVALID_NAME;
if ( !id )
10c00f: 85 f6 test %esi,%esi
10c011: 0f 84 89 00 00 00 je 10c0a0 <rtems_timer_create+0xa4>
10c017: a1 90 98 12 00 mov 0x129890,%eax
10c01c: 40 inc %eax
10c01d: a3 90 98 12 00 mov %eax,0x129890
* This function allocates a timer control block from
* the inactive chain of free timer control blocks.
*/
RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Allocate( void )
{
return (Timer_Control *) _Objects_Allocate( &_Timer_Information );
10c022: 83 ec 0c sub $0xc,%esp
10c025: 68 00 a3 12 00 push $0x12a300
10c02a: e8 29 0f 00 00 call 10cf58 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* to prevent deletion */
the_timer = _Timer_Allocate();
if ( !the_timer ) {
10c02f: 83 c4 10 add $0x10,%esp
10c032: 85 c0 test %eax,%eax
10c034: 74 56 je 10c08c <rtems_timer_create+0x90>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_timer->the_class = TIMER_DORMANT;
10c036: c7 40 38 04 00 00 00 movl $0x4,0x38(%eax)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10c03d: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
the_watchdog->routine = routine;
10c044: c7 40 2c 00 00 00 00 movl $0x0,0x2c(%eax)
the_watchdog->id = id;
10c04b: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)
the_watchdog->user_data = user_data;
10c052: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10c059: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
10c05c: 0f b7 fa movzwl %dx,%edi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10c05f: 8b 0d 1c a3 12 00 mov 0x12a31c,%ecx
10c065: 89 04 b9 mov %eax,(%ecx,%edi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
10c068: 89 58 0c mov %ebx,0xc(%eax)
&_Timer_Information,
&the_timer->Object,
(Objects_Name) name
);
*id = the_timer->Object.id;
10c06b: 89 16 mov %edx,(%esi)
_Thread_Enable_dispatch();
10c06d: e8 52 1e 00 00 call 10dec4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c072: 31 c0 xor %eax,%eax
}
10c074: 8d 65 f4 lea -0xc(%ebp),%esp
10c077: 5b pop %ebx
10c078: 5e pop %esi
10c079: 5f pop %edi
10c07a: c9 leave
10c07b: c3 ret
)
{
Timer_Control *the_timer;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
10c07c: b8 03 00 00 00 mov $0x3,%eax
);
*id = the_timer->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c081: 8d 65 f4 lea -0xc(%ebp),%esp
10c084: 5b pop %ebx
10c085: 5e pop %esi
10c086: 5f pop %edi
10c087: c9 leave
10c088: c3 ret
10c089: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* to prevent deletion */
the_timer = _Timer_Allocate();
if ( !the_timer ) {
_Thread_Enable_dispatch();
10c08c: e8 33 1e 00 00 call 10dec4 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
10c091: b8 05 00 00 00 mov $0x5,%eax
);
*id = the_timer->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c096: 8d 65 f4 lea -0xc(%ebp),%esp
10c099: 5b pop %ebx
10c09a: 5e pop %esi
10c09b: 5f pop %edi
10c09c: c9 leave
10c09d: c3 ret
10c09e: 66 90 xchg %ax,%ax
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
10c0a0: b8 09 00 00 00 mov $0x9,%eax
);
*id = the_timer->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c0a5: 8d 65 f4 lea -0xc(%ebp),%esp
10c0a8: 5b pop %ebx
10c0a9: 5e pop %esi
10c0aa: 5f pop %edi
10c0ab: c9 leave
10c0ac: c3 ret
001187dc <rtems_timer_delete>:
*/
rtems_status_code rtems_timer_delete(
rtems_id id
)
{
1187dc: 55 push %ebp
1187dd: 89 e5 mov %esp,%ebp
1187df: 53 push %ebx
1187e0: 83 ec 18 sub $0x18,%esp
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
1187e3: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
1187e6: 50 push %eax
1187e7: ff 75 08 pushl 0x8(%ebp)
1187ea: 68 40 35 14 00 push $0x143540
1187ef: e8 f0 2a 00 00 call 11b2e4 <_Objects_Get>
1187f4: 89 c3 mov %eax,%ebx
switch ( location ) {
1187f6: 83 c4 10 add $0x10,%esp
1187f9: 8b 4d f4 mov -0xc(%ebp),%ecx
1187fc: 85 c9 test %ecx,%ecx
1187fe: 75 38 jne 118838 <rtems_timer_delete+0x5c>
case OBJECTS_LOCAL:
_Objects_Close( &_Timer_Information, &the_timer->Object );
118800: 83 ec 08 sub $0x8,%esp
118803: 50 push %eax
118804: 68 40 35 14 00 push $0x143540
118809: e8 5e 26 00 00 call 11ae6c <_Objects_Close>
(void) _Watchdog_Remove( &the_timer->Ticker );
11880e: 8d 43 10 lea 0x10(%ebx),%eax
118811: 89 04 24 mov %eax,(%esp)
118814: e8 57 47 00 00 call 11cf70 <_Watchdog_Remove>
*/
RTEMS_INLINE_ROUTINE void _Timer_Free (
Timer_Control *the_timer
)
{
_Objects_Free( &_Timer_Information, &the_timer->Object );
118819: 58 pop %eax
11881a: 5a pop %edx
11881b: 53 push %ebx
11881c: 68 40 35 14 00 push $0x143540
118821: e8 42 29 00 00 call 11b168 <_Objects_Free>
_Timer_Free( the_timer );
_Thread_Enable_dispatch();
118826: e8 6d 35 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
11882b: 83 c4 10 add $0x10,%esp
11882e: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118830: 8b 5d fc mov -0x4(%ebp),%ebx
118833: c9 leave
118834: c3 ret
118835: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
118838: b8 04 00 00 00 mov $0x4,%eax
}
11883d: 8b 5d fc mov -0x4(%ebp),%ebx
118840: c9 leave
118841: c3 ret
0010c0b0 <rtems_timer_fire_after>:
rtems_id id,
rtems_interval ticks,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
10c0b0: 55 push %ebp
10c0b1: 89 e5 mov %esp,%ebp
10c0b3: 57 push %edi
10c0b4: 56 push %esi
10c0b5: 53 push %ebx
10c0b6: 83 ec 2c sub $0x2c,%esp
10c0b9: 8b 5d 0c mov 0xc(%ebp),%ebx
10c0bc: 8b 75 10 mov 0x10(%ebp),%esi
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
if ( ticks == 0 )
10c0bf: 85 db test %ebx,%ebx
10c0c1: 0f 84 99 00 00 00 je 10c160 <rtems_timer_fire_after+0xb0>
return RTEMS_INVALID_NUMBER;
if ( !routine )
10c0c7: 85 f6 test %esi,%esi
10c0c9: 0f 84 b1 00 00 00 je 10c180 <rtems_timer_fire_after+0xd0>
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
10c0cf: 57 push %edi
return RTEMS_INVALID_ADDRESS;
the_timer = _Timer_Get( id, &location );
10c0d0: 8d 45 e4 lea -0x1c(%ebp),%eax
10c0d3: 50 push %eax
10c0d4: ff 75 08 pushl 0x8(%ebp)
10c0d7: 68 00 a3 12 00 push $0x12a300
10c0dc: e8 2f 13 00 00 call 10d410 <_Objects_Get>
10c0e1: 89 c7 mov %eax,%edi
switch ( location ) {
10c0e3: 83 c4 10 add $0x10,%esp
10c0e6: 8b 4d e4 mov -0x1c(%ebp),%ecx
10c0e9: 85 c9 test %ecx,%ecx
10c0eb: 74 0f je 10c0fc <rtems_timer_fire_after+0x4c>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10c0ed: b8 04 00 00 00 mov $0x4,%eax
}
10c0f2: 8d 65 f4 lea -0xc(%ebp),%esp
10c0f5: 5b pop %ebx
10c0f6: 5e pop %esi
10c0f7: 5f pop %edi
10c0f8: c9 leave
10c0f9: c3 ret
10c0fa: 66 90 xchg %ax,%ax
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
10c0fc: 8d 50 10 lea 0x10(%eax),%edx
10c0ff: 83 ec 0c sub $0xc,%esp
10c102: 52 push %edx
10c103: 89 55 d4 mov %edx,-0x2c(%ebp)
10c106: e8 fd 2c 00 00 call 10ee08 <_Watchdog_Remove>
_ISR_Disable( level );
10c10b: 9c pushf
10c10c: fa cli
10c10d: 58 pop %eax
/*
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_timer->Ticker.state != WATCHDOG_INACTIVE ) {
10c10e: 83 c4 10 add $0x10,%esp
10c111: 8b 57 18 mov 0x18(%edi),%edx
10c114: 85 d2 test %edx,%edx
10c116: 8b 55 d4 mov -0x2c(%ebp),%edx
10c119: 75 55 jne 10c170 <rtems_timer_fire_after+0xc0>
/*
* OK. Now we now the timer was not rescheduled by an interrupt
* so we can atomically initialize it as in use.
*/
the_timer->the_class = TIMER_INTERVAL;
10c11b: c7 47 38 00 00 00 00 movl $0x0,0x38(%edi)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10c122: c7 47 18 00 00 00 00 movl $0x0,0x18(%edi)
the_watchdog->routine = routine;
10c129: 89 77 2c mov %esi,0x2c(%edi)
the_watchdog->id = id;
10c12c: 8b 4d 08 mov 0x8(%ebp),%ecx
10c12f: 89 4f 30 mov %ecx,0x30(%edi)
the_watchdog->user_data = user_data;
10c132: 8b 4d 14 mov 0x14(%ebp),%ecx
10c135: 89 4f 34 mov %ecx,0x34(%edi)
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
_ISR_Enable( level );
10c138: 50 push %eax
10c139: 9d popf
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10c13a: 89 5f 1c mov %ebx,0x1c(%edi)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10c13d: 83 ec 08 sub $0x8,%esp
10c140: 52 push %edx
10c141: 68 9c 99 12 00 push $0x12999c
10c146: e8 7d 2b 00 00 call 10ecc8 <_Watchdog_Insert>
_Watchdog_Insert_ticks( &the_timer->Ticker, ticks );
_Thread_Enable_dispatch();
10c14b: e8 74 1d 00 00 call 10dec4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c150: 83 c4 10 add $0x10,%esp
10c153: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c155: 8d 65 f4 lea -0xc(%ebp),%esp
10c158: 5b pop %ebx
10c159: 5e pop %esi
10c15a: 5f pop %edi
10c15b: c9 leave
10c15c: c3 ret
10c15d: 8d 76 00 lea 0x0(%esi),%esi
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
if ( ticks == 0 )
return RTEMS_INVALID_NUMBER;
10c160: b8 0a 00 00 00 mov $0xa,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c165: 8d 65 f4 lea -0xc(%ebp),%esp
10c168: 5b pop %ebx
10c169: 5e pop %esi
10c16a: 5f pop %edi
10c16b: c9 leave
10c16c: c3 ret
10c16d: 8d 76 00 lea 0x0(%esi),%esi
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_timer->Ticker.state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
10c170: 50 push %eax
10c171: 9d popf
_Thread_Enable_dispatch();
10c172: e8 4d 1d 00 00 call 10dec4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c177: 31 c0 xor %eax,%eax
10c179: e9 74 ff ff ff jmp 10c0f2 <rtems_timer_fire_after+0x42>
10c17e: 66 90 xchg %ax,%ax
if ( ticks == 0 )
return RTEMS_INVALID_NUMBER;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
10c180: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c185: 8d 65 f4 lea -0xc(%ebp),%esp
10c188: 5b pop %ebx
10c189: 5e pop %esi
10c18a: 5f pop %edi
10c18b: c9 leave
10c18c: c3 ret
00118924 <rtems_timer_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
118924: 55 push %ebp
118925: 89 e5 mov %esp,%ebp
118927: 57 push %edi
118928: 56 push %esi
118929: 53 push %ebx
11892a: 83 ec 2c sub $0x2c,%esp
11892d: 8b 75 08 mov 0x8(%ebp),%esi
118930: 8b 7d 0c mov 0xc(%ebp),%edi
118933: 8b 5d 10 mov 0x10(%ebp),%ebx
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
if ( !_TOD_Is_set )
118936: 80 3d e4 2a 14 00 00 cmpb $0x0,0x142ae4
11893d: 75 0d jne 11894c <rtems_timer_fire_when+0x28>
return RTEMS_NOT_DEFINED;
11893f: b8 0b 00 00 00 mov $0xb,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118944: 8d 65 f4 lea -0xc(%ebp),%esp
118947: 5b pop %ebx
118948: 5e pop %esi
118949: 5f pop %edi
11894a: c9 leave
11894b: c3 ret
rtems_interval seconds;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !_TOD_Validate( wall_time ) )
11894c: 83 ec 0c sub $0xc,%esp
11894f: 57 push %edi
118950: e8 87 d4 ff ff call 115ddc <_TOD_Validate>
118955: 83 c4 10 add $0x10,%esp
118958: 84 c0 test %al,%al
11895a: 74 1e je 11897a <rtems_timer_fire_when+0x56>
return RTEMS_INVALID_CLOCK;
if ( !routine )
11895c: 85 db test %ebx,%ebx
11895e: 0f 84 a4 00 00 00 je 118a08 <rtems_timer_fire_when+0xe4>
return RTEMS_INVALID_ADDRESS;
seconds = _TOD_To_seconds( wall_time );
118964: 83 ec 0c sub $0xc,%esp
118967: 57 push %edi
118968: e8 e3 d3 ff ff call 115d50 <_TOD_To_seconds>
11896d: 89 c7 mov %eax,%edi
if ( seconds <= _TOD_Seconds_since_epoch() )
11896f: 83 c4 10 add $0x10,%esp
118972: 3b 05 a4 2b 14 00 cmp 0x142ba4,%eax
118978: 77 0e ja 118988 <rtems_timer_fire_when+0x64>
return RTEMS_INVALID_CLOCK;
11897a: b8 14 00 00 00 mov $0x14,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11897f: 8d 65 f4 lea -0xc(%ebp),%esp
118982: 5b pop %ebx
118983: 5e pop %esi
118984: 5f pop %edi
118985: c9 leave
118986: c3 ret
118987: 90 nop
118988: 50 push %eax
seconds = _TOD_To_seconds( wall_time );
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
118989: 8d 45 e4 lea -0x1c(%ebp),%eax
11898c: 50 push %eax
11898d: 56 push %esi
11898e: 68 40 35 14 00 push $0x143540
118993: e8 4c 29 00 00 call 11b2e4 <_Objects_Get>
switch ( location ) {
118998: 83 c4 10 add $0x10,%esp
11899b: 8b 4d e4 mov -0x1c(%ebp),%ecx
11899e: 85 c9 test %ecx,%ecx
1189a0: 75 5a jne 1189fc <rtems_timer_fire_when+0xd8>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
1189a2: 8d 48 10 lea 0x10(%eax),%ecx
1189a5: 83 ec 0c sub $0xc,%esp
1189a8: 51 push %ecx
1189a9: 89 45 d0 mov %eax,-0x30(%ebp)
1189ac: 89 4d d4 mov %ecx,-0x2c(%ebp)
1189af: e8 bc 45 00 00 call 11cf70 <_Watchdog_Remove>
the_timer->the_class = TIMER_TIME_OF_DAY;
1189b4: 8b 55 d0 mov -0x30(%ebp),%edx
1189b7: c7 42 38 02 00 00 00 movl $0x2,0x38(%edx)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
1189be: c7 42 18 00 00 00 00 movl $0x0,0x18(%edx)
the_watchdog->routine = routine;
1189c5: 89 5a 2c mov %ebx,0x2c(%edx)
the_watchdog->id = id;
1189c8: 89 72 30 mov %esi,0x30(%edx)
the_watchdog->user_data = user_data;
1189cb: 8b 45 14 mov 0x14(%ebp),%eax
1189ce: 89 42 34 mov %eax,0x34(%edx)
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
_Watchdog_Insert_seconds(
1189d1: 2b 3d a4 2b 14 00 sub 0x142ba4,%edi
1189d7: 89 7a 1c mov %edi,0x1c(%edx)
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
1189da: 58 pop %eax
1189db: 5a pop %edx
1189dc: 8b 4d d4 mov -0x2c(%ebp),%ecx
1189df: 51 push %ecx
1189e0: 68 d0 2b 14 00 push $0x142bd0
1189e5: e8 46 44 00 00 call 11ce30 <_Watchdog_Insert>
&the_timer->Ticker,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
1189ea: e8 a9 33 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
1189ef: 83 c4 10 add $0x10,%esp
1189f2: 31 c0 xor %eax,%eax
1189f4: e9 4b ff ff ff jmp 118944 <rtems_timer_fire_when+0x20>
1189f9: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1189fc: b8 04 00 00 00 mov $0x4,%eax
118a01: e9 3e ff ff ff jmp 118944 <rtems_timer_fire_when+0x20>
118a06: 66 90 xchg %ax,%ax
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
118a08: b8 09 00 00 00 mov $0x9,%eax
118a0d: e9 32 ff ff ff jmp 118944 <rtems_timer_fire_when+0x20>
001190bc <rtems_timer_initiate_server>:
rtems_status_code rtems_timer_initiate_server(
uint32_t priority,
uint32_t stack_size,
rtems_attribute attribute_set
)
{
1190bc: 55 push %ebp
1190bd: 89 e5 mov %esp,%ebp
1190bf: 56 push %esi
1190c0: 53 push %ebx
1190c1: 83 ec 10 sub $0x10,%esp
1190c4: 8b 45 08 mov 0x8(%ebp),%eax
1190c7: 85 c0 test %eax,%eax
1190c9: 74 41 je 11910c <rtems_timer_initiate_server+0x50>
( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
1190cb: 0f b6 15 54 a3 13 00 movzbl 0x13a354,%edx
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
1190d2: 39 d0 cmp %edx,%eax
1190d4: 76 42 jbe 119118 <rtems_timer_initiate_server+0x5c>
* structured so we check it is invalid before looking for
* a specific invalid value as the default.
*/
_priority = priority;
if ( !_RTEMS_tasks_Priority_is_valid( priority ) ) {
if ( priority != RTEMS_TIMER_SERVER_DEFAULT_PRIORITY )
1190d6: 40 inc %eax
1190d7: 75 33 jne 11910c <rtems_timer_initiate_server+0x50>
return RTEMS_INVALID_PRIORITY;
_priority = 0;
1190d9: 31 f6 xor %esi,%esi
1190db: 8b 15 d0 2a 14 00 mov 0x142ad0,%edx
1190e1: 42 inc %edx
1190e2: 89 15 d0 2a 14 00 mov %edx,0x142ad0
/*
* Just to make sure this is only called once.
*/
_Thread_Disable_dispatch();
tmpInitialized = initialized;
1190e8: 8a 1d 00 e4 13 00 mov 0x13e400,%bl
initialized = true;
1190ee: c6 05 00 e4 13 00 01 movb $0x1,0x13e400
_Thread_Enable_dispatch();
1190f5: e8 9e 2c 00 00 call 11bd98 <_Thread_Enable_dispatch>
if ( tmpInitialized )
1190fa: 84 db test %bl,%bl
1190fc: 74 1e je 11911c <rtems_timer_initiate_server+0x60>
return RTEMS_INCORRECT_STATE;
1190fe: b8 0e 00 00 00 mov $0xe,%eax
initialized = false;
}
#endif
return status;
}
119103: 8d 65 f8 lea -0x8(%ebp),%esp
119106: 5b pop %ebx
119107: 5e pop %esi
119108: c9 leave
119109: c3 ret
11910a: 66 90 xchg %ax,%ax
* a specific invalid value as the default.
*/
_priority = priority;
if ( !_RTEMS_tasks_Priority_is_valid( priority ) ) {
if ( priority != RTEMS_TIMER_SERVER_DEFAULT_PRIORITY )
return RTEMS_INVALID_PRIORITY;
11910c: b8 13 00 00 00 mov $0x13,%eax
initialized = false;
}
#endif
return status;
}
119111: 8d 65 f8 lea -0x8(%ebp),%esp
119114: 5b pop %ebx
119115: 5e pop %esi
119116: c9 leave
119117: c3 ret
119118: 89 c6 mov %eax,%esi
11911a: eb bf jmp 1190db <rtems_timer_initiate_server+0x1f>
* other library rules. For example, if using a TSR written in Ada the
* Server should run at the same priority as the priority Ada task.
* Otherwise, the priority ceiling for the mutex used to protect the
* GNAT run-time is violated.
*/
status = rtems_task_create(
11911c: 83 ec 08 sub $0x8,%esp
11911f: 8d 45 f4 lea -0xc(%ebp),%eax
119122: 50 push %eax
119123: 8b 45 10 mov 0x10(%ebp),%eax
119126: 80 cc 80 or $0x80,%ah
119129: 50 push %eax
11912a: 68 00 01 00 00 push $0x100
11912f: ff 75 0c pushl 0xc(%ebp)
119132: 56 push %esi
119133: 68 45 4d 49 54 push $0x54494d45
119138: e8 bb ec ff ff call 117df8 <rtems_task_create>
/* user may want floating point but we need */
/* system task specified for 0 priority */
attribute_set | RTEMS_SYSTEM_TASK,
&id /* get the id back */
);
if (status) {
11913d: 83 c4 20 add $0x20,%esp
119140: 85 c0 test %eax,%eax
119142: 74 10 je 119154 <rtems_timer_initiate_server+0x98>
initialized = false;
119144: c6 05 00 e4 13 00 00 movb $0x0,0x13e400
initialized = false;
}
#endif
return status;
}
11914b: 8d 65 f8 lea -0x8(%ebp),%esp
11914e: 5b pop %ebx
11914f: 5e pop %esi
119150: c9 leave
119151: c3 ret
119152: 66 90 xchg %ax,%ax
* We work with the TCB pointer, not the ID, so we need to convert
* to a TCB pointer from here out.
*/
ts->thread = (Thread_Control *)_Objects_Get_local_object(
&_RTEMS_tasks_Information,
_Objects_Get_index(id)
119154: 8b 45 f4 mov -0xc(%ebp),%eax
*/
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return NULL;
#endif
return information->local_table[ index ];
119157: 0f b7 c8 movzwl %ax,%ecx
11915a: 8b 15 7c 2a 14 00 mov 0x142a7c,%edx
/*
* We work with the TCB pointer, not the ID, so we need to convert
* to a TCB pointer from here out.
*/
ts->thread = (Thread_Control *)_Objects_Get_local_object(
119160: 8b 14 8a mov (%edx,%ecx,4),%edx
119163: 89 15 80 e3 13 00 mov %edx,0x13e380
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
119169: c7 05 b0 e3 13 00 b4 movl $0x13e3b4,0x13e3b0
119170: e3 13 00
head->previous = NULL;
119173: c7 05 b4 e3 13 00 00 movl $0x0,0x13e3b4
11917a: 00 00 00
tail->previous = head;
11917d: c7 05 b8 e3 13 00 b0 movl $0x13e3b0,0x13e3b8
119184: e3 13 00
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
119187: c7 05 e8 e3 13 00 ec movl $0x13e3ec,0x13e3e8
11918e: e3 13 00
head->previous = NULL;
119191: c7 05 ec e3 13 00 00 movl $0x0,0x13e3ec
119198: 00 00 00
tail->previous = head;
11919b: c7 05 f0 e3 13 00 e8 movl $0x13e3e8,0x13e3f0
1191a2: e3 13 00
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
1191a5: c7 05 90 e3 13 00 00 movl $0x0,0x13e390
1191ac: 00 00 00
the_watchdog->routine = routine;
1191af: c7 05 a4 e3 13 00 e4 movl $0x11bbe4,0x13e3a4
1191b6: bb 11 00
the_watchdog->id = id;
1191b9: a3 a8 e3 13 00 mov %eax,0x13e3a8
the_watchdog->user_data = user_data;
1191be: c7 05 ac e3 13 00 00 movl $0x0,0x13e3ac
1191c5: 00 00 00
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
1191c8: c7 05 c8 e3 13 00 00 movl $0x0,0x13e3c8
1191cf: 00 00 00
the_watchdog->routine = routine;
1191d2: c7 05 dc e3 13 00 e4 movl $0x11bbe4,0x13e3dc
1191d9: bb 11 00
the_watchdog->id = id;
1191dc: a3 e0 e3 13 00 mov %eax,0x13e3e0
the_watchdog->user_data = user_data;
1191e1: c7 05 e4 e3 13 00 00 movl $0x0,0x13e3e4
1191e8: 00 00 00
/*
* Initialize the pointer to the timer schedule method so applications that
* do not use the Timer Server do not have to pull it in.
*/
ts->schedule_operation = _Timer_server_Schedule_operation_method;
1191eb: c7 05 84 e3 13 00 8c movl $0x118f8c,0x13e384
1191f2: 8f 11 00
ts->Interval_watchdogs.last_snapshot = _Watchdog_Ticks_since_boot;
1191f5: 8b 15 44 2c 14 00 mov 0x142c44,%edx
1191fb: 89 15 bc e3 13 00 mov %edx,0x13e3bc
ts->TOD_watchdogs.last_snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
119201: 8b 15 a4 2b 14 00 mov 0x142ba4,%edx
119207: 89 15 f4 e3 13 00 mov %edx,0x13e3f4
ts->insert_chain = NULL;
11920d: c7 05 f8 e3 13 00 00 movl $0x0,0x13e3f8
119214: 00 00 00
ts->active = false;
119217: c6 05 fc e3 13 00 00 movb $0x0,0x13e3fc
/*
* The default timer server is now available.
*/
_Timer_server = ts;
11921e: c7 05 80 35 14 00 80 movl $0x13e380,0x143580
119225: e3 13 00
/*
* Start the timer server
*/
status = rtems_task_start(
119228: 53 push %ebx
119229: 68 80 e3 13 00 push $0x13e380
11922e: 68 c4 8d 11 00 push $0x118dc4
119233: 50 push %eax
119234: e8 7f f2 ff ff call 1184b8 <rtems_task_start>
if (status) {
initialized = false;
}
#endif
return status;
119239: 83 c4 10 add $0x10,%esp
11923c: e9 d0 fe ff ff jmp 119111 <rtems_timer_initiate_server+0x55>
00118a9c <rtems_timer_reset>:
*/
rtems_status_code rtems_timer_reset(
rtems_id id
)
{
118a9c: 55 push %ebp
118a9d: 89 e5 mov %esp,%ebp
118a9f: 56 push %esi
118aa0: 53 push %ebx
118aa1: 83 ec 24 sub $0x24,%esp
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
the_timer = _Timer_Get( id, &location );
118aa4: 8d 45 f4 lea -0xc(%ebp),%eax
118aa7: 50 push %eax
118aa8: ff 75 08 pushl 0x8(%ebp)
118aab: 68 40 35 14 00 push $0x143540
118ab0: e8 2f 28 00 00 call 11b2e4 <_Objects_Get>
118ab5: 89 c3 mov %eax,%ebx
switch ( location ) {
118ab7: 83 c4 10 add $0x10,%esp
118aba: 8b 45 f4 mov -0xc(%ebp),%eax
118abd: 85 c0 test %eax,%eax
118abf: 74 0f je 118ad0 <rtems_timer_reset+0x34>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
118ac1: b8 04 00 00 00 mov $0x4,%eax
}
118ac6: 8d 65 f8 lea -0x8(%ebp),%esp
118ac9: 5b pop %ebx
118aca: 5e pop %esi
118acb: c9 leave
118acc: c3 ret
118acd: 8d 76 00 lea 0x0(%esi),%esi
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
118ad0: 8b 43 38 mov 0x38(%ebx),%eax
118ad3: 85 c0 test %eax,%eax
118ad5: 74 1d je 118af4 <rtems_timer_reset+0x58>
_Watchdog_Remove( &the_timer->Ticker );
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
} else if ( the_timer->the_class == TIMER_INTERVAL_ON_TASK ) {
118ad7: 48 dec %eax
118ad8: 74 3a je 118b14 <rtems_timer_reset+0x78>
/*
* Must be dormant or time of day timer (e.g. TIMER_DORMANT,
* TIMER_TIME_OF_DAY, or TIMER_TIME_OF_DAY_ON_TASK). We
* can only reset active interval timers.
*/
status = RTEMS_NOT_DEFINED;
118ada: b8 0b 00 00 00 mov $0xb,%eax
}
_Thread_Enable_dispatch();
118adf: 89 45 e4 mov %eax,-0x1c(%ebp)
118ae2: e8 b1 32 00 00 call 11bd98 <_Thread_Enable_dispatch>
return status;
118ae7: 8b 45 e4 mov -0x1c(%ebp),%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118aea: 8d 65 f8 lea -0x8(%ebp),%esp
118aed: 5b pop %ebx
118aee: 5e pop %esi
118aef: c9 leave
118af0: c3 ret
118af1: 8d 76 00 lea 0x0(%esi),%esi
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
_Watchdog_Remove( &the_timer->Ticker );
118af4: 83 c3 10 add $0x10,%ebx
118af7: 83 ec 0c sub $0xc,%esp
118afa: 53 push %ebx
118afb: e8 70 44 00 00 call 11cf70 <_Watchdog_Remove>
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
118b00: 59 pop %ecx
118b01: 5e pop %esi
118b02: 53 push %ebx
118b03: 68 dc 2b 14 00 push $0x142bdc
118b08: e8 23 43 00 00 call 11ce30 <_Watchdog_Insert>
118b0d: 83 c4 10 add $0x10,%esp
rtems_id id
)
{
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
118b10: 31 c0 xor %eax,%eax
118b12: eb cb jmp 118adf <rtems_timer_reset+0x43>
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
_Watchdog_Remove( &the_timer->Ticker );
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
} else if ( the_timer->the_class == TIMER_INTERVAL_ON_TASK ) {
Timer_server_Control *timer_server = _Timer_server;
118b14: 8b 35 80 35 14 00 mov 0x143580,%esi
if ( !timer_server ) {
_Thread_Enable_dispatch();
return RTEMS_INCORRECT_STATE;
}
#endif
_Watchdog_Remove( &the_timer->Ticker );
118b1a: 83 ec 0c sub $0xc,%esp
118b1d: 8d 43 10 lea 0x10(%ebx),%eax
118b20: 50 push %eax
118b21: e8 4a 44 00 00 call 11cf70 <_Watchdog_Remove>
(*timer_server->schedule_operation)( timer_server, the_timer );
118b26: 58 pop %eax
118b27: 5a pop %edx
118b28: 53 push %ebx
118b29: 56 push %esi
118b2a: ff 56 04 call *0x4(%esi)
118b2d: 83 c4 10 add $0x10,%esp
rtems_id id
)
{
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
118b30: 31 c0 xor %eax,%eax
118b32: eb ab jmp 118adf <rtems_timer_reset+0x43>
00118b34 <rtems_timer_server_fire_after>:
rtems_id id,
rtems_interval ticks,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
118b34: 55 push %ebp
118b35: 89 e5 mov %esp,%ebp
118b37: 57 push %edi
118b38: 56 push %esi
118b39: 53 push %ebx
118b3a: 83 ec 2c sub $0x2c,%esp
118b3d: 8b 7d 0c mov 0xc(%ebp),%edi
118b40: 8b 75 10 mov 0x10(%ebp),%esi
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
Timer_server_Control *timer_server = _Timer_server;
118b43: 8b 1d 80 35 14 00 mov 0x143580,%ebx
if ( !timer_server )
118b49: 85 db test %ebx,%ebx
118b4b: 0f 84 9f 00 00 00 je 118bf0 <rtems_timer_server_fire_after+0xbc>
return RTEMS_INCORRECT_STATE;
if ( !routine )
118b51: 85 f6 test %esi,%esi
118b53: 0f 84 a3 00 00 00 je 118bfc <rtems_timer_server_fire_after+0xc8>
return RTEMS_INVALID_ADDRESS;
if ( ticks == 0 )
118b59: 85 ff test %edi,%edi
118b5b: 75 0f jne 118b6c <rtems_timer_server_fire_after+0x38>
return RTEMS_INVALID_NUMBER;
118b5d: b8 0a 00 00 00 mov $0xa,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118b62: 8d 65 f4 lea -0xc(%ebp),%esp
118b65: 5b pop %ebx
118b66: 5e pop %esi
118b67: 5f pop %edi
118b68: c9 leave
118b69: c3 ret
118b6a: 66 90 xchg %ax,%ax
118b6c: 52 push %edx
return RTEMS_INVALID_ADDRESS;
if ( ticks == 0 )
return RTEMS_INVALID_NUMBER;
the_timer = _Timer_Get( id, &location );
118b6d: 8d 45 e4 lea -0x1c(%ebp),%eax
118b70: 50 push %eax
118b71: ff 75 08 pushl 0x8(%ebp)
118b74: 68 40 35 14 00 push $0x143540
118b79: e8 66 27 00 00 call 11b2e4 <_Objects_Get>
118b7e: 89 c2 mov %eax,%edx
switch ( location ) {
118b80: 83 c4 10 add $0x10,%esp
118b83: 8b 45 e4 mov -0x1c(%ebp),%eax
118b86: 85 c0 test %eax,%eax
118b88: 75 56 jne 118be0 <rtems_timer_server_fire_after+0xac>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
118b8a: 83 ec 0c sub $0xc,%esp
118b8d: 8d 42 10 lea 0x10(%edx),%eax
118b90: 50 push %eax
118b91: 89 55 d4 mov %edx,-0x2c(%ebp)
118b94: e8 d7 43 00 00 call 11cf70 <_Watchdog_Remove>
_ISR_Disable( level );
118b99: 9c pushf
118b9a: fa cli
118b9b: 58 pop %eax
/*
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_timer->Ticker.state != WATCHDOG_INACTIVE ) {
118b9c: 83 c4 10 add $0x10,%esp
118b9f: 8b 55 d4 mov -0x2c(%ebp),%edx
118ba2: 8b 4a 18 mov 0x18(%edx),%ecx
118ba5: 85 c9 test %ecx,%ecx
118ba7: 75 5f jne 118c08 <rtems_timer_server_fire_after+0xd4>
/*
* OK. Now we now the timer was not rescheduled by an interrupt
* so we can atomically initialize it as in use.
*/
the_timer->the_class = TIMER_INTERVAL_ON_TASK;
118ba9: c7 42 38 01 00 00 00 movl $0x1,0x38(%edx)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
118bb0: c7 42 18 00 00 00 00 movl $0x0,0x18(%edx)
the_watchdog->routine = routine;
118bb7: 89 72 2c mov %esi,0x2c(%edx)
the_watchdog->id = id;
118bba: 8b 4d 08 mov 0x8(%ebp),%ecx
118bbd: 89 4a 30 mov %ecx,0x30(%edx)
the_watchdog->user_data = user_data;
118bc0: 8b 4d 14 mov 0x14(%ebp),%ecx
118bc3: 89 4a 34 mov %ecx,0x34(%edx)
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = ticks;
118bc6: 89 7a 1c mov %edi,0x1c(%edx)
_ISR_Enable( level );
118bc9: 50 push %eax
118bca: 9d popf
(*timer_server->schedule_operation)( timer_server, the_timer );
118bcb: 83 ec 08 sub $0x8,%esp
118bce: 52 push %edx
118bcf: 53 push %ebx
118bd0: ff 53 04 call *0x4(%ebx)
_Thread_Enable_dispatch();
118bd3: e8 c0 31 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
118bd8: 83 c4 10 add $0x10,%esp
118bdb: 31 c0 xor %eax,%eax
118bdd: eb 83 jmp 118b62 <rtems_timer_server_fire_after+0x2e>
118bdf: 90 nop
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
118be0: b8 04 00 00 00 mov $0x4,%eax
}
118be5: 8d 65 f4 lea -0xc(%ebp),%esp
118be8: 5b pop %ebx
118be9: 5e pop %esi
118bea: 5f pop %edi
118beb: c9 leave
118bec: c3 ret
118bed: 8d 76 00 lea 0x0(%esi),%esi
Objects_Locations location;
ISR_Level level;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
118bf0: b8 0e 00 00 00 mov $0xe,%eax
118bf5: e9 68 ff ff ff jmp 118b62 <rtems_timer_server_fire_after+0x2e>
118bfa: 66 90 xchg %ax,%ax
if ( !routine )
return RTEMS_INVALID_ADDRESS;
118bfc: b8 09 00 00 00 mov $0x9,%eax
118c01: e9 5c ff ff ff jmp 118b62 <rtems_timer_server_fire_after+0x2e>
118c06: 66 90 xchg %ax,%ax
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_timer->Ticker.state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
118c08: 50 push %eax
118c09: 9d popf
_Thread_Enable_dispatch();
118c0a: e8 89 31 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
118c0f: 31 c0 xor %eax,%eax
118c11: e9 4c ff ff ff jmp 118b62 <rtems_timer_server_fire_after+0x2e>
00118c18 <rtems_timer_server_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
118c18: 55 push %ebp
118c19: 89 e5 mov %esp,%ebp
118c1b: 57 push %edi
118c1c: 56 push %esi
118c1d: 53 push %ebx
118c1e: 83 ec 2c sub $0x2c,%esp
118c21: 8b 7d 0c mov 0xc(%ebp),%edi
118c24: 8b 75 10 mov 0x10(%ebp),%esi
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
118c27: 8b 1d 80 35 14 00 mov 0x143580,%ebx
if ( !timer_server )
118c2d: 85 db test %ebx,%ebx
118c2f: 0f 84 d7 00 00 00 je 118d0c <rtems_timer_server_fire_when+0xf4>
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
118c35: 80 3d e4 2a 14 00 00 cmpb $0x0,0x142ae4
118c3c: 0f 84 aa 00 00 00 je 118cec <rtems_timer_server_fire_when+0xd4><== NEVER TAKEN
return RTEMS_NOT_DEFINED;
if ( !routine )
118c42: 85 f6 test %esi,%esi
118c44: 0f 84 b2 00 00 00 je 118cfc <rtems_timer_server_fire_when+0xe4>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
118c4a: 83 ec 0c sub $0xc,%esp
118c4d: 57 push %edi
118c4e: e8 89 d1 ff ff call 115ddc <_TOD_Validate>
118c53: 83 c4 10 add $0x10,%esp
118c56: 84 c0 test %al,%al
118c58: 75 0e jne 118c68 <rtems_timer_server_fire_when+0x50>
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
118c5a: b8 14 00 00 00 mov $0x14,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118c5f: 8d 65 f4 lea -0xc(%ebp),%esp
118c62: 5b pop %ebx
118c63: 5e pop %esi
118c64: 5f pop %edi
118c65: c9 leave
118c66: c3 ret
118c67: 90 nop
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
118c68: 83 ec 0c sub $0xc,%esp
118c6b: 57 push %edi
118c6c: e8 df d0 ff ff call 115d50 <_TOD_To_seconds>
118c71: 89 c7 mov %eax,%edi
if ( seconds <= _TOD_Seconds_since_epoch() )
118c73: 83 c4 10 add $0x10,%esp
118c76: 3b 05 a4 2b 14 00 cmp 0x142ba4,%eax
118c7c: 76 dc jbe 118c5a <rtems_timer_server_fire_when+0x42>
118c7e: 52 push %edx
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
118c7f: 8d 45 e4 lea -0x1c(%ebp),%eax
118c82: 50 push %eax
118c83: ff 75 08 pushl 0x8(%ebp)
118c86: 68 40 35 14 00 push $0x143540
118c8b: e8 54 26 00 00 call 11b2e4 <_Objects_Get>
118c90: 89 c2 mov %eax,%edx
switch ( location ) {
118c92: 83 c4 10 add $0x10,%esp
118c95: 8b 45 e4 mov -0x1c(%ebp),%eax
118c98: 85 c0 test %eax,%eax
118c9a: 75 7c jne 118d18 <rtems_timer_server_fire_when+0x100>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
118c9c: 83 ec 0c sub $0xc,%esp
118c9f: 8d 42 10 lea 0x10(%edx),%eax
118ca2: 50 push %eax
118ca3: 89 55 d4 mov %edx,-0x2c(%ebp)
118ca6: e8 c5 42 00 00 call 11cf70 <_Watchdog_Remove>
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
118cab: 8b 55 d4 mov -0x2c(%ebp),%edx
118cae: c7 42 38 03 00 00 00 movl $0x3,0x38(%edx)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
118cb5: c7 42 18 00 00 00 00 movl $0x0,0x18(%edx)
the_watchdog->routine = routine;
118cbc: 89 72 2c mov %esi,0x2c(%edx)
the_watchdog->id = id;
118cbf: 8b 45 08 mov 0x8(%ebp),%eax
118cc2: 89 42 30 mov %eax,0x30(%edx)
the_watchdog->user_data = user_data;
118cc5: 8b 45 14 mov 0x14(%ebp),%eax
118cc8: 89 42 34 mov %eax,0x34(%edx)
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
118ccb: 2b 3d a4 2b 14 00 sub 0x142ba4,%edi
118cd1: 89 7a 1c mov %edi,0x1c(%edx)
(*timer_server->schedule_operation)( timer_server, the_timer );
118cd4: 58 pop %eax
118cd5: 59 pop %ecx
118cd6: 52 push %edx
118cd7: 53 push %ebx
118cd8: ff 53 04 call *0x4(%ebx)
_Thread_Enable_dispatch();
118cdb: e8 b8 30 00 00 call 11bd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
118ce0: 83 c4 10 add $0x10,%esp
118ce3: 31 c0 xor %eax,%eax
118ce5: e9 75 ff ff ff jmp 118c5f <rtems_timer_server_fire_when+0x47>
118cea: 66 90 xchg %ax,%ax
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
118cec: b8 0b 00 00 00 mov $0xb,%eax <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118cf1: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
118cf4: 5b pop %ebx <== NOT EXECUTED
118cf5: 5e pop %esi <== NOT EXECUTED
118cf6: 5f pop %edi <== NOT EXECUTED
118cf7: c9 leave <== NOT EXECUTED
118cf8: c3 ret <== NOT EXECUTED
118cf9: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
118cfc: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118d01: 8d 65 f4 lea -0xc(%ebp),%esp
118d04: 5b pop %ebx
118d05: 5e pop %esi
118d06: 5f pop %edi
118d07: c9 leave
118d08: c3 ret
118d09: 8d 76 00 lea 0x0(%esi),%esi
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
118d0c: b8 0e 00 00 00 mov $0xe,%eax
118d11: e9 49 ff ff ff jmp 118c5f <rtems_timer_server_fire_when+0x47>
118d16: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
118d18: b8 04 00 00 00 mov $0x4,%eax
118d1d: e9 3d ff ff ff jmp 118c5f <rtems_timer_server_fire_when+0x47>
0010c700 <rtems_verror>:
static int rtems_verror(
rtems_error_code_t error_flag,
const char *printf_format,
va_list arglist
)
{
10c700: 55 push %ebp
10c701: 89 e5 mov %esp,%ebp
10c703: 57 push %edi
10c704: 56 push %esi
10c705: 53 push %ebx
10c706: 83 ec 1c sub $0x1c,%esp
10c709: 89 c3 mov %eax,%ebx
10c70b: 89 d6 mov %edx,%esi
10c70d: 89 cf mov %ecx,%edi
int local_errno = 0;
int chars_written = 0;
rtems_status_code status;
if (error_flag & RTEMS_ERROR_PANIC) {
10c70f: a9 00 00 00 20 test $0x20000000,%eax
10c714: 74 2b je 10c741 <rtems_verror+0x41>
if (rtems_panic_in_progress++)
10c716: 8b 15 20 ea 12 00 mov 0x12ea20,%edx
10c71c: 8d 42 01 lea 0x1(%edx),%eax
10c71f: a3 20 ea 12 00 mov %eax,0x12ea20
10c724: 85 d2 test %edx,%edx
10c726: 74 10 je 10c738 <rtems_verror+0x38> <== ALWAYS TAKEN
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10c728: a1 90 eb 12 00 mov 0x12eb90,%eax <== NOT EXECUTED
10c72d: 40 inc %eax <== NOT EXECUTED
10c72e: a3 90 eb 12 00 mov %eax,0x12eb90 <== NOT EXECUTED
RTEMS_COMPILER_MEMORY_BARRIER();
10c733: a1 20 ea 12 00 mov 0x12ea20,%eax <== NOT EXECUTED
_Thread_Disable_dispatch(); /* disable task switches */
/* don't aggravate things */
if (rtems_panic_in_progress > 2)
10c738: 83 f8 02 cmp $0x2,%eax
10c73b: 0f 8f af 00 00 00 jg 10c7f0 <rtems_verror+0xf0> <== NEVER TAKEN
return 0;
}
(void) fflush(stdout); /* in case stdout/stderr same */
10c741: 83 ec 0c sub $0xc,%esp
10c744: a1 a0 c7 12 00 mov 0x12c7a0,%eax
10c749: ff 70 08 pushl 0x8(%eax)
10c74c: e8 33 c1 00 00 call 118884 <fflush>
status = error_flag & ~RTEMS_ERROR_MASK;
10c751: 89 d8 mov %ebx,%eax
10c753: 25 ff ff ff 8f and $0x8fffffff,%eax
10c758: 89 45 e4 mov %eax,-0x1c(%ebp)
if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
10c75b: 83 c4 10 add $0x10,%esp
10c75e: 81 e3 00 00 00 40 and $0x40000000,%ebx
10c764: 0f 85 be 00 00 00 jne 10c828 <rtems_verror+0x128> <== NEVER TAKEN
rtems_error_code_t error_flag,
const char *printf_format,
va_list arglist
)
{
int local_errno = 0;
10c76a: 31 db xor %ebx,%ebx
#if defined(RTEMS_MULTIPROCESSING)
if (_System_state_Is_multiprocessing)
fprintf(stderr, "[%" PRIu32 "] ", _Configuration_MP_table->node);
#endif
chars_written += vfprintf(stderr, printf_format, arglist);
10c76c: 50 push %eax
10c76d: 57 push %edi
10c76e: 56 push %esi
10c76f: a1 a0 c7 12 00 mov 0x12c7a0,%eax
10c774: ff 70 0c pushl 0xc(%eax)
10c777: e8 c8 25 01 00 call 11ed44 <vfprintf>
10c77c: 89 c6 mov %eax,%esi
if (status)
10c77e: 83 c4 10 add $0x10,%esp
10c781: 8b 4d e4 mov -0x1c(%ebp),%ecx
10c784: 85 c9 test %ecx,%ecx
10c786: 75 74 jne 10c7fc <rtems_verror+0xfc> <== NEVER TAKEN
chars_written +=
fprintf(stderr, " (status: %s)", rtems_status_text(status));
if (local_errno) {
10c788: 83 fb 00 cmp $0x0,%ebx
10c78b: 74 30 je 10c7bd <rtems_verror+0xbd>
if ((local_errno > 0) && *strerror(local_errno))
10c78d: 7e 15 jle 10c7a4 <rtems_verror+0xa4>
10c78f: 83 ec 0c sub $0xc,%esp
10c792: 53 push %ebx
10c793: e8 34 cd 00 00 call 1194cc <strerror>
10c798: 83 c4 10 add $0x10,%esp
10c79b: 80 38 00 cmpb $0x0,(%eax)
10c79e: 0f 85 90 00 00 00 jne 10c834 <rtems_verror+0x134> <== ALWAYS TAKEN
chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
else
chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
10c7a4: 52 push %edx
10c7a5: 53 push %ebx
10c7a6: 68 29 73 12 00 push $0x127329
10c7ab: a1 a0 c7 12 00 mov 0x12c7a0,%eax
10c7b0: ff 70 0c pushl 0xc(%eax)
10c7b3: e8 c0 c4 00 00 call 118c78 <fprintf>
10c7b8: 01 c6 add %eax,%esi
10c7ba: 83 c4 10 add $0x10,%esp
}
chars_written += fprintf(stderr, "\n");
10c7bd: 83 ec 08 sub $0x8,%esp
10c7c0: 68 e2 65 12 00 push $0x1265e2
10c7c5: a1 a0 c7 12 00 mov 0x12c7a0,%eax
10c7ca: ff 70 0c pushl 0xc(%eax)
10c7cd: e8 a6 c4 00 00 call 118c78 <fprintf>
10c7d2: 8d 34 30 lea (%eax,%esi,1),%esi
(void) fflush(stderr);
10c7d5: 58 pop %eax
10c7d6: a1 a0 c7 12 00 mov 0x12c7a0,%eax
10c7db: ff 70 0c pushl 0xc(%eax)
10c7de: e8 a1 c0 00 00 call 118884 <fflush>
return chars_written;
10c7e3: 83 c4 10 add $0x10,%esp
}
10c7e6: 89 f0 mov %esi,%eax
10c7e8: 8d 65 f4 lea -0xc(%ebp),%esp
10c7eb: 5b pop %ebx
10c7ec: 5e pop %esi
10c7ed: 5f pop %edi
10c7ee: c9 leave
10c7ef: c3 ret
if (rtems_panic_in_progress++)
_Thread_Disable_dispatch(); /* disable task switches */
/* don't aggravate things */
if (rtems_panic_in_progress > 2)
return 0;
10c7f0: 31 f6 xor %esi,%esi
chars_written += fprintf(stderr, "\n");
(void) fflush(stderr);
return chars_written;
}
10c7f2: 89 f0 mov %esi,%eax <== NOT EXECUTED
10c7f4: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10c7f7: 5b pop %ebx <== NOT EXECUTED
10c7f8: 5e pop %esi <== NOT EXECUTED
10c7f9: 5f pop %edi <== NOT EXECUTED
10c7fa: c9 leave <== NOT EXECUTED
10c7fb: c3 ret <== NOT EXECUTED
chars_written += vfprintf(stderr, printf_format, arglist);
if (status)
chars_written +=
fprintf(stderr, " (status: %s)", rtems_status_text(status));
10c7fc: 83 ec 0c sub $0xc,%esp
10c7ff: ff 75 e4 pushl -0x1c(%ebp)
10c802: e8 e1 fe ff ff call 10c6e8 <rtems_status_text>
10c807: 83 c4 0c add $0xc,%esp
10c80a: 50 push %eax
10c80b: 68 0e 73 12 00 push $0x12730e
10c810: a1 a0 c7 12 00 mov 0x12c7a0,%eax
10c815: ff 70 0c pushl 0xc(%eax)
10c818: e8 5b c4 00 00 call 118c78 <fprintf>
#endif
chars_written += vfprintf(stderr, printf_format, arglist);
if (status)
chars_written +=
10c81d: 01 c6 add %eax,%esi
10c81f: 83 c4 10 add $0x10,%esp
10c822: e9 61 ff ff ff jmp 10c788 <rtems_verror+0x88>
10c827: 90 nop
(void) fflush(stdout); /* in case stdout/stderr same */
status = error_flag & ~RTEMS_ERROR_MASK;
if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
local_errno = errno;
10c828: e8 bf bc 00 00 call 1184ec <__errno>
10c82d: 8b 18 mov (%eax),%ebx
10c82f: e9 38 ff ff ff jmp 10c76c <rtems_verror+0x6c>
chars_written +=
fprintf(stderr, " (status: %s)", rtems_status_text(status));
if (local_errno) {
if ((local_errno > 0) && *strerror(local_errno))
chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
10c834: 83 ec 0c sub $0xc,%esp
10c837: 53 push %ebx
10c838: e8 8f cc 00 00 call 1194cc <strerror>
10c83d: 83 c4 0c add $0xc,%esp
10c840: 50 push %eax
10c841: 68 1c 73 12 00 push $0x12731c
10c846: e9 60 ff ff ff jmp 10c7ab <rtems_verror+0xab>
001086b4 <scanInt>:
/*
* Extract an integer value from the database
*/
static int
scanInt(FILE *fp, int *val)
{
1086b4: 55 push %ebp
1086b5: 89 e5 mov %esp,%ebp
1086b7: 57 push %edi
1086b8: 56 push %esi
1086b9: 53 push %ebx
1086ba: 83 ec 1c sub $0x1c,%esp
1086bd: 89 c6 mov %eax,%esi
1086bf: 89 55 e0 mov %edx,-0x20(%ebp)
int c;
unsigned int i = 0;
unsigned int limit = INT_MAX;
int sign = 0;
1086c2: 31 ff xor %edi,%edi
static int
scanInt(FILE *fp, int *val)
{
int c;
unsigned int i = 0;
unsigned int limit = INT_MAX;
1086c4: c7 45 e4 ff ff ff 7f movl $0x7fffffff,-0x1c(%ebp)
*/
static int
scanInt(FILE *fp, int *val)
{
int c;
unsigned int i = 0;
1086cb: 31 db xor %ebx,%ebx
unsigned int limit = INT_MAX;
int sign = 0;
int d;
for (;;) {
c = getc(fp);
1086cd: 8b 46 04 mov 0x4(%esi),%eax
1086d0: 48 dec %eax
1086d1: 89 46 04 mov %eax,0x4(%esi)
1086d4: 85 c0 test %eax,%eax
1086d6: 78 52 js 10872a <scanInt+0x76> <== NEVER TAKEN
1086d8: 8b 06 mov (%esi),%eax
1086da: 0f b6 08 movzbl (%eax),%ecx
1086dd: 40 inc %eax
1086de: 89 06 mov %eax,(%esi)
if (c == ':')
1086e0: 83 f9 3a cmp $0x3a,%ecx
1086e3: 74 5f je 108744 <scanInt+0x90>
break;
if (sign == 0) {
1086e5: 85 ff test %edi,%edi
1086e7: 75 0e jne 1086f7 <scanInt+0x43>
if (c == '-') {
1086e9: 83 f9 2d cmp $0x2d,%ecx
1086ec: 0f 84 8a 00 00 00 je 10877c <scanInt+0xc8>
sign = -1;
limit++;
continue;
}
sign = 1;
1086f2: bf 01 00 00 00 mov $0x1,%edi
}
if (!isdigit(c))
1086f7: a1 34 75 12 00 mov 0x127534,%eax
1086fc: f6 44 08 01 04 testb $0x4,0x1(%eax,%ecx,1)
108701: 74 6d je 108770 <scanInt+0xbc>
return 0;
d = c - '0';
if ((i > (limit / 10))
108703: b8 cd cc cc cc mov $0xcccccccd,%eax
108708: f7 65 e4 mull -0x1c(%ebp)
10870b: c1 ea 03 shr $0x3,%edx
10870e: 39 d3 cmp %edx,%ebx
108710: 77 5e ja 108770 <scanInt+0xbc>
}
sign = 1;
}
if (!isdigit(c))
return 0;
d = c - '0';
108712: 83 e9 30 sub $0x30,%ecx
if ((i > (limit / 10))
|| ((i == (limit / 10)) && (d > (limit % 10))))
108715: 39 d3 cmp %edx,%ebx
108717: 74 47 je 108760 <scanInt+0xac>
return 0;
i = i * 10 + d;
108719: 8d 04 9b lea (%ebx,%ebx,4),%eax
10871c: 8d 1c 41 lea (%ecx,%eax,2),%ebx
unsigned int limit = INT_MAX;
int sign = 0;
int d;
for (;;) {
c = getc(fp);
10871f: 8b 46 04 mov 0x4(%esi),%eax
108722: 48 dec %eax
108723: 89 46 04 mov %eax,0x4(%esi)
108726: 85 c0 test %eax,%eax
108728: 79 ae jns 1086d8 <scanInt+0x24> <== ALWAYS TAKEN
10872a: 83 ec 08 sub $0x8,%esp <== NOT EXECUTED
10872d: 56 push %esi <== NOT EXECUTED
10872e: ff 35 40 75 12 00 pushl 0x127540 <== NOT EXECUTED
108734: e8 17 ce 00 00 call 115550 <__srget_r> <== NOT EXECUTED
108739: 89 c1 mov %eax,%ecx <== NOT EXECUTED
10873b: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
if (c == ':')
10873e: 83 f9 3a cmp $0x3a,%ecx <== NOT EXECUTED
108741: 75 a2 jne 1086e5 <scanInt+0x31> <== NOT EXECUTED
108743: 90 nop <== NOT EXECUTED
if ((i > (limit / 10))
|| ((i == (limit / 10)) && (d > (limit % 10))))
return 0;
i = i * 10 + d;
}
if (sign == 0)
108744: 85 ff test %edi,%edi
108746: 74 28 je 108770 <scanInt+0xbc> <== NEVER TAKEN
return 0;
*val = i * sign;
108748: 0f af df imul %edi,%ebx
10874b: 8b 45 e0 mov -0x20(%ebp),%eax
10874e: 89 18 mov %ebx,(%eax)
return 1;
108750: b8 01 00 00 00 mov $0x1,%eax
}
108755: 8d 65 f4 lea -0xc(%ebp),%esp
108758: 5b pop %ebx
108759: 5e pop %esi
10875a: 5f pop %edi
10875b: c9 leave
10875c: c3 ret
10875d: 8d 76 00 lea 0x0(%esi),%esi
}
if (!isdigit(c))
return 0;
d = c - '0';
if ((i > (limit / 10))
|| ((i == (limit / 10)) && (d > (limit % 10))))
108760: 8d 04 9b lea (%ebx,%ebx,4),%eax
108763: d1 e0 shl %eax
108765: 8b 55 e4 mov -0x1c(%ebp),%edx
108768: 29 c2 sub %eax,%edx
10876a: 39 d1 cmp %edx,%ecx
10876c: 76 ab jbe 108719 <scanInt+0x65> <== NEVER TAKEN
10876e: 66 90 xchg %ax,%ax
return 0;
i = i * 10 + d;
}
if (sign == 0)
return 0;
108770: 31 c0 xor %eax,%eax
*val = i * sign;
return 1;
}
108772: 8d 65 f4 lea -0xc(%ebp),%esp
108775: 5b pop %ebx
108776: 5e pop %esi
108777: 5f pop %edi
108778: c9 leave
108779: c3 ret
10877a: 66 90 xchg %ax,%ax
if (c == ':')
break;
if (sign == 0) {
if (c == '-') {
sign = -1;
limit++;
10877c: ff 45 e4 incl -0x1c(%ebp)
c = getc(fp);
if (c == ':')
break;
if (sign == 0) {
if (c == '-') {
sign = -1;
10877f: bf ff ff ff ff mov $0xffffffff,%edi
limit++;
continue;
108784: e9 44 ff ff ff jmp 1086cd <scanInt+0x19>
0010878c <scanString>:
/*
* Extract a string value from the database
*/
static int
scanString(FILE *fp, char **name, char **bufp, size_t *nleft, int nlFlag)
{
10878c: 55 push %ebp
10878d: 89 e5 mov %esp,%ebp
10878f: 57 push %edi
108790: 56 push %esi
108791: 53 push %ebx
108792: 83 ec 0c sub $0xc,%esp
108795: 89 c3 mov %eax,%ebx
108797: 89 ce mov %ecx,%esi
108799: 8b 7d 08 mov 0x8(%ebp),%edi
int c;
*name = *bufp;
10879c: 8b 01 mov (%ecx),%eax
10879e: 89 02 mov %eax,(%edx)
1087a0: eb 26 jmp 1087c8 <scanString+0x3c>
1087a2: 66 90 xchg %ax,%ax
for (;;) {
c = getc(fp);
1087a4: 8b 13 mov (%ebx),%edx
1087a6: 0f b6 02 movzbl (%edx),%eax
1087a9: 42 inc %edx
1087aa: 89 13 mov %edx,(%ebx)
if (c == ':') {
1087ac: 83 f8 3a cmp $0x3a,%eax
1087af: 74 3b je 1087ec <scanString+0x60>
if (nlFlag)
return 0;
break;
}
if (c == '\n') {
1087b1: 83 f8 0a cmp $0xa,%eax
1087b4: 74 56 je 10880c <scanString+0x80>
if (!nlFlag)
return 0;
break;
}
if (c == EOF)
1087b6: 83 f8 ff cmp $0xffffffff,%eax
1087b9: 74 59 je 108814 <scanString+0x88>
return 0;
if (*nleft < 2)
1087bb: 83 3f 01 cmpl $0x1,(%edi)
1087be: 76 54 jbe 108814 <scanString+0x88>
return 0;
**bufp = c;
1087c0: 8b 16 mov (%esi),%edx
1087c2: 88 02 mov %al,(%edx)
++(*bufp);
1087c4: ff 06 incl (%esi)
--(*nleft);
1087c6: ff 0f decl (%edi)
{
int c;
*name = *bufp;
for (;;) {
c = getc(fp);
1087c8: 8b 43 04 mov 0x4(%ebx),%eax
1087cb: 48 dec %eax
1087cc: 89 43 04 mov %eax,0x4(%ebx)
1087cf: 85 c0 test %eax,%eax
1087d1: 79 d1 jns 1087a4 <scanString+0x18>
1087d3: 83 ec 08 sub $0x8,%esp
1087d6: 53 push %ebx
1087d7: ff 35 40 75 12 00 pushl 0x127540
1087dd: e8 6e cd 00 00 call 115550 <__srget_r>
1087e2: 83 c4 10 add $0x10,%esp
if (c == ':') {
1087e5: 83 f8 3a cmp $0x3a,%eax
1087e8: 75 c7 jne 1087b1 <scanString+0x25> <== ALWAYS TAKEN
1087ea: 66 90 xchg %ax,%ax
if (nlFlag)
1087ec: 8b 55 0c mov 0xc(%ebp),%edx
1087ef: 85 d2 test %edx,%edx
1087f1: 75 21 jne 108814 <scanString+0x88>
return 0;
**bufp = c;
++(*bufp);
--(*nleft);
}
**bufp = '\0';
1087f3: 8b 06 mov (%esi),%eax
1087f5: c6 00 00 movb $0x0,(%eax)
++(*bufp);
1087f8: ff 06 incl (%esi)
--(*nleft);
1087fa: ff 0f decl (%edi)
return 1;
1087fc: b8 01 00 00 00 mov $0x1,%eax
}
108801: 8d 65 f4 lea -0xc(%ebp),%esp
108804: 5b pop %ebx
108805: 5e pop %esi
108806: 5f pop %edi
108807: c9 leave
108808: c3 ret
108809: 8d 76 00 lea 0x0(%esi),%esi
if (nlFlag)
return 0;
break;
}
if (c == '\n') {
if (!nlFlag)
10880c: 8b 45 0c mov 0xc(%ebp),%eax
10880f: 85 c0 test %eax,%eax
108811: 75 e0 jne 1087f3 <scanString+0x67>
108813: 90 nop
break;
}
if (c == EOF)
return 0;
if (*nleft < 2)
return 0;
108814: 31 c0 xor %eax,%eax
}
**bufp = '\0';
++(*bufp);
--(*nleft);
return 1;
}
108816: 8d 65 f4 lea -0xc(%ebp),%esp
108819: 5b pop %ebx
10881a: 5e pop %esi
10881b: 5f pop %edi
10881c: c9 leave
10881d: c3 ret
00108820 <scangr>:
FILE *fp,
struct group *grp,
char *buffer,
size_t bufsize
)
{
108820: 55 push %ebp
108821: 89 e5 mov %esp,%ebp
108823: 57 push %edi
108824: 56 push %esi
108825: 53 push %ebx
108826: 83 ec 34 sub $0x34,%esp
108829: 89 c6 mov %eax,%esi
10882b: 89 d3 mov %edx,%ebx
10882d: 89 4d d4 mov %ecx,-0x2c(%ebp)
int grgid;
char *grmem, *cp;
int memcount;
if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
108830: 8d 7d d4 lea -0x2c(%ebp),%edi
108833: 6a 00 push $0x0
108835: 8d 45 08 lea 0x8(%ebp),%eax
108838: 50 push %eax
108839: 89 f9 mov %edi,%ecx
10883b: 89 f0 mov %esi,%eax
10883d: e8 4a ff ff ff call 10878c <scanString>
108842: 83 c4 10 add $0x10,%esp
108845: 85 c0 test %eax,%eax
108847: 75 0b jne 108854 <scangr+0x34>
/*
* Hack to produce (hopefully) a suitably-aligned array of pointers
*/
if (bufsize < (((memcount+1)*sizeof(char *)) + 15))
return 0;
108849: 31 c0 xor %eax,%eax
grp->gr_mem[memcount++] = cp + 1;
}
}
grp->gr_mem[memcount] = NULL;
return 1;
}
10884b: 8d 65 f4 lea -0xc(%ebp),%esp
10884e: 5b pop %ebx
10884f: 5e pop %esi
108850: 5f pop %edi
108851: c9 leave
108852: c3 ret
108853: 90 nop
int grgid;
char *grmem, *cp;
int memcount;
if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
|| !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0)
108854: 83 ec 08 sub $0x8,%esp
108857: 8d 53 04 lea 0x4(%ebx),%edx
10885a: 6a 00 push $0x0
10885c: 8d 45 08 lea 0x8(%ebp),%eax
10885f: 50 push %eax
108860: 89 f9 mov %edi,%ecx
108862: 89 f0 mov %esi,%eax
108864: e8 23 ff ff ff call 10878c <scanString>
108869: 83 c4 10 add $0x10,%esp
10886c: 85 c0 test %eax,%eax
10886e: 74 d9 je 108849 <scangr+0x29> <== NEVER TAKEN
|| !scanInt(fp, &grgid)
108870: 8d 55 e4 lea -0x1c(%ebp),%edx
108873: 89 f0 mov %esi,%eax
108875: e8 3a fe ff ff call 1086b4 <scanInt>
10887a: 85 c0 test %eax,%eax
10887c: 74 cb je 108849 <scangr+0x29> <== NEVER TAKEN
|| !scanString(fp, &grmem, &buffer, &bufsize, 1))
10887e: 83 ec 08 sub $0x8,%esp
108881: 8d 55 e0 lea -0x20(%ebp),%edx
108884: 6a 01 push $0x1
108886: 8d 45 08 lea 0x8(%ebp),%eax
108889: 50 push %eax
10888a: 89 f9 mov %edi,%ecx
10888c: 89 f0 mov %esi,%eax
10888e: e8 f9 fe ff ff call 10878c <scanString>
108893: 83 c4 10 add $0x10,%esp
108896: 85 c0 test %eax,%eax
108898: 74 af je 108849 <scangr+0x29> <== NEVER TAKEN
return 0;
grp->gr_gid = grgid;
10889a: 8b 45 e4 mov -0x1c(%ebp),%eax
10889d: 66 89 43 08 mov %ax,0x8(%ebx)
/*
* Determine number of members
*/
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
1088a1: 8b 7d e0 mov -0x20(%ebp),%edi
1088a4: 8a 07 mov (%edi),%al
1088a6: 84 c0 test %al,%al
1088a8: 74 7d je 108927 <scangr+0x107> <== NEVER TAKEN
1088aa: 89 fa mov %edi,%edx
1088ac: b9 01 00 00 00 mov $0x1,%ecx
1088b1: eb 08 jmp 1088bb <scangr+0x9b>
1088b3: 90 nop
1088b4: 42 inc %edx
1088b5: 8a 02 mov (%edx),%al
1088b7: 84 c0 test %al,%al
1088b9: 74 09 je 1088c4 <scangr+0xa4>
if(*cp == ',')
1088bb: 3c 2c cmp $0x2c,%al
1088bd: 75 f5 jne 1088b4 <scangr+0x94>
memcount++;
1088bf: 41 inc %ecx
1088c0: eb f2 jmp 1088b4 <scangr+0x94>
1088c2: 66 90 xchg %ax,%ax
grp->gr_gid = grgid;
/*
* Determine number of members
*/
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
1088c4: 8d 04 8d 13 00 00 00 lea 0x13(,%ecx,4),%eax
}
/*
* Hack to produce (hopefully) a suitably-aligned array of pointers
*/
if (bufsize < (((memcount+1)*sizeof(char *)) + 15))
1088cb: 39 45 08 cmp %eax,0x8(%ebp)
1088ce: 0f 82 75 ff ff ff jb 108849 <scangr+0x29> <== NEVER TAKEN
return 0;
grp->gr_mem = (char **)(((uintptr_t)buffer + 15) & ~15);
1088d4: 8b 75 d4 mov -0x2c(%ebp),%esi
1088d7: 83 c6 0f add $0xf,%esi
1088da: 83 e6 f0 and $0xfffffff0,%esi
1088dd: 89 73 0c mov %esi,0xc(%ebx)
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
1088e0: 89 3e mov %edi,(%esi)
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
1088e2: 8b 45 e0 mov -0x20(%ebp),%eax
1088e5: 8a 10 mov (%eax),%dl
1088e7: 84 d2 test %dl,%dl
1088e9: 74 43 je 10892e <scangr+0x10e> <== NEVER TAKEN
}
/*
* Extract a single group record from the database
*/
static int scangr(
1088eb: 40 inc %eax
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
1088ec: b9 01 00 00 00 mov $0x1,%ecx
1088f1: eb 08 jmp 1088fb <scangr+0xdb>
1088f3: 90 nop
1088f4: 8a 10 mov (%eax),%dl
1088f6: 40 inc %eax
1088f7: 84 d2 test %dl,%dl
1088f9: 74 15 je 108910 <scangr+0xf0>
if(*cp == ',') {
1088fb: 80 fa 2c cmp $0x2c,%dl
1088fe: 75 f4 jne 1088f4 <scangr+0xd4>
*cp = '\0';
108900: c6 40 ff 00 movb $0x0,-0x1(%eax)
grp->gr_mem[memcount++] = cp + 1;
108904: 8b 53 0c mov 0xc(%ebx),%edx
108907: 89 04 8a mov %eax,(%edx,%ecx,4)
10890a: 41 inc %ecx
10890b: eb e7 jmp 1088f4 <scangr+0xd4>
10890d: 8d 76 00 lea 0x0(%esi),%esi
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
108910: 8b 73 0c mov 0xc(%ebx),%esi
108913: c1 e1 02 shl $0x2,%ecx
if(*cp == ',') {
*cp = '\0';
grp->gr_mem[memcount++] = cp + 1;
}
}
grp->gr_mem[memcount] = NULL;
108916: c7 04 0e 00 00 00 00 movl $0x0,(%esi,%ecx,1)
return 1;
10891d: b8 01 00 00 00 mov $0x1,%eax
108922: e9 24 ff ff ff jmp 10884b <scangr+0x2b>
grp->gr_gid = grgid;
/*
* Determine number of members
*/
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
108927: b8 17 00 00 00 mov $0x17,%eax <== NOT EXECUTED
10892c: eb 9d jmp 1088cb <scangr+0xab> <== NOT EXECUTED
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
10892e: b9 04 00 00 00 mov $0x4,%ecx <== NOT EXECUTED
108933: eb e1 jmp 108916 <scangr+0xf6> <== NOT EXECUTED
00108938 <scanpw>:
FILE *fp,
struct passwd *pwd,
char *buffer,
size_t bufsize
)
{
108938: 55 push %ebp
108939: 89 e5 mov %esp,%ebp
10893b: 57 push %edi
10893c: 56 push %esi
10893d: 53 push %ebx
10893e: 83 ec 34 sub $0x34,%esp
108941: 89 c6 mov %eax,%esi
108943: 89 d3 mov %edx,%ebx
108945: 89 4d d4 mov %ecx,-0x2c(%ebp)
int pwuid, pwgid;
if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0)
108948: 8d 7d d4 lea -0x2c(%ebp),%edi
10894b: 6a 00 push $0x0
10894d: 8d 45 08 lea 0x8(%ebp),%eax
108950: 50 push %eax
108951: 89 f9 mov %edi,%ecx
108953: 89 f0 mov %esi,%eax
108955: e8 32 fe ff ff call 10878c <scanString>
10895a: 83 c4 10 add $0x10,%esp
10895d: 85 c0 test %eax,%eax
10895f: 75 0b jne 10896c <scanpw+0x34>
|| !scanInt(fp, &pwgid)
|| !scanString(fp, &pwd->pw_comment, &buffer, &bufsize, 0)
|| !scanString(fp, &pwd->pw_gecos, &buffer, &bufsize, 0)
|| !scanString(fp, &pwd->pw_dir, &buffer, &bufsize, 0)
|| !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1))
return 0;
108961: 31 c0 xor %eax,%eax
pwd->pw_uid = pwuid;
pwd->pw_gid = pwgid;
return 1;
}
108963: 8d 65 f4 lea -0xc(%ebp),%esp
108966: 5b pop %ebx
108967: 5e pop %esi
108968: 5f pop %edi
108969: c9 leave
10896a: c3 ret
10896b: 90 nop
)
{
int pwuid, pwgid;
if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0)
|| !scanString(fp, &pwd->pw_passwd, &buffer, &bufsize, 0)
10896c: 83 ec 08 sub $0x8,%esp
10896f: 8d 53 04 lea 0x4(%ebx),%edx
108972: 6a 00 push $0x0
108974: 8d 45 08 lea 0x8(%ebp),%eax
108977: 50 push %eax
108978: 89 f9 mov %edi,%ecx
10897a: 89 f0 mov %esi,%eax
10897c: e8 0b fe ff ff call 10878c <scanString>
108981: 83 c4 10 add $0x10,%esp
108984: 85 c0 test %eax,%eax
108986: 74 d9 je 108961 <scanpw+0x29> <== NEVER TAKEN
|| !scanInt(fp, &pwuid)
108988: 8d 55 e4 lea -0x1c(%ebp),%edx
10898b: 89 f0 mov %esi,%eax
10898d: e8 22 fd ff ff call 1086b4 <scanInt>
108992: 85 c0 test %eax,%eax
108994: 74 cb je 108961 <scanpw+0x29>
|| !scanInt(fp, &pwgid)
108996: 8d 55 e0 lea -0x20(%ebp),%edx
108999: 89 f0 mov %esi,%eax
10899b: e8 14 fd ff ff call 1086b4 <scanInt>
1089a0: 85 c0 test %eax,%eax
1089a2: 74 bd je 108961 <scanpw+0x29>
|| !scanString(fp, &pwd->pw_comment, &buffer, &bufsize, 0)
1089a4: 83 ec 08 sub $0x8,%esp
1089a7: 8d 53 0c lea 0xc(%ebx),%edx
1089aa: 6a 00 push $0x0
1089ac: 8d 45 08 lea 0x8(%ebp),%eax
1089af: 50 push %eax
1089b0: 89 f9 mov %edi,%ecx
1089b2: 89 f0 mov %esi,%eax
1089b4: e8 d3 fd ff ff call 10878c <scanString>
1089b9: 83 c4 10 add $0x10,%esp
1089bc: 85 c0 test %eax,%eax
1089be: 74 a1 je 108961 <scanpw+0x29> <== NEVER TAKEN
|| !scanString(fp, &pwd->pw_gecos, &buffer, &bufsize, 0)
1089c0: 83 ec 08 sub $0x8,%esp
1089c3: 8d 53 10 lea 0x10(%ebx),%edx
1089c6: 6a 00 push $0x0
1089c8: 8d 45 08 lea 0x8(%ebp),%eax
1089cb: 50 push %eax
1089cc: 89 f9 mov %edi,%ecx
1089ce: 89 f0 mov %esi,%eax
1089d0: e8 b7 fd ff ff call 10878c <scanString>
1089d5: 83 c4 10 add $0x10,%esp
1089d8: 85 c0 test %eax,%eax
1089da: 74 85 je 108961 <scanpw+0x29> <== NEVER TAKEN
|| !scanString(fp, &pwd->pw_dir, &buffer, &bufsize, 0)
1089dc: 83 ec 08 sub $0x8,%esp
1089df: 8d 53 14 lea 0x14(%ebx),%edx
1089e2: 6a 00 push $0x0
1089e4: 8d 45 08 lea 0x8(%ebp),%eax
1089e7: 50 push %eax
1089e8: 89 f9 mov %edi,%ecx
1089ea: 89 f0 mov %esi,%eax
1089ec: e8 9b fd ff ff call 10878c <scanString>
1089f1: 83 c4 10 add $0x10,%esp
1089f4: 85 c0 test %eax,%eax
1089f6: 0f 84 65 ff ff ff je 108961 <scanpw+0x29> <== NEVER TAKEN
|| !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1))
1089fc: 83 ec 08 sub $0x8,%esp
1089ff: 8d 53 18 lea 0x18(%ebx),%edx
108a02: 6a 01 push $0x1
108a04: 8d 45 08 lea 0x8(%ebp),%eax
108a07: 50 push %eax
108a08: 89 f9 mov %edi,%ecx
108a0a: 89 f0 mov %esi,%eax
108a0c: e8 7b fd ff ff call 10878c <scanString>
108a11: 83 c4 10 add $0x10,%esp
108a14: 85 c0 test %eax,%eax
108a16: 0f 84 45 ff ff ff je 108961 <scanpw+0x29>
return 0;
pwd->pw_uid = pwuid;
108a1c: 8b 45 e4 mov -0x1c(%ebp),%eax
108a1f: 66 89 43 08 mov %ax,0x8(%ebx)
pwd->pw_gid = pwgid;
108a23: 8b 45 e0 mov -0x20(%ebp),%eax
108a26: 66 89 43 0a mov %ax,0xa(%ebx)
return 1;
108a2a: b8 01 00 00 00 mov $0x1,%eax
108a2f: e9 2f ff ff ff jmp 108963 <scanpw+0x2b>
0010be34 <sched_get_priority_max>:
#include <rtems/posix/priority.h>
int sched_get_priority_max(
int policy
)
{
10be34: 55 push %ebp
10be35: 89 e5 mov %esp,%ebp
10be37: 83 ec 08 sub $0x8,%esp
10be3a: 8b 45 08 mov 0x8(%ebp),%eax
switch ( policy ) {
10be3d: 85 c0 test %eax,%eax
10be3f: 78 0a js 10be4b <sched_get_priority_max+0x17>
10be41: 83 f8 02 cmp $0x2,%eax
10be44: 7e 1a jle 10be60 <sched_get_priority_max+0x2c>
10be46: 83 f8 04 cmp $0x4,%eax
10be49: 74 15 je 10be60 <sched_get_priority_max+0x2c><== ALWAYS TAKEN
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
10be4b: e8 d4 81 00 00 call 114024 <__errno>
10be50: c7 00 16 00 00 00 movl $0x16,(%eax)
10be56: b8 ff ff ff ff mov $0xffffffff,%eax
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
}
10be5b: c9 leave
10be5c: c3 ret
10be5d: 8d 76 00 lea 0x0(%esi),%esi
default:
rtems_set_errno_and_return_minus_one( EINVAL );
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
10be60: 0f b6 05 fc 4d 12 00 movzbl 0x124dfc,%eax
10be67: 48 dec %eax
}
10be68: c9 leave
10be69: c3 ret
0010be6c <sched_get_priority_min>:
#include <rtems/posix/priority.h>
int sched_get_priority_min(
int policy
)
{
10be6c: 55 push %ebp
10be6d: 89 e5 mov %esp,%ebp
10be6f: 83 ec 08 sub $0x8,%esp
10be72: 8b 45 08 mov 0x8(%ebp),%eax
switch ( policy ) {
10be75: 85 c0 test %eax,%eax
10be77: 78 0a js 10be83 <sched_get_priority_min+0x17>
10be79: 83 f8 02 cmp $0x2,%eax
10be7c: 7e 1a jle 10be98 <sched_get_priority_min+0x2c><== ALWAYS TAKEN
10be7e: 83 f8 04 cmp $0x4,%eax <== NOT EXECUTED
10be81: 74 15 je 10be98 <sched_get_priority_min+0x2c><== NOT EXECUTED
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
10be83: e8 9c 81 00 00 call 114024 <__errno>
10be88: c7 00 16 00 00 00 movl $0x16,(%eax)
10be8e: b8 ff ff ff ff mov $0xffffffff,%eax
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
}
10be93: c9 leave
10be94: c3 ret
10be95: 8d 76 00 lea 0x0(%esi),%esi
default:
rtems_set_errno_and_return_minus_one( EINVAL );
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
10be98: b8 01 00 00 00 mov $0x1,%eax
}
10be9d: c9 leave
10be9e: c3 ret
0010bea0 <sched_rr_get_interval>:
int sched_rr_get_interval(
pid_t pid,
struct timespec *interval
)
{
10bea0: 55 push %ebp
10bea1: 89 e5 mov %esp,%ebp
10bea3: 56 push %esi
10bea4: 53 push %ebx
10bea5: 8b 75 08 mov 0x8(%ebp),%esi
10bea8: 8b 5d 0c mov 0xc(%ebp),%ebx
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
10beab: 85 f6 test %esi,%esi
10bead: 75 21 jne 10bed0 <sched_rr_get_interval+0x30><== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( ESRCH );
if ( !interval )
10beaf: 85 db test %ebx,%ebx
10beb1: 74 38 je 10beeb <sched_rr_get_interval+0x4b>
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval );
10beb3: 83 ec 08 sub $0x8,%esp
10beb6: 53 push %ebx
10beb7: ff 35 e0 90 12 00 pushl 0x1290e0
10bebd: e8 92 35 00 00 call 10f454 <_Timespec_From_ticks>
return 0;
10bec2: 83 c4 10 add $0x10,%esp
10bec5: 31 c0 xor %eax,%eax
}
10bec7: 8d 65 f8 lea -0x8(%ebp),%esp
10beca: 5b pop %ebx
10becb: 5e pop %esi
10becc: c9 leave
10becd: c3 ret
10bece: 66 90 xchg %ax,%ax
{
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
10bed0: e8 fb c8 ff ff call 1087d0 <getpid>
10bed5: 39 f0 cmp %esi,%eax
10bed7: 74 d6 je 10beaf <sched_rr_get_interval+0xf>
rtems_set_errno_and_return_minus_one( ESRCH );
10bed9: e8 46 81 00 00 call 114024 <__errno>
10bede: c7 00 03 00 00 00 movl $0x3,(%eax)
10bee4: b8 ff ff ff ff mov $0xffffffff,%eax
10bee9: eb dc jmp 10bec7 <sched_rr_get_interval+0x27>
if ( !interval )
rtems_set_errno_and_return_minus_one( EINVAL );
10beeb: e8 34 81 00 00 call 114024 <__errno>
10bef0: c7 00 16 00 00 00 movl $0x16,(%eax)
10bef6: b8 ff ff ff ff mov $0xffffffff,%eax
10befb: eb ca jmp 10bec7 <sched_rr_get_interval+0x27>
0010e604 <sem_close>:
*/
int sem_close(
sem_t *sem
)
{
10e604: 55 push %ebp
10e605: 89 e5 mov %esp,%ebp
10e607: 83 ec 1c sub $0x1c,%esp
register POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
10e60a: 8d 45 f4 lea -0xc(%ebp),%eax
sem_t *id,
Objects_Locations *location
)
{
return (POSIX_Semaphore_Control *)
_Objects_Get( &_POSIX_Semaphore_Information, (Objects_Id)*id, location );
10e60d: 50 push %eax
10e60e: 8b 45 08 mov 0x8(%ebp),%eax
10e611: ff 30 pushl (%eax)
10e613: 68 00 df 12 00 push $0x12df00
10e618: e8 c7 21 00 00 call 1107e4 <_Objects_Get>
switch ( location ) {
10e61d: 83 c4 10 add $0x10,%esp
10e620: 8b 55 f4 mov -0xc(%ebp),%edx
10e623: 85 d2 test %edx,%edx
10e625: 74 15 je 10e63c <sem_close+0x38>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10e627: e8 30 90 00 00 call 11765c <__errno>
10e62c: c7 00 16 00 00 00 movl $0x16,(%eax)
10e632: b8 ff ff ff ff mov $0xffffffff,%eax
}
10e637: c9 leave
10e638: c3 ret
10e639: 8d 76 00 lea 0x0(%esi),%esi
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
switch ( location ) {
case OBJECTS_LOCAL:
the_semaphore->open_count -= 1;
10e63c: ff 48 18 decl 0x18(%eax)
_POSIX_Semaphore_Delete( the_semaphore );
10e63f: 83 ec 0c sub $0xc,%esp
10e642: 50 push %eax
10e643: e8 1c 64 00 00 call 114a64 <_POSIX_Semaphore_Delete>
_Thread_Enable_dispatch();
10e648: e8 cb 2c 00 00 call 111318 <_Thread_Enable_dispatch>
return 0;
10e64d: 83 c4 10 add $0x10,%esp
10e650: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10e652: c9 leave
10e653: c3 ret
0010e654 <sem_destroy>:
*/
int sem_destroy(
sem_t *sem
)
{
10e654: 55 push %ebp
10e655: 89 e5 mov %esp,%ebp
10e657: 83 ec 1c sub $0x1c,%esp
register POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
10e65a: 8d 45 f4 lea -0xc(%ebp),%eax
10e65d: 50 push %eax
10e65e: 8b 45 08 mov 0x8(%ebp),%eax
10e661: ff 30 pushl (%eax)
10e663: 68 00 df 12 00 push $0x12df00
10e668: e8 77 21 00 00 call 1107e4 <_Objects_Get>
switch ( location ) {
10e66d: 83 c4 10 add $0x10,%esp
10e670: 8b 55 f4 mov -0xc(%ebp),%edx
10e673: 85 d2 test %edx,%edx
10e675: 74 15 je 10e68c <sem_destroy+0x38>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10e677: e8 e0 8f 00 00 call 11765c <__errno>
10e67c: c7 00 16 00 00 00 movl $0x16,(%eax)
10e682: b8 ff ff ff ff mov $0xffffffff,%eax
}
10e687: c9 leave
10e688: c3 ret
10e689: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_LOCAL:
/*
* Undefined operation on a named semaphore.
*/
if ( the_semaphore->named == true ) {
10e68c: 80 78 14 00 cmpb $0x0,0x14(%eax)
10e690: 75 16 jne 10e6a8 <sem_destroy+0x54>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EINVAL );
}
_POSIX_Semaphore_Delete( the_semaphore );
10e692: 83 ec 0c sub $0xc,%esp
10e695: 50 push %eax
10e696: e8 c9 63 00 00 call 114a64 <_POSIX_Semaphore_Delete>
_Thread_Enable_dispatch();
10e69b: e8 78 2c 00 00 call 111318 <_Thread_Enable_dispatch>
return 0;
10e6a0: 83 c4 10 add $0x10,%esp
10e6a3: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10e6a5: c9 leave
10e6a6: c3 ret
10e6a7: 90 nop
/*
* Undefined operation on a named semaphore.
*/
if ( the_semaphore->named == true ) {
_Thread_Enable_dispatch();
10e6a8: e8 6b 2c 00 00 call 111318 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EINVAL );
10e6ad: e8 aa 8f 00 00 call 11765c <__errno>
10e6b2: c7 00 16 00 00 00 movl $0x16,(%eax)
10e6b8: b8 ff ff ff ff mov $0xffffffff,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10e6bd: c9 leave
10e6be: c3 ret
0010e6c0 <sem_getvalue>:
int sem_getvalue(
sem_t *sem,
int *sval
)
{
10e6c0: 55 push %ebp
10e6c1: 89 e5 mov %esp,%ebp
10e6c3: 83 ec 1c sub $0x1c,%esp
register POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
10e6c6: 8d 45 f4 lea -0xc(%ebp),%eax
10e6c9: 50 push %eax
10e6ca: 8b 45 08 mov 0x8(%ebp),%eax
10e6cd: ff 30 pushl (%eax)
10e6cf: 68 00 df 12 00 push $0x12df00
10e6d4: e8 0b 21 00 00 call 1107e4 <_Objects_Get>
switch ( location ) {
10e6d9: 83 c4 10 add $0x10,%esp
10e6dc: 8b 55 f4 mov -0xc(%ebp),%edx
10e6df: 85 d2 test %edx,%edx
10e6e1: 74 15 je 10e6f8 <sem_getvalue+0x38>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10e6e3: e8 74 8f 00 00 call 11765c <__errno>
10e6e8: c7 00 16 00 00 00 movl $0x16,(%eax)
10e6ee: b8 ff ff ff ff mov $0xffffffff,%eax
}
10e6f3: c9 leave
10e6f4: c3 ret
10e6f5: 8d 76 00 lea 0x0(%esi),%esi
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
switch ( location ) {
case OBJECTS_LOCAL:
*sval = _CORE_semaphore_Get_count( &the_semaphore->Semaphore );
10e6f8: 8b 50 64 mov 0x64(%eax),%edx
10e6fb: 8b 45 0c mov 0xc(%ebp),%eax
10e6fe: 89 10 mov %edx,(%eax)
_Thread_Enable_dispatch();
10e700: e8 13 2c 00 00 call 111318 <_Thread_Enable_dispatch>
return 0;
10e705: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10e707: c9 leave
10e708: c3 ret
0010e754 <sem_open>:
int oflag,
...
/* mode_t mode, */
/* unsigned int value */
)
{
10e754: 55 push %ebp
10e755: 89 e5 mov %esp,%ebp
10e757: 57 push %edi
10e758: 56 push %esi
10e759: 53 push %ebx
10e75a: 83 ec 2c sub $0x2c,%esp
10e75d: 8b 75 08 mov 0x8(%ebp),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10e760: a1 b0 db 12 00 mov 0x12dbb0,%eax
10e765: 40 inc %eax
10e766: a3 b0 db 12 00 mov %eax,0x12dbb0
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
10e76b: 8b 7d 0c mov 0xc(%ebp),%edi
10e76e: 81 e7 00 02 00 00 and $0x200,%edi
10e774: 0f 85 86 00 00 00 jne 10e800 <sem_open+0xac>
/* unsigned int value */
)
{
va_list arg;
mode_t mode;
unsigned int value = 0;
10e77a: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp)
mode = (mode_t) va_arg( arg, unsigned int );
value = va_arg( arg, unsigned int );
va_end(arg);
}
status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id );
10e781: 83 ec 08 sub $0x8,%esp
10e784: 8d 45 e4 lea -0x1c(%ebp),%eax
10e787: 50 push %eax
10e788: 56 push %esi
10e789: e8 26 63 00 00 call 114ab4 <_POSIX_Semaphore_Name_to_id>
10e78e: 89 c3 mov %eax,%ebx
* and we can just return a pointer to the id. Otherwise we may
* need to check to see if this is a "semaphore does not exist"
* or some other miscellaneous error on the name.
*/
if ( status ) {
10e790: 83 c4 10 add $0x10,%esp
10e793: 85 c0 test %eax,%eax
10e795: 74 25 je 10e7bc <sem_open+0x68>
/*
* Unless provided a valid name that did not already exist
* and we are willing to create then it is an error.
*/
if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
10e797: 83 f8 02 cmp $0x2,%eax
10e79a: 75 04 jne 10e7a0 <sem_open+0x4c> <== NEVER TAKEN
10e79c: 85 ff test %edi,%edi
10e79e: 75 6c jne 10e80c <sem_open+0xb8>
_Thread_Enable_dispatch();
10e7a0: e8 73 2b 00 00 call 111318 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, sem_t * );
10e7a5: e8 b2 8e 00 00 call 11765c <__errno>
10e7aa: 89 18 mov %ebx,(%eax)
10e7ac: b8 ff ff ff ff mov $0xffffffff,%eax
id = &the_semaphore->Semaphore_id;
#else
id = (sem_t *)&the_semaphore->Object.id;
#endif
return id;
}
10e7b1: 8d 65 f4 lea -0xc(%ebp),%esp
10e7b4: 5b pop %ebx
10e7b5: 5e pop %esi
10e7b6: 5f pop %edi
10e7b7: c9 leave
10e7b8: c3 ret
10e7b9: 8d 76 00 lea 0x0(%esi),%esi
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
10e7bc: 8b 45 0c mov 0xc(%ebp),%eax
10e7bf: 25 00 0a 00 00 and $0xa00,%eax
10e7c4: 3d 00 0a 00 00 cmp $0xa00,%eax
10e7c9: 74 65 je 10e830 <sem_open+0xdc>
10e7cb: 50 push %eax
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
}
the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
10e7cc: 8d 45 dc lea -0x24(%ebp),%eax
10e7cf: 50 push %eax
10e7d0: ff 75 e4 pushl -0x1c(%ebp)
10e7d3: 68 00 df 12 00 push $0x12df00
10e7d8: e8 07 20 00 00 call 1107e4 <_Objects_Get>
10e7dd: 89 45 e0 mov %eax,-0x20(%ebp)
the_semaphore->open_count += 1;
10e7e0: ff 40 18 incl 0x18(%eax)
_Thread_Enable_dispatch();
10e7e3: e8 30 2b 00 00 call 111318 <_Thread_Enable_dispatch>
_Thread_Enable_dispatch();
10e7e8: e8 2b 2b 00 00 call 111318 <_Thread_Enable_dispatch>
goto return_id;
10e7ed: 83 c4 10 add $0x10,%esp
return_id:
#if defined(RTEMS_USE_16_BIT_OBJECT)
the_semaphore->Semaphore_id = the_semaphore->Object.id;
id = &the_semaphore->Semaphore_id;
#else
id = (sem_t *)&the_semaphore->Object.id;
10e7f0: 8b 45 e0 mov -0x20(%ebp),%eax
10e7f3: 83 c0 08 add $0x8,%eax
#endif
return id;
}
10e7f6: 8d 65 f4 lea -0xc(%ebp),%esp
10e7f9: 5b pop %ebx
10e7fa: 5e pop %esi
10e7fb: 5f pop %edi
10e7fc: c9 leave
10e7fd: c3 ret
10e7fe: 66 90 xchg %ax,%ax
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
va_start(arg, oflag);
mode = (mode_t) va_arg( arg, unsigned int );
value = va_arg( arg, unsigned int );
10e800: 8b 45 14 mov 0x14(%ebp),%eax
10e803: 89 45 d4 mov %eax,-0x2c(%ebp)
10e806: e9 76 ff ff ff jmp 10e781 <sem_open+0x2d>
10e80b: 90 nop
/*
* At this point, the semaphore does not exist and everything has been
* checked. We should go ahead and create a semaphore.
*/
status =_POSIX_Semaphore_Create_support(
10e80c: 8d 45 e0 lea -0x20(%ebp),%eax
10e80f: 50 push %eax
10e810: ff 75 d4 pushl -0x2c(%ebp)
10e813: 6a 00 push $0x0
10e815: 56 push %esi
10e816: e8 3d 61 00 00 call 114958 <_POSIX_Semaphore_Create_support>
10e81b: 89 c3 mov %eax,%ebx
/*
* errno was set by Create_support, so don't set it again.
*/
_Thread_Enable_dispatch();
10e81d: e8 f6 2a 00 00 call 111318 <_Thread_Enable_dispatch>
if ( status == -1 )
10e822: 83 c4 10 add $0x10,%esp
10e825: 43 inc %ebx
10e826: 75 c8 jne 10e7f0 <sem_open+0x9c>
return SEM_FAILED;
10e828: b8 ff ff ff ff mov $0xffffffff,%eax
10e82d: eb c7 jmp 10e7f6 <sem_open+0xa2>
10e82f: 90 nop
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
_Thread_Enable_dispatch();
10e830: e8 e3 2a 00 00 call 111318 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
10e835: e8 22 8e 00 00 call 11765c <__errno>
10e83a: c7 00 11 00 00 00 movl $0x11,(%eax)
10e840: b8 ff ff ff ff mov $0xffffffff,%eax
10e845: eb af jmp 10e7f6 <sem_open+0xa2>
0010e848 <sem_post>:
*/
int sem_post(
sem_t *sem
)
{
10e848: 55 push %ebp
10e849: 89 e5 mov %esp,%ebp
10e84b: 83 ec 1c sub $0x1c,%esp
register POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
10e84e: 8d 45 f4 lea -0xc(%ebp),%eax
10e851: 50 push %eax
10e852: 8b 45 08 mov 0x8(%ebp),%eax
10e855: ff 30 pushl (%eax)
10e857: 68 00 df 12 00 push $0x12df00
10e85c: e8 83 1f 00 00 call 1107e4 <_Objects_Get>
switch ( location ) {
10e861: 83 c4 10 add $0x10,%esp
10e864: 8b 4d f4 mov -0xc(%ebp),%ecx
10e867: 85 c9 test %ecx,%ecx
10e869: 74 15 je 10e880 <sem_post+0x38>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10e86b: e8 ec 8d 00 00 call 11765c <__errno>
10e870: c7 00 16 00 00 00 movl $0x16,(%eax)
10e876: b8 ff ff ff ff mov $0xffffffff,%eax
}
10e87b: c9 leave
10e87c: c3 ret
10e87d: 8d 76 00 lea 0x0(%esi),%esi
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_semaphore_Surrender(
10e880: 52 push %edx
10e881: 6a 00 push $0x0
10e883: ff 70 08 pushl 0x8(%eax)
10e886: 83 c0 1c add $0x1c,%eax
10e889: 50 push %eax
10e88a: e8 65 15 00 00 call 10fdf4 <_CORE_semaphore_Surrender>
NULL /* XXX need to define a routine to handle this case */
#else
NULL
#endif
);
_Thread_Enable_dispatch();
10e88f: e8 84 2a 00 00 call 111318 <_Thread_Enable_dispatch>
return 0;
10e894: 83 c4 10 add $0x10,%esp
10e897: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10e899: c9 leave
10e89a: c3 ret
0010e89c <sem_timedwait>:
int sem_timedwait(
sem_t *sem,
const struct timespec *abstime
)
{
10e89c: 55 push %ebp
10e89d: 89 e5 mov %esp,%ebp
10e89f: 53 push %ebx
10e8a0: 83 ec 1c sub $0x1c,%esp
10e8a3: 8b 5d 08 mov 0x8(%ebp),%ebx
*
* If the status is POSIX_ABSOLUTE_TIMEOUT_INVALID,
* POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST, or POSIX_ABSOLUTE_TIMEOUT_IS_NOW,
* then we should not wait.
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
10e8a6: 8d 45 f4 lea -0xc(%ebp),%eax
10e8a9: 50 push %eax
10e8aa: ff 75 0c pushl 0xc(%ebp)
10e8ad: e8 36 55 00 00 call 113de8 <_POSIX_Absolute_timeout_to_ticks>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
10e8b2: 83 c4 10 add $0x10,%esp
10e8b5: 83 f8 03 cmp $0x3,%eax
10e8b8: 74 16 je 10e8d0 <sem_timedwait+0x34> <== ALWAYS TAKEN
do_wait = false;
lock_status = _POSIX_Semaphore_Wait_support( sem, do_wait, ticks );
10e8ba: 50 push %eax <== NOT EXECUTED
10e8bb: ff 75 f4 pushl -0xc(%ebp) <== NOT EXECUTED
10e8be: 6a 00 push $0x0 <== NOT EXECUTED
10e8c0: 53 push %ebx <== NOT EXECUTED
10e8c1: e8 5a 62 00 00 call 114b20 <_POSIX_Semaphore_Wait_support><== NOT EXECUTED
10e8c6: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
lock_status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
rtems_set_errno_and_return_minus_one( ETIMEDOUT );
}
return lock_status;
}
10e8c9: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
10e8cc: c9 leave <== NOT EXECUTED
10e8cd: c3 ret <== NOT EXECUTED
10e8ce: 66 90 xchg %ax,%ax <== NOT EXECUTED
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
lock_status = _POSIX_Semaphore_Wait_support( sem, do_wait, ticks );
10e8d0: 52 push %edx
10e8d1: ff 75 f4 pushl -0xc(%ebp)
10e8d4: 6a 01 push $0x1
10e8d6: 53 push %ebx
10e8d7: e8 44 62 00 00 call 114b20 <_POSIX_Semaphore_Wait_support>
10e8dc: 83 c4 10 add $0x10,%esp
lock_status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
rtems_set_errno_and_return_minus_one( ETIMEDOUT );
}
return lock_status;
}
10e8df: 8b 5d fc mov -0x4(%ebp),%ebx
10e8e2: c9 leave
10e8e3: c3 ret
0010b2f4 <setitimer>:
int setitimer(
int which,
const struct itimerval *value,
struct itimerval *ovalue
)
{
10b2f4: 55 push %ebp
10b2f5: 89 e5 mov %esp,%ebp
10b2f7: 83 ec 08 sub $0x8,%esp
if ( !value )
10b2fa: 8b 55 0c mov 0xc(%ebp),%edx
10b2fd: 85 d2 test %edx,%edx
10b2ff: 74 33 je 10b334 <setitimer+0x40>
rtems_set_errno_and_return_minus_one( EFAULT );
if ( !ovalue )
10b301: 8b 45 10 mov 0x10(%ebp),%eax
10b304: 85 c0 test %eax,%eax
10b306: 74 2c je 10b334 <setitimer+0x40>
rtems_set_errno_and_return_minus_one( EFAULT );
switch ( which ) {
10b308: 83 7d 08 02 cmpl $0x2,0x8(%ebp)
10b30c: 76 12 jbe 10b320 <setitimer+0x2c>
case ITIMER_PROF:
rtems_set_errno_and_return_minus_one( ENOSYS );
default:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10b30e: e8 21 87 00 00 call 113a34 <__errno>
10b313: c7 00 16 00 00 00 movl $0x16,(%eax)
}
10b319: b8 ff ff ff ff mov $0xffffffff,%eax
10b31e: c9 leave
10b31f: c3 ret
switch ( which ) {
case ITIMER_REAL:
case ITIMER_VIRTUAL:
case ITIMER_PROF:
rtems_set_errno_and_return_minus_one( ENOSYS );
10b320: e8 0f 87 00 00 call 113a34 <__errno>
10b325: c7 00 58 00 00 00 movl $0x58,(%eax)
default:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10b32b: b8 ff ff ff ff mov $0xffffffff,%eax
10b330: c9 leave
10b331: c3 ret
10b332: 66 90 xchg %ax,%ax
{
if ( !value )
rtems_set_errno_and_return_minus_one( EFAULT );
if ( !ovalue )
rtems_set_errno_and_return_minus_one( EFAULT );
10b334: e8 fb 86 00 00 call 113a34 <__errno>
10b339: c7 00 0e 00 00 00 movl $0xe,(%eax)
10b33f: eb d8 jmp 10b319 <setitimer+0x25>
0010bd50 <sigaction>:
int sigaction(
int sig,
const struct sigaction *act,
struct sigaction *oact
)
{
10bd50: 55 push %ebp
10bd51: 89 e5 mov %esp,%ebp
10bd53: 57 push %edi
10bd54: 56 push %esi
10bd55: 53 push %ebx
10bd56: 83 ec 1c sub $0x1c,%esp
10bd59: 8b 5d 08 mov 0x8(%ebp),%ebx
10bd5c: 8b 45 0c mov 0xc(%ebp),%eax
10bd5f: 8b 55 10 mov 0x10(%ebp),%edx
ISR_Level level;
if ( oact )
10bd62: 85 d2 test %edx,%edx
10bd64: 74 13 je 10bd79 <sigaction+0x29>
*oact = _POSIX_signals_Vectors[ sig ];
10bd66: 8d 0c 5b lea (%ebx,%ebx,2),%ecx
10bd69: 8d 34 8d 80 a4 12 00 lea 0x12a480(,%ecx,4),%esi
10bd70: b9 03 00 00 00 mov $0x3,%ecx
10bd75: 89 d7 mov %edx,%edi
10bd77: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
if ( !sig )
10bd79: 85 db test %ebx,%ebx
10bd7b: 74 77 je 10bdf4 <sigaction+0xa4>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
10bd7d: 8d 53 ff lea -0x1(%ebx),%edx
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
10bd80: 83 fa 1f cmp $0x1f,%edx
10bd83: 77 6f ja 10bdf4 <sigaction+0xa4>
*
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
10bd85: 83 fb 09 cmp $0x9,%ebx
10bd88: 74 6a je 10bdf4 <sigaction+0xa4>
/*
* Evaluate the new action structure and set the global signal vector
* appropriately.
*/
if ( act ) {
10bd8a: 85 c0 test %eax,%eax
10bd8c: 74 62 je 10bdf0 <sigaction+0xa0> <== NEVER TAKEN
/*
* Unless the user is installing the default signal actions, then
* we can just copy the provided sigaction structure into the vectors.
*/
_ISR_Disable( level );
10bd8e: 9c pushf
10bd8f: fa cli
10bd90: 8f 45 e4 popl -0x1c(%ebp)
if ( act->sa_handler == SIG_DFL ) {
10bd93: 8b 50 08 mov 0x8(%eax),%edx
10bd96: 85 d2 test %edx,%edx
10bd98: 74 36 je 10bdd0 <sigaction+0x80>
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
} else {
_POSIX_signals_Clear_process_signals( sig );
10bd9a: 83 ec 0c sub $0xc,%esp
10bd9d: 53 push %ebx
10bd9e: 89 45 e0 mov %eax,-0x20(%ebp)
10bda1: e8 96 57 00 00 call 11153c <_POSIX_signals_Clear_process_signals>
_POSIX_signals_Vectors[ sig ] = *act;
10bda6: 8d 14 5b lea (%ebx,%ebx,2),%edx
10bda9: 8d 14 95 80 a4 12 00 lea 0x12a480(,%edx,4),%edx
10bdb0: b9 03 00 00 00 mov $0x3,%ecx
10bdb5: 8b 45 e0 mov -0x20(%ebp),%eax
10bdb8: 89 d7 mov %edx,%edi
10bdba: 89 c6 mov %eax,%esi
10bdbc: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
10bdbe: 83 c4 10 add $0x10,%esp
}
_ISR_Enable( level );
10bdc1: ff 75 e4 pushl -0x1c(%ebp)
10bdc4: 9d popf
* now (signals not posted when SIG_IGN).
* + If we are now ignoring a signal that was previously pending,
* we clear the pending signal indicator.
*/
return 0;
10bdc5: 31 c0 xor %eax,%eax
}
10bdc7: 8d 65 f4 lea -0xc(%ebp),%esp
10bdca: 5b pop %ebx
10bdcb: 5e pop %esi
10bdcc: 5f pop %edi
10bdcd: c9 leave
10bdce: c3 ret
10bdcf: 90 nop
* we can just copy the provided sigaction structure into the vectors.
*/
_ISR_Disable( level );
if ( act->sa_handler == SIG_DFL ) {
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
10bdd0: 8d 34 5b lea (%ebx,%ebx,2),%esi
10bdd3: c1 e6 02 shl $0x2,%esi
10bdd6: 8d 86 80 a4 12 00 lea 0x12a480(%esi),%eax
10bddc: 81 c6 e0 38 12 00 add $0x1238e0,%esi
10bde2: b9 03 00 00 00 mov $0x3,%ecx
10bde7: 89 c7 mov %eax,%edi
10bde9: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
10bdeb: eb d4 jmp 10bdc1 <sigaction+0x71>
10bded: 8d 76 00 lea 0x0(%esi),%esi
* now (signals not posted when SIG_IGN).
* + If we are now ignoring a signal that was previously pending,
* we clear the pending signal indicator.
*/
return 0;
10bdf0: 31 c0 xor %eax,%eax
10bdf2: eb d3 jmp 10bdc7 <sigaction+0x77> <== NOT EXECUTED
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
rtems_set_errno_and_return_minus_one( EINVAL );
10bdf4: e8 27 85 00 00 call 114320 <__errno>
10bdf9: c7 00 16 00 00 00 movl $0x16,(%eax)
10bdff: b8 ff ff ff ff mov $0xffffffff,%eax
10be04: eb c1 jmp 10bdc7 <sigaction+0x77>
0010c120 <sigtimedwait>:
int sigtimedwait(
const sigset_t *set,
siginfo_t *info,
const struct timespec *timeout
)
{
10c120: 55 push %ebp
10c121: 89 e5 mov %esp,%ebp
10c123: 57 push %edi
10c124: 56 push %esi
10c125: 53 push %ebx
10c126: 83 ec 2c sub $0x2c,%esp
10c129: 8b 5d 08 mov 0x8(%ebp),%ebx
10c12c: 8b 7d 0c mov 0xc(%ebp),%edi
10c12f: 8b 75 10 mov 0x10(%ebp),%esi
ISR_Level level;
/*
* Error check parameters before disabling interrupts.
*/
if ( !set )
10c132: 85 db test %ebx,%ebx
10c134: 0f 84 9e 01 00 00 je 10c2d8 <sigtimedwait+0x1b8>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
if ( timeout ) {
10c13a: 85 f6 test %esi,%esi
10c13c: 0f 84 3e 01 00 00 je 10c280 <sigtimedwait+0x160>
if ( !_Timespec_Is_valid( timeout ) )
10c142: 83 ec 0c sub $0xc,%esp
10c145: 56 push %esi
10c146: e8 19 36 00 00 call 10f764 <_Timespec_Is_valid>
10c14b: 83 c4 10 add $0x10,%esp
10c14e: 84 c0 test %al,%al
10c150: 0f 84 82 01 00 00 je 10c2d8 <sigtimedwait+0x1b8>
rtems_set_errno_and_return_minus_one( EINVAL );
interval = _Timespec_To_ticks( timeout );
10c156: 83 ec 0c sub $0xc,%esp
10c159: 56 push %esi
10c15a: e8 6d 36 00 00 call 10f7cc <_Timespec_To_ticks>
if ( !interval )
10c15f: 83 c4 10 add $0x10,%esp
10c162: 85 c0 test %eax,%eax
10c164: 0f 84 6e 01 00 00 je 10c2d8 <sigtimedwait+0x1b8> <== NEVER TAKEN
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
10c16a: 85 ff test %edi,%edi
10c16c: 0f 84 18 01 00 00 je 10c28a <sigtimedwait+0x16a> <== NEVER TAKEN
the_thread = _Thread_Executing;
10c172: 8b 0d b8 9b 12 00 mov 0x129bb8,%ecx
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10c178: 8b 91 ec 00 00 00 mov 0xec(%ecx),%edx
* What if they are already pending?
*/
/* API signals pending? */
_ISR_Disable( level );
10c17e: 9c pushf
10c17f: fa cli
10c180: 8f 45 d0 popl -0x30(%ebp)
if ( *set & api->signals_pending ) {
10c183: 8b 33 mov (%ebx),%esi
10c185: 89 75 d4 mov %esi,-0x2c(%ebp)
10c188: 8b b2 d4 00 00 00 mov 0xd4(%edx),%esi
10c18e: 85 75 d4 test %esi,-0x2c(%ebp)
10c191: 0f 85 fd 00 00 00 jne 10c294 <sigtimedwait+0x174>
return the_info->si_signo;
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
10c197: 8b 35 28 9e 12 00 mov 0x129e28,%esi
10c19d: 85 75 d4 test %esi,-0x2c(%ebp)
10c1a0: 0f 85 96 00 00 00 jne 10c23c <sigtimedwait+0x11c>
the_info->si_code = SI_USER;
the_info->si_value.sival_int = 0;
return signo;
}
the_info->si_signo = -1;
10c1a6: c7 07 ff ff ff ff movl $0xffffffff,(%edi)
10c1ac: 8b 35 d0 95 12 00 mov 0x1295d0,%esi
10c1b2: 46 inc %esi
10c1b3: 89 35 d0 95 12 00 mov %esi,0x1295d0
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
10c1b9: c7 41 44 c0 9d 12 00 movl $0x129dc0,0x44(%ecx)
the_thread->Wait.return_code = EINTR;
10c1c0: c7 41 34 04 00 00 00 movl $0x4,0x34(%ecx)
the_thread->Wait.option = *set;
10c1c7: 8b 33 mov (%ebx),%esi
10c1c9: 89 71 30 mov %esi,0x30(%ecx)
the_thread->Wait.return_argument = the_info;
10c1cc: 89 79 28 mov %edi,0x28(%ecx)
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
10c1cf: c7 05 f0 9d 12 00 01 movl $0x1,0x129df0
10c1d6: 00 00 00
_Thread_queue_Enter_critical_section( &_POSIX_signals_Wait_queue );
_ISR_Enable( level );
10c1d9: ff 75 d0 pushl -0x30(%ebp)
10c1dc: 9d popf
_Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval );
10c1dd: 51 push %ecx
10c1de: 68 48 f4 10 00 push $0x10f448
10c1e3: 50 push %eax
10c1e4: 68 c0 9d 12 00 push $0x129dc0
10c1e9: 89 55 cc mov %edx,-0x34(%ebp)
10c1ec: e8 2b 2f 00 00 call 10f11c <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
10c1f1: e8 4a 2a 00 00 call 10ec40 <_Thread_Enable_dispatch>
/*
* When the thread is set free by a signal, it is need to eliminate
* the signal.
*/
_POSIX_signals_Clear_signals( api, the_info->si_signo, the_info, false, false );
10c1f6: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10c1fd: 6a 00 push $0x0
10c1ff: 57 push %edi
10c200: ff 37 pushl (%edi)
10c202: 8b 55 cc mov -0x34(%ebp),%edx
10c205: 52 push %edx
10c206: e8 1d 5a 00 00 call 111c28 <_POSIX_signals_Clear_signals>
/* Set errno only if return code is not EINTR or
* if EINTR was caused by a signal being caught, which
* was not in our set.
*/
if ( (_Thread_Executing->Wait.return_code != EINTR)
10c20b: 83 c4 20 add $0x20,%esp
10c20e: a1 b8 9b 12 00 mov 0x129bb8,%eax
10c213: 83 78 34 04 cmpl $0x4,0x34(%eax)
10c217: 0f 85 d3 00 00 00 jne 10c2f0 <sigtimedwait+0x1d0>
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
10c21d: 8b 37 mov (%edi),%esi
10c21f: 8d 4e ff lea -0x1(%esi),%ecx
10c222: b8 01 00 00 00 mov $0x1,%eax
10c227: d3 e0 shl %cl,%eax
10c229: 85 03 test %eax,(%ebx)
10c22b: 0f 84 bf 00 00 00 je 10c2f0 <sigtimedwait+0x1d0> <== NEVER TAKEN
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
10c231: 89 f0 mov %esi,%eax
10c233: 8d 65 f4 lea -0xc(%ebp),%esp
10c236: 5b pop %ebx
10c237: 5e pop %esi
10c238: 5f pop %edi
10c239: c9 leave
10c23a: c3 ret
10c23b: 90 nop
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
10c23c: 83 ec 0c sub $0xc,%esp
10c23f: 56 push %esi
10c240: 89 55 cc mov %edx,-0x34(%ebp)
10c243: e8 94 fe ff ff call 10c0dc <_POSIX_signals_Get_lowest>
10c248: 89 c6 mov %eax,%esi
_POSIX_signals_Clear_signals( api, signo, the_info, true, false );
10c24a: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10c251: 6a 01 push $0x1
10c253: 57 push %edi
10c254: 50 push %eax
10c255: 8b 55 cc mov -0x34(%ebp),%edx
10c258: 52 push %edx
10c259: e8 ca 59 00 00 call 111c28 <_POSIX_signals_Clear_signals>
_ISR_Enable( level );
10c25e: ff 75 d0 pushl -0x30(%ebp)
10c261: 9d popf
the_info->si_signo = signo;
10c262: 89 37 mov %esi,(%edi)
the_info->si_code = SI_USER;
10c264: c7 47 04 01 00 00 00 movl $0x1,0x4(%edi)
the_info->si_value.sival_int = 0;
10c26b: c7 47 08 00 00 00 00 movl $0x0,0x8(%edi)
return signo;
10c272: 83 c4 20 add $0x20,%esp
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
10c275: 89 f0 mov %esi,%eax
10c277: 8d 65 f4 lea -0xc(%ebp),%esp
10c27a: 5b pop %ebx
10c27b: 5e pop %esi
10c27c: 5f pop %edi
10c27d: c9 leave
10c27e: c3 ret
10c27f: 90 nop
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
10c280: 31 c0 xor %eax,%eax
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
10c282: 85 ff test %edi,%edi
10c284: 0f 85 e8 fe ff ff jne 10c172 <sigtimedwait+0x52>
10c28a: 8d 7d dc lea -0x24(%ebp),%edi
10c28d: e9 e0 fe ff ff jmp 10c172 <sigtimedwait+0x52>
10c292: 66 90 xchg %ax,%ax
/* API signals pending? */
_ISR_Disable( level );
if ( *set & api->signals_pending ) {
/* XXX real info later */
the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending );
10c294: 83 ec 0c sub $0xc,%esp
10c297: 56 push %esi
10c298: 89 55 cc mov %edx,-0x34(%ebp)
10c29b: e8 3c fe ff ff call 10c0dc <_POSIX_signals_Get_lowest>
10c2a0: 89 07 mov %eax,(%edi)
_POSIX_signals_Clear_signals(
10c2a2: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10c2a9: 6a 00 push $0x0
10c2ab: 57 push %edi
10c2ac: 50 push %eax
10c2ad: 8b 55 cc mov -0x34(%ebp),%edx
10c2b0: 52 push %edx
10c2b1: e8 72 59 00 00 call 111c28 <_POSIX_signals_Clear_signals>
the_info->si_signo,
the_info,
false,
false
);
_ISR_Enable( level );
10c2b6: ff 75 d0 pushl -0x30(%ebp)
10c2b9: 9d popf
the_info->si_code = SI_USER;
10c2ba: c7 47 04 01 00 00 00 movl $0x1,0x4(%edi)
the_info->si_value.sival_int = 0;
10c2c1: c7 47 08 00 00 00 00 movl $0x0,0x8(%edi)
return the_info->si_signo;
10c2c8: 8b 37 mov (%edi),%esi
10c2ca: 83 c4 20 add $0x20,%esp
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
10c2cd: 89 f0 mov %esi,%eax
10c2cf: 8d 65 f4 lea -0xc(%ebp),%esp
10c2d2: 5b pop %ebx
10c2d3: 5e pop %esi
10c2d4: 5f pop %edi
10c2d5: c9 leave
10c2d6: c3 ret
10c2d7: 90 nop
rtems_set_errno_and_return_minus_one( EINVAL );
interval = _Timespec_To_ticks( timeout );
if ( !interval )
rtems_set_errno_and_return_minus_one( EINVAL );
10c2d8: e8 87 86 00 00 call 114964 <__errno>
10c2dd: c7 00 16 00 00 00 movl $0x16,(%eax)
10c2e3: be ff ff ff ff mov $0xffffffff,%esi
10c2e8: e9 44 ff ff ff jmp 10c231 <sigtimedwait+0x111>
10c2ed: 8d 76 00 lea 0x0(%esi),%esi
* was not in our set.
*/
if ( (_Thread_Executing->Wait.return_code != EINTR)
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
errno = _Thread_Executing->Wait.return_code;
10c2f0: e8 6f 86 00 00 call 114964 <__errno>
10c2f5: 8b 15 b8 9b 12 00 mov 0x129bb8,%edx
10c2fb: 8b 52 34 mov 0x34(%edx),%edx
10c2fe: 89 10 mov %edx,(%eax)
return -1;
10c300: be ff ff ff ff mov $0xffffffff,%esi
10c305: e9 27 ff ff ff jmp 10c231 <sigtimedwait+0x111>
0010df98 <sigwait>:
int sigwait(
const sigset_t *set,
int *sig
)
{
10df98: 55 push %ebp
10df99: 89 e5 mov %esp,%ebp
10df9b: 53 push %ebx
10df9c: 83 ec 08 sub $0x8,%esp
10df9f: 8b 5d 0c mov 0xc(%ebp),%ebx
int status;
status = sigtimedwait( set, NULL, NULL );
10dfa2: 6a 00 push $0x0
10dfa4: 6a 00 push $0x0
10dfa6: ff 75 08 pushl 0x8(%ebp)
10dfa9: e8 e6 fd ff ff call 10dd94 <sigtimedwait>
if ( status != -1 ) {
10dfae: 83 c4 10 add $0x10,%esp
10dfb1: 83 f8 ff cmp $0xffffffff,%eax
10dfb4: 74 0e je 10dfc4 <sigwait+0x2c>
if ( sig )
10dfb6: 85 db test %ebx,%ebx
10dfb8: 74 16 je 10dfd0 <sigwait+0x38> <== NEVER TAKEN
*sig = status;
10dfba: 89 03 mov %eax,(%ebx)
return 0;
10dfbc: 31 c0 xor %eax,%eax
}
return errno;
}
10dfbe: 8b 5d fc mov -0x4(%ebp),%ebx
10dfc1: c9 leave
10dfc2: c3 ret
10dfc3: 90 nop
if ( sig )
*sig = status;
return 0;
}
return errno;
10dfc4: e8 5b 81 00 00 call 116124 <__errno>
10dfc9: 8b 00 mov (%eax),%eax
}
10dfcb: 8b 5d fc mov -0x4(%ebp),%ebx
10dfce: c9 leave
10dfcf: c3 ret
status = sigtimedwait( set, NULL, NULL );
if ( status != -1 ) {
if ( sig )
*sig = status;
return 0;
10dfd0: 31 c0 xor %eax,%eax
}
return errno;
}
10dfd2: 8b 5d fc mov -0x4(%ebp),%ebx
10dfd5: c9 leave
10dfd6: c3 ret <== NOT EXECUTED
0010a0b8 <siproc>:
/*
* Process input character, with semaphore.
*/
static int
siproc (unsigned char c, struct rtems_termios_tty *tty)
{
10a0b8: 55 push %ebp
10a0b9: 89 e5 mov %esp,%ebp
10a0bb: 56 push %esi
10a0bc: 53 push %ebx
10a0bd: 89 d3 mov %edx,%ebx
10a0bf: 89 c6 mov %eax,%esi
int i;
/*
* Obtain output semaphore if character will be echoed
*/
if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) {
10a0c1: f7 42 3c 78 0e 00 00 testl $0xe78,0x3c(%edx)
10a0c8: 75 12 jne 10a0dc <siproc+0x24> <== ALWAYS TAKEN
rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
i = iproc (c, tty);
rtems_semaphore_release (tty->osem);
}
else {
i = iproc (c, tty);
10a0ca: 0f b6 c0 movzbl %al,%eax
10a0cd: 89 da mov %ebx,%edx
}
return i;
}
10a0cf: 8d 65 f8 lea -0x8(%ebp),%esp
10a0d2: 5b pop %ebx <== NOT EXECUTED
10a0d3: 5e pop %esi <== NOT EXECUTED
10a0d4: c9 leave <== NOT EXECUTED
rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
i = iproc (c, tty);
rtems_semaphore_release (tty->osem);
}
else {
i = iproc (c, tty);
10a0d5: e9 92 fe ff ff jmp 109f6c <iproc> <== NOT EXECUTED
10a0da: 66 90 xchg %ax,%ax <== NOT EXECUTED
/*
* Obtain output semaphore if character will be echoed
*/
if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) {
rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
10a0dc: 52 push %edx
10a0dd: 6a 00 push $0x0
10a0df: 6a 00 push $0x0
10a0e1: ff 73 18 pushl 0x18(%ebx)
10a0e4: e8 c7 15 00 00 call 10b6b0 <rtems_semaphore_obtain>
i = iproc (c, tty);
10a0e9: 89 f2 mov %esi,%edx
10a0eb: 0f b6 c2 movzbl %dl,%eax
10a0ee: 89 da mov %ebx,%edx
10a0f0: e8 77 fe ff ff call 109f6c <iproc>
10a0f5: 89 c6 mov %eax,%esi
rtems_semaphore_release (tty->osem);
10a0f7: 58 pop %eax
10a0f8: ff 73 18 pushl 0x18(%ebx)
10a0fb: e8 ac 16 00 00 call 10b7ac <rtems_semaphore_release>
10a100: 83 c4 10 add $0x10,%esp
}
else {
i = iproc (c, tty);
}
return i;
}
10a103: 89 f0 mov %esi,%eax
10a105: 8d 65 f8 lea -0x8(%ebp),%esp
10a108: 5b pop %ebx
10a109: 5e pop %esi
10a10a: c9 leave
10a10b: c3 ret
00108ecc <stat>:
int _STAT_NAME(
const char *path,
struct stat *buf
)
{
108ecc: 55 push %ebp
108ecd: 89 e5 mov %esp,%ebp
108ecf: 57 push %edi
108ed0: 56 push %esi
108ed1: 53 push %ebx
108ed2: 83 ec 3c sub $0x3c,%esp
108ed5: 8b 55 08 mov 0x8(%ebp),%edx
108ed8: 8b 75 0c mov 0xc(%ebp),%esi
/*
* Check to see if we were passed a valid pointer.
*/
if ( !buf )
108edb: 85 f6 test %esi,%esi
108edd: 74 65 je 108f44 <stat+0x78>
rtems_set_errno_and_return_minus_one( EFAULT );
status = rtems_filesystem_evaluate_path( path, strlen( path ),
108edf: b9 ff ff ff ff mov $0xffffffff,%ecx
108ee4: 89 d7 mov %edx,%edi
108ee6: 31 c0 xor %eax,%eax
108ee8: f2 ae repnz scas %es:(%edi),%al
108eea: f7 d1 not %ecx
108eec: 49 dec %ecx
108eed: 83 ec 0c sub $0xc,%esp
108ef0: 6a 01 push $0x1
108ef2: 8d 5d d4 lea -0x2c(%ebp),%ebx
108ef5: 53 push %ebx
108ef6: 6a 00 push $0x0
108ef8: 51 push %ecx
108ef9: 52 push %edx
108efa: e8 45 f1 ff ff call 108044 <rtems_filesystem_evaluate_path>
0, &loc, _STAT_FOLLOW_LINKS );
if ( status != 0 )
108eff: 83 c4 20 add $0x20,%esp
108f02: 85 c0 test %eax,%eax
108f04: 74 0e je 108f14 <stat+0x48>
return -1;
108f06: b8 ff ff ff ff mov $0xffffffff,%eax
status = (*loc.handlers->fstat_h)( &loc, buf );
rtems_filesystem_freenode( &loc );
return status;
}
108f0b: 8d 65 f4 lea -0xc(%ebp),%esp
108f0e: 5b pop %ebx
108f0f: 5e pop %esi
108f10: 5f pop %edi
108f11: c9 leave
108f12: c3 ret
108f13: 90 nop
/*
* Zero out the stat structure so the various support
* versions of stat don't have to.
*/
memset( buf, 0, sizeof(struct stat) );
108f14: b9 48 00 00 00 mov $0x48,%ecx
108f19: 89 f7 mov %esi,%edi
108f1b: f3 aa rep stos %al,%es:(%edi)
status = (*loc.handlers->fstat_h)( &loc, buf );
108f1d: 83 ec 08 sub $0x8,%esp
108f20: 56 push %esi
108f21: 53 push %ebx
108f22: 8b 45 dc mov -0x24(%ebp),%eax
108f25: ff 50 18 call *0x18(%eax)
rtems_filesystem_freenode( &loc );
108f28: 89 1c 24 mov %ebx,(%esp)
108f2b: 89 45 c4 mov %eax,-0x3c(%ebp)
108f2e: e8 e9 f1 ff ff call 10811c <rtems_filesystem_freenode>
return status;
108f33: 83 c4 10 add $0x10,%esp
108f36: 8b 45 c4 mov -0x3c(%ebp),%eax
}
108f39: 8d 65 f4 lea -0xc(%ebp),%esp
108f3c: 5b pop %ebx
108f3d: 5e pop %esi
108f3e: 5f pop %edi
108f3f: c9 leave
108f40: c3 ret
108f41: 8d 76 00 lea 0x0(%esi),%esi
/*
* Check to see if we were passed a valid pointer.
*/
if ( !buf )
rtems_set_errno_and_return_minus_one( EFAULT );
108f44: e8 ff 87 00 00 call 111748 <__errno>
108f49: c7 00 0e 00 00 00 movl $0xe,(%eax)
108f4f: b8 ff ff ff ff mov $0xffffffff,%eax
status = (*loc.handlers->fstat_h)( &loc, buf );
rtems_filesystem_freenode( &loc );
return status;
}
108f54: 8d 65 f4 lea -0xc(%ebp),%esp
108f57: 5b pop %ebx
108f58: 5e pop %esi
108f59: 5f pop %edi
108f5a: c9 leave
108f5b: c3 ret
0010b33c <statvfs>:
#include <sys/statvfs.h>
int
statvfs (const char *path, struct statvfs *sb)
{
10b33c: 55 push %ebp
10b33d: 89 e5 mov %esp,%ebp
10b33f: 57 push %edi
10b340: 56 push %esi
10b341: 53 push %ebx
10b342: 83 ec 48 sub $0x48,%esp
10b345: 8b 55 08 mov 0x8(%ebp),%edx
* The root node of the mounted filesytem.
* The node for the directory that the fileystem is mounted on.
* The mount entry that is being refered to.
*/
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x0, &loc, true ) )
10b348: 31 f6 xor %esi,%esi
10b34a: b9 ff ff ff ff mov $0xffffffff,%ecx
10b34f: 89 d7 mov %edx,%edi
10b351: 89 f0 mov %esi,%eax
10b353: f2 ae repnz scas %es:(%edi),%al
10b355: f7 d1 not %ecx
10b357: 49 dec %ecx
10b358: 6a 01 push $0x1
10b35a: 8d 5d d4 lea -0x2c(%ebp),%ebx
10b35d: 53 push %ebx
10b35e: 6a 00 push $0x0
10b360: 51 push %ecx
10b361: 52 push %edx
10b362: e8 ad eb ff ff call 109f14 <rtems_filesystem_evaluate_path>
10b367: 83 c4 20 add $0x20,%esp
10b36a: 85 c0 test %eax,%eax
10b36c: 74 0e je 10b37c <statvfs+0x40> <== ALWAYS TAKEN
return -1;
10b36e: b8 ff ff ff ff mov $0xffffffff,%eax
result = ( fs_mount_root->ops->statvfs_h )( fs_mount_root, sb );
rtems_filesystem_freenode( &loc );
return result;
}
10b373: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10b376: 5b pop %ebx <== NOT EXECUTED
10b377: 5e pop %esi <== NOT EXECUTED
10b378: 5f pop %edi <== NOT EXECUTED
10b379: c9 leave <== NOT EXECUTED
10b37a: c3 ret <== NOT EXECUTED
10b37b: 90 nop <== NOT EXECUTED
*/
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x0, &loc, true ) )
return -1;
mt_entry = loc.mt_entry;
10b37c: 8b 55 e4 mov -0x1c(%ebp),%edx
fs_mount_root = &mt_entry->mt_fs_root;
memset (sb, 0, sizeof (struct statvfs));
10b37f: b9 38 00 00 00 mov $0x38,%ecx
10b384: 8b 7d 0c mov 0xc(%ebp),%edi
10b387: 89 f0 mov %esi,%eax
10b389: f3 aa rep stos %al,%es:(%edi)
result = ( fs_mount_root->ops->statvfs_h )( fs_mount_root, sb );
10b38b: 83 ec 08 sub $0x8,%esp
10b38e: 8b 42 28 mov 0x28(%edx),%eax
10b391: ff 75 0c pushl 0xc(%ebp)
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x0, &loc, true ) )
return -1;
mt_entry = loc.mt_entry;
fs_mount_root = &mt_entry->mt_fs_root;
10b394: 83 c2 1c add $0x1c,%edx
memset (sb, 0, sizeof (struct statvfs));
result = ( fs_mount_root->ops->statvfs_h )( fs_mount_root, sb );
10b397: 52 push %edx
10b398: ff 50 44 call *0x44(%eax)
rtems_filesystem_freenode( &loc );
10b39b: 89 1c 24 mov %ebx,(%esp)
10b39e: 89 45 c4 mov %eax,-0x3c(%ebp)
10b3a1: e8 46 ec ff ff call 109fec <rtems_filesystem_freenode>
return result;
10b3a6: 83 c4 10 add $0x10,%esp
10b3a9: 8b 45 c4 mov -0x3c(%ebp),%eax
}
10b3ac: 8d 65 f4 lea -0xc(%ebp),%esp
10b3af: 5b pop %ebx
10b3b0: 5e pop %esi
10b3b1: 5f pop %edi
10b3b2: c9 leave
10b3b3: c3 ret
0010acf4 <symlink>:
int symlink(
const char *actualpath,
const char *sympath
)
{
10acf4: 55 push %ebp
10acf5: 89 e5 mov %esp,%ebp
10acf7: 56 push %esi
10acf8: 53 push %ebx
10acf9: 83 ec 34 sub $0x34,%esp
10acfc: 8b 75 0c mov 0xc(%ebp),%esi
rtems_filesystem_location_info_t loc;
int i;
const char *name_start;
int result;
rtems_filesystem_get_start_loc( sympath, &i, &loc );
10acff: 8d 5d dc lea -0x24(%ebp),%ebx
10ad02: 53 push %ebx
10ad03: 8d 45 f4 lea -0xc(%ebp),%eax
10ad06: 50 push %eax
10ad07: 56 push %esi
10ad08: e8 0f ff ff ff call 10ac1c <rtems_filesystem_get_start_loc>
result = (*loc.ops->evalformake_h)( &sympath[i], &loc, &name_start );
10ad0d: 83 c4 0c add $0xc,%esp
10ad10: 8d 45 f0 lea -0x10(%ebp),%eax
10ad13: 50 push %eax
10ad14: 53 push %ebx
10ad15: 03 75 f4 add -0xc(%ebp),%esi
10ad18: 56 push %esi
10ad19: 8b 45 e8 mov -0x18(%ebp),%eax
10ad1c: ff 50 04 call *0x4(%eax)
if ( result != 0 )
10ad1f: 83 c4 10 add $0x10,%esp
10ad22: 85 c0 test %eax,%eax
10ad24: 74 0e je 10ad34 <symlink+0x40>
return -1;
10ad26: b8 ff ff ff ff mov $0xffffffff,%eax
result = (*loc.ops->symlink_h)( &loc, actualpath, name_start);
rtems_filesystem_freenode( &loc );
return result;
}
10ad2b: 8d 65 f8 lea -0x8(%ebp),%esp
10ad2e: 5b pop %ebx
10ad2f: 5e pop %esi
10ad30: c9 leave
10ad31: c3 ret
10ad32: 66 90 xchg %ax,%ax
result = (*loc.ops->evalformake_h)( &sympath[i], &loc, &name_start );
if ( result != 0 )
return -1;
result = (*loc.ops->symlink_h)( &loc, actualpath, name_start);
10ad34: 50 push %eax
10ad35: ff 75 f0 pushl -0x10(%ebp)
10ad38: ff 75 08 pushl 0x8(%ebp)
10ad3b: 53 push %ebx
10ad3c: 8b 45 e8 mov -0x18(%ebp),%eax
10ad3f: ff 50 38 call *0x38(%eax)
rtems_filesystem_freenode( &loc );
10ad42: 89 1c 24 mov %ebx,(%esp)
10ad45: 89 45 d4 mov %eax,-0x2c(%ebp)
10ad48: e8 6f ec ff ff call 1099bc <rtems_filesystem_freenode>
return result;
10ad4d: 83 c4 10 add $0x10,%esp
10ad50: 8b 45 d4 mov -0x2c(%ebp),%eax
}
10ad53: 8d 65 f8 lea -0x8(%ebp),%esp
10ad56: 5b pop %ebx
10ad57: 5e pop %esi
10ad58: c9 leave
10ad59: c3 ret
0010a1c8 <sync_per_thread>:
fdatasync(fn);
}
/* iterate over all FILE *'s for this thread */
static void sync_per_thread(Thread_Control *t)
{
10a1c8: 55 push %ebp
10a1c9: 89 e5 mov %esp,%ebp
10a1cb: 53 push %ebx
10a1cc: 83 ec 04 sub $0x4,%esp
10a1cf: 8b 45 08 mov 0x8(%ebp),%eax
/*
* The sync_wrapper() function will operate on the current thread's
* reent structure so we will temporarily use that.
*/
this_reent = t->libc_reent;
10a1d2: 8b 90 e4 00 00 00 mov 0xe4(%eax),%edx
if ( this_reent ) {
10a1d8: 85 d2 test %edx,%edx
10a1da: 74 33 je 10a20f <sync_per_thread+0x47> <== NEVER TAKEN
current_reent = _Thread_Executing->libc_reent;
10a1dc: 8b 0d 38 a0 12 00 mov 0x12a038,%ecx
10a1e2: 8b 99 e4 00 00 00 mov 0xe4(%ecx),%ebx
_Thread_Executing->libc_reent = this_reent;
10a1e8: 89 91 e4 00 00 00 mov %edx,0xe4(%ecx)
_fwalk (t->libc_reent, sync_wrapper);
10a1ee: 83 ec 08 sub $0x8,%esp
10a1f1: 68 14 a2 10 00 push $0x10a214
10a1f6: ff b0 e4 00 00 00 pushl 0xe4(%eax)
10a1fc: e8 9b b1 00 00 call 11539c <_fwalk>
_Thread_Executing->libc_reent = current_reent;
10a201: a1 38 a0 12 00 mov 0x12a038,%eax
10a206: 89 98 e4 00 00 00 mov %ebx,0xe4(%eax)
10a20c: 83 c4 10 add $0x10,%esp
}
}
10a20f: 8b 5d fc mov -0x4(%ebp),%ebx
10a212: c9 leave
10a213: c3 ret
0010a874 <tcsetattr>:
int tcsetattr(
int fd,
int opt,
struct termios *tp
)
{
10a874: 55 push %ebp
10a875: 89 e5 mov %esp,%ebp
10a877: 56 push %esi
10a878: 53 push %ebx
10a879: 8b 5d 08 mov 0x8(%ebp),%ebx
10a87c: 8b 45 0c mov 0xc(%ebp),%eax
10a87f: 8b 75 10 mov 0x10(%ebp),%esi
switch (opt) {
10a882: 85 c0 test %eax,%eax
10a884: 74 2c je 10a8b2 <tcsetattr+0x3e>
10a886: 48 dec %eax
10a887: 74 17 je 10a8a0 <tcsetattr+0x2c>
default:
rtems_set_errno_and_return_minus_one( ENOTSUP );
10a889: e8 fe a5 00 00 call 114e8c <__errno>
10a88e: c7 00 86 00 00 00 movl $0x86,(%eax)
* Fall through to....
*/
case TCSANOW:
return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp );
}
}
10a894: b8 ff ff ff ff mov $0xffffffff,%eax
10a899: 8d 65 f8 lea -0x8(%ebp),%esp
10a89c: 5b pop %ebx
10a89d: 5e pop %esi
10a89e: c9 leave
10a89f: c3 ret
switch (opt) {
default:
rtems_set_errno_and_return_minus_one( ENOTSUP );
case TCSADRAIN:
if (ioctl( fd, RTEMS_IO_TCDRAIN, NULL ) < 0)
10a8a0: 50 push %eax
10a8a1: 6a 00 push $0x0
10a8a3: 6a 03 push $0x3
10a8a5: 53 push %ebx
10a8a6: e8 d9 71 00 00 call 111a84 <ioctl>
10a8ab: 83 c4 10 add $0x10,%esp
10a8ae: 85 c0 test %eax,%eax
10a8b0: 78 e2 js 10a894 <tcsetattr+0x20> <== NEVER TAKEN
return -1;
/*
* Fall through to....
*/
case TCSANOW:
return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp );
10a8b2: 89 75 10 mov %esi,0x10(%ebp)
10a8b5: c7 45 0c 02 00 00 00 movl $0x2,0xc(%ebp)
10a8bc: 89 5d 08 mov %ebx,0x8(%ebp)
}
}
10a8bf: 8d 65 f8 lea -0x8(%ebp),%esp
10a8c2: 5b pop %ebx
10a8c3: 5e pop %esi
10a8c4: c9 leave
return -1;
/*
* Fall through to....
*/
case TCSANOW:
return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp );
10a8c5: e9 ba 71 00 00 jmp 111a84 <ioctl>
0010b500 <timer_create>:
int timer_create(
clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid
)
{
10b500: 55 push %ebp
10b501: 89 e5 mov %esp,%ebp
10b503: 56 push %esi
10b504: 53 push %ebx
10b505: 8b 5d 0c mov 0xc(%ebp),%ebx
10b508: 8b 75 10 mov 0x10(%ebp),%esi
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
10b50b: 83 7d 08 01 cmpl $0x1,0x8(%ebp)
10b50f: 0f 85 db 00 00 00 jne 10b5f0 <timer_create+0xf0>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !timerid )
10b515: 85 f6 test %esi,%esi
10b517: 0f 84 d3 00 00 00 je 10b5f0 <timer_create+0xf0>
/*
* The data of the structure evp are checked in order to verify if they
* are coherent.
*/
if (evp != NULL) {
10b51d: 85 db test %ebx,%ebx
10b51f: 74 21 je 10b542 <timer_create+0x42>
/* The structure has data */
if ( ( evp->sigev_notify != SIGEV_NONE ) &&
10b521: 8b 03 mov (%ebx),%eax
10b523: 48 dec %eax
10b524: 83 f8 01 cmp $0x1,%eax
10b527: 0f 87 c3 00 00 00 ja 10b5f0 <timer_create+0xf0> <== NEVER TAKEN
( evp->sigev_notify != SIGEV_SIGNAL ) ) {
/* The value of the field sigev_notify is not valid */
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !evp->sigev_signo )
10b52d: 8b 43 04 mov 0x4(%ebx),%eax
10b530: 85 c0 test %eax,%eax
10b532: 0f 84 b8 00 00 00 je 10b5f0 <timer_create+0xf0> <== NEVER TAKEN
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
10b538: 48 dec %eax
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
10b539: 83 f8 1f cmp $0x1f,%eax
10b53c: 0f 87 ae 00 00 00 ja 10b5f0 <timer_create+0xf0> <== NEVER TAKEN
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b542: a1 50 a1 12 00 mov 0x12a150,%eax
10b547: 40 inc %eax
10b548: a3 50 a1 12 00 mov %eax,0x12a150
* the inactive chain of free timer control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_Timer_Control *_POSIX_Timer_Allocate( void )
{
return (POSIX_Timer_Control *) _Objects_Allocate( &_POSIX_Timer_Information );
10b54d: 83 ec 0c sub $0xc,%esp
10b550: 68 e0 a4 12 00 push $0x12a4e0
10b555: e8 9e 1e 00 00 call 10d3f8 <_Objects_Allocate>
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
10b55a: 83 c4 10 add $0x10,%esp
10b55d: 85 c0 test %eax,%eax
10b55f: 0f 84 a2 00 00 00 je 10b607 <timer_create+0x107>
rtems_set_errno_and_return_minus_one( EAGAIN );
}
/* The data of the created timer are stored to use them later */
ptimer->state = POSIX_TIMER_STATE_CREATE_NEW;
10b565: c6 40 3c 02 movb $0x2,0x3c(%eax)
ptimer->thread_id = _Thread_Executing->Object.id;
10b569: 8b 15 38 a7 12 00 mov 0x12a738,%edx
10b56f: 8b 52 08 mov 0x8(%edx),%edx
10b572: 89 50 38 mov %edx,0x38(%eax)
if ( evp != NULL ) {
10b575: 85 db test %ebx,%ebx
10b577: 74 11 je 10b58a <timer_create+0x8a>
ptimer->inf.sigev_notify = evp->sigev_notify;
10b579: 8b 13 mov (%ebx),%edx
10b57b: 89 50 40 mov %edx,0x40(%eax)
ptimer->inf.sigev_signo = evp->sigev_signo;
10b57e: 8b 53 04 mov 0x4(%ebx),%edx
10b581: 89 50 44 mov %edx,0x44(%eax)
ptimer->inf.sigev_value = evp->sigev_value;
10b584: 8b 53 08 mov 0x8(%ebx),%edx
10b587: 89 50 48 mov %edx,0x48(%eax)
}
ptimer->overrun = 0;
10b58a: c7 40 68 00 00 00 00 movl $0x0,0x68(%eax)
ptimer->timer_data.it_value.tv_sec = 0;
10b591: c7 40 5c 00 00 00 00 movl $0x0,0x5c(%eax)
ptimer->timer_data.it_value.tv_nsec = 0;
10b598: c7 40 60 00 00 00 00 movl $0x0,0x60(%eax)
ptimer->timer_data.it_interval.tv_sec = 0;
10b59f: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
ptimer->timer_data.it_interval.tv_nsec = 0;
10b5a6: c7 40 58 00 00 00 00 movl $0x0,0x58(%eax)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10b5ad: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
the_watchdog->routine = routine;
10b5b4: c7 40 2c 00 00 00 00 movl $0x0,0x2c(%eax)
the_watchdog->id = id;
10b5bb: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)
the_watchdog->user_data = user_data;
10b5c2: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10b5c9: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10b5cc: 0f b7 da movzwl %dx,%ebx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10b5cf: 8b 0d fc a4 12 00 mov 0x12a4fc,%ecx
10b5d5: 89 04 99 mov %eax,(%ecx,%ebx,4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
10b5d8: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
_Watchdog_Initialize( &ptimer->Timer, NULL, 0, NULL );
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
10b5df: 89 16 mov %edx,(%esi)
_Thread_Enable_dispatch();
10b5e1: e8 7e 2d 00 00 call 10e364 <_Thread_Enable_dispatch>
return 0;
10b5e6: 31 c0 xor %eax,%eax
}
10b5e8: 8d 65 f8 lea -0x8(%ebp),%esp
10b5eb: 5b pop %ebx
10b5ec: 5e pop %esi
10b5ed: c9 leave
10b5ee: c3 ret
10b5ef: 90 nop
if ( !evp->sigev_signo )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
rtems_set_errno_and_return_minus_one( EINVAL );
10b5f0: e8 d3 8a 00 00 call 1140c8 <__errno>
10b5f5: c7 00 16 00 00 00 movl $0x16,(%eax)
10b5fb: b8 ff ff ff ff mov $0xffffffff,%eax
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10b600: 8d 65 f8 lea -0x8(%ebp),%esp
10b603: 5b pop %ebx
10b604: 5e pop %esi
10b605: c9 leave
10b606: c3 ret
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
_Thread_Enable_dispatch();
10b607: e8 58 2d 00 00 call 10e364 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
10b60c: e8 b7 8a 00 00 call 1140c8 <__errno>
10b611: c7 00 0b 00 00 00 movl $0xb,(%eax)
10b617: b8 ff ff ff ff mov $0xffffffff,%eax
10b61c: eb ca jmp 10b5e8 <timer_create+0xe8>
0010ba44 <timer_delete>:
int timer_delete(
timer_t timerid
)
{
10ba44: 55 push %ebp
10ba45: 89 e5 mov %esp,%ebp
10ba47: 53 push %ebx
10ba48: 83 ec 18 sub $0x18,%esp
* because rtems_timer_delete stops the timer before deleting it.
*/
POSIX_Timer_Control *ptimer;
Objects_Locations location;
ptimer = _POSIX_Timer_Get( timerid, &location );
10ba4b: 8d 45 f4 lea -0xc(%ebp),%eax
timer_t id,
Objects_Locations *location
)
{
return (POSIX_Timer_Control *)
_Objects_Get( &_POSIX_Timer_Information, (Objects_Id) id, location );
10ba4e: 50 push %eax
10ba4f: ff 75 08 pushl 0x8(%ebp)
10ba52: 68 e0 a3 12 00 push $0x12a3e0
10ba57: e8 a4 21 00 00 call 10dc00 <_Objects_Get>
10ba5c: 89 c3 mov %eax,%ebx
switch ( location ) {
10ba5e: 83 c4 10 add $0x10,%esp
10ba61: 8b 4d f4 mov -0xc(%ebp),%ecx
10ba64: 85 c9 test %ecx,%ecx
10ba66: 74 18 je 10ba80 <timer_delete+0x3c>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10ba68: e8 6b 8d 00 00 call 1147d8 <__errno>
10ba6d: c7 00 16 00 00 00 movl $0x16,(%eax)
10ba73: b8 ff ff ff ff mov $0xffffffff,%eax
}
10ba78: 8b 5d fc mov -0x4(%ebp),%ebx
10ba7b: c9 leave
10ba7c: c3 ret
10ba7d: 8d 76 00 lea 0x0(%esi),%esi
ptimer = _POSIX_Timer_Get( timerid, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_Objects_Close( &_POSIX_Timer_Information, &ptimer->Object );
10ba80: 83 ec 08 sub $0x8,%esp
10ba83: 50 push %eax
10ba84: 68 e0 a3 12 00 push $0x12a3e0
10ba89: e8 36 1d 00 00 call 10d7c4 <_Objects_Close>
ptimer->state = POSIX_TIMER_STATE_FREE;
10ba8e: c6 43 3c 01 movb $0x1,0x3c(%ebx)
(void) _Watchdog_Remove( &ptimer->Timer );
10ba92: 8d 43 10 lea 0x10(%ebx),%eax
10ba95: 89 04 24 mov %eax,(%esp)
10ba98: e8 43 3c 00 00 call 10f6e0 <_Watchdog_Remove>
RTEMS_INLINE_ROUTINE void _POSIX_Timer_Free (
POSIX_Timer_Control *the_timer
)
{
_Objects_Free( &_POSIX_Timer_Information, &the_timer->Object );
10ba9d: 58 pop %eax
10ba9e: 5a pop %edx
10ba9f: 53 push %ebx
10baa0: 68 e0 a3 12 00 push $0x12a3e0
10baa5: e8 16 20 00 00 call 10dac0 <_Objects_Free>
_POSIX_Timer_Free( ptimer );
_Thread_Enable_dispatch();
10baaa: e8 05 2c 00 00 call 10e6b4 <_Thread_Enable_dispatch>
return 0;
10baaf: 83 c4 10 add $0x10,%esp
10bab2: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10bab4: 8b 5d fc mov -0x4(%ebp),%ebx
10bab7: c9 leave
10bab8: c3 ret
0010c900 <timer_getoverrun>:
* its execution, _POSIX_Timer_TSR will have to set this counter to 0.
*/
int timer_getoverrun(
timer_t timerid
)
{
10c900: 55 push %ebp
10c901: 89 e5 mov %esp,%ebp
10c903: 53 push %ebx
10c904: 83 ec 18 sub $0x18,%esp
int overrun;
POSIX_Timer_Control *ptimer;
Objects_Locations location;
ptimer = _POSIX_Timer_Get( timerid, &location );
10c907: 8d 45 f4 lea -0xc(%ebp),%eax
timer_t id,
Objects_Locations *location
)
{
return (POSIX_Timer_Control *)
_Objects_Get( &_POSIX_Timer_Information, (Objects_Id) id, location );
10c90a: 50 push %eax
10c90b: ff 75 08 pushl 0x8(%ebp)
10c90e: 68 80 ba 12 00 push $0x12ba80
10c913: e8 2c 21 00 00 call 10ea44 <_Objects_Get>
switch ( location ) {
10c918: 83 c4 10 add $0x10,%esp
10c91b: 8b 55 f4 mov -0xc(%ebp),%edx
10c91e: 85 d2 test %edx,%edx
10c920: 74 1a je 10c93c <timer_getoverrun+0x3c>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10c922: e8 31 89 00 00 call 115258 <__errno>
10c927: c7 00 16 00 00 00 movl $0x16,(%eax)
10c92d: bb ff ff ff ff mov $0xffffffff,%ebx
}
10c932: 89 d8 mov %ebx,%eax
10c934: 8b 5d fc mov -0x4(%ebp),%ebx
10c937: c9 leave
10c938: c3 ret
10c939: 8d 76 00 lea 0x0(%esi),%esi
ptimer = _POSIX_Timer_Get( timerid, &location );
switch ( location ) {
case OBJECTS_LOCAL:
overrun = ptimer->overrun;
10c93c: 8b 58 68 mov 0x68(%eax),%ebx
ptimer->overrun = 0;
10c93f: c7 40 68 00 00 00 00 movl $0x0,0x68(%eax)
_Thread_Enable_dispatch();
10c946: e8 ad 2b 00 00 call 10f4f8 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10c94b: 89 d8 mov %ebx,%eax
10c94d: 8b 5d fc mov -0x4(%ebp),%ebx
10c950: c9 leave
10c951: c3 ret
0010c954 <timer_gettime>:
int timer_gettime(
timer_t timerid,
struct itimerspec *value
)
{
10c954: 55 push %ebp
10c955: 89 e5 mov %esp,%ebp
10c957: 56 push %esi
10c958: 53 push %ebx
10c959: 83 ec 10 sub $0x10,%esp
10c95c: 8b 5d 0c mov 0xc(%ebp),%ebx
POSIX_Timer_Control *ptimer;
Objects_Locations location;
struct timespec current_time;
Watchdog_Interval left;
if ( !value )
10c95f: 85 db test %ebx,%ebx
10c961: 74 65 je 10c9c8 <timer_gettime+0x74>
rtems_set_errno_and_return_minus_one( EINVAL );
/* Reads the current time */
_TOD_Get( ¤t_time );
10c963: 83 ec 0c sub $0xc,%esp
10c966: 8d 45 ec lea -0x14(%ebp),%eax
10c969: 50 push %eax
10c96a: e8 01 17 00 00 call 10e070 <_TOD_Get>
10c96f: 83 c4 0c add $0xc,%esp
ptimer = _POSIX_Timer_Get( timerid, &location );
10c972: 8d 45 f4 lea -0xc(%ebp),%eax
10c975: 50 push %eax
10c976: ff 75 08 pushl 0x8(%ebp)
10c979: 68 80 ba 12 00 push $0x12ba80
10c97e: e8 c1 20 00 00 call 10ea44 <_Objects_Get>
10c983: 89 c6 mov %eax,%esi
switch ( location ) {
10c985: 83 c4 10 add $0x10,%esp
10c988: 8b 45 f4 mov -0xc(%ebp),%eax
10c98b: 85 c0 test %eax,%eax
10c98d: 75 39 jne 10c9c8 <timer_gettime+0x74>
case OBJECTS_LOCAL:
/* Calculates the time left before the timer finishes */
left =
(ptimer->Timer.start_time + ptimer->Timer.initial) - /* expire */
10c98f: a1 64 b8 12 00 mov 0x12b864,%eax
_Watchdog_Ticks_since_boot; /* now */
_Timespec_From_ticks( left, &value->it_value );
10c994: 83 ec 08 sub $0x8,%esp
10c997: 8d 53 08 lea 0x8(%ebx),%edx
10c99a: 52 push %edx
case OBJECTS_LOCAL:
/* Calculates the time left before the timer finishes */
left =
(ptimer->Timer.start_time + ptimer->Timer.initial) - /* expire */
10c99b: 8b 56 1c mov 0x1c(%esi),%edx
10c99e: 03 56 24 add 0x24(%esi),%edx
case OBJECTS_LOCAL:
/* Calculates the time left before the timer finishes */
left =
10c9a1: 29 c2 sub %eax,%edx
(ptimer->Timer.start_time + ptimer->Timer.initial) - /* expire */
_Watchdog_Ticks_since_boot; /* now */
_Timespec_From_ticks( left, &value->it_value );
10c9a3: 52 push %edx
10c9a4: e8 73 36 00 00 call 11001c <_Timespec_From_ticks>
value->it_interval = ptimer->timer_data.it_interval;
10c9a9: 8b 46 54 mov 0x54(%esi),%eax
10c9ac: 8b 56 58 mov 0x58(%esi),%edx
10c9af: 89 03 mov %eax,(%ebx)
10c9b1: 89 53 04 mov %edx,0x4(%ebx)
_Thread_Enable_dispatch();
10c9b4: e8 3f 2b 00 00 call 10f4f8 <_Thread_Enable_dispatch>
return 0;
10c9b9: 83 c4 10 add $0x10,%esp
10c9bc: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10c9be: 8d 65 f8 lea -0x8(%ebp),%esp
10c9c1: 5b pop %ebx
10c9c2: 5e pop %esi
10c9c3: c9 leave
10c9c4: c3 ret
10c9c5: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10c9c8: e8 8b 88 00 00 call 115258 <__errno>
10c9cd: c7 00 16 00 00 00 movl $0x16,(%eax)
10c9d3: b8 ff ff ff ff mov $0xffffffff,%eax
10c9d8: eb e4 jmp 10c9be <timer_gettime+0x6a>
0010b620 <timer_settime>:
timer_t timerid,
int flags,
const struct itimerspec *value,
struct itimerspec *ovalue
)
{
10b620: 55 push %ebp
10b621: 89 e5 mov %esp,%ebp
10b623: 57 push %edi
10b624: 56 push %esi
10b625: 53 push %ebx
10b626: 83 ec 3c sub $0x3c,%esp
10b629: 8b 5d 10 mov 0x10(%ebp),%ebx
Objects_Locations location;
bool activated;
uint32_t initial_period;
struct itimerspec normalize;
if ( !value )
10b62c: 85 db test %ebx,%ebx
10b62e: 0f 84 50 01 00 00 je 10b784 <timer_settime+0x164> <== NEVER TAKEN
/*
* First, it verifies if the structure "value" is correct
* if the number of nanoseconds is not correct return EINVAL
*/
if ( !_Timespec_Is_valid( &(value->it_value) ) ) {
10b634: 83 ec 0c sub $0xc,%esp
10b637: 8d 43 08 lea 0x8(%ebx),%eax
10b63a: 50 push %eax
10b63b: e8 6c 38 00 00 call 10eeac <_Timespec_Is_valid>
10b640: 83 c4 10 add $0x10,%esp
10b643: 84 c0 test %al,%al
10b645: 0f 84 39 01 00 00 je 10b784 <timer_settime+0x164>
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !_Timespec_Is_valid( &(value->it_interval) ) ) {
10b64b: 83 ec 0c sub $0xc,%esp
10b64e: 53 push %ebx
10b64f: e8 58 38 00 00 call 10eeac <_Timespec_Is_valid>
10b654: 83 c4 10 add $0x10,%esp
10b657: 84 c0 test %al,%al
10b659: 0f 84 25 01 00 00 je 10b784 <timer_settime+0x164> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) {
10b65f: 83 7d 0c 04 cmpl $0x4,0xc(%ebp)
10b663: 0f 84 db 00 00 00 je 10b744 <timer_settime+0x124>
10b669: 8b 45 0c mov 0xc(%ebp),%eax
10b66c: 85 c0 test %eax,%eax
10b66e: 0f 85 10 01 00 00 jne 10b784 <timer_settime+0x164>
rtems_set_errno_and_return_minus_one( EINVAL );
}
normalize = *value;
10b674: 8d 45 cc lea -0x34(%ebp),%eax
10b677: 89 45 c4 mov %eax,-0x3c(%ebp)
10b67a: b9 04 00 00 00 mov $0x4,%ecx
10b67f: 89 c7 mov %eax,%edi
10b681: 89 de mov %ebx,%esi
10b683: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
timer_t id,
Objects_Locations *location
)
{
return (POSIX_Timer_Control *)
_Objects_Get( &_POSIX_Timer_Information, (Objects_Id) id, location );
10b685: 50 push %eax
/* If the function reaches this point, then it will be necessary to do
* something with the structure of times of the timer: to stop, start
* or start it again
*/
ptimer = _POSIX_Timer_Get( timerid, &location );
10b686: 8d 45 e4 lea -0x1c(%ebp),%eax
10b689: 50 push %eax
10b68a: ff 75 08 pushl 0x8(%ebp)
10b68d: 68 e0 a4 12 00 push $0x12a4e0
10b692: e8 19 22 00 00 call 10d8b0 <_Objects_Get>
10b697: 89 c2 mov %eax,%edx
switch ( location ) {
10b699: 83 c4 10 add $0x10,%esp
10b69c: 8b 7d e4 mov -0x1c(%ebp),%edi
10b69f: 85 ff test %edi,%edi
10b6a1: 0f 85 dd 00 00 00 jne 10b784 <timer_settime+0x164>
case OBJECTS_LOCAL:
/* First, it verifies if the timer must be stopped */
if ( normalize.it_value.tv_sec == 0 && normalize.it_value.tv_nsec == 0 ) {
10b6a7: 8b 75 d4 mov -0x2c(%ebp),%esi
10b6aa: 85 f6 test %esi,%esi
10b6ac: 75 0b jne 10b6b9 <timer_settime+0x99>
10b6ae: 8b 4d d8 mov -0x28(%ebp),%ecx
10b6b1: 85 c9 test %ecx,%ecx
10b6b3: 0f 84 df 00 00 00 je 10b798 <timer_settime+0x178>
_Thread_Enable_dispatch();
return 0;
}
/* Convert from seconds and nanoseconds to ticks */
ptimer->ticks = _Timespec_To_ticks( &value->it_interval );
10b6b9: 83 ec 0c sub $0xc,%esp
10b6bc: 53 push %ebx
10b6bd: 89 55 c0 mov %edx,-0x40(%ebp)
10b6c0: e8 4f 38 00 00 call 10ef14 <_Timespec_To_ticks>
10b6c5: 8b 55 c0 mov -0x40(%ebp),%edx
10b6c8: 89 42 64 mov %eax,0x64(%edx)
initial_period = _Timespec_To_ticks( &normalize.it_value );
10b6cb: 8d 45 d4 lea -0x2c(%ebp),%eax
10b6ce: 89 04 24 mov %eax,(%esp)
10b6d1: e8 3e 38 00 00 call 10ef14 <_Timespec_To_ticks>
activated = _POSIX_Timer_Insert_helper(
10b6d6: 8b 55 c0 mov -0x40(%ebp),%edx
10b6d9: 89 14 24 mov %edx,(%esp)
10b6dc: 68 04 b8 10 00 push $0x10b804
10b6e1: ff 72 08 pushl 0x8(%edx)
10b6e4: 50 push %eax
10b6e5: 8d 42 10 lea 0x10(%edx),%eax
10b6e8: 50 push %eax
10b6e9: e8 3e 61 00 00 call 11182c <_POSIX_Timer_Insert_helper>
initial_period,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated ) {
10b6ee: 83 c4 20 add $0x20,%esp
10b6f1: 84 c0 test %al,%al
10b6f3: 8b 55 c0 mov -0x40(%ebp),%edx
10b6f6: 0f 84 e8 00 00 00 je 10b7e4 <timer_settime+0x1c4>
/*
* The timer has been started and is running. So we return the
* old ones in "ovalue"
*/
if ( ovalue )
10b6fc: 8b 45 14 mov 0x14(%ebp),%eax
10b6ff: 85 c0 test %eax,%eax
10b701: 0f 84 ed 00 00 00 je 10b7f4 <timer_settime+0x1d4>
*ovalue = ptimer->timer_data;
10b707: 8d 42 54 lea 0x54(%edx),%eax
10b70a: b9 04 00 00 00 mov $0x4,%ecx
10b70f: 8b 7d 14 mov 0x14(%ebp),%edi
10b712: 89 c6 mov %eax,%esi
10b714: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
ptimer->timer_data = normalize;
10b716: b9 04 00 00 00 mov $0x4,%ecx
10b71b: 89 c7 mov %eax,%edi
10b71d: 8b 75 c4 mov -0x3c(%ebp),%esi
10b720: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* Indicate that the time is running */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
10b722: c6 42 3c 03 movb $0x3,0x3c(%edx)
_TOD_Get( &ptimer->time );
10b726: 83 ec 0c sub $0xc,%esp
10b729: 83 c2 6c add $0x6c,%edx
10b72c: 52 push %edx
10b72d: e8 ce 17 00 00 call 10cf00 <_TOD_Get>
_Thread_Enable_dispatch();
10b732: e8 2d 2c 00 00 call 10e364 <_Thread_Enable_dispatch>
return 0;
10b737: 83 c4 10 add $0x10,%esp
10b73a: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10b73c: 8d 65 f4 lea -0xc(%ebp),%esp
10b73f: 5b pop %ebx
10b740: 5e pop %esi
10b741: 5f pop %edi
10b742: c9 leave
10b743: c3 ret
if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) {
rtems_set_errno_and_return_minus_one( EINVAL );
}
normalize = *value;
10b744: 8d 45 cc lea -0x34(%ebp),%eax
10b747: 89 45 c4 mov %eax,-0x3c(%ebp)
10b74a: 89 c7 mov %eax,%edi
10b74c: 89 de mov %ebx,%esi
10b74e: 8b 4d 0c mov 0xc(%ebp),%ecx
10b751: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* Convert absolute to relative time */
if (flags == TIMER_ABSTIME) {
struct timespec now;
_TOD_Get( &now );
10b753: 83 ec 0c sub $0xc,%esp
10b756: 8d 75 dc lea -0x24(%ebp),%esi
10b759: 56 push %esi
10b75a: e8 a1 17 00 00 call 10cf00 <_TOD_Get>
/* Check for seconds in the past */
if ( _Timespec_Greater_than( &now, &normalize.it_value ) )
10b75f: 59 pop %ecx
10b760: 5f pop %edi
10b761: 8d 7d d4 lea -0x2c(%ebp),%edi
10b764: 57 push %edi
10b765: 56 push %esi
10b766: e8 1d 37 00 00 call 10ee88 <_Timespec_Greater_than>
10b76b: 83 c4 10 add $0x10,%esp
10b76e: 84 c0 test %al,%al
10b770: 75 12 jne 10b784 <timer_settime+0x164>
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_Subtract( &now, &normalize.it_value, &normalize.it_value );
10b772: 52 push %edx
10b773: 57 push %edi
10b774: 57 push %edi
10b775: 56 push %esi
10b776: e8 59 37 00 00 call 10eed4 <_Timespec_Subtract>
10b77b: 83 c4 10 add $0x10,%esp
10b77e: e9 02 ff ff ff jmp 10b685 <timer_settime+0x65>
10b783: 90 nop
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10b784: e8 3f 89 00 00 call 1140c8 <__errno>
10b789: c7 00 16 00 00 00 movl $0x16,(%eax)
10b78f: b8 ff ff ff ff mov $0xffffffff,%eax
10b794: eb a6 jmp 10b73c <timer_settime+0x11c>
10b796: 66 90 xchg %ax,%ax
case OBJECTS_LOCAL:
/* First, it verifies if the timer must be stopped */
if ( normalize.it_value.tv_sec == 0 && normalize.it_value.tv_nsec == 0 ) {
/* Stop the timer */
(void) _Watchdog_Remove( &ptimer->Timer );
10b798: 83 ec 0c sub $0xc,%esp
10b79b: 8d 40 10 lea 0x10(%eax),%eax
10b79e: 50 push %eax
10b79f: 89 55 c0 mov %edx,-0x40(%ebp)
10b7a2: e8 a1 3b 00 00 call 10f348 <_Watchdog_Remove>
/* The old data of the timer are returned */
if ( ovalue )
10b7a7: 83 c4 10 add $0x10,%esp
10b7aa: 8b 55 14 mov 0x14(%ebp),%edx
10b7ad: 85 d2 test %edx,%edx
10b7af: 8b 55 c0 mov -0x40(%ebp),%edx
10b7b2: 74 48 je 10b7fc <timer_settime+0x1dc>
*ovalue = ptimer->timer_data;
10b7b4: 8d 42 54 lea 0x54(%edx),%eax
10b7b7: b9 04 00 00 00 mov $0x4,%ecx
10b7bc: 8b 7d 14 mov 0x14(%ebp),%edi
10b7bf: 89 c6 mov %eax,%esi
10b7c1: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* The new data are set */
ptimer->timer_data = normalize;
10b7c3: b9 04 00 00 00 mov $0x4,%ecx
10b7c8: 89 c7 mov %eax,%edi
10b7ca: 8b 75 c4 mov -0x3c(%ebp),%esi
10b7cd: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* Indicates that the timer is created and stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
10b7cf: c6 42 3c 04 movb $0x4,0x3c(%edx)
/* Returns with success */
_Thread_Enable_dispatch();
10b7d3: e8 8c 2b 00 00 call 10e364 <_Thread_Enable_dispatch>
return 0;
10b7d8: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10b7da: 8d 65 f4 lea -0xc(%ebp),%esp
10b7dd: 5b pop %ebx
10b7de: 5e pop %esi
10b7df: 5f pop %edi
10b7e0: c9 leave
10b7e1: c3 ret
10b7e2: 66 90 xchg %ax,%ax
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated ) {
_Thread_Enable_dispatch();
10b7e4: e8 7b 2b 00 00 call 10e364 <_Thread_Enable_dispatch>
return 0;
10b7e9: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10b7eb: 8d 65 f4 lea -0xc(%ebp),%esp
10b7ee: 5b pop %ebx
10b7ef: 5e pop %esi
10b7f0: 5f pop %edi
10b7f1: c9 leave
10b7f2: c3 ret
10b7f3: 90 nop
10b7f4: 8d 42 54 lea 0x54(%edx),%eax
10b7f7: e9 1a ff ff ff jmp 10b716 <timer_settime+0xf6>
10b7fc: 8d 42 54 lea 0x54(%edx),%eax
10b7ff: eb c2 jmp 10b7c3 <timer_settime+0x1a3>
0010b410 <ualarm>:
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
10b410: 55 push %ebp
10b411: 89 e5 mov %esp,%ebp
10b413: 56 push %esi
10b414: 53 push %ebx
10b415: 83 ec 10 sub $0x10,%esp
10b418: 8b 5d 08 mov 0x8(%ebp),%ebx
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
10b41b: 8b 0d 3c a7 12 00 mov 0x12a73c,%ecx
10b421: 85 c9 test %ecx,%ecx
10b423: 0f 84 8f 00 00 00 je 10b4b8 <ualarm+0xa8>
_Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL );
} else {
Watchdog_States state;
state = _Watchdog_Remove( the_timer );
10b429: 83 ec 0c sub $0xc,%esp
10b42c: 68 20 a7 12 00 push $0x12a720
10b431: e8 72 3a 00 00 call 10eea8 <_Watchdog_Remove>
if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) {
10b436: 83 e8 02 sub $0x2,%eax
10b439: 83 c4 10 add $0x10,%esp
10b43c: 83 f8 01 cmp $0x1,%eax
10b43f: 0f 86 a3 00 00 00 jbe 10b4e8 <ualarm+0xd8> <== ALWAYS TAKEN
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
10b445: 31 f6 xor %esi,%esi
/*
* If useconds is non-zero, then the caller wants to schedule
* the alarm repeatedly at that interval. If the interval is
* less than a single clock tick, then fudge it to a clock tick.
*/
if ( useconds ) {
10b447: 85 db test %ebx,%ebx
10b449: 74 62 je 10b4ad <ualarm+0x9d>
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
10b44b: ba 83 de 1b 43 mov $0x431bde83,%edx
10b450: 89 d8 mov %ebx,%eax
10b452: f7 e2 mul %edx
10b454: c1 ea 12 shr $0x12,%edx
10b457: 89 55 f0 mov %edx,-0x10(%ebp)
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
10b45a: 8d 04 92 lea (%edx,%edx,4),%eax
10b45d: 8d 04 80 lea (%eax,%eax,4),%eax
10b460: 8d 04 80 lea (%eax,%eax,4),%eax
10b463: 8d 04 80 lea (%eax,%eax,4),%eax
10b466: 8d 04 80 lea (%eax,%eax,4),%eax
10b469: 8d 04 80 lea (%eax,%eax,4),%eax
10b46c: c1 e0 06 shl $0x6,%eax
10b46f: 29 c3 sub %eax,%ebx
10b471: 8d 04 9b lea (%ebx,%ebx,4),%eax
10b474: 8d 04 80 lea (%eax,%eax,4),%eax
10b477: 8d 04 80 lea (%eax,%eax,4),%eax
10b47a: c1 e0 03 shl $0x3,%eax
10b47d: 89 45 f4 mov %eax,-0xc(%ebp)
ticks = _Timespec_To_ticks( &tp );
10b480: 83 ec 0c sub $0xc,%esp
10b483: 8d 5d f0 lea -0x10(%ebp),%ebx
10b486: 53 push %ebx
10b487: e8 70 35 00 00 call 10e9fc <_Timespec_To_ticks>
if ( ticks == 0 )
ticks = 1;
_Watchdog_Insert_ticks( the_timer, _Timespec_To_ticks( &tp ) );
10b48c: 89 1c 24 mov %ebx,(%esp)
10b48f: e8 68 35 00 00 call 10e9fc <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10b494: a3 2c a7 12 00 mov %eax,0x12a72c
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10b499: 58 pop %eax
10b49a: 5a pop %edx
10b49b: 68 20 a7 12 00 push $0x12a720
10b4a0: 68 3c 9e 12 00 push $0x129e3c
10b4a5: e8 be 38 00 00 call 10ed68 <_Watchdog_Insert>
10b4aa: 83 c4 10 add $0x10,%esp
}
return remaining;
}
10b4ad: 89 f0 mov %esi,%eax
10b4af: 8d 65 f8 lea -0x8(%ebp),%esp
10b4b2: 5b pop %ebx
10b4b3: 5e pop %esi
10b4b4: c9 leave
10b4b5: c3 ret
10b4b6: 66 90 xchg %ax,%ax
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10b4b8: c7 05 28 a7 12 00 00 movl $0x0,0x12a728
10b4bf: 00 00 00
the_watchdog->routine = routine;
10b4c2: c7 05 3c a7 12 00 d4 movl $0x10b3d4,0x12a73c
10b4c9: b3 10 00
the_watchdog->id = id;
10b4cc: c7 05 40 a7 12 00 00 movl $0x0,0x12a740
10b4d3: 00 00 00
the_watchdog->user_data = user_data;
10b4d6: c7 05 44 a7 12 00 00 movl $0x0,0x12a744
10b4dd: 00 00 00
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
10b4e0: 31 f6 xor %esi,%esi
10b4e2: e9 60 ff ff ff jmp 10b447 <ualarm+0x37>
10b4e7: 90 nop
* boot. Since alarm() is dealing in seconds, we must account for
* this.
*/
ticks = the_timer->initial;
ticks -= (the_timer->stop_time - the_timer->start_time);
10b4e8: a1 34 a7 12 00 mov 0x12a734,%eax
10b4ed: 03 05 2c a7 12 00 add 0x12a72c,%eax
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
10b4f3: 83 ec 08 sub $0x8,%esp
10b4f6: 8d 55 f0 lea -0x10(%ebp),%edx
10b4f9: 52 push %edx
* boot. Since alarm() is dealing in seconds, we must account for
* this.
*/
ticks = the_timer->initial;
ticks -= (the_timer->stop_time - the_timer->start_time);
10b4fa: 2b 05 38 a7 12 00 sub 0x12a738,%eax
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
10b500: 50 push %eax
10b501: e8 6e 34 00 00 call 10e974 <_Timespec_From_ticks>
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
10b506: 8b 45 f0 mov -0x10(%ebp),%eax
10b509: 8d 04 80 lea (%eax,%eax,4),%eax
10b50c: 8d 04 80 lea (%eax,%eax,4),%eax
10b50f: 8d 04 80 lea (%eax,%eax,4),%eax
10b512: 8d 04 80 lea (%eax,%eax,4),%eax
10b515: 8d 04 80 lea (%eax,%eax,4),%eax
10b518: 8d 0c 80 lea (%eax,%eax,4),%ecx
10b51b: c1 e1 06 shl $0x6,%ecx
remaining += tp.tv_nsec / 1000;
10b51e: 8b 75 f4 mov -0xc(%ebp),%esi
10b521: b8 d3 4d 62 10 mov $0x10624dd3,%eax
10b526: f7 ee imul %esi
10b528: 89 d0 mov %edx,%eax
10b52a: c1 f8 06 sar $0x6,%eax
10b52d: c1 fe 1f sar $0x1f,%esi
10b530: 29 f0 sub %esi,%eax
10b532: 8d 34 08 lea (%eax,%ecx,1),%esi
10b535: 83 c4 10 add $0x10,%esp
10b538: e9 0a ff ff ff jmp 10b447 <ualarm+0x37>
0010bb84 <unlink>:
#include <rtems/seterr.h>
int unlink(
const char *path
)
{
10bb84: 55 push %ebp
10bb85: 89 e5 mov %esp,%ebp
10bb87: 57 push %edi
10bb88: 56 push %esi
10bb89: 53 push %ebx
10bb8a: 83 ec 58 sub $0x58,%esp
10bb8d: 8b 5d 08 mov 0x8(%ebp),%ebx
/*
* Get the node to be unlinked. Find the parent path first.
*/
parentpathlen = rtems_filesystem_dirname ( path );
10bb90: 53 push %ebx
10bb91: e8 3e d3 ff ff call 108ed4 <rtems_filesystem_dirname>
if ( parentpathlen == 0 )
10bb96: 83 c4 10 add $0x10,%esp
10bb99: 85 c0 test %eax,%eax
10bb9b: 0f 85 d3 00 00 00 jne 10bc74 <unlink+0xf0>
rtems_filesystem_get_start_loc( path, &i, &parentloc );
10bba1: 50 push %eax
10bba2: 8d 45 d0 lea -0x30(%ebp),%eax
10bba5: 89 45 b4 mov %eax,-0x4c(%ebp)
10bba8: 50 push %eax
10bba9: 8d 45 e4 lea -0x1c(%ebp),%eax
10bbac: 50 push %eax
10bbad: 53 push %ebx
10bbae: e8 b9 e2 ff ff call 109e6c <rtems_filesystem_get_start_loc>
10bbb3: 83 c4 10 add $0x10,%esp
10bbb6: 31 d2 xor %edx,%edx
const char *name;
rtems_filesystem_location_info_t parentloc;
rtems_filesystem_location_info_t loc;
int i;
int result;
bool free_parentloc = false;
10bbb8: c6 45 b3 00 movb $0x0,-0x4d(%ebp)
/*
* Start from the parent to find the node that should be under it.
*/
loc = parentloc;
10bbbc: 8d 7d bc lea -0x44(%ebp),%edi
10bbbf: b9 05 00 00 00 mov $0x5,%ecx
10bbc4: 8b 75 b4 mov -0x4c(%ebp),%esi
10bbc7: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
name = path + parentpathlen;
10bbc9: 01 d3 add %edx,%ebx
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
10bbcb: be ff ff ff ff mov $0xffffffff,%esi
10bbd0: 89 f1 mov %esi,%ecx
10bbd2: 89 df mov %ebx,%edi
10bbd4: 31 c0 xor %eax,%eax
10bbd6: f2 ae repnz scas %es:(%edi),%al
10bbd8: f7 d1 not %ecx
10bbda: 49 dec %ecx
10bbdb: 83 ec 08 sub $0x8,%esp
10bbde: 51 push %ecx
10bbdf: 53 push %ebx
10bbe0: e8 33 d3 ff ff call 108f18 <rtems_filesystem_prefix_separators>
10bbe5: 01 c3 add %eax,%ebx
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
10bbe7: 89 f1 mov %esi,%ecx
10bbe9: 89 df mov %ebx,%edi
10bbeb: 31 c0 xor %eax,%eax
10bbed: f2 ae repnz scas %es:(%edi),%al
10bbef: f7 d1 not %ecx
10bbf1: 49 dec %ecx
10bbf2: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10bbf9: 8d 75 bc lea -0x44(%ebp),%esi
10bbfc: 56 push %esi
10bbfd: 6a 00 push $0x0
10bbff: 51 push %ecx
10bc00: 53 push %ebx
10bc01: e8 22 d2 ff ff call 108e28 <rtems_filesystem_evaluate_relative_path>
0, &loc, false );
if ( result != 0 ) {
10bc06: 83 c4 20 add $0x20,%esp
10bc09: 85 c0 test %eax,%eax
10bc0b: 75 53 jne 10bc60 <unlink+0xdc>
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
return -1;
}
if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
10bc0d: 83 ec 0c sub $0xc,%esp
10bc10: 56 push %esi
10bc11: 8b 45 c8 mov -0x38(%ebp),%eax
10bc14: ff 50 10 call *0x10(%eax)
10bc17: 83 c4 10 add $0x10,%esp
10bc1a: 48 dec %eax
10bc1b: 0f 84 83 00 00 00 je 10bca4 <unlink+0x120>
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
rtems_set_errno_and_return_minus_one( EISDIR );
}
result = (*loc.ops->unlink_h)( &parentloc, &loc );
10bc21: 83 ec 08 sub $0x8,%esp
10bc24: 56 push %esi
10bc25: ff 75 b4 pushl -0x4c(%ebp)
10bc28: 8b 45 c8 mov -0x38(%ebp),%eax
10bc2b: ff 50 0c call *0xc(%eax)
rtems_filesystem_freenode( &loc );
10bc2e: 89 34 24 mov %esi,(%esp)
10bc31: 89 45 ac mov %eax,-0x54(%ebp)
10bc34: e8 2f d3 ff ff call 108f68 <rtems_filesystem_freenode>
if ( free_parentloc )
10bc39: 83 c4 10 add $0x10,%esp
10bc3c: 80 7d b3 00 cmpb $0x0,-0x4d(%ebp)
10bc40: 8b 45 ac mov -0x54(%ebp),%eax
10bc43: 74 11 je 10bc56 <unlink+0xd2>
rtems_filesystem_freenode( &parentloc );
10bc45: 83 ec 0c sub $0xc,%esp
10bc48: ff 75 b4 pushl -0x4c(%ebp)
10bc4b: e8 18 d3 ff ff call 108f68 <rtems_filesystem_freenode>
10bc50: 83 c4 10 add $0x10,%esp
10bc53: 8b 45 ac mov -0x54(%ebp),%eax
return result;
}
10bc56: 8d 65 f4 lea -0xc(%ebp),%esp
10bc59: 5b pop %ebx
10bc5a: 5e pop %esi
10bc5b: 5f pop %edi
10bc5c: c9 leave
10bc5d: c3 ret
10bc5e: 66 90 xchg %ax,%ax
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &loc, false );
if ( result != 0 ) {
if ( free_parentloc )
10bc60: 80 7d b3 00 cmpb $0x0,-0x4d(%ebp)
10bc64: 75 70 jne 10bcd6 <unlink+0x152> <== ALWAYS TAKEN
rtems_filesystem_freenode( &parentloc );
return -1;
10bc66: b8 ff ff ff ff mov $0xffffffff,%eax
rtems_filesystem_freenode( &loc );
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
return result;
}
10bc6b: 8d 65 f4 lea -0xc(%ebp),%esp
10bc6e: 5b pop %ebx <== NOT EXECUTED
10bc6f: 5e pop %esi <== NOT EXECUTED
10bc70: 5f pop %edi <== NOT EXECUTED
10bc71: c9 leave <== NOT EXECUTED
10bc72: c3 ret <== NOT EXECUTED
10bc73: 90 nop <== NOT EXECUTED
parentpathlen = rtems_filesystem_dirname ( path );
if ( parentpathlen == 0 )
rtems_filesystem_get_start_loc( path, &i, &parentloc );
else {
result = rtems_filesystem_evaluate_path( path, parentpathlen,
10bc74: 89 c2 mov %eax,%edx
10bc76: 83 ec 0c sub $0xc,%esp
10bc79: 6a 00 push $0x0
10bc7b: 8d 45 d0 lea -0x30(%ebp),%eax
10bc7e: 89 45 b4 mov %eax,-0x4c(%ebp)
10bc81: 50 push %eax
10bc82: 6a 02 push $0x2
10bc84: 52 push %edx
10bc85: 53 push %ebx
10bc86: 89 55 ac mov %edx,-0x54(%ebp)
10bc89: e8 02 d2 ff ff call 108e90 <rtems_filesystem_evaluate_path>
RTEMS_LIBIO_PERMS_WRITE,
&parentloc,
false );
if ( result != 0 )
10bc8e: 83 c4 20 add $0x20,%esp
10bc91: 85 c0 test %eax,%eax
10bc93: 8b 55 ac mov -0x54(%ebp),%edx
10bc96: 75 ce jne 10bc66 <unlink+0xe2> <== NEVER TAKEN
return -1;
free_parentloc = true;
10bc98: c6 45 b3 01 movb $0x1,-0x4d(%ebp)
10bc9c: e9 1b ff ff ff jmp 10bbbc <unlink+0x38>
10bca1: 8d 76 00 lea 0x0(%esi),%esi
rtems_filesystem_freenode( &parentloc );
return -1;
}
if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
rtems_filesystem_freenode( &loc );
10bca4: 83 ec 0c sub $0xc,%esp
10bca7: 56 push %esi
10bca8: e8 bb d2 ff ff call 108f68 <rtems_filesystem_freenode>
if ( free_parentloc )
10bcad: 83 c4 10 add $0x10,%esp
10bcb0: 80 7d b3 00 cmpb $0x0,-0x4d(%ebp)
10bcb4: 74 0e je 10bcc4 <unlink+0x140>
rtems_filesystem_freenode( &parentloc );
10bcb6: 83 ec 0c sub $0xc,%esp
10bcb9: ff 75 b4 pushl -0x4c(%ebp)
10bcbc: e8 a7 d2 ff ff call 108f68 <rtems_filesystem_freenode>
10bcc1: 83 c4 10 add $0x10,%esp
rtems_set_errno_and_return_minus_one( EISDIR );
10bcc4: e8 0f b4 00 00 call 1170d8 <__errno>
10bcc9: c7 00 15 00 00 00 movl $0x15,(%eax)
10bccf: b8 ff ff ff ff mov $0xffffffff,%eax
10bcd4: eb 80 jmp 10bc56 <unlink+0xd2>
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &loc, false );
if ( result != 0 ) {
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
10bcd6: 83 ec 0c sub $0xc,%esp
10bcd9: ff 75 b4 pushl -0x4c(%ebp)
10bcdc: e8 87 d2 ff ff call 108f68 <rtems_filesystem_freenode>
10bce1: 83 c4 10 add $0x10,%esp
return -1;
10bce4: b8 ff ff ff ff mov $0xffffffff,%eax
10bce9: e9 68 ff ff ff jmp 10bc56 <unlink+0xd2>
0010bd64 <unmount>:
*/
int unmount(
const char *path
)
{
10bd64: 55 push %ebp
10bd65: 89 e5 mov %esp,%ebp
10bd67: 57 push %edi
10bd68: 56 push %esi
10bd69: 53 push %ebx
10bd6a: 83 ec 38 sub $0x38,%esp
10bd6d: 8b 55 08 mov 0x8(%ebp),%edx
* The root node of the mounted filesytem.
* The node for the directory that the fileystem is mounted on.
* The mount entry that is being refered to.
*/
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x0, &loc, true ) )
10bd70: 31 c0 xor %eax,%eax
10bd72: b9 ff ff ff ff mov $0xffffffff,%ecx
10bd77: 89 d7 mov %edx,%edi
10bd79: f2 ae repnz scas %es:(%edi),%al
10bd7b: f7 d1 not %ecx
10bd7d: 49 dec %ecx
10bd7e: 6a 01 push $0x1
10bd80: 8d 75 d4 lea -0x2c(%ebp),%esi
10bd83: 56 push %esi
10bd84: 6a 00 push $0x0
10bd86: 51 push %ecx
10bd87: 52 push %edx
10bd88: e8 77 cf ff ff call 108d04 <rtems_filesystem_evaluate_path>
10bd8d: 83 c4 20 add $0x20,%esp
10bd90: 85 c0 test %eax,%eax
10bd92: 75 68 jne 10bdfc <unmount+0x98>
return -1;
mt_entry = loc.mt_entry;
10bd94: 8b 5d e4 mov -0x1c(%ebp),%ebx
/*
* Verify this is the root node for the file system to be unmounted.
*/
if ( fs_root_loc->node_access != loc.node_access ){
10bd97: 8b 45 d4 mov -0x2c(%ebp),%eax
10bd9a: 39 43 1c cmp %eax,0x1c(%ebx)
10bd9d: 0f 85 c5 00 00 00 jne 10be68 <unmount+0x104>
/*
* Free the loc node and just use the nodes from the mt_entry .
*/
rtems_filesystem_freenode( &loc );
10bda3: 83 ec 0c sub $0xc,%esp
10bda6: 56 push %esi
10bda7: e8 30 d0 ff ff call 108ddc <rtems_filesystem_freenode>
* that made the current node thread based instead
* of system based? I thought it was but it doesn't
* look like it in this version.
*/
if ( rtems_filesystem_current.mt_entry == mt_entry )
10bdac: 83 c4 10 add $0x10,%esp
10bdaf: a1 d0 85 12 00 mov 0x1285d0,%eax
10bdb4: 39 58 14 cmp %ebx,0x14(%eax)
10bdb7: 0f 84 cf 00 00 00 je 10be8c <unmount+0x128>
/*
* Verify there are no file systems below the path specified
*/
if ( rtems_filesystem_mount_iterate( is_fs_below_mount_point,
10bdbd: 83 ec 08 sub $0x8,%esp
10bdc0: ff 73 2c pushl 0x2c(%ebx)
10bdc3: 68 50 bd 10 00 push $0x10bd50
10bdc8: e8 ab d7 ff ff call 109578 <rtems_filesystem_mount_iterate>
10bdcd: 83 c4 10 add $0x10,%esp
10bdd0: 84 c0 test %al,%al
10bdd2: 0f 85 b4 00 00 00 jne 10be8c <unmount+0x128>
* Run the file descriptor table to determine if there are any file
* descriptors that are currently active and reference nodes in the
* file system that we are trying to unmount
*/
if ( rtems_libio_is_open_files_in_fs( mt_entry ) == 1 )
10bdd8: 83 ec 0c sub $0xc,%esp
10bddb: 53 push %ebx
10bddc: e8 2b d3 ff ff call 10910c <rtems_libio_is_open_files_in_fs>
10bde1: 83 c4 10 add $0x10,%esp
10bde4: 48 dec %eax
10bde5: 0f 84 a1 00 00 00 je 10be8c <unmount+0x128>
* Allow the file system being unmounted on to do its cleanup.
* If it fails it will set the errno to the approprate value
* and the fileystem will not be modified.
*/
if (( fs_mount_loc->ops->unmount_h )( mt_entry ) != 0 )
10bdeb: 83 ec 0c sub $0xc,%esp
10bdee: 8b 43 14 mov 0x14(%ebx),%eax
10bdf1: 53 push %ebx
10bdf2: ff 50 28 call *0x28(%eax)
10bdf5: 83 c4 10 add $0x10,%esp
10bdf8: 85 c0 test %eax,%eax
10bdfa: 74 10 je 10be0c <unmount+0xa8> <== ALWAYS TAKEN
*/
if ((fs_root_loc->ops->fsunmount_me_h )( mt_entry ) != 0){
if (( fs_mount_loc->ops->mount_h )( mt_entry ) != 0 )
rtems_fatal_error_occurred( 0 );
return -1;
10bdfc: b8 ff ff ff ff mov $0xffffffff,%eax
rtems_filesystem_freenode( fs_mount_loc );
free( mt_entry );
return 0;
}
10be01: 8d 65 f4 lea -0xc(%ebp),%esp
10be04: 5b pop %ebx
10be05: 5e pop %esi
10be06: 5f pop %edi
10be07: c9 leave
10be08: c3 ret
10be09: 8d 76 00 lea 0x0(%esi),%esi
* NOTE: Fatal error is called in a case which should never happen
* This was response was questionable but the best we could
* come up with.
*/
if ((fs_root_loc->ops->fsunmount_me_h )( mt_entry ) != 0){
10be0c: 83 ec 0c sub $0xc,%esp
10be0f: 8b 43 28 mov 0x28(%ebx),%eax
10be12: 53 push %ebx
10be13: ff 50 2c call *0x2c(%eax)
10be16: 83 c4 10 add $0x10,%esp
10be19: 85 c0 test %eax,%eax
10be1b: 0f 85 83 00 00 00 jne 10bea4 <unmount+0x140> <== NEVER TAKEN
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
10be21: 52 push %edx
10be22: 6a 00 push $0x0
10be24: 6a 00 push $0x0
10be26: ff 35 08 a9 12 00 pushl 0x12a908
10be2c: e8 77 0b 00 00 call 10c9a8 <rtems_semaphore_obtain>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
10be31: 89 1c 24 mov %ebx,(%esp)
10be34: e8 77 14 00 00 call 10d2b0 <_Chain_Extract>
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
10be39: 58 pop %eax
10be3a: ff 35 08 a9 12 00 pushl 0x12a908
10be40: e8 5f 0c 00 00 call 10caa4 <rtems_semaphore_release>
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x0, &loc, true ) )
return -1;
mt_entry = loc.mt_entry;
fs_mount_loc = &mt_entry->mt_point_node;
10be45: 8d 43 08 lea 0x8(%ebx),%eax
/*
* Free the memory node that was allocated in mount
* Free the memory associated with the extracted mount table entry.
*/
rtems_filesystem_freenode( fs_mount_loc );
10be48: 89 04 24 mov %eax,(%esp)
10be4b: e8 8c cf ff ff call 108ddc <rtems_filesystem_freenode>
free( mt_entry );
10be50: 89 1c 24 mov %ebx,(%esp)
10be53: e8 98 cf ff ff call 108df0 <free>
return 0;
10be58: 83 c4 10 add $0x10,%esp
10be5b: 31 c0 xor %eax,%eax
}
10be5d: 8d 65 f4 lea -0xc(%ebp),%esp
10be60: 5b pop %ebx
10be61: 5e pop %esi
10be62: 5f pop %edi
10be63: c9 leave
10be64: c3 ret
10be65: 8d 76 00 lea 0x0(%esi),%esi
/*
* Verify this is the root node for the file system to be unmounted.
*/
if ( fs_root_loc->node_access != loc.node_access ){
rtems_filesystem_freenode( &loc );
10be68: 83 ec 0c sub $0xc,%esp
10be6b: 56 push %esi
10be6c: e8 6b cf ff ff call 108ddc <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( EACCES );
10be71: e8 ee 84 00 00 call 114364 <__errno>
10be76: c7 00 0d 00 00 00 movl $0xd,(%eax)
10be7c: 83 c4 10 add $0x10,%esp
10be7f: b8 ff ff ff ff mov $0xffffffff,%eax
rtems_filesystem_freenode( fs_mount_loc );
free( mt_entry );
return 0;
}
10be84: 8d 65 f4 lea -0xc(%ebp),%esp
10be87: 5b pop %ebx
10be88: 5e pop %esi
10be89: 5f pop %edi
10be8a: c9 leave
10be8b: c3 ret
* descriptors that are currently active and reference nodes in the
* file system that we are trying to unmount
*/
if ( rtems_libio_is_open_files_in_fs( mt_entry ) == 1 )
rtems_set_errno_and_return_minus_one( EBUSY );
10be8c: e8 d3 84 00 00 call 114364 <__errno>
10be91: c7 00 10 00 00 00 movl $0x10,(%eax)
10be97: b8 ff ff ff ff mov $0xffffffff,%eax
rtems_filesystem_freenode( fs_mount_loc );
free( mt_entry );
return 0;
}
10be9c: 8d 65 f4 lea -0xc(%ebp),%esp
10be9f: 5b pop %ebx
10bea0: 5e pop %esi
10bea1: 5f pop %edi
10bea2: c9 leave
10bea3: c3 ret
* This was response was questionable but the best we could
* come up with.
*/
if ((fs_root_loc->ops->fsunmount_me_h )( mt_entry ) != 0){
if (( fs_mount_loc->ops->mount_h )( mt_entry ) != 0 )
10bea4: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10bea7: 8b 43 14 mov 0x14(%ebx),%eax <== NOT EXECUTED
10beaa: 53 push %ebx <== NOT EXECUTED
10beab: ff 50 20 call *0x20(%eax) <== NOT EXECUTED
10beae: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10beb1: 85 c0 test %eax,%eax <== NOT EXECUTED
10beb3: 0f 84 43 ff ff ff je 10bdfc <unmount+0x98> <== NOT EXECUTED
rtems_fatal_error_occurred( 0 );
10beb9: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10bebc: 6a 00 push $0x0 <== NOT EXECUTED
10bebe: e8 ed 10 00 00 call 10cfb0 <rtems_fatal_error_occurred><== NOT EXECUTED
0010bf0c <utime>:
int utime(
const char *path,
const struct utimbuf *times
)
{
10bf0c: 55 push %ebp
10bf0d: 89 e5 mov %esp,%ebp
10bf0f: 57 push %edi
10bf10: 56 push %esi
10bf11: 53 push %ebx
10bf12: 83 ec 48 sub $0x48,%esp
10bf15: 8b 55 08 mov 0x8(%ebp),%edx
10bf18: 8b 5d 0c mov 0xc(%ebp),%ebx
rtems_filesystem_location_info_t temp_loc;
int result;
struct utimbuf now;
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x00, &temp_loc, true ) )
10bf1b: 31 c0 xor %eax,%eax
10bf1d: b9 ff ff ff ff mov $0xffffffff,%ecx
10bf22: 89 d7 mov %edx,%edi
10bf24: f2 ae repnz scas %es:(%edi),%al
10bf26: f7 d1 not %ecx
10bf28: 49 dec %ecx
10bf29: 6a 01 push $0x1
10bf2b: 8d 75 d4 lea -0x2c(%ebp),%esi
10bf2e: 56 push %esi
10bf2f: 6a 00 push $0x0
10bf31: 51 push %ecx
10bf32: 52 push %edx
10bf33: e8 d0 ca ff ff call 108a08 <rtems_filesystem_evaluate_path>
10bf38: 83 c4 20 add $0x20,%esp
10bf3b: 85 c0 test %eax,%eax
10bf3d: 75 2d jne 10bf6c <utime+0x60>
return -1;
if ( times == NULL ) {
10bf3f: 85 db test %ebx,%ebx
10bf41: 74 39 je 10bf7c <utime+0x70>
10bf43: 8b 53 04 mov 0x4(%ebx),%edx
10bf46: 8b 03 mov (%ebx),%eax
now.actime = now.modtime = time( NULL );
times = &now;
}
result = (*temp_loc.ops->utime_h)( &temp_loc, times->actime, times->modtime );
10bf48: 51 push %ecx
10bf49: 52 push %edx
10bf4a: 50 push %eax
10bf4b: 56 push %esi
10bf4c: 8b 45 e0 mov -0x20(%ebp),%eax
10bf4f: ff 50 30 call *0x30(%eax)
rtems_filesystem_freenode( &temp_loc );
10bf52: 89 34 24 mov %esi,(%esp)
10bf55: 89 45 c4 mov %eax,-0x3c(%ebp)
10bf58: e8 9b ce ff ff call 108df8 <rtems_filesystem_freenode>
return result;
10bf5d: 83 c4 10 add $0x10,%esp
10bf60: 8b 45 c4 mov -0x3c(%ebp),%eax
}
10bf63: 8d 65 f4 lea -0xc(%ebp),%esp
10bf66: 5b pop %ebx
10bf67: 5e pop %esi
10bf68: 5f pop %edi
10bf69: c9 leave
10bf6a: c3 ret
10bf6b: 90 nop
rtems_filesystem_location_info_t temp_loc;
int result;
struct utimbuf now;
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x00, &temp_loc, true ) )
return -1;
10bf6c: b8 ff ff ff ff mov $0xffffffff,%eax
result = (*temp_loc.ops->utime_h)( &temp_loc, times->actime, times->modtime );
rtems_filesystem_freenode( &temp_loc );
return result;
}
10bf71: 8d 65 f4 lea -0xc(%ebp),%esp
10bf74: 5b pop %ebx
10bf75: 5e pop %esi
10bf76: 5f pop %edi
10bf77: c9 leave
10bf78: c3 ret
10bf79: 8d 76 00 lea 0x0(%esi),%esi
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x00, &temp_loc, true ) )
return -1;
if ( times == NULL ) {
now.actime = now.modtime = time( NULL );
10bf7c: 83 ec 0c sub $0xc,%esp
10bf7f: 6a 00 push $0x0
10bf81: e8 72 cd 00 00 call 118cf8 <time>
10bf86: 83 c4 10 add $0x10,%esp
10bf89: 89 c2 mov %eax,%edx
10bf8b: eb bb jmp 10bf48 <utime+0x3c>
0010bf90 <utimes>:
int utimes(
const char *path,
const struct timeval times[2]
)
{
10bf90: 55 push %ebp
10bf91: 89 e5 mov %esp,%ebp
10bf93: 83 ec 18 sub $0x18,%esp
10bf96: 8b 55 08 mov 0x8(%ebp),%edx
10bf99: 8b 45 0c mov 0xc(%ebp),%eax
struct utimbuf timeinsecs;
if ( times == NULL )
10bf9c: 85 c0 test %eax,%eax
10bf9e: 74 20 je 10bfc0 <utimes+0x30>
return utime( path, NULL );
timeinsecs.actime = (time_t) times[0].tv_sec;
10bfa0: 8b 08 mov (%eax),%ecx
10bfa2: 89 4d f0 mov %ecx,-0x10(%ebp)
timeinsecs.modtime = (time_t) times[1].tv_sec;
10bfa5: 8b 40 08 mov 0x8(%eax),%eax
10bfa8: 89 45 f4 mov %eax,-0xc(%ebp)
return utime( path, &timeinsecs );
10bfab: 83 ec 08 sub $0x8,%esp
10bfae: 8d 45 f0 lea -0x10(%ebp),%eax
10bfb1: 50 push %eax
10bfb2: 52 push %edx
10bfb3: e8 54 ff ff ff call 10bf0c <utime>
10bfb8: 83 c4 10 add $0x10,%esp
}
10bfbb: c9 leave
10bfbc: c3 ret
10bfbd: 8d 76 00 lea 0x0(%esi),%esi
)
{
struct utimbuf timeinsecs;
if ( times == NULL )
return utime( path, NULL );
10bfc0: 83 ec 08 sub $0x8,%esp
10bfc3: 6a 00 push $0x0
10bfc5: 52 push %edx
10bfc6: e8 41 ff ff ff call 10bf0c <utime>
10bfcb: 83 c4 10 add $0x10,%esp
timeinsecs.actime = (time_t) times[0].tv_sec;
timeinsecs.modtime = (time_t) times[1].tv_sec;
return utime( path, &timeinsecs );
}
10bfce: c9 leave
10bfcf: c3 ret
0010abcc <vprintk>:
*/
void vprintk(
const char *fmt,
va_list ap
)
{
10abcc: 55 push %ebp
10abcd: 89 e5 mov %esp,%ebp
10abcf: 57 push %edi
10abd0: 56 push %esi
10abd1: 53 push %ebx
10abd2: 83 ec 4c sub $0x4c,%esp
10abd5: 8b 75 08 mov 0x8(%ebp),%esi
for (; *fmt != '\0'; fmt++) {
10abd8: 8a 06 mov (%esi),%al
10abda: 84 c0 test %al,%al
10abdc: 75 21 jne 10abff <vprintk+0x33>
10abde: e9 c4 01 00 00 jmp 10ada7 <vprintk+0x1db>
10abe3: 90 nop
bool sign = false;
char lead = ' ';
char c;
if (*fmt != '%') {
BSP_output_char(*fmt);
10abe4: 83 ec 0c sub $0xc,%esp
10abe7: 0f be c0 movsbl %al,%eax
10abea: 50 push %eax
10abeb: ff 15 88 3b 12 00 call *0x123b88
continue;
10abf1: 83 c4 10 add $0x10,%esp
void vprintk(
const char *fmt,
va_list ap
)
{
for (; *fmt != '\0'; fmt++) {
10abf4: 46 inc %esi
10abf5: 8a 06 mov (%esi),%al
10abf7: 84 c0 test %al,%al
10abf9: 0f 84 a8 01 00 00 je 10ada7 <vprintk+0x1db>
bool minus = false;
bool sign = false;
char lead = ' ';
char c;
if (*fmt != '%') {
10abff: 3c 25 cmp $0x25,%al
10ac01: 75 e1 jne 10abe4 <vprintk+0x18>
BSP_output_char(*fmt);
continue;
}
fmt++;
10ac03: 46 inc %esi
if (*fmt == '0' ) {
10ac04: 8a 06 mov (%esi),%al
10ac06: 3c 30 cmp $0x30,%al
10ac08: 0f 84 fe 01 00 00 je 10ae0c <vprintk+0x240>
unsigned base = 0;
unsigned width = 0;
bool lflag = false;
bool minus = false;
bool sign = false;
char lead = ' ';
10ac0e: b1 20 mov $0x20,%cl
fmt++;
if (*fmt == '0' ) {
lead = '0';
fmt++;
}
if (*fmt == '-' ) {
10ac10: 3c 2d cmp $0x2d,%al
10ac12: 0f 84 d8 01 00 00 je 10adf0 <vprintk+0x224>
{
for (; *fmt != '\0'; fmt++) {
unsigned base = 0;
unsigned width = 0;
bool lflag = false;
bool minus = false;
10ac18: 31 ff xor %edi,%edi
}
if (*fmt == '-' ) {
minus = true;
fmt++;
}
while (*fmt >= '0' && *fmt <= '9' ) {
10ac1a: 8d 50 d0 lea -0x30(%eax),%edx
10ac1d: 80 fa 09 cmp $0x9,%dl
10ac20: 0f 87 de 01 00 00 ja 10ae04 <vprintk+0x238>
10ac26: 31 db xor %ebx,%ebx
width *= 10;
10ac28: 8d 14 9b lea (%ebx,%ebx,4),%edx
width += ((unsigned) *fmt - '0');
10ac2b: 0f be c0 movsbl %al,%eax
10ac2e: 8d 5c 50 d0 lea -0x30(%eax,%edx,2),%ebx
fmt++;
10ac32: 46 inc %esi
}
if (*fmt == '-' ) {
minus = true;
fmt++;
}
while (*fmt >= '0' && *fmt <= '9' ) {
10ac33: 8a 06 mov (%esi),%al
10ac35: 8d 50 d0 lea -0x30(%eax),%edx
10ac38: 80 fa 09 cmp $0x9,%dl
10ac3b: 76 eb jbe 10ac28 <vprintk+0x5c>
width *= 10;
width += ((unsigned) *fmt - '0');
fmt++;
}
if ((c = *fmt) == 'l') {
10ac3d: 3c 6c cmp $0x6c,%al
10ac3f: 0f 84 7b 01 00 00 je 10adc0 <vprintk+0x1f4>
10ac45: 88 c2 mov %al,%dl
lflag = true;
c = *++fmt;
}
if ( c == 'c' ) {
10ac47: 80 fa 63 cmp $0x63,%dl
10ac4a: 0f 84 7c 01 00 00 je 10adcc <vprintk+0x200>
/* need a cast here since va_arg() only takes fully promoted types */
char chr = (char) va_arg(ap, int);
BSP_output_char(chr);
continue;
}
if ( c == 's' ) {
10ac50: 80 fa 73 cmp $0x73,%dl
10ac53: 0f 84 bf 01 00 00 je 10ae18 <vprintk+0x24c>
continue;
}
/* must be a numeric format or something unsupported */
if ( c == 'o' || c == 'O' ) {
10ac59: 80 fa 6f cmp $0x6f,%dl
10ac5c: 0f 84 4e 01 00 00 je 10adb0 <vprintk+0x1e4>
10ac62: 80 fa 4f cmp $0x4f,%dl
10ac65: 0f 84 45 01 00 00 je 10adb0 <vprintk+0x1e4>
base = 8; sign = false;
} else if ( c == 'i' || c == 'I' ||
10ac6b: 80 fa 69 cmp $0x69,%dl
10ac6e: 74 54 je 10acc4 <vprintk+0xf8>
10ac70: 80 fa 49 cmp $0x49,%dl
10ac73: 74 4f je 10acc4 <vprintk+0xf8>
10ac75: 80 fa 64 cmp $0x64,%dl
10ac78: 74 4a je 10acc4 <vprintk+0xf8>
c == 'd' || c == 'D' ) {
10ac7a: 80 fa 44 cmp $0x44,%dl
10ac7d: 74 45 je 10acc4 <vprintk+0xf8>
base = 10; sign = true;
} else if ( c == 'u' || c == 'U' ) {
10ac7f: 80 fa 75 cmp $0x75,%dl
10ac82: 0f 84 85 02 00 00 je 10af0d <vprintk+0x341>
10ac88: 80 fa 55 cmp $0x55,%dl
10ac8b: 0f 84 7c 02 00 00 je 10af0d <vprintk+0x341> <== NEVER TAKEN
base = 10; sign = false;
} else if ( c == 'x' || c == 'X' ) {
10ac91: 80 fa 78 cmp $0x78,%dl
10ac94: 0f 84 bd 02 00 00 je 10af57 <vprintk+0x38b>
10ac9a: 80 fa 58 cmp $0x58,%dl
10ac9d: 0f 84 b4 02 00 00 je 10af57 <vprintk+0x38b> <== NEVER TAKEN
base = 16; sign = false;
} else if ( c == 'p' ) {
10aca3: 80 fa 70 cmp $0x70,%dl
10aca6: 0f 84 d3 02 00 00 je 10af7f <vprintk+0x3b3>
base = 16; sign = false; lflag = true;
} else {
BSP_output_char(c);
10acac: 83 ec 0c sub $0xc,%esp
10acaf: 0f be d2 movsbl %dl,%edx
10acb2: 52 push %edx
10acb3: ff 15 88 3b 12 00 call *0x123b88
continue;
10acb9: 83 c4 10 add $0x10,%esp
10acbc: e9 33 ff ff ff jmp 10abf4 <vprintk+0x28>
10acc1: 8d 76 00 lea 0x0(%esi),%esi
/* must be a numeric format or something unsupported */
if ( c == 'o' || c == 'O' ) {
base = 8; sign = false;
} else if ( c == 'i' || c == 'I' ||
c == 'd' || c == 'D' ) {
base = 10; sign = true;
10acc4: b2 01 mov $0x1,%dl
10acc6: c7 45 c0 0a 00 00 00 movl $0xa,-0x40(%ebp)
} else {
BSP_output_char(c);
continue;
}
printNum(
10accd: 0f be c9 movsbl %cl,%ecx
10acd0: 89 4d b4 mov %ecx,-0x4c(%ebp)
10acd3: 8b 45 0c mov 0xc(%ebp),%eax
10acd6: 8b 38 mov (%eax),%edi
lflag ? va_arg(ap, long) : (long) va_arg(ap, int),
10acd8: 83 c0 04 add $0x4,%eax
10acdb: 89 45 0c mov %eax,0xc(%ebp)
unsigned long unsigned_num;
unsigned long n;
unsigned count;
char toPrint[20];
if ( sign && (num < 0) ) {
10acde: 84 d2 test %dl,%dl
10ace0: 74 08 je 10acea <vprintk+0x11e>
10ace2: 85 ff test %edi,%edi
10ace4: 0f 88 31 02 00 00 js 10af1b <vprintk+0x34f> <== NEVER TAKEN
BSP_output_char('-');
unsigned_num = (unsigned long) -num;
if (maxwidth) maxwidth--;
} else {
unsigned_num = (unsigned long) num;
10acea: 89 7d b8 mov %edi,-0x48(%ebp)
}
count = 0;
while ((n = unsigned_num / base) > 0) {
10aced: 8b 45 b8 mov -0x48(%ebp),%eax
10acf0: 31 d2 xor %edx,%edx
10acf2: f7 75 c0 divl -0x40(%ebp)
10acf5: 89 c1 mov %eax,%ecx
10acf7: 85 c0 test %eax,%eax
10acf9: 0f 84 47 02 00 00 je 10af46 <vprintk+0x37a>
10acff: 8a 55 c0 mov -0x40(%ebp),%dl
10ad02: 88 55 c4 mov %dl,-0x3c(%ebp)
if (maxwidth) maxwidth--;
} else {
unsigned_num = (unsigned long) num;
}
count = 0;
10ad05: 31 ff xor %edi,%edi
10ad07: 89 5d b0 mov %ebx,-0x50(%ebp)
10ad0a: 8b 5d c0 mov -0x40(%ebp),%ebx
10ad0d: 8b 55 b8 mov -0x48(%ebp),%edx
10ad10: eb 06 jmp 10ad18 <vprintk+0x14c>
10ad12: 66 90 xchg %ax,%ax
while ((n = unsigned_num / base) > 0) {
10ad14: 89 ca mov %ecx,%edx
10ad16: 89 c1 mov %eax,%ecx
toPrint[count++] = (char) (unsigned_num - (n * base));
10ad18: 8a 45 c4 mov -0x3c(%ebp),%al
10ad1b: f6 e1 mul %cl
10ad1d: 28 c2 sub %al,%dl
10ad1f: 88 54 3d d4 mov %dl,-0x2c(%ebp,%edi,1)
10ad23: 47 inc %edi
} else {
unsigned_num = (unsigned long) num;
}
count = 0;
while ((n = unsigned_num / base) > 0) {
10ad24: 89 c8 mov %ecx,%eax
10ad26: 31 d2 xor %edx,%edx
10ad28: f7 f3 div %ebx
10ad2a: 85 c0 test %eax,%eax
10ad2c: 75 e6 jne 10ad14 <vprintk+0x148>
10ad2e: 8b 5d b0 mov -0x50(%ebp),%ebx
10ad31: 8d 47 01 lea 0x1(%edi),%eax
10ad34: 89 45 c4 mov %eax,-0x3c(%ebp)
toPrint[count++] = (char) (unsigned_num - (n * base));
unsigned_num = n;
}
toPrint[count++] = (char) unsigned_num;
10ad37: 88 4c 3d d4 mov %cl,-0x2c(%ebp,%edi,1)
for (n=maxwidth ; n > count; n-- )
10ad3b: 3b 5d c4 cmp -0x3c(%ebp),%ebx
10ad3e: 76 21 jbe 10ad61 <vprintk+0x195>
10ad40: 8b 7d b4 mov -0x4c(%ebp),%edi
10ad43: 89 75 c0 mov %esi,-0x40(%ebp)
10ad46: 8b 75 c4 mov -0x3c(%ebp),%esi
10ad49: 8d 76 00 lea 0x0(%esi),%esi
BSP_output_char(lead);
10ad4c: 83 ec 0c sub $0xc,%esp
10ad4f: 57 push %edi
10ad50: ff 15 88 3b 12 00 call *0x123b88
toPrint[count++] = (char) (unsigned_num - (n * base));
unsigned_num = n;
}
toPrint[count++] = (char) unsigned_num;
for (n=maxwidth ; n > count; n-- )
10ad56: 4b dec %ebx
10ad57: 83 c4 10 add $0x10,%esp
10ad5a: 39 f3 cmp %esi,%ebx
10ad5c: 77 ee ja 10ad4c <vprintk+0x180>
10ad5e: 8b 75 c0 mov -0x40(%ebp),%esi
BSP_output_char(lead);
for (n = 0; n < count; n++) {
10ad61: 8b 45 c4 mov -0x3c(%ebp),%eax
10ad64: 85 c0 test %eax,%eax
10ad66: 0f 84 88 fe ff ff je 10abf4 <vprintk+0x28> <== NEVER TAKEN
* console is not yet initialized or in ISR's.
*
* Arguments:
* as in printf: fmt - format string, ... - unnamed arguments.
*/
void vprintk(
10ad6c: 8b 55 c4 mov -0x3c(%ebp),%edx
10ad6f: 8d 7c 15 d3 lea -0x2d(%ebp,%edx,1),%edi
10ad73: 31 db xor %ebx,%ebx
10ad75: 89 75 c0 mov %esi,-0x40(%ebp)
10ad78: 89 d6 mov %edx,%esi
10ad7a: 66 90 xchg %ax,%ax
for (n=maxwidth ; n > count; n-- )
BSP_output_char(lead);
for (n = 0; n < count; n++) {
BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]);
10ad7c: 83 ec 0c sub $0xc,%esp
10ad7f: 0f be 07 movsbl (%edi),%eax
10ad82: 0f be 80 ca 14 12 00 movsbl 0x1214ca(%eax),%eax
10ad89: 50 push %eax
10ad8a: ff 15 88 3b 12 00 call *0x123b88
toPrint[count++] = (char) unsigned_num;
for (n=maxwidth ; n > count; n-- )
BSP_output_char(lead);
for (n = 0; n < count; n++) {
10ad90: 43 inc %ebx
10ad91: 4f dec %edi
10ad92: 83 c4 10 add $0x10,%esp
10ad95: 39 f3 cmp %esi,%ebx
10ad97: 72 e3 jb 10ad7c <vprintk+0x1b0>
10ad99: 8b 75 c0 mov -0x40(%ebp),%esi
void vprintk(
const char *fmt,
va_list ap
)
{
for (; *fmt != '\0'; fmt++) {
10ad9c: 46 inc %esi
10ad9d: 8a 06 mov (%esi),%al
10ad9f: 84 c0 test %al,%al
10ada1: 0f 85 58 fe ff ff jne 10abff <vprintk+0x33> <== ALWAYS TAKEN
sign,
width,
lead
);
}
}
10ada7: 8d 65 f4 lea -0xc(%ebp),%esp
10adaa: 5b pop %ebx
10adab: 5e pop %esi
10adac: 5f pop %edi
10adad: c9 leave
10adae: c3 ret
10adaf: 90 nop
continue;
}
/* must be a numeric format or something unsupported */
if ( c == 'o' || c == 'O' ) {
base = 8; sign = false;
10adb0: 31 d2 xor %edx,%edx
10adb2: c7 45 c0 08 00 00 00 movl $0x8,-0x40(%ebp)
10adb9: e9 0f ff ff ff jmp 10accd <vprintk+0x101>
10adbe: 66 90 xchg %ax,%ax
fmt++;
}
if ((c = *fmt) == 'l') {
lflag = true;
c = *++fmt;
10adc0: 46 inc %esi
10adc1: 8a 16 mov (%esi),%dl
}
if ( c == 'c' ) {
10adc3: 80 fa 63 cmp $0x63,%dl
10adc6: 0f 85 84 fe ff ff jne 10ac50 <vprintk+0x84> <== ALWAYS TAKEN
/* need a cast here since va_arg() only takes fully promoted types */
char chr = (char) va_arg(ap, int);
10adcc: 8b 5d 0c mov 0xc(%ebp),%ebx
10adcf: 83 c3 04 add $0x4,%ebx
BSP_output_char(chr);
10add2: 83 ec 0c sub $0xc,%esp
10add5: 8b 55 0c mov 0xc(%ebp),%edx
10add8: 0f be 02 movsbl (%edx),%eax
10addb: 50 push %eax
10addc: ff 15 88 3b 12 00 call *0x123b88
continue;
10ade2: 83 c4 10 add $0x10,%esp
lflag = true;
c = *++fmt;
}
if ( c == 'c' ) {
/* need a cast here since va_arg() only takes fully promoted types */
char chr = (char) va_arg(ap, int);
10ade5: 89 5d 0c mov %ebx,0xc(%ebp)
BSP_output_char(chr);
continue;
10ade8: e9 07 fe ff ff jmp 10abf4 <vprintk+0x28>
10aded: 8d 76 00 lea 0x0(%esi),%esi
lead = '0';
fmt++;
}
if (*fmt == '-' ) {
minus = true;
fmt++;
10adf0: 46 inc %esi
10adf1: 8a 06 mov (%esi),%al
if (*fmt == '0' ) {
lead = '0';
fmt++;
}
if (*fmt == '-' ) {
minus = true;
10adf3: bf 01 00 00 00 mov $0x1,%edi
fmt++;
}
while (*fmt >= '0' && *fmt <= '9' ) {
10adf8: 8d 50 d0 lea -0x30(%eax),%edx
10adfb: 80 fa 09 cmp $0x9,%dl
10adfe: 0f 86 22 fe ff ff jbe 10ac26 <vprintk+0x5a> <== ALWAYS TAKEN
10ae04: 31 db xor %ebx,%ebx
10ae06: e9 32 fe ff ff jmp 10ac3d <vprintk+0x71>
10ae0b: 90 nop
continue;
}
fmt++;
if (*fmt == '0' ) {
lead = '0';
fmt++;
10ae0c: 46 inc %esi
10ae0d: 8a 06 mov (%esi),%al
BSP_output_char(*fmt);
continue;
}
fmt++;
if (*fmt == '0' ) {
lead = '0';
10ae0f: b1 30 mov $0x30,%cl
10ae11: e9 fa fd ff ff jmp 10ac10 <vprintk+0x44>
10ae16: 66 90 xchg %ax,%ax
}
if ( c == 's' ) {
unsigned i, len;
char *s, *str;
str = va_arg(ap, char *);
10ae18: 8b 45 0c mov 0xc(%ebp),%eax
10ae1b: 83 c0 04 add $0x4,%eax
10ae1e: 89 45 c0 mov %eax,-0x40(%ebp)
10ae21: 8b 55 0c mov 0xc(%ebp),%edx
10ae24: 8b 02 mov (%edx),%eax
if ( str == NULL ) {
10ae26: 85 c0 test %eax,%eax
10ae28: 0f 84 37 01 00 00 je 10af65 <vprintk+0x399>
str = "";
}
/* calculate length of string */
for ( len=0, s=str ; *s ; len++, s++ )
10ae2e: 80 38 00 cmpb $0x0,(%eax)
10ae31: 0f 84 3c 01 00 00 je 10af73 <vprintk+0x3a7>
10ae37: c7 45 c4 00 00 00 00 movl $0x0,-0x3c(%ebp)
10ae3e: 31 d2 xor %edx,%edx
10ae40: 42 inc %edx
10ae41: 80 3c 10 00 cmpb $0x0,(%eax,%edx,1)
10ae45: 75 f9 jne 10ae40 <vprintk+0x274>
10ae47: 89 55 c4 mov %edx,-0x3c(%ebp)
;
/* leading spaces */
if ( !minus )
10ae4a: 89 fa mov %edi,%edx
10ae4c: 84 d2 test %dl,%dl
10ae4e: 75 32 jne 10ae82 <vprintk+0x2b6>
for ( i=len ; i<width ; i++ )
10ae50: 39 5d c4 cmp %ebx,-0x3c(%ebp)
10ae53: 73 2d jae 10ae82 <vprintk+0x2b6>
10ae55: 8b 4d c4 mov -0x3c(%ebp),%ecx
10ae58: 88 55 bc mov %dl,-0x44(%ebp)
10ae5b: 89 c7 mov %eax,%edi
10ae5d: 89 75 b8 mov %esi,-0x48(%ebp)
10ae60: 89 de mov %ebx,%esi
10ae62: 89 cb mov %ecx,%ebx
BSP_output_char(' ');
10ae64: 83 ec 0c sub $0xc,%esp
10ae67: 6a 20 push $0x20
10ae69: ff 15 88 3b 12 00 call *0x123b88
for ( len=0, s=str ; *s ; len++, s++ )
;
/* leading spaces */
if ( !minus )
for ( i=len ; i<width ; i++ )
10ae6f: 43 inc %ebx
10ae70: 83 c4 10 add $0x10,%esp
10ae73: 39 f3 cmp %esi,%ebx
10ae75: 72 ed jb 10ae64 <vprintk+0x298>
10ae77: 89 f8 mov %edi,%eax
10ae79: 89 f3 mov %esi,%ebx
10ae7b: 0f b6 7d bc movzbl -0x44(%ebp),%edi
10ae7f: 8b 75 b8 mov -0x48(%ebp),%esi
BSP_output_char(' ');
/* no width option */
if (width == 0) {
10ae82: 85 db test %ebx,%ebx
10ae84: 75 0a jne 10ae90 <vprintk+0x2c4>
width = len;
}
/* output the string */
for ( i=0 ; i<width && *str ; str++ )
10ae86: 8b 55 c4 mov -0x3c(%ebp),%edx
10ae89: 85 d2 test %edx,%edx
10ae8b: 74 47 je 10aed4 <vprintk+0x308>
10ae8d: 8b 5d c4 mov -0x3c(%ebp),%ebx
10ae90: 8a 10 mov (%eax),%dl
10ae92: 84 d2 test %dl,%dl
10ae94: 74 3e je 10aed4 <vprintk+0x308> <== NEVER TAKEN
BSP_output_char(*str);
10ae96: 83 ec 0c sub $0xc,%esp
10ae99: 0f be d2 movsbl %dl,%edx
10ae9c: 52 push %edx
10ae9d: 89 45 ac mov %eax,-0x54(%ebp)
10aea0: ff 15 88 3b 12 00 call *0x123b88
if (width == 0) {
width = len;
}
/* output the string */
for ( i=0 ; i<width && *str ; str++ )
10aea6: 8b 45 ac mov -0x54(%ebp),%eax
10aea9: 40 inc %eax
10aeaa: 83 c4 10 add $0x10,%esp
10aead: 89 75 bc mov %esi,-0x44(%ebp)
10aeb0: 89 de mov %ebx,%esi
10aeb2: 89 c3 mov %eax,%ebx
10aeb4: eb 13 jmp 10aec9 <vprintk+0x2fd>
10aeb6: 66 90 xchg %ax,%ax
BSP_output_char(*str);
10aeb8: 83 ec 0c sub $0xc,%esp
10aebb: 0f be d2 movsbl %dl,%edx
10aebe: 52 push %edx
10aebf: ff 15 88 3b 12 00 call *0x123b88
if (width == 0) {
width = len;
}
/* output the string */
for ( i=0 ; i<width && *str ; str++ )
10aec5: 43 inc %ebx
10aec6: 83 c4 10 add $0x10,%esp
10aec9: 8a 13 mov (%ebx),%dl
10aecb: 84 d2 test %dl,%dl
10aecd: 75 e9 jne 10aeb8 <vprintk+0x2ec>
10aecf: 89 f3 mov %esi,%ebx
10aed1: 8b 75 bc mov -0x44(%ebp),%esi
BSP_output_char(*str);
/* trailing spaces */
if ( minus )
10aed4: 89 f8 mov %edi,%eax
10aed6: 84 c0 test %al,%al
10aed8: 74 28 je 10af02 <vprintk+0x336>
for ( i=len ; i<width ; i++ )
10aeda: 39 5d c4 cmp %ebx,-0x3c(%ebp)
10aedd: 73 18 jae 10aef7 <vprintk+0x32b>
10aedf: 8b 7d c4 mov -0x3c(%ebp),%edi
10aee2: 66 90 xchg %ax,%ax
BSP_output_char(' ');
10aee4: 83 ec 0c sub $0xc,%esp
10aee7: 6a 20 push $0x20
10aee9: ff 15 88 3b 12 00 call *0x123b88
for ( i=0 ; i<width && *str ; str++ )
BSP_output_char(*str);
/* trailing spaces */
if ( minus )
for ( i=len ; i<width ; i++ )
10aeef: 47 inc %edi
10aef0: 83 c4 10 add $0x10,%esp
10aef3: 39 df cmp %ebx,%edi
10aef5: 72 ed jb 10aee4 <vprintk+0x318>
}
if ( c == 's' ) {
unsigned i, len;
char *s, *str;
str = va_arg(ap, char *);
10aef7: 8b 55 c0 mov -0x40(%ebp),%edx
10aefa: 89 55 0c mov %edx,0xc(%ebp)
10aefd: e9 f2 fc ff ff jmp 10abf4 <vprintk+0x28>
10af02: 8b 45 c0 mov -0x40(%ebp),%eax
10af05: 89 45 0c mov %eax,0xc(%ebp)
10af08: e9 e7 fc ff ff jmp 10abf4 <vprintk+0x28>
base = 8; sign = false;
} else if ( c == 'i' || c == 'I' ||
c == 'd' || c == 'D' ) {
base = 10; sign = true;
} else if ( c == 'u' || c == 'U' ) {
base = 10; sign = false;
10af0d: 31 d2 xor %edx,%edx
10af0f: c7 45 c0 0a 00 00 00 movl $0xa,-0x40(%ebp)
10af16: e9 b2 fd ff ff jmp 10accd <vprintk+0x101>
unsigned long n;
unsigned count;
char toPrint[20];
if ( sign && (num < 0) ) {
BSP_output_char('-');
10af1b: 83 ec 0c sub $0xc,%esp
10af1e: 6a 2d push $0x2d
10af20: ff 15 88 3b 12 00 call *0x123b88
unsigned_num = (unsigned long) -num;
10af26: f7 df neg %edi
10af28: 89 7d b8 mov %edi,-0x48(%ebp)
if (maxwidth) maxwidth--;
10af2b: 83 c4 10 add $0x10,%esp
10af2e: 83 fb 01 cmp $0x1,%ebx
10af31: 83 d3 ff adc $0xffffffff,%ebx
} else {
unsigned_num = (unsigned long) num;
}
count = 0;
while ((n = unsigned_num / base) > 0) {
10af34: 8b 45 b8 mov -0x48(%ebp),%eax
10af37: 31 d2 xor %edx,%edx
10af39: f7 75 c0 divl -0x40(%ebp)
10af3c: 89 c1 mov %eax,%ecx
10af3e: 85 c0 test %eax,%eax
10af40: 0f 85 b9 fd ff ff jne 10acff <vprintk+0x133>
10af46: 8b 4d b8 mov -0x48(%ebp),%ecx
10af49: c7 45 c4 01 00 00 00 movl $0x1,-0x3c(%ebp)
if (maxwidth) maxwidth--;
} else {
unsigned_num = (unsigned long) num;
}
count = 0;
10af50: 31 ff xor %edi,%edi
10af52: e9 e0 fd ff ff jmp 10ad37 <vprintk+0x16b>
c == 'd' || c == 'D' ) {
base = 10; sign = true;
} else if ( c == 'u' || c == 'U' ) {
base = 10; sign = false;
} else if ( c == 'x' || c == 'X' ) {
base = 16; sign = false;
10af57: 31 d2 xor %edx,%edx
10af59: c7 45 c0 10 00 00 00 movl $0x10,-0x40(%ebp)
10af60: e9 68 fd ff ff jmp 10accd <vprintk+0x101>
char *s, *str;
str = va_arg(ap, char *);
if ( str == NULL ) {
str = "";
10af65: b8 c9 14 12 00 mov $0x1214c9,%eax
}
/* calculate length of string */
for ( len=0, s=str ; *s ; len++, s++ )
10af6a: 80 38 00 cmpb $0x0,(%eax)
10af6d: 0f 85 c4 fe ff ff jne 10ae37 <vprintk+0x26b> <== NEVER TAKEN
10af73: c7 45 c4 00 00 00 00 movl $0x0,-0x3c(%ebp)
10af7a: e9 cb fe ff ff jmp 10ae4a <vprintk+0x27e>
} else {
BSP_output_char(c);
continue;
}
printNum(
10af7f: 0f be c9 movsbl %cl,%ecx
10af82: 89 4d b4 mov %ecx,-0x4c(%ebp)
} else if ( c == 'u' || c == 'U' ) {
base = 10; sign = false;
} else if ( c == 'x' || c == 'X' ) {
base = 16; sign = false;
} else if ( c == 'p' ) {
base = 16; sign = false; lflag = true;
10af85: 31 d2 xor %edx,%edx
10af87: c7 45 c0 10 00 00 00 movl $0x10,-0x40(%ebp)
10af8e: e9 40 fd ff ff jmp 10acd3 <vprintk+0x107>
0011f4c8 <write>:
ssize_t write(
int fd,
const void *buffer,
size_t count
)
{
11f4c8: 55 push %ebp
11f4c9: 89 e5 mov %esp,%ebp
11f4cb: 53 push %ebx
11f4cc: 83 ec 04 sub $0x4,%esp
11f4cf: 8b 4d 08 mov 0x8(%ebp),%ecx
11f4d2: 8b 45 0c mov 0xc(%ebp),%eax
11f4d5: 8b 55 10 mov 0x10(%ebp),%edx
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
11f4d8: 3b 0d 2c 3a 12 00 cmp 0x123a2c,%ecx
11f4de: 73 50 jae 11f530 <write+0x68>
iop = rtems_libio_iop( fd );
11f4e0: c1 e1 03 shl $0x3,%ecx
11f4e3: 8d 1c cd 00 00 00 00 lea 0x0(,%ecx,8),%ebx
11f4ea: 29 cb sub %ecx,%ebx
11f4ec: 03 1d c0 7c 12 00 add 0x127cc0,%ebx
rtems_libio_check_is_open( iop );
11f4f2: 8b 4b 14 mov 0x14(%ebx),%ecx
11f4f5: f6 c5 01 test $0x1,%ch
11f4f8: 74 36 je 11f530 <write+0x68>
rtems_libio_check_buffer( buffer );
11f4fa: 85 c0 test %eax,%eax
11f4fc: 74 46 je 11f544 <write+0x7c> <== NEVER TAKEN
rtems_libio_check_count( count );
11f4fe: 85 d2 test %edx,%edx
11f500: 74 26 je 11f528 <write+0x60>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
11f502: 83 e1 04 and $0x4,%ecx
11f505: 74 3d je 11f544 <write+0x7c>
/*
* Now process the write() request.
*/
rc = (*iop->pathinfo.handlers->write_h)( iop, buffer, count );
11f507: 51 push %ecx
11f508: 8b 4b 20 mov 0x20(%ebx),%ecx
11f50b: 52 push %edx
11f50c: 50 push %eax
11f50d: 53 push %ebx
11f50e: ff 51 0c call *0xc(%ecx)
if ( rc > 0 )
11f511: 83 c4 10 add $0x10,%esp
11f514: 85 c0 test %eax,%eax
11f516: 7e 0b jle 11f523 <write+0x5b>
iop->offset += rc;
11f518: 89 c1 mov %eax,%ecx
11f51a: c1 f9 1f sar $0x1f,%ecx
11f51d: 01 43 0c add %eax,0xc(%ebx)
11f520: 11 4b 10 adc %ecx,0x10(%ebx)
return rc;
}
11f523: 8b 5d fc mov -0x4(%ebp),%ebx
11f526: c9 leave
11f527: c3 ret
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open( iop );
rtems_libio_check_buffer( buffer );
rtems_libio_check_count( count );
11f528: 31 c0 xor %eax,%eax
if ( rc > 0 )
iop->offset += rc;
return rc;
}
11f52a: 8b 5d fc mov -0x4(%ebp),%ebx
11f52d: c9 leave
11f52e: c3 ret
11f52f: 90 nop
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open( iop );
11f530: e8 df 3d ff ff call 113314 <__errno>
11f535: c7 00 09 00 00 00 movl $0x9,(%eax)
11f53b: b8 ff ff ff ff mov $0xffffffff,%eax
11f540: eb e1 jmp 11f523 <write+0x5b>
11f542: 66 90 xchg %ax,%ax
rtems_libio_check_buffer( buffer );
rtems_libio_check_count( count );
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
11f544: e8 cb 3d ff ff call 113314 <__errno>
11f549: c7 00 16 00 00 00 movl $0x16,(%eax)
11f54f: b8 ff ff ff ff mov $0xffffffff,%eax
11f554: eb cd jmp 11f523 <write+0x5b>
0010bfbc <writev>:
ssize_t writev(
int fd,
const struct iovec *iov,
int iovcnt
)
{
10bfbc: 55 push %ebp
10bfbd: 89 e5 mov %esp,%ebp
10bfbf: 57 push %edi
10bfc0: 56 push %esi
10bfc1: 53 push %ebx
10bfc2: 83 ec 3c sub $0x3c,%esp
10bfc5: 8b 45 08 mov 0x8(%ebp),%eax
10bfc8: 8b 5d 0c mov 0xc(%ebp),%ebx
10bfcb: 8b 7d 10 mov 0x10(%ebp),%edi
int bytes;
rtems_libio_t *iop;
ssize_t old;
bool all_zeros;
rtems_libio_check_fd( fd );
10bfce: 3b 05 4c 41 12 00 cmp 0x12414c,%eax
10bfd4: 0f 83 ea 00 00 00 jae 10c0c4 <writev+0x108> <== NEVER TAKEN
iop = rtems_libio_iop( fd );
10bfda: c1 e0 03 shl $0x3,%eax
10bfdd: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx
10bfe4: 29 c2 sub %eax,%edx
10bfe6: 8b 0d e0 83 12 00 mov 0x1283e0,%ecx
10bfec: 01 ca add %ecx,%edx
10bfee: 89 55 e4 mov %edx,-0x1c(%ebp)
rtems_libio_check_is_open( iop );
10bff1: 8b 42 14 mov 0x14(%edx),%eax
10bff4: f6 c4 01 test $0x1,%ah
10bff7: 0f 84 c7 00 00 00 je 10c0c4 <writev+0x108>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
10bffd: a8 04 test $0x4,%al
10bfff: 74 6b je 10c06c <writev+0xb0> <== NEVER TAKEN
/*
* Argument validation on IO vector
*/
if ( !iov )
10c001: 85 db test %ebx,%ebx
10c003: 74 67 je 10c06c <writev+0xb0>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt <= 0 )
10c005: 85 ff test %edi,%edi
10c007: 7e 63 jle 10c06c <writev+0xb0>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt > IOV_MAX )
10c009: 81 ff 00 04 00 00 cmp $0x400,%edi
10c00f: 7f 5b jg 10c06c <writev+0xb0> <== NEVER TAKEN
10c011: be 01 00 00 00 mov $0x1,%esi
10c016: 31 c0 xor %eax,%eax
10c018: 31 c9 xor %ecx,%ecx
10c01a: eb 02 jmp 10c01e <writev+0x62>
* this loop does that check as well and sets "all-zero" appropriately.
* The variable "all_zero" is used as an early exit point before
* entering the write loop.
*/
all_zeros = true;
for ( old=0, total=0, v=0 ; v < iovcnt ; v++ ) {
10c01c: 89 d1 mov %edx,%ecx
/*
* iov[v].iov_len cannot be less than 0 because size_t is unsigned.
* So we only check for zero.
*/
if ( iov[v].iov_base == 0 )
10c01e: 8b 14 c3 mov (%ebx,%eax,8),%edx
10c021: 85 d2 test %edx,%edx
10c023: 74 47 je 10c06c <writev+0xb0>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iov[v].iov_len )
10c025: 8b 54 c3 04 mov 0x4(%ebx,%eax,8),%edx
10c029: 85 d2 test %edx,%edx
10c02b: 74 02 je 10c02f <writev+0x73>
all_zeros = false;
10c02d: 31 f6 xor %esi,%esi
/* check for wrap */
old = total;
total += iov[v].iov_len;
10c02f: 8d 14 11 lea (%ecx,%edx,1),%edx
if ( total < old || total > SSIZE_MAX )
10c032: 39 ca cmp %ecx,%edx
10c034: 7c 36 jl 10c06c <writev+0xb0>
10c036: 81 fa ff 7f 00 00 cmp $0x7fff,%edx
10c03c: 7f 2e jg 10c06c <writev+0xb0> <== NEVER TAKEN
* this loop does that check as well and sets "all-zero" appropriately.
* The variable "all_zero" is used as an early exit point before
* entering the write loop.
*/
all_zeros = true;
for ( old=0, total=0, v=0 ; v < iovcnt ; v++ ) {
10c03e: 40 inc %eax
10c03f: 39 c7 cmp %eax,%edi
10c041: 7f d9 jg 10c01c <writev+0x60>
}
/*
* A writev with all zeros is supposed to have no effect per OpenGroup.
*/
if ( all_zeros == true ) {
10c043: 89 f0 mov %esi,%eax
10c045: 84 c0 test %al,%al
10c047: 75 3d jne 10c086 <writev+0xca>
10c049: 31 f6 xor %esi,%esi
10c04b: 31 d2 xor %edx,%edx
10c04d: 89 55 c0 mov %edx,-0x40(%ebp)
/*
* Now process the writev().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
/* all zero lengths has no effect */
if ( iov[v].iov_len == 0 )
10c050: 8b 44 f3 04 mov 0x4(%ebx,%esi,8),%eax
10c054: 85 c0 test %eax,%eax
10c056: 75 32 jne 10c08a <writev+0xce> <== ALWAYS TAKEN
}
/*
* Now process the writev().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
10c058: 46 inc %esi
10c059: 39 f7 cmp %esi,%edi
10c05b: 7f f3 jg 10c050 <writev+0x94>
10c05d: 8b 55 c0 mov -0x40(%ebp),%edx
if (bytes != iov[ v ].iov_len)
break;
}
return total;
}
10c060: 89 d0 mov %edx,%eax
10c062: 8d 65 f4 lea -0xc(%ebp),%esp
10c065: 5b pop %ebx
10c066: 5e pop %esi
10c067: 5f pop %edi
10c068: c9 leave
10c069: c3 ret
10c06a: 66 90 xchg %ax,%ax
/* check for wrap */
old = total;
total += iov[v].iov_len;
if ( total < old || total > SSIZE_MAX )
rtems_set_errno_and_return_minus_one( EINVAL );
10c06c: e8 33 80 00 00 call 1140a4 <__errno>
10c071: c7 00 16 00 00 00 movl $0x16,(%eax)
10c077: ba ff ff ff ff mov $0xffffffff,%edx
if (bytes != iov[ v ].iov_len)
break;
}
return total;
}
10c07c: 89 d0 mov %edx,%eax
10c07e: 8d 65 f4 lea -0xc(%ebp),%esp
10c081: 5b pop %ebx
10c082: 5e pop %esi
10c083: 5f pop %edi
10c084: c9 leave
10c085: c3 ret
/*
* A writev with all zeros is supposed to have no effect per OpenGroup.
*/
if ( all_zeros == true ) {
return 0;
10c086: 31 d2 xor %edx,%edx
10c088: eb f2 jmp 10c07c <writev+0xc0>
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
/* all zero lengths has no effect */
if ( iov[v].iov_len == 0 )
continue;
bytes = (*iop->pathinfo.handlers->write_h)(
10c08a: 52 push %edx
10c08b: 8b 4d e4 mov -0x1c(%ebp),%ecx
10c08e: 8b 51 20 mov 0x20(%ecx),%edx
10c091: 50 push %eax
10c092: ff 34 f3 pushl (%ebx,%esi,8)
10c095: 51 push %ecx
10c096: ff 52 0c call *0xc(%edx)
10c099: 89 45 c4 mov %eax,-0x3c(%ebp)
iop,
iov[v].iov_base,
iov[v].iov_len
);
if ( bytes < 0 )
10c09c: 83 c4 10 add $0x10,%esp
10c09f: 83 f8 00 cmp $0x0,%eax
10c0a2: 7c 32 jl 10c0d6 <writev+0x11a> <== NEVER TAKEN
return -1;
if ( bytes > 0 ) {
10c0a4: 74 10 je 10c0b6 <writev+0xfa> <== NEVER TAKEN
iop->offset += bytes;
10c0a6: 99 cltd
10c0a7: 8b 4d e4 mov -0x1c(%ebp),%ecx
10c0aa: 01 41 0c add %eax,0xc(%ecx)
10c0ad: 11 51 10 adc %edx,0x10(%ecx)
total += bytes;
10c0b0: 8b 45 c4 mov -0x3c(%ebp),%eax
10c0b3: 01 45 c0 add %eax,-0x40(%ebp)
}
if (bytes != iov[ v ].iov_len)
10c0b6: 8b 55 c4 mov -0x3c(%ebp),%edx
10c0b9: 3b 54 f3 04 cmp 0x4(%ebx,%esi,8),%edx
10c0bd: 74 99 je 10c058 <writev+0x9c> <== ALWAYS TAKEN
10c0bf: eb 9c jmp 10c05d <writev+0xa1> <== NOT EXECUTED
10c0c1: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
ssize_t old;
bool all_zeros;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open( iop );
10c0c4: e8 db 7f 00 00 call 1140a4 <__errno>
10c0c9: c7 00 09 00 00 00 movl $0x9,(%eax)
10c0cf: ba ff ff ff ff mov $0xffffffff,%edx
10c0d4: eb a6 jmp 10c07c <writev+0xc0>
iov[v].iov_base,
iov[v].iov_len
);
if ( bytes < 0 )
return -1;
10c0d6: 83 ca ff or $0xffffffff,%edx <== NOT EXECUTED
10c0d9: eb a1 jmp 10c07c <writev+0xc0> <== NOT EXECUTED