RTEMS 4.11Annotated Report
Sat Mar 12 14:52:00 2011
0010d738 <IMFS_Set_handlers>:
#define MAXSYMLINK 5
int IMFS_Set_handlers(
rtems_filesystem_location_info_t *loc
)
{
10d738: 55 push %ebp
10d739: 89 e5 mov %esp,%ebp
10d73b: 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;
10d73e: 8b 50 10 mov 0x10(%eax),%edx
10d741: 8b 52 34 mov 0x34(%edx),%edx
switch( node->type ) {
10d744: 8b 08 mov (%eax),%ecx
10d746: 8b 49 4c mov 0x4c(%ecx),%ecx
10d749: 49 dec %ecx
10d74a: 83 f9 06 cmp $0x6,%ecx
10d74d: 77 29 ja 10d778 <IMFS_Set_handlers+0x40><== NEVER TAKEN
10d74f: ff 24 8d d8 f3 11 00 jmp *0x11f3d8(,%ecx,4)
case IMFS_DIRECTORY:
loc->handlers = fs_info->directory_handlers;
10d756: 8b 52 0c mov 0xc(%edx),%edx
10d759: eb 1a jmp 10d775 <IMFS_Set_handlers+0x3d>
break;
case IMFS_DEVICE:
loc->handlers = &IMFS_device_handlers;
10d75b: c7 40 08 fc f3 11 00 movl $0x11f3fc,0x8(%eax)
break;
10d762: eb 14 jmp 10d778 <IMFS_Set_handlers+0x40>
case IMFS_SYM_LINK:
case IMFS_HARD_LINK:
loc->handlers = &IMFS_link_handlers;
10d764: c7 40 08 6c f4 11 00 movl $0x11f46c,0x8(%eax)
break;
10d76b: eb 0b jmp 10d778 <IMFS_Set_handlers+0x40>
case IMFS_LINEAR_FILE:
loc->handlers = fs_info->memfile_handlers;
break;
case IMFS_MEMORY_FILE:
loc->handlers = fs_info->memfile_handlers;
10d76d: 8b 52 08 mov 0x8(%edx),%edx
10d770: eb 03 jmp 10d775 <IMFS_Set_handlers+0x3d>
break;
case IMFS_FIFO:
loc->handlers = fs_info->fifo_handlers;
10d772: 8b 52 10 mov 0x10(%edx),%edx
10d775: 89 50 08 mov %edx,0x8(%eax)
break;
}
return 0;
}
10d778: 31 c0 xor %eax,%eax
10d77a: c9 leave
10d77b: c3 ret
0010d5eb <IMFS_create_node>:
IMFS_jnode_types_t type,
const char *name,
mode_t mode,
const IMFS_types_union *info
)
{
10d5eb: 55 push %ebp
10d5ec: 89 e5 mov %esp,%ebp
10d5ee: 57 push %edi
10d5ef: 56 push %esi
10d5f0: 53 push %ebx
10d5f1: 83 ec 1c sub $0x1c,%esp
10d5f4: 8b 4d 08 mov 0x8(%ebp),%ecx
10d5f7: 8b 5d 0c mov 0xc(%ebp),%ebx
10d5fa: 8b 75 18 mov 0x18(%ebp),%esi
/*
* MUST have a parent node to call this routine.
*/
if ( parent_loc == NULL )
return NULL;
10d5fd: 31 c0 xor %eax,%eax
IMFS_fs_info_t *fs_info;
/*
* MUST have a parent node to call this routine.
*/
if ( parent_loc == NULL )
10d5ff: 85 c9 test %ecx,%ecx
10d601: 0f 84 f4 00 00 00 je 10d6fb <IMFS_create_node+0x110><== NEVER TAKEN
return NULL;
parent = parent_loc->node_access;
10d607: 8b 11 mov (%ecx),%edx
fs_info = parent_loc->mt_entry->fs_info;
10d609: 8b 49 10 mov 0x10(%ecx),%ecx
10d60c: 8b 79 34 mov 0x34(%ecx),%edi
/*
* Reject creation of FIFOs if support is disabled.
*/
if ( type == IMFS_FIFO &&
10d60f: 83 fb 07 cmp $0x7,%ebx
10d612: 75 0d jne 10d621 <IMFS_create_node+0x36>
10d614: 81 7f 10 70 f3 11 00 cmpl $0x11f370,0x10(%edi)
10d61b: 0f 84 da 00 00 00 je 10d6fb <IMFS_create_node+0x110>
return NULL;
/*
* Allocate filesystem node and fill in basic information
*/
node = IMFS_allocate_node( type, name, mode & ~rtems_filesystem_umask );
10d621: 50 push %eax
10d622: a1 80 30 12 00 mov 0x123080,%eax
10d627: 8b 40 2c mov 0x2c(%eax),%eax
10d62a: f7 d0 not %eax
10d62c: 23 45 14 and 0x14(%ebp),%eax
10d62f: 50 push %eax
10d630: ff 75 10 pushl 0x10(%ebp)
10d633: 53 push %ebx
10d634: 89 55 e4 mov %edx,-0x1c(%ebp)
10d637: e8 40 ff ff ff call 10d57c <IMFS_allocate_node>
if ( !node )
10d63c: 83 c4 10 add $0x10,%esp
10d63f: 85 c0 test %eax,%eax
10d641: 8b 55 e4 mov -0x1c(%ebp),%edx
10d644: 0f 84 b1 00 00 00 je 10d6fb <IMFS_create_node+0x110>
return NULL;
/*
* Set the type specific information
*/
if ( type == IMFS_DIRECTORY ) {
10d64a: 83 fb 01 cmp $0x1,%ebx
10d64d: 75 15 jne 10d664 <IMFS_create_node+0x79>
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 );
10d64f: 8d 48 54 lea 0x54(%eax),%ecx
10d652: 89 48 50 mov %ecx,0x50(%eax)
head->next = tail;
head->previous = NULL;
10d655: 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 );
10d65c: 8d 48 50 lea 0x50(%eax),%ecx
10d65f: 89 48 58 mov %ecx,0x58(%eax)
10d662: eb 75 jmp 10d6d9 <IMFS_create_node+0xee>
rtems_chain_initialize_empty(&node->info.directory.Entries);
} else if ( type == IMFS_HARD_LINK ) {
10d664: 83 fb 03 cmp $0x3,%ebx
10d667: 74 05 je 10d66e <IMFS_create_node+0x83>
node->info.hard_link.link_node = info->hard_link.link_node;
} else if ( type == IMFS_SYM_LINK ) {
10d669: 83 fb 04 cmp $0x4,%ebx
10d66c: 75 07 jne 10d675 <IMFS_create_node+0x8a>
node->info.sym_link.name = info->sym_link.name;
10d66e: 8b 0e mov (%esi),%ecx
10d670: 89 48 50 mov %ecx,0x50(%eax)
10d673: eb 64 jmp 10d6d9 <IMFS_create_node+0xee>
} else if ( type == IMFS_DEVICE ) {
10d675: 83 fb 02 cmp $0x2,%ebx
10d678: 75 0d jne 10d687 <IMFS_create_node+0x9c>
node->info.device.major = info->device.major;
10d67a: 8b 0e mov (%esi),%ecx
10d67c: 89 48 50 mov %ecx,0x50(%eax)
node->info.device.minor = info->device.minor;
10d67f: 8b 4e 04 mov 0x4(%esi),%ecx
10d682: 89 48 54 mov %ecx,0x54(%eax)
10d685: eb 52 jmp 10d6d9 <IMFS_create_node+0xee>
} else if ( type == IMFS_LINEAR_FILE ) {
10d687: 83 fb 06 cmp $0x6,%ebx
10d68a: 75 17 jne 10d6a3 <IMFS_create_node+0xb8>
node->info.linearfile.size = 0;
10d68c: c7 40 50 00 00 00 00 movl $0x0,0x50(%eax)
10d693: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
node->info.linearfile.direct = 0;
10d69a: c7 40 58 00 00 00 00 movl $0x0,0x58(%eax)
10d6a1: eb 36 jmp 10d6d9 <IMFS_create_node+0xee>
} else if ( type == IMFS_MEMORY_FILE ) {
10d6a3: 83 fb 05 cmp $0x5,%ebx
10d6a6: 75 25 jne 10d6cd <IMFS_create_node+0xe2>
node->info.file.size = 0;
10d6a8: c7 40 50 00 00 00 00 movl $0x0,0x50(%eax)
10d6af: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
node->info.file.indirect = 0;
10d6b6: c7 40 58 00 00 00 00 movl $0x0,0x58(%eax)
node->info.file.doubly_indirect = 0;
10d6bd: c7 40 5c 00 00 00 00 movl $0x0,0x5c(%eax)
node->info.file.triply_indirect = 0;
10d6c4: c7 40 60 00 00 00 00 movl $0x0,0x60(%eax)
10d6cb: eb 0c jmp 10d6d9 <IMFS_create_node+0xee>
} else if ( type == IMFS_FIFO ) {
10d6cd: 83 fb 07 cmp $0x7,%ebx
10d6d0: 75 07 jne 10d6d9 <IMFS_create_node+0xee> <== NEVER TAKEN
node->info.fifo.pipe = NULL;
10d6d2: c7 40 50 00 00 00 00 movl $0x0,0x50(%eax)
}
/*
* This node MUST have a parent, so put it in that directory list.
*/
node->Parent = parent;
10d6d9: 89 50 08 mov %edx,0x8(%eax)
node->st_ino = ++fs_info->ino_count;
10d6dc: 8b 4f 04 mov 0x4(%edi),%ecx
10d6df: 41 inc %ecx
10d6e0: 89 4f 04 mov %ecx,0x4(%edi)
10d6e3: 89 48 38 mov %ecx,0x38(%eax)
10d6e6: 53 push %ebx
10d6e7: 53 push %ebx
10d6e8: 50 push %eax
rtems_chain_append( &parent->info.directory.Entries, &node->Node );
10d6e9: 83 c2 50 add $0x50,%edx
10d6ec: 52 push %edx
10d6ed: 89 45 e4 mov %eax,-0x1c(%ebp)
10d6f0: e8 3f d3 ff ff call 10aa34 <_Chain_Append>
return node;
10d6f5: 83 c4 10 add $0x10,%esp
10d6f8: 8b 45 e4 mov -0x1c(%ebp),%eax
}
10d6fb: 8d 65 f4 lea -0xc(%ebp),%esp
10d6fe: 5b pop %ebx
10d6ff: 5e pop %esi
10d700: 5f pop %edi
10d701: c9 leave
10d702: c3 ret
0010d819 <IMFS_eval_path>:
const char *pathname, /* IN */
size_t pathnamelen, /* IN */
int flags, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN/OUT */
)
{
10d819: 55 push %ebp
10d81a: 89 e5 mov %esp,%ebp
10d81c: 57 push %edi
10d81d: 56 push %esi
10d81e: 53 push %ebx
10d81f: 83 ec 5c sub $0x5c,%esp
10d822: 8b 5d 14 mov 0x14(%ebp),%ebx
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 ) ) {
10d825: f7 45 10 f8 ff ff ff testl $0xfffffff8,0x10(%ebp)
10d82c: 74 0d je 10d83b <IMFS_eval_path+0x22> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EIO );
10d82e: e8 05 39 00 00 call 111138 <__errno> <== NOT EXECUTED
10d833: c7 00 05 00 00 00 movl $0x5,(%eax) <== NOT EXECUTED
10d839: eb 42 jmp 10d87d <IMFS_eval_path+0x64> <== NOT EXECUTED
/*
* This was filled in by the caller and is valid in the
* mount table.
*/
node = pathloc->node_access;
10d83b: 8b 3b mov (%ebx),%edi
rtems_filesystem_location_info_t *pathloc /* IN/OUT */
)
{
int i = 0;
int len;
IMFS_token_types type = IMFS_CURRENT_DIR;
10d83d: be 01 00 00 00 mov $0x1,%esi
size_t pathnamelen, /* IN */
int flags, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN/OUT */
)
{
int i = 0;
10d842: c7 45 a4 00 00 00 00 movl $0x0,-0x5c(%ebp)
/*
* Evaluate all tokens until we are done or an error occurs.
*/
while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {
10d849: e9 29 01 00 00 jmp 10d977 <IMFS_eval_path+0x15e>
type = IMFS_get_token( &pathname[i], pathnamelen, token, &len );
10d84e: 8d 45 e4 lea -0x1c(%ebp),%eax
10d851: 50 push %eax
10d852: 8d 4d af lea -0x51(%ebp),%ecx
10d855: 51 push %ecx
10d856: ff 75 0c pushl 0xc(%ebp)
10d859: 8b 45 08 mov 0x8(%ebp),%eax
10d85c: 03 45 a4 add -0x5c(%ebp),%eax
10d85f: 50 push %eax
10d860: e8 b3 05 00 00 call 10de18 <IMFS_get_token>
10d865: 89 c6 mov %eax,%esi
pathnamelen -= len;
10d867: 8b 55 e4 mov -0x1c(%ebp),%edx
i += len;
if ( !pathloc->node_access )
10d86a: 83 c4 10 add $0x10,%esp
10d86d: 83 3b 00 cmpl $0x0,(%ebx)
10d870: 75 13 jne 10d885 <IMFS_eval_path+0x6c> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( ENOENT );
10d872: e8 c1 38 00 00 call 111138 <__errno>
10d877: c7 00 02 00 00 00 movl $0x2,(%eax)
10d87d: 83 cf ff or $0xffffffff,%edi
10d880: e9 75 01 00 00 jmp 10d9fa <IMFS_eval_path+0x1e1>
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
10d885: 85 c0 test %eax,%eax
10d887: 74 21 je 10d8aa <IMFS_eval_path+0x91>
if ( node->type == IMFS_DIRECTORY )
10d889: 83 7f 4c 01 cmpl $0x1,0x4c(%edi)
10d88d: 75 1b jne 10d8aa <IMFS_eval_path+0x91>
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
10d88f: 57 push %edi
10d890: 57 push %edi
10d891: 6a 01 push $0x1
10d893: 53 push %ebx
10d894: 89 55 a0 mov %edx,-0x60(%ebp)
10d897: e8 e0 fe ff ff call 10d77c <IMFS_evaluate_permission>
10d89c: 83 c4 10 add $0x10,%esp
10d89f: 85 c0 test %eax,%eax
10d8a1: 8b 55 a0 mov -0x60(%ebp),%edx
10d8a4: 0f 84 3e 01 00 00 je 10d9e8 <IMFS_eval_path+0x1cf>
*/
while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {
type = IMFS_get_token( &pathname[i], pathnamelen, token, &len );
pathnamelen -= len;
10d8aa: 29 55 0c sub %edx,0xc(%ebp)
i += len;
10d8ad: 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;
10d8b0: 8b 3b mov (%ebx),%edi
switch( type ) {
10d8b2: 83 fe 03 cmp $0x3,%esi
10d8b5: 74 38 je 10d8ef <IMFS_eval_path+0xd6>
10d8b7: 83 fe 04 cmp $0x4,%esi
10d8ba: 0f 84 a7 00 00 00 je 10d967 <IMFS_eval_path+0x14e>
10d8c0: 83 fe 02 cmp $0x2,%esi
10d8c3: 0f 85 ae 00 00 00 jne 10d977 <IMFS_eval_path+0x15e>
case IMFS_UP_DIR:
/*
* Am I at the root of all filesystems? (chroot'ed?)
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access )
10d8c9: a1 80 30 12 00 mov 0x123080,%eax
10d8ce: 3b 78 18 cmp 0x18(%eax),%edi
10d8d1: 0f 84 a0 00 00 00 je 10d977 <IMFS_eval_path+0x15e> <== NEVER TAKEN
/*
* Am I at the root of this mounted filesystem?
*/
if (pathloc->node_access ==
pathloc->mt_entry->mt_fs_root.node_access) {
10d8d7: 8b 43 10 mov 0x10(%ebx),%eax
/*
* Am I at the root of this mounted filesystem?
*/
if (pathloc->node_access ==
10d8da: 3b 78 1c cmp 0x1c(%eax),%edi
10d8dd: 75 0b jne 10d8ea <IMFS_eval_path+0xd1>
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access ) {
break; /* Throw out the .. in this case */
} else {
newloc = pathloc->mt_entry->mt_point_node;
10d8df: 8d 7d d0 lea -0x30(%ebp),%edi
10d8e2: 8d 70 08 lea 0x8(%eax),%esi
10d8e5: e9 ad 00 00 00 jmp 10d997 <IMFS_eval_path+0x17e>
pathnamelen+len,
flags,pathloc);
}
} else {
if ( !node->Parent )
10d8ea: 8b 7f 08 mov 0x8(%edi),%edi
10d8ed: eb 6c jmp 10d95b <IMFS_eval_path+0x142>
case IMFS_NAME:
/*
* If we are at a link follow it.
*/
if ( node->type == IMFS_HARD_LINK ) {
10d8ef: 8b 47 4c mov 0x4c(%edi),%eax
10d8f2: 83 f8 03 cmp $0x3,%eax
10d8f5: 75 11 jne 10d908 <IMFS_eval_path+0xef>
IMFS_evaluate_hard_link( pathloc, 0 );
10d8f7: 51 push %ecx
10d8f8: 51 push %ecx
10d8f9: 6a 00 push $0x0
10d8fb: 53 push %ebx
10d8fc: e8 d9 fe ff ff call 10d7da <IMFS_evaluate_hard_link>
node = pathloc->node_access;
10d901: 8b 3b mov (%ebx),%edi
10d903: 83 c4 10 add $0x10,%esp
10d906: eb 1d jmp 10d925 <IMFS_eval_path+0x10c>
* It would be a design error if we evaluated the link and
* was broken.
*/
IMFS_assert( node );
} else if ( node->type == IMFS_SYM_LINK ) {
10d908: 83 f8 04 cmp $0x4,%eax
10d90b: 75 18 jne 10d925 <IMFS_eval_path+0x10c>
result = IMFS_evaluate_sym_link( pathloc, 0 );
10d90d: 52 push %edx
10d90e: 52 push %edx
10d90f: 6a 00 push $0x0
10d911: 53 push %ebx
10d912: e8 ed 00 00 00 call 10da04 <IMFS_evaluate_sym_link>
/*
* In contrast to a hard link, it is possible to have a broken
* symbolic link.
*/
node = pathloc->node_access;
10d917: 8b 3b mov (%ebx),%edi
if ( result == -1 )
10d919: 83 c4 10 add $0x10,%esp
10d91c: 83 f8 ff cmp $0xffffffff,%eax
10d91f: 0f 84 d3 00 00 00 je 10d9f8 <IMFS_eval_path+0x1df> <== NEVER TAKEN
}
/*
* Only a directory can be decended into.
*/
if ( node->type != IMFS_DIRECTORY )
10d925: 83 7f 4c 01 cmpl $0x1,0x4c(%edi)
10d929: 74 10 je 10d93b <IMFS_eval_path+0x122>
rtems_set_errno_and_return_minus_one( ENOTDIR );
10d92b: e8 08 38 00 00 call 111138 <__errno>
10d930: c7 00 14 00 00 00 movl $0x14,(%eax)
10d936: e9 42 ff ff ff jmp 10d87d <IMFS_eval_path+0x64>
/*
* 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 ) {
10d93b: 8b 47 5c mov 0x5c(%edi),%eax
10d93e: 85 c0 test %eax,%eax
10d940: 74 08 je 10d94a <IMFS_eval_path+0x131>
newloc = node->info.directory.mt_fs->mt_fs_root;
10d942: 8d 7d d0 lea -0x30(%ebp),%edi
10d945: 8d 70 1c lea 0x1c(%eax),%esi
10d948: eb 4d jmp 10d997 <IMFS_eval_path+0x17e>
}
/*
* Otherwise find the token name in the present location.
*/
node = IMFS_find_match_in_dir( node, token );
10d94a: 50 push %eax
10d94b: 50 push %eax
10d94c: 8d 45 af lea -0x51(%ebp),%eax
10d94f: 50 push %eax
10d950: 57 push %edi
10d951: e8 56 04 00 00 call 10ddac <IMFS_find_match_in_dir>
10d956: 89 c7 mov %eax,%edi
if ( !node )
10d958: 83 c4 10 add $0x10,%esp
10d95b: 85 ff test %edi,%edi
10d95d: 0f 84 0f ff ff ff je 10d872 <IMFS_eval_path+0x59>
/*
* Set the node access to the point we have found.
*/
pathloc->node_access = node;
10d963: 89 3b mov %edi,(%ebx)
10d965: eb 10 jmp 10d977 <IMFS_eval_path+0x15e>
case IMFS_NO_MORE_PATH:
case IMFS_CURRENT_DIR:
break;
case IMFS_INVALID_TOKEN:
rtems_set_errno_and_return_minus_one( ENAMETOOLONG );
10d967: e8 cc 37 00 00 call 111138 <__errno>
10d96c: c7 00 5b 00 00 00 movl $0x5b,(%eax)
10d972: e9 06 ff ff ff jmp 10d87d <IMFS_eval_path+0x64>
/*
* Evaluate all tokens until we are done or an error occurs.
*/
while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {
10d977: 83 fe 04 cmp $0x4,%esi
10d97a: 74 08 je 10d984 <IMFS_eval_path+0x16b> <== NEVER TAKEN
10d97c: 85 f6 test %esi,%esi
10d97e: 0f 85 ca fe ff ff jne 10d84e <IMFS_eval_path+0x35>
* 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 ) {
10d984: 83 7f 4c 01 cmpl $0x1,0x4c(%edi)
10d988: 75 41 jne 10d9cb <IMFS_eval_path+0x1b2>
if ( node->info.directory.mt_fs != NULL ) {
10d98a: 8b 77 5c mov 0x5c(%edi),%esi
10d98d: 85 f6 test %esi,%esi
10d98f: 74 3a je 10d9cb <IMFS_eval_path+0x1b2>
newloc = node->info.directory.mt_fs->mt_fs_root;
10d991: 8d 7d d0 lea -0x30(%ebp),%edi
10d994: 83 c6 1c add $0x1c,%esi
10d997: b9 05 00 00 00 mov $0x5,%ecx
10d99c: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
*pathloc = newloc;
10d99e: 8d 75 d0 lea -0x30(%ebp),%esi
10d9a1: b1 05 mov $0x5,%cl
10d9a3: 89 df mov %ebx,%edi
10d9a5: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return (*pathloc->ops->evalpath_h)( &pathname[i-len],
10d9a7: 8b 45 e4 mov -0x1c(%ebp),%eax
10d9aa: 8b 53 0c mov 0xc(%ebx),%edx
10d9ad: 53 push %ebx
10d9ae: ff 75 10 pushl 0x10(%ebp)
10d9b1: 8b 4d 0c mov 0xc(%ebp),%ecx
10d9b4: 01 c1 add %eax,%ecx
10d9b6: 51 push %ecx
10d9b7: 8b 4d a4 mov -0x5c(%ebp),%ecx
10d9ba: 29 c1 sub %eax,%ecx
10d9bc: 8b 45 08 mov 0x8(%ebp),%eax
10d9bf: 01 c8 add %ecx,%eax
10d9c1: 50 push %eax
10d9c2: ff 12 call *(%edx)
10d9c4: 89 c7 mov %eax,%edi
10d9c6: 83 c4 10 add $0x10,%esp
10d9c9: eb 2f jmp 10d9fa <IMFS_eval_path+0x1e1>
flags, pathloc );
} else {
result = IMFS_Set_handlers( pathloc );
}
} else {
result = IMFS_Set_handlers( pathloc );
10d9cb: 83 ec 0c sub $0xc,%esp
10d9ce: 53 push %ebx
10d9cf: e8 64 fd ff ff call 10d738 <IMFS_Set_handlers>
10d9d4: 89 c7 mov %eax,%edi
10d9d6: 5a pop %edx
10d9d7: 59 pop %ecx
/*
* Verify we have the correct permissions for this node.
*/
if ( !IMFS_evaluate_permission( pathloc, flags ) )
10d9d8: ff 75 10 pushl 0x10(%ebp)
10d9db: 53 push %ebx
10d9dc: e8 9b fd ff ff call 10d77c <IMFS_evaluate_permission>
10d9e1: 83 c4 10 add $0x10,%esp
10d9e4: 85 c0 test %eax,%eax
10d9e6: 75 12 jne 10d9fa <IMFS_eval_path+0x1e1>
rtems_set_errno_and_return_minus_one( EACCES );
10d9e8: e8 4b 37 00 00 call 111138 <__errno>
10d9ed: c7 00 0d 00 00 00 movl $0xd,(%eax)
10d9f3: e9 85 fe ff ff jmp 10d87d <IMFS_eval_path+0x64>
10d9f8: 89 c7 mov %eax,%edi <== NOT EXECUTED
return result;
}
10d9fa: 89 f8 mov %edi,%eax
10d9fc: 8d 65 f4 lea -0xc(%ebp),%esp
10d9ff: 5b pop %ebx
10da00: 5e pop %esi
10da01: 5f pop %edi
10da02: c9 leave
10da03: c3 ret
0010daf8 <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 */
)
{
10daf8: 55 push %ebp
10daf9: 89 e5 mov %esp,%ebp
10dafb: 57 push %edi
10dafc: 56 push %esi
10dafd: 53 push %ebx
10dafe: 83 ec 5c sub $0x5c,%esp
10db01: 8b 55 0c mov 0xc(%ebp),%edx
/*
* This was filled in by the caller and is valid in the
* mount table.
*/
node = pathloc->node_access;
10db04: 8b 1a mov (%edx),%ebx
/*
* Get the path length.
*/
pathlen = strlen( path );
10db06: 31 c0 xor %eax,%eax
10db08: 83 c9 ff or $0xffffffff,%ecx
10db0b: 8b 7d 08 mov 0x8(%ebp),%edi
10db0e: f2 ae repnz scas %es:(%edi),%al
10db10: f7 d1 not %ecx
10db12: 49 dec %ecx
10db13: 89 4d a0 mov %ecx,-0x60(%ebp)
const char *path, /* IN */
rtems_filesystem_location_info_t *pathloc, /* IN/OUT */
const char **name /* OUT */
)
{
int i = 0;
10db16: 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 );
10db1d: 8d 7d af lea -0x51(%ebp),%edi
10db20: 89 d6 mov %edx,%esi
10db22: 8d 45 e4 lea -0x1c(%ebp),%eax
10db25: 50 push %eax
10db26: 57 push %edi
10db27: ff 75 a0 pushl -0x60(%ebp)
10db2a: 8b 45 08 mov 0x8(%ebp),%eax
10db2d: 03 45 a4 add -0x5c(%ebp),%eax
10db30: 50 push %eax
10db31: e8 e2 02 00 00 call 10de18 <IMFS_get_token>
10db36: 89 c2 mov %eax,%edx
pathlen -= len;
10db38: 8b 4d e4 mov -0x1c(%ebp),%ecx
10db3b: 29 4d a0 sub %ecx,-0x60(%ebp)
i += len;
if ( !pathloc->node_access )
10db3e: 83 c4 10 add $0x10,%esp
10db41: 83 3e 00 cmpl $0x0,(%esi)
10db44: 0f 84 79 01 00 00 je 10dcc3 <IMFS_evaluate_for_make+0x1cb><== NEVER TAKEN
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
10db4a: 85 c0 test %eax,%eax
10db4c: 74 36 je 10db84 <IMFS_evaluate_for_make+0x8c>
if ( node->type == IMFS_DIRECTORY )
10db4e: 83 7b 4c 01 cmpl $0x1,0x4c(%ebx)
10db52: 75 30 jne 10db84 <IMFS_evaluate_for_make+0x8c>
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
10db54: 53 push %ebx
10db55: 53 push %ebx
10db56: 6a 01 push $0x1
10db58: 56 push %esi
10db59: 89 45 9c mov %eax,-0x64(%ebp)
10db5c: 89 4d 98 mov %ecx,-0x68(%ebp)
10db5f: e8 18 fc ff ff call 10d77c <IMFS_evaluate_permission>
10db64: 83 c4 10 add $0x10,%esp
10db67: 85 c0 test %eax,%eax
10db69: 8b 55 9c mov -0x64(%ebp),%edx
10db6c: 8b 4d 98 mov -0x68(%ebp),%ecx
10db6f: 75 13 jne 10db84 <IMFS_evaluate_for_make+0x8c>
rtems_set_errno_and_return_minus_one( EACCES );
10db71: e8 c2 35 00 00 call 111138 <__errno>
10db76: c7 00 0d 00 00 00 movl $0xd,(%eax)
10db7c: 83 cb ff or $0xffffffff,%ebx
10db7f: e9 99 01 00 00 jmp 10dd1d <IMFS_evaluate_for_make+0x225>
while( !done ) {
type = IMFS_get_token( &path[i], pathlen, token, &len );
pathlen -= len;
i += len;
10db84: 01 4d a4 add %ecx,-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;
10db87: 8b 1e mov (%esi),%ebx
switch( type ) {
10db89: 83 fa 02 cmp $0x2,%edx
10db8c: 74 1f je 10dbad <IMFS_evaluate_for_make+0xb5>
10db8e: 77 0a ja 10db9a <IMFS_evaluate_for_make+0xa2>
10db90: 85 d2 test %edx,%edx
10db92: 0f 84 d9 00 00 00 je 10dc71 <IMFS_evaluate_for_make+0x179>
10db98: eb 88 jmp 10db22 <IMFS_evaluate_for_make+0x2a>
10db9a: 83 fa 03 cmp $0x3,%edx
10db9d: 74 40 je 10dbdf <IMFS_evaluate_for_make+0xe7>
10db9f: 83 fa 04 cmp $0x4,%edx
10dba2: 0f 85 7a ff ff ff jne 10db22 <IMFS_evaluate_for_make+0x2a><== NEVER TAKEN
10dba8: e9 d4 00 00 00 jmp 10dc81 <IMFS_evaluate_for_make+0x189>
case IMFS_UP_DIR:
/*
* Am I at the root of all filesystems? (chroot'ed?)
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access )
10dbad: a1 80 30 12 00 mov 0x123080,%eax
10dbb2: 3b 58 18 cmp 0x18(%eax),%ebx
10dbb5: 0f 84 67 ff ff ff je 10db22 <IMFS_evaluate_for_make+0x2a>
/*
* Am I at the root of this mounted filesystem?
*/
if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access){
10dbbb: 8b 46 10 mov 0x10(%esi),%eax
10dbbe: 3b 58 1c cmp 0x1c(%eax),%ebx
10dbc1: 75 0c jne 10dbcf <IMFS_evaluate_for_make+0xd7>
10dbc3: 89 f2 mov %esi,%edx
10dbc5: 89 c6 mov %eax,%esi
if ( pathloc->node_access == rtems_filesystem_root.node_access ) {
break;
} else {
newloc = pathloc->mt_entry->mt_point_node;
10dbc7: 8d 7d d0 lea -0x30(%ebp),%edi
10dbca: 83 c6 08 add $0x8,%esi
10dbcd: eb 5a jmp 10dc29 <IMFS_evaluate_for_make+0x131>
*pathloc = newloc;
return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
}
} else {
if ( !node->Parent )
10dbcf: 8b 5b 08 mov 0x8(%ebx),%ebx
10dbd2: 85 db test %ebx,%ebx
10dbd4: 0f 85 90 00 00 00 jne 10dc6a <IMFS_evaluate_for_make+0x172>
10dbda: e9 e4 00 00 00 jmp 10dcc3 <IMFS_evaluate_for_make+0x1cb>
pathloc->node_access = node;
break;
case IMFS_NAME:
if ( node->type == IMFS_HARD_LINK ) {
10dbdf: 8b 43 4c mov 0x4c(%ebx),%eax
10dbe2: 83 f8 03 cmp $0x3,%eax
10dbe5: 74 05 je 10dbec <IMFS_evaluate_for_make+0xf4>
result = IMFS_evaluate_link( pathloc, 0 );
if ( result == -1 )
return -1;
} else if ( node->type == IMFS_SYM_LINK ) {
10dbe7: 83 f8 04 cmp $0x4,%eax
10dbea: 75 16 jne 10dc02 <IMFS_evaluate_for_make+0x10a>
result = IMFS_evaluate_link( pathloc, 0 );
10dbec: 50 push %eax
10dbed: 50 push %eax
10dbee: 6a 00 push $0x0
10dbf0: 56 push %esi
10dbf1: e8 7f fe ff ff call 10da75 <IMFS_evaluate_link>
if ( result == -1 )
10dbf6: 83 c4 10 add $0x10,%esp
10dbf9: 83 f8 ff cmp $0xffffffff,%eax
10dbfc: 0f 84 19 01 00 00 je 10dd1b <IMFS_evaluate_for_make+0x223><== NEVER TAKEN
return -1;
}
node = pathloc->node_access;
10dc02: 8b 06 mov (%esi),%eax
if ( !node )
10dc04: 85 c0 test %eax,%eax
10dc06: 0f 84 e9 00 00 00 je 10dcf5 <IMFS_evaluate_for_make+0x1fd><== NEVER TAKEN
/*
* Only a directory can be decended into.
*/
if ( node->type != IMFS_DIRECTORY )
10dc0c: 83 78 4c 01 cmpl $0x1,0x4c(%eax)
10dc10: 0f 85 df 00 00 00 jne 10dcf5 <IMFS_evaluate_for_make+0x1fd>
/*
* 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 ) {
10dc16: 8b 50 5c mov 0x5c(%eax),%edx
10dc19: 85 d2 test %edx,%edx
10dc1b: 74 3b je 10dc58 <IMFS_evaluate_for_make+0x160>
10dc1d: 89 f0 mov %esi,%eax
10dc1f: 89 d6 mov %edx,%esi
10dc21: 89 c2 mov %eax,%edx
newloc = node->info.directory.mt_fs->mt_fs_root;
10dc23: 8d 7d d0 lea -0x30(%ebp),%edi
10dc26: 83 c6 1c add $0x1c,%esi
10dc29: b9 05 00 00 00 mov $0x5,%ecx
10dc2e: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
*pathloc = newloc;
10dc30: 8d 75 d0 lea -0x30(%ebp),%esi
10dc33: b1 05 mov $0x5,%cl
10dc35: 89 d7 mov %edx,%edi
10dc37: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
10dc39: 56 push %esi
10dc3a: 8b 42 0c mov 0xc(%edx),%eax
10dc3d: ff 75 10 pushl 0x10(%ebp)
10dc40: 52 push %edx
10dc41: 8b 55 a4 mov -0x5c(%ebp),%edx
10dc44: 2b 55 e4 sub -0x1c(%ebp),%edx
10dc47: 03 55 08 add 0x8(%ebp),%edx
10dc4a: 52 push %edx
10dc4b: ff 50 04 call *0x4(%eax)
10dc4e: 89 c3 mov %eax,%ebx
10dc50: 83 c4 10 add $0x10,%esp
10dc53: e9 c5 00 00 00 jmp 10dd1d <IMFS_evaluate_for_make+0x225>
/*
* Otherwise find the token name in the present location.
*/
node = IMFS_find_match_in_dir( node, token );
10dc58: 53 push %ebx
10dc59: 53 push %ebx
10dc5a: 57 push %edi
10dc5b: 50 push %eax
10dc5c: e8 4b 01 00 00 call 10ddac <IMFS_find_match_in_dir>
10dc61: 89 c3 mov %eax,%ebx
/*
* If there is no node we have found the name of the node we
* wish to create.
*/
if ( ! node )
10dc63: 83 c4 10 add $0x10,%esp
10dc66: 85 c0 test %eax,%eax
10dc68: 74 27 je 10dc91 <IMFS_evaluate_for_make+0x199>
done = true;
else
pathloc->node_access = node;
10dc6a: 89 1e mov %ebx,(%esi)
10dc6c: e9 b1 fe ff ff jmp 10db22 <IMFS_evaluate_for_make+0x2a>
break;
case IMFS_NO_MORE_PATH:
rtems_set_errno_and_return_minus_one( EEXIST );
10dc71: e8 c2 34 00 00 call 111138 <__errno>
10dc76: c7 00 11 00 00 00 movl $0x11,(%eax)
10dc7c: e9 fb fe ff ff jmp 10db7c <IMFS_evaluate_for_make+0x84>
break;
case IMFS_INVALID_TOKEN:
rtems_set_errno_and_return_minus_one( ENAMETOOLONG );
10dc81: e8 b2 34 00 00 call 111138 <__errno>
10dc86: c7 00 5b 00 00 00 movl $0x5b,(%eax)
10dc8c: e9 eb fe ff ff jmp 10db7c <IMFS_evaluate_for_make+0x84>
10dc91: 89 f2 mov %esi,%edx
case IMFS_CURRENT_DIR:
break;
}
}
*name = &path[ i - len ];
10dc93: 8b 45 a4 mov -0x5c(%ebp),%eax
10dc96: 2b 45 e4 sub -0x1c(%ebp),%eax
10dc99: 03 45 08 add 0x8(%ebp),%eax
10dc9c: 8b 4d 10 mov 0x10(%ebp),%ecx
10dc9f: 89 01 mov %eax,(%ecx)
* pathloc is returned with a pointer to the parent of the new node.
* name is returned with a pointer to the first character in the
* new node name. The parent node is verified to be a directory.
*/
int IMFS_evaluate_for_make(
10dca1: 8b 5d 08 mov 0x8(%ebp),%ebx
10dca4: 03 5d a4 add -0x5c(%ebp),%ebx
/*
* 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++) {
10dca7: eb 2a jmp 10dcd3 <IMFS_evaluate_for_make+0x1db>
if ( !IMFS_is_separator( path[ i ] ) )
10dca9: 83 ec 0c sub $0xc,%esp
10dcac: 0f be c0 movsbl %al,%eax
10dcaf: 50 push %eax
10dcb0: 89 55 9c mov %edx,-0x64(%ebp)
10dcb3: e8 9c a3 ff ff call 108054 <rtems_filesystem_is_separator>
10dcb8: 43 inc %ebx
10dcb9: 83 c4 10 add $0x10,%esp
10dcbc: 85 c0 test %eax,%eax
10dcbe: 8b 55 9c mov -0x64(%ebp),%edx
10dcc1: 75 10 jne 10dcd3 <IMFS_evaluate_for_make+0x1db>
rtems_set_errno_and_return_minus_one( ENOENT );
10dcc3: e8 70 34 00 00 call 111138 <__errno>
10dcc8: c7 00 02 00 00 00 movl $0x2,(%eax)
10dcce: e9 a9 fe ff ff jmp 10db7c <IMFS_evaluate_for_make+0x84>
/*
* 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++) {
10dcd3: 8a 03 mov (%ebx),%al
10dcd5: 84 c0 test %al,%al
10dcd7: 75 d0 jne 10dca9 <IMFS_evaluate_for_make+0x1b1>
/*
* Verify we can execute and write to this directory.
*/
result = IMFS_Set_handlers( pathloc );
10dcd9: 83 ec 0c sub $0xc,%esp
10dcdc: 52 push %edx
10dcdd: 89 55 9c mov %edx,-0x64(%ebp)
10dce0: e8 53 fa ff ff call 10d738 <IMFS_Set_handlers>
10dce5: 89 c3 mov %eax,%ebx
/*
* The returned node must be a directory
*/
node = pathloc->node_access;
if ( node->type != IMFS_DIRECTORY )
10dce7: 8b 55 9c mov -0x64(%ebp),%edx
10dcea: 8b 02 mov (%edx),%eax
10dcec: 83 c4 10 add $0x10,%esp
10dcef: 83 78 4c 01 cmpl $0x1,0x4c(%eax)
10dcf3: 74 10 je 10dd05 <IMFS_evaluate_for_make+0x20d><== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( ENOTDIR );
10dcf5: e8 3e 34 00 00 call 111138 <__errno>
10dcfa: c7 00 14 00 00 00 movl $0x14,(%eax)
10dd00: e9 77 fe ff ff jmp 10db7c <IMFS_evaluate_for_make+0x84>
/*
* We must have Write and execute permission on the returned node.
*/
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_WX ) )
10dd05: 51 push %ecx
10dd06: 51 push %ecx
10dd07: 6a 03 push $0x3
10dd09: 52 push %edx
10dd0a: e8 6d fa ff ff call 10d77c <IMFS_evaluate_permission>
10dd0f: 83 c4 10 add $0x10,%esp
10dd12: 85 c0 test %eax,%eax
10dd14: 75 07 jne 10dd1d <IMFS_evaluate_for_make+0x225>
10dd16: e9 56 fe ff ff jmp 10db71 <IMFS_evaluate_for_make+0x79>
10dd1b: 89 c3 mov %eax,%ebx <== NOT EXECUTED
rtems_set_errno_and_return_minus_one( EACCES );
return result;
}
10dd1d: 89 d8 mov %ebx,%eax
10dd1f: 8d 65 f4 lea -0xc(%ebp),%esp
10dd22: 5b pop %ebx
10dd23: 5e pop %esi
10dd24: 5f pop %edi
10dd25: c9 leave
10dd26: c3 ret
0010d77c <IMFS_evaluate_permission>:
*/
int IMFS_evaluate_permission(
rtems_filesystem_location_info_t *node,
int flags
)
{
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 0c sub $0xc,%esp
10d785: 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 ) )
10d788: f7 c6 f8 ff ff ff test $0xfffffff8,%esi
10d78e: 74 10 je 10d7a0 <IMFS_evaluate_permission+0x24><== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EPERM );
10d790: e8 a3 39 00 00 call 111138 <__errno> <== NOT EXECUTED
10d795: c7 00 01 00 00 00 movl $0x1,(%eax) <== NOT EXECUTED
10d79b: 83 c8 ff or $0xffffffff,%eax <== NOT EXECUTED
10d79e: eb 32 jmp 10d7d2 <IMFS_evaluate_permission+0x56><== NOT EXECUTED
jnode = node->node_access;
10d7a0: 8b 45 08 mov 0x8(%ebp),%eax
10d7a3: 8b 18 mov (%eax),%ebx
#if defined(RTEMS_POSIX_API)
st_uid = geteuid();
10d7a5: e8 2e 0a 00 00 call 10e1d8 <geteuid>
10d7aa: 89 c7 mov %eax,%edi
st_gid = getegid();
10d7ac: e8 17 0a 00 00 call 10e1c8 <getegid>
* Check if I am owner or a group member or someone else.
*/
flags_to_test = flags;
if ( st_uid == jnode->st_uid )
10d7b1: 66 3b 7b 3c cmp 0x3c(%ebx),%di
10d7b5: 75 05 jne 10d7bc <IMFS_evaluate_permission+0x40>
flags_to_test <<= 6;
10d7b7: c1 e6 06 shl $0x6,%esi
10d7ba: eb 09 jmp 10d7c5 <IMFS_evaluate_permission+0x49>
else if ( st_gid == jnode->st_gid )
10d7bc: 66 3b 43 3e cmp 0x3e(%ebx),%ax
10d7c0: 75 03 jne 10d7c5 <IMFS_evaluate_permission+0x49><== NEVER TAKEN
flags_to_test <<= 3;
10d7c2: c1 e6 03 shl $0x3,%esi
/*
* If all of the flags are set we have permission
* to do this.
*/
if ( ( flags_to_test & jnode->st_mode) == flags_to_test )
10d7c5: 8b 43 30 mov 0x30(%ebx),%eax
10d7c8: 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 );
10d7ca: 39 f0 cmp %esi,%eax
10d7cc: 0f 94 c0 sete %al
10d7cf: 0f b6 c0 movzbl %al,%eax
*/
if ( ( flags_to_test & jnode->st_mode) == flags_to_test )
return 1;
return 0;
}
10d7d2: 83 c4 0c add $0xc,%esp
10d7d5: 5b pop %ebx
10d7d6: 5e pop %esi
10d7d7: 5f pop %edi
10d7d8: c9 leave
10d7d9: c3 ret
00107b98 <IMFS_fifo_lseek>:
rtems_off64_t IMFS_fifo_lseek(
rtems_libio_t *iop,
rtems_off64_t offset,
int whence
)
{
107b98: 55 push %ebp
107b99: 89 e5 mov %esp,%ebp
107b9b: 53 push %ebx
107b9c: 83 ec 10 sub $0x10,%esp
107b9f: 8b 45 08 mov 0x8(%ebp),%eax
off_t err = pipe_lseek(LIBIO2PIPE(iop), offset, whence, iop);
107ba2: 50 push %eax
107ba3: ff 75 14 pushl 0x14(%ebp)
107ba6: ff 75 10 pushl 0x10(%ebp)
107ba9: ff 75 0c pushl 0xc(%ebp)
107bac: 8b 40 18 mov 0x18(%eax),%eax
107baf: ff 70 50 pushl 0x50(%eax)
107bb2: e8 fa 86 00 00 call 1102b1 <pipe_lseek>
107bb7: 89 c3 mov %eax,%ebx
IMFS_FIFO_RETURN(err);
107bb9: 83 c4 20 add $0x20,%esp
107bbc: 99 cltd
107bbd: 85 d2 test %edx,%edx
107bbf: 79 0e jns 107bcf <IMFS_fifo_lseek+0x37> <== NEVER TAKEN
107bc1: e8 8e b3 00 00 call 112f54 <__errno>
107bc6: f7 db neg %ebx
107bc8: 89 18 mov %ebx,(%eax)
107bca: 83 c8 ff or $0xffffffff,%eax
107bcd: 89 c2 mov %eax,%edx
}
107bcf: 8b 5d fc mov -0x4(%ebp),%ebx
107bd2: c9 leave
107bd3: c3 ret
00107c34 <IMFS_fifo_write>:
ssize_t IMFS_fifo_write(
rtems_libio_t *iop,
const void *buffer,
size_t count
)
{
107c34: 55 push %ebp
107c35: 89 e5 mov %esp,%ebp
107c37: 56 push %esi
107c38: 53 push %ebx
107c39: 83 ec 10 sub $0x10,%esp
107c3c: 8b 45 08 mov 0x8(%ebp),%eax
IMFS_jnode_t *jnode = iop->pathinfo.node_access;
107c3f: 8b 70 18 mov 0x18(%eax),%esi
int err = pipe_write(JNODE2PIPE(jnode), buffer, count, iop);
107c42: 50 push %eax
107c43: ff 75 10 pushl 0x10(%ebp)
107c46: ff 75 0c pushl 0xc(%ebp)
107c49: ff 76 50 pushl 0x50(%esi)
107c4c: e8 5c 84 00 00 call 1100ad <pipe_write>
107c51: 89 c3 mov %eax,%ebx
if (err > 0) {
107c53: 83 c4 10 add $0x10,%esp
107c56: 83 f8 00 cmp $0x0,%eax
107c59: 7e 1d jle 107c78 <IMFS_fifo_write+0x44>
IMFS_mtime_ctime_update(jnode);
107c5b: 50 push %eax
107c5c: 50 push %eax
107c5d: 6a 00 push $0x0
107c5f: 8d 45 f0 lea -0x10(%ebp),%eax
107c62: 50 push %eax
107c63: e8 ec 0d 00 00 call 108a54 <gettimeofday>
107c68: 8b 45 f0 mov -0x10(%ebp),%eax
107c6b: 89 46 44 mov %eax,0x44(%esi)
107c6e: 89 46 48 mov %eax,0x48(%esi)
107c71: 83 c4 10 add $0x10,%esp
107c74: 89 d8 mov %ebx,%eax
107c76: eb 13 jmp 107c8b <IMFS_fifo_write+0x57>
}
IMFS_FIFO_RETURN(err);
107c78: b8 00 00 00 00 mov $0x0,%eax
107c7d: 74 0c je 107c8b <IMFS_fifo_write+0x57> <== NEVER TAKEN
107c7f: e8 d0 b2 00 00 call 112f54 <__errno>
107c84: f7 db neg %ebx
107c86: 89 18 mov %ebx,(%eax)
107c88: 83 c8 ff or $0xffffffff,%eax
}
107c8b: 8d 65 f8 lea -0x8(%ebp),%esp
107c8e: 5b pop %ebx
107c8f: 5e pop %esi
107c90: c9 leave
107c91: c3 ret
0010ddac <IMFS_find_match_in_dir>:
IMFS_jnode_t *IMFS_find_match_in_dir(
IMFS_jnode_t *directory,
char *name
)
{
10ddac: 55 push %ebp
10ddad: 89 e5 mov %esp,%ebp
10ddaf: 57 push %edi
10ddb0: 56 push %esi
10ddb1: 53 push %ebx
10ddb2: 83 ec 14 sub $0x14,%esp
10ddb5: 8b 5d 08 mov 0x8(%ebp),%ebx
10ddb8: 8b 7d 0c mov 0xc(%ebp),%edi
/*
* Check for "." and ".."
*/
if ( !strcmp( name, dotname ) )
10ddbb: 68 f4 f3 11 00 push $0x11f3f4
10ddc0: 57 push %edi
10ddc1: e8 36 40 00 00 call 111dfc <strcmp>
10ddc6: 83 c4 10 add $0x10,%esp
10ddc9: 85 c0 test %eax,%eax
10ddcb: 74 40 je 10de0d <IMFS_find_match_in_dir+0x61><== NEVER TAKEN
return directory;
if ( !strcmp( name, dotdotname ) )
10ddcd: 51 push %ecx
10ddce: 51 push %ecx
10ddcf: 68 f6 f3 11 00 push $0x11f3f6
10ddd4: 57 push %edi
10ddd5: e8 22 40 00 00 call 111dfc <strcmp>
10ddda: 83 c4 10 add $0x10,%esp
10dddd: 85 c0 test %eax,%eax
10dddf: 75 05 jne 10dde6 <IMFS_find_match_in_dir+0x3a><== ALWAYS TAKEN
return directory->Parent;
10dde1: 8b 5b 08 mov 0x8(%ebx),%ebx <== NOT EXECUTED
10dde4: eb 27 jmp 10de0d <IMFS_find_match_in_dir+0x61><== NOT EXECUTED
if ( !strcmp( name, the_jnode->name ) )
return the_jnode;
}
return 0;
}
10dde6: 8b 73 50 mov 0x50(%ebx),%esi
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
10dde9: 83 c3 54 add $0x54,%ebx
if ( !strcmp( name, dotdotname ) )
return directory->Parent;
the_chain = &directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
10ddec: eb 15 jmp 10de03 <IMFS_find_match_in_dir+0x57>
!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 ) )
10ddee: 8d 46 0c lea 0xc(%esi),%eax
10ddf1: 52 push %edx
10ddf2: 52 push %edx
10ddf3: 50 push %eax
10ddf4: 57 push %edi
10ddf5: e8 02 40 00 00 call 111dfc <strcmp>
10ddfa: 83 c4 10 add $0x10,%esp
10ddfd: 85 c0 test %eax,%eax
10ddff: 74 0a je 10de0b <IMFS_find_match_in_dir+0x5f>
the_chain = &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 ) {
10de01: 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 );
10de03: 39 de cmp %ebx,%esi
10de05: 75 e7 jne 10ddee <IMFS_find_match_in_dir+0x42>
if ( !strcmp( name, the_jnode->name ) )
return the_jnode;
}
return 0;
10de07: 31 db xor %ebx,%ebx
10de09: eb 02 jmp 10de0d <IMFS_find_match_in_dir+0x61>
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;
10de0b: 89 f3 mov %esi,%ebx
if ( !strcmp( name, the_jnode->name ) )
return the_jnode;
}
return 0;
}
10de0d: 89 d8 mov %ebx,%eax
10de0f: 8d 65 f4 lea -0xc(%ebp),%esp
10de12: 5b pop %ebx
10de13: 5e pop %esi
10de14: 5f pop %edi
10de15: c9 leave
10de16: c3 ret
0010dd28 <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
)
{
10dd28: 55 push %ebp
10dd29: 89 e5 mov %esp,%ebp
10dd2b: 57 push %edi
10dd2c: 56 push %esi
10dd2d: 53 push %ebx
10dd2e: 83 ec 2c sub $0x2c,%esp
10dd31: 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;
10dd34: 8b 58 1c mov 0x1c(%eax),%ebx
loc = temp_mt_entry->mt_fs_root;
10dd37: 8d 7d d4 lea -0x2c(%ebp),%edi
10dd3a: 8d 70 1c lea 0x1c(%eax),%esi
10dd3d: b9 05 00 00 00 mov $0x5,%ecx
10dd42: 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;
10dd44: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax)
do {
next = jnode->Parent;
loc.node_access = (void *)jnode;
IMFS_Set_handlers( &loc );
10dd4b: 8d 75 d4 lea -0x2c(%ebp),%esi
*/
temp_mt_entry->mt_fs_root.node_access = NULL;
do {
next = jnode->Parent;
10dd4e: 8b 7b 08 mov 0x8(%ebx),%edi
loc.node_access = (void *)jnode;
10dd51: 89 5d d4 mov %ebx,-0x2c(%ebp)
IMFS_Set_handlers( &loc );
10dd54: 83 ec 0c sub $0xc,%esp
10dd57: 56 push %esi
10dd58: e8 db f9 ff ff call 10d738 <IMFS_Set_handlers>
if ( jnode->type != IMFS_DIRECTORY ) {
10dd5d: 83 c4 10 add $0x10,%esp
10dd60: 83 7b 4c 01 cmpl $0x1,0x4c(%ebx)
10dd64: 75 08 jne 10dd6e <IMFS_fsunmount+0x46>
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10dd66: 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 ) ) {
10dd69: 39 43 50 cmp %eax,0x50(%ebx)
10dd6c: 75 13 jne 10dd81 <IMFS_fsunmount+0x59>
result = IMFS_unlink( NULL, &loc );
10dd6e: 50 push %eax
10dd6f: 50 push %eax
10dd70: 56 push %esi
10dd71: 6a 00 push $0x0
10dd73: e8 9c 91 ff ff call 106f14 <IMFS_unlink>
if (result != 0)
10dd78: 83 c4 10 add $0x10,%esp
10dd7b: 85 c0 test %eax,%eax
10dd7d: 75 1e jne 10dd9d <IMFS_fsunmount+0x75> <== NEVER TAKEN
return -1;
jnode = next;
10dd7f: 89 fb mov %edi,%ebx
}
if ( jnode != NULL ) {
10dd81: 85 db test %ebx,%ebx
10dd83: 74 1d je 10dda2 <IMFS_fsunmount+0x7a>
if ( jnode->type == IMFS_DIRECTORY ) {
10dd85: 83 7b 4c 01 cmpl $0x1,0x4c(%ebx)
10dd89: 75 c3 jne 10dd4e <IMFS_fsunmount+0x26> <== NEVER TAKEN
}
}
} while (jnode != NULL);
return 0;
}
10dd8b: 8b 43 50 mov 0x50(%ebx),%eax
10dd8e: 8d 53 54 lea 0x54(%ebx),%edx
return -1;
jnode = next;
}
if ( jnode != NULL ) {
if ( jnode->type == IMFS_DIRECTORY ) {
if ( jnode_has_children( jnode ) )
10dd91: 39 d0 cmp %edx,%eax
10dd93: 74 b9 je 10dd4e <IMFS_fsunmount+0x26>
jnode = jnode_get_first_child( jnode );
10dd95: 89 c3 mov %eax,%ebx
}
}
} while (jnode != NULL);
10dd97: 85 c0 test %eax,%eax
10dd99: 75 b3 jne 10dd4e <IMFS_fsunmount+0x26> <== ALWAYS TAKEN
10dd9b: eb 05 jmp 10dda2 <IMFS_fsunmount+0x7a> <== NOT EXECUTED
return -1;
jnode = next;
} else if ( jnode_has_no_children( jnode ) ) {
result = IMFS_unlink( NULL, &loc );
if (result != 0)
return -1;
10dd9d: 83 c8 ff or $0xffffffff,%eax <== NOT EXECUTED
10dda0: eb 02 jmp 10dda4 <IMFS_fsunmount+0x7c> <== NOT EXECUTED
jnode = jnode_get_first_child( jnode );
}
}
} while (jnode != NULL);
return 0;
10dda2: 31 c0 xor %eax,%eax
}
10dda4: 8d 65 f4 lea -0xc(%ebp),%esp
10dda7: 5b pop %ebx
10dda8: 5e pop %esi
10dda9: 5f pop %edi
10ddaa: c9 leave
10ddab: c3 ret
0010de18 <IMFS_get_token>:
const char *path,
int pathlen,
char *token,
int *token_len
)
{
10de18: 55 push %ebp
10de19: 89 e5 mov %esp,%ebp
10de1b: 57 push %edi
10de1c: 56 push %esi
10de1d: 53 push %ebx
10de1e: 83 ec 1c sub $0x1c,%esp
10de21: 8b 7d 08 mov 0x8(%ebp),%edi
10de24: 8b 75 10 mov 0x10(%ebp),%esi
register char c;
/*
* Copy a name into token. (Remember NULL is a token.)
*/
c = path[i];
10de27: 8a 17 mov (%edi),%dl
int pathlen,
char *token,
int *token_len
)
{
register int i = 0;
10de29: 31 db xor %ebx,%ebx
/*
* Copy a name into token. (Remember NULL is a token.)
*/
c = path[i];
while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) {
10de2b: eb 10 jmp 10de3d <IMFS_get_token+0x25>
token[i] = c;
10de2d: 88 14 1e mov %dl,(%esi,%ebx,1)
if ( i == IMFS_NAME_MAX )
10de30: 83 fb 20 cmp $0x20,%ebx
10de33: 0f 84 86 00 00 00 je 10debf <IMFS_get_token+0xa7>
return IMFS_INVALID_TOKEN;
if ( !IMFS_is_valid_name_char(c) )
type = IMFS_INVALID_TOKEN;
c = path [++i];
10de39: 43 inc %ebx
10de3a: 8a 14 1f mov (%edi,%ebx,1),%dl
/*
* Copy a name into token. (Remember NULL is a token.)
*/
c = path[i];
while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) {
10de3d: 83 ec 0c sub $0xc,%esp
10de40: 0f be c2 movsbl %dl,%eax
10de43: 50 push %eax
10de44: 88 55 e4 mov %dl,-0x1c(%ebp)
10de47: e8 08 a2 ff ff call 108054 <rtems_filesystem_is_separator>
10de4c: 83 c4 10 add $0x10,%esp
10de4f: 85 c0 test %eax,%eax
10de51: 8a 55 e4 mov -0x1c(%ebp),%dl
10de54: 75 05 jne 10de5b <IMFS_get_token+0x43>
10de56: 3b 5d 0c cmp 0xc(%ebp),%ebx
10de59: 7c d2 jl 10de2d <IMFS_get_token+0x15>
/*
* Copy a seperator into token.
*/
if ( i == 0 ) {
10de5b: 85 db test %ebx,%ebx
10de5d: 75 10 jne 10de6f <IMFS_get_token+0x57>
token[i] = c;
10de5f: 88 16 mov %dl,(%esi)
if ( (token[i] != '\0') && pathlen ) {
10de61: 84 d2 test %dl,%dl
10de63: 74 06 je 10de6b <IMFS_get_token+0x53>
10de65: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)
10de69: 75 16 jne 10de81 <IMFS_get_token+0x69>
i++;
type = IMFS_CURRENT_DIR;
} else {
type = IMFS_NO_MORE_PATH;
10de6b: 31 ff xor %edi,%edi
10de6d: eb 1c jmp 10de8b <IMFS_get_token+0x73>
char *token,
int *token_len
)
{
register int i = 0;
IMFS_token_types type = IMFS_NAME;
10de6f: bf 03 00 00 00 mov $0x3,%edi
i++;
type = IMFS_CURRENT_DIR;
} else {
type = IMFS_NO_MORE_PATH;
}
} else if (token[ i-1 ] != '\0') {
10de74: 80 7c 1e ff 00 cmpb $0x0,-0x1(%esi,%ebx,1)
10de79: 74 10 je 10de8b <IMFS_get_token+0x73> <== NEVER TAKEN
token[i] = '\0';
10de7b: c6 04 1e 00 movb $0x0,(%esi,%ebx,1)
10de7f: eb 0a jmp 10de8b <IMFS_get_token+0x73>
if ( i == 0 ) {
token[i] = c;
if ( (token[i] != '\0') && pathlen ) {
i++;
type = IMFS_CURRENT_DIR;
10de81: bf 01 00 00 00 mov $0x1,%edi
if ( i == 0 ) {
token[i] = c;
if ( (token[i] != '\0') && pathlen ) {
i++;
10de86: bb 01 00 00 00 mov $0x1,%ebx
/*
* Set token_len to the number of characters copied.
*/
*token_len = i;
10de8b: 8b 45 14 mov 0x14(%ebp),%eax
10de8e: 89 18 mov %ebx,(%eax)
/*
* If we copied something that was not a seperator see if
* it was a special name.
*/
if ( type == IMFS_NAME ) {
10de90: 83 ff 03 cmp $0x3,%edi
10de93: 75 3d jne 10ded2 <IMFS_get_token+0xba>
if ( strcmp( token, "..") == 0 )
10de95: 52 push %edx
10de96: 52 push %edx
10de97: 68 f9 f3 11 00 push $0x11f3f9
10de9c: 56 push %esi
10de9d: e8 5a 3f 00 00 call 111dfc <strcmp>
10dea2: 83 c4 10 add $0x10,%esp
10dea5: 85 c0 test %eax,%eax
10dea7: 74 1d je 10dec6 <IMFS_get_token+0xae>
type = IMFS_UP_DIR;
else if ( strcmp( token, "." ) == 0 )
10dea9: 50 push %eax
10deaa: 50 push %eax
10deab: 68 fa f3 11 00 push $0x11f3fa
10deb0: 56 push %esi
10deb1: e8 46 3f 00 00 call 111dfc <strcmp>
10deb6: 83 c4 10 add $0x10,%esp
10deb9: 85 c0 test %eax,%eax
10debb: 74 10 je 10decd <IMFS_get_token+0xb5>
10debd: eb 13 jmp 10ded2 <IMFS_get_token+0xba>
while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) {
token[i] = c;
if ( i == IMFS_NAME_MAX )
return IMFS_INVALID_TOKEN;
10debf: bf 04 00 00 00 mov $0x4,%edi
10dec4: eb 0c jmp 10ded2 <IMFS_get_token+0xba>
* it was a special name.
*/
if ( type == IMFS_NAME ) {
if ( strcmp( token, "..") == 0 )
type = IMFS_UP_DIR;
10dec6: bf 02 00 00 00 mov $0x2,%edi
10decb: eb 05 jmp 10ded2 <IMFS_get_token+0xba>
else if ( strcmp( token, "." ) == 0 )
type = IMFS_CURRENT_DIR;
10decd: bf 01 00 00 00 mov $0x1,%edi
}
return type;
}
10ded2: 89 f8 mov %edi,%eax
10ded4: 8d 65 f4 lea -0xc(%ebp),%esp
10ded7: 5b pop %ebx
10ded8: 5e pop %esi
10ded9: 5f pop %edi
10deda: c9 leave
10dedb: c3 ret
00106bac <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
)
{
106bac: 55 push %ebp
106bad: 89 e5 mov %esp,%ebp
106baf: 57 push %edi
106bb0: 56 push %esi
106bb1: 53 push %ebx
106bb2: 83 ec 1c sub $0x1c,%esp
106bb5: 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,
106bb8: a1 48 11 12 00 mov 0x121148,%eax
106bbd: b9 06 00 00 00 mov $0x6,%ecx
int bit_mask;
/*
* check, whether requested bytes per block is valid
*/
for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) {
106bc2: ba 10 00 00 00 mov $0x10,%edx
if (bit_mask == requested_bytes_per_block) {
106bc7: 39 c2 cmp %eax,%edx
106bc9: 74 0c je 106bd7 <IMFS_initialize_support+0x2b>
is_valid = true;
break;
}
if(bit_mask > requested_bytes_per_block)
106bcb: 7f 05 jg 106bd2 <IMFS_initialize_support+0x26>
int bit_mask;
/*
* check, whether requested bytes per block is valid
*/
for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) {
106bcd: d1 e2 shl %edx
106bcf: 49 dec %ecx
106bd0: 75 f5 jne 106bc7 <IMFS_initialize_support+0x1b><== ALWAYS TAKEN
if(bit_mask > requested_bytes_per_block)
break;
}
*dest_bytes_per_block = ((is_valid)
? requested_bytes_per_block
: default_bytes_per_block);
106bd2: b8 80 00 00 00 mov $0x80,%eax
break;
}
if(bit_mask > requested_bytes_per_block)
break;
}
*dest_bytes_per_block = ((is_valid)
106bd7: a3 ec 4e 12 00 mov %eax,0x124eec
/*
* 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();
106bdc: e8 22 6b 00 00 call 10d703 <IMFS_create_root_node>
106be1: 89 c2 mov %eax,%edx
106be3: 89 43 1c mov %eax,0x1c(%ebx)
temp_mt_entry->mt_fs_root.handlers = directory_handlers;
106be6: 8b 45 14 mov 0x14(%ebp),%eax
106be9: 89 43 24 mov %eax,0x24(%ebx)
temp_mt_entry->mt_fs_root.ops = op_table;
106bec: 8b 45 0c mov 0xc(%ebp),%eax
106bef: 89 43 28 mov %eax,0x28(%ebx)
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
106bf2: 8d 7b 38 lea 0x38(%ebx),%edi
106bf5: be a8 f3 11 00 mov $0x11f3a8,%esi
106bfa: b9 0c 00 00 00 mov $0xc,%ecx
106bff: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/*
* Create custom file system data.
*/
fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) );
106c01: 50 push %eax
106c02: 50 push %eax
106c03: 6a 14 push $0x14
106c05: 6a 01 push $0x1
106c07: 89 55 e4 mov %edx,-0x1c(%ebp)
106c0a: e8 fd 05 00 00 call 10720c <calloc>
if ( !fs_info ) {
106c0f: 83 c4 10 add $0x10,%esp
106c12: 85 c0 test %eax,%eax
106c14: 8b 55 e4 mov -0x1c(%ebp),%edx
106c17: 75 1c jne 106c35 <IMFS_initialize_support+0x89>
free(temp_mt_entry->mt_fs_root.node_access);
106c19: 83 ec 0c sub $0xc,%esp
106c1c: 52 push %edx
106c1d: e8 56 07 00 00 call 107378 <free>
rtems_set_errno_and_return_minus_one(ENOMEM);
106c22: e8 11 a5 00 00 call 111138 <__errno>
106c27: c7 00 0c 00 00 00 movl $0xc,(%eax)
106c2d: 83 c4 10 add $0x10,%esp
106c30: 83 c8 ff or $0xffffffff,%eax
106c33: eb 34 jmp 106c69 <IMFS_initialize_support+0xbd>
}
temp_mt_entry->fs_info = fs_info;
106c35: 89 43 34 mov %eax,0x34(%ebx)
/*
* Set st_ino for the root to 1.
*/
fs_info->instance = imfs_instance++;
106c38: 8b 0d f0 4e 12 00 mov 0x124ef0,%ecx
106c3e: 89 08 mov %ecx,(%eax)
106c40: 41 inc %ecx
106c41: 89 0d f0 4e 12 00 mov %ecx,0x124ef0
fs_info->ino_count = 1;
106c47: c7 40 04 01 00 00 00 movl $0x1,0x4(%eax)
fs_info->memfile_handlers = memfile_handlers;
106c4e: 8b 4d 10 mov 0x10(%ebp),%ecx
106c51: 89 48 08 mov %ecx,0x8(%eax)
fs_info->directory_handlers = directory_handlers;
106c54: 8b 4d 14 mov 0x14(%ebp),%ecx
106c57: 89 48 0c mov %ecx,0xc(%eax)
fs_info->fifo_handlers = fifo_handlers;
106c5a: 8b 4d 18 mov 0x18(%ebp),%ecx
106c5d: 89 48 10 mov %ecx,0x10(%eax)
jnode = temp_mt_entry->mt_fs_root.node_access;
jnode->st_ino = fs_info->ino_count;
106c60: c7 42 38 01 00 00 00 movl $0x1,0x38(%edx)
return 0;
106c67: 31 c0 xor %eax,%eax
}
106c69: 8d 65 f4 lea -0xc(%ebp),%esp
106c6c: 5b pop %ebx
106c6d: 5e pop %esi
106c6e: 5f pop %edi
106c6f: c9 leave
106c70: c3 ret
00110102 <IMFS_memfile_extend>:
*/
MEMFILE_STATIC int IMFS_memfile_extend(
IMFS_jnode_t *the_jnode,
off_t new_length
)
{
110102: 55 push %ebp
110103: 89 e5 mov %esp,%ebp
110105: 57 push %edi
110106: 56 push %esi
110107: 53 push %ebx
110108: 83 ec 2c sub $0x2c,%esp
11010b: 8b 7d 08 mov 0x8(%ebp),%edi
11010e: 8b 5d 0c mov 0xc(%ebp),%ebx
110111: 8b 75 10 mov 0x10(%ebp),%esi
IMFS_assert( the_jnode->type == IMFS_MEMORY_FILE );
/*
* Verify new file size is supported
*/
if ( new_length >= IMFS_MEMFILE_MAXIMUM_SIZE )
110114: a1 ec 4e 12 00 mov 0x124eec,%eax
110119: 89 c1 mov %eax,%ecx
11011b: c1 e9 02 shr $0x2,%ecx
11011e: 8d 51 01 lea 0x1(%ecx),%edx
110121: 0f af d1 imul %ecx,%edx
110124: 42 inc %edx
110125: 0f af d1 imul %ecx,%edx
110128: 4a dec %edx
110129: 0f af d0 imul %eax,%edx
11012c: 83 fe 00 cmp $0x0,%esi
11012f: 7c 16 jl 110147 <IMFS_memfile_extend+0x45><== NEVER TAKEN
110131: 7f 04 jg 110137 <IMFS_memfile_extend+0x35><== NEVER TAKEN
110133: 39 d3 cmp %edx,%ebx
110135: 72 10 jb 110147 <IMFS_memfile_extend+0x45>
rtems_set_errno_and_return_minus_one( EINVAL );
110137: e8 fc 0f 00 00 call 111138 <__errno>
11013c: c7 00 16 00 00 00 movl $0x16,(%eax)
110142: e9 92 00 00 00 jmp 1101d9 <IMFS_memfile_extend+0xd7>
/*
* Verify new file size is actually larger than current size
*/
if ( new_length <= the_jnode->info.file.size )
110147: 8b 57 50 mov 0x50(%edi),%edx
11014a: 8b 4f 54 mov 0x54(%edi),%ecx
11014d: 89 55 e0 mov %edx,-0x20(%ebp)
110150: 89 4d e4 mov %ecx,-0x1c(%ebp)
110153: 39 ce cmp %ecx,%esi
110155: 0f 8c 8f 00 00 00 jl 1101ea <IMFS_memfile_extend+0xe8><== NEVER TAKEN
11015b: 7f 08 jg 110165 <IMFS_memfile_extend+0x63><== NEVER TAKEN
11015d: 39 d3 cmp %edx,%ebx
11015f: 0f 86 85 00 00 00 jbe 1101ea <IMFS_memfile_extend+0xe8>
return 0;
/*
* Calculate the number of range of blocks to allocate
*/
new_blocks = new_length / IMFS_MEMFILE_BYTES_PER_BLOCK;
110165: 89 45 d8 mov %eax,-0x28(%ebp)
110168: 89 c1 mov %eax,%ecx
11016a: c1 f9 1f sar $0x1f,%ecx
11016d: 89 4d dc mov %ecx,-0x24(%ebp)
110170: ff 75 dc pushl -0x24(%ebp)
110173: ff 75 d8 pushl -0x28(%ebp)
110176: 56 push %esi
110177: 53 push %ebx
110178: e8 43 c8 00 00 call 11c9c0 <__divdi3>
11017d: 83 c4 10 add $0x10,%esp
110180: 89 45 d4 mov %eax,-0x2c(%ebp)
old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK;
110183: ff 75 dc pushl -0x24(%ebp)
110186: ff 75 d8 pushl -0x28(%ebp)
110189: ff 75 e4 pushl -0x1c(%ebp)
11018c: ff 75 e0 pushl -0x20(%ebp)
11018f: e8 2c c8 00 00 call 11c9c0 <__divdi3>
110194: 83 c4 10 add $0x10,%esp
110197: 89 45 e0 mov %eax,-0x20(%ebp)
/*
* Now allocate each of those blocks.
*/
for ( block=old_blocks ; block<=new_blocks ; block++ ) {
11019a: 89 c2 mov %eax,%edx
11019c: eb 41 jmp 1101df <IMFS_memfile_extend+0xdd>
if ( IMFS_memfile_addblock( the_jnode, block ) ) {
11019e: 51 push %ecx
11019f: 51 push %ecx
1101a0: 52 push %edx
1101a1: 57 push %edi
1101a2: 89 55 d0 mov %edx,-0x30(%ebp)
1101a5: e8 99 fd ff ff call 10ff43 <IMFS_memfile_addblock>
1101aa: 83 c4 10 add $0x10,%esp
1101ad: 85 c0 test %eax,%eax
1101af: 8b 55 d0 mov -0x30(%ebp),%edx
1101b2: 74 2a je 1101de <IMFS_memfile_extend+0xdc>
1101b4: eb 13 jmp 1101c9 <IMFS_memfile_extend+0xc7>
for ( ; block>=old_blocks ; block-- ) {
IMFS_memfile_remove_block( the_jnode, block );
1101b6: 50 push %eax
1101b7: 50 push %eax
1101b8: 52 push %edx
1101b9: 57 push %edi
1101ba: 89 55 d0 mov %edx,-0x30(%ebp)
1101bd: e8 16 ff ff ff call 1100d8 <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-- ) {
1101c2: 8b 55 d0 mov -0x30(%ebp),%edx
1101c5: 4a dec %edx
1101c6: 83 c4 10 add $0x10,%esp
1101c9: 3b 55 e0 cmp -0x20(%ebp),%edx
1101cc: 73 e8 jae 1101b6 <IMFS_memfile_extend+0xb4>
IMFS_memfile_remove_block( the_jnode, block );
}
rtems_set_errno_and_return_minus_one( ENOSPC );
1101ce: e8 65 0f 00 00 call 111138 <__errno>
1101d3: c7 00 1c 00 00 00 movl $0x1c,(%eax)
1101d9: 83 c8 ff or $0xffffffff,%eax
1101dc: eb 0e jmp 1101ec <IMFS_memfile_extend+0xea>
old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK;
/*
* Now allocate each of those blocks.
*/
for ( block=old_blocks ; block<=new_blocks ; block++ ) {
1101de: 42 inc %edx
1101df: 3b 55 d4 cmp -0x2c(%ebp),%edx
1101e2: 76 ba jbe 11019e <IMFS_memfile_extend+0x9c>
}
/*
* Set the new length of the file.
*/
the_jnode->info.file.size = new_length;
1101e4: 89 5f 50 mov %ebx,0x50(%edi)
1101e7: 89 77 54 mov %esi,0x54(%edi)
/*
* Verify new file size is actually larger than current size
*/
if ( new_length <= the_jnode->info.file.size )
return 0;
1101ea: 31 c0 xor %eax,%eax
/*
* Set the new length of the file.
*/
the_jnode->info.file.size = new_length;
return 0;
}
1101ec: 8d 65 f4 lea -0xc(%ebp),%esp
1101ef: 5b pop %ebx
1101f0: 5e pop %esi
1101f1: 5f pop %edi
1101f2: c9 leave
1101f3: c3 ret
0010fc48 <IMFS_memfile_get_block_pointer>:
#endif
IMFS_jnode_t *the_jnode,
unsigned int block,
int malloc_it
)
{
10fc48: 55 push %ebp
10fc49: 89 e5 mov %esp,%ebp
10fc4b: 57 push %edi
10fc4c: 56 push %esi
10fc4d: 53 push %ebx
10fc4e: 83 ec 1c sub $0x1c,%esp
10fc51: 8b 75 08 mov 0x8(%ebp),%esi
10fc54: 8b 7d 0c mov 0xc(%ebp),%edi
my_block = block;
/*
* Is the block number in the simple indirect portion?
*/
if ( my_block <= LAST_INDIRECT ) {
10fc57: 8b 0d ec 4e 12 00 mov 0x124eec,%ecx
10fc5d: c1 e9 02 shr $0x2,%ecx
10fc60: 8d 41 ff lea -0x1(%ecx),%eax
10fc63: 39 c7 cmp %eax,%edi
10fc65: 77 40 ja 10fca7 <IMFS_memfile_get_block_pointer+0x5f>
p = info->indirect;
10fc67: 8b 46 58 mov 0x58(%esi),%eax
if ( malloc_it ) {
10fc6a: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
10fc6e: 74 25 je 10fc95 <IMFS_memfile_get_block_pointer+0x4d>
if ( !p ) {
10fc70: 85 c0 test %eax,%eax
10fc72: 75 12 jne 10fc86 <IMFS_memfile_get_block_pointer+0x3e>
p = memfile_alloc_block();
10fc74: e8 ad ff ff ff call 10fc26 <memfile_alloc_block>
if ( !p )
return 0;
10fc79: 31 db xor %ebx,%ebx
if ( malloc_it ) {
if ( !p ) {
p = memfile_alloc_block();
if ( !p )
10fc7b: 85 c0 test %eax,%eax
10fc7d: 0f 84 f7 00 00 00 je 10fd7a <IMFS_memfile_get_block_pointer+0x132><== NEVER TAKEN
return 0;
info->indirect = p;
10fc83: 89 46 58 mov %eax,0x58(%esi)
}
return &info->indirect[ my_block ];
10fc86: 8d 1c bd 00 00 00 00 lea 0x0(,%edi,4),%ebx
10fc8d: 03 5e 58 add 0x58(%esi),%ebx
10fc90: e9 e5 00 00 00 jmp 10fd7a <IMFS_memfile_get_block_pointer+0x132>
}
if ( !p )
return 0;
10fc95: 31 db xor %ebx,%ebx
info->indirect = p;
}
return &info->indirect[ my_block ];
}
if ( !p )
10fc97: 85 c0 test %eax,%eax
10fc99: 0f 84 db 00 00 00 je 10fd7a <IMFS_memfile_get_block_pointer+0x132><== NEVER TAKEN
return 0;
return &info->indirect[ my_block ];
10fc9f: 8d 1c b8 lea (%eax,%edi,4),%ebx
10fca2: e9 d3 00 00 00 jmp 10fd7a <IMFS_memfile_get_block_pointer+0x132>
/*
* Is the block number in the doubly indirect portion?
*/
if ( my_block <= LAST_DOUBLY_INDIRECT ) {
10fca7: 8d 41 01 lea 0x1(%ecx),%eax
10fcaa: 0f af c1 imul %ecx,%eax
10fcad: 8d 50 ff lea -0x1(%eax),%edx
10fcb0: 39 d7 cmp %edx,%edi
10fcb2: 77 40 ja 10fcf4 <IMFS_memfile_get_block_pointer+0xac>
my_block -= FIRST_DOUBLY_INDIRECT;
10fcb4: 29 cf sub %ecx,%edi
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
10fcb6: 89 f8 mov %edi,%eax
10fcb8: 31 d2 xor %edx,%edx
10fcba: f7 f1 div %ecx
10fcbc: 89 55 e4 mov %edx,-0x1c(%ebp)
10fcbf: 89 c7 mov %eax,%edi
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
p = info->doubly_indirect;
10fcc1: 8b 46 5c mov 0x5c(%esi),%eax
if ( malloc_it ) {
10fcc4: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
10fcc8: 74 1b je 10fce5 <IMFS_memfile_get_block_pointer+0x9d>
if ( !p ) {
10fcca: 85 c0 test %eax,%eax
10fccc: 75 12 jne 10fce0 <IMFS_memfile_get_block_pointer+0x98>
p = memfile_alloc_block();
10fcce: e8 53 ff ff ff call 10fc26 <memfile_alloc_block>
if ( !p )
return 0;
10fcd3: 31 db xor %ebx,%ebx
p = info->doubly_indirect;
if ( malloc_it ) {
if ( !p ) {
p = memfile_alloc_block();
if ( !p )
10fcd5: 85 c0 test %eax,%eax
10fcd7: 0f 84 9d 00 00 00 je 10fd7a <IMFS_memfile_get_block_pointer+0x132><== NEVER TAKEN
return 0;
info->doubly_indirect = p;
10fcdd: 89 46 5c mov %eax,0x5c(%esi)
}
p1 = (block_p *)p[ doubly ];
10fce0: 8d 34 b8 lea (%eax,%edi,4),%esi
10fce3: eb 65 jmp 10fd4a <IMFS_memfile_get_block_pointer+0x102>
return (block_p *)&p1[ singly ];
}
if ( !p )
return 0;
10fce5: 31 db xor %ebx,%ebx
}
return (block_p *)&p1[ singly ];
}
if ( !p )
10fce7: 85 c0 test %eax,%eax
10fce9: 0f 84 8b 00 00 00 je 10fd7a <IMFS_memfile_get_block_pointer+0x132><== NEVER TAKEN
return 0;
p = (block_p *)p[ doubly ];
10fcef: 8b 04 b8 mov (%eax,%edi,4),%eax
10fcf2: eb 7c jmp 10fd70 <IMFS_memfile_get_block_pointer+0x128>
}
/*
* Is the block number in the triply indirect portion?
*/
if ( my_block <= LAST_TRIPLY_INDIRECT ) {
10fcf4: 8d 50 01 lea 0x1(%eax),%edx
10fcf7: 0f af d1 imul %ecx,%edx
10fcfa: 4a dec %edx
}
/*
* This means the requested block number is out of range.
*/
return 0;
10fcfb: 31 db xor %ebx,%ebx
}
/*
* Is the block number in the triply indirect portion?
*/
if ( my_block <= LAST_TRIPLY_INDIRECT ) {
10fcfd: 39 d7 cmp %edx,%edi
10fcff: 77 79 ja 10fd7a <IMFS_memfile_get_block_pointer+0x132><== NEVER TAKEN
my_block -= FIRST_TRIPLY_INDIRECT;
10fd01: 29 c7 sub %eax,%edi
10fd03: 89 f8 mov %edi,%eax
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
10fd05: 31 d2 xor %edx,%edx
10fd07: f7 f1 div %ecx
10fd09: 89 55 e4 mov %edx,-0x1c(%ebp)
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS;
10fd0c: 31 d2 xor %edx,%edx
10fd0e: f7 f1 div %ecx
10fd10: 89 55 e0 mov %edx,-0x20(%ebp)
10fd13: 89 c7 mov %eax,%edi
doubly %= IMFS_MEMFILE_BLOCK_SLOTS;
p = info->triply_indirect;
10fd15: 8b 46 60 mov 0x60(%esi),%eax
if ( malloc_it ) {
10fd18: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
10fd1c: 74 41 je 10fd5f <IMFS_memfile_get_block_pointer+0x117>
if ( !p ) {
10fd1e: 85 c0 test %eax,%eax
10fd20: 75 0c jne 10fd2e <IMFS_memfile_get_block_pointer+0xe6>
p = memfile_alloc_block();
10fd22: e8 ff fe ff ff call 10fc26 <memfile_alloc_block>
if ( !p )
10fd27: 85 c0 test %eax,%eax
10fd29: 74 4f je 10fd7a <IMFS_memfile_get_block_pointer+0x132><== NEVER TAKEN
return 0;
info->triply_indirect = p;
10fd2b: 89 46 60 mov %eax,0x60(%esi)
}
p1 = (block_p *) p[ triply ];
10fd2e: 8d 34 b8 lea (%eax,%edi,4),%esi
10fd31: 8b 06 mov (%esi),%eax
if ( !p1 ) {
10fd33: 85 c0 test %eax,%eax
10fd35: 75 0d jne 10fd44 <IMFS_memfile_get_block_pointer+0xfc>
p1 = memfile_alloc_block();
10fd37: e8 ea fe ff ff call 10fc26 <memfile_alloc_block>
if ( !p1 )
return 0;
10fd3c: 31 db xor %ebx,%ebx
}
p1 = (block_p *) p[ triply ];
if ( !p1 ) {
p1 = memfile_alloc_block();
if ( !p1 )
10fd3e: 85 c0 test %eax,%eax
10fd40: 74 38 je 10fd7a <IMFS_memfile_get_block_pointer+0x132><== NEVER TAKEN
return 0;
p[ triply ] = (block_p) p1;
10fd42: 89 06 mov %eax,(%esi)
}
p2 = (block_p *)p1[ doubly ];
10fd44: 8b 55 e0 mov -0x20(%ebp),%edx
10fd47: 8d 34 90 lea (%eax,%edx,4),%esi
10fd4a: 8b 06 mov (%esi),%eax
if ( !p2 ) {
10fd4c: 85 c0 test %eax,%eax
10fd4e: 75 24 jne 10fd74 <IMFS_memfile_get_block_pointer+0x12c>
p2 = memfile_alloc_block();
10fd50: e8 d1 fe ff ff call 10fc26 <memfile_alloc_block>
if ( !p2 )
return 0;
10fd55: 31 db xor %ebx,%ebx
}
p2 = (block_p *)p1[ doubly ];
if ( !p2 ) {
p2 = memfile_alloc_block();
if ( !p2 )
10fd57: 85 c0 test %eax,%eax
10fd59: 74 1f je 10fd7a <IMFS_memfile_get_block_pointer+0x132><== NEVER TAKEN
return 0;
p1[ doubly ] = (block_p) p2;
10fd5b: 89 06 mov %eax,(%esi)
10fd5d: eb 15 jmp 10fd74 <IMFS_memfile_get_block_pointer+0x12c>
}
return (block_p *)&p2[ singly ];
}
if ( !p )
10fd5f: 85 c0 test %eax,%eax
10fd61: 74 17 je 10fd7a <IMFS_memfile_get_block_pointer+0x132><== NEVER TAKEN
return 0;
p1 = (block_p *) p[ triply ];
10fd63: 8b 04 b8 mov (%eax,%edi,4),%eax
if ( !p1 )
10fd66: 85 c0 test %eax,%eax
10fd68: 74 10 je 10fd7a <IMFS_memfile_get_block_pointer+0x132><== NEVER TAKEN
return 0;
p2 = (block_p *)p1[ doubly ];
10fd6a: 8b 55 e0 mov -0x20(%ebp),%edx
10fd6d: 8b 04 90 mov (%eax,%edx,4),%eax
if ( !p2 )
10fd70: 85 c0 test %eax,%eax
10fd72: 74 06 je 10fd7a <IMFS_memfile_get_block_pointer+0x132><== NEVER TAKEN
return 0;
return (block_p *)&p2[ singly ];
10fd74: 8b 55 e4 mov -0x1c(%ebp),%edx
10fd77: 8d 1c 90 lea (%eax,%edx,4),%ebx
/*
* This means the requested block number is out of range.
*/
return 0;
}
10fd7a: 89 d8 mov %ebx,%eax
10fd7c: 83 c4 1c add $0x1c,%esp
10fd7f: 5b pop %ebx
10fd80: 5e pop %esi
10fd81: 5f pop %edi
10fd82: c9 leave
10fd83: c3 ret
0010fd84 <IMFS_memfile_read>:
IMFS_jnode_t *the_jnode,
off_t start,
unsigned char *destination,
unsigned int length
)
{
10fd84: 55 push %ebp
10fd85: 89 e5 mov %esp,%ebp
10fd87: 57 push %edi
10fd88: 56 push %esi
10fd89: 53 push %ebx
10fd8a: 83 ec 4c sub $0x4c,%esp
10fd8d: 8b 75 0c mov 0xc(%ebp),%esi
10fd90: 8b 7d 10 mov 0x10(%ebp),%edi
10fd93: 8b 5d 18 mov 0x18(%ebp),%ebx
* 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) {
10fd96: 8b 45 08 mov 0x8(%ebp),%eax
10fd99: 83 78 4c 06 cmpl $0x6,0x4c(%eax)
10fd9d: 75 3f jne 10fdde <IMFS_memfile_read+0x5a>
unsigned char *file_ptr;
file_ptr = (unsigned char *)the_jnode->info.linearfile.direct;
10fd9f: 8b 48 58 mov 0x58(%eax),%ecx
if (my_length > (the_jnode->info.linearfile.size - start))
10fda2: 89 c2 mov %eax,%edx
10fda4: 8b 40 50 mov 0x50(%eax),%eax
10fda7: 8b 52 54 mov 0x54(%edx),%edx
10fdaa: 89 45 b0 mov %eax,-0x50(%ebp)
10fdad: 89 55 b4 mov %edx,-0x4c(%ebp)
10fdb0: 29 f0 sub %esi,%eax
10fdb2: 19 fa sbb %edi,%edx
10fdb4: 89 45 d0 mov %eax,-0x30(%ebp)
10fdb7: 89 55 d4 mov %edx,-0x2c(%ebp)
10fdba: 31 c0 xor %eax,%eax
10fdbc: 39 d0 cmp %edx,%eax
10fdbe: 7c 0e jl 10fdce <IMFS_memfile_read+0x4a><== NEVER TAKEN
10fdc0: 7f 05 jg 10fdc7 <IMFS_memfile_read+0x43><== NEVER TAKEN
10fdc2: 3b 5d d0 cmp -0x30(%ebp),%ebx
10fdc5: 76 07 jbe 10fdce <IMFS_memfile_read+0x4a><== NEVER TAKEN
my_length = the_jnode->info.linearfile.size - start;
10fdc7: 8b 55 b0 mov -0x50(%ebp),%edx
10fdca: 29 f2 sub %esi,%edx
10fdcc: eb 02 jmp 10fdd0 <IMFS_memfile_read+0x4c>
/*
* Linear files (as created from a tar file are easier to handle
* than block files).
*/
my_length = length;
10fdce: 89 da mov %ebx,%edx <== 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);
10fdd0: 01 ce add %ecx,%esi
10fdd2: 8b 7d 14 mov 0x14(%ebp),%edi
10fdd5: 89 d1 mov %edx,%ecx
10fdd7: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
10fdd9: e9 1d 01 00 00 jmp 10fefb <IMFS_memfile_read+0x177>
/*
* 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;
10fdde: 89 f0 mov %esi,%eax
if ( last_byte > the_jnode->info.file.size )
10fde0: 8b 55 08 mov 0x8(%ebp),%edx
10fde3: 8b 52 50 mov 0x50(%edx),%edx
10fde6: 89 55 cc mov %edx,-0x34(%ebp)
/*
* 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;
10fde9: 8d 0c 33 lea (%ebx,%esi,1),%ecx
10fdec: 89 4d d0 mov %ecx,-0x30(%ebp)
if ( last_byte > the_jnode->info.file.size )
10fdef: 31 c9 xor %ecx,%ecx
10fdf1: 8b 55 08 mov 0x8(%ebp),%edx
10fdf4: 3b 4a 54 cmp 0x54(%edx),%ecx
10fdf7: 7c 14 jl 10fe0d <IMFS_memfile_read+0x89><== NEVER TAKEN
10fdf9: 7f 08 jg 10fe03 <IMFS_memfile_read+0x7f><== NEVER TAKEN
10fdfb: 8b 4d cc mov -0x34(%ebp),%ecx
10fdfe: 39 4d d0 cmp %ecx,-0x30(%ebp)
10fe01: 76 0a jbe 10fe0d <IMFS_memfile_read+0x89>
my_length = the_jnode->info.file.size - start;
10fe03: 8b 55 cc mov -0x34(%ebp),%edx
10fe06: 29 c2 sub %eax,%edx
10fe08: 89 55 d0 mov %edx,-0x30(%ebp)
10fe0b: eb 03 jmp 10fe10 <IMFS_memfile_read+0x8c>
/*
* Linear files (as created from a tar file are easier to handle
* than block files).
*/
my_length = length;
10fe0d: 89 5d d0 mov %ebx,-0x30(%ebp)
*/
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
10fe10: 8b 0d ec 4e 12 00 mov 0x124eec,%ecx
10fe16: 89 4d c4 mov %ecx,-0x3c(%ebp)
10fe19: 89 c8 mov %ecx,%eax
10fe1b: 99 cltd
10fe1c: 89 d3 mov %edx,%ebx
10fe1e: 52 push %edx
10fe1f: 51 push %ecx
10fe20: 57 push %edi
10fe21: 56 push %esi
10fe22: 89 4d c0 mov %ecx,-0x40(%ebp)
10fe25: e8 e2 cc 00 00 call 11cb0c <__moddi3>
10fe2a: 83 c4 10 add $0x10,%esp
10fe2d: 89 45 cc mov %eax,-0x34(%ebp)
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
10fe30: 8b 4d c0 mov -0x40(%ebp),%ecx
10fe33: 53 push %ebx
10fe34: 51 push %ecx
10fe35: 57 push %edi
10fe36: 56 push %esi
10fe37: e8 84 cb 00 00 call 11c9c0 <__divdi3>
10fe3c: 83 c4 10 add $0x10,%esp
10fe3f: 89 c3 mov %eax,%ebx
if ( start_offset ) {
10fe41: 83 7d cc 00 cmpl $0x0,-0x34(%ebp)
10fe45: 74 3d je 10fe84 <IMFS_memfile_read+0x100>
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 );
10fe47: 57 push %edi
10fe48: 6a 00 push $0x0
10fe4a: 50 push %eax
10fe4b: ff 75 08 pushl 0x8(%ebp)
10fe4e: e8 f5 fd ff ff call 10fc48 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
10fe53: 83 c4 10 add $0x10,%esp
return copied;
10fe56: 31 d2 xor %edx,%edx
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 );
if ( !block_ptr )
10fe58: 85 c0 test %eax,%eax
10fe5a: 0f 84 ba 00 00 00 je 10ff1a <IMFS_memfile_read+0x196><== 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;
10fe60: 8b 4d c4 mov -0x3c(%ebp),%ecx
10fe63: 2b 4d cc sub -0x34(%ebp),%ecx
10fe66: 8b 55 d0 mov -0x30(%ebp),%edx
10fe69: 39 ca cmp %ecx,%edx
10fe6b: 76 02 jbe 10fe6f <IMFS_memfile_read+0xeb>
10fe6d: 89 ca mov %ecx,%edx
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 );
10fe6f: 8b 75 cc mov -0x34(%ebp),%esi
10fe72: 03 30 add (%eax),%esi
dest += to_copy;
10fe74: 8b 7d 14 mov 0x14(%ebp),%edi
10fe77: 89 d1 mov %edx,%ecx
10fe79: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
10fe7b: 89 7d cc mov %edi,-0x34(%ebp)
block++;
10fe7e: 43 inc %ebx
my_length -= to_copy;
10fe7f: 29 55 d0 sub %edx,-0x30(%ebp)
10fe82: eb 08 jmp 10fe8c <IMFS_memfile_read+0x108>
unsigned int last_byte;
unsigned int copied;
unsigned int start_offset;
unsigned char *dest;
dest = destination;
10fe84: 8b 45 14 mov 0x14(%ebp),%eax
10fe87: 89 45 cc mov %eax,-0x34(%ebp)
*/
last_byte = start + length;
if ( last_byte > the_jnode->info.file.size )
my_length = the_jnode->info.file.size - start;
copied = 0;
10fe8a: 31 d2 xor %edx,%edx
}
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
10fe8c: 8b 0d ec 4e 12 00 mov 0x124eec,%ecx
10fe92: 89 4d c8 mov %ecx,-0x38(%ebp)
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
10fe95: eb 2f jmp 10fec6 <IMFS_memfile_read+0x142>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
10fe97: 56 push %esi
10fe98: 6a 00 push $0x0
10fe9a: 53 push %ebx
10fe9b: ff 75 08 pushl 0x8(%ebp)
10fe9e: 89 55 c0 mov %edx,-0x40(%ebp)
10fea1: e8 a2 fd ff ff call 10fc48 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
10fea6: 83 c4 10 add $0x10,%esp
10fea9: 85 c0 test %eax,%eax
10feab: 8b 55 c0 mov -0x40(%ebp),%edx
10feae: 74 6a je 10ff1a <IMFS_memfile_read+0x196><== NEVER TAKEN
return copied;
memcpy( dest, &(*block_ptr)[ 0 ], to_copy );
10feb0: 8b 30 mov (%eax),%esi
10feb2: 8b 7d cc mov -0x34(%ebp),%edi
10feb5: 8b 4d c8 mov -0x38(%ebp),%ecx
10feb8: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
dest += to_copy;
10feba: 89 7d cc mov %edi,-0x34(%ebp)
block++;
10febd: 43 inc %ebx
my_length -= to_copy;
10febe: 8b 7d c8 mov -0x38(%ebp),%edi
10fec1: 29 7d d0 sub %edi,-0x30(%ebp)
copied += to_copy;
10fec4: 01 fa add %edi,%edx
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
10fec6: 8b 45 d0 mov -0x30(%ebp),%eax
10fec9: 3b 05 ec 4e 12 00 cmp 0x124eec,%eax
10fecf: 73 c6 jae 10fe97 <IMFS_memfile_read+0x113>
/*
* Phase 3: possibly the first part of one block
*/
IMFS_assert( my_length < IMFS_MEMFILE_BYTES_PER_BLOCK );
if ( my_length ) {
10fed1: 85 c0 test %eax,%eax
10fed3: 74 26 je 10fefb <IMFS_memfile_read+0x177>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
10fed5: 51 push %ecx
10fed6: 6a 00 push $0x0
10fed8: 53 push %ebx
10fed9: ff 75 08 pushl 0x8(%ebp)
10fedc: 89 55 c0 mov %edx,-0x40(%ebp)
10fedf: e8 64 fd ff ff call 10fc48 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
10fee4: 83 c4 10 add $0x10,%esp
10fee7: 85 c0 test %eax,%eax
10fee9: 8b 55 c0 mov -0x40(%ebp),%edx
10feec: 74 2c je 10ff1a <IMFS_memfile_read+0x196><== NEVER TAKEN
return copied;
memcpy( dest, &(*block_ptr)[ 0 ], my_length );
10feee: 8b 30 mov (%eax),%esi
10fef0: 8b 7d cc mov -0x34(%ebp),%edi
10fef3: 8b 4d d0 mov -0x30(%ebp),%ecx
10fef6: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
copied += my_length;
10fef8: 03 55 d0 add -0x30(%ebp),%edx
}
IMFS_update_atime( the_jnode );
10fefb: 50 push %eax
10fefc: 50 push %eax
10fefd: 6a 00 push $0x0
10feff: 8d 45 e0 lea -0x20(%ebp),%eax
10ff02: 50 push %eax
10ff03: 89 55 c0 mov %edx,-0x40(%ebp)
10ff06: e8 e5 74 ff ff call 1073f0 <gettimeofday>
10ff0b: 8b 45 e0 mov -0x20(%ebp),%eax
10ff0e: 8b 4d 08 mov 0x8(%ebp),%ecx
10ff11: 89 41 40 mov %eax,0x40(%ecx)
return copied;
10ff14: 8b 55 c0 mov -0x40(%ebp),%edx
10ff17: 83 c4 10 add $0x10,%esp
}
10ff1a: 89 d0 mov %edx,%eax
10ff1c: 8d 65 f4 lea -0xc(%ebp),%esp
10ff1f: 5b pop %ebx
10ff20: 5e pop %esi
10ff21: 5f pop %edi
10ff22: c9 leave
10ff23: c3 ret
0010ffe2 <IMFS_memfile_remove>:
* is better to stick to simple, easy to understand algorithms.
*/
int IMFS_memfile_remove(
IMFS_jnode_t *the_jnode
)
{
10ffe2: 55 push %ebp
10ffe3: 89 e5 mov %esp,%ebp
10ffe5: 57 push %edi
10ffe6: 56 push %esi
10ffe7: 53 push %ebx
10ffe8: 83 ec 1c sub $0x1c,%esp
10ffeb: 8b 5d 08 mov 0x8(%ebp),%ebx
/*
* 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;
10ffee: 8b 35 ec 4e 12 00 mov 0x124eec,%esi
10fff4: c1 ee 02 shr $0x2,%esi
* + doubly indirect
* + triply indirect
*/
info = &the_jnode->info.file;
if ( info->indirect ) {
10fff7: 83 7b 58 00 cmpl $0x0,0x58(%ebx)
10fffb: 74 0f je 11000c <IMFS_memfile_remove+0x2a>
memfile_free_blocks_in_table( &info->indirect, to_free );
10fffd: 57 push %edi
10fffe: 57 push %edi
10ffff: 56 push %esi
110000: 8d 43 58 lea 0x58(%ebx),%eax
110003: 50 push %eax
110004: e8 8c ff ff ff call 10ff95 <memfile_free_blocks_in_table>
110009: 83 c4 10 add $0x10,%esp
}
if ( info->doubly_indirect ) {
11000c: 83 7b 5c 00 cmpl $0x0,0x5c(%ebx)
110010: 74 3e je 110050 <IMFS_memfile_remove+0x6e>
110012: 31 ff xor %edi,%edi
110014: eb 1f jmp 110035 <IMFS_memfile_remove+0x53>
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
if ( info->doubly_indirect[i] ) {
110016: 8b 43 5c mov 0x5c(%ebx),%eax
110019: 8d 14 bd 00 00 00 00 lea 0x0(,%edi,4),%edx
110020: 83 3c b8 00 cmpl $0x0,(%eax,%edi,4)
110024: 74 0e je 110034 <IMFS_memfile_remove+0x52><== NEVER TAKEN
memfile_free_blocks_in_table(
110026: 51 push %ecx
110027: 51 push %ecx
110028: 56 push %esi
110029: 01 d0 add %edx,%eax
11002b: 50 push %eax
11002c: e8 64 ff ff ff call 10ff95 <memfile_free_blocks_in_table>
110031: 83 c4 10 add $0x10,%esp
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++ ) {
110034: 47 inc %edi
110035: a1 ec 4e 12 00 mov 0x124eec,%eax
11003a: c1 e8 02 shr $0x2,%eax
11003d: 39 c7 cmp %eax,%edi
11003f: 72 d5 jb 110016 <IMFS_memfile_remove+0x34>
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 );
110041: 57 push %edi
110042: 57 push %edi
110043: 56 push %esi
110044: 8d 43 5c lea 0x5c(%ebx),%eax
110047: 50 push %eax
110048: e8 48 ff ff ff call 10ff95 <memfile_free_blocks_in_table>
11004d: 83 c4 10 add $0x10,%esp
}
if ( info->triply_indirect ) {
110050: 83 7b 60 00 cmpl $0x0,0x60(%ebx)
110054: 74 78 je 1100ce <IMFS_memfile_remove+0xec>
110056: 31 ff xor %edi,%edi
110058: eb 59 jmp 1100b3 <IMFS_memfile_remove+0xd1>
11005a: 8d 04 bd 00 00 00 00 lea 0x0(,%edi,4),%eax
110061: 89 45 e4 mov %eax,-0x1c(%ebp)
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
p = (block_p *) info->triply_indirect[i];
110064: 8b 43 60 mov 0x60(%ebx),%eax
110067: 8b 04 b8 mov (%eax,%edi,4),%eax
if ( !p ) /* ensure we have a valid pointer */
11006a: 85 c0 test %eax,%eax
11006c: 74 51 je 1100bf <IMFS_memfile_remove+0xdd><== NEVER TAKEN
11006e: 31 d2 xor %edx,%edx
110070: eb 21 jmp 110093 <IMFS_memfile_remove+0xb1>
break;
for ( j=0 ; j<IMFS_MEMFILE_BLOCK_SLOTS ; j++ ) {
if ( p[j] ) {
110072: 83 38 00 cmpl $0x0,(%eax)
110075: 74 18 je 11008f <IMFS_memfile_remove+0xad><== NEVER TAKEN
memfile_free_blocks_in_table( (block_p **)&p[j], to_free);
110077: 51 push %ecx
110078: 51 push %ecx
110079: 56 push %esi
11007a: 50 push %eax
11007b: 89 45 dc mov %eax,-0x24(%ebp)
11007e: 89 55 e0 mov %edx,-0x20(%ebp)
110081: e8 0f ff ff ff call 10ff95 <memfile_free_blocks_in_table>
110086: 83 c4 10 add $0x10,%esp
110089: 8b 55 e0 mov -0x20(%ebp),%edx
11008c: 8b 45 dc mov -0x24(%ebp),%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++ ) {
11008f: 42 inc %edx
110090: 83 c0 04 add $0x4,%eax
110093: 8b 0d ec 4e 12 00 mov 0x124eec,%ecx
110099: c1 e9 02 shr $0x2,%ecx
11009c: 39 ca cmp %ecx,%edx
11009e: 72 d2 jb 110072 <IMFS_memfile_remove+0x90>
if ( p[j] ) {
memfile_free_blocks_in_table( (block_p **)&p[j], to_free);
}
}
memfile_free_blocks_in_table(
1100a0: 52 push %edx
1100a1: 52 push %edx
1100a2: 56 push %esi
1100a3: 8b 45 e4 mov -0x1c(%ebp),%eax
1100a6: 03 43 60 add 0x60(%ebx),%eax
1100a9: 50 push %eax
1100aa: e8 e6 fe ff ff call 10ff95 <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++ ) {
1100af: 47 inc %edi
1100b0: 83 c4 10 add $0x10,%esp
1100b3: a1 ec 4e 12 00 mov 0x124eec,%eax
1100b8: c1 e8 02 shr $0x2,%eax
1100bb: 39 c7 cmp %eax,%edi
1100bd: 72 9b jb 11005a <IMFS_memfile_remove+0x78>
}
}
memfile_free_blocks_in_table(
(block_p **)&info->triply_indirect[i], to_free );
}
memfile_free_blocks_in_table(
1100bf: 50 push %eax
1100c0: 50 push %eax
1100c1: 56 push %esi
(block_p **)&info->triply_indirect, to_free );
1100c2: 83 c3 60 add $0x60,%ebx
}
}
memfile_free_blocks_in_table(
(block_p **)&info->triply_indirect[i], to_free );
}
memfile_free_blocks_in_table(
1100c5: 53 push %ebx
1100c6: e8 ca fe ff ff call 10ff95 <memfile_free_blocks_in_table>
1100cb: 83 c4 10 add $0x10,%esp
(block_p **)&info->triply_indirect, to_free );
}
return 0;
}
1100ce: 31 c0 xor %eax,%eax
1100d0: 8d 65 f4 lea -0xc(%ebp),%esp
1100d3: 5b pop %ebx
1100d4: 5e pop %esi
1100d5: 5f pop %edi
1100d6: c9 leave
1100d7: c3 ret
001101f4 <IMFS_memfile_write>:
IMFS_jnode_t *the_jnode,
off_t start,
const unsigned char *source,
unsigned int length
)
{
1101f4: 55 push %ebp
1101f5: 89 e5 mov %esp,%ebp
1101f7: 57 push %edi
1101f8: 56 push %esi
1101f9: 53 push %ebx
1101fa: 83 ec 2c sub $0x2c,%esp
1101fd: 8b 75 0c mov 0xc(%ebp),%esi
110200: 8b 7d 10 mov 0x10(%ebp),%edi
/*
* 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;
110203: 8b 4d 18 mov 0x18(%ebp),%ecx
110206: 01 f1 add %esi,%ecx
if ( last_byte > the_jnode->info.file.size ) {
110208: 89 c8 mov %ecx,%eax
11020a: 31 d2 xor %edx,%edx
11020c: 8b 5d 08 mov 0x8(%ebp),%ebx
11020f: 3b 53 54 cmp 0x54(%ebx),%edx
110212: 7c 2c jl 110240 <IMFS_memfile_write+0x4c><== NEVER TAKEN
110214: 7f 05 jg 11021b <IMFS_memfile_write+0x27><== NEVER TAKEN
110216: 3b 4b 50 cmp 0x50(%ebx),%ecx
110219: 76 25 jbe 110240 <IMFS_memfile_write+0x4c><== NEVER TAKEN
status = IMFS_memfile_extend( the_jnode, last_byte );
11021b: 51 push %ecx
11021c: 52 push %edx
11021d: 50 push %eax
11021e: ff 75 08 pushl 0x8(%ebp)
110221: e8 dc fe ff ff call 110102 <IMFS_memfile_extend>
if ( status )
110226: 83 c4 10 add $0x10,%esp
110229: 85 c0 test %eax,%eax
11022b: 74 13 je 110240 <IMFS_memfile_write+0x4c>
rtems_set_errno_and_return_minus_one( ENOSPC );
11022d: e8 06 0f 00 00 call 111138 <__errno>
110232: c7 00 1c 00 00 00 movl $0x1c,(%eax)
110238: 83 c9 ff or $0xffffffff,%ecx
11023b: e9 0f 01 00 00 jmp 11034f <IMFS_memfile_write+0x15b>
*/
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
110240: a1 ec 4e 12 00 mov 0x124eec,%eax
110245: 89 45 cc mov %eax,-0x34(%ebp)
110248: 99 cltd
110249: 89 d3 mov %edx,%ebx
11024b: 52 push %edx
11024c: 50 push %eax
11024d: 57 push %edi
11024e: 56 push %esi
11024f: 89 45 c8 mov %eax,-0x38(%ebp)
110252: e8 b5 c8 00 00 call 11cb0c <__moddi3>
110257: 83 c4 10 add $0x10,%esp
11025a: 89 45 d0 mov %eax,-0x30(%ebp)
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
11025d: 8b 4d c8 mov -0x38(%ebp),%ecx
110260: 53 push %ebx
110261: 51 push %ecx
110262: 57 push %edi
110263: 56 push %esi
110264: e8 57 c7 00 00 call 11c9c0 <__divdi3>
110269: 83 c4 10 add $0x10,%esp
11026c: 89 c3 mov %eax,%ebx
if ( start_offset ) {
11026e: 83 7d d0 00 cmpl $0x0,-0x30(%ebp)
110272: 74 40 je 1102b4 <IMFS_memfile_write+0xc0>
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 );
110274: 52 push %edx
110275: 6a 00 push $0x0
110277: 53 push %ebx
110278: ff 75 08 pushl 0x8(%ebp)
11027b: e8 c8 f9 ff ff call 10fc48 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
110280: 83 c4 10 add $0x10,%esp
return copied;
110283: 31 c9 xor %ecx,%ecx
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 );
if ( !block_ptr )
110285: 85 c0 test %eax,%eax
110287: 0f 84 c2 00 00 00 je 11034f <IMFS_memfile_write+0x15b><== 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;
11028d: 8b 55 cc mov -0x34(%ebp),%edx
110290: 2b 55 d0 sub -0x30(%ebp),%edx
110293: 3b 55 18 cmp 0x18(%ebp),%edx
110296: 76 03 jbe 11029b <IMFS_memfile_write+0xa7>
110298: 8b 55 18 mov 0x18(%ebp),%edx
block,
to_copy,
src
);
#endif
memcpy( &(*block_ptr)[ start_offset ], src, to_copy );
11029b: 8b 00 mov (%eax),%eax
11029d: 03 45 d0 add -0x30(%ebp),%eax
src += to_copy;
1102a0: 89 c7 mov %eax,%edi
1102a2: 8b 75 14 mov 0x14(%ebp),%esi
1102a5: 89 d1 mov %edx,%ecx
1102a7: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
block++;
1102a9: 43 inc %ebx
my_length -= to_copy;
1102aa: 8b 4d 18 mov 0x18(%ebp),%ecx
1102ad: 29 d1 sub %edx,%ecx
1102af: 89 4d d4 mov %ecx,-0x2c(%ebp)
1102b2: eb 0b jmp 1102bf <IMFS_memfile_write+0xcb>
unsigned int last_byte;
unsigned int start_offset;
int copied;
const unsigned char *src;
src = source;
1102b4: 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 ) {
1102b7: 8b 45 18 mov 0x18(%ebp),%eax
1102ba: 89 45 d4 mov %eax,-0x2c(%ebp)
status = IMFS_memfile_extend( the_jnode, last_byte );
if ( status )
rtems_set_errno_and_return_minus_one( ENOSPC );
}
copied = 0;
1102bd: 31 d2 xor %edx,%edx
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
1102bf: 8b 0d ec 4e 12 00 mov 0x124eec,%ecx
1102c5: 89 4d d0 mov %ecx,-0x30(%ebp)
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
1102c8: eb 2b jmp 1102f5 <IMFS_memfile_write+0x101>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
1102ca: 50 push %eax
1102cb: 6a 00 push $0x0
1102cd: 53 push %ebx
1102ce: ff 75 08 pushl 0x8(%ebp)
1102d1: 89 55 c8 mov %edx,-0x38(%ebp)
1102d4: e8 6f f9 ff ff call 10fc48 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
1102d9: 83 c4 10 add $0x10,%esp
1102dc: 85 c0 test %eax,%eax
1102de: 8b 55 c8 mov -0x38(%ebp),%edx
1102e1: 74 6a je 11034d <IMFS_memfile_write+0x159><== 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, to_copy );
1102e3: 8b 00 mov (%eax),%eax
src += to_copy;
1102e5: 89 c7 mov %eax,%edi
1102e7: 8b 4d d0 mov -0x30(%ebp),%ecx
1102ea: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
block++;
1102ec: 43 inc %ebx
my_length -= to_copy;
1102ed: 8b 45 d0 mov -0x30(%ebp),%eax
1102f0: 29 45 d4 sub %eax,-0x2c(%ebp)
* 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(
1102f3: 01 c2 add %eax,%edx
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
1102f5: 8b 4d d4 mov -0x2c(%ebp),%ecx
1102f8: 3b 0d ec 4e 12 00 cmp 0x124eec,%ecx
1102fe: 73 ca jae 1102ca <IMFS_memfile_write+0xd6>
* 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 ) {
110300: 85 c9 test %ecx,%ecx
110302: 74 27 je 11032b <IMFS_memfile_write+0x137>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
110304: 57 push %edi
110305: 6a 00 push $0x0
110307: 53 push %ebx
110308: ff 75 08 pushl 0x8(%ebp)
11030b: 89 55 c8 mov %edx,-0x38(%ebp)
11030e: e8 35 f9 ff ff call 10fc48 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
110313: 83 c4 10 add $0x10,%esp
110316: 8b 55 c8 mov -0x38(%ebp),%edx
110319: 89 d1 mov %edx,%ecx
11031b: 85 c0 test %eax,%eax
11031d: 74 30 je 11034f <IMFS_memfile_write+0x15b><== 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 );
11031f: 8b 00 mov (%eax),%eax
110321: 89 c7 mov %eax,%edi
110323: 8b 4d d4 mov -0x2c(%ebp),%ecx
110326: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
my_length = 0;
copied += to_copy;
110328: 03 55 d4 add -0x2c(%ebp),%edx
}
IMFS_mtime_ctime_update( the_jnode );
11032b: 53 push %ebx
11032c: 53 push %ebx
11032d: 6a 00 push $0x0
11032f: 8d 45 e0 lea -0x20(%ebp),%eax
110332: 50 push %eax
110333: 89 55 c8 mov %edx,-0x38(%ebp)
110336: e8 b5 70 ff ff call 1073f0 <gettimeofday>
11033b: 8b 45 e0 mov -0x20(%ebp),%eax
11033e: 8b 5d 08 mov 0x8(%ebp),%ebx
110341: 89 43 44 mov %eax,0x44(%ebx)
110344: 89 43 48 mov %eax,0x48(%ebx)
return copied;
110347: 83 c4 10 add $0x10,%esp
11034a: 8b 55 c8 mov -0x38(%ebp),%edx
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
if ( !block_ptr )
11034d: 89 d1 mov %edx,%ecx
}
IMFS_mtime_ctime_update( the_jnode );
return copied;
}
11034f: 89 c8 mov %ecx,%eax
110351: 8d 65 f4 lea -0xc(%ebp),%esp
110354: 5b pop %ebx
110355: 5e pop %esi
110356: 5f pop %edi
110357: c9 leave
110358: c3 ret
00106dc0 <IMFS_mount>:
#include <rtems/seterr.h>
int IMFS_mount(
rtems_filesystem_mount_table_entry_t *mt_entry
)
{
106dc0: 55 push %ebp
106dc1: 89 e5 mov %esp,%ebp
106dc3: 83 ec 08 sub $0x8,%esp
106dc6: 8b 55 08 mov 0x8(%ebp),%edx
IMFS_jnode_t *node;
node = mt_entry->mt_point_node.node_access;
106dc9: 8b 42 08 mov 0x8(%edx),%eax
/*
* Is the node that we are mounting onto a directory node ?
*/
if ( node->type != IMFS_DIRECTORY )
106dcc: 83 78 4c 01 cmpl $0x1,0x4c(%eax)
106dd0: 74 10 je 106de2 <IMFS_mount+0x22> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( ENOTDIR );
106dd2: e8 61 a3 00 00 call 111138 <__errno> <== NOT EXECUTED
106dd7: c7 00 14 00 00 00 movl $0x14,(%eax) <== NOT EXECUTED
106ddd: 83 c8 ff or $0xffffffff,%eax <== NOT EXECUTED
106de0: eb 05 jmp 106de7 <IMFS_mount+0x27> <== NOT EXECUTED
/*
* Set mt_fs pointer to point to the mount table entry for
* the mounted file system.
*/
node->info.directory.mt_fs = mt_entry;
106de2: 89 50 5c mov %edx,0x5c(%eax)
return 0;
106de5: 31 c0 xor %eax,%eax
}
106de7: c9 leave
106de8: c3 ret
00109558 <IMFS_print_jnode>:
* This routine prints the contents of the specified jnode.
*/
void IMFS_print_jnode(
IMFS_jnode_t *the_jnode
)
{
109558: 55 push %ebp
109559: 89 e5 mov %esp,%ebp
10955b: 53 push %ebx
10955c: 83 ec 0c sub $0xc,%esp
10955f: 8b 5d 08 mov 0x8(%ebp),%ebx
IMFS_assert( the_jnode );
fprintf(stdout, "%s", the_jnode->name );
109562: a1 20 99 12 00 mov 0x129920,%eax
109567: ff 70 08 pushl 0x8(%eax)
10956a: 8d 43 0c lea 0xc(%ebx),%eax
10956d: 50 push %eax
10956e: e8 39 be 00 00 call 1153ac <fputs>
switch( the_jnode->type ) {
109573: 8b 43 4c mov 0x4c(%ebx),%eax
109576: 83 c4 10 add $0x10,%esp
109579: 8d 50 ff lea -0x1(%eax),%edx
10957c: 83 fa 06 cmp $0x6,%edx
10957f: 77 75 ja 1095f6 <IMFS_print_jnode+0x9e> <== NEVER TAKEN
109581: a1 20 99 12 00 mov 0x129920,%eax
109586: ff 24 95 3c 49 12 00 jmp *0x12493c(,%edx,4)
case IMFS_DIRECTORY:
fprintf(stdout, "/" );
10958d: 51 push %ecx
10958e: 51 push %ecx
10958f: ff 70 08 pushl 0x8(%eax)
109592: 6a 2f push $0x2f
109594: e8 67 bd 00 00 call 115300 <fputc>
109599: eb 2b jmp 1095c6 <IMFS_print_jnode+0x6e>
break;
case IMFS_DEVICE:
fprintf(stdout, " (device %" PRId32 ", %" PRId32 ")",
10959b: ff 73 54 pushl 0x54(%ebx)
10959e: ff 73 50 pushl 0x50(%ebx)
1095a1: 68 61 48 12 00 push $0x124861
1095a6: eb 16 jmp 1095be <IMFS_print_jnode+0x66>
the_jnode->info.device.major, the_jnode->info.device.minor );
break;
case IMFS_LINEAR_FILE:
fprintf(stdout, " (file %" PRId32 " %p)",
1095a8: ff 73 58 pushl 0x58(%ebx)
1095ab: ff 73 50 pushl 0x50(%ebx)
1095ae: 68 74 48 12 00 push $0x124874
1095b3: eb 09 jmp 1095be <IMFS_print_jnode+0x66>
the_jnode->info.file.indirect,
the_jnode->info.file.doubly_indirect,
the_jnode->info.file.triply_indirect
);
#else
fprintf(stdout, " (file %" PRId32 ")",
1095b5: 52 push %edx
1095b6: ff 73 50 pushl 0x50(%ebx)
1095b9: 68 83 48 12 00 push $0x124883
1095be: ff 70 08 pushl 0x8(%eax)
1095c1: e8 da bc 00 00 call 1152a0 <fprintf>
(uint32_t)the_jnode->info.file.size );
#endif
break;
1095c6: 83 c4 10 add $0x10,%esp
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
return;
}
puts("");
1095c9: c7 45 08 6d 4b 12 00 movl $0x124b6d,0x8(%ebp)
}
1095d0: 8b 5d fc mov -0x4(%ebp),%ebx
1095d3: c9 leave
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
return;
}
puts("");
1095d4: e9 8f d5 00 00 jmp 116b68 <puts>
case IMFS_HARD_LINK:
fprintf(stdout, " links not printed\n" );
return;
case IMFS_SYM_LINK:
fprintf(stdout, " links not printed\n" );
1095d9: 53 push %ebx
1095da: 53 push %ebx
1095db: ff 70 08 pushl 0x8(%eax)
1095de: 68 8f 48 12 00 push $0x12488f
1095e3: eb 0a jmp 1095ef <IMFS_print_jnode+0x97>
return;
case IMFS_FIFO:
fprintf(stdout, " FIFO not printed\n" );
1095e5: 51 push %ecx
1095e6: 51 push %ecx
1095e7: ff 70 08 pushl 0x8(%eax)
1095ea: 68 a3 48 12 00 push $0x1248a3
1095ef: e8 b8 bd 00 00 call 1153ac <fputs>
1095f4: eb 14 jmp 10960a <IMFS_print_jnode+0xb2>
return;
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
1095f6: 52 push %edx <== NOT EXECUTED
1095f7: 50 push %eax <== NOT EXECUTED
1095f8: 68 b6 48 12 00 push $0x1248b6 <== NOT EXECUTED
1095fd: a1 20 99 12 00 mov 0x129920,%eax <== NOT EXECUTED
109602: ff 70 08 pushl 0x8(%eax) <== NOT EXECUTED
109605: e8 96 bc 00 00 call 1152a0 <fprintf> <== NOT EXECUTED
return;
10960a: 83 c4 10 add $0x10,%esp
}
puts("");
}
10960d: 8b 5d fc mov -0x4(%ebp),%ebx
109610: c9 leave
109611: c3 ret
00106e28 <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 */
)
{
106e28: 55 push %ebp
106e29: 89 e5 mov %esp,%ebp
106e2b: 53 push %ebx
106e2c: 83 ec 18 sub $0x18,%esp
IMFS_jnode_t *the_jnode;
IMFS_jnode_t *new_parent;
the_jnode = old_loc->node_access;
106e2f: 8b 45 0c mov 0xc(%ebp),%eax
106e32: 8b 18 mov (%eax),%ebx
strncpy( the_jnode->name, new_name, IMFS_NAME_MAX );
106e34: 6a 20 push $0x20
106e36: ff 75 14 pushl 0x14(%ebp)
106e39: 8d 43 0c lea 0xc(%ebx),%eax
106e3c: 50 push %eax
106e3d: e8 ca b1 00 00 call 11200c <strncpy>
if ( the_jnode->Parent != NULL )
106e42: 83 c4 10 add $0x10,%esp
106e45: 83 7b 08 00 cmpl $0x0,0x8(%ebx)
106e49: 74 0c je 106e57 <IMFS_rename+0x2f> <== NEVER TAKEN
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
106e4b: 83 ec 0c sub $0xc,%esp
106e4e: 53 push %ebx
106e4f: e8 04 3c 00 00 call 10aa58 <_Chain_Extract>
106e54: 83 c4 10 add $0x10,%esp
rtems_chain_extract( (rtems_chain_node *) the_jnode );
new_parent = new_parent_loc->node_access;
106e57: 8b 45 10 mov 0x10(%ebp),%eax
106e5a: 8b 00 mov (%eax),%eax
the_jnode->Parent = new_parent;
106e5c: 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 );
106e5f: 51 push %ecx
106e60: 51 push %ecx
106e61: 53 push %ebx
rtems_chain_append( &new_parent->info.directory.Entries, &the_jnode->Node );
106e62: 83 c0 50 add $0x50,%eax
106e65: 50 push %eax
106e66: e8 c9 3b 00 00 call 10aa34 <_Chain_Append>
/*
* Update the time.
*/
IMFS_update_ctime( the_jnode );
106e6b: 58 pop %eax
106e6c: 5a pop %edx
106e6d: 6a 00 push $0x0
106e6f: 8d 45 f0 lea -0x10(%ebp),%eax
106e72: 50 push %eax
106e73: e8 78 05 00 00 call 1073f0 <gettimeofday>
106e78: 8b 45 f0 mov -0x10(%ebp),%eax
106e7b: 89 43 48 mov %eax,0x48(%ebx)
return 0;
}
106e7e: 31 c0 xor %eax,%eax
106e80: 8b 5d fc mov -0x4(%ebp),%ebx
106e83: c9 leave
106e84: c3 ret
0010dfa8 <IMFS_stat>:
int IMFS_stat(
rtems_filesystem_location_info_t *loc,
struct stat *buf
)
{
10dfa8: 55 push %ebp
10dfa9: 89 e5 mov %esp,%ebp
10dfab: 56 push %esi
10dfac: 53 push %ebx
10dfad: 8b 4d 08 mov 0x8(%ebp),%ecx
10dfb0: 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;
10dfb3: 8b 11 mov (%ecx),%edx
switch ( the_jnode->type ) {
10dfb5: 8b 5a 4c mov 0x4c(%edx),%ebx
10dfb8: 83 eb 02 sub $0x2,%ebx
10dfbb: 83 fb 05 cmp $0x5,%ebx
10dfbe: 77 33 ja 10dff3 <IMFS_stat+0x4b> <== NEVER TAKEN
10dfc0: ff 24 9d dc f4 11 00 jmp *0x11f4dc(,%ebx,4)
case IMFS_DEVICE:
io = &the_jnode->info.device;
buf->st_rdev = rtems_filesystem_make_dev_t( io->major, io->minor );
10dfc7: 8b 5a 54 mov 0x54(%edx),%ebx
rtems_device_minor_number _minor
)
{
union __rtems_dev_t temp;
temp.__overlay.major = _major;
10dfca: 8b 72 50 mov 0x50(%edx),%esi
10dfcd: 89 70 18 mov %esi,0x18(%eax)
10dfd0: 89 58 1c mov %ebx,0x1c(%eax)
break;
10dfd3: eb 2e jmp 10e003 <IMFS_stat+0x5b>
case IMFS_LINEAR_FILE:
case IMFS_MEMORY_FILE:
buf->st_size = the_jnode->info.file.size;
10dfd5: 8b 5a 50 mov 0x50(%edx),%ebx
10dfd8: 8b 72 54 mov 0x54(%edx),%esi
10dfdb: 89 58 20 mov %ebx,0x20(%eax)
10dfde: 89 70 24 mov %esi,0x24(%eax)
break;
10dfe1: eb 20 jmp 10e003 <IMFS_stat+0x5b>
case IMFS_SYM_LINK:
buf->st_size = 0;
break;
case IMFS_FIFO:
buf->st_size = 0;
10dfe3: c7 40 20 00 00 00 00 movl $0x0,0x20(%eax)
10dfea: c7 40 24 00 00 00 00 movl $0x0,0x24(%eax)
break;
10dff1: eb 10 jmp 10e003 <IMFS_stat+0x5b>
default:
rtems_set_errno_and_return_minus_one( ENOTSUP );
10dff3: e8 40 31 00 00 call 111138 <__errno>
10dff8: c7 00 86 00 00 00 movl $0x86,(%eax)
10dffe: 83 c8 ff or $0xffffffff,%eax
10e001: eb 47 jmp 10e04a <IMFS_stat+0xa2>
/*
* The device number of the IMFS is the major number and the minor is the
* instance.
*/
fs_info = loc->mt_entry->fs_info;
10e003: 8b 49 10 mov 0x10(%ecx),%ecx
buf->st_dev =
rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance );
10e006: 8b 49 34 mov 0x34(%ecx),%ecx
10e009: 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 =
10e00b: c7 00 fe ff 00 00 movl $0xfffe,(%eax)
10e011: 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;
10e014: 8b 4a 30 mov 0x30(%edx),%ecx
10e017: 89 48 0c mov %ecx,0xc(%eax)
buf->st_nlink = the_jnode->st_nlink;
10e01a: 8b 4a 34 mov 0x34(%edx),%ecx
10e01d: 66 89 48 10 mov %cx,0x10(%eax)
buf->st_ino = the_jnode->st_ino;
10e021: 8b 4a 38 mov 0x38(%edx),%ecx
10e024: 89 48 08 mov %ecx,0x8(%eax)
buf->st_uid = the_jnode->st_uid;
10e027: 8b 4a 3c mov 0x3c(%edx),%ecx
10e02a: 66 89 48 12 mov %cx,0x12(%eax)
buf->st_gid = the_jnode->st_gid;
10e02e: 66 8b 4a 3e mov 0x3e(%edx),%cx
10e032: 66 89 48 14 mov %cx,0x14(%eax)
buf->st_atime = the_jnode->stat_atime;
10e036: 8b 4a 40 mov 0x40(%edx),%ecx
10e039: 89 48 28 mov %ecx,0x28(%eax)
buf->st_mtime = the_jnode->stat_mtime;
10e03c: 8b 4a 44 mov 0x44(%edx),%ecx
10e03f: 89 48 30 mov %ecx,0x30(%eax)
buf->st_ctime = the_jnode->stat_ctime;
10e042: 8b 52 48 mov 0x48(%edx),%edx
10e045: 89 50 38 mov %edx,0x38(%eax)
return 0;
10e048: 31 c0 xor %eax,%eax
}
10e04a: 5b pop %ebx
10e04b: 5e pop %esi
10e04c: c9 leave
10e04d: c3 ret
00106f14 <IMFS_unlink>:
int IMFS_unlink(
rtems_filesystem_location_info_t *parentloc, /* IN */
rtems_filesystem_location_info_t *loc /* IN */
)
{
106f14: 55 push %ebp
106f15: 89 e5 mov %esp,%ebp
106f17: 57 push %edi
106f18: 56 push %esi
106f19: 53 push %ebx
106f1a: 83 ec 2c sub $0x2c,%esp
IMFS_jnode_t *node;
rtems_filesystem_location_info_t the_link;
int result = 0;
node = loc->node_access;
106f1d: 8b 45 0c mov 0xc(%ebp),%eax
106f20: 8b 18 mov (%eax),%ebx
/*
* If this is the last last pointer to the node
* free the node.
*/
if ( node->type == IMFS_HARD_LINK ) {
106f22: 83 7b 4c 03 cmpl $0x3,0x4c(%ebx)
106f26: 75 7a jne 106fa2 <IMFS_unlink+0x8e>
if ( !node->info.hard_link.link_node )
106f28: 8b 43 50 mov 0x50(%ebx),%eax
106f2b: 85 c0 test %eax,%eax
106f2d: 75 10 jne 106f3f <IMFS_unlink+0x2b> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
106f2f: e8 04 a2 00 00 call 111138 <__errno> <== NOT EXECUTED
106f34: c7 00 16 00 00 00 movl $0x16,(%eax) <== NOT EXECUTED
106f3a: 83 c8 ff or $0xffffffff,%eax <== NOT EXECUTED
106f3d: eb 75 jmp 106fb4 <IMFS_unlink+0xa0> <== NOT EXECUTED
the_link = *loc;
106f3f: 8d 7d cc lea -0x34(%ebp),%edi
106f42: b9 05 00 00 00 mov $0x5,%ecx
106f47: 8b 75 0c mov 0xc(%ebp),%esi
106f4a: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
the_link.node_access = node->info.hard_link.link_node;
106f4c: 89 45 cc mov %eax,-0x34(%ebp)
IMFS_Set_handlers( &the_link );
106f4f: 83 ec 0c sub $0xc,%esp
106f52: 8d 75 cc lea -0x34(%ebp),%esi
106f55: 56 push %esi
106f56: e8 dd 67 00 00 call 10d738 <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)
106f5b: 8b 43 50 mov 0x50(%ebx),%eax
106f5e: 8b 50 34 mov 0x34(%eax),%edx
106f61: 83 c4 10 add $0x10,%esp
106f64: 66 83 fa 01 cmp $0x1,%dx
106f68: 75 1a jne 106f84 <IMFS_unlink+0x70>
{
result = (*the_link.handlers->rmnod_h)( parentloc, &the_link );
106f6a: 51 push %ecx
106f6b: 51 push %ecx
106f6c: 56 push %esi
106f6d: ff 75 08 pushl 0x8(%ebp)
106f70: 8b 45 d4 mov -0x2c(%ebp),%eax
106f73: ff 50 34 call *0x34(%eax)
106f76: 89 c2 mov %eax,%edx
if ( result != 0 )
106f78: 83 c4 10 add $0x10,%esp
return -1;
106f7b: 83 c8 ff or $0xffffffff,%eax
*/
if ( node->info.hard_link.link_node->st_nlink == 1)
{
result = (*the_link.handlers->rmnod_h)( parentloc, &the_link );
if ( result != 0 )
106f7e: 85 d2 test %edx,%edx
106f80: 74 20 je 106fa2 <IMFS_unlink+0x8e>
106f82: eb 30 jmp 106fb4 <IMFS_unlink+0xa0>
return -1;
}
else
{
node->info.hard_link.link_node->st_nlink --;
106f84: 4a dec %edx
106f85: 66 89 50 34 mov %dx,0x34(%eax)
IMFS_update_ctime( node->info.hard_link.link_node );
106f89: 52 push %edx
106f8a: 52 push %edx
106f8b: 6a 00 push $0x0
106f8d: 8d 45 e0 lea -0x20(%ebp),%eax
106f90: 50 push %eax
106f91: e8 5a 04 00 00 call 1073f0 <gettimeofday>
106f96: 8b 43 50 mov 0x50(%ebx),%eax
106f99: 8b 55 e0 mov -0x20(%ebp),%edx
106f9c: 89 50 48 mov %edx,0x48(%eax)
106f9f: 83 c4 10 add $0x10,%esp
/*
* Now actually free the node we were asked to free.
*/
result = (*loc->handlers->rmnod_h)( parentloc, loc );
106fa2: 50 push %eax
106fa3: 50 push %eax
106fa4: 8b 55 0c mov 0xc(%ebp),%edx
106fa7: 8b 42 08 mov 0x8(%edx),%eax
106faa: 52 push %edx
106fab: ff 75 08 pushl 0x8(%ebp)
106fae: ff 50 34 call *0x34(%eax)
return result;
106fb1: 83 c4 10 add $0x10,%esp
}
106fb4: 8d 65 f4 lea -0xc(%ebp),%esp
106fb7: 5b pop %ebx
106fb8: 5e pop %esi
106fb9: 5f pop %edi
106fba: c9 leave
106fbb: c3 ret
00106fbc <IMFS_unmount>:
#include <rtems/seterr.h>
int IMFS_unmount(
rtems_filesystem_mount_table_entry_t *mt_entry
)
{
106fbc: 55 push %ebp
106fbd: 89 e5 mov %esp,%ebp
106fbf: 83 ec 08 sub $0x8,%esp
IMFS_jnode_t *node;
node = mt_entry->mt_point_node.node_access;
106fc2: 8b 45 08 mov 0x8(%ebp),%eax
106fc5: 8b 40 08 mov 0x8(%eax),%eax
/*
* Is the node that we are mounting onto a directory node ?
*/
if ( node->type != IMFS_DIRECTORY )
106fc8: 83 78 4c 01 cmpl $0x1,0x4c(%eax)
106fcc: 74 0d je 106fdb <IMFS_unmount+0x1f> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( ENOTDIR );
106fce: e8 65 a1 00 00 call 111138 <__errno> <== NOT EXECUTED
106fd3: c7 00 14 00 00 00 movl $0x14,(%eax) <== NOT EXECUTED
106fd9: eb 11 jmp 106fec <IMFS_unmount+0x30> <== NOT EXECUTED
/*
* Did the node indicate that there was a directory mounted here?
*/
if ( node->info.directory.mt_fs == NULL )
106fdb: 83 78 5c 00 cmpl $0x0,0x5c(%eax)
106fdf: 75 10 jne 106ff1 <IMFS_unmount+0x35> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EINVAL ); /* XXX */
106fe1: e8 52 a1 00 00 call 111138 <__errno> <== NOT EXECUTED
106fe6: c7 00 16 00 00 00 movl $0x16,(%eax) <== NOT EXECUTED
106fec: 83 c8 ff or $0xffffffff,%eax <== NOT EXECUTED
106fef: eb 09 jmp 106ffa <IMFS_unmount+0x3e> <== NOT EXECUTED
/*
* 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;
106ff1: c7 40 5c 00 00 00 00 movl $0x0,0x5c(%eax)
return 0;
106ff8: 31 c0 xor %eax,%eax
}
106ffa: c9 leave
106ffb: c3 ret
00107148 <Stack_check_Dump_threads_usage>:
static rtems_printk_plugin_t print_handler;
void Stack_check_Dump_threads_usage(
Thread_Control *the_thread
)
{
107148: 55 push %ebp <== NOT EXECUTED
107149: 89 e5 mov %esp,%ebp <== NOT EXECUTED
10714b: 57 push %edi <== NOT EXECUTED
10714c: 56 push %esi <== NOT EXECUTED
10714d: 53 push %ebx <== NOT EXECUTED
10714e: 83 ec 2c sub $0x2c,%esp <== NOT EXECUTED
107151: 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) {
107154: 83 fb ff cmp $0xffffffff,%ebx <== NOT EXECUTED
107157: 75 1d jne 107176 <Stack_check_Dump_threads_usage+0x2e><== NOT EXECUTED
if (!Stack_check_Interrupt_stack.area)
107159: 83 3d 3c 72 12 00 00 cmpl $0x0,0x12723c <== NOT EXECUTED
107160: 0f 84 f5 00 00 00 je 10725b <Stack_check_Dump_threads_usage+0x113><== NOT EXECUTED
return;
stack = &Stack_check_Interrupt_stack;
107166: ba 38 72 12 00 mov $0x127238,%edx <== NOT EXECUTED
the_thread = 0;
current = 0;
10716b: 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;
107172: 31 db xor %ebx,%ebx <== NOT EXECUTED
107174: eb 0f jmp 107185 <Stack_check_Dump_threads_usage+0x3d><== NOT EXECUTED
current = 0;
} else
#endif
{
stack = &the_thread->Start.Initial_stack;
107176: 8d 93 b8 00 00 00 lea 0xb8(%ebx),%edx <== NOT EXECUTED
current = (void *)_CPU_Context_Get_SP( &the_thread->Registers );
10717c: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax <== NOT EXECUTED
107182: 89 45 d0 mov %eax,-0x30(%ebp) <== NOT EXECUTED
}
low = Stack_check_usable_stack_start(stack);
107185: 8b 42 04 mov 0x4(%edx),%eax <== NOT EXECUTED
107188: 8d 48 10 lea 0x10(%eax),%ecx <== NOT EXECUTED
size = Stack_check_usable_stack_size(stack);
10718b: 8b 32 mov (%edx),%esi <== NOT EXECUTED
10718d: 83 ee 10 sub $0x10,%esi <== NOT EXECUTED
107190: 89 75 d4 mov %esi,-0x2c(%ebp) <== NOT EXECUTED
/*
* start at lower memory and find first word that does not
* match pattern
*/
base += PATTERN_SIZE_WORDS;
107193: 83 c0 20 add $0x20,%eax <== NOT EXECUTED
for (ebase = base + length; base < ebase; base++)
107196: 83 e6 fc and $0xfffffffc,%esi <== NOT EXECUTED
107199: 8d 34 30 lea (%eax,%esi,1),%esi <== NOT EXECUTED
10719c: eb 0b jmp 1071a9 <Stack_check_Dump_threads_usage+0x61><== NOT EXECUTED
if (*base != U32_PATTERN)
10719e: 81 38 a5 a5 a5 a5 cmpl $0xa5a5a5a5,(%eax) <== NOT EXECUTED
1071a4: 75 0b jne 1071b1 <Stack_check_Dump_threads_usage+0x69><== 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++)
1071a6: 83 c0 04 add $0x4,%eax <== NOT EXECUTED
1071a9: 39 f0 cmp %esi,%eax <== NOT EXECUTED
1071ab: 72 f1 jb 10719e <Stack_check_Dump_threads_usage+0x56><== 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;
1071ad: 31 ff xor %edi,%edi <== NOT EXECUTED
1071af: eb 0e jmp 1071bf <Stack_check_Dump_threads_usage+0x77><== NOT EXECUTED
1071b1: 31 ff xor %edi,%edi <== 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 )
1071b3: 85 c0 test %eax,%eax <== NOT EXECUTED
1071b5: 74 08 je 1071bf <Stack_check_Dump_threads_usage+0x77><== NOT EXECUTED
used = Stack_check_Calculate_used( low, size, high_water_mark );
1071b7: 8b 7d d4 mov -0x2c(%ebp),%edi <== NOT EXECUTED
1071ba: 8d 3c 39 lea (%ecx,%edi,1),%edi <== NOT EXECUTED
1071bd: 29 c7 sub %eax,%edi <== NOT EXECUTED
else
used = 0;
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if ( the_thread )
1071bf: 85 db test %ebx,%ebx <== NOT EXECUTED
1071c1: 8b 35 14 6f 12 00 mov 0x126f14,%esi <== NOT EXECUTED
1071c7: 74 28 je 1071f1 <Stack_check_Dump_threads_usage+0xa9><== NOT EXECUTED
#endif
{
(*print_handler)(
1071c9: 50 push %eax <== NOT EXECUTED
1071ca: 8d 45 e3 lea -0x1d(%ebp),%eax <== NOT EXECUTED
1071cd: 50 push %eax <== NOT EXECUTED
1071ce: 6a 05 push $0x5 <== NOT EXECUTED
1071d0: ff 73 08 pushl 0x8(%ebx) <== NOT EXECUTED
1071d3: 89 55 cc mov %edx,-0x34(%ebp) <== NOT EXECUTED
1071d6: e8 cd 53 00 00 call 10c5a8 <rtems_object_get_name> <== NOT EXECUTED
1071db: 50 push %eax <== NOT EXECUTED
1071dc: ff 73 08 pushl 0x8(%ebx) <== NOT EXECUTED
1071df: 68 57 16 12 00 push $0x121657 <== NOT EXECUTED
1071e4: ff 35 10 6f 12 00 pushl 0x126f10 <== NOT EXECUTED
1071ea: ff d6 call *%esi <== NOT EXECUTED
1071ec: 83 c4 20 add $0x20,%esp <== NOT EXECUTED
1071ef: eb 16 jmp 107207 <Stack_check_Dump_threads_usage+0xbf><== 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 );
1071f1: 53 push %ebx <== NOT EXECUTED
1071f2: 6a ff push $0xffffffff <== NOT EXECUTED
1071f4: 68 64 16 12 00 push $0x121664 <== NOT EXECUTED
1071f9: ff 35 10 6f 12 00 pushl 0x126f10 <== NOT EXECUTED
1071ff: 89 55 cc mov %edx,-0x34(%ebp) <== NOT EXECUTED
107202: ff d6 call *%esi <== NOT EXECUTED
107204: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
107207: 8b 55 cc mov -0x34(%ebp),%edx <== NOT EXECUTED
(*print_handler)(
print_context,
" %010p - %010p %010p %8" PRId32 " ",
stack->area,
stack->area + stack->size - 1,
10720a: 8b 42 04 mov 0x4(%edx),%eax <== NOT EXECUTED
else {
(*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 );
}
#endif
(*print_handler)(
10720d: 51 push %ecx <== NOT EXECUTED
10720e: 51 push %ecx <== NOT EXECUTED
10720f: ff 75 d4 pushl -0x2c(%ebp) <== NOT EXECUTED
107212: ff 75 d0 pushl -0x30(%ebp) <== NOT EXECUTED
print_context,
" %010p - %010p %010p %8" PRId32 " ",
stack->area,
stack->area + stack->size - 1,
107215: 8b 12 mov (%edx),%edx <== NOT EXECUTED
else {
(*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 );
}
#endif
(*print_handler)(
107217: 8d 54 10 ff lea -0x1(%eax,%edx,1),%edx <== NOT EXECUTED
10721b: 52 push %edx <== NOT EXECUTED
10721c: 50 push %eax <== NOT EXECUTED
10721d: 68 72 16 12 00 push $0x121672 <== NOT EXECUTED
107222: ff 35 10 6f 12 00 pushl 0x126f10 <== NOT EXECUTED
107228: ff 15 14 6f 12 00 call *0x126f14 <== NOT EXECUTED
stack->area + stack->size - 1,
current,
size
);
if (Stack_check_Initialized == 0) {
10722e: 83 c4 20 add $0x20,%esp <== NOT EXECUTED
107231: 83 3d 18 6f 12 00 00 cmpl $0x0,0x126f18 <== NOT EXECUTED
107238: 8b 35 14 6f 12 00 mov 0x126f14,%esi <== NOT EXECUTED
10723e: 75 09 jne 107249 <Stack_check_Dump_threads_usage+0x101><== NOT EXECUTED
(*print_handler)( print_context, "Unavailable\n" );
107240: 52 push %edx <== NOT EXECUTED
107241: 52 push %edx <== NOT EXECUTED
107242: 68 90 16 12 00 push $0x121690 <== NOT EXECUTED
107247: eb 07 jmp 107250 <Stack_check_Dump_threads_usage+0x108><== NOT EXECUTED
} else {
(*print_handler)( print_context, "%8" PRId32 "\n", used );
107249: 50 push %eax <== NOT EXECUTED
10724a: 57 push %edi <== NOT EXECUTED
10724b: 68 9d 16 12 00 push $0x12169d <== NOT EXECUTED
107250: ff 35 10 6f 12 00 pushl 0x126f10 <== NOT EXECUTED
107256: ff d6 call *%esi <== NOT EXECUTED
107258: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
}
10725b: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10725e: 5b pop %ebx <== NOT EXECUTED
10725f: 5e pop %esi <== NOT EXECUTED
107260: 5f pop %edi <== NOT EXECUTED
107261: c9 leave <== NOT EXECUTED
107262: c3 ret <== NOT EXECUTED
00107263 <Stack_check_Initialize>:
/*
* Stack_check_Initialize
*/
void Stack_check_Initialize( void )
{
107263: 55 push %ebp
107264: 89 e5 mov %esp,%ebp
107266: 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 )
107267: 83 3d 18 6f 12 00 00 cmpl $0x0,0x126f18
10726e: 75 5a jne 1072ca <Stack_check_Initialize+0x67>
/*
* Dope the pattern and fill areas
*/
p = Stack_check_Pattern.pattern;
for ( i = 0; i < PATTERN_SIZE_WORDS; i++ ) {
p[i] = pattern[ i%4 ];
107270: c7 05 28 72 12 00 0d movl $0xfeedf00d,0x127228
107277: f0 ed fe
10727a: c7 05 2c 72 12 00 06 movl $0xbad0d06,0x12722c
107281: 0d ad 0b
107284: c7 05 30 72 12 00 0d movl $0xdeadf00d,0x127230
10728b: f0 ad de
10728e: c7 05 34 72 12 00 06 movl $0x600d0d06,0x127234
107295: 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) {
107298: 8b 15 10 79 12 00 mov 0x127910,%edx
10729e: 85 d2 test %edx,%edx
1072a0: 74 1e je 1072c0 <Stack_check_Initialize+0x5d><== NEVER TAKEN
1072a2: 8b 0d 14 79 12 00 mov 0x127914,%ecx
1072a8: 85 c9 test %ecx,%ecx
1072aa: 74 14 je 1072c0 <Stack_check_Initialize+0x5d><== NEVER TAKEN
Stack_check_Interrupt_stack.area = _CPU_Interrupt_stack_low;
1072ac: 89 15 3c 72 12 00 mov %edx,0x12723c
Stack_check_Interrupt_stack.size = (char *) _CPU_Interrupt_stack_high -
1072b2: 29 d1 sub %edx,%ecx
1072b4: 89 0d 38 72 12 00 mov %ecx,0x127238
(char *) _CPU_Interrupt_stack_low;
Stack_check_Dope_stack(&Stack_check_Interrupt_stack);
1072ba: b0 a5 mov $0xa5,%al
1072bc: 89 d7 mov %edx,%edi
1072be: f3 aa rep stos %al,%es:(%edi)
}
#endif
Stack_check_Initialized = 1;
1072c0: c7 05 18 6f 12 00 01 movl $0x1,0x126f18
1072c7: 00 00 00
}
1072ca: 5f pop %edi
1072cb: c9 leave
1072cc: c3 ret
0010731b <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)
{
10731b: 55 push %ebp <== NOT EXECUTED
10731c: 89 e5 mov %esp,%ebp <== NOT EXECUTED
10731e: 56 push %esi <== NOT EXECUTED
10731f: 53 push %ebx <== NOT EXECUTED
107320: 83 ec 3c sub $0x3c,%esp <== NOT EXECUTED
107323: 8b 5d 08 mov 0x8(%ebp),%ebx <== NOT EXECUTED
107326: 8a 55 0c mov 0xc(%ebp),%dl <== NOT EXECUTED
Stack_Control *stack = &running->Start.Initial_stack;
void *pattern_area = Stack_check_Get_pattern(stack);
107329: 8b b3 bc 00 00 00 mov 0xbc(%ebx),%esi <== NOT EXECUTED
char name[32];
printk("BLOWN STACK!!!\n");
10732f: 68 a3 16 12 00 push $0x1216a3 <== NOT EXECUTED
107334: 88 55 d4 mov %dl,-0x2c(%ebp) <== NOT EXECUTED
107337: e8 2c 19 00 00 call 108c68 <printk> <== NOT EXECUTED
printk("task control block: 0x%08" PRIxPTR "\n", running);
10733c: 5a pop %edx <== NOT EXECUTED
10733d: 59 pop %ecx <== NOT EXECUTED
10733e: 53 push %ebx <== NOT EXECUTED
10733f: 68 b3 16 12 00 push $0x1216b3 <== NOT EXECUTED
107344: e8 1f 19 00 00 call 108c68 <printk> <== NOT EXECUTED
printk("task ID: 0x%08lx\n", (unsigned long) running->Object.id);
107349: 59 pop %ecx <== NOT EXECUTED
10734a: 58 pop %eax <== NOT EXECUTED
10734b: ff 73 08 pushl 0x8(%ebx) <== NOT EXECUTED
10734e: 68 d0 16 12 00 push $0x1216d0 <== NOT EXECUTED
107353: e8 10 19 00 00 call 108c68 <printk> <== NOT EXECUTED
printk(
107358: 58 pop %eax <== NOT EXECUTED
107359: 5a pop %edx <== NOT EXECUTED
10735a: ff 73 0c pushl 0xc(%ebx) <== NOT EXECUTED
10735d: 68 e2 16 12 00 push $0x1216e2 <== NOT EXECUTED
107362: e8 01 19 00 00 call 108c68 <printk> <== NOT EXECUTED
"task name: 0x%08" PRIx32 "\n",
running->Object.name.name_u32
);
printk(
107367: 83 c4 0c add $0xc,%esp <== NOT EXECUTED
10736a: 8d 45 d8 lea -0x28(%ebp),%eax <== NOT EXECUTED
10736d: 50 push %eax <== NOT EXECUTED
10736e: 6a 20 push $0x20 <== NOT EXECUTED
107370: ff 73 08 pushl 0x8(%ebx) <== NOT EXECUTED
107373: e8 30 52 00 00 call 10c5a8 <rtems_object_get_name> <== NOT EXECUTED
107378: 5a pop %edx <== NOT EXECUTED
107379: 59 pop %ecx <== NOT EXECUTED
10737a: 50 push %eax <== NOT EXECUTED
10737b: 68 f6 16 12 00 push $0x1216f6 <== NOT EXECUTED
107380: e8 e3 18 00 00 call 108c68 <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)
107385: 8b 8b bc 00 00 00 mov 0xbc(%ebx),%ecx <== NOT EXECUTED
10738b: 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(
107391: 8d 1c 01 lea (%ecx,%eax,1),%ebx <== NOT EXECUTED
107394: 53 push %ebx <== NOT EXECUTED
107395: 51 push %ecx <== NOT EXECUTED
107396: 50 push %eax <== NOT EXECUTED
107397: 68 0c 17 12 00 push $0x12170c <== NOT EXECUTED
10739c: e8 c7 18 00 00 call 108c68 <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) {
1073a1: 83 c4 20 add $0x20,%esp <== NOT EXECUTED
1073a4: 8a 55 d4 mov -0x2c(%ebp),%dl <== NOT EXECUTED
1073a7: 84 d2 test %dl,%dl <== NOT EXECUTED
1073a9: 75 17 jne 1073c2 <Stack_check_report_blown_task+0xa7><== 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);
1073ab: 8d 46 08 lea 0x8(%esi),%eax <== NOT EXECUTED
(unsigned long) stack->size,
stack->area,
((char *) stack->area + stack->size)
);
if (!pattern_ok) {
printk(
1073ae: 83 c6 18 add $0x18,%esi <== NOT EXECUTED
1073b1: 56 push %esi <== NOT EXECUTED
1073b2: 50 push %eax <== NOT EXECUTED
1073b3: 6a 10 push $0x10 <== NOT EXECUTED
1073b5: 68 3d 17 12 00 push $0x12173d <== NOT EXECUTED
1073ba: e8 a9 18 00 00 call 108c68 <printk> <== NOT EXECUTED
1073bf: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
rtems_configuration_get_user_multiprocessing_table()->node
);
}
#endif
rtems_fatal_error_occurred(0x81);
1073c2: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
1073c5: 68 81 00 00 00 push $0x81 <== NOT EXECUTED
1073ca: e8 21 59 00 00 call 10ccf0 <rtems_fatal_error_occurred><== NOT EXECUTED
0010ce60 <_CORE_RWLock_Release>:
*/
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
10ce60: 55 push %ebp
10ce61: 89 e5 mov %esp,%ebp
10ce63: 53 push %ebx
10ce64: 83 ec 04 sub $0x4,%esp
10ce67: 8b 5d 08 mov 0x8(%ebp),%ebx
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
10ce6a: 8b 15 78 88 12 00 mov 0x128878,%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 );
10ce70: 9c pushf
10ce71: fa cli
10ce72: 58 pop %eax
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
10ce73: 8b 4b 44 mov 0x44(%ebx),%ecx
10ce76: 85 c9 test %ecx,%ecx
10ce78: 75 0b jne 10ce85 <_CORE_RWLock_Release+0x25>
_ISR_Enable( level );
10ce7a: 50 push %eax
10ce7b: 9d popf
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
10ce7c: c7 42 34 02 00 00 00 movl $0x2,0x34(%edx)
return CORE_RWLOCK_SUCCESSFUL;
10ce83: eb 72 jmp 10cef7 <_CORE_RWLock_Release+0x97>
}
if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) {
10ce85: 49 dec %ecx
10ce86: 75 0f jne 10ce97 <_CORE_RWLock_Release+0x37>
the_rwlock->number_of_readers -= 1;
10ce88: 8b 4b 48 mov 0x48(%ebx),%ecx
10ce8b: 49 dec %ecx
10ce8c: 89 4b 48 mov %ecx,0x48(%ebx)
if ( the_rwlock->number_of_readers != 0 ) {
10ce8f: 85 c9 test %ecx,%ecx
10ce91: 74 04 je 10ce97 <_CORE_RWLock_Release+0x37>
/* must be unlocked again */
_ISR_Enable( level );
10ce93: 50 push %eax
10ce94: 9d popf
return CORE_RWLOCK_SUCCESSFUL;
10ce95: eb 60 jmp 10cef7 <_CORE_RWLock_Release+0x97>
}
}
/* CORE_RWLOCK_LOCKED_FOR_WRITING or READING with readers */
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10ce97: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
/*
* Implicitly transition to "unlocked" and find another thread interested
* in obtaining this rwlock.
*/
the_rwlock->current_state = CORE_RWLOCK_UNLOCKED;
10ce9e: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx)
_ISR_Enable( level );
10cea5: 50 push %eax
10cea6: 9d popf
next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue );
10cea7: 83 ec 0c sub $0xc,%esp
10ceaa: 53 push %ebx
10ceab: e8 f0 17 00 00 call 10e6a0 <_Thread_queue_Dequeue>
if ( next ) {
10ceb0: 83 c4 10 add $0x10,%esp
10ceb3: 85 c0 test %eax,%eax
10ceb5: 74 40 je 10cef7 <_CORE_RWLock_Release+0x97>
if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) {
10ceb7: 83 78 30 01 cmpl $0x1,0x30(%eax)
10cebb: 75 09 jne 10cec6 <_CORE_RWLock_Release+0x66>
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING;
10cebd: c7 43 44 02 00 00 00 movl $0x2,0x44(%ebx)
return CORE_RWLOCK_SUCCESSFUL;
10cec4: eb 31 jmp 10cef7 <_CORE_RWLock_Release+0x97>
}
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
10cec6: ff 43 48 incl 0x48(%ebx)
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
10cec9: c7 43 44 01 00 00 00 movl $0x1,0x44(%ebx)
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
10ced0: 83 ec 0c sub $0xc,%esp
10ced3: 53 push %ebx
10ced4: e8 bf 1b 00 00 call 10ea98 <_Thread_queue_First>
if ( !next ||
10ced9: 83 c4 10 add $0x10,%esp
10cedc: 85 c0 test %eax,%eax
10cede: 74 17 je 10cef7 <_CORE_RWLock_Release+0x97>
10cee0: 83 78 30 01 cmpl $0x1,0x30(%eax)
10cee4: 74 11 je 10cef7 <_CORE_RWLock_Release+0x97><== NEVER TAKEN
next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE )
return CORE_RWLOCK_SUCCESSFUL;
the_rwlock->number_of_readers += 1;
10cee6: ff 43 48 incl 0x48(%ebx)
_Thread_queue_Extract( &the_rwlock->Wait_queue, next );
10cee9: 52 push %edx
10ceea: 52 push %edx
10ceeb: 50 push %eax
10ceec: 53 push %ebx
10ceed: e8 96 1a 00 00 call 10e988 <_Thread_queue_Extract>
}
10cef2: 83 c4 10 add $0x10,%esp
10cef5: eb d9 jmp 10ced0 <_CORE_RWLock_Release+0x70>
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
10cef7: 31 c0 xor %eax,%eax
10cef9: 8b 5d fc mov -0x4(%ebp),%ebx
10cefc: c9 leave
10cefd: c3 ret
0010cf00 <_CORE_RWLock_Timeout>:
void _CORE_RWLock_Timeout(
Objects_Id id,
void *ignored
)
{
10cf00: 55 push %ebp
10cf01: 89 e5 mov %esp,%ebp
10cf03: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10cf06: 8d 45 f4 lea -0xc(%ebp),%eax
10cf09: 50 push %eax
10cf0a: ff 75 08 pushl 0x8(%ebp)
10cf0d: e8 72 14 00 00 call 10e384 <_Thread_Get>
switch ( location ) {
10cf12: 83 c4 10 add $0x10,%esp
10cf15: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
10cf19: 75 17 jne 10cf32 <_CORE_RWLock_Timeout+0x32><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
10cf1b: 83 ec 0c sub $0xc,%esp
10cf1e: 50 push %eax
10cf1f: e8 40 1c 00 00 call 10eb64 <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10cf24: a1 50 83 12 00 mov 0x128350,%eax
10cf29: 48 dec %eax
10cf2a: a3 50 83 12 00 mov %eax,0x128350
10cf2f: 83 c4 10 add $0x10,%esp
_Thread_Unnest_dispatch();
break;
}
}
10cf32: c9 leave
10cf33: c3 ret
00112274 <_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
)
{
112274: 55 push %ebp
112275: 89 e5 mov %esp,%ebp
112277: 57 push %edi
112278: 56 push %esi
112279: 53 push %ebx
11227a: 83 ec 1c sub $0x1c,%esp
11227d: 8b 5d 08 mov 0x8(%ebp),%ebx
112280: 8b 7d 10 mov 0x10(%ebp),%edi
112283: 8b 55 14 mov 0x14(%ebp),%edx
size_t message_buffering_required;
size_t allocated_message_size;
the_message_queue->maximum_pending_messages = maximum_pending_messages;
112286: 89 7b 44 mov %edi,0x44(%ebx)
the_message_queue->number_of_pending_messages = 0;
112289: c7 43 48 00 00 00 00 movl $0x0,0x48(%ebx)
the_message_queue->maximum_message_size = maximum_message_size;
112290: 89 53 4c mov %edx,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;
112293: c7 43 60 00 00 00 00 movl $0x0,0x60(%ebx)
the_message_queue->notify_argument = the_argument;
11229a: 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)) {
1122a1: 89 d0 mov %edx,%eax
1122a3: f6 c2 03 test $0x3,%dl
1122a6: 74 0c je 1122b4 <_CORE_message_queue_Initialize+0x40>
allocated_message_size += sizeof(uint32_t);
1122a8: 83 c0 04 add $0x4,%eax
allocated_message_size &= ~(sizeof(uint32_t) - 1);
1122ab: 83 e0 fc and $0xfffffffc,%eax
}
if (allocated_message_size < maximum_message_size)
return false;
1122ae: 31 f6 xor %esi,%esi
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
allocated_message_size += sizeof(uint32_t);
allocated_message_size &= ~(sizeof(uint32_t) - 1);
}
if (allocated_message_size < maximum_message_size)
1122b0: 39 d0 cmp %edx,%eax
1122b2: 72 68 jb 11231c <_CORE_message_queue_Initialize+0xa8><== NEVER TAKEN
/*
* 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));
1122b4: 8d 50 14 lea 0x14(%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 *
1122b7: 89 d1 mov %edx,%ecx
1122b9: 0f af cf imul %edi,%ecx
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
if (message_buffering_required < allocated_message_size)
return false;
1122bc: 31 f6 xor %esi,%esi
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
if (message_buffering_required < allocated_message_size)
1122be: 39 c1 cmp %eax,%ecx
1122c0: 72 5a jb 11231c <_CORE_message_queue_Initialize+0xa8><== NEVER TAKEN
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
_Workspace_Allocate( message_buffering_required );
1122c2: 83 ec 0c sub $0xc,%esp
1122c5: 51 push %ecx
1122c6: 89 55 e4 mov %edx,-0x1c(%ebp)
1122c9: e8 b4 27 00 00 call 114a82 <_Workspace_Allocate>
return false;
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
1122ce: 89 43 5c mov %eax,0x5c(%ebx)
_Workspace_Allocate( message_buffering_required );
if (the_message_queue->message_buffers == 0)
1122d1: 83 c4 10 add $0x10,%esp
1122d4: 85 c0 test %eax,%eax
1122d6: 8b 55 e4 mov -0x1c(%ebp),%edx
1122d9: 74 41 je 11231c <_CORE_message_queue_Initialize+0xa8>
/*
* Initialize the pool of inactive messages, pending messages,
* and set of waiting threads.
*/
_Chain_Initialize (
1122db: 52 push %edx
1122dc: 57 push %edi
1122dd: 50 push %eax
1122de: 8d 43 68 lea 0x68(%ebx),%eax
1122e1: 50 push %eax
1122e2: e8 f5 4a 00 00 call 116ddc <_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 );
1122e7: 8d 43 54 lea 0x54(%ebx),%eax
1122ea: 89 43 50 mov %eax,0x50(%ebx)
head->next = tail;
head->previous = NULL;
1122ed: 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 );
1122f4: 8d 43 50 lea 0x50(%ebx),%eax
1122f7: 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(
1122fa: 6a 06 push $0x6
1122fc: 68 80 00 00 00 push $0x80
112301: 8b 45 0c mov 0xc(%ebp),%eax
112304: 83 38 01 cmpl $0x1,(%eax)
112307: 0f 94 c0 sete %al
11230a: 0f b6 c0 movzbl %al,%eax
11230d: 50 push %eax
11230e: 53 push %ebx
11230f: e8 94 1f 00 00 call 1142a8 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
112314: 83 c4 20 add $0x20,%esp
112317: be 01 00 00 00 mov $0x1,%esi
}
11231c: 89 f0 mov %esi,%eax
11231e: 8d 65 f4 lea -0xc(%ebp),%esp
112321: 5b pop %ebx
112322: 5e pop %esi
112323: 5f pop %edi
112324: c9 leave
112325: c3 ret
00112328 <_CORE_message_queue_Seize>:
void *buffer,
size_t *size_p,
bool wait,
Watchdog_Interval timeout
)
{
112328: 55 push %ebp
112329: 89 e5 mov %esp,%ebp
11232b: 57 push %edi
11232c: 56 push %esi
11232d: 53 push %ebx
11232e: 83 ec 2c sub $0x2c,%esp
112331: 8b 55 08 mov 0x8(%ebp),%edx
112334: 8b 45 0c mov 0xc(%ebp),%eax
112337: 89 45 dc mov %eax,-0x24(%ebp)
11233a: 8b 5d 10 mov 0x10(%ebp),%ebx
11233d: 89 5d e0 mov %ebx,-0x20(%ebp)
112340: 8b 4d 14 mov 0x14(%ebp),%ecx
112343: 8b 75 1c mov 0x1c(%ebp),%esi
112346: 89 75 d4 mov %esi,-0x2c(%ebp)
112349: 8a 45 18 mov 0x18(%ebp),%al
11234c: 88 45 db mov %al,-0x25(%ebp)
ISR_Level level;
CORE_message_queue_Buffer_control *the_message;
Thread_Control *executing;
executing = _Thread_Executing;
11234f: a1 f0 d9 12 00 mov 0x12d9f0,%eax
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
112354: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
_ISR_Disable( level );
11235b: 9c pushf
11235c: fa cli
11235d: 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 );
}
112360: 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 );
112363: 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))
112366: 39 f3 cmp %esi,%ebx
112368: 0f 84 8a 00 00 00 je 1123f8 <_CORE_message_queue_Seize+0xd0>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
11236e: 8b 33 mov (%ebx),%esi
head->next = new_first;
112370: 89 72 50 mov %esi,0x50(%edx)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_first_unprotected(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
112373: 8d 7a 50 lea 0x50(%edx),%edi
112376: 89 7e 04 mov %edi,0x4(%esi)
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 ) {
112379: 85 db test %ebx,%ebx
11237b: 74 7b je 1123f8 <_CORE_message_queue_Seize+0xd0><== NEVER TAKEN
the_message_queue->number_of_pending_messages -= 1;
11237d: ff 4a 48 decl 0x48(%edx)
_ISR_Enable( level );
112380: ff 75 e4 pushl -0x1c(%ebp)
112383: 9d popf
*size_p = the_message->Contents.size;
112384: 8b 43 0c mov 0xc(%ebx),%eax
112387: 89 01 mov %eax,(%ecx)
_Thread_Executing->Wait.count =
112389: 8b 73 08 mov 0x8(%ebx),%esi
11238c: a1 f0 d9 12 00 mov 0x12d9f0,%eax
112391: 89 70 24 mov %esi,0x24(%eax)
_CORE_message_queue_Get_message_priority( the_message );
_CORE_message_queue_Copy_buffer(
the_message->Contents.buffer,
112394: 8d 73 10 lea 0x10(%ebx),%esi
112397: 89 75 e4 mov %esi,-0x1c(%ebp)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
11239a: 8b 09 mov (%ecx),%ecx
11239c: 8b 7d e0 mov -0x20(%ebp),%edi
11239f: 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 );
1123a1: 83 ec 0c sub $0xc,%esp
1123a4: 52 push %edx
1123a5: 89 55 d0 mov %edx,-0x30(%ebp)
1123a8: e8 c3 1b 00 00 call 113f70 <_Thread_queue_Dequeue>
if ( !the_thread ) {
1123ad: 83 c4 10 add $0x10,%esp
1123b0: 85 c0 test %eax,%eax
1123b2: 8b 55 d0 mov -0x30(%ebp),%edx
1123b5: 75 15 jne 1123cc <_CORE_message_queue_Seize+0xa4>
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 );
1123b7: 89 5d 0c mov %ebx,0xc(%ebp)
1123ba: 83 c2 68 add $0x68,%edx
1123bd: 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 );
}
1123c0: 8d 65 f4 lea -0xc(%ebp),%esp
1123c3: 5b pop %ebx
1123c4: 5e pop %esi
1123c5: 5f pop %edi
1123c6: c9 leave
1123c7: e9 28 fe ff ff jmp 1121f4 <_Chain_Append>
CORE_message_queue_Buffer_control *the_message,
int priority
)
{
#if defined(RTEMS_SCORE_COREMSG_ENABLE_MESSAGE_PRIORITY)
the_message->priority = priority;
1123cc: 8b 48 24 mov 0x24(%eax),%ecx
1123cf: 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;
1123d2: 8b 48 30 mov 0x30(%eax),%ecx
1123d5: 89 4b 0c mov %ecx,0xc(%ebx)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
1123d8: 8b 70 2c mov 0x2c(%eax),%esi
1123db: 8b 7d e4 mov -0x1c(%ebp),%edi
1123de: 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(
1123e0: 8b 43 08 mov 0x8(%ebx),%eax
1123e3: 89 45 10 mov %eax,0x10(%ebp)
1123e6: 89 5d 0c mov %ebx,0xc(%ebp)
1123e9: 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 );
}
1123ec: 8d 65 f4 lea -0xc(%ebp),%esp
1123ef: 5b pop %ebx
1123f0: 5e pop %esi
1123f1: 5f pop %edi
1123f2: c9 leave
the_thread->Wait.return_argument_second.immutable_object,
the_message->Contents.buffer,
the_message->Contents.size
);
_CORE_message_queue_Insert_message(
1123f3: e9 1c 4a 00 00 jmp 116e14 <_CORE_message_queue_Insert_message>
return;
}
#endif
}
if ( !wait ) {
1123f8: 80 7d db 00 cmpb $0x0,-0x25(%ebp)
1123fc: 75 13 jne 112411 <_CORE_message_queue_Seize+0xe9>
_ISR_Enable( level );
1123fe: ff 75 e4 pushl -0x1c(%ebp)
112401: 9d popf
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
112402: c7 40 34 04 00 00 00 movl $0x4,0x34(%eax)
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 );
}
112409: 8d 65 f4 lea -0xc(%ebp),%esp
11240c: 5b pop %ebx
11240d: 5e pop %esi
11240e: 5f pop %edi
11240f: c9 leave
112410: c3 ret
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;
112411: 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;
112418: 89 50 44 mov %edx,0x44(%eax)
executing->Wait.id = id;
11241b: 8b 5d dc mov -0x24(%ebp),%ebx
11241e: 89 58 20 mov %ebx,0x20(%eax)
executing->Wait.return_argument_second.mutable_object = buffer;
112421: 8b 75 e0 mov -0x20(%ebp),%esi
112424: 89 70 2c mov %esi,0x2c(%eax)
executing->Wait.return_argument = size_p;
112427: 89 48 28 mov %ecx,0x28(%eax)
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
11242a: ff 75 e4 pushl -0x1c(%ebp)
11242d: 9d popf
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
11242e: c7 45 10 58 43 11 00 movl $0x114358,0x10(%ebp)
112435: 8b 45 d4 mov -0x2c(%ebp),%eax
112438: 89 45 0c mov %eax,0xc(%ebp)
11243b: 89 55 08 mov %edx,0x8(%ebp)
}
11243e: 8d 65 f4 lea -0xc(%ebp),%esp
112441: 5b pop %ebx
112442: 5e pop %esi
112443: 5f pop %edi
112444: 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 );
112445: e9 32 1c 00 00 jmp 11407c <_Thread_queue_Enqueue_with_handler>
0010ab98 <_CORE_mutex_Initialize>:
CORE_mutex_Status _CORE_mutex_Initialize(
CORE_mutex_Control *the_mutex,
CORE_mutex_Attributes *the_mutex_attributes,
uint32_t initial_lock
)
{
10ab98: 55 push %ebp
10ab99: 89 e5 mov %esp,%ebp
10ab9b: 57 push %edi
10ab9c: 56 push %esi
10ab9d: 53 push %ebx
10ab9e: 83 ec 0c sub $0xc,%esp
10aba1: 8b 55 08 mov 0x8(%ebp),%edx
10aba4: 8b 5d 0c mov 0xc(%ebp),%ebx
10aba7: 8b 45 10 mov 0x10(%ebp),%eax
/* 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;
10abaa: 8d 7a 40 lea 0x40(%edx),%edi
10abad: b9 04 00 00 00 mov $0x4,%ecx
10abb2: 89 de mov %ebx,%esi
10abb4: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
the_mutex->lock = initial_lock;
10abb6: 89 42 50 mov %eax,0x50(%edx)
the_mutex->blocked_count = 0;
10abb9: c7 42 58 00 00 00 00 movl $0x0,0x58(%edx)
if ( initial_lock == CORE_MUTEX_LOCKED ) {
10abc0: 85 c0 test %eax,%eax
10abc2: 75 35 jne 10abf9 <_CORE_mutex_Initialize+0x61>
the_mutex->nest_count = 1;
10abc4: c7 42 54 01 00 00 00 movl $0x1,0x54(%edx)
the_mutex->holder = _Thread_Executing;
10abcb: 8b 0d 68 58 12 00 mov 0x125868,%ecx
10abd1: 89 4a 5c mov %ecx,0x5c(%edx)
the_mutex->holder_id = _Thread_Executing->Object.id;
10abd4: 8b 41 08 mov 0x8(%ecx),%eax
10abd7: 89 42 60 mov %eax,0x60(%edx)
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
10abda: 8b 42 48 mov 0x48(%edx),%eax
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 ) ||
10abdd: 83 f8 02 cmp $0x2,%eax
10abe0: 74 05 je 10abe7 <_CORE_mutex_Initialize+0x4f>
10abe2: 83 f8 03 cmp $0x3,%eax
10abe5: 75 27 jne 10ac0e <_CORE_mutex_Initialize+0x76>
_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
if ( _Thread_Executing->current_priority <
the_mutex->Attributes.priority_ceiling )
return CORE_MUTEX_STATUS_CEILING_VIOLATED;
10abe7: b8 06 00 00 00 mov $0x6,%eax
the_mutex->holder = _Thread_Executing;
the_mutex->holder_id = _Thread_Executing->Object.id;
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
if ( _Thread_Executing->current_priority <
10abec: 8b 72 4c mov 0x4c(%edx),%esi
10abef: 39 71 14 cmp %esi,0x14(%ecx)
10abf2: 72 36 jb 10ac2a <_CORE_mutex_Initialize+0x92><== NEVER TAKEN
_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++;
10abf4: ff 41 1c incl 0x1c(%ecx)
10abf7: eb 15 jmp 10ac0e <_CORE_mutex_Initialize+0x76>
}
} else {
the_mutex->nest_count = 0;
10abf9: c7 42 54 00 00 00 00 movl $0x0,0x54(%edx)
the_mutex->holder = NULL;
10ac00: c7 42 5c 00 00 00 00 movl $0x0,0x5c(%edx)
the_mutex->holder_id = 0;
10ac07: c7 42 60 00 00 00 00 movl $0x0,0x60(%edx)
}
_Thread_queue_Initialize(
10ac0e: 6a 05 push $0x5
10ac10: 68 00 04 00 00 push $0x400
10ac15: 31 c0 xor %eax,%eax
10ac17: 83 7b 08 00 cmpl $0x0,0x8(%ebx)
10ac1b: 0f 95 c0 setne %al
10ac1e: 50 push %eax
10ac1f: 52 push %edx
10ac20: e8 4b 1c 00 00 call 10c870 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_FIFO : THREAD_QUEUE_DISCIPLINE_PRIORITY,
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
10ac25: 83 c4 10 add $0x10,%esp
10ac28: 31 c0 xor %eax,%eax
}
10ac2a: 8d 65 f4 lea -0xc(%ebp),%esp
10ac2d: 5b pop %ebx
10ac2e: 5e pop %esi
10ac2f: 5f pop %edi
10ac30: c9 leave
10ac31: c3 ret
0010ac81 <_CORE_mutex_Seize>:
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
10ac81: 55 push %ebp
10ac82: 89 e5 mov %esp,%ebp
10ac84: 53 push %ebx
10ac85: 83 ec 14 sub $0x14,%esp
10ac88: 8b 5d 08 mov 0x8(%ebp),%ebx
10ac8b: 8a 55 10 mov 0x10(%ebp),%dl
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
10ac8e: a1 40 53 12 00 mov 0x125340,%eax
10ac93: 85 c0 test %eax,%eax
10ac95: 74 19 je 10acb0 <_CORE_mutex_Seize+0x2f>
10ac97: 84 d2 test %dl,%dl
10ac99: 74 15 je 10acb0 <_CORE_mutex_Seize+0x2f><== NEVER TAKEN
10ac9b: 83 3d 9c 54 12 00 01 cmpl $0x1,0x12549c
10aca2: 76 0c jbe 10acb0 <_CORE_mutex_Seize+0x2f>
10aca4: 53 push %ebx
10aca5: 6a 12 push $0x12
10aca7: 6a 00 push $0x0
10aca9: 6a 00 push $0x0
10acab: e8 dc 05 00 00 call 10b28c <_Internal_error_Occurred>
10acb0: 51 push %ecx
10acb1: 51 push %ecx
10acb2: 8d 45 18 lea 0x18(%ebp),%eax
10acb5: 50 push %eax
10acb6: 53 push %ebx
10acb7: 88 55 f4 mov %dl,-0xc(%ebp)
10acba: e8 d5 47 00 00 call 10f494 <_CORE_mutex_Seize_interrupt_trylock>
10acbf: 83 c4 10 add $0x10,%esp
10acc2: 85 c0 test %eax,%eax
10acc4: 8a 55 f4 mov -0xc(%ebp),%dl
10acc7: 74 48 je 10ad11 <_CORE_mutex_Seize+0x90>
10acc9: 84 d2 test %dl,%dl
10accb: 75 12 jne 10acdf <_CORE_mutex_Seize+0x5e>
10accd: ff 75 18 pushl 0x18(%ebp)
10acd0: 9d popf
10acd1: a1 68 58 12 00 mov 0x125868,%eax
10acd6: c7 40 34 01 00 00 00 movl $0x1,0x34(%eax)
10acdd: eb 32 jmp 10ad11 <_CORE_mutex_Seize+0x90>
10acdf: c7 43 30 01 00 00 00 movl $0x1,0x30(%ebx)
10ace6: a1 68 58 12 00 mov 0x125868,%eax
10aceb: 89 58 44 mov %ebx,0x44(%eax)
10acee: 8b 55 0c mov 0xc(%ebp),%edx
10acf1: 89 50 20 mov %edx,0x20(%eax)
10acf4: a1 40 53 12 00 mov 0x125340,%eax
10acf9: 40 inc %eax
10acfa: a3 40 53 12 00 mov %eax,0x125340
10acff: ff 75 18 pushl 0x18(%ebp)
10ad02: 9d popf
10ad03: 50 push %eax
10ad04: 50 push %eax
10ad05: ff 75 14 pushl 0x14(%ebp)
10ad08: 53 push %ebx
10ad09: e8 26 ff ff ff call 10ac34 <_CORE_mutex_Seize_interrupt_blocking>
10ad0e: 83 c4 10 add $0x10,%esp
}
10ad11: 8b 5d fc mov -0x4(%ebp),%ebx
10ad14: c9 leave
10ad15: c3 ret
0010ae3c <_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
)
{
10ae3c: 55 push %ebp
10ae3d: 89 e5 mov %esp,%ebp
10ae3f: 53 push %ebx
10ae40: 83 ec 10 sub $0x10,%esp
10ae43: 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)) ) {
10ae46: 53 push %ebx
10ae47: e8 ec 16 00 00 call 10c538 <_Thread_queue_Dequeue>
10ae4c: 89 c2 mov %eax,%edx
10ae4e: 83 c4 10 add $0x10,%esp
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
10ae51: 31 c0 xor %eax,%eax
if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) {
10ae53: 85 d2 test %edx,%edx
10ae55: 75 15 jne 10ae6c <_CORE_semaphore_Surrender+0x30>
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
10ae57: 9c pushf
10ae58: fa cli
10ae59: 59 pop %ecx
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
10ae5a: 8b 53 48 mov 0x48(%ebx),%edx
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
10ae5d: b0 04 mov $0x4,%al
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
10ae5f: 3b 53 40 cmp 0x40(%ebx),%edx
10ae62: 73 06 jae 10ae6a <_CORE_semaphore_Surrender+0x2e><== NEVER TAKEN
the_semaphore->count += 1;
10ae64: 42 inc %edx
10ae65: 89 53 48 mov %edx,0x48(%ebx)
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
10ae68: 30 c0 xor %al,%al
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
10ae6a: 51 push %ecx
10ae6b: 9d popf
}
return status;
}
10ae6c: 8b 5d fc mov -0x4(%ebp),%ebx
10ae6f: c9 leave
10ae70: c3 ret
00109da0 <_Event_Surrender>:
*/
void _Event_Surrender(
Thread_Control *the_thread
)
{
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 2c sub $0x2c,%esp
109da9: 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 ];
109dac: 8b bb e8 00 00 00 mov 0xe8(%ebx),%edi
option_set = (rtems_option) the_thread->Wait.option;
109db2: 8b 43 30 mov 0x30(%ebx),%eax
109db5: 89 45 e0 mov %eax,-0x20(%ebp)
_ISR_Disable( level );
109db8: 9c pushf
109db9: fa cli
109dba: 58 pop %eax
pending_events = api->pending_events;
109dbb: 8b 17 mov (%edi),%edx
109dbd: 89 55 d4 mov %edx,-0x2c(%ebp)
event_condition = (rtems_event_set) the_thread->Wait.count;
109dc0: 8b 73 24 mov 0x24(%ebx),%esi
seized_events = _Event_sets_Get( pending_events, event_condition );
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
109dc3: 21 f2 and %esi,%edx
109dc5: 75 07 jne 109dce <_Event_Surrender+0x2e>
_ISR_Enable( level );
109dc7: 50 push %eax
109dc8: 9d popf
return;
109dc9: e9 af 00 00 00 jmp 109e7d <_Event_Surrender+0xdd>
/*
* 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() &&
109dce: 83 3d 64 58 12 00 00 cmpl $0x0,0x125864
109dd5: 74 49 je 109e20 <_Event_Surrender+0x80>
109dd7: 3b 1d 68 58 12 00 cmp 0x125868,%ebx
109ddd: 75 41 jne 109e20 <_Event_Surrender+0x80>
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
109ddf: 8b 0d 3c 5c 12 00 mov 0x125c3c,%ecx
/*
* 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 ) &&
109de5: 83 f9 02 cmp $0x2,%ecx
109de8: 74 09 je 109df3 <_Event_Surrender+0x53> <== NEVER TAKEN
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
109dea: 8b 0d 3c 5c 12 00 mov 0x125c3c,%ecx
* 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) ||
109df0: 49 dec %ecx
109df1: 75 2d jne 109e20 <_Event_Surrender+0x80>
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
109df3: 39 f2 cmp %esi,%edx
109df5: 74 06 je 109dfd <_Event_Surrender+0x5d>
109df7: f6 45 e0 02 testb $0x2,-0x20(%ebp)
109dfb: 74 1f je 109e1c <_Event_Surrender+0x7c> <== 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) );
109dfd: 89 d6 mov %edx,%esi
109dff: f7 d6 not %esi
109e01: 23 75 d4 and -0x2c(%ebp),%esi
109e04: 89 37 mov %esi,(%edi)
api->pending_events = _Event_sets_Clear( pending_events,seized_events );
the_thread->Wait.count = 0;
109e06: c7 43 24 00 00 00 00 movl $0x0,0x24(%ebx)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
109e0d: 8b 4b 28 mov 0x28(%ebx),%ecx
109e10: 89 11 mov %edx,(%ecx)
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
109e12: c7 05 3c 5c 12 00 03 movl $0x3,0x125c3c
109e19: 00 00 00
}
_ISR_Enable( level );
109e1c: 50 push %eax
109e1d: 9d popf
return;
109e1e: eb 5d jmp 109e7d <_Event_Surrender+0xdd>
}
/*
* Otherwise, this is a normal send to another thread
*/
if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
109e20: f6 43 11 01 testb $0x1,0x11(%ebx)
109e24: 74 55 je 109e7b <_Event_Surrender+0xdb>
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
109e26: 39 f2 cmp %esi,%edx
109e28: 74 06 je 109e30 <_Event_Surrender+0x90>
109e2a: f6 45 e0 02 testb $0x2,-0x20(%ebp)
109e2e: 74 4b je 109e7b <_Event_Surrender+0xdb> <== NEVER TAKEN
109e30: 89 d6 mov %edx,%esi
109e32: f7 d6 not %esi
109e34: 23 75 d4 and -0x2c(%ebp),%esi
109e37: 89 37 mov %esi,(%edi)
api->pending_events = _Event_sets_Clear( pending_events, seized_events );
the_thread->Wait.count = 0;
109e39: c7 43 24 00 00 00 00 movl $0x0,0x24(%ebx)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
109e40: 8b 4b 28 mov 0x28(%ebx),%ecx
109e43: 89 11 mov %edx,(%ecx)
_ISR_Flash( level );
109e45: 50 push %eax
109e46: 9d popf
109e47: fa cli
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
109e48: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
109e4c: 74 06 je 109e54 <_Event_Surrender+0xb4>
_ISR_Enable( level );
109e4e: 50 push %eax
109e4f: 9d popf
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
109e50: 51 push %ecx
109e51: 51 push %ecx
109e52: eb 17 jmp 109e6b <_Event_Surrender+0xcb>
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
109e54: c7 43 50 03 00 00 00 movl $0x3,0x50(%ebx)
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
109e5b: 50 push %eax
109e5c: 9d popf
(void) _Watchdog_Remove( &the_thread->Timer );
109e5d: 83 ec 0c sub $0xc,%esp
109e60: 8d 43 48 lea 0x48(%ebx),%eax
109e63: 50 push %eax
109e64: e8 c7 30 00 00 call 10cf30 <_Watchdog_Remove>
109e69: 58 pop %eax
109e6a: 5a pop %edx
109e6b: 68 f8 ff 03 10 push $0x1003fff8
109e70: 53 push %ebx
109e71: e8 6e 20 00 00 call 10bee4 <_Thread_Clear_state>
109e76: 83 c4 10 add $0x10,%esp
109e79: eb 02 jmp 109e7d <_Event_Surrender+0xdd>
_Thread_Unblock( the_thread );
}
return;
}
}
_ISR_Enable( level );
109e7b: 50 push %eax
109e7c: 9d popf
}
109e7d: 8d 65 f4 lea -0xc(%ebp),%esp
109e80: 5b pop %ebx
109e81: 5e pop %esi
109e82: 5f pop %edi
109e83: c9 leave
109e84: c3 ret
00109e88 <_Event_Timeout>:
void _Event_Timeout(
Objects_Id id,
void *ignored
)
{
109e88: 55 push %ebp
109e89: 89 e5 mov %esp,%ebp
109e8b: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
ISR_Level level;
the_thread = _Thread_Get( id, &location );
109e8e: 8d 45 f4 lea -0xc(%ebp),%eax
109e91: 50 push %eax
109e92: ff 75 08 pushl 0x8(%ebp)
109e95: e8 82 23 00 00 call 10c21c <_Thread_Get>
switch ( location ) {
109e9a: 83 c4 10 add $0x10,%esp
109e9d: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
109ea1: 75 49 jne 109eec <_Event_Timeout+0x64> <== 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 );
109ea3: 9c pushf
109ea4: fa cli
109ea5: 5a pop %edx
_ISR_Enable( level );
return;
}
#endif
the_thread->Wait.count = 0;
109ea6: c7 40 24 00 00 00 00 movl $0x0,0x24(%eax)
if ( _Thread_Is_executing( the_thread ) ) {
109ead: 3b 05 68 58 12 00 cmp 0x125868,%eax
109eb3: 75 13 jne 109ec8 <_Event_Timeout+0x40>
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
109eb5: 8b 0d 3c 5c 12 00 mov 0x125c3c,%ecx
109ebb: 49 dec %ecx
109ebc: 75 0a jne 109ec8 <_Event_Timeout+0x40>
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
109ebe: c7 05 3c 5c 12 00 02 movl $0x2,0x125c3c
109ec5: 00 00 00
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
109ec8: c7 40 34 06 00 00 00 movl $0x6,0x34(%eax)
_ISR_Enable( level );
109ecf: 52 push %edx
109ed0: 9d popf
109ed1: 52 push %edx
109ed2: 52 push %edx
109ed3: 68 f8 ff 03 10 push $0x1003fff8
109ed8: 50 push %eax
109ed9: e8 06 20 00 00 call 10bee4 <_Thread_Clear_state>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
109ede: a1 40 53 12 00 mov 0x125340,%eax
109ee3: 48 dec %eax
109ee4: a3 40 53 12 00 mov %eax,0x125340
_Thread_Unblock( the_thread );
_Thread_Unnest_dispatch();
break;
109ee9: 83 c4 10 add $0x10,%esp
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
109eec: c9 leave
109eed: c3 ret
0010faeb <_Heap_Extend>:
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
10faeb: 55 push %ebp
10faec: 89 e5 mov %esp,%ebp
10faee: 57 push %edi
10faef: 56 push %esi
10faf0: 53 push %ebx
10faf1: 83 ec 4c sub $0x4c,%esp
10faf4: 8b 5d 08 mov 0x8(%ebp),%ebx
10faf7: 8b 4d 10 mov 0x10(%ebp),%ecx
Heap_Statistics *const stats = &heap->stats;
Heap_Block *const first_block = heap->first_block;
10fafa: 8b 43 20 mov 0x20(%ebx),%eax
10fafd: 89 45 c0 mov %eax,-0x40(%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;
10fb00: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
Heap_Block *extend_last_block = NULL;
10fb07: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
uintptr_t const page_size = heap->page_size;
10fb0e: 8b 53 10 mov 0x10(%ebx),%edx
10fb11: 89 55 c4 mov %edx,-0x3c(%ebp)
uintptr_t const min_block_size = heap->min_block_size;
10fb14: 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;
10fb17: 8b 7b 30 mov 0x30(%ebx),%edi
10fb1a: 89 7d bc mov %edi,-0x44(%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 ) {
return false;
10fb1d: 31 f6 xor %esi,%esi
uintptr_t const free_size = stats->free_size;
uintptr_t extend_first_block_size = 0;
uintptr_t extended_size = 0;
bool extend_area_ok = false;
if ( extend_area_end < extend_area_begin ) {
10fb1f: 8b 7d 0c mov 0xc(%ebp),%edi
10fb22: 01 cf add %ecx,%edi
10fb24: 0f 82 d4 01 00 00 jb 10fcfe <_Heap_Extend+0x213>
return false;
}
extend_area_ok = _Heap_Get_first_and_last_block(
10fb2a: 52 push %edx
10fb2b: 52 push %edx
10fb2c: 8d 55 e0 lea -0x20(%ebp),%edx
10fb2f: 52 push %edx
10fb30: 8d 55 e4 lea -0x1c(%ebp),%edx
10fb33: 52 push %edx
10fb34: 50 push %eax
10fb35: ff 75 c4 pushl -0x3c(%ebp)
10fb38: 51 push %ecx
10fb39: ff 75 0c pushl 0xc(%ebp)
10fb3c: e8 6e b8 ff ff call 10b3af <_Heap_Get_first_and_last_block>
page_size,
min_block_size,
&extend_first_block,
&extend_last_block
);
if (!extend_area_ok ) {
10fb41: 83 c4 20 add $0x20,%esp
10fb44: 84 c0 test %al,%al
10fb46: 0f 84 b2 01 00 00 je 10fcfe <_Heap_Extend+0x213>
10fb4c: 8b 4d c0 mov -0x40(%ebp),%ecx
10fb4f: c7 45 cc 00 00 00 00 movl $0x0,-0x34(%ebp)
10fb56: c7 45 c8 00 00 00 00 movl $0x0,-0x38(%ebp)
10fb5d: 31 f6 xor %esi,%esi
10fb5f: c7 45 d0 00 00 00 00 movl $0x0,-0x30(%ebp)
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
10fb66: 8b 43 18 mov 0x18(%ebx),%eax
10fb69: 89 5d b8 mov %ebx,-0x48(%ebp)
10fb6c: eb 02 jmp 10fb70 <_Heap_Extend+0x85>
10fb6e: 89 c8 mov %ecx,%eax
uintptr_t const sub_area_end = start_block->prev_size;
10fb70: 8b 19 mov (%ecx),%ebx
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
10fb72: 39 c7 cmp %eax,%edi
10fb74: 76 09 jbe 10fb7f <_Heap_Extend+0x94>
10fb76: 39 5d 0c cmp %ebx,0xc(%ebp)
10fb79: 0f 82 7d 01 00 00 jb 10fcfc <_Heap_Extend+0x211> <== NEVER TAKEN
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
10fb7f: 39 c7 cmp %eax,%edi
10fb81: 74 06 je 10fb89 <_Heap_Extend+0x9e>
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
10fb83: 39 df cmp %ebx,%edi
10fb85: 72 07 jb 10fb8e <_Heap_Extend+0xa3>
10fb87: eb 08 jmp 10fb91 <_Heap_Extend+0xa6>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
10fb89: 89 4d d0 mov %ecx,-0x30(%ebp)
10fb8c: eb 03 jmp 10fb91 <_Heap_Extend+0xa6>
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
10fb8e: 89 4d c8 mov %ecx,-0x38(%ebp)
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
10fb91: 8d 43 f8 lea -0x8(%ebx),%eax
10fb94: 89 45 d4 mov %eax,-0x2c(%ebp)
10fb97: 89 d8 mov %ebx,%eax
10fb99: 31 d2 xor %edx,%edx
10fb9b: f7 75 c4 divl -0x3c(%ebp)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
10fb9e: 29 55 d4 sub %edx,-0x2c(%ebp)
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
10fba1: 3b 5d 0c cmp 0xc(%ebp),%ebx
10fba4: 75 07 jne 10fbad <_Heap_Extend+0xc2>
start_block->prev_size = extend_area_end;
10fba6: 89 39 mov %edi,(%ecx)
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 )
10fba8: 8b 75 d4 mov -0x2c(%ebp),%esi
10fbab: eb 08 jmp 10fbb5 <_Heap_Extend+0xca>
merge_above_block = end_block;
} else if ( sub_area_end < extend_area_begin ) {
10fbad: 73 06 jae 10fbb5 <_Heap_Extend+0xca>
10fbaf: 8b 55 d4 mov -0x2c(%ebp),%edx
10fbb2: 89 55 cc mov %edx,-0x34(%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;
10fbb5: 8b 45 d4 mov -0x2c(%ebp),%eax
10fbb8: 8b 48 04 mov 0x4(%eax),%ecx
10fbbb: 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);
10fbbe: 01 c1 add %eax,%ecx
link_above_block = end_block;
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
10fbc0: 3b 4d c0 cmp -0x40(%ebp),%ecx
10fbc3: 75 a9 jne 10fb6e <_Heap_Extend+0x83>
10fbc5: 8b 5d b8 mov -0x48(%ebp),%ebx
if ( extend_area_begin < heap->area_begin ) {
10fbc8: 8b 55 0c mov 0xc(%ebp),%edx
10fbcb: 3b 53 18 cmp 0x18(%ebx),%edx
10fbce: 73 05 jae 10fbd5 <_Heap_Extend+0xea>
heap->area_begin = extend_area_begin;
10fbd0: 89 53 18 mov %edx,0x18(%ebx)
10fbd3: eb 08 jmp 10fbdd <_Heap_Extend+0xf2>
} else if ( heap->area_end < extend_area_end ) {
10fbd5: 39 7b 1c cmp %edi,0x1c(%ebx)
10fbd8: 73 03 jae 10fbdd <_Heap_Extend+0xf2>
heap->area_end = extend_area_end;
10fbda: 89 7b 1c mov %edi,0x1c(%ebx)
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
10fbdd: 8b 45 e0 mov -0x20(%ebp),%eax
10fbe0: 8b 55 e4 mov -0x1c(%ebp),%edx
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
10fbe3: 89 c1 mov %eax,%ecx
10fbe5: 29 d1 sub %edx,%ecx
10fbe7: 89 4d d4 mov %ecx,-0x2c(%ebp)
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
10fbea: 89 3a mov %edi,(%edx)
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
10fbec: 83 c9 01 or $0x1,%ecx
10fbef: 89 4a 04 mov %ecx,0x4(%edx)
_Heap_Protection_block_initialize( heap, extend_first_block );
extend_last_block->prev_size = extend_first_block_size;
10fbf2: 8b 4d d4 mov -0x2c(%ebp),%ecx
10fbf5: 89 08 mov %ecx,(%eax)
extend_last_block->size_and_flag = 0;
10fbf7: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
10fbfe: 39 53 20 cmp %edx,0x20(%ebx)
10fc01: 76 05 jbe 10fc08 <_Heap_Extend+0x11d>
heap->first_block = extend_first_block;
10fc03: 89 53 20 mov %edx,0x20(%ebx)
10fc06: eb 08 jmp 10fc10 <_Heap_Extend+0x125>
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
10fc08: 39 43 24 cmp %eax,0x24(%ebx)
10fc0b: 73 03 jae 10fc10 <_Heap_Extend+0x125>
heap->last_block = extend_last_block;
10fc0d: 89 43 24 mov %eax,0x24(%ebx)
}
if ( merge_below_block != NULL ) {
10fc10: 83 7d d0 00 cmpl $0x0,-0x30(%ebp)
10fc14: 74 3b je 10fc51 <_Heap_Extend+0x166>
Heap_Control *heap,
uintptr_t extend_area_begin,
Heap_Block *first_block
)
{
uintptr_t const page_size = heap->page_size;
10fc16: 8b 43 10 mov 0x10(%ebx),%eax
10fc19: 89 45 d4 mov %eax,-0x2c(%ebp)
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
10fc1c: 8b 4d 0c mov 0xc(%ebp),%ecx
10fc1f: 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;
10fc22: 89 c8 mov %ecx,%eax
10fc24: 31 d2 xor %edx,%edx
10fc26: f7 75 d4 divl -0x2c(%ebp)
if ( remainder != 0 ) {
10fc29: 85 d2 test %edx,%edx
10fc2b: 74 05 je 10fc32 <_Heap_Extend+0x147>
return value - remainder + alignment;
10fc2d: 03 4d d4 add -0x2c(%ebp),%ecx
10fc30: 29 d1 sub %edx,%ecx
uintptr_t const new_first_block_begin =
10fc32: 8d 51 f8 lea -0x8(%ecx),%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;
10fc35: 8b 45 d0 mov -0x30(%ebp),%eax
10fc38: 8b 00 mov (%eax),%eax
10fc3a: 89 41 f8 mov %eax,-0x8(%ecx)
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 =
10fc3d: 8b 45 d0 mov -0x30(%ebp),%eax
10fc40: 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;
10fc42: 83 c8 01 or $0x1,%eax
10fc45: 89 42 04 mov %eax,0x4(%edx)
_Heap_Free_block( heap, new_first_block );
10fc48: 89 d8 mov %ebx,%eax
10fc4a: e8 81 fe ff ff call 10fad0 <_Heap_Free_block>
10fc4f: eb 14 jmp 10fc65 <_Heap_Extend+0x17a>
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 ) {
10fc51: 83 7d c8 00 cmpl $0x0,-0x38(%ebp)
10fc55: 74 0e je 10fc65 <_Heap_Extend+0x17a>
_Heap_Link_below(
10fc57: 8b 55 e0 mov -0x20(%ebp),%edx
{
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;
10fc5a: 8b 45 c8 mov -0x38(%ebp),%eax
10fc5d: 29 d0 sub %edx,%eax
10fc5f: 83 c8 01 or $0x1,%eax
10fc62: 89 42 04 mov %eax,0x4(%edx)
link_below_block,
extend_last_block
);
}
if ( merge_above_block != NULL ) {
10fc65: 85 f6 test %esi,%esi
10fc67: 74 30 je 10fc99 <_Heap_Extend+0x1ae>
)
{
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,
10fc69: 83 ef 08 sub $0x8,%edi
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(
10fc6c: 29 f7 sub %esi,%edi
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
10fc6e: 89 f8 mov %edi,%eax
10fc70: 31 d2 xor %edx,%edx
10fc72: f7 73 10 divl 0x10(%ebx)
10fc75: 29 d7 sub %edx,%edi
);
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)
10fc77: 8b 46 04 mov 0x4(%esi),%eax
10fc7a: 29 f8 sub %edi,%eax
| HEAP_PREV_BLOCK_USED;
10fc7c: 83 c8 01 or $0x1,%eax
10fc7f: 89 44 37 04 mov %eax,0x4(%edi,%esi,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;
10fc83: 8b 46 04 mov 0x4(%esi),%eax
10fc86: 83 e0 01 and $0x1,%eax
block->size_and_flag = size | flag;
10fc89: 09 f8 or %edi,%eax
10fc8b: 89 46 04 mov %eax,0x4(%esi)
_Heap_Block_set_size( last_block, last_block_new_size );
_Heap_Free_block( heap, last_block );
10fc8e: 89 f2 mov %esi,%edx
10fc90: 89 d8 mov %ebx,%eax
10fc92: e8 39 fe ff ff call 10fad0 <_Heap_Free_block>
10fc97: eb 21 jmp 10fcba <_Heap_Extend+0x1cf>
);
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
10fc99: 83 7d cc 00 cmpl $0x0,-0x34(%ebp)
10fc9d: 74 1b je 10fcba <_Heap_Extend+0x1cf>
_Heap_Link_above(
10fc9f: 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 );
10fca2: 8b 45 e4 mov -0x1c(%ebp),%eax
10fca5: 2b 45 cc sub -0x34(%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;
10fca8: 8b 7d cc mov -0x34(%ebp),%edi
10fcab: 8b 57 04 mov 0x4(%edi),%edx
10fcae: 83 e2 01 and $0x1,%edx
block->size_and_flag = size | flag;
10fcb1: 09 d0 or %edx,%eax
10fcb3: 89 47 04 mov %eax,0x4(%edi)
last_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
10fcb6: 83 49 04 01 orl $0x1,0x4(%ecx)
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
10fcba: 85 f6 test %esi,%esi
10fcbc: 75 10 jne 10fcce <_Heap_Extend+0x1e3>
10fcbe: 83 7d d0 00 cmpl $0x0,-0x30(%ebp)
10fcc2: 75 0a jne 10fcce <_Heap_Extend+0x1e3>
_Heap_Free_block( heap, extend_first_block );
10fcc4: 8b 55 e4 mov -0x1c(%ebp),%edx
10fcc7: 89 d8 mov %ebx,%eax
10fcc9: e8 02 fe ff ff call 10fad0 <_Heap_Free_block>
*/
RTEMS_INLINE_ROUTINE void _Heap_Set_last_block_size( Heap_Control *heap )
{
_Heap_Block_set_size(
heap->last_block,
(uintptr_t) heap->first_block - (uintptr_t) heap->last_block
10fcce: 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(
10fcd1: 8b 43 20 mov 0x20(%ebx),%eax
10fcd4: 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;
10fcd6: 8b 4a 04 mov 0x4(%edx),%ecx
10fcd9: 83 e1 01 and $0x1,%ecx
block->size_and_flag = size | flag;
10fcdc: 09 c8 or %ecx,%eax
10fcde: 89 42 04 mov %eax,0x4(%edx)
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
10fce1: 8b 43 30 mov 0x30(%ebx),%eax
10fce4: 2b 45 bc sub -0x44(%ebp),%eax
/* Statistics */
stats->size += extended_size;
10fce7: 01 43 2c add %eax,0x2c(%ebx)
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
10fcea: be 01 00 00 00 mov $0x1,%esi
extended_size = stats->free_size - free_size;
/* Statistics */
stats->size += extended_size;
if ( extended_size_ptr != NULL )
10fcef: 83 7d 14 00 cmpl $0x0,0x14(%ebp)
10fcf3: 74 09 je 10fcfe <_Heap_Extend+0x213> <== NEVER TAKEN
*extended_size_ptr = extended_size;
10fcf5: 8b 55 14 mov 0x14(%ebp),%edx
10fcf8: 89 02 mov %eax,(%edx)
10fcfa: eb 02 jmp 10fcfe <_Heap_Extend+0x213>
_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;
10fcfc: 31 f6 xor %esi,%esi
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
10fcfe: 89 f0 mov %esi,%eax
10fd00: 8d 65 f4 lea -0xc(%ebp),%esp
10fd03: 5b pop %ebx
10fd04: 5e pop %esi
10fd05: 5f pop %edi
10fd06: c9 leave
10fd07: c3 ret
0010f730 <_Heap_Free>:
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
{
10f730: 55 push %ebp
10f731: 89 e5 mov %esp,%ebp
10f733: 57 push %edi
10f734: 56 push %esi
10f735: 53 push %ebx
10f736: 83 ec 14 sub $0x14,%esp
10f739: 8b 4d 08 mov 0x8(%ebp),%ecx
10f73c: 8b 55 0c mov 0xc(%ebp),%edx
* If NULL return true so a free on NULL is considered a valid release. This
* is a special case that could be handled by the in heap check how-ever that
* would result in false being returned which is wrong.
*/
if ( alloc_begin_ptr == NULL ) {
return true;
10f73f: b0 01 mov $0x1,%al
/*
* If NULL return true so a free on NULL is considered a valid release. This
* is a special case that could be handled by the in heap check how-ever that
* would result in false being returned which is wrong.
*/
if ( alloc_begin_ptr == NULL ) {
10f741: 85 d2 test %edx,%edx
10f743: 0f 84 4b 01 00 00 je 10f894 <_Heap_Free+0x164>
10f749: 8d 5a f8 lea -0x8(%edx),%ebx
10f74c: 89 d0 mov %edx,%eax
10f74e: 31 d2 xor %edx,%edx
10f750: f7 71 10 divl 0x10(%ecx)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
10f753: 29 d3 sub %edx,%ebx
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
10f755: 8b 41 20 mov 0x20(%ecx),%eax
10f758: 89 45 ec mov %eax,-0x14(%ebp)
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
10f75b: 31 d2 xor %edx,%edx
10f75d: 39 c3 cmp %eax,%ebx
10f75f: 72 08 jb 10f769 <_Heap_Free+0x39>
10f761: 31 d2 xor %edx,%edx
10f763: 39 59 24 cmp %ebx,0x24(%ecx)
10f766: 0f 93 c2 setae %dl
alloc_begin = (uintptr_t) alloc_begin_ptr;
block = _Heap_Block_of_alloc_area( alloc_begin, heap->page_size );
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
return false;
10f769: 31 c0 xor %eax,%eax
}
alloc_begin = (uintptr_t) alloc_begin_ptr;
block = _Heap_Block_of_alloc_area( alloc_begin, heap->page_size );
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
10f76b: 85 d2 test %edx,%edx
10f76d: 0f 84 21 01 00 00 je 10f894 <_Heap_Free+0x164>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
10f773: 8b 43 04 mov 0x4(%ebx),%eax
10f776: 89 45 f0 mov %eax,-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;
10f779: 89 c6 mov %eax,%esi
10f77b: 83 e6 fe and $0xfffffffe,%esi
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
10f77e: 8d 14 33 lea (%ebx,%esi,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;
10f781: 31 ff xor %edi,%edi
10f783: 3b 55 ec cmp -0x14(%ebp),%edx
10f786: 72 0a jb 10f792 <_Heap_Free+0x62> <== NEVER TAKEN
10f788: 31 c0 xor %eax,%eax
10f78a: 39 51 24 cmp %edx,0x24(%ecx)
10f78d: 0f 93 c0 setae %al
10f790: 89 c7 mov %eax,%edi
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
return false;
10f792: 31 c0 xor %eax,%eax
_Heap_Protection_block_check( heap, block );
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
10f794: 85 ff test %edi,%edi
10f796: 0f 84 f8 00 00 00 je 10f894 <_Heap_Free+0x164> <== NEVER TAKEN
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
10f79c: 8b 7a 04 mov 0x4(%edx),%edi
return false;
}
_Heap_Protection_block_check( heap, next_block );
if ( !_Heap_Is_prev_used( next_block ) ) {
10f79f: f7 c7 01 00 00 00 test $0x1,%edi
10f7a5: 0f 84 e9 00 00 00 je 10f894 <_Heap_Free+0x164> <== 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;
10f7ab: 83 e7 fe and $0xfffffffe,%edi
10f7ae: 89 7d e8 mov %edi,-0x18(%ebp)
if ( !_Heap_Protection_determine_block_free( heap, block ) ) {
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
10f7b1: 8b 41 24 mov 0x24(%ecx),%eax
10f7b4: 89 45 e4 mov %eax,-0x1c(%ebp)
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
10f7b7: 31 c0 xor %eax,%eax
10f7b9: 3b 55 e4 cmp -0x1c(%ebp),%edx
10f7bc: 74 0a je 10f7c8 <_Heap_Free+0x98>
10f7be: 31 c0 xor %eax,%eax
10f7c0: f6 44 3a 04 01 testb $0x1,0x4(%edx,%edi,1)
10f7c5: 0f 94 c0 sete %al
if ( !_Heap_Protection_determine_block_free( heap, block ) ) {
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
10f7c8: 88 45 e3 mov %al,-0x1d(%ebp)
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
if ( !_Heap_Is_prev_used( block ) ) {
10f7cb: f6 45 f0 01 testb $0x1,-0x10(%ebp)
10f7cf: 75 62 jne 10f833 <_Heap_Free+0x103>
uintptr_t const prev_size = block->prev_size;
10f7d1: 8b 03 mov (%ebx),%eax
10f7d3: 89 45 f0 mov %eax,-0x10(%ebp)
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
10f7d6: 29 c3 sub %eax,%ebx
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;
10f7d8: 31 ff xor %edi,%edi
10f7da: 3b 5d ec cmp -0x14(%ebp),%ebx
10f7dd: 72 0a jb 10f7e9 <_Heap_Free+0xb9> <== NEVER TAKEN
10f7df: 31 c0 xor %eax,%eax
10f7e1: 39 5d e4 cmp %ebx,-0x1c(%ebp)
10f7e4: 0f 93 c0 setae %al
10f7e7: 89 c7 mov %eax,%edi
Heap_Block * const prev_block = _Heap_Block_at( block, -prev_size );
if ( !_Heap_Is_block_in_heap( heap, prev_block ) ) {
_HAssert( false );
return( false );
10f7e9: 31 c0 xor %eax,%eax
if ( !_Heap_Is_prev_used( block ) ) {
uintptr_t const prev_size = block->prev_size;
Heap_Block * const prev_block = _Heap_Block_at( block, -prev_size );
if ( !_Heap_Is_block_in_heap( heap, prev_block ) ) {
10f7eb: 85 ff test %edi,%edi
10f7ed: 0f 84 a1 00 00 00 je 10f894 <_Heap_Free+0x164> <== 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) ) {
10f7f3: f6 43 04 01 testb $0x1,0x4(%ebx)
10f7f7: 0f 84 97 00 00 00 je 10f894 <_Heap_Free+0x164> <== NEVER TAKEN
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
10f7fd: 80 7d e3 00 cmpb $0x0,-0x1d(%ebp)
10f801: 74 1a je 10f81d <_Heap_Free+0xed>
uintptr_t const size = block_size + prev_size + next_block_size;
10f803: 8b 45 e8 mov -0x18(%ebp),%eax
10f806: 8d 04 06 lea (%esi,%eax,1),%eax
10f809: 03 45 f0 add -0x10(%ebp),%eax
return _Heap_Free_list_tail(heap)->prev;
}
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
10f80c: 8b 7a 08 mov 0x8(%edx),%edi
Heap_Block *prev = block->prev;
10f80f: 8b 52 0c mov 0xc(%edx),%edx
prev->next = next;
10f812: 89 7a 08 mov %edi,0x8(%edx)
next->prev = prev;
10f815: 89 57 0c mov %edx,0xc(%edi)
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
10f818: ff 49 38 decl 0x38(%ecx)
10f81b: eb 33 jmp 10f850 <_Heap_Free+0x120>
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;
10f81d: 8b 45 f0 mov -0x10(%ebp),%eax
10f820: 8d 04 06 lea (%esi,%eax,1),%eax
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
10f823: 89 c7 mov %eax,%edi
10f825: 83 cf 01 or $0x1,%edi
10f828: 89 7b 04 mov %edi,0x4(%ebx)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
10f82b: 83 62 04 fe andl $0xfffffffe,0x4(%edx)
next_block->prev_size = size;
10f82f: 89 02 mov %eax,(%edx)
10f831: eb 56 jmp 10f889 <_Heap_Free+0x159>
}
} else if ( next_is_free ) { /* coalesce next */
10f833: 80 7d e3 00 cmpb $0x0,-0x1d(%ebp)
10f837: 74 24 je 10f85d <_Heap_Free+0x12d>
uintptr_t const size = block_size + next_block_size;
10f839: 8b 45 e8 mov -0x18(%ebp),%eax
10f83c: 01 f0 add %esi,%eax
RTEMS_INLINE_ROUTINE void _Heap_Free_list_replace(
Heap_Block *old_block,
Heap_Block *new_block
)
{
Heap_Block *next = old_block->next;
10f83e: 8b 7a 08 mov 0x8(%edx),%edi
Heap_Block *prev = old_block->prev;
10f841: 8b 52 0c mov 0xc(%edx),%edx
new_block->next = next;
10f844: 89 7b 08 mov %edi,0x8(%ebx)
new_block->prev = prev;
10f847: 89 53 0c mov %edx,0xc(%ebx)
next->prev = new_block;
10f84a: 89 5f 0c mov %ebx,0xc(%edi)
prev->next = new_block;
10f84d: 89 5a 08 mov %ebx,0x8(%edx)
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
10f850: 89 c2 mov %eax,%edx
10f852: 83 ca 01 or $0x1,%edx
10f855: 89 53 04 mov %edx,0x4(%ebx)
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
10f858: 89 04 03 mov %eax,(%ebx,%eax,1)
10f85b: eb 2c jmp 10f889 <_Heap_Free+0x159>
RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
Heap_Block *block_before,
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
10f85d: 8b 41 08 mov 0x8(%ecx),%eax
new_block->next = next;
10f860: 89 43 08 mov %eax,0x8(%ebx)
new_block->prev = block_before;
10f863: 89 4b 0c mov %ecx,0xc(%ebx)
block_before->next = new_block;
10f866: 89 59 08 mov %ebx,0x8(%ecx)
next->prev = new_block;
10f869: 89 58 0c mov %ebx,0xc(%eax)
} 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;
10f86c: 89 f0 mov %esi,%eax
10f86e: 83 c8 01 or $0x1,%eax
10f871: 89 43 04 mov %eax,0x4(%ebx)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
10f874: 83 62 04 fe andl $0xfffffffe,0x4(%edx)
next_block->prev_size = block_size;
10f878: 89 32 mov %esi,(%edx)
/* Statistics */
++stats->free_blocks;
10f87a: 8b 41 38 mov 0x38(%ecx),%eax
10f87d: 40 inc %eax
10f87e: 89 41 38 mov %eax,0x38(%ecx)
if ( stats->max_free_blocks < stats->free_blocks ) {
10f881: 39 41 3c cmp %eax,0x3c(%ecx)
10f884: 73 03 jae 10f889 <_Heap_Free+0x159>
stats->max_free_blocks = stats->free_blocks;
10f886: 89 41 3c mov %eax,0x3c(%ecx)
}
}
/* Statistics */
--stats->used_blocks;
10f889: ff 49 40 decl 0x40(%ecx)
++stats->frees;
10f88c: ff 41 50 incl 0x50(%ecx)
stats->free_size += block_size;
10f88f: 01 71 30 add %esi,0x30(%ecx)
return( true );
10f892: b0 01 mov $0x1,%al
}
10f894: 83 c4 14 add $0x14,%esp
10f897: 5b pop %ebx
10f898: 5e pop %esi
10f899: 5f pop %edi
10f89a: c9 leave
10f89b: c3 ret
0011d4e0 <_Heap_Size_of_alloc_area>:
bool _Heap_Size_of_alloc_area(
Heap_Control *heap,
void *alloc_begin_ptr,
uintptr_t *alloc_size
)
{
11d4e0: 55 push %ebp
11d4e1: 89 e5 mov %esp,%ebp
11d4e3: 57 push %edi
11d4e4: 56 push %esi
11d4e5: 53 push %ebx
11d4e6: 8b 5d 08 mov 0x8(%ebp),%ebx
11d4e9: 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);
11d4ec: 8d 4e f8 lea -0x8(%esi),%ecx
11d4ef: 89 f0 mov %esi,%eax
11d4f1: 31 d2 xor %edx,%edx
11d4f3: 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);
11d4f6: 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
11d4f8: 8b 53 20 mov 0x20(%ebx),%edx
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
11d4fb: 31 ff xor %edi,%edi
11d4fd: 39 d1 cmp %edx,%ecx
11d4ff: 72 0a jb 11d50b <_Heap_Size_of_alloc_area+0x2b>
11d501: 31 c0 xor %eax,%eax
11d503: 39 4b 24 cmp %ecx,0x24(%ebx)
11d506: 0f 93 c0 setae %al
11d509: 89 c7 mov %eax,%edi
Heap_Block *block = _Heap_Block_of_alloc_area( alloc_begin, page_size );
Heap_Block *next_block = NULL;
uintptr_t block_size = 0;
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
return false;
11d50b: 31 c0 xor %eax,%eax
uintptr_t const alloc_begin = (uintptr_t) alloc_begin_ptr;
Heap_Block *block = _Heap_Block_of_alloc_area( alloc_begin, page_size );
Heap_Block *next_block = NULL;
uintptr_t block_size = 0;
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
11d50d: 85 ff test %edi,%edi
11d50f: 74 30 je 11d541 <_Heap_Size_of_alloc_area+0x61>
- 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;
11d511: 8b 41 04 mov 0x4(%ecx),%eax
11d514: 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);
11d517: 01 c1 add %eax,%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;
11d519: 31 ff xor %edi,%edi
11d51b: 39 d1 cmp %edx,%ecx
11d51d: 72 0a jb 11d529 <_Heap_Size_of_alloc_area+0x49><== NEVER TAKEN
11d51f: 31 c0 xor %eax,%eax
11d521: 39 4b 24 cmp %ecx,0x24(%ebx)
11d524: 0f 93 c0 setae %al
11d527: 89 c7 mov %eax,%edi
if (
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
) {
return false;
11d529: 31 c0 xor %eax,%eax
}
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if (
11d52b: 85 ff test %edi,%edi
11d52d: 74 12 je 11d541 <_Heap_Size_of_alloc_area+0x61><== NEVER TAKEN
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
11d52f: f6 41 04 01 testb $0x1,0x4(%ecx)
11d533: 74 0c je 11d541 <_Heap_Size_of_alloc_area+0x61><== NEVER TAKEN
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
11d535: 29 f1 sub %esi,%ecx
11d537: 8d 51 04 lea 0x4(%ecx),%edx
11d53a: 8b 45 10 mov 0x10(%ebp),%eax
11d53d: 89 10 mov %edx,(%eax)
return true;
11d53f: b0 01 mov $0x1,%al
}
11d541: 5b pop %ebx
11d542: 5e pop %esi
11d543: 5f pop %edi
11d544: c9 leave
11d545: c3 ret
0010bca6 <_Heap_Walk>:
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
10bca6: 55 push %ebp
10bca7: 89 e5 mov %esp,%ebp
10bca9: 57 push %edi
10bcaa: 56 push %esi
10bcab: 53 push %ebx
10bcac: 83 ec 4c sub $0x4c,%esp
10bcaf: 8b 75 08 mov 0x8(%ebp),%esi
10bcb2: 8b 5d 0c mov 0xc(%ebp),%ebx
uintptr_t const page_size = heap->page_size;
10bcb5: 8b 46 10 mov 0x10(%esi),%eax
10bcb8: 89 45 d8 mov %eax,-0x28(%ebp)
uintptr_t const min_block_size = heap->min_block_size;
10bcbb: 8b 4e 14 mov 0x14(%esi),%ecx
10bcbe: 89 4d d4 mov %ecx,-0x2c(%ebp)
Heap_Block *const first_block = heap->first_block;
10bcc1: 8b 46 20 mov 0x20(%esi),%eax
10bcc4: 89 45 d0 mov %eax,-0x30(%ebp)
Heap_Block *const last_block = heap->last_block;
10bcc7: 8b 4e 24 mov 0x24(%esi),%ecx
10bcca: 89 4d c8 mov %ecx,-0x38(%ebp)
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
10bccd: c7 45 e4 68 bc 10 00 movl $0x10bc68,-0x1c(%ebp)
10bcd4: 80 7d 10 00 cmpb $0x0,0x10(%ebp)
10bcd8: 74 07 je 10bce1 <_Heap_Walk+0x3b>
10bcda: c7 45 e4 6d bc 10 00 movl $0x10bc6d,-0x1c(%ebp)
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
10bce1: b0 01 mov $0x1,%al
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;
if ( !_System_state_Is_up( _System_state_Get() ) ) {
10bce3: 83 3d 24 75 12 00 03 cmpl $0x3,0x127524
10bcea: 0f 85 e8 02 00 00 jne 10bfd8 <_Heap_Walk+0x332>
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)(
10bcf0: 52 push %edx
10bcf1: ff 76 0c pushl 0xc(%esi)
10bcf4: ff 76 08 pushl 0x8(%esi)
10bcf7: ff 75 c8 pushl -0x38(%ebp)
10bcfa: ff 75 d0 pushl -0x30(%ebp)
10bcfd: ff 76 1c pushl 0x1c(%esi)
10bd00: ff 76 18 pushl 0x18(%esi)
10bd03: ff 75 d4 pushl -0x2c(%ebp)
10bd06: ff 75 d8 pushl -0x28(%ebp)
10bd09: 68 dd 00 12 00 push $0x1200dd
10bd0e: 6a 00 push $0x0
10bd10: 53 push %ebx
10bd11: ff 55 e4 call *-0x1c(%ebp)
heap->area_begin, heap->area_end,
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
10bd14: 83 c4 30 add $0x30,%esp
10bd17: 83 7d d8 00 cmpl $0x0,-0x28(%ebp)
10bd1b: 75 0b jne 10bd28 <_Heap_Walk+0x82>
(*printer)( source, true, "page size is zero\n" );
10bd1d: 50 push %eax
10bd1e: 68 6e 01 12 00 push $0x12016e
10bd23: e9 6b 02 00 00 jmp 10bf93 <_Heap_Walk+0x2ed>
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
10bd28: f6 45 d8 03 testb $0x3,-0x28(%ebp)
10bd2c: 74 0d je 10bd3b <_Heap_Walk+0x95>
(*printer)(
10bd2e: ff 75 d8 pushl -0x28(%ebp)
10bd31: 68 81 01 12 00 push $0x120181
10bd36: e9 58 02 00 00 jmp 10bf93 <_Heap_Walk+0x2ed>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10bd3b: 8b 45 d4 mov -0x2c(%ebp),%eax
10bd3e: 31 d2 xor %edx,%edx
10bd40: f7 75 d8 divl -0x28(%ebp)
);
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
10bd43: 85 d2 test %edx,%edx
10bd45: 74 0d je 10bd54 <_Heap_Walk+0xae>
(*printer)(
10bd47: ff 75 d4 pushl -0x2c(%ebp)
10bd4a: 68 9f 01 12 00 push $0x12019f
10bd4f: e9 3f 02 00 00 jmp 10bf93 <_Heap_Walk+0x2ed>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
10bd54: 8b 45 d0 mov -0x30(%ebp),%eax
10bd57: 83 c0 08 add $0x8,%eax
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10bd5a: 31 d2 xor %edx,%edx
10bd5c: f7 75 d8 divl -0x28(%ebp)
);
return false;
}
if (
10bd5f: 85 d2 test %edx,%edx
10bd61: 74 0d je 10bd70 <_Heap_Walk+0xca>
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size )
) {
(*printer)(
10bd63: ff 75 d0 pushl -0x30(%ebp)
10bd66: 68 c3 01 12 00 push $0x1201c3
10bd6b: e9 23 02 00 00 jmp 10bf93 <_Heap_Walk+0x2ed>
);
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
10bd70: 8b 45 d0 mov -0x30(%ebp),%eax
10bd73: f6 40 04 01 testb $0x1,0x4(%eax)
10bd77: 75 0b jne 10bd84 <_Heap_Walk+0xde>
(*printer)(
10bd79: 57 push %edi
10bd7a: 68 f4 01 12 00 push $0x1201f4
10bd7f: e9 0f 02 00 00 jmp 10bf93 <_Heap_Walk+0x2ed>
- 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;
10bd84: 8b 4d c8 mov -0x38(%ebp),%ecx
10bd87: 8b 79 04 mov 0x4(%ecx),%edi
10bd8a: 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);
10bd8d: 01 cf add %ecx,%edi
);
return false;
}
if ( _Heap_Is_free( last_block ) ) {
10bd8f: f6 47 04 01 testb $0x1,0x4(%edi)
10bd93: 75 0b jne 10bda0 <_Heap_Walk+0xfa>
(*printer)(
10bd95: 56 push %esi
10bd96: 68 22 02 12 00 push $0x120222
10bd9b: e9 f3 01 00 00 jmp 10bf93 <_Heap_Walk+0x2ed>
);
return false;
}
if (
10bda0: 3b 7d d0 cmp -0x30(%ebp),%edi
10bda3: 74 0b je 10bdb0 <_Heap_Walk+0x10a>
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
10bda5: 51 push %ecx
10bda6: 68 37 02 12 00 push $0x120237
10bdab: e9 e3 01 00 00 jmp 10bf93 <_Heap_Walk+0x2ed>
int source,
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
10bdb0: 8b 46 10 mov 0x10(%esi),%eax
10bdb3: 89 45 e0 mov %eax,-0x20(%ebp)
block = next_block;
} while ( block != first_block );
return true;
}
10bdb6: 8b 4e 08 mov 0x8(%esi),%ecx
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
10bdb9: 89 75 dc mov %esi,-0x24(%ebp)
10bdbc: eb 75 jmp 10be33 <_Heap_Walk+0x18d>
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;
10bdbe: 31 c0 xor %eax,%eax
10bdc0: 39 4e 20 cmp %ecx,0x20(%esi)
10bdc3: 77 08 ja 10bdcd <_Heap_Walk+0x127>
10bdc5: 31 c0 xor %eax,%eax
10bdc7: 39 4e 24 cmp %ecx,0x24(%esi)
10bdca: 0f 93 c0 setae %al
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 ) {
if ( !_Heap_Is_block_in_heap( heap, free_block ) ) {
10bdcd: 85 c0 test %eax,%eax
10bdcf: 75 0b jne 10bddc <_Heap_Walk+0x136>
(*printer)(
10bdd1: 51 push %ecx
10bdd2: 68 66 02 12 00 push $0x120266
10bdd7: e9 b7 01 00 00 jmp 10bf93 <_Heap_Walk+0x2ed>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
10bddc: 8d 41 08 lea 0x8(%ecx),%eax
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10bddf: 31 d2 xor %edx,%edx
10bde1: f7 75 e0 divl -0x20(%ebp)
);
return false;
}
if (
10bde4: 85 d2 test %edx,%edx
10bde6: 74 0b je 10bdf3 <_Heap_Walk+0x14d>
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size )
) {
(*printer)(
10bde8: 51 push %ecx
10bde9: 68 86 02 12 00 push $0x120286
10bdee: e9 a0 01 00 00 jmp 10bf93 <_Heap_Walk+0x2ed>
- 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;
10bdf3: 8b 41 04 mov 0x4(%ecx),%eax
10bdf6: 83 e0 fe and $0xfffffffe,%eax
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
10bdf9: f6 44 01 04 01 testb $0x1,0x4(%ecx,%eax,1)
10bdfe: 74 0b je 10be0b <_Heap_Walk+0x165>
(*printer)(
10be00: 51 push %ecx
10be01: 68 b6 02 12 00 push $0x1202b6
10be06: e9 88 01 00 00 jmp 10bf93 <_Heap_Walk+0x2ed>
);
return false;
}
if ( free_block->prev != prev_block ) {
10be0b: 8b 41 0c mov 0xc(%ecx),%eax
10be0e: 3b 45 dc cmp -0x24(%ebp),%eax
10be11: 74 1a je 10be2d <_Heap_Walk+0x187>
(*printer)(
10be13: 83 ec 0c sub $0xc,%esp
10be16: 50 push %eax
10be17: 51 push %ecx
10be18: 68 d2 02 12 00 push $0x1202d2
10be1d: 6a 01 push $0x1
10be1f: 53 push %ebx
10be20: ff 55 e4 call *-0x1c(%ebp)
10be23: 83 c4 20 add $0x20,%esp
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
10be26: 31 c0 xor %eax,%eax
10be28: e9 ab 01 00 00 jmp 10bfd8 <_Heap_Walk+0x332>
return false;
}
prev_block = free_block;
free_block = free_block->next;
10be2d: 89 4d dc mov %ecx,-0x24(%ebp)
10be30: 8b 49 08 mov 0x8(%ecx),%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 ) {
10be33: 39 f1 cmp %esi,%ecx
10be35: 75 87 jne 10bdbe <_Heap_Walk+0x118>
10be37: 89 5d dc mov %ebx,-0x24(%ebp)
10be3a: eb 02 jmp 10be3e <_Heap_Walk+0x198>
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
10be3c: 89 df mov %ebx,%edi
return true;
}
10be3e: 8b 4f 04 mov 0x4(%edi),%ecx
10be41: 89 4d cc mov %ecx,-0x34(%ebp)
10be44: 83 e1 fe and $0xfffffffe,%ecx
10be47: 89 4d e0 mov %ecx,-0x20(%ebp)
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
10be4a: 8d 1c 0f lea (%edi,%ecx,1),%ebx
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;
10be4d: 31 c0 xor %eax,%eax
10be4f: 39 5e 20 cmp %ebx,0x20(%esi)
10be52: 77 08 ja 10be5c <_Heap_Walk+0x1b6> <== NEVER TAKEN
10be54: 31 c0 xor %eax,%eax
10be56: 39 5e 24 cmp %ebx,0x24(%esi)
10be59: 0f 93 c0 setae %al
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;
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
10be5c: 85 c0 test %eax,%eax
10be5e: 75 11 jne 10be71 <_Heap_Walk+0x1cb>
10be60: 89 d9 mov %ebx,%ecx
10be62: 8b 5d dc mov -0x24(%ebp),%ebx
(*printer)(
10be65: 83 ec 0c sub $0xc,%esp
10be68: 51 push %ecx
10be69: 57 push %edi
10be6a: 68 04 03 12 00 push $0x120304
10be6f: eb ac jmp 10be1d <_Heap_Walk+0x177>
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;
10be71: 3b 7d c8 cmp -0x38(%ebp),%edi
10be74: 0f 95 c1 setne %cl
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10be77: 8b 45 e0 mov -0x20(%ebp),%eax
10be7a: 31 d2 xor %edx,%edx
10be7c: f7 75 d8 divl -0x28(%ebp)
);
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
10be7f: 85 d2 test %edx,%edx
10be81: 74 15 je 10be98 <_Heap_Walk+0x1f2>
10be83: 84 c9 test %cl,%cl
10be85: 74 11 je 10be98 <_Heap_Walk+0x1f2>
10be87: 8b 5d dc mov -0x24(%ebp),%ebx
(*printer)(
10be8a: 83 ec 0c sub $0xc,%esp
10be8d: ff 75 e0 pushl -0x20(%ebp)
10be90: 57 push %edi
10be91: 68 31 03 12 00 push $0x120331
10be96: eb 85 jmp 10be1d <_Heap_Walk+0x177>
);
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
10be98: 8b 45 d4 mov -0x2c(%ebp),%eax
10be9b: 39 45 e0 cmp %eax,-0x20(%ebp)
10be9e: 73 18 jae 10beb8 <_Heap_Walk+0x212>
10bea0: 84 c9 test %cl,%cl
10bea2: 74 14 je 10beb8 <_Heap_Walk+0x212> <== NEVER TAKEN
10bea4: 8b 5d dc mov -0x24(%ebp),%ebx
(*printer)(
10bea7: 52 push %edx
10bea8: 52 push %edx
10bea9: 50 push %eax
10beaa: ff 75 e0 pushl -0x20(%ebp)
10bead: 57 push %edi
10beae: 68 5f 03 12 00 push $0x12035f
10beb3: e9 65 ff ff ff jmp 10be1d <_Heap_Walk+0x177>
);
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
10beb8: 39 fb cmp %edi,%ebx
10beba: 77 18 ja 10bed4 <_Heap_Walk+0x22e>
10bebc: 84 c9 test %cl,%cl
10bebe: 74 14 je 10bed4 <_Heap_Walk+0x22e>
10bec0: 89 d9 mov %ebx,%ecx
10bec2: 8b 5d dc mov -0x24(%ebp),%ebx
(*printer)(
10bec5: 83 ec 0c sub $0xc,%esp
10bec8: 51 push %ecx
10bec9: 57 push %edi
10beca: 68 8a 03 12 00 push $0x12038a
10becf: e9 49 ff ff ff jmp 10be1d <_Heap_Walk+0x177>
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;
10bed4: 8b 4d cc mov -0x34(%ebp),%ecx
10bed7: 83 e1 01 and $0x1,%ecx
10beda: 89 4d c4 mov %ecx,-0x3c(%ebp)
);
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
10bedd: f6 43 04 01 testb $0x1,0x4(%ebx)
10bee1: 0f 85 ba 00 00 00 jne 10bfa1 <_Heap_Walk+0x2fb>
block = next_block;
} while ( block != first_block );
return true;
}
10bee7: 8b 46 08 mov 0x8(%esi),%eax
10beea: 89 45 c0 mov %eax,-0x40(%ebp)
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
10beed: 8b 4f 08 mov 0x8(%edi),%ecx
10bef0: 89 4d b4 mov %ecx,-0x4c(%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)(
10bef3: ba aa 00 12 00 mov $0x1200aa,%edx
10bef8: 3b 4e 0c cmp 0xc(%esi),%ecx
10befb: 74 0e je 10bf0b <_Heap_Walk+0x265>
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
10befd: ba f1 ff 11 00 mov $0x11fff1,%edx
10bf02: 39 f1 cmp %esi,%ecx
10bf04: 75 05 jne 10bf0b <_Heap_Walk+0x265>
10bf06: ba b9 00 12 00 mov $0x1200b9,%edx
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 ?
10bf0b: 8b 47 0c mov 0xc(%edi),%eax
10bf0e: 89 45 cc mov %eax,-0x34(%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)(
10bf11: b8 c3 00 12 00 mov $0x1200c3,%eax
10bf16: 8b 4d c0 mov -0x40(%ebp),%ecx
10bf19: 39 4d cc cmp %ecx,-0x34(%ebp)
10bf1c: 74 0f je 10bf2d <_Heap_Walk+0x287>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
10bf1e: b8 f1 ff 11 00 mov $0x11fff1,%eax
10bf23: 39 75 cc cmp %esi,-0x34(%ebp)
10bf26: 75 05 jne 10bf2d <_Heap_Walk+0x287>
10bf28: b8 d3 00 12 00 mov $0x1200d3,%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)(
10bf2d: 83 ec 0c sub $0xc,%esp
10bf30: 52 push %edx
10bf31: ff 75 b4 pushl -0x4c(%ebp)
10bf34: 50 push %eax
10bf35: ff 75 cc pushl -0x34(%ebp)
10bf38: ff 75 e0 pushl -0x20(%ebp)
10bf3b: 57 push %edi
10bf3c: 68 be 03 12 00 push $0x1203be
10bf41: 6a 00 push $0x0
10bf43: ff 75 dc pushl -0x24(%ebp)
10bf46: ff 55 e4 call *-0x1c(%ebp)
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
10bf49: 8b 03 mov (%ebx),%eax
10bf4b: 83 c4 30 add $0x30,%esp
10bf4e: 39 45 e0 cmp %eax,-0x20(%ebp)
10bf51: 74 16 je 10bf69 <_Heap_Walk+0x2c3>
10bf53: 89 d9 mov %ebx,%ecx
10bf55: 8b 5d dc mov -0x24(%ebp),%ebx
(*printer)(
10bf58: 56 push %esi
10bf59: 51 push %ecx
10bf5a: 50 push %eax
10bf5b: ff 75 e0 pushl -0x20(%ebp)
10bf5e: 57 push %edi
10bf5f: 68 f3 03 12 00 push $0x1203f3
10bf64: e9 b4 fe ff ff jmp 10be1d <_Heap_Walk+0x177>
);
return false;
}
if ( !prev_used ) {
10bf69: 83 7d c4 00 cmpl $0x0,-0x3c(%ebp)
10bf6d: 75 0b jne 10bf7a <_Heap_Walk+0x2d4>
10bf6f: 8b 5d dc mov -0x24(%ebp),%ebx
(*printer)(
10bf72: 57 push %edi
10bf73: 68 2c 04 12 00 push $0x12042c
10bf78: eb 19 jmp 10bf93 <_Heap_Walk+0x2ed>
block = next_block;
} while ( block != first_block );
return true;
}
10bf7a: 8b 46 08 mov 0x8(%esi),%eax
10bf7d: eb 07 jmp 10bf86 <_Heap_Walk+0x2e0>
{
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 ) {
if ( free_block == block ) {
10bf7f: 39 f8 cmp %edi,%eax
10bf81: 74 4a je 10bfcd <_Heap_Walk+0x327>
return true;
}
free_block = free_block->next;
10bf83: 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 ) {
10bf86: 39 f0 cmp %esi,%eax
10bf88: 75 f5 jne 10bf7f <_Heap_Walk+0x2d9>
10bf8a: 8b 5d dc mov -0x24(%ebp),%ebx
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
10bf8d: 57 push %edi
10bf8e: 68 97 04 12 00 push $0x120497
10bf93: 6a 01 push $0x1
10bf95: 53 push %ebx
10bf96: ff 55 e4 call *-0x1c(%ebp)
10bf99: 83 c4 10 add $0x10,%esp
10bf9c: e9 85 fe ff ff jmp 10be26 <_Heap_Walk+0x180>
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
10bfa1: 83 7d c4 00 cmpl $0x0,-0x3c(%ebp)
10bfa5: 74 0e je 10bfb5 <_Heap_Walk+0x30f>
(*printer)(
10bfa7: 83 ec 0c sub $0xc,%esp
10bfaa: ff 75 e0 pushl -0x20(%ebp)
10bfad: 57 push %edi
10bfae: 68 5b 04 12 00 push $0x12045b
10bfb3: eb 0d jmp 10bfc2 <_Heap_Walk+0x31c>
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
10bfb5: 51 push %ecx
10bfb6: 51 push %ecx
10bfb7: ff 37 pushl (%edi)
10bfb9: ff 75 e0 pushl -0x20(%ebp)
10bfbc: 57 push %edi
10bfbd: 68 72 04 12 00 push $0x120472
10bfc2: 6a 00 push $0x0
10bfc4: ff 75 dc pushl -0x24(%ebp)
10bfc7: ff 55 e4 call *-0x1c(%ebp)
10bfca: 83 c4 20 add $0x20,%esp
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
10bfcd: 3b 5d d0 cmp -0x30(%ebp),%ebx
10bfd0: 0f 85 66 fe ff ff jne 10be3c <_Heap_Walk+0x196>
return true;
10bfd6: b0 01 mov $0x1,%al
}
10bfd8: 8d 65 f4 lea -0xc(%ebp),%esp
10bfdb: 5b pop %ebx
10bfdc: 5e pop %esi
10bfdd: 5f pop %edi
10bfde: c9 leave
10bfdf: c3 ret
0010b28c <_Internal_error_Occurred>:
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
10b28c: 55 push %ebp
10b28d: 89 e5 mov %esp,%ebp
10b28f: 53 push %ebx
10b290: 83 ec 08 sub $0x8,%esp
10b293: 8b 45 08 mov 0x8(%ebp),%eax
10b296: 8b 55 0c mov 0xc(%ebp),%edx
10b299: 8b 5d 10 mov 0x10(%ebp),%ebx
_Internal_errors_What_happened.the_source = the_source;
10b29c: a3 d8 53 12 00 mov %eax,0x1253d8
_Internal_errors_What_happened.is_internal = is_internal;
10b2a1: 88 15 dc 53 12 00 mov %dl,0x1253dc
_Internal_errors_What_happened.the_error = the_error;
10b2a7: 89 1d e0 53 12 00 mov %ebx,0x1253e0
_User_extensions_Fatal( the_source, is_internal, the_error );
10b2ad: 53 push %ebx
10b2ae: 0f b6 d2 movzbl %dl,%edx
10b2b1: 52 push %edx
10b2b2: 50 push %eax
10b2b3: e8 37 1a 00 00 call 10ccef <_User_extensions_Fatal>
RTEMS_INLINE_ROUTINE void _System_state_Set (
System_state_Codes state
)
{
_System_state_Current = state;
10b2b8: c7 05 9c 54 12 00 05 movl $0x5,0x12549c <== NOT EXECUTED
10b2bf: 00 00 00
_System_state_Set( SYSTEM_STATE_FAILED );
_CPU_Fatal_halt( the_error );
10b2c2: fa cli <== NOT EXECUTED
10b2c3: 89 d8 mov %ebx,%eax <== NOT EXECUTED
10b2c5: f4 hlt <== NOT EXECUTED
10b2c6: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10b2c9: eb fe jmp 10b2c9 <_Internal_error_Occurred+0x3d><== NOT EXECUTED
0010b31c <_Objects_Allocate>:
*/
Objects_Control *_Objects_Allocate(
Objects_Information *information
)
{
10b31c: 55 push %ebp
10b31d: 89 e5 mov %esp,%ebp
10b31f: 56 push %esi
10b320: 53 push %ebx
10b321: 8b 5d 08 mov 0x8(%ebp),%ebx
* 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 )
return NULL;
10b324: 31 c9 xor %ecx,%ecx
* 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 )
10b326: 83 7b 18 00 cmpl $0x0,0x18(%ebx)
10b32a: 74 53 je 10b37f <_Objects_Allocate+0x63><== NEVER TAKEN
/*
* 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 );
10b32c: 8d 73 20 lea 0x20(%ebx),%esi
10b32f: 83 ec 0c sub $0xc,%esp
10b332: 56 push %esi
10b333: e8 38 f7 ff ff call 10aa70 <_Chain_Get>
10b338: 89 c1 mov %eax,%ecx
if ( information->auto_extend ) {
10b33a: 83 c4 10 add $0x10,%esp
10b33d: 80 7b 12 00 cmpb $0x0,0x12(%ebx)
10b341: 74 3c je 10b37f <_Objects_Allocate+0x63>
/*
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
10b343: 85 c0 test %eax,%eax
10b345: 75 1a jne 10b361 <_Objects_Allocate+0x45>
_Objects_Extend_information( information );
10b347: 83 ec 0c sub $0xc,%esp
10b34a: 53 push %ebx
10b34b: e8 60 00 00 00 call 10b3b0 <_Objects_Extend_information>
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
10b350: 89 34 24 mov %esi,(%esp)
10b353: e8 18 f7 ff ff call 10aa70 <_Chain_Get>
10b358: 89 c1 mov %eax,%ecx
}
if ( the_object ) {
10b35a: 83 c4 10 add $0x10,%esp
10b35d: 85 c0 test %eax,%eax
10b35f: 74 1e je 10b37f <_Objects_Allocate+0x63>
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
10b361: 0f b7 41 08 movzwl 0x8(%ecx),%eax
10b365: 0f b7 53 08 movzwl 0x8(%ebx),%edx
10b369: 29 d0 sub %edx,%eax
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
10b36b: 0f b7 73 14 movzwl 0x14(%ebx),%esi
10b36f: 31 d2 xor %edx,%edx
10b371: f7 f6 div %esi
information->inactive_per_block[ block ]--;
10b373: c1 e0 02 shl $0x2,%eax
10b376: 03 43 30 add 0x30(%ebx),%eax
10b379: ff 08 decl (%eax)
information->inactive--;
10b37b: 66 ff 4b 2c decw 0x2c(%ebx)
);
}
#endif
return the_object;
}
10b37f: 89 c8 mov %ecx,%eax
10b381: 8d 65 f8 lea -0x8(%ebp),%esp
10b384: 5b pop %ebx
10b385: 5e pop %esi
10b386: c9 leave
10b387: c3 ret
0010b6a0 <_Objects_Get_information>:
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
10b6a0: 55 push %ebp
10b6a1: 89 e5 mov %esp,%ebp
10b6a3: 57 push %edi
10b6a4: 56 push %esi
10b6a5: 53 push %ebx
10b6a6: 83 ec 0c sub $0xc,%esp
10b6a9: 8b 75 08 mov 0x8(%ebp),%esi
10b6ac: 8b 7d 0c mov 0xc(%ebp),%edi
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
return NULL;
10b6af: 31 db xor %ebx,%ebx
)
{
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
10b6b1: 66 85 ff test %di,%di
10b6b4: 74 37 je 10b6ed <_Objects_Get_information+0x4d>
/*
* 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 );
10b6b6: 83 ec 0c sub $0xc,%esp
10b6b9: 56 push %esi
10b6ba: e8 dd 41 00 00 call 10f89c <_Objects_API_maximum_class>
if ( the_class_api_maximum == 0 )
10b6bf: 83 c4 10 add $0x10,%esp
10b6c2: 85 c0 test %eax,%eax
10b6c4: 74 27 je 10b6ed <_Objects_Get_information+0x4d>
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
10b6c6: 0f b7 ff movzwl %di,%edi
10b6c9: 39 c7 cmp %eax,%edi
10b6cb: 77 20 ja 10b6ed <_Objects_Get_information+0x4d>
return NULL;
if ( !_Objects_Information_table[ the_api ] )
10b6cd: 8b 04 b5 18 53 12 00 mov 0x125318(,%esi,4),%eax
10b6d4: 85 c0 test %eax,%eax
10b6d6: 74 15 je 10b6ed <_Objects_Get_information+0x4d><== NEVER TAKEN
return NULL;
info = _Objects_Information_table[ the_api ][ the_class ];
10b6d8: 8b 1c b8 mov (%eax,%edi,4),%ebx
if ( !info )
10b6db: 85 db test %ebx,%ebx
10b6dd: 74 0e je 10b6ed <_Objects_Get_information+0x4d><== 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;
10b6df: 31 c0 xor %eax,%eax
10b6e1: 66 83 7b 10 00 cmpw $0x0,0x10(%ebx)
10b6e6: 0f 95 c0 setne %al
10b6e9: f7 d8 neg %eax
10b6eb: 21 c3 and %eax,%ebx
#endif
return info;
}
10b6ed: 89 d8 mov %ebx,%eax
10b6ef: 8d 65 f4 lea -0xc(%ebp),%esp
10b6f2: 5b pop %ebx
10b6f3: 5e pop %esi
10b6f4: 5f pop %edi
10b6f5: c9 leave
10b6f6: c3 ret
00118bb0 <_Objects_Get_no_protection>:
Objects_Control *_Objects_Get_no_protection(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
118bb0: 55 push %ebp
118bb1: 89 e5 mov %esp,%ebp
118bb3: 53 push %ebx
118bb4: 8b 55 08 mov 0x8(%ebp),%edx
118bb7: 8b 4d 10 mov 0x10(%ebp),%ecx
/*
* 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;
118bba: b8 01 00 00 00 mov $0x1,%eax
118bbf: 2b 42 08 sub 0x8(%edx),%eax
118bc2: 03 45 0c add 0xc(%ebp),%eax
if ( information->maximum >= index ) {
118bc5: 0f b7 5a 10 movzwl 0x10(%edx),%ebx
118bc9: 39 c3 cmp %eax,%ebx
118bcb: 72 12 jb 118bdf <_Objects_Get_no_protection+0x2f>
if ( (the_object = information->local_table[ index ]) != NULL ) {
118bcd: 8b 52 1c mov 0x1c(%edx),%edx
118bd0: 8b 04 82 mov (%edx,%eax,4),%eax
118bd3: 85 c0 test %eax,%eax
118bd5: 74 08 je 118bdf <_Objects_Get_no_protection+0x2f><== NEVER TAKEN
*location = OBJECTS_LOCAL;
118bd7: c7 01 00 00 00 00 movl $0x0,(%ecx)
return the_object;
118bdd: eb 08 jmp 118be7 <_Objects_Get_no_protection+0x37>
/*
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
118bdf: c7 01 01 00 00 00 movl $0x1,(%ecx)
return NULL;
118be5: 31 c0 xor %eax,%eax
}
118be7: 5b pop %ebx
118be8: c9 leave
118be9: c3 ret
0010c8bc <_Objects_Id_to_name>:
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
10c8bc: 55 push %ebp
10c8bd: 89 e5 mov %esp,%ebp
10c8bf: 53 push %ebx
10c8c0: 83 ec 14 sub $0x14,%esp
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
10c8c3: 8b 45 08 mov 0x8(%ebp),%eax
10c8c6: 85 c0 test %eax,%eax
10c8c8: 75 08 jne 10c8d2 <_Objects_Id_to_name+0x16>
10c8ca: a1 d4 78 12 00 mov 0x1278d4,%eax
10c8cf: 8b 40 08 mov 0x8(%eax),%eax
10c8d2: 89 c2 mov %eax,%edx
10c8d4: c1 ea 18 shr $0x18,%edx
10c8d7: 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 )
10c8da: 8d 4a ff lea -0x1(%edx),%ecx
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
10c8dd: bb 03 00 00 00 mov $0x3,%ebx
10c8e2: 83 f9 02 cmp $0x2,%ecx
10c8e5: 77 36 ja 10c91d <_Objects_Id_to_name+0x61>
10c8e7: eb 3b jmp 10c924 <_Objects_Id_to_name+0x68>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
10c8e9: 89 c1 mov %eax,%ecx
10c8eb: c1 e9 1b shr $0x1b,%ecx
if ( !_Objects_Information_table[ the_api ] )
return OBJECTS_INVALID_ID;
the_class = _Objects_Get_class( tmpId );
information = _Objects_Information_table[ the_api ][ the_class ];
10c8ee: 8b 14 8a mov (%edx,%ecx,4),%edx
if ( !information )
10c8f1: 85 d2 test %edx,%edx
10c8f3: 74 28 je 10c91d <_Objects_Id_to_name+0x61><== NEVER TAKEN
return OBJECTS_INVALID_ID;
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
10c8f5: 80 7a 38 00 cmpb $0x0,0x38(%edx)
10c8f9: 75 22 jne 10c91d <_Objects_Id_to_name+0x61><== NEVER TAKEN
return OBJECTS_INVALID_ID;
#endif
the_object = _Objects_Get( information, tmpId, &ignored_location );
10c8fb: 51 push %ecx
10c8fc: 8d 4d f4 lea -0xc(%ebp),%ecx
10c8ff: 51 push %ecx
10c900: 50 push %eax
10c901: 52 push %edx
10c902: e8 5d ff ff ff call 10c864 <_Objects_Get>
if ( !the_object )
10c907: 83 c4 10 add $0x10,%esp
10c90a: 85 c0 test %eax,%eax
10c90c: 74 0f je 10c91d <_Objects_Id_to_name+0x61>
return OBJECTS_INVALID_ID;
*name = the_object->name;
10c90e: 8b 50 0c mov 0xc(%eax),%edx
10c911: 8b 45 0c mov 0xc(%ebp),%eax
10c914: 89 10 mov %edx,(%eax)
_Thread_Enable_dispatch();
10c916: e8 73 0a 00 00 call 10d38e <_Thread_Enable_dispatch>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
10c91b: 31 db xor %ebx,%ebx
}
10c91d: 89 d8 mov %ebx,%eax
10c91f: 8b 5d fc mov -0x4(%ebp),%ebx
10c922: c9 leave
10c923: c3 ret
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
if ( !_Objects_Information_table[ the_api ] )
10c924: 8b 14 95 84 73 12 00 mov 0x127384(,%edx,4),%edx
10c92b: 85 d2 test %edx,%edx
10c92d: 75 ba jne 10c8e9 <_Objects_Id_to_name+0x2d>
10c92f: eb ec jmp 10c91d <_Objects_Id_to_name+0x61>
0010e310 <_POSIX_Message_queue_Receive_support>:
size_t msg_len,
unsigned int *msg_prio,
bool wait,
Watchdog_Interval timeout
)
{
10e310: 55 push %ebp
10e311: 89 e5 mov %esp,%ebp
10e313: 57 push %edi
10e314: 56 push %esi
10e315: 53 push %ebx
10e316: 83 ec 30 sub $0x30,%esp
10e319: 8b 75 08 mov 0x8(%ebp),%esi
10e31c: 8b 5d 14 mov 0x14(%ebp),%ebx
10e31f: 8a 55 18 mov 0x18(%ebp),%dl
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 );
10e322: 8d 45 e4 lea -0x1c(%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(
10e325: 50 push %eax
10e326: 56 push %esi
10e327: 68 30 e3 12 00 push $0x12e330
10e32c: 88 55 d4 mov %dl,-0x2c(%ebp)
10e32f: e8 f0 2a 00 00 call 110e24 <_Objects_Get>
switch ( location ) {
10e334: 83 c4 10 add $0x10,%esp
10e337: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp)
10e33b: 8a 55 d4 mov -0x2c(%ebp),%dl
10e33e: 0f 85 aa 00 00 00 jne 10e3ee <_POSIX_Message_queue_Receive_support+0xde>
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) {
10e344: 8b 78 14 mov 0x14(%eax),%edi
10e347: 89 f9 mov %edi,%ecx
10e349: 83 e1 03 and $0x3,%ecx
10e34c: 49 dec %ecx
10e34d: 75 0a jne 10e359 <_POSIX_Message_queue_Receive_support+0x49>
_Thread_Enable_dispatch();
10e34f: e8 f6 35 00 00 call 11194a <_Thread_Enable_dispatch>
10e354: e9 95 00 00 00 jmp 10e3ee <_POSIX_Message_queue_Receive_support+0xde>
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq = the_mq_fd->Queue;
10e359: 8b 40 10 mov 0x10(%eax),%eax
if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
10e35c: 8b 48 68 mov 0x68(%eax),%ecx
10e35f: 39 4d 10 cmp %ecx,0x10(%ebp)
10e362: 73 15 jae 10e379 <_POSIX_Message_queue_Receive_support+0x69>
_Thread_Enable_dispatch();
10e364: e8 e1 35 00 00 call 11194a <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EMSGSIZE );
10e369: e8 ee 8a 00 00 call 116e5c <__errno>
10e36e: c7 00 7a 00 00 00 movl $0x7a,(%eax)
10e374: e9 80 00 00 00 jmp 10e3f9 <_POSIX_Message_queue_Receive_support+0xe9>
/*
* Now if something goes wrong, we return a "length" of -1
* to indicate an error.
*/
length_out = -1;
10e379: c7 45 e0 ff ff ff ff movl $0xffffffff,-0x20(%ebp)
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
10e380: 31 c9 xor %ecx,%ecx
10e382: 84 d2 test %dl,%dl
10e384: 74 09 je 10e38f <_POSIX_Message_queue_Receive_support+0x7f><== NEVER TAKEN
do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? false : true;
10e386: 81 e7 00 40 00 00 and $0x4000,%edi
10e38c: 0f 94 c1 sete %cl
do_wait = wait;
/*
* Now perform the actual message receive
*/
_CORE_message_queue_Seize(
10e38f: 52 push %edx
10e390: 52 push %edx
10e391: ff 75 1c pushl 0x1c(%ebp)
10e394: 0f b6 c9 movzbl %cl,%ecx
10e397: 51 push %ecx
10e398: 8d 55 e0 lea -0x20(%ebp),%edx
10e39b: 52 push %edx
10e39c: ff 75 0c pushl 0xc(%ebp)
10e39f: 56 push %esi
10e3a0: 83 c0 1c add $0x1c,%eax
10e3a3: 50 push %eax
10e3a4: e8 7f 1c 00 00 call 110028 <_CORE_message_queue_Seize>
&length_out,
do_wait,
timeout
);
_Thread_Enable_dispatch();
10e3a9: 83 c4 20 add $0x20,%esp
10e3ac: e8 99 35 00 00 call 11194a <_Thread_Enable_dispatch>
*msg_prio =
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
10e3b1: a1 a8 e3 12 00 mov 0x12e3a8,%eax
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);
10e3b6: 8b 50 24 mov 0x24(%eax),%edx
10e3b9: c1 fa 1f sar $0x1f,%edx
10e3bc: 8b 48 24 mov 0x24(%eax),%ecx
10e3bf: 31 d1 xor %edx,%ecx
10e3c1: 89 0b mov %ecx,(%ebx)
10e3c3: 29 13 sub %edx,(%ebx)
if ( !_Thread_Executing->Wait.return_code )
10e3c5: 83 78 34 00 cmpl $0x0,0x34(%eax)
10e3c9: 75 05 jne 10e3d0 <_POSIX_Message_queue_Receive_support+0xc0>
return length_out;
10e3cb: 8b 45 e0 mov -0x20(%ebp),%eax
10e3ce: eb 2c jmp 10e3fc <_POSIX_Message_queue_Receive_support+0xec>
rtems_set_errno_and_return_minus_one(
10e3d0: e8 87 8a 00 00 call 116e5c <__errno>
10e3d5: 89 c3 mov %eax,%ebx
10e3d7: 83 ec 0c sub $0xc,%esp
10e3da: a1 a8 e3 12 00 mov 0x12e3a8,%eax
10e3df: ff 70 34 pushl 0x34(%eax)
10e3e2: e8 ed 01 00 00 call 10e5d4 <_POSIX_Message_queue_Translate_core_message_queue_return_code>
10e3e7: 89 03 mov %eax,(%ebx)
10e3e9: 83 c4 10 add $0x10,%esp
10e3ec: eb 0b jmp 10e3f9 <_POSIX_Message_queue_Receive_support+0xe9>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
10e3ee: e8 69 8a 00 00 call 116e5c <__errno>
10e3f3: c7 00 09 00 00 00 movl $0x9,(%eax)
10e3f9: 83 c8 ff or $0xffffffff,%eax
}
10e3fc: 8d 65 f4 lea -0xc(%ebp),%esp
10e3ff: 5b pop %ebx
10e400: 5e pop %esi
10e401: 5f pop %edi
10e402: c9 leave
10e403: c3 ret
0010bccb <_POSIX_Mutex_Get_interrupt_disable>:
POSIX_Mutex_Control *_POSIX_Mutex_Get_interrupt_disable (
pthread_mutex_t *mutex,
Objects_Locations *location,
ISR_Level *level
)
{
10bccb: 55 push %ebp
10bccc: 89 e5 mov %esp,%ebp
10bcce: 56 push %esi
10bccf: 53 push %ebx
10bcd0: 8b 5d 08 mov 0x8(%ebp),%ebx
10bcd3: 8b 75 0c mov 0xc(%ebp),%esi
___POSIX_Mutex_Get_support_error_check( mutex, location );
10bcd6: 85 db test %ebx,%ebx
10bcd8: 74 16 je 10bcf0 <_POSIX_Mutex_Get_interrupt_disable+0x25>
___POSIX_Mutex_Get_support_auto_initialization( mutex, location );
10bcda: 83 3b ff cmpl $0xffffffff,(%ebx)
10bcdd: 75 1b jne 10bcfa <_POSIX_Mutex_Get_interrupt_disable+0x2f>
10bcdf: 51 push %ecx
10bce0: 51 push %ecx
10bce1: 6a 00 push $0x0
10bce3: 53 push %ebx
10bce4: e8 73 00 00 00 call 10bd5c <pthread_mutex_init>
10bce9: 83 c4 10 add $0x10,%esp
10bcec: 85 c0 test %eax,%eax
10bcee: 74 0a je 10bcfa <_POSIX_Mutex_Get_interrupt_disable+0x2f><== NEVER TAKEN
10bcf0: c7 06 01 00 00 00 movl $0x1,(%esi)
10bcf6: 31 c0 xor %eax,%eax
10bcf8: eb 13 jmp 10bd0d <_POSIX_Mutex_Get_interrupt_disable+0x42>
return (POSIX_Mutex_Control *) _Objects_Get_isr_disable(
10bcfa: ff 75 10 pushl 0x10(%ebp)
10bcfd: 56 push %esi
10bcfe: ff 33 pushl (%ebx)
10bd00: 68 54 a7 12 00 push $0x12a754
10bd05: e8 06 27 00 00 call 10e410 <_Objects_Get_isr_disable>
10bd0a: 83 c4 10 add $0x10,%esp
&_POSIX_Mutex_Information,
(Objects_Id) *mutex,
location,
level
);
}
10bd0d: 8d 65 f8 lea -0x8(%ebp),%esp
10bd10: 5b pop %ebx
10bd11: 5e pop %esi
10bd12: c9 leave
10bd13: c3 ret
0010e9dc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>:
#include <rtems/posix/pthread.h>
void _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch(
Thread_Control *the_thread
)
{
10e9dc: 55 push %ebp
10e9dd: 89 e5 mov %esp,%ebp
10e9df: 83 ec 08 sub $0x8,%esp
10e9e2: 8b 55 08 mov 0x8(%ebp),%edx
POSIX_API_Control *thread_support;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
10e9e5: 8b 82 ec 00 00 00 mov 0xec(%edx),%eax
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
10e9eb: 83 b8 d8 00 00 00 00 cmpl $0x0,0xd8(%eax)
10e9f2: 75 2c jne 10ea20 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x44><== NEVER TAKEN
10e9f4: 83 b8 dc 00 00 00 01 cmpl $0x1,0xdc(%eax)
10e9fb: 75 23 jne 10ea20 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x44>
thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
10e9fd: 83 b8 e0 00 00 00 00 cmpl $0x0,0xe0(%eax)
10ea04: 74 1a je 10ea20 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x44>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10ea06: a1 50 63 12 00 mov 0x126350,%eax
10ea0b: 48 dec %eax
10ea0c: a3 50 63 12 00 mov %eax,0x126350
thread_support->cancelation_requested ) {
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
10ea11: 50 push %eax
10ea12: 50 push %eax
10ea13: 6a ff push $0xffffffff
10ea15: 52 push %edx
10ea16: e8 51 08 00 00 call 10f26c <_POSIX_Thread_Exit>
10ea1b: 83 c4 10 add $0x10,%esp
} else
_Thread_Enable_dispatch();
}
10ea1e: c9 leave
10ea1f: c3 ret
10ea20: 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();
10ea21: e9 78 db ff ff jmp 10c59e <_Thread_Enable_dispatch>
0010fc74 <_POSIX_Thread_Translate_sched_param>:
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
10fc74: 55 push %ebp
10fc75: 89 e5 mov %esp,%ebp
10fc77: 57 push %edi
10fc78: 56 push %esi
10fc79: 53 push %ebx
10fc7a: 83 ec 28 sub $0x28,%esp
10fc7d: 8b 55 08 mov 0x8(%ebp),%edx
10fc80: 8b 5d 0c mov 0xc(%ebp),%ebx
10fc83: 8b 7d 10 mov 0x10(%ebp),%edi
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
10fc86: ff 33 pushl (%ebx)
10fc88: 89 55 e0 mov %edx,-0x20(%ebp)
10fc8b: e8 c4 ff ff ff call 10fc54 <_POSIX_Priority_Is_valid>
10fc90: 83 c4 10 add $0x10,%esp
return EINVAL;
10fc93: be 16 00 00 00 mov $0x16,%esi
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
10fc98: 84 c0 test %al,%al
10fc9a: 8b 55 e0 mov -0x20(%ebp),%edx
10fc9d: 0f 84 a4 00 00 00 je 10fd47 <_POSIX_Thread_Translate_sched_param+0xd3><== NEVER TAKEN
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
10fca3: c7 07 00 00 00 00 movl $0x0,(%edi)
*budget_callout = NULL;
10fca9: 8b 45 14 mov 0x14(%ebp),%eax
10fcac: c7 00 00 00 00 00 movl $0x0,(%eax)
if ( policy == SCHED_OTHER ) {
10fcb2: 85 d2 test %edx,%edx
10fcb4: 75 0b jne 10fcc1 <_POSIX_Thread_Translate_sched_param+0x4d>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
10fcb6: c7 07 01 00 00 00 movl $0x1,(%edi)
10fcbc: e9 83 00 00 00 jmp 10fd44 <_POSIX_Thread_Translate_sched_param+0xd0>
return 0;
}
if ( policy == SCHED_FIFO ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
10fcc1: 31 f6 xor %esi,%esi
if ( policy == SCHED_OTHER ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
return 0;
}
if ( policy == SCHED_FIFO ) {
10fcc3: 83 fa 01 cmp $0x1,%edx
10fcc6: 74 7f je 10fd47 <_POSIX_Thread_Translate_sched_param+0xd3>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
}
if ( policy == SCHED_RR ) {
10fcc8: 83 fa 02 cmp $0x2,%edx
10fccb: 75 08 jne 10fcd5 <_POSIX_Thread_Translate_sched_param+0x61>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
10fccd: c7 07 02 00 00 00 movl $0x2,(%edi)
return 0;
10fcd3: eb 72 jmp 10fd47 <_POSIX_Thread_Translate_sched_param+0xd3>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
10fcd5: be 16 00 00 00 mov $0x16,%esi
if ( policy == SCHED_RR ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
return 0;
}
if ( policy == SCHED_SPORADIC ) {
10fcda: 83 fa 04 cmp $0x4,%edx
10fcdd: 75 68 jne 10fd47 <_POSIX_Thread_Translate_sched_param+0xd3>
if ( (param->sched_ss_repl_period.tv_sec == 0) &&
10fcdf: 83 7b 08 00 cmpl $0x0,0x8(%ebx)
10fce3: 75 06 jne 10fceb <_POSIX_Thread_Translate_sched_param+0x77>
10fce5: 83 7b 0c 00 cmpl $0x0,0xc(%ebx)
10fce9: 74 5c je 10fd47 <_POSIX_Thread_Translate_sched_param+0xd3>
(param->sched_ss_repl_period.tv_nsec == 0) )
return EINVAL;
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
10fceb: 83 7b 10 00 cmpl $0x0,0x10(%ebx)
10fcef: 75 0b jne 10fcfc <_POSIX_Thread_Translate_sched_param+0x88>
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
10fcf1: be 16 00 00 00 mov $0x16,%esi
if ( policy == SCHED_SPORADIC ) {
if ( (param->sched_ss_repl_period.tv_sec == 0) &&
(param->sched_ss_repl_period.tv_nsec == 0) )
return EINVAL;
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
10fcf6: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
10fcfa: 74 4b je 10fd47 <_POSIX_Thread_Translate_sched_param+0xd3>
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
10fcfc: 83 ec 0c sub $0xc,%esp
10fcff: 8d 43 08 lea 0x8(%ebx),%eax
10fd02: 50 push %eax
10fd03: e8 00 de ff ff call 10db08 <_Timespec_To_ticks>
10fd08: 89 45 e4 mov %eax,-0x1c(%ebp)
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
10fd0b: 8d 43 10 lea 0x10(%ebx),%eax
10fd0e: 89 04 24 mov %eax,(%esp)
10fd11: e8 f2 dd ff ff call 10db08 <_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 ) <
10fd16: 83 c4 10 add $0x10,%esp
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
return EINVAL;
10fd19: be 16 00 00 00 mov $0x16,%esi
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 ) <
10fd1e: 39 45 e4 cmp %eax,-0x1c(%ebp)
10fd21: 72 24 jb 10fd47 <_POSIX_Thread_Translate_sched_param+0xd3>
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
10fd23: 83 ec 0c sub $0xc,%esp
10fd26: ff 73 04 pushl 0x4(%ebx)
10fd29: e8 26 ff ff ff call 10fc54 <_POSIX_Priority_Is_valid>
10fd2e: 83 c4 10 add $0x10,%esp
10fd31: 84 c0 test %al,%al
10fd33: 74 12 je 10fd47 <_POSIX_Thread_Translate_sched_param+0xd3>
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
10fd35: c7 07 03 00 00 00 movl $0x3,(%edi)
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
10fd3b: 8b 45 14 mov 0x14(%ebp),%eax
10fd3e: c7 00 41 a8 10 00 movl $0x10a841,(%eax)
return 0;
10fd44: 66 31 f6 xor %si,%si
}
return EINVAL;
}
10fd47: 89 f0 mov %esi,%eax
10fd49: 8d 65 f4 lea -0xc(%ebp),%esp
10fd4c: 5b pop %ebx
10fd4d: 5e pop %esi
10fd4e: 5f pop %edi
10fd4f: c9 leave
10fd50: c3 ret
0010a544 <_POSIX_Threads_Initialize_user_threads_body>:
*
* Output parameters: NONE
*/
void _POSIX_Threads_Initialize_user_threads_body(void)
{
10a544: 55 push %ebp
10a545: 89 e5 mov %esp,%ebp
10a547: 57 push %edi
10a548: 56 push %esi
10a549: 53 push %ebx
10a54a: 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;
10a54d: 8b 3d 40 22 12 00 mov 0x122240,%edi
maximum = Configuration_POSIX_API.number_of_initialization_threads;
10a553: 8b 15 3c 22 12 00 mov 0x12223c,%edx
if ( !user_threads || maximum == 0 )
10a559: 85 d2 test %edx,%edx
10a55b: 74 54 je 10a5b1 <_POSIX_Threads_Initialize_user_threads_body+0x6d><== NEVER TAKEN
10a55d: 85 ff test %edi,%edi
10a55f: 74 50 je 10a5b1 <_POSIX_Threads_Initialize_user_threads_body+0x6d><== NEVER TAKEN
10a561: 31 db xor %ebx,%ebx
for ( index=0 ; index < maximum ; index++ ) {
/*
* There is no way for these calls to fail in this situation.
*/
(void) pthread_attr_init( &attr );
10a563: 8d 75 a4 lea -0x5c(%ebp),%esi
10a566: 83 ec 0c sub $0xc,%esp
10a569: 56 push %esi
10a56a: 89 55 94 mov %edx,-0x6c(%ebp)
10a56d: e8 e2 57 00 00 call 10fd54 <pthread_attr_init>
(void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
10a572: 5a pop %edx
10a573: 59 pop %ecx
10a574: 6a 02 push $0x2
10a576: 56 push %esi
10a577: e8 00 58 00 00 call 10fd7c <pthread_attr_setinheritsched>
(void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size);
10a57c: 59 pop %ecx
10a57d: 58 pop %eax
10a57e: ff 74 df 04 pushl 0x4(%edi,%ebx,8)
10a582: 56 push %esi
10a583: e8 20 58 00 00 call 10fda8 <pthread_attr_setstacksize>
status = pthread_create(
10a588: 6a 00 push $0x0
10a58a: ff 34 df pushl (%edi,%ebx,8)
10a58d: 56 push %esi
10a58e: 8d 45 e4 lea -0x1c(%ebp),%eax
10a591: 50 push %eax
10a592: e8 e5 fc ff ff call 10a27c <pthread_create>
&thread_id,
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
10a597: 83 c4 20 add $0x20,%esp
10a59a: 85 c0 test %eax,%eax
10a59c: 8b 55 94 mov -0x6c(%ebp),%edx
10a59f: 74 0b je 10a5ac <_POSIX_Threads_Initialize_user_threads_body+0x68>
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
10a5a1: 52 push %edx
10a5a2: 50 push %eax
10a5a3: 6a 01 push $0x1
10a5a5: 6a 02 push $0x2
10a5a7: e8 e8 1b 00 00 call 10c194 <_Internal_error_Occurred>
*
* Setting the attributes explicitly is critical, since we don't want
* to inherit the idle tasks attributes.
*/
for ( index=0 ; index < maximum ; index++ ) {
10a5ac: 43 inc %ebx
10a5ad: 39 d3 cmp %edx,%ebx
10a5af: 72 b5 jb 10a566 <_POSIX_Threads_Initialize_user_threads_body+0x22><== NEVER TAKEN
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
}
}
10a5b1: 8d 65 f4 lea -0xc(%ebp),%esp
10a5b4: 5b pop %ebx
10a5b5: 5e pop %esi
10a5b6: 5f pop %edi
10a5b7: c9 leave
10a5b8: c3 ret
0010edcf <_POSIX_Threads_Sporadic_budget_TSR>:
*/
void _POSIX_Threads_Sporadic_budget_TSR(
Objects_Id id __attribute__((unused)),
void *argument
)
{
10edcf: 55 push %ebp
10edd0: 89 e5 mov %esp,%ebp
10edd2: 56 push %esi
10edd3: 53 push %ebx
10edd4: 8b 5d 0c mov 0xc(%ebp),%ebx
Thread_Control *the_thread;
POSIX_API_Control *api;
the_thread = argument;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10edd7: 8b b3 ec 00 00 00 mov 0xec(%ebx),%esi
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_init_budget );
10eddd: 83 ec 0c sub $0xc,%esp
10ede0: 8d 86 98 00 00 00 lea 0x98(%esi),%eax
10ede6: 50 push %eax
10ede7: e8 88 0d 00 00 call 10fb74 <_Timespec_To_ticks>
the_thread->cpu_time_budget = ticks;
10edec: 89 43 78 mov %eax,0x78(%ebx)
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
10edef: 0f b6 05 24 12 12 00 movzbl 0x121224,%eax
10edf6: 2b 86 88 00 00 00 sub 0x88(%esi),%eax
new_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority );
the_thread->real_priority = new_priority;
10edfc: 89 43 18 mov %eax,0x18(%ebx)
*/
#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 ) {
10edff: 83 c4 10 add $0x10,%esp
10ee02: 83 7b 1c 00 cmpl $0x0,0x1c(%ebx)
10ee06: 75 12 jne 10ee1a <_POSIX_Threads_Sporadic_budget_TSR+0x4b><== NEVER TAKEN
/*
* If this would make them less important, then do not change it.
*/
if ( the_thread->current_priority > new_priority ) {
10ee08: 39 43 14 cmp %eax,0x14(%ebx)
10ee0b: 76 0d jbe 10ee1a <_POSIX_Threads_Sporadic_budget_TSR+0x4b>
_Thread_Change_priority( the_thread, new_priority, true );
10ee0d: 52 push %edx
10ee0e: 6a 01 push $0x1
10ee10: 50 push %eax
10ee11: 53 push %ebx
10ee12: e8 0d d0 ff ff call 10be24 <_Thread_Change_priority>
10ee17: 83 c4 10 add $0x10,%esp
#endif
}
}
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period );
10ee1a: 83 ec 0c sub $0xc,%esp
10ee1d: 8d 86 90 00 00 00 lea 0x90(%esi),%eax
10ee23: 50 push %eax
10ee24: e8 4b 0d 00 00 call 10fb74 <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10ee29: 89 86 b4 00 00 00 mov %eax,0xb4(%esi)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10ee2f: 83 c4 10 add $0x10,%esp
_Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
10ee32: 81 c6 a8 00 00 00 add $0xa8,%esi
10ee38: 89 75 0c mov %esi,0xc(%ebp)
10ee3b: c7 45 08 04 54 12 00 movl $0x125404,0x8(%ebp)
}
10ee42: 8d 65 f8 lea -0x8(%ebp),%esp
10ee45: 5b pop %ebx
10ee46: 5e pop %esi
10ee47: c9 leave
10ee48: e9 c3 df ff ff jmp 10ce10 <_Watchdog_Insert>
0010ee4d <_POSIX_Threads_Sporadic_budget_callout>:
* _POSIX_Threads_Sporadic_budget_callout
*/
void _POSIX_Threads_Sporadic_budget_callout(
Thread_Control *the_thread
)
{
10ee4d: 55 push %ebp
10ee4e: 89 e5 mov %esp,%ebp
10ee50: 83 ec 08 sub $0x8,%esp
10ee53: 8b 45 08 mov 0x8(%ebp),%eax
POSIX_API_Control *api;
uint32_t new_priority;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10ee56: 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 */
10ee5c: c7 40 78 ff ff ff ff movl $0xffffffff,0x78(%eax)
10ee63: 0f b6 15 24 12 12 00 movzbl 0x121224,%edx
10ee6a: 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;
10ee70: 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 ) {
10ee73: 83 78 1c 00 cmpl $0x0,0x1c(%eax)
10ee77: 75 12 jne 10ee8b <_POSIX_Threads_Sporadic_budget_callout+0x3e><== 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 ) {
10ee79: 39 50 14 cmp %edx,0x14(%eax)
10ee7c: 73 0d jae 10ee8b <_POSIX_Threads_Sporadic_budget_callout+0x3e><== NEVER TAKEN
_Thread_Change_priority( the_thread, new_priority, true );
10ee7e: 51 push %ecx
10ee7f: 6a 01 push $0x1
10ee81: 52 push %edx
10ee82: 50 push %eax
10ee83: e8 9c cf ff ff call 10be24 <_Thread_Change_priority>
10ee88: 83 c4 10 add $0x10,%esp
#if 0
printk( "lower priority\n" );
#endif
}
}
}
10ee8b: c9 leave
10ee8c: c3 ret
0010a304 <_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)
{
10a304: 55 push %ebp
10a305: 89 e5 mov %esp,%ebp
10a307: 53 push %ebx
10a308: 83 ec 04 sub $0x4,%esp
10a30b: 8b 5d 0c mov 0xc(%ebp),%ebx
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
10a30e: ff 43 68 incl 0x68(%ebx)
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
10a311: 83 7b 54 00 cmpl $0x0,0x54(%ebx)
10a315: 75 06 jne 10a31d <_POSIX_Timer_TSR+0x19>
10a317: 83 7b 58 00 cmpl $0x0,0x58(%ebx)
10a31b: 74 34 je 10a351 <_POSIX_Timer_TSR+0x4d> <== NEVER TAKEN
( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) {
activated = _POSIX_Timer_Insert_helper(
10a31d: 83 ec 0c sub $0xc,%esp
10a320: 53 push %ebx
10a321: 68 04 a3 10 00 push $0x10a304
10a326: ff 73 08 pushl 0x8(%ebx)
10a329: ff 73 64 pushl 0x64(%ebx)
10a32c: 8d 43 10 lea 0x10(%ebx),%eax
10a32f: 50 push %eax
10a330: e8 e7 56 00 00 call 10fa1c <_POSIX_Timer_Insert_helper>
ptimer->ticks,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated )
10a335: 83 c4 20 add $0x20,%esp
10a338: 84 c0 test %al,%al
10a33a: 74 30 je 10a36c <_POSIX_Timer_TSR+0x68> <== NEVER TAKEN
return;
/* Store the time when the timer was started again */
_TOD_Get( &ptimer->time );
10a33c: 83 ec 0c sub $0xc,%esp
10a33f: 8d 43 6c lea 0x6c(%ebx),%eax
10a342: 50 push %eax
10a343: e8 5c 14 00 00 call 10b7a4 <_TOD_Get>
/* The state really did not change but just to be safe */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
10a348: c6 43 3c 03 movb $0x3,0x3c(%ebx)
10a34c: 83 c4 10 add $0x10,%esp
10a34f: eb 04 jmp 10a355 <_POSIX_Timer_TSR+0x51>
} else {
/* Indicates that the timer is stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
10a351: 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 ) ) {
10a355: 50 push %eax
10a356: 50 push %eax
10a357: ff 73 44 pushl 0x44(%ebx)
10a35a: ff 73 38 pushl 0x38(%ebx)
10a35d: e8 92 52 00 00 call 10f5f4 <pthread_kill>
}
/* After the signal handler returns, the count of expirations of the
* timer must be set to 0.
*/
ptimer->overrun = 0;
10a362: c7 43 68 00 00 00 00 movl $0x0,0x68(%ebx)
10a369: 83 c4 10 add $0x10,%esp
}
10a36c: 8b 5d fc mov -0x4(%ebp),%ebx
10a36f: c9 leave
10a370: c3 ret
00110b54 <_POSIX_signals_Check_signal>:
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
110b54: 55 push %ebp
110b55: 89 e5 mov %esp,%ebp
110b57: 57 push %edi
110b58: 56 push %esi
110b59: 53 push %ebx
110b5a: 83 ec 68 sub $0x68,%esp
110b5d: 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,
110b60: 6a 01 push $0x1
110b62: 0f b6 45 10 movzbl 0x10(%ebp),%eax
110b66: 50 push %eax
110b67: 8d 45 dc lea -0x24(%ebp),%eax
110b6a: 50 push %eax
110b6b: 53 push %ebx
110b6c: ff 75 08 pushl 0x8(%ebp)
110b6f: e8 8c 00 00 00 call 110c00 <_POSIX_signals_Clear_signals>
110b74: 83 c4 20 add $0x20,%esp
is_global, true ) )
return false;
110b77: 31 c9 xor %ecx,%ecx
{
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,
110b79: 84 c0 test %al,%al
110b7b: 74 78 je 110bf5 <_POSIX_signals_Check_signal+0xa1>
#endif
/*
* Just to prevent sending a signal which is currently being ignored.
*/
if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN )
110b7d: 6b d3 0c imul $0xc,%ebx,%edx
110b80: 8b 82 a4 58 12 00 mov 0x1258a4(%edx),%eax
110b86: 83 f8 01 cmp $0x1,%eax
110b89: 74 6a je 110bf5 <_POSIX_signals_Check_signal+0xa1><== NEVER TAKEN
return false;
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
110b8b: 8b 4d 08 mov 0x8(%ebp),%ecx
110b8e: 8b 89 d0 00 00 00 mov 0xd0(%ecx),%ecx
110b94: 89 4d a4 mov %ecx,-0x5c(%ebp)
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
110b97: 0b 8a a0 58 12 00 or 0x1258a0(%edx),%ecx
110b9d: 8b 75 08 mov 0x8(%ebp),%esi
110ba0: 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,
110ba6: 8d 7d b4 lea -0x4c(%ebp),%edi
110ba9: 8b 35 68 58 12 00 mov 0x125868,%esi
110baf: 83 c6 20 add $0x20,%esi
110bb2: b9 0a 00 00 00 mov $0xa,%ecx
110bb7: 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 ) {
110bb9: 83 ba 9c 58 12 00 02 cmpl $0x2,0x12589c(%edx)
110bc0: 75 09 jne 110bcb <_POSIX_signals_Check_signal+0x77>
case SA_SIGINFO:
(*_POSIX_signals_Vectors[ signo ].sa_sigaction)(
110bc2: 52 push %edx
110bc3: 6a 00 push $0x0
110bc5: 8d 55 dc lea -0x24(%ebp),%edx
110bc8: 52 push %edx
110bc9: eb 03 jmp 110bce <_POSIX_signals_Check_signal+0x7a>
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
default:
(*_POSIX_signals_Vectors[ signo ].sa_handler)( signo );
110bcb: 83 ec 0c sub $0xc,%esp
110bce: 53 push %ebx
110bcf: ff d0 call *%eax
break;
110bd1: 83 c4 10 add $0x10,%esp
}
/*
* Restore the blocking information
*/
memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information,
110bd4: 8b 3d 68 58 12 00 mov 0x125868,%edi
110bda: 83 c7 20 add $0x20,%edi
110bdd: 8d 75 b4 lea -0x4c(%ebp),%esi
110be0: b9 0a 00 00 00 mov $0xa,%ecx
110be5: 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;
110be7: 8b 75 a4 mov -0x5c(%ebp),%esi
110bea: 8b 4d 08 mov 0x8(%ebp),%ecx
110bed: 89 b1 d0 00 00 00 mov %esi,0xd0(%ecx)
return true;
110bf3: b1 01 mov $0x1,%cl
}
110bf5: 88 c8 mov %cl,%al
110bf7: 8d 65 f4 lea -0xc(%ebp),%esp
110bfa: 5b pop %ebx
110bfb: 5e pop %esi
110bfc: 5f pop %edi
110bfd: c9 leave
110bfe: c3 ret
001110e8 <_POSIX_signals_Clear_process_signals>:
*/
void _POSIX_signals_Clear_process_signals(
int signo
)
{
1110e8: 55 push %ebp
1110e9: 89 e5 mov %esp,%ebp
1110eb: 53 push %ebx
1110ec: 8b 4d 08 mov 0x8(%ebp),%ecx
clear_signal = true;
mask = signo_to_mask( signo );
ISR_Level level;
_ISR_Disable( level );
1110ef: 9c pushf
1110f0: fa cli
1110f1: 5a pop %edx
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
1110f2: 6b c1 0c imul $0xc,%ecx,%eax
1110f5: 83 b8 9c 58 12 00 02 cmpl $0x2,0x12589c(%eax)
1110fc: 75 0e jne 11110c <_POSIX_signals_Clear_process_signals+0x24>
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
1110fe: 8d 98 98 5a 12 00 lea 0x125a98(%eax),%ebx
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
111104: 39 98 94 5a 12 00 cmp %ebx,0x125a94(%eax)
11110a: 75 0e jne 11111a <_POSIX_signals_Clear_process_signals+0x32><== NEVER TAKEN
11110c: 49 dec %ecx
11110d: b8 fe ff ff ff mov $0xfffffffe,%eax
clear_signal = false;
}
if ( clear_signal ) {
_POSIX_signals_Pending &= ~mask;
111112: d3 c0 rol %cl,%eax
111114: 21 05 90 5a 12 00 and %eax,0x125a90
}
_ISR_Enable( level );
11111a: 52 push %edx
11111b: 9d popf
}
11111c: 5b pop %ebx
11111d: c9 leave
11111e: c3 ret
0010aba8 <_POSIX_signals_Get_lowest>:
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
sigset_t set
)
{
10aba8: 55 push %ebp
10aba9: 89 e5 mov %esp,%ebp
10abab: 56 push %esi
10abac: 53 push %ebx
10abad: 8b 55 08 mov 0x8(%ebp),%edx
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
10abb0: b8 1b 00 00 00 mov $0x1b,%eax
10abb5: 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(
10abba: 8d 48 ff lea -0x1(%eax),%ecx
10abbd: 89 de mov %ebx,%esi
10abbf: d3 e6 shl %cl,%esi
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
if ( set & signo_to_mask( signo ) ) {
10abc1: 85 d6 test %edx,%esi
10abc3: 75 1e jne 10abe3 <_POSIX_signals_Get_lowest+0x3b><== NEVER TAKEN
sigset_t set
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
10abc5: 40 inc %eax
10abc6: 83 f8 20 cmp $0x20,%eax
10abc9: 75 ef jne 10abba <_POSIX_signals_Get_lowest+0x12>
10abcb: b0 01 mov $0x1,%al
10abcd: 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(
10abd2: 8d 48 ff lea -0x1(%eax),%ecx
10abd5: 89 de mov %ebx,%esi
10abd7: 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 ) ) {
10abd9: 85 d6 test %edx,%esi
10abdb: 75 06 jne 10abe3 <_POSIX_signals_Get_lowest+0x3b>
*/
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
10abdd: 40 inc %eax
10abde: 83 f8 1b cmp $0x1b,%eax
10abe1: 75 ef jne 10abd2 <_POSIX_signals_Get_lowest+0x2a><== ALWAYS TAKEN
* a return 0. This routine will NOT be called unless a signal
* is pending in the set passed in.
*/
found_it:
return signo;
}
10abe3: 5b pop %ebx
10abe4: 5e pop %esi
10abe5: c9 leave
10abe6: c3 ret
001221a0 <_POSIX_signals_Unblock_thread>:
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
siginfo_t *info
)
{
1221a0: 55 push %ebp
1221a1: 89 e5 mov %esp,%ebp
1221a3: 57 push %edi
1221a4: 56 push %esi
1221a5: 53 push %ebx
1221a6: 83 ec 0c sub $0xc,%esp
1221a9: 8b 5d 08 mov 0x8(%ebp),%ebx
1221ac: 8b 75 0c mov 0xc(%ebp),%esi
POSIX_API_Control *api;
sigset_t mask;
siginfo_t *the_info = NULL;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
1221af: 8b 83 ec 00 00 00 mov 0xec(%ebx),%eax
1221b5: 8d 4e ff lea -0x1(%esi),%ecx
1221b8: ba 01 00 00 00 mov $0x1,%edx
1221bd: d3 e2 shl %cl,%edx
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
1221bf: 8b 4b 10 mov 0x10(%ebx),%ecx
1221c2: 89 cf mov %ecx,%edi
1221c4: 81 e7 00 80 00 10 and $0x10008000,%edi
1221ca: 81 ff 00 80 00 10 cmp $0x10008000,%edi
1221d0: 75 58 jne 12222a <_POSIX_signals_Unblock_thread+0x8a>
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
1221d2: 85 53 30 test %edx,0x30(%ebx)
1221d5: 75 12 jne 1221e9 <_POSIX_signals_Unblock_thread+0x49>
1221d7: 8b 80 d0 00 00 00 mov 0xd0(%eax),%eax
1221dd: f7 d0 not %eax
/*
* This should only be reached via pthread_kill().
*/
return false;
1221df: 31 ff xor %edi,%edi
* 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) ) {
1221e1: 85 c2 test %eax,%edx
1221e3: 0f 84 b0 00 00 00 je 122299 <_POSIX_signals_Unblock_thread+0xf9>
the_thread->Wait.return_code = EINTR;
1221e9: c7 43 34 04 00 00 00 movl $0x4,0x34(%ebx)
the_info = (siginfo_t *) the_thread->Wait.return_argument;
1221f0: 8b 43 28 mov 0x28(%ebx),%eax
if ( !info ) {
1221f3: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
1221f7: 75 12 jne 12220b <_POSIX_signals_Unblock_thread+0x6b>
the_info->si_signo = signo;
1221f9: 89 30 mov %esi,(%eax)
the_info->si_code = SI_USER;
1221fb: c7 40 04 01 00 00 00 movl $0x1,0x4(%eax)
the_info->si_value.sival_int = 0;
122202: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)
122209: eb 0c jmp 122217 <_POSIX_signals_Unblock_thread+0x77>
} else {
*the_info = *info;
12220b: b9 03 00 00 00 mov $0x3,%ecx
122210: 89 c7 mov %eax,%edi
122212: 8b 75 10 mov 0x10(%ebp),%esi
122215: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
}
_Thread_queue_Extract_with_proxy( the_thread );
122217: 83 ec 0c sub $0xc,%esp
12221a: 53 push %ebx
12221b: e8 c0 ed fe ff call 110fe0 <_Thread_queue_Extract_with_proxy>
return true;
122220: 83 c4 10 add $0x10,%esp
122223: bf 01 00 00 00 mov $0x1,%edi
122228: eb 6f jmp 122299 <_POSIX_signals_Unblock_thread+0xf9>
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( ~api->signals_blocked & mask ) {
12222a: 8b 80 d0 00 00 00 mov 0xd0(%eax),%eax
122230: f7 d0 not %eax
} else if ( the_thread->current_state == STATES_READY ) {
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
122232: 31 ff xor %edi,%edi
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( ~api->signals_blocked & mask ) {
122234: 85 c2 test %eax,%edx
122236: 74 61 je 122299 <_POSIX_signals_Unblock_thread+0xf9>
* 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 ) ) {
122238: f7 c1 00 00 00 10 test $0x10000000,%ecx
12223e: 74 3d je 12227d <_POSIX_signals_Unblock_thread+0xdd>
the_thread->Wait.return_code = EINTR;
122240: 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) )
122247: f7 c1 e0 be 03 00 test $0x3bee0,%ecx
12224d: 74 0b je 12225a <_POSIX_signals_Unblock_thread+0xba>
_Thread_queue_Extract_with_proxy( the_thread );
12224f: 83 ec 0c sub $0xc,%esp
122252: 53 push %ebx
122253: e8 88 ed fe ff call 110fe0 <_Thread_queue_Extract_with_proxy>
122258: eb 1e jmp 122278 <_POSIX_signals_Unblock_thread+0xd8>
else if ( _States_Is_delaying(the_thread->current_state) ) {
12225a: 80 e1 08 and $0x8,%cl
12225d: 74 3a je 122299 <_POSIX_signals_Unblock_thread+0xf9><== NEVER TAKEN
(void) _Watchdog_Remove( &the_thread->Timer );
12225f: 83 ec 0c sub $0xc,%esp
122262: 8d 43 48 lea 0x48(%ebx),%eax
122265: 50 push %eax
122266: e8 85 f4 fe ff call 1116f0 <_Watchdog_Remove>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
12226b: 58 pop %eax
12226c: 5a pop %edx
12226d: 68 f8 ff 03 10 push $0x1003fff8
122272: 53 push %ebx
122273: e8 2c e4 fe ff call 1106a4 <_Thread_Clear_state>
122278: 83 c4 10 add $0x10,%esp
12227b: eb 1c jmp 122299 <_POSIX_signals_Unblock_thread+0xf9>
_Thread_Unblock( the_thread );
}
} else if ( the_thread->current_state == STATES_READY ) {
12227d: 85 c9 test %ecx,%ecx
12227f: 75 18 jne 122299 <_POSIX_signals_Unblock_thread+0xf9><== NEVER TAKEN
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
122281: 83 3d d8 b9 12 00 00 cmpl $0x0,0x12b9d8
122288: 74 0f je 122299 <_POSIX_signals_Unblock_thread+0xf9>
12228a: 3b 1d dc b9 12 00 cmp 0x12b9dc,%ebx
122290: 75 07 jne 122299 <_POSIX_signals_Unblock_thread+0xf9><== NEVER TAKEN
_Thread_Dispatch_necessary = true;
122292: c6 05 e8 b9 12 00 01 movb $0x1,0x12b9e8
}
}
return false;
}
122299: 89 f8 mov %edi,%eax
12229b: 8d 65 f4 lea -0xc(%ebp),%esp
12229e: 5b pop %ebx
12229f: 5e pop %esi
1222a0: 5f pop %edi
1222a1: c9 leave
1222a2: c3 ret
0010efb0 <_Protected_heap_Walk>:
bool _Protected_heap_Walk(
Heap_Control *the_heap,
int source,
bool do_dump
)
{
10efb0: 55 push %ebp
10efb1: 89 e5 mov %esp,%ebp
10efb3: 57 push %edi
10efb4: 56 push %esi
10efb5: 53 push %ebx
10efb6: 83 ec 1c sub $0x1c,%esp
10efb9: 8b 5d 08 mov 0x8(%ebp),%ebx
10efbc: 8b 75 0c mov 0xc(%ebp),%esi
10efbf: 8b 7d 10 mov 0x10(%ebp),%edi
* 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 ) {
10efc2: a1 6c bc 12 00 mov 0x12bc6c,%eax
10efc7: 85 c0 test %eax,%eax
10efc9: 75 3c jne 10f007 <_Protected_heap_Walk+0x57><== NEVER TAKEN
_RTEMS_Lock_allocator();
10efcb: 83 ec 0c sub $0xc,%esp
10efce: ff 35 10 bd 12 00 pushl 0x12bd10
10efd4: e8 93 e6 ff ff call 10d66c <_API_Mutex_Lock>
status = _Heap_Walk( the_heap, source, do_dump );
10efd9: 83 c4 0c add $0xc,%esp
10efdc: 81 e7 ff 00 00 00 and $0xff,%edi
10efe2: 57 push %edi
10efe3: 56 push %esi
10efe4: 53 push %ebx
10efe5: e8 a4 f3 ff ff call 10e38e <_Heap_Walk>
_RTEMS_Unlock_allocator();
10efea: 5a pop %edx
10efeb: ff 35 10 bd 12 00 pushl 0x12bd10
10eff1: 88 45 e4 mov %al,-0x1c(%ebp)
10eff4: e8 bb e6 ff ff call 10d6b4 <_API_Mutex_Unlock>
10eff9: 83 c4 10 add $0x10,%esp
} else {
status = _Heap_Walk( the_heap, source, do_dump );
}
return status;
}
10effc: 8a 45 e4 mov -0x1c(%ebp),%al
10efff: 8d 65 f4 lea -0xc(%ebp),%esp
10f002: 5b pop %ebx
10f003: 5e pop %esi
10f004: 5f pop %edi
10f005: c9 leave
10f006: c3 ret
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 );
10f007: 81 e7 ff 00 00 00 and $0xff,%edi
10f00d: 89 7d 10 mov %edi,0x10(%ebp)
10f010: 89 75 0c mov %esi,0xc(%ebp)
10f013: 89 5d 08 mov %ebx,0x8(%ebp)
}
return status;
}
10f016: 8d 65 f4 lea -0xc(%ebp),%esp
10f019: 5b pop %ebx
10f01a: 5e pop %esi
10f01b: 5f pop %edi
10f01c: 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 );
10f01d: e9 6c f3 ff ff jmp 10e38e <_Heap_Walk>
0010b3fc <_Rate_monotonic_Timeout>:
void _Rate_monotonic_Timeout(
Objects_Id id,
void *ignored
)
{
10b3fc: 55 push %ebp
10b3fd: 89 e5 mov %esp,%ebp
10b3ff: 53 push %ebx
10b400: 83 ec 18 sub $0x18,%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 );
10b403: 8d 45 f4 lea -0xc(%ebp),%eax
10b406: 50 push %eax
10b407: ff 75 08 pushl 0x8(%ebp)
10b40a: 68 74 83 12 00 push $0x128374
10b40f: e8 c8 1a 00 00 call 10cedc <_Objects_Get>
10b414: 89 c3 mov %eax,%ebx
switch ( location ) {
10b416: 83 c4 10 add $0x10,%esp
10b419: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
10b41d: 75 64 jne 10b483 <_Rate_monotonic_Timeout+0x87><== NEVER TAKEN
case OBJECTS_LOCAL:
the_thread = the_period->owner;
10b41f: 8b 40 40 mov 0x40(%eax),%eax
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
10b422: f6 40 11 40 testb $0x40,0x11(%eax)
10b426: 74 18 je 10b440 <_Rate_monotonic_Timeout+0x44>
10b428: 8b 53 08 mov 0x8(%ebx),%edx
10b42b: 39 50 20 cmp %edx,0x20(%eax)
10b42e: 75 10 jne 10b440 <_Rate_monotonic_Timeout+0x44>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
10b430: 52 push %edx
10b431: 52 push %edx
10b432: 68 f8 ff 03 10 push $0x1003fff8
10b437: 50 push %eax
10b438: e8 3b 22 00 00 call 10d678 <_Thread_Clear_state>
the_thread->Wait.id == the_period->Object.id ) {
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
10b43d: 59 pop %ecx
10b43e: eb 10 jmp 10b450 <_Rate_monotonic_Timeout+0x54>
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
10b440: 83 7b 38 01 cmpl $0x1,0x38(%ebx)
10b444: 75 2b jne 10b471 <_Rate_monotonic_Timeout+0x75>
the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING;
10b446: c7 43 38 03 00 00 00 movl $0x3,0x38(%ebx)
_Rate_monotonic_Initiate_statistics( the_period );
10b44d: 83 ec 0c sub $0xc,%esp
10b450: 53 push %ebx
10b451: e8 ec fa ff ff call 10af42 <_Rate_monotonic_Initiate_statistics>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10b456: 8b 43 3c mov 0x3c(%ebx),%eax
10b459: 89 43 1c mov %eax,0x1c(%ebx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10b45c: 58 pop %eax
10b45d: 5a pop %edx
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
10b45e: 83 c3 10 add $0x10,%ebx
10b461: 53 push %ebx
10b462: 68 28 85 12 00 push $0x128528
10b467: e8 34 32 00 00 call 10e6a0 <_Watchdog_Insert>
10b46c: 83 c4 10 add $0x10,%esp
10b46f: eb 07 jmp 10b478 <_Rate_monotonic_Timeout+0x7c>
} else
the_period->state = RATE_MONOTONIC_EXPIRED;
10b471: c7 43 38 04 00 00 00 movl $0x4,0x38(%ebx)
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10b478: a1 64 84 12 00 mov 0x128464,%eax
10b47d: 48 dec %eax
10b47e: a3 64 84 12 00 mov %eax,0x128464
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
10b483: 8b 5d fc mov -0x4(%ebp),%ebx
10b486: c9 leave
10b487: c3 ret
0010ba6c <_Scheduler_priority_Block>:
#include <rtems/score/thread.h>
void _Scheduler_priority_Block(
Thread_Control *the_thread
)
{
10ba6c: 55 push %ebp
10ba6d: 89 e5 mov %esp,%ebp
10ba6f: 56 push %esi
10ba70: 53 push %ebx
10ba71: 8b 55 08 mov 0x8(%ebp),%edx
)
{
Scheduler_priority_Per_thread *sched_info;
Chain_Control *ready;
sched_info = (Scheduler_priority_Per_thread *) the_thread->scheduler_info;
10ba74: 8b 8a 8c 00 00 00 mov 0x8c(%edx),%ecx
ready = sched_info->ready_chain;
10ba7a: 8b 01 mov (%ecx),%eax
if ( _Chain_Has_only_one_node( ready ) ) {
10ba7c: 8b 58 08 mov 0x8(%eax),%ebx
10ba7f: 39 18 cmp %ebx,(%eax)
10ba81: 75 32 jne 10bab5 <_Scheduler_priority_Block+0x49>
Chain_Node *tail = _Chain_Tail( the_chain );
10ba83: 8d 58 04 lea 0x4(%eax),%ebx
10ba86: 89 18 mov %ebx,(%eax)
head->next = tail;
head->previous = NULL;
10ba88: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)
tail->previous = head;
10ba8f: 89 40 08 mov %eax,0x8(%eax)
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor &= the_priority_map->block_minor;
10ba92: 8b 59 04 mov 0x4(%ecx),%ebx
10ba95: 66 8b 03 mov (%ebx),%ax
10ba98: 66 23 41 0e and 0xe(%ecx),%ax
10ba9c: 66 89 03 mov %ax,(%ebx)
if ( *the_priority_map->minor == 0 )
10ba9f: 66 85 c0 test %ax,%ax
10baa2: 75 1b jne 10babf <_Scheduler_priority_Block+0x53>
_Priority_Major_bit_map &= the_priority_map->block_major;
10baa4: 66 a1 78 58 12 00 mov 0x125878,%ax
10baaa: 23 41 0c and 0xc(%ecx),%eax
10baad: 66 a3 78 58 12 00 mov %ax,0x125878
10bab3: eb 0a jmp 10babf <_Scheduler_priority_Block+0x53>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
10bab5: 8b 0a mov (%edx),%ecx
previous = the_node->previous;
10bab7: 8b 42 04 mov 0x4(%edx),%eax
next->previous = previous;
10baba: 89 41 04 mov %eax,0x4(%ecx)
previous->next = next;
10babd: 89 08 mov %ecx,(%eax)
_Scheduler_priority_Ready_queue_extract( the_thread );
/* TODO: flash critical section? */
if ( _Thread_Is_heir( the_thread ) )
10babf: 3b 15 6c 58 12 00 cmp 0x12586c,%edx
10bac5: 75 43 jne 10bb0a <_Scheduler_priority_Block+0x9e>
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 );
10bac7: 66 8b 35 78 58 12 00 mov 0x125878,%si
10bace: 31 c9 xor %ecx,%ecx
10bad0: 89 cb mov %ecx,%ebx
10bad2: 66 0f bc de bsf %si,%bx
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
10bad6: 0f b7 db movzwl %bx,%ebx
10bad9: 66 8b b4 1b 7c 58 12 mov 0x12587c(%ebx,%ebx,1),%si
10bae0: 00
10bae1: 66 0f bc ce bsf %si,%cx
return (_Priority_Bits_index( major ) << 4) +
10bae5: c1 e3 04 shl $0x4,%ebx
10bae8: 0f b7 c9 movzwl %cx,%ecx
10baeb: 8d 04 0b lea (%ebx,%ecx,1),%eax
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
10baee: 6b c0 0c imul $0xc,%eax,%eax
10baf1: 03 05 50 11 12 00 add 0x121150,%eax
_Scheduler_priority_Schedule_body();
if ( _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
10baf7: 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 );
10baf9: 83 c0 04 add $0x4,%eax
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
10bafc: 31 c9 xor %ecx,%ecx
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
10bafe: 39 c3 cmp %eax,%ebx
10bb00: 74 02 je 10bb04 <_Scheduler_priority_Block+0x98><== NEVER TAKEN
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
10bb02: 89 d9 mov %ebx,%ecx
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
10bb04: 89 0d 6c 58 12 00 mov %ecx,0x12586c
/* TODO: flash critical section? */
if ( _Thread_Is_heir( the_thread ) )
_Scheduler_priority_Schedule_body();
if ( _Thread_Is_executing( the_thread ) )
10bb0a: 3b 15 68 58 12 00 cmp 0x125868,%edx
10bb10: 75 07 jne 10bb19 <_Scheduler_priority_Block+0xad>
_Thread_Dispatch_necessary = true;
10bb12: c6 05 74 58 12 00 01 movb $0x1,0x125874
}
10bb19: 5b pop %ebx
10bb1a: 5e pop %esi
10bb1b: c9 leave
10bb1c: c3 ret
0010bc6c <_Scheduler_priority_Schedule>:
#include <rtems/system.h>
#include <rtems/score/scheduler.h>
#include <rtems/score/schedulerpriority.h>
void _Scheduler_priority_Schedule(void)
{
10bc6c: 55 push %ebp
10bc6d: 89 e5 mov %esp,%ebp
10bc6f: 53 push %ebx
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 );
10bc70: 66 8b 1d 78 58 12 00 mov 0x125878,%bx
10bc77: 31 d2 xor %edx,%edx
10bc79: 89 d1 mov %edx,%ecx
10bc7b: 66 0f bc cb bsf %bx,%cx
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
10bc7f: 0f b7 c9 movzwl %cx,%ecx
10bc82: 66 8b 9c 09 7c 58 12 mov 0x12587c(%ecx,%ecx,1),%bx
10bc89: 00
10bc8a: 66 0f bc d3 bsf %bx,%dx
return (_Priority_Bits_index( major ) << 4) +
10bc8e: c1 e1 04 shl $0x4,%ecx
10bc91: 0f b7 d2 movzwl %dx,%edx
10bc94: 8d 04 11 lea (%ecx,%edx,1),%eax
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
10bc97: 6b c0 0c imul $0xc,%eax,%eax
10bc9a: 03 05 50 11 12 00 add 0x121150,%eax
_Scheduler_priority_Schedule_body();
}
10bca0: 8b 08 mov (%eax),%ecx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10bca2: 83 c0 04 add $0x4,%eax
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
10bca5: 31 d2 xor %edx,%edx
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
10bca7: 39 c1 cmp %eax,%ecx
10bca9: 74 02 je 10bcad <_Scheduler_priority_Schedule+0x41><== NEVER TAKEN
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
10bcab: 89 ca mov %ecx,%edx
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
10bcad: 89 15 6c 58 12 00 mov %edx,0x12586c
10bcb3: 5b pop %ebx
10bcb4: c9 leave
10bcb5: c3 ret
0010ad28 <_TOD_Validate>:
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
10ad28: 55 push %ebp
10ad29: 89 e5 mov %esp,%ebp
10ad2b: 56 push %esi
10ad2c: 53 push %ebx
10ad2d: 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();
10ad30: 8b 35 94 4b 12 00 mov 0x124b94,%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;
10ad36: 31 db xor %ebx,%ebx
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
10ad38: 85 c9 test %ecx,%ecx
10ad3a: 74 57 je 10ad93 <_TOD_Validate+0x6b> <== NEVER TAKEN
)
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
10ad3c: b8 40 42 0f 00 mov $0xf4240,%eax
10ad41: 31 d2 xor %edx,%edx
10ad43: f7 f6 div %esi
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
10ad45: 39 41 18 cmp %eax,0x18(%ecx)
10ad48: 73 49 jae 10ad93 <_TOD_Validate+0x6b>
(the_tod->ticks >= ticks_per_second) ||
10ad4a: 83 79 14 3b cmpl $0x3b,0x14(%ecx)
10ad4e: 77 43 ja 10ad93 <_TOD_Validate+0x6b>
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
10ad50: 83 79 10 3b cmpl $0x3b,0x10(%ecx)
10ad54: 77 3d ja 10ad93 <_TOD_Validate+0x6b>
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
10ad56: 83 79 0c 17 cmpl $0x17,0xc(%ecx)
10ad5a: 77 37 ja 10ad93 <_TOD_Validate+0x6b>
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
10ad5c: 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) ||
10ad5f: 85 c0 test %eax,%eax
10ad61: 74 30 je 10ad93 <_TOD_Validate+0x6b> <== NEVER TAKEN
(the_tod->month == 0) ||
10ad63: 83 f8 0c cmp $0xc,%eax
10ad66: 77 2b ja 10ad93 <_TOD_Validate+0x6b>
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
10ad68: 8b 31 mov (%ecx),%esi
(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) ||
10ad6a: 81 fe c3 07 00 00 cmp $0x7c3,%esi
10ad70: 76 21 jbe 10ad93 <_TOD_Validate+0x6b>
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
10ad72: 8b 51 08 mov 0x8(%ecx),%edx
(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) ||
10ad75: 85 d2 test %edx,%edx
10ad77: 74 1a je 10ad93 <_TOD_Validate+0x6b> <== NEVER TAKEN
(the_tod->day == 0) )
return false;
if ( (the_tod->year % 4) == 0 )
10ad79: 83 e6 03 and $0x3,%esi
10ad7c: 75 09 jne 10ad87 <_TOD_Validate+0x5f>
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
10ad7e: 8b 04 85 90 1d 12 00 mov 0x121d90(,%eax,4),%eax
10ad85: eb 07 jmp 10ad8e <_TOD_Validate+0x66>
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
10ad87: 8b 04 85 5c 1d 12 00 mov 0x121d5c(,%eax,4),%eax
* false - if the the_tod is invalid
*
* NOTE: This routine only works for leap-years through 2099.
*/
bool _TOD_Validate(
10ad8e: 39 c2 cmp %eax,%edx
10ad90: 0f 96 c3 setbe %bl
if ( the_tod->day > days_in_month )
return false;
return true;
}
10ad93: 88 d8 mov %bl,%al
10ad95: 5b pop %ebx
10ad96: 5e pop %esi
10ad97: c9 leave
10ad98: c3 ret
0010be24 <_Thread_Change_priority>:
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
10be24: 55 push %ebp
10be25: 89 e5 mov %esp,%ebp
10be27: 57 push %edi
10be28: 56 push %esi
10be29: 53 push %ebx
10be2a: 83 ec 28 sub $0x28,%esp
10be2d: 8b 5d 08 mov 0x8(%ebp),%ebx
10be30: 8b 75 0c mov 0xc(%ebp),%esi
10be33: 8a 45 10 mov 0x10(%ebp),%al
10be36: 88 45 e7 mov %al,-0x19(%ebp)
States_Control state, original_state;
/*
* Save original state
*/
original_state = the_thread->current_state;
10be39: 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 );
10be3c: 53 push %ebx
10be3d: e8 62 0b 00 00 call 10c9a4 <_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 )
10be42: 83 c4 10 add $0x10,%esp
10be45: 39 73 14 cmp %esi,0x14(%ebx)
10be48: 74 0c je 10be56 <_Thread_Change_priority+0x32>
_Thread_Set_priority( the_thread, new_priority );
10be4a: 50 push %eax
10be4b: 50 push %eax
10be4c: 56 push %esi
10be4d: 53 push %ebx
10be4e: e8 01 0b 00 00 call 10c954 <_Thread_Set_priority>
10be53: 83 c4 10 add $0x10,%esp
_ISR_Disable( level );
10be56: 9c pushf
10be57: fa cli
10be58: 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;
10be59: 8b 43 10 mov 0x10(%ebx),%eax
if ( state != STATES_TRANSIENT ) {
10be5c: 83 f8 04 cmp $0x4,%eax
10be5f: 74 2b je 10be8c <_Thread_Change_priority+0x68>
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
10be61: 83 e7 04 and $0x4,%edi
10be64: 75 08 jne 10be6e <_Thread_Change_priority+0x4a><== NEVER TAKEN
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
10be66: 89 c2 mov %eax,%edx
10be68: 83 e2 fb and $0xfffffffb,%edx
10be6b: 89 53 10 mov %edx,0x10(%ebx)
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
10be6e: 56 push %esi
10be6f: 9d popf
if ( _States_Is_waiting_on_thread_queue( state ) ) {
10be70: a9 e0 be 03 00 test $0x3bee0,%eax
10be75: 74 65 je 10bedc <_Thread_Change_priority+0xb8>
_Thread_queue_Requeue( the_thread->Wait.queue, the_thread );
10be77: 89 5d 0c mov %ebx,0xc(%ebp)
10be7a: 8b 43 44 mov 0x44(%ebx),%eax
10be7d: 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 );
}
10be80: 8d 65 f4 lea -0xc(%ebp),%esp
10be83: 5b pop %ebx
10be84: 5e pop %esi
10be85: 5f pop %edi
10be86: 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 );
10be87: e9 40 0a 00 00 jmp 10c8cc <_Thread_queue_Requeue>
}
return;
}
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) ) {
10be8c: 83 e7 04 and $0x4,%edi
10be8f: 75 26 jne 10beb7 <_Thread_Change_priority+0x93><== NEVER TAKEN
* Interrupts are STILL disabled.
* We now know the thread will be in the READY state when we remove
* the TRANSIENT state. So we have to place it on the appropriate
* Ready Queue with interrupts off.
*/
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
10be91: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx)
if ( prepend_it )
10be98: 80 7d e7 00 cmpb $0x0,-0x19(%ebp)
10be9c: 74 0c je 10beaa <_Thread_Change_priority+0x86>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue_first(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue_first( the_thread );
10be9e: 83 ec 0c sub $0xc,%esp
10bea1: 53 push %ebx
10bea2: ff 15 78 11 12 00 call *0x121178
10bea8: eb 0a jmp 10beb4 <_Thread_Change_priority+0x90>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue( the_thread );
10beaa: 83 ec 0c sub $0xc,%esp
10bead: 53 push %ebx
10beae: ff 15 74 11 12 00 call *0x121174
10beb4: 83 c4 10 add $0x10,%esp
_Scheduler_Enqueue_first( the_thread );
else
_Scheduler_Enqueue( the_thread );
}
_ISR_Flash( level );
10beb7: 56 push %esi
10beb8: 9d popf
10beb9: fa cli
* This kernel routine implements the scheduling decision logic for
* the scheduler. It does NOT dispatch.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Schedule( void )
{
_Scheduler.Operations.schedule();
10beba: ff 15 58 11 12 00 call *0x121158
* is also the heir thread, and false otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void )
{
return ( _Thread_Executing == _Thread_Heir );
10bec0: a1 68 58 12 00 mov 0x125868,%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();
if ( !_Thread_Is_executing_also_the_heir() &&
10bec5: 3b 05 6c 58 12 00 cmp 0x12586c,%eax
10becb: 74 0d je 10beda <_Thread_Change_priority+0xb6>
10becd: 80 78 74 00 cmpb $0x0,0x74(%eax)
10bed1: 74 07 je 10beda <_Thread_Change_priority+0xb6>
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
10bed3: c6 05 74 58 12 00 01 movb $0x1,0x125874
_ISR_Enable( level );
10beda: 56 push %esi
10bedb: 9d popf
}
10bedc: 8d 65 f4 lea -0xc(%ebp),%esp
10bedf: 5b pop %ebx
10bee0: 5e pop %esi
10bee1: 5f pop %edi
10bee2: c9 leave
10bee3: c3 ret
0010c088 <_Thread_Delay_ended>:
void _Thread_Delay_ended(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
10c088: 55 push %ebp
10c089: 89 e5 mov %esp,%ebp
10c08b: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10c08e: 8d 45 f4 lea -0xc(%ebp),%eax
10c091: 50 push %eax
10c092: ff 75 08 pushl 0x8(%ebp)
10c095: e8 82 01 00 00 call 10c21c <_Thread_Get>
switch ( location ) {
10c09a: 83 c4 10 add $0x10,%esp
10c09d: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
10c0a1: 75 1b jne 10c0be <_Thread_Delay_ended+0x36><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_Clear_state(
10c0a3: 52 push %edx
10c0a4: 52 push %edx
10c0a5: 68 18 00 00 10 push $0x10000018
10c0aa: 50 push %eax
10c0ab: e8 34 fe ff ff call 10bee4 <_Thread_Clear_state>
10c0b0: a1 40 53 12 00 mov 0x125340,%eax
10c0b5: 48 dec %eax
10c0b6: a3 40 53 12 00 mov %eax,0x125340
10c0bb: 83 c4 10 add $0x10,%esp
| STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Thread_Unnest_dispatch();
break;
}
}
10c0be: c9 leave
10c0bf: c3 ret
0010c0c0 <_Thread_Dispatch>:
* dispatch thread
* no dispatch thread
*/
void _Thread_Dispatch( void )
{
10c0c0: 55 push %ebp
10c0c1: 89 e5 mov %esp,%ebp
10c0c3: 57 push %edi
10c0c4: 56 push %esi
10c0c5: 53 push %ebx
10c0c6: 83 ec 1c sub $0x1c,%esp
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
10c0c9: 8b 1d 68 58 12 00 mov 0x125868,%ebx
_ISR_Disable( level );
10c0cf: 9c pushf
10c0d0: fa cli
10c0d1: 58 pop %eax
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
_Timestamp_Subtract(
10c0d2: 8d 7d d8 lea -0x28(%ebp),%edi
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
10c0d5: e9 f9 00 00 00 jmp 10c1d3 <_Thread_Dispatch+0x113>
heir = _Thread_Heir;
10c0da: 8b 35 6c 58 12 00 mov 0x12586c,%esi
_Thread_Dispatch_disable_level = 1;
10c0e0: c7 05 40 53 12 00 01 movl $0x1,0x125340
10c0e7: 00 00 00
_Thread_Dispatch_necessary = false;
10c0ea: c6 05 74 58 12 00 00 movb $0x0,0x125874
_Thread_Executing = heir;
10c0f1: 89 35 68 58 12 00 mov %esi,0x125868
/*
* 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 )
10c0f7: 39 de cmp %ebx,%esi
10c0f9: 0f 84 e2 00 00 00 je 10c1e1 <_Thread_Dispatch+0x121>
*/
#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 )
10c0ff: 83 7e 7c 01 cmpl $0x1,0x7c(%esi)
10c103: 75 09 jne 10c10e <_Thread_Dispatch+0x4e>
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
10c105: 8b 15 10 53 12 00 mov 0x125310,%edx
10c10b: 89 56 78 mov %edx,0x78(%esi)
_ISR_Enable( level );
10c10e: 50 push %eax
10c10f: 9d popf
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
10c110: 83 ec 0c sub $0xc,%esp
10c113: 8d 45 e0 lea -0x20(%ebp),%eax
10c116: 50 push %eax
10c117: e8 5c 34 00 00 call 10f578 <_TOD_Get_uptime>
_Timestamp_Subtract(
10c11c: 83 c4 0c add $0xc,%esp
10c11f: 57 push %edi
10c120: 8d 45 e0 lea -0x20(%ebp),%eax
10c123: 50 push %eax
10c124: 68 f0 53 12 00 push $0x1253f0
10c129: e8 76 0a 00 00 call 10cba4 <_Timespec_Subtract>
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
10c12e: 58 pop %eax
10c12f: 5a pop %edx
10c130: 57 push %edi
10c131: 8d 83 84 00 00 00 lea 0x84(%ebx),%eax
10c137: 50 push %eax
10c138: e8 37 0a 00 00 call 10cb74 <_Timespec_Add_to>
_Thread_Time_of_last_context_switch = uptime;
10c13d: 8b 45 e0 mov -0x20(%ebp),%eax
10c140: 8b 55 e4 mov -0x1c(%ebp),%edx
10c143: a3 f0 53 12 00 mov %eax,0x1253f0
10c148: 89 15 f4 53 12 00 mov %edx,0x1253f4
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
10c14e: a1 c8 53 12 00 mov 0x1253c8,%eax
10c153: 83 c4 10 add $0x10,%esp
10c156: 85 c0 test %eax,%eax
10c158: 74 10 je 10c16a <_Thread_Dispatch+0xaa> <== NEVER TAKEN
executing->libc_reent = *_Thread_libc_reent;
10c15a: 8b 10 mov (%eax),%edx
10c15c: 89 93 e4 00 00 00 mov %edx,0xe4(%ebx)
*_Thread_libc_reent = heir->libc_reent;
10c162: 8b 96 e4 00 00 00 mov 0xe4(%esi),%edx
10c168: 89 10 mov %edx,(%eax)
}
_User_extensions_Thread_switch( executing, heir );
10c16a: 51 push %ecx
10c16b: 51 push %ecx
10c16c: 56 push %esi
10c16d: 53 push %ebx
10c16e: e8 69 0c 00 00 call 10cddc <_User_extensions_Thread_switch>
if ( executing->fp_context != NULL )
_Context_Save_fp( &executing->fp_context );
#endif
#endif
_Context_Switch( &executing->Registers, &heir->Registers );
10c173: 58 pop %eax
10c174: 5a pop %edx
10c175: 81 c6 c8 00 00 00 add $0xc8,%esi
10c17b: 56 push %esi
10c17c: 8d 83 c8 00 00 00 lea 0xc8(%ebx),%eax
10c182: 50 push %eax
10c183: e8 28 0f 00 00 call 10d0b0 <_CPU_Context_switch>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
10c188: 83 c4 10 add $0x10,%esp
10c18b: 83 bb e0 00 00 00 00 cmpl $0x0,0xe0(%ebx)
10c192: 74 36 je 10c1ca <_Thread_Dispatch+0x10a>
#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 );
10c194: a1 c4 53 12 00 mov 0x1253c4,%eax
10c199: 39 c3 cmp %eax,%ebx
10c19b: 74 2d je 10c1ca <_Thread_Dispatch+0x10a>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
10c19d: 85 c0 test %eax,%eax
10c19f: 74 11 je 10c1b2 <_Thread_Dispatch+0xf2>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
10c1a1: 83 ec 0c sub $0xc,%esp
10c1a4: 05 e0 00 00 00 add $0xe0,%eax
10c1a9: 50 push %eax
10c1aa: e8 35 0f 00 00 call 10d0e4 <_CPU_Context_save_fp>
10c1af: 83 c4 10 add $0x10,%esp
_Context_Restore_fp( &executing->fp_context );
10c1b2: 83 ec 0c sub $0xc,%esp
10c1b5: 8d 83 e0 00 00 00 lea 0xe0(%ebx),%eax
10c1bb: 50 push %eax
10c1bc: e8 2d 0f 00 00 call 10d0ee <_CPU_Context_restore_fp>
_Thread_Allocated_fp = executing;
10c1c1: 89 1d c4 53 12 00 mov %ebx,0x1253c4
10c1c7: 83 c4 10 add $0x10,%esp
if ( executing->fp_context != NULL )
_Context_Restore_fp( &executing->fp_context );
#endif
#endif
executing = _Thread_Executing;
10c1ca: 8b 1d 68 58 12 00 mov 0x125868,%ebx
_ISR_Disable( level );
10c1d0: 9c pushf
10c1d1: fa cli
10c1d2: 58 pop %eax
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
10c1d3: 8a 15 74 58 12 00 mov 0x125874,%dl
10c1d9: 84 d2 test %dl,%dl
10c1db: 0f 85 f9 fe ff ff jne 10c0da <_Thread_Dispatch+0x1a>
_ISR_Disable( level );
}
post_switch:
_Thread_Dispatch_disable_level = 0;
10c1e1: c7 05 40 53 12 00 00 movl $0x0,0x125340
10c1e8: 00 00 00
_ISR_Enable( level );
10c1eb: 50 push %eax
10c1ec: 9d popf
_API_extensions_Run_postswitch();
10c1ed: e8 3d e7 ff ff call 10a92f <_API_extensions_Run_postswitch>
}
10c1f2: 8d 65 f4 lea -0xc(%ebp),%esp
10c1f5: 5b pop %ebx
10c1f6: 5e pop %esi
10c1f7: 5f pop %edi
10c1f8: c9 leave
10c1f9: c3 ret
00110f9c <_Thread_Handler>:
*
* Output parameters: NONE
*/
void _Thread_Handler( void )
{
110f9c: 55 push %ebp
110f9d: 89 e5 mov %esp,%ebp
110f9f: 53 push %ebx
110fa0: 83 ec 14 sub $0x14,%esp
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
static char doneConstructors;
char doneCons;
#endif
executing = _Thread_Executing;
110fa3: 8b 1d 68 58 12 00 mov 0x125868,%ebx
/*
* have to put level into a register for those cpu's that use
* inline asm here
*/
level = executing->Start.isr_level;
110fa9: 8b 83 ac 00 00 00 mov 0xac(%ebx),%eax
_ISR_Set_level(level);
110faf: 85 c0 test %eax,%eax
110fb1: 74 03 je 110fb6 <_Thread_Handler+0x1a>
110fb3: fa cli
110fb4: eb 01 jmp 110fb7 <_Thread_Handler+0x1b>
110fb6: fb sti
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
doneCons = doneConstructors;
110fb7: a0 00 50 12 00 mov 0x125000,%al
110fbc: 88 45 f7 mov %al,-0x9(%ebp)
doneConstructors = 1;
110fbf: c6 05 00 50 12 00 01 movb $0x1,0x125000
#endif
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
110fc6: 83 bb e0 00 00 00 00 cmpl $0x0,0xe0(%ebx)
110fcd: 74 24 je 110ff3 <_Thread_Handler+0x57>
#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 );
110fcf: a1 c4 53 12 00 mov 0x1253c4,%eax
110fd4: 39 c3 cmp %eax,%ebx
110fd6: 74 1b je 110ff3 <_Thread_Handler+0x57>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
110fd8: 85 c0 test %eax,%eax
110fda: 74 11 je 110fed <_Thread_Handler+0x51>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
110fdc: 83 ec 0c sub $0xc,%esp
110fdf: 05 e0 00 00 00 add $0xe0,%eax
110fe4: 50 push %eax
110fe5: e8 fa c0 ff ff call 10d0e4 <_CPU_Context_save_fp>
110fea: 83 c4 10 add $0x10,%esp
_Thread_Allocated_fp = executing;
110fed: 89 1d c4 53 12 00 mov %ebx,0x1253c4
/*
* 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 );
110ff3: 83 ec 0c sub $0xc,%esp
110ff6: 53 push %ebx
110ff7: e8 90 bc ff ff call 10cc8c <_User_extensions_Thread_begin>
/*
* At this point, the dispatch disable level BETTER be 1.
*/
_Thread_Enable_dispatch();
110ffc: e8 f9 b1 ff ff call 10c1fa <_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) */ {
111001: 83 c4 10 add $0x10,%esp
111004: 80 7d f7 00 cmpb $0x0,-0x9(%ebp)
111008: 75 05 jne 11100f <_Thread_Handler+0x73>
INIT_NAME ();
11100a: e8 31 c7 00 00 call 11d740 <__start_set_sysctl_set>
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
11100f: 8b 83 94 00 00 00 mov 0x94(%ebx),%eax
111015: 85 c0 test %eax,%eax
111017: 75 0b jne 111024 <_Thread_Handler+0x88>
executing->Wait.return_argument =
(*(Thread_Entry_numeric) executing->Start.entry_point)(
111019: 83 ec 0c sub $0xc,%esp
11101c: ff b3 9c 00 00 00 pushl 0x9c(%ebx)
111022: eb 0c jmp 111030 <_Thread_Handler+0x94>
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
111024: 48 dec %eax
111025: 75 15 jne 11103c <_Thread_Handler+0xa0> <== NEVER TAKEN
executing->Wait.return_argument =
(*(Thread_Entry_pointer) executing->Start.entry_point)(
111027: 83 ec 0c sub $0xc,%esp
11102a: ff b3 98 00 00 00 pushl 0x98(%ebx)
111030: 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 =
111036: 89 43 28 mov %eax,0x28(%ebx)
111039: 83 c4 10 add $0x10,%esp
* 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 );
11103c: 83 ec 0c sub $0xc,%esp
11103f: 53 push %ebx
111040: e8 78 bc ff ff call 10ccbd <_User_extensions_Thread_exitted>
_Internal_error_Occurred(
111045: 83 c4 0c add $0xc,%esp
111048: 6a 05 push $0x5
11104a: 6a 01 push $0x1
11104c: 6a 00 push $0x0
11104e: e8 39 a2 ff ff call 10b28c <_Internal_error_Occurred>
0010c290 <_Thread_Initialize>:
Thread_CPU_budget_algorithms budget_algorithm,
Thread_CPU_budget_algorithm_callout budget_callout,
uint32_t isr_level,
Objects_Name name
)
{
10c290: 55 push %ebp
10c291: 89 e5 mov %esp,%ebp
10c293: 57 push %edi
10c294: 56 push %esi
10c295: 53 push %ebx
10c296: 83 ec 1c sub $0x1c,%esp
10c299: 8b 5d 0c mov 0xc(%ebp),%ebx
10c29c: 8b 4d 10 mov 0x10(%ebp),%ecx
10c29f: 8b 75 14 mov 0x14(%ebp),%esi
10c2a2: 8a 55 18 mov 0x18(%ebp),%dl
10c2a5: 8a 45 20 mov 0x20(%ebp),%al
10c2a8: 88 45 e7 mov %al,-0x19(%ebp)
/*
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
10c2ab: c7 83 e8 00 00 00 00 movl $0x0,0xe8(%ebx)
10c2b2: 00 00 00
10c2b5: c7 83 ec 00 00 00 00 movl $0x0,0xec(%ebx)
10c2bc: 00 00 00
extensions_area = NULL;
the_thread->libc_reent = NULL;
10c2bf: c7 83 e4 00 00 00 00 movl $0x0,0xe4(%ebx)
10c2c6: 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 ) {
10c2c9: 85 c9 test %ecx,%ecx
10c2cb: 75 31 jne 10c2fe <_Thread_Initialize+0x6e>
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
10c2cd: 57 push %edi
10c2ce: 57 push %edi
10c2cf: 56 push %esi
10c2d0: 53 push %ebx
10c2d1: 88 55 e0 mov %dl,-0x20(%ebp)
10c2d4: e8 fb 06 00 00 call 10c9d4 <_Thread_Stack_Allocate>
if ( !actual_stack_size || actual_stack_size < stack_size )
10c2d9: 83 c4 10 add $0x10,%esp
10c2dc: 39 f0 cmp %esi,%eax
10c2de: 8a 55 e0 mov -0x20(%ebp),%dl
10c2e1: 0f 82 bf 01 00 00 jb 10c4a6 <_Thread_Initialize+0x216>
10c2e7: 85 c0 test %eax,%eax
10c2e9: 0f 84 b7 01 00 00 je 10c4a6 <_Thread_Initialize+0x216><== NEVER TAKEN
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
10c2ef: 8b 8b c4 00 00 00 mov 0xc4(%ebx),%ecx
the_thread->Start.core_allocated_stack = true;
10c2f5: c6 83 b4 00 00 00 01 movb $0x1,0xb4(%ebx)
10c2fc: eb 09 jmp 10c307 <_Thread_Initialize+0x77>
} else {
stack = stack_area;
actual_stack_size = stack_size;
the_thread->Start.core_allocated_stack = false;
10c2fe: c6 83 b4 00 00 00 00 movb $0x0,0xb4(%ebx)
10c305: 89 f0 mov %esi,%eax
Stack_Control *the_stack,
void *starting_address,
size_t size
)
{
the_stack->area = starting_address;
10c307: 89 8b bc 00 00 00 mov %ecx,0xbc(%ebx)
the_stack->size = size;
10c30d: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx)
extensions_area = NULL;
the_thread->libc_reent = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
fp_area = NULL;
10c313: 31 ff xor %edi,%edi
/*
* Allocate the floating point area for this thread
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( is_fp ) {
10c315: 84 d2 test %dl,%dl
10c317: 74 17 je 10c330 <_Thread_Initialize+0xa0>
fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
10c319: 83 ec 0c sub $0xc,%esp
10c31c: 6a 6c push $0x6c
10c31e: e8 27 0d 00 00 call 10d04a <_Workspace_Allocate>
10c323: 89 c7 mov %eax,%edi
if ( !fp_area )
10c325: 83 c4 10 add $0x10,%esp
10c328: 85 c0 test %eax,%eax
10c32a: 0f 84 23 01 00 00 je 10c453 <_Thread_Initialize+0x1c3>
goto failed;
fp_area = _Context_Fp_start( fp_area, 0 );
}
the_thread->fp_context = fp_area;
10c330: 89 bb e0 00 00 00 mov %edi,0xe0(%ebx)
the_thread->Start.fp_context = fp_area;
10c336: 89 bb c0 00 00 00 mov %edi,0xc0(%ebx)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10c33c: c7 43 50 00 00 00 00 movl $0x0,0x50(%ebx)
the_watchdog->routine = routine;
10c343: c7 43 64 00 00 00 00 movl $0x0,0x64(%ebx)
the_watchdog->id = id;
10c34a: c7 43 68 00 00 00 00 movl $0x0,0x68(%ebx)
the_watchdog->user_data = user_data;
10c351: c7 43 6c 00 00 00 00 movl $0x0,0x6c(%ebx)
#endif
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
10c358: a1 d4 53 12 00 mov 0x1253d4,%eax
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
10c35d: 31 f6 xor %esi,%esi
#endif
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
10c35f: 85 c0 test %eax,%eax
10c361: 74 1d je 10c380 <_Thread_Initialize+0xf0>
extensions_area = _Workspace_Allocate(
10c363: 83 ec 0c sub $0xc,%esp
10c366: 8d 04 85 04 00 00 00 lea 0x4(,%eax,4),%eax
10c36d: 50 push %eax
10c36e: e8 d7 0c 00 00 call 10d04a <_Workspace_Allocate>
10c373: 89 c6 mov %eax,%esi
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
10c375: 83 c4 10 add $0x10,%esp
10c378: 85 c0 test %eax,%eax
10c37a: 0f 84 d5 00 00 00 je 10c455 <_Thread_Initialize+0x1c5>
goto failed;
}
the_thread->extensions = (void **) extensions_area;
10c380: 89 b3 f0 00 00 00 mov %esi,0xf0(%ebx)
* if they are linked to the thread. An extension user may
* create the extension long after tasks have been created
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
10c386: 85 f6 test %esi,%esi
10c388: 74 16 je 10c3a0 <_Thread_Initialize+0x110>
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
10c38a: 8b 15 d4 53 12 00 mov 0x1253d4,%edx
10c390: 31 c0 xor %eax,%eax
10c392: eb 08 jmp 10c39c <_Thread_Initialize+0x10c>
the_thread->extensions[i] = NULL;
10c394: c7 04 86 00 00 00 00 movl $0x0,(%esi,%eax,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++ )
10c39b: 40 inc %eax
10c39c: 39 d0 cmp %edx,%eax
10c39e: 76 f4 jbe 10c394 <_Thread_Initialize+0x104>
/*
* General initialization
*/
the_thread->Start.is_preemptible = is_preemptible;
10c3a0: 8a 45 e7 mov -0x19(%ebp),%al
10c3a3: 88 83 a0 00 00 00 mov %al,0xa0(%ebx)
the_thread->Start.budget_algorithm = budget_algorithm;
10c3a9: 8b 45 24 mov 0x24(%ebp),%eax
10c3ac: 89 83 a4 00 00 00 mov %eax,0xa4(%ebx)
the_thread->Start.budget_callout = budget_callout;
10c3b2: 8b 45 28 mov 0x28(%ebp),%eax
10c3b5: 89 83 a8 00 00 00 mov %eax,0xa8(%ebx)
switch ( budget_algorithm ) {
10c3bb: 83 7d 24 02 cmpl $0x2,0x24(%ebp)
10c3bf: 75 08 jne 10c3c9 <_Thread_Initialize+0x139>
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;
10c3c1: a1 10 53 12 00 mov 0x125310,%eax
10c3c6: 89 43 78 mov %eax,0x78(%ebx)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
break;
#endif
}
the_thread->Start.isr_level = isr_level;
10c3c9: 8b 45 2c mov 0x2c(%ebp),%eax
10c3cc: 89 83 ac 00 00 00 mov %eax,0xac(%ebx)
the_thread->current_state = STATES_DORMANT;
10c3d2: c7 43 10 01 00 00 00 movl $0x1,0x10(%ebx)
the_thread->Wait.queue = NULL;
10c3d9: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx)
the_thread->resource_count = 0;
10c3e0: c7 43 1c 00 00 00 00 movl $0x0,0x1c(%ebx)
the_thread->real_priority = priority;
10c3e7: 8b 45 1c mov 0x1c(%ebp),%eax
10c3ea: 89 43 18 mov %eax,0x18(%ebx)
the_thread->Start.initial_priority = priority;
10c3ed: 89 83 b0 00 00 00 mov %eax,0xb0(%ebx)
*/
RTEMS_INLINE_ROUTINE void* _Scheduler_Allocate(
Thread_Control *the_thread
)
{
return _Scheduler.Operations.allocate( the_thread );
10c3f3: 83 ec 0c sub $0xc,%esp
10c3f6: 53 push %ebx
10c3f7: ff 15 68 11 12 00 call *0x121168
10c3fd: 89 c2 mov %eax,%edx
sched =_Scheduler_Allocate( the_thread );
if ( !sched )
10c3ff: 83 c4 10 add $0x10,%esp
10c402: 85 c0 test %eax,%eax
10c404: 74 51 je 10c457 <_Thread_Initialize+0x1c7>
goto failed;
_Thread_Set_priority( the_thread, priority );
10c406: 51 push %ecx
10c407: 51 push %ecx
10c408: ff 75 1c pushl 0x1c(%ebp)
10c40b: 53 push %ebx
10c40c: 89 45 e0 mov %eax,-0x20(%ebp)
10c40f: e8 40 05 00 00 call 10c954 <_Thread_Set_priority>
/*
* Initialize the CPU usage statistics
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Set_to_zero( &the_thread->cpu_time_used );
10c414: c7 83 84 00 00 00 00 movl $0x0,0x84(%ebx)
10c41b: 00 00 00
10c41e: c7 83 88 00 00 00 00 movl $0x0,0x88(%ebx)
10c425: 00 00 00
_Workspace_Free( sched );
_Thread_Stack_Free( the_thread );
return false;
}
10c428: 8b 45 08 mov 0x8(%ebp),%eax
10c42b: 8b 40 1c mov 0x1c(%eax),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
10c42e: 0f b7 4b 08 movzwl 0x8(%ebx),%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10c432: 89 1c 88 mov %ebx,(%eax,%ecx,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
10c435: 8b 45 30 mov 0x30(%ebp),%eax
10c438: 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 );
10c43b: 89 1c 24 mov %ebx,(%esp)
10c43e: e8 e9 08 00 00 call 10cd2c <_User_extensions_Thread_create>
10c443: 88 c1 mov %al,%cl
if ( extension_status )
10c445: 83 c4 10 add $0x10,%esp
return true;
10c448: b0 01 mov $0x1,%al
* 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 );
if ( extension_status )
10c44a: 84 c9 test %cl,%cl
10c44c: 8b 55 e0 mov -0x20(%ebp),%edx
10c44f: 74 06 je 10c457 <_Thread_Initialize+0x1c7>
10c451: eb 55 jmp 10c4a8 <_Thread_Initialize+0x218>
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
10c453: 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;
10c455: 31 d2 xor %edx,%edx
extension_status = _User_extensions_Thread_create( the_thread );
if ( extension_status )
return true;
failed:
_Workspace_Free( the_thread->libc_reent );
10c457: 83 ec 0c sub $0xc,%esp
10c45a: ff b3 e4 00 00 00 pushl 0xe4(%ebx)
10c460: 89 55 e0 mov %edx,-0x20(%ebp)
10c463: e8 fb 0b 00 00 call 10d063 <_Workspace_Free>
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
_Workspace_Free( the_thread->API_Extensions[i] );
10c468: 5a pop %edx
10c469: ff b3 e8 00 00 00 pushl 0xe8(%ebx)
10c46f: e8 ef 0b 00 00 call 10d063 <_Workspace_Free>
10c474: 58 pop %eax
10c475: ff b3 ec 00 00 00 pushl 0xec(%ebx)
10c47b: e8 e3 0b 00 00 call 10d063 <_Workspace_Free>
_Workspace_Free( extensions_area );
10c480: 89 34 24 mov %esi,(%esp)
10c483: e8 db 0b 00 00 call 10d063 <_Workspace_Free>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
_Workspace_Free( fp_area );
10c488: 89 3c 24 mov %edi,(%esp)
10c48b: e8 d3 0b 00 00 call 10d063 <_Workspace_Free>
#endif
_Workspace_Free( sched );
10c490: 8b 55 e0 mov -0x20(%ebp),%edx
10c493: 89 14 24 mov %edx,(%esp)
10c496: e8 c8 0b 00 00 call 10d063 <_Workspace_Free>
_Thread_Stack_Free( the_thread );
10c49b: 89 1c 24 mov %ebx,(%esp)
10c49e: e8 81 05 00 00 call 10ca24 <_Thread_Stack_Free>
return false;
10c4a3: 83 c4 10 add $0x10,%esp
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 */
10c4a6: 31 c0 xor %eax,%eax
_Workspace_Free( sched );
_Thread_Stack_Free( the_thread );
return false;
}
10c4a8: 8d 65 f4 lea -0xc(%ebp),%esp
10c4ab: 5b pop %ebx
10c4ac: 5e pop %esi
10c4ad: 5f pop %edi
10c4ae: c9 leave
10c4af: c3 ret
0010f6dc <_Thread_Resume>:
*/
void _Thread_Resume(
Thread_Control *the_thread,
bool force
)
{
10f6dc: 55 push %ebp
10f6dd: 89 e5 mov %esp,%ebp
10f6df: 53 push %ebx
10f6e0: 83 ec 04 sub $0x4,%esp
10f6e3: 8b 45 08 mov 0x8(%ebp),%eax
ISR_Level level;
States_Control current_state;
_ISR_Disable( level );
10f6e6: 9c pushf
10f6e7: fa cli
10f6e8: 5b pop %ebx
current_state = the_thread->current_state;
10f6e9: 8b 50 10 mov 0x10(%eax),%edx
if ( current_state & STATES_SUSPENDED ) {
10f6ec: f6 c2 02 test $0x2,%dl
10f6ef: 74 17 je 10f708 <_Thread_Resume+0x2c> <== NEVER TAKEN
10f6f1: 83 e2 fd and $0xfffffffd,%edx
current_state =
the_thread->current_state = _States_Clear(STATES_SUSPENDED, current_state);
10f6f4: 89 50 10 mov %edx,0x10(%eax)
if ( _States_Is_ready( current_state ) ) {
10f6f7: 85 d2 test %edx,%edx
10f6f9: 75 0d jne 10f708 <_Thread_Resume+0x2c>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Unblock(
Thread_Control *the_thread
)
{
_Scheduler.Operations.unblock( the_thread );
10f6fb: 83 ec 0c sub $0xc,%esp
10f6fe: 50 push %eax
10f6ff: ff 15 64 41 12 00 call *0x124164
10f705: 83 c4 10 add $0x10,%esp
_Scheduler_Unblock( the_thread );
}
}
_ISR_Enable( level );
10f708: 53 push %ebx
10f709: 9d popf
}
10f70a: 8b 5d fc mov -0x4(%ebp),%ebx
10f70d: c9 leave
10f70e: c3 ret
0010cb0c <_Thread_Tickle_timeslice>:
*
* Output parameters: NONE
*/
void _Thread_Tickle_timeslice( void )
{
10cb0c: 55 push %ebp
10cb0d: 89 e5 mov %esp,%ebp
10cb0f: 53 push %ebx
10cb10: 83 ec 04 sub $0x4,%esp
Thread_Control *executing;
executing = _Thread_Executing;
10cb13: 8b 1d 68 58 12 00 mov 0x125868,%ebx
/*
* If the thread is not preemptible or is not ready, then
* just return.
*/
if ( !executing->is_preemptible )
10cb19: 80 7b 74 00 cmpb $0x0,0x74(%ebx)
10cb1d: 74 4d je 10cb6c <_Thread_Tickle_timeslice+0x60>
return;
if ( !_States_Is_ready( executing->current_state ) )
10cb1f: 83 7b 10 00 cmpl $0x0,0x10(%ebx)
10cb23: 75 47 jne 10cb6c <_Thread_Tickle_timeslice+0x60>
/*
* The cpu budget algorithm determines what happens next.
*/
switch ( executing->budget_algorithm ) {
10cb25: 8b 43 7c mov 0x7c(%ebx),%eax
10cb28: 83 f8 01 cmp $0x1,%eax
10cb2b: 72 3f jb 10cb6c <_Thread_Tickle_timeslice+0x60>
10cb2d: 83 f8 02 cmp $0x2,%eax
10cb30: 76 07 jbe 10cb39 <_Thread_Tickle_timeslice+0x2d>
10cb32: 83 f8 03 cmp $0x3,%eax
10cb35: 75 35 jne 10cb6c <_Thread_Tickle_timeslice+0x60><== NEVER TAKEN
10cb37: eb 1b jmp 10cb54 <_Thread_Tickle_timeslice+0x48>
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 ) {
10cb39: 8b 43 78 mov 0x78(%ebx),%eax
10cb3c: 48 dec %eax
10cb3d: 89 43 78 mov %eax,0x78(%ebx)
10cb40: 85 c0 test %eax,%eax
10cb42: 7f 28 jg 10cb6c <_Thread_Tickle_timeslice+0x60>
* always operates on the scheduler that 'owns' the currently executing
* thread.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Yield( void )
{
_Scheduler.Operations.yield();
10cb44: ff 15 5c 11 12 00 call *0x12115c
* 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;
10cb4a: a1 10 53 12 00 mov 0x125310,%eax
10cb4f: 89 43 78 mov %eax,0x78(%ebx)
10cb52: eb 18 jmp 10cb6c <_Thread_Tickle_timeslice+0x60>
}
break;
#if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
if ( --executing->cpu_time_budget == 0 )
10cb54: 8b 43 78 mov 0x78(%ebx),%eax
10cb57: 48 dec %eax
10cb58: 89 43 78 mov %eax,0x78(%ebx)
10cb5b: 85 c0 test %eax,%eax
10cb5d: 75 0d jne 10cb6c <_Thread_Tickle_timeslice+0x60>
(*executing->budget_callout)( executing );
10cb5f: 83 ec 0c sub $0xc,%esp
10cb62: 53 push %ebx
10cb63: ff 93 80 00 00 00 call *0x80(%ebx)
10cb69: 83 c4 10 add $0x10,%esp
break;
#endif
}
}
10cb6c: 8b 5d fc mov -0x4(%ebp),%ebx
10cb6f: c9 leave
10cb70: c3 ret
0010c8cc <_Thread_queue_Requeue>:
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
10c8cc: 55 push %ebp
10c8cd: 89 e5 mov %esp,%ebp
10c8cf: 57 push %edi
10c8d0: 56 push %esi
10c8d1: 53 push %ebx
10c8d2: 83 ec 1c sub $0x1c,%esp
10c8d5: 8b 75 08 mov 0x8(%ebp),%esi
10c8d8: 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 )
10c8db: 85 f6 test %esi,%esi
10c8dd: 74 36 je 10c915 <_Thread_queue_Requeue+0x49><== 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 ) {
10c8df: 83 7e 34 01 cmpl $0x1,0x34(%esi)
10c8e3: 75 30 jne 10c915 <_Thread_queue_Requeue+0x49><== NEVER TAKEN
Thread_queue_Control *tq = the_thread_queue;
ISR_Level level;
ISR_Level level_ignored;
_ISR_Disable( level );
10c8e5: 9c pushf
10c8e6: fa cli
10c8e7: 5b pop %ebx
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
10c8e8: f7 47 10 e0 be 03 00 testl $0x3bee0,0x10(%edi)
10c8ef: 74 22 je 10c913 <_Thread_queue_Requeue+0x47><== NEVER TAKEN
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;
10c8f1: c7 46 30 01 00 00 00 movl $0x1,0x30(%esi)
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
10c8f8: 50 push %eax
10c8f9: 6a 01 push $0x1
10c8fb: 57 push %edi
10c8fc: 56 push %esi
10c8fd: e8 12 31 00 00 call 10fa14 <_Thread_queue_Extract_priority_helper>
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
10c902: 83 c4 0c add $0xc,%esp
10c905: 8d 45 e4 lea -0x1c(%ebp),%eax
10c908: 50 push %eax
10c909: 57 push %edi
10c90a: 56 push %esi
10c90b: e8 c0 fd ff ff call 10c6d0 <_Thread_queue_Enqueue_priority>
10c910: 83 c4 10 add $0x10,%esp
}
_ISR_Enable( level );
10c913: 53 push %ebx
10c914: 9d popf
}
}
10c915: 8d 65 f4 lea -0xc(%ebp),%esp
10c918: 5b pop %ebx
10c919: 5e pop %esi
10c91a: 5f pop %edi
10c91b: c9 leave
10c91c: c3 ret
0010c920 <_Thread_queue_Timeout>:
void _Thread_queue_Timeout(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
10c920: 55 push %ebp
10c921: 89 e5 mov %esp,%ebp
10c923: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10c926: 8d 45 f4 lea -0xc(%ebp),%eax
10c929: 50 push %eax
10c92a: ff 75 08 pushl 0x8(%ebp)
10c92d: e8 ea f8 ff ff call 10c21c <_Thread_Get>
switch ( location ) {
10c932: 83 c4 10 add $0x10,%esp
10c935: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
10c939: 75 17 jne 10c952 <_Thread_queue_Timeout+0x32><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
10c93b: 83 ec 0c sub $0xc,%esp
10c93e: 50 push %eax
10c93f: e8 88 31 00 00 call 10facc <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10c944: a1 40 53 12 00 mov 0x125340,%eax
10c949: 48 dec %eax
10c94a: a3 40 53 12 00 mov %eax,0x125340
10c94f: 83 c4 10 add $0x10,%esp
_Thread_Unnest_dispatch();
break;
}
}
10c952: c9 leave
10c953: c3 ret
00116a64 <_Timer_server_Body>:
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
116a64: 55 push %ebp
116a65: 89 e5 mov %esp,%ebp
116a67: 57 push %edi
116a68: 56 push %esi
116a69: 53 push %ebx
116a6a: 83 ec 4c sub $0x4c,%esp
116a6d: 8b 5d 08 mov 0x8(%ebp),%ebx
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
116a70: 8d 55 dc lea -0x24(%ebp),%edx
116a73: 8d 45 e0 lea -0x20(%ebp),%eax
116a76: 89 45 dc mov %eax,-0x24(%ebp)
head->previous = NULL;
116a79: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
tail->previous = head;
116a80: 89 55 e4 mov %edx,-0x1c(%ebp)
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
116a83: 8d 7d d0 lea -0x30(%ebp),%edi
116a86: 8d 4d d4 lea -0x2c(%ebp),%ecx
116a89: 89 4d d0 mov %ecx,-0x30(%ebp)
head->previous = NULL;
116a8c: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp)
tail->previous = head;
116a93: 89 7d d8 mov %edi,-0x28(%ebp)
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
116a96: 8d 53 30 lea 0x30(%ebx),%edx
116a99: 89 55 c0 mov %edx,-0x40(%ebp)
/*
* 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 );
116a9c: 8d 73 68 lea 0x68(%ebx),%esi
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_tail(
const Chain_Control *the_chain
)
{
return &the_chain->Tail.Node;
116a9f: 89 45 b4 mov %eax,-0x4c(%ebp)
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;
116aa2: 8d 4d dc lea -0x24(%ebp),%ecx
116aa5: 89 4b 78 mov %ecx,0x78(%ebx)
static void _Timer_server_Process_interval_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
116aa8: a1 e8 f1 13 00 mov 0x13f1e8,%eax
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
116aad: 8b 53 3c mov 0x3c(%ebx),%edx
watchdogs->last_snapshot = snapshot;
116ab0: 89 43 3c mov %eax,0x3c(%ebx)
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
116ab3: 51 push %ecx
116ab4: 57 push %edi
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
116ab5: 29 d0 sub %edx,%eax
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
116ab7: 50 push %eax
116ab8: ff 75 c0 pushl -0x40(%ebp)
116abb: e8 d4 39 00 00 call 11a494 <_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();
116ac0: a1 60 f1 13 00 mov 0x13f160,%eax
116ac5: 89 45 c4 mov %eax,-0x3c(%ebp)
Watchdog_Interval last_snapshot = watchdogs->last_snapshot;
116ac8: 8b 43 74 mov 0x74(%ebx),%eax
/*
* 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 ) {
116acb: 83 c4 10 add $0x10,%esp
116ace: 39 45 c4 cmp %eax,-0x3c(%ebp)
116ad1: 76 10 jbe 116ae3 <_Timer_server_Body+0x7f>
/*
* 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 );
116ad3: 52 push %edx
116ad4: 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;
116ad5: 8b 55 c4 mov -0x3c(%ebp),%edx
116ad8: 29 c2 sub %eax,%edx
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
116ada: 52 push %edx
116adb: 56 push %esi
116adc: e8 b3 39 00 00 call 11a494 <_Watchdog_Adjust_to_chain>
116ae1: eb 0f jmp 116af2 <_Timer_server_Body+0x8e>
} else if ( snapshot < last_snapshot ) {
116ae3: 73 10 jae 116af5 <_Timer_server_Body+0x91>
/*
* 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 );
116ae5: 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;
116ae6: 2b 45 c4 sub -0x3c(%ebp),%eax
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
116ae9: 50 push %eax
116aea: 6a 01 push $0x1
116aec: 56 push %esi
116aed: e8 36 39 00 00 call 11a428 <_Watchdog_Adjust>
116af2: 83 c4 10 add $0x10,%esp
}
watchdogs->last_snapshot = snapshot;
116af5: 8b 4d c4 mov -0x3c(%ebp),%ecx
116af8: 89 4b 74 mov %ecx,0x74(%ebx)
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
116afb: 8b 43 78 mov 0x78(%ebx),%eax
116afe: 83 ec 0c sub $0xc,%esp
116b01: 50 push %eax
116b02: e8 fd 08 00 00 call 117404 <_Chain_Get>
if ( timer == NULL ) {
116b07: 83 c4 10 add $0x10,%esp
116b0a: 85 c0 test %eax,%eax
116b0c: 74 29 je 116b37 <_Timer_server_Body+0xd3><== ALWAYS TAKEN
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
116b0e: 8b 50 38 mov 0x38(%eax),%edx <== NOT EXECUTED
116b11: 83 fa 01 cmp $0x1,%edx <== NOT EXECUTED
116b14: 75 0b jne 116b21 <_Timer_server_Body+0xbd><== NOT EXECUTED
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
116b16: 52 push %edx <== NOT EXECUTED
116b17: 52 push %edx <== NOT EXECUTED
116b18: 83 c0 10 add $0x10,%eax <== NOT EXECUTED
116b1b: 50 push %eax <== NOT EXECUTED
116b1c: ff 75 c0 pushl -0x40(%ebp) <== NOT EXECUTED
116b1f: eb 0c jmp 116b2d <_Timer_server_Body+0xc9><== NOT EXECUTED
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
116b21: 83 fa 03 cmp $0x3,%edx <== NOT EXECUTED
116b24: 75 d5 jne 116afb <_Timer_server_Body+0x97><== NOT EXECUTED
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
116b26: 51 push %ecx <== NOT EXECUTED
116b27: 51 push %ecx <== NOT EXECUTED
116b28: 83 c0 10 add $0x10,%eax <== NOT EXECUTED
116b2b: 50 push %eax <== NOT EXECUTED
116b2c: 56 push %esi <== NOT EXECUTED
116b2d: e8 ea 39 00 00 call 11a51c <_Watchdog_Insert> <== NOT EXECUTED
116b32: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
116b35: eb c4 jmp 116afb <_Timer_server_Body+0x97><== 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 );
116b37: 9c pushf
116b38: fa cli
116b39: 5a pop %edx
tmp = ts->insert_chain;
116b3a: 8b 43 78 mov 0x78(%ebx),%eax
if ( _Chain_Is_empty( insert_chain ) ) {
116b3d: b0 01 mov $0x1,%al
116b3f: 8b 4d b4 mov -0x4c(%ebp),%ecx
116b42: 39 4d dc cmp %ecx,-0x24(%ebp)
116b45: 75 09 jne 116b50 <_Timer_server_Body+0xec><== NEVER TAKEN
ts->insert_chain = NULL;
116b47: c7 43 78 00 00 00 00 movl $0x0,0x78(%ebx)
do_loop = false;
116b4e: 31 c0 xor %eax,%eax
}
_ISR_Enable( level );
116b50: 52 push %edx
116b51: 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 ) {
116b52: 84 c0 test %al,%al
116b54: 0f 85 4e ff ff ff jne 116aa8 <_Timer_server_Body+0x44><== NEVER TAKEN
116b5a: 8d 45 d4 lea -0x2c(%ebp),%eax
_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 ) ) {
116b5d: 39 45 d0 cmp %eax,-0x30(%ebp)
116b60: 74 3a je 116b9c <_Timer_server_Body+0x138>
116b62: 89 45 b0 mov %eax,-0x50(%ebp)
/*
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
116b65: 9c pushf
116b66: fa cli
116b67: 59 pop %ecx
initialized = false;
}
#endif
return status;
}
116b68: 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))
116b6b: 3b 45 b0 cmp -0x50(%ebp),%eax
116b6e: 74 25 je 116b95 <_Timer_server_Body+0x131>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
116b70: 8b 10 mov (%eax),%edx
head->next = new_first;
116b72: 89 55 d0 mov %edx,-0x30(%ebp)
new_first->previous = head;
116b75: 89 7a 04 mov %edi,0x4(%edx)
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
116b78: 85 c0 test %eax,%eax
116b7a: 74 19 je 116b95 <_Timer_server_Body+0x131><== NEVER TAKEN
watchdog->state = WATCHDOG_INACTIVE;
116b7c: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)
_ISR_Enable( level );
116b83: 51 push %ecx
116b84: 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 );
116b85: 52 push %edx
116b86: 52 push %edx
116b87: ff 70 24 pushl 0x24(%eax)
116b8a: ff 70 20 pushl 0x20(%eax)
116b8d: ff 50 1c call *0x1c(%eax)
}
116b90: 83 c4 10 add $0x10,%esp
116b93: eb d0 jmp 116b65 <_Timer_server_Body+0x101>
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
_ISR_Enable( level );
} else {
_ISR_Enable( level );
116b95: 51 push %ecx
116b96: 9d popf
116b97: e9 06 ff ff ff jmp 116aa2 <_Timer_server_Body+0x3e>
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
}
} else {
ts->active = false;
116b9c: c6 43 7c 00 movb $0x0,0x7c(%ebx)
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
116ba0: e8 23 fe ff ff call 1169c8 <_Thread_Disable_dispatch>
_Thread_Set_state( ts->thread, STATES_DELAYING );
116ba5: 51 push %ecx
116ba6: 51 push %ecx
116ba7: 6a 08 push $0x8
116ba9: ff 33 pushl (%ebx)
116bab: e8 18 33 00 00 call 119ec8 <_Thread_Set_state>
_Timer_server_Reset_interval_system_watchdog( ts );
116bb0: 89 d8 mov %ebx,%eax
116bb2: e8 21 fe ff ff call 1169d8 <_Timer_server_Reset_interval_system_watchdog>
_Timer_server_Reset_tod_system_watchdog( ts );
116bb7: 89 d8 mov %ebx,%eax
116bb9: e8 60 fe ff ff call 116a1e <_Timer_server_Reset_tod_system_watchdog>
_Thread_Enable_dispatch();
116bbe: e8 db 2a 00 00 call 11969e <_Thread_Enable_dispatch>
ts->active = true;
116bc3: 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 );
116bc7: 8d 43 08 lea 0x8(%ebx),%eax
116bca: 89 04 24 mov %eax,(%esp)
116bcd: e8 6a 3a 00 00 call 11a63c <_Watchdog_Remove>
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
116bd2: 8d 43 40 lea 0x40(%ebx),%eax
116bd5: 89 04 24 mov %eax,(%esp)
116bd8: e8 5f 3a 00 00 call 11a63c <_Watchdog_Remove>
116bdd: 83 c4 10 add $0x10,%esp
116be0: e9 bd fe ff ff jmp 116aa2 <_Timer_server_Body+0x3e>
00116be5 <_Timer_server_Schedule_operation_method>:
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
116be5: 55 push %ebp
116be6: 89 e5 mov %esp,%ebp
116be8: 57 push %edi
116be9: 56 push %esi
116bea: 53 push %ebx
116beb: 83 ec 2c sub $0x2c,%esp
116bee: 8b 5d 08 mov 0x8(%ebp),%ebx
116bf1: 8b 75 0c mov 0xc(%ebp),%esi
if ( ts->insert_chain == NULL ) {
116bf4: 8b 43 78 mov 0x78(%ebx),%eax
116bf7: 85 c0 test %eax,%eax
116bf9: 0f 85 de 00 00 00 jne 116cdd <_Timer_server_Schedule_operation_method+0xf8><== NEVER TAKEN
* is the reference point for the delta chain. Thus if we do not update the
* reference point we have to add DT to the initial delta of the watchdog
* being inserted. This could result in an integer overflow.
*/
_Thread_Disable_dispatch();
116bff: e8 c4 fd ff ff call 1169c8 <_Thread_Disable_dispatch>
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
116c04: 8b 46 38 mov 0x38(%esi),%eax
116c07: 83 f8 01 cmp $0x1,%eax
116c0a: 75 5a jne 116c66 <_Timer_server_Schedule_operation_method+0x81>
/*
* We have to advance the last known ticks value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
116c0c: 9c pushf
116c0d: fa cli
116c0e: 8f 45 e0 popl -0x20(%ebp)
snapshot = _Watchdog_Ticks_since_boot;
116c11: 8b 15 e8 f1 13 00 mov 0x13f1e8,%edx
last_snapshot = ts->Interval_watchdogs.last_snapshot;
116c17: 8b 4b 3c mov 0x3c(%ebx),%ecx
initialized = false;
}
#endif
return status;
}
116c1a: 8b 43 30 mov 0x30(%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 );
116c1d: 8d 7b 34 lea 0x34(%ebx),%edi
* 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 ) ) {
116c20: 39 f8 cmp %edi,%eax
116c22: 74 19 je 116c3d <_Timer_server_Schedule_operation_method+0x58>
first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain );
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
116c24: 89 d7 mov %edx,%edi
116c26: 29 cf sub %ecx,%edi
116c28: 89 7d e4 mov %edi,-0x1c(%ebp)
delta_interval = first_watchdog->delta_interval;
116c2b: 8b 78 10 mov 0x10(%eax),%edi
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
116c2e: 31 c9 xor %ecx,%ecx
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
116c30: 3b 7d e4 cmp -0x1c(%ebp),%edi
116c33: 76 05 jbe 116c3a <_Timer_server_Schedule_operation_method+0x55>
delta_interval -= delta;
116c35: 89 f9 mov %edi,%ecx
116c37: 2b 4d e4 sub -0x1c(%ebp),%ecx
} else {
delta_interval = 0;
}
first_watchdog->delta_interval = delta_interval;
116c3a: 89 48 10 mov %ecx,0x10(%eax)
}
ts->Interval_watchdogs.last_snapshot = snapshot;
116c3d: 89 53 3c mov %edx,0x3c(%ebx)
_ISR_Enable( level );
116c40: ff 75 e0 pushl -0x20(%ebp)
116c43: 9d popf
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
116c44: 50 push %eax
116c45: 50 push %eax
116c46: 83 c6 10 add $0x10,%esi
116c49: 56 push %esi
116c4a: 8d 43 30 lea 0x30(%ebx),%eax
116c4d: 50 push %eax
116c4e: e8 c9 38 00 00 call 11a51c <_Watchdog_Insert>
if ( !ts->active ) {
116c53: 8a 43 7c mov 0x7c(%ebx),%al
116c56: 83 c4 10 add $0x10,%esp
116c59: 84 c0 test %al,%al
116c5b: 75 74 jne 116cd1 <_Timer_server_Schedule_operation_method+0xec>
_Timer_server_Reset_interval_system_watchdog( ts );
116c5d: 89 d8 mov %ebx,%eax
116c5f: e8 74 fd ff ff call 1169d8 <_Timer_server_Reset_interval_system_watchdog>
116c64: eb 6b jmp 116cd1 <_Timer_server_Schedule_operation_method+0xec>
}
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
116c66: 83 f8 03 cmp $0x3,%eax
116c69: 75 66 jne 116cd1 <_Timer_server_Schedule_operation_method+0xec>
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
116c6b: 9c pushf
116c6c: fa cli
116c6d: 8f 45 e0 popl -0x20(%ebp)
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
116c70: 8b 15 60 f1 13 00 mov 0x13f160,%edx
last_snapshot = ts->TOD_watchdogs.last_snapshot;
116c76: 8b 43 74 mov 0x74(%ebx),%eax
initialized = false;
}
#endif
return status;
}
116c79: 8b 4b 68 mov 0x68(%ebx),%ecx
116c7c: 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 ) ) {
116c7f: 39 f9 cmp %edi,%ecx
116c81: 74 27 je 116caa <_Timer_server_Schedule_operation_method+0xc5>
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
116c83: 8b 79 10 mov 0x10(%ecx),%edi
116c86: 89 7d d4 mov %edi,-0x2c(%ebp)
if ( snapshot > last_snapshot ) {
116c89: 39 c2 cmp %eax,%edx
116c8b: 76 15 jbe 116ca2 <_Timer_server_Schedule_operation_method+0xbd>
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
116c8d: 89 d7 mov %edx,%edi
116c8f: 29 c7 sub %eax,%edi
116c91: 89 7d e4 mov %edi,-0x1c(%ebp)
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
116c94: 31 c0 xor %eax,%eax
if ( snapshot > last_snapshot ) {
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
if (delta_interval > delta) {
116c96: 39 7d d4 cmp %edi,-0x2c(%ebp)
116c99: 76 0c jbe 116ca7 <_Timer_server_Schedule_operation_method+0xc2><== NEVER TAKEN
delta_interval -= delta;
116c9b: 8b 45 d4 mov -0x2c(%ebp),%eax
116c9e: 29 f8 sub %edi,%eax
116ca0: eb 05 jmp 116ca7 <_Timer_server_Schedule_operation_method+0xc2>
}
} else {
/*
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
116ca2: 03 45 d4 add -0x2c(%ebp),%eax
delta_interval += delta;
116ca5: 29 d0 sub %edx,%eax
}
first_watchdog->delta_interval = delta_interval;
116ca7: 89 41 10 mov %eax,0x10(%ecx)
}
ts->TOD_watchdogs.last_snapshot = snapshot;
116caa: 89 53 74 mov %edx,0x74(%ebx)
_ISR_Enable( level );
116cad: ff 75 e0 pushl -0x20(%ebp)
116cb0: 9d popf
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
116cb1: 57 push %edi
116cb2: 57 push %edi
116cb3: 83 c6 10 add $0x10,%esi
116cb6: 56 push %esi
116cb7: 8d 43 68 lea 0x68(%ebx),%eax
116cba: 50 push %eax
116cbb: e8 5c 38 00 00 call 11a51c <_Watchdog_Insert>
if ( !ts->active ) {
116cc0: 8a 43 7c mov 0x7c(%ebx),%al
116cc3: 83 c4 10 add $0x10,%esp
116cc6: 84 c0 test %al,%al
116cc8: 75 07 jne 116cd1 <_Timer_server_Schedule_operation_method+0xec>
_Timer_server_Reset_tod_system_watchdog( ts );
116cca: 89 d8 mov %ebx,%eax
116ccc: e8 4d fd ff ff call 116a1e <_Timer_server_Reset_tod_system_watchdog>
* 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 );
}
}
116cd1: 8d 65 f4 lea -0xc(%ebp),%esp
116cd4: 5b pop %ebx
116cd5: 5e pop %esi
116cd6: 5f pop %edi
116cd7: c9 leave
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
116cd8: e9 c1 29 00 00 jmp 11969e <_Thread_Enable_dispatch>
* 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 );
116cdd: 8b 43 78 mov 0x78(%ebx),%eax <== NOT EXECUTED
116ce0: 89 75 0c mov %esi,0xc(%ebp) <== NOT EXECUTED
116ce3: 89 45 08 mov %eax,0x8(%ebp) <== NOT EXECUTED
}
}
116ce6: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
116ce9: 5b pop %ebx <== NOT EXECUTED
116cea: 5e pop %esi <== NOT EXECUTED
116ceb: 5f pop %edi <== NOT EXECUTED
116cec: 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 );
116ced: e9 d6 06 00 00 jmp 1173c8 <_Chain_Append> <== NOT EXECUTED
0010ccef <_User_extensions_Fatal>:
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
10ccef: 55 push %ebp
10ccf0: 89 e5 mov %esp,%ebp
10ccf2: 57 push %edi
10ccf3: 56 push %esi
10ccf4: 53 push %ebx
10ccf5: 83 ec 0c sub $0xc,%esp
10ccf8: 8b 7d 10 mov 0x10(%ebp),%edi
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
10ccfb: 8b 1d 14 55 12 00 mov 0x125514,%ebx
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 );
10cd01: 0f b6 75 0c movzbl 0xc(%ebp),%esi
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10cd05: eb 15 jmp 10cd1c <_User_extensions_Fatal+0x2d>
!_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 )
10cd07: 8b 43 30 mov 0x30(%ebx),%eax
10cd0a: 85 c0 test %eax,%eax
10cd0c: 74 0b je 10cd19 <_User_extensions_Fatal+0x2a>
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
10cd0e: 52 push %edx
10cd0f: 57 push %edi
10cd10: 56 push %esi
10cd11: ff 75 08 pushl 0x8(%ebp)
10cd14: ff d0 call *%eax
10cd16: 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 ) {
10cd19: 8b 5b 04 mov 0x4(%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10cd1c: 81 fb 0c 55 12 00 cmp $0x12550c,%ebx
10cd22: 75 e3 jne 10cd07 <_User_extensions_Fatal+0x18><== 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 );
}
}
10cd24: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10cd27: 5b pop %ebx <== NOT EXECUTED
10cd28: 5e pop %esi <== NOT EXECUTED
10cd29: 5f pop %edi <== NOT EXECUTED
10cd2a: c9 leave <== NOT EXECUTED
10cd2b: c3 ret <== NOT EXECUTED
0010cbd8 <_User_extensions_Handler_initialization>:
#include <rtems/score/userext.h>
#include <rtems/score/wkspace.h>
#include <string.h>
void _User_extensions_Handler_initialization(void)
{
10cbd8: 55 push %ebp
10cbd9: 89 e5 mov %esp,%ebp
10cbdb: 57 push %edi
10cbdc: 56 push %esi
10cbdd: 53 push %ebx
10cbde: 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;
10cbe1: a1 60 12 12 00 mov 0x121260,%eax
10cbe6: 89 45 e4 mov %eax,-0x1c(%ebp)
initial_extensions = Configuration.User_extension_table;
10cbe9: 8b 35 64 12 12 00 mov 0x121264,%esi
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10cbef: c7 05 0c 55 12 00 10 movl $0x125510,0x12550c
10cbf6: 55 12 00
head->previous = NULL;
10cbf9: c7 05 10 55 12 00 00 movl $0x0,0x125510
10cc00: 00 00 00
tail->previous = head;
10cc03: c7 05 14 55 12 00 0c movl $0x12550c,0x125514
10cc0a: 55 12 00
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10cc0d: c7 05 44 53 12 00 48 movl $0x125348,0x125344
10cc14: 53 12 00
head->previous = NULL;
10cc17: c7 05 48 53 12 00 00 movl $0x0,0x125348
10cc1e: 00 00 00
tail->previous = head;
10cc21: c7 05 4c 53 12 00 44 movl $0x125344,0x12534c
10cc28: 53 12 00
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
10cc2b: 85 f6 test %esi,%esi
10cc2d: 74 53 je 10cc82 <_User_extensions_Handler_initialization+0xaa><== NEVER TAKEN
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
10cc2f: 6b c8 34 imul $0x34,%eax,%ecx
10cc32: 83 ec 0c sub $0xc,%esp
10cc35: 51 push %ecx
10cc36: 89 4d e0 mov %ecx,-0x20(%ebp)
10cc39: e8 3d 04 00 00 call 10d07b <_Workspace_Allocate_or_fatal_error>
10cc3e: 89 c3 mov %eax,%ebx
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
10cc40: 31 c0 xor %eax,%eax
10cc42: 8b 4d e0 mov -0x20(%ebp),%ecx
10cc45: 89 df mov %ebx,%edi
10cc47: f3 aa rep stos %al,%es:(%edi)
10cc49: 89 f0 mov %esi,%eax
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
10cc4b: 83 c4 10 add $0x10,%esp
10cc4e: 31 d2 xor %edx,%edx
10cc50: eb 2b jmp 10cc7d <_User_extensions_Handler_initialization+0xa5>
RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table(
User_extensions_Control *extension,
const User_extensions_Table *extension_table
)
{
extension->Callouts = *extension_table;
10cc52: 8d 7b 14 lea 0x14(%ebx),%edi
10cc55: 89 c6 mov %eax,%esi
10cc57: b9 08 00 00 00 mov $0x8,%ecx
10cc5c: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
_User_extensions_Add_set( extension );
10cc5e: 83 ec 0c sub $0xc,%esp
10cc61: 53 push %ebx
10cc62: 89 45 dc mov %eax,-0x24(%ebp)
10cc65: 89 55 e0 mov %edx,-0x20(%ebp)
10cc68: e8 47 2f 00 00 call 10fbb4 <_User_extensions_Add_set>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
10cc6d: 83 c3 34 add $0x34,%ebx
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
10cc70: 8b 55 e0 mov -0x20(%ebp),%edx
10cc73: 42 inc %edx
10cc74: 8b 45 dc mov -0x24(%ebp),%eax
10cc77: 83 c0 20 add $0x20,%eax
10cc7a: 83 c4 10 add $0x10,%esp
10cc7d: 3b 55 e4 cmp -0x1c(%ebp),%edx
10cc80: 72 d0 jb 10cc52 <_User_extensions_Handler_initialization+0x7a>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
}
}
}
10cc82: 8d 65 f4 lea -0xc(%ebp),%esp
10cc85: 5b pop %ebx
10cc86: 5e pop %esi
10cc87: 5f pop %edi
10cc88: c9 leave
10cc89: c3 ret
0010e54c <_Watchdog_Adjust>:
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
10e54c: 55 push %ebp
10e54d: 89 e5 mov %esp,%ebp
10e54f: 57 push %edi
10e550: 56 push %esi
10e551: 53 push %ebx
10e552: 83 ec 1c sub $0x1c,%esp
10e555: 8b 75 08 mov 0x8(%ebp),%esi
10e558: 8b 7d 0c mov 0xc(%ebp),%edi
10e55b: 8b 5d 10 mov 0x10(%ebp),%ebx
ISR_Level level;
_ISR_Disable( level );
10e55e: 9c pushf
10e55f: fa cli
10e560: 58 pop %eax
}
}
_ISR_Enable( level );
}
10e561: 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 );
10e563: 8d 4e 04 lea 0x4(%esi),%ecx
* hence the compiler must not assume *header to remain
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
10e566: 39 ca cmp %ecx,%edx
10e568: 74 44 je 10e5ae <_Watchdog_Adjust+0x62>
switch ( direction ) {
10e56a: 85 ff test %edi,%edi
10e56c: 74 3c je 10e5aa <_Watchdog_Adjust+0x5e>
10e56e: 4f dec %edi
10e56f: 75 3d jne 10e5ae <_Watchdog_Adjust+0x62> <== NEVER TAKEN
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
10e571: 01 5a 10 add %ebx,0x10(%edx)
break;
10e574: eb 38 jmp 10e5ae <_Watchdog_Adjust+0x62>
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) _Chain_First( header ) );
10e576: 8b 16 mov (%esi),%edx
case WATCHDOG_FORWARD:
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
10e578: 8b 7a 10 mov 0x10(%edx),%edi
10e57b: 39 fb cmp %edi,%ebx
10e57d: 73 07 jae 10e586 <_Watchdog_Adjust+0x3a>
_Watchdog_First( header )->delta_interval -= units;
10e57f: 29 df sub %ebx,%edi
10e581: 89 7a 10 mov %edi,0x10(%edx)
break;
10e584: eb 28 jmp 10e5ae <_Watchdog_Adjust+0x62>
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
10e586: c7 42 10 01 00 00 00 movl $0x1,0x10(%edx)
_ISR_Enable( level );
10e58d: 50 push %eax
10e58e: 9d popf
_Watchdog_Tickle( header );
10e58f: 83 ec 0c sub $0xc,%esp
10e592: 56 push %esi
10e593: 89 4d e4 mov %ecx,-0x1c(%ebp)
10e596: e8 a5 01 00 00 call 10e740 <_Watchdog_Tickle>
_ISR_Disable( level );
10e59b: 9c pushf
10e59c: fa cli
10e59d: 58 pop %eax
if ( _Chain_Is_empty( header ) )
10e59e: 83 c4 10 add $0x10,%esp
10e5a1: 8b 4d e4 mov -0x1c(%ebp),%ecx
10e5a4: 39 0e cmp %ecx,(%esi)
10e5a6: 74 06 je 10e5ae <_Watchdog_Adjust+0x62>
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
10e5a8: 29 fb sub %edi,%ebx
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
10e5aa: 85 db test %ebx,%ebx
10e5ac: 75 c8 jne 10e576 <_Watchdog_Adjust+0x2a> <== ALWAYS TAKEN
}
break;
}
}
_ISR_Enable( level );
10e5ae: 50 push %eax
10e5af: 9d popf
}
10e5b0: 8d 65 f4 lea -0xc(%ebp),%esp
10e5b3: 5b pop %ebx
10e5b4: 5e pop %esi
10e5b5: 5f pop %edi
10e5b6: c9 leave
10e5b7: c3 ret
0010cf30 <_Watchdog_Remove>:
*/
Watchdog_States _Watchdog_Remove(
Watchdog_Control *the_watchdog
)
{
10cf30: 55 push %ebp
10cf31: 89 e5 mov %esp,%ebp
10cf33: 56 push %esi
10cf34: 53 push %ebx
10cf35: 8b 55 08 mov 0x8(%ebp),%edx
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
10cf38: 9c pushf
10cf39: fa cli
10cf3a: 5e pop %esi
previous_state = the_watchdog->state;
10cf3b: 8b 42 08 mov 0x8(%edx),%eax
switch ( previous_state ) {
10cf3e: 83 f8 01 cmp $0x1,%eax
10cf41: 74 09 je 10cf4c <_Watchdog_Remove+0x1c>
10cf43: 72 42 jb 10cf87 <_Watchdog_Remove+0x57>
10cf45: 83 f8 03 cmp $0x3,%eax
10cf48: 77 3d ja 10cf87 <_Watchdog_Remove+0x57> <== NEVER TAKEN
10cf4a: eb 09 jmp 10cf55 <_Watchdog_Remove+0x25>
/*
* 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;
10cf4c: c7 42 08 00 00 00 00 movl $0x0,0x8(%edx)
break;
10cf53: eb 32 jmp 10cf87 <_Watchdog_Remove+0x57>
case WATCHDOG_ACTIVE:
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
10cf55: 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 );
}
10cf5c: 8b 0a mov (%edx),%ecx
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
next_watchdog = _Watchdog_Next( the_watchdog );
if ( _Watchdog_Next(next_watchdog) )
10cf5e: 83 39 00 cmpl $0x0,(%ecx)
10cf61: 74 06 je 10cf69 <_Watchdog_Remove+0x39>
next_watchdog->delta_interval += the_watchdog->delta_interval;
10cf63: 8b 5a 10 mov 0x10(%edx),%ebx
10cf66: 01 59 10 add %ebx,0x10(%ecx)
if ( _Watchdog_Sync_count )
10cf69: 8b 1d 50 54 12 00 mov 0x125450,%ebx
10cf6f: 85 db test %ebx,%ebx
10cf71: 74 0c je 10cf7f <_Watchdog_Remove+0x4f>
_Watchdog_Sync_level = _ISR_Nest_level;
10cf73: 8b 1d 64 58 12 00 mov 0x125864,%ebx
10cf79: 89 1d e8 53 12 00 mov %ebx,0x1253e8
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
10cf7f: 8b 5a 04 mov 0x4(%edx),%ebx
next->previous = previous;
10cf82: 89 59 04 mov %ebx,0x4(%ecx)
previous->next = next;
10cf85: 89 0b mov %ecx,(%ebx)
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
10cf87: 8b 0d 54 54 12 00 mov 0x125454,%ecx
10cf8d: 89 4a 18 mov %ecx,0x18(%edx)
_ISR_Enable( level );
10cf90: 56 push %esi
10cf91: 9d popf
return( previous_state );
}
10cf92: 5b pop %ebx
10cf93: 5e pop %esi
10cf94: c9 leave
10cf95: c3 ret
0010e0bc <_Watchdog_Report_chain>:
void _Watchdog_Report_chain(
const char *name,
Chain_Control *header
)
{
10e0bc: 55 push %ebp
10e0bd: 89 e5 mov %esp,%ebp
10e0bf: 57 push %edi
10e0c0: 56 push %esi
10e0c1: 53 push %ebx
10e0c2: 83 ec 20 sub $0x20,%esp
10e0c5: 8b 7d 08 mov 0x8(%ebp),%edi
10e0c8: 8b 75 0c mov 0xc(%ebp),%esi
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
10e0cb: 9c pushf
10e0cc: fa cli
10e0cd: 8f 45 e4 popl -0x1c(%ebp)
printk( "Watchdog Chain: %s %p\n", name, header );
10e0d0: 56 push %esi
10e0d1: 57 push %edi
10e0d2: 68 9c 18 12 00 push $0x12189c
10e0d7: e8 50 aa ff ff call 108b2c <printk>
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
}
10e0dc: 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 );
10e0de: 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 ) ) {
10e0e1: 83 c4 10 add $0x10,%esp
10e0e4: 39 f3 cmp %esi,%ebx
10e0e6: 74 1d je 10e105 <_Watchdog_Report_chain+0x49>
node != _Chain_Tail(header) ;
node = node->next )
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
10e0e8: 52 push %edx
10e0e9: 52 push %edx
10e0ea: 53 push %ebx
10e0eb: 6a 00 push $0x0
10e0ed: e8 32 00 00 00 call 10e124 <_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 )
10e0f2: 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 ) ;
10e0f4: 83 c4 10 add $0x10,%esp
10e0f7: 39 f3 cmp %esi,%ebx
10e0f9: 75 ed jne 10e0e8 <_Watchdog_Report_chain+0x2c><== NEVER TAKEN
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
10e0fb: 50 push %eax
10e0fc: 50 push %eax
10e0fd: 57 push %edi
10e0fe: 68 b3 18 12 00 push $0x1218b3
10e103: eb 08 jmp 10e10d <_Watchdog_Report_chain+0x51>
} else {
printk( "Chain is empty\n" );
10e105: 83 ec 0c sub $0xc,%esp
10e108: 68 c2 18 12 00 push $0x1218c2
10e10d: e8 1a aa ff ff call 108b2c <printk>
10e112: 83 c4 10 add $0x10,%esp
}
_ISR_Enable( level );
10e115: ff 75 e4 pushl -0x1c(%ebp)
10e118: 9d popf
}
10e119: 8d 65 f4 lea -0xc(%ebp),%esp
10e11c: 5b pop %ebx
10e11d: 5e pop %esi
10e11e: 5f pop %edi
10e11f: c9 leave
10e120: c3 ret
0010b21c <_rename_r>:
int _rename_r(
struct _reent *ptr __attribute__((unused)),
const char *old,
const char *new
)
{
10b21c: 55 push %ebp
10b21d: 89 e5 mov %esp,%ebp
10b21f: 57 push %edi
10b220: 56 push %esi
10b221: 53 push %ebx
10b222: 83 ec 78 sub $0x78,%esp
/*
* Get the parent node of the old path to be renamed. Find the parent path.
*/
old_parent_pathlen = rtems_filesystem_dirname ( old );
10b225: ff 75 0c pushl 0xc(%ebp)
10b228: e8 3a ed ff ff call 109f67 <rtems_filesystem_dirname>
10b22d: 89 45 94 mov %eax,-0x6c(%ebp)
if ( old_parent_pathlen == 0 )
10b230: 83 c4 10 add $0x10,%esp
10b233: 85 c0 test %eax,%eax
10b235: 8d 45 b8 lea -0x48(%ebp),%eax
10b238: 75 15 jne 10b24f <_rename_r+0x33>
rtems_filesystem_get_start_loc( old, &i, &old_parent_loc );
10b23a: 51 push %ecx
10b23b: 50 push %eax
10b23c: 8d 45 e4 lea -0x1c(%ebp),%eax
10b23f: 50 push %eax
10b240: ff 75 0c pushl 0xc(%ebp)
10b243: e8 48 03 00 00 call 10b590 <rtems_filesystem_get_start_loc>
10b248: 83 c4 10 add $0x10,%esp
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;
10b24b: 31 db xor %ebx,%ebx
10b24d: eb 23 jmp 10b272 <_rename_r+0x56>
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,
10b24f: 83 ec 0c sub $0xc,%esp
10b252: 6a 00 push $0x0
10b254: 50 push %eax
10b255: 6a 02 push $0x2
10b257: ff 75 94 pushl -0x6c(%ebp)
10b25a: ff 75 0c pushl 0xc(%ebp)
10b25d: e8 c4 ec ff ff call 109f26 <rtems_filesystem_evaluate_path>
RTEMS_LIBIO_PERMS_WRITE,
&old_parent_loc,
false );
if ( result != 0 )
10b262: 83 c4 20 add $0x20,%esp
return -1;
10b265: 83 cf ff or $0xffffffff,%edi
else {
result = rtems_filesystem_evaluate_path( old, old_parent_pathlen,
RTEMS_LIBIO_PERMS_WRITE,
&old_parent_loc,
false );
if ( result != 0 )
10b268: 85 c0 test %eax,%eax
10b26a: 0f 85 50 01 00 00 jne 10b3c0 <_rename_r+0x1a4> <== NEVER TAKEN
return -1;
free_old_parentloc = true;
10b270: b3 01 mov $0x1,%bl
/*
* Start from the parent to find the node that should be under it.
*/
old_loc = old_parent_loc;
10b272: 8d 7d cc lea -0x34(%ebp),%edi
10b275: 8d 75 b8 lea -0x48(%ebp),%esi
10b278: b9 05 00 00 00 mov $0x5,%ecx
10b27d: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
name = old + old_parent_pathlen;
10b27f: 8b 75 0c mov 0xc(%ebp),%esi
10b282: 03 75 94 add -0x6c(%ebp),%esi
10b285: 89 75 e0 mov %esi,-0x20(%ebp)
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
10b288: 83 c9 ff or $0xffffffff,%ecx
10b28b: 89 f7 mov %esi,%edi
10b28d: 31 c0 xor %eax,%eax
10b28f: f2 ae repnz scas %es:(%edi),%al
10b291: f7 d1 not %ecx
10b293: 49 dec %ecx
10b294: 52 push %edx
10b295: 52 push %edx
10b296: 51 push %ecx
10b297: 56 push %esi
10b298: e8 09 ed ff ff call 109fa6 <rtems_filesystem_prefix_separators>
10b29d: 01 c6 add %eax,%esi
10b29f: 89 75 e0 mov %esi,-0x20(%ebp)
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
10b2a2: 83 c9 ff or $0xffffffff,%ecx
10b2a5: 89 f7 mov %esi,%edi
10b2a7: 31 c0 xor %eax,%eax
10b2a9: f2 ae repnz scas %es:(%edi),%al
10b2ab: f7 d1 not %ecx
10b2ad: 49 dec %ecx
10b2ae: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10b2b5: 8d 7d cc lea -0x34(%ebp),%edi
10b2b8: 57 push %edi
10b2b9: 6a 00 push $0x0
10b2bb: 51 push %ecx
10b2bc: 56 push %esi
10b2bd: e8 06 ec ff ff call 109ec8 <rtems_filesystem_evaluate_relative_path>
0, &old_loc, false );
if ( result != 0 ) {
10b2c2: 83 c4 20 add $0x20,%esp
10b2c5: 85 c0 test %eax,%eax
10b2c7: 74 16 je 10b2df <_rename_r+0xc3>
if ( free_old_parentloc )
rtems_filesystem_freenode( &old_parent_loc );
return -1;
10b2c9: 83 cf ff or $0xffffffff,%edi
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 )
10b2cc: 84 db test %bl,%bl
10b2ce: 0f 84 ec 00 00 00 je 10b3c0 <_rename_r+0x1a4> <== NEVER TAKEN
rtems_filesystem_freenode( &old_parent_loc );
10b2d4: 83 ec 0c sub $0xc,%esp
10b2d7: 8d 45 b8 lea -0x48(%ebp),%eax
10b2da: e9 d8 00 00 00 jmp 10b3b7 <_rename_r+0x19b>
/*
* Get the parent of the new node we are renaming to.
*/
rtems_filesystem_get_start_loc( new, &i, &new_parent_loc );
10b2df: 50 push %eax
10b2e0: 8d 75 a4 lea -0x5c(%ebp),%esi
10b2e3: 56 push %esi
10b2e4: 8d 45 e4 lea -0x1c(%ebp),%eax
10b2e7: 50 push %eax
10b2e8: ff 75 10 pushl 0x10(%ebp)
10b2eb: e8 a0 02 00 00 call 10b590 <rtems_filesystem_get_start_loc>
result = (*new_parent_loc.ops->evalformake_h)( &new[i], &new_parent_loc, &name );
10b2f0: 83 c4 0c add $0xc,%esp
10b2f3: 8d 45 e0 lea -0x20(%ebp),%eax
10b2f6: 50 push %eax
10b2f7: 56 push %esi
10b2f8: 8b 45 10 mov 0x10(%ebp),%eax
10b2fb: 03 45 e4 add -0x1c(%ebp),%eax
10b2fe: 50 push %eax
10b2ff: 8b 45 b0 mov -0x50(%ebp),%eax
10b302: ff 50 04 call *0x4(%eax)
if ( result != 0 ) {
10b305: 83 c4 10 add $0x10,%esp
10b308: 85 c0 test %eax,%eax
10b30a: 74 2d je 10b339 <_rename_r+0x11d>
rtems_filesystem_freenode( &new_parent_loc );
10b30c: 83 ec 0c sub $0xc,%esp
10b30f: 56 push %esi
10b310: e8 1f ee ff ff call 10a134 <rtems_filesystem_freenode>
if ( free_old_parentloc )
10b315: 83 c4 10 add $0x10,%esp
10b318: 84 db test %bl,%bl
10b31a: 74 0f je 10b32b <_rename_r+0x10f> <== NEVER TAKEN
rtems_filesystem_freenode( &old_parent_loc );
10b31c: 83 ec 0c sub $0xc,%esp
10b31f: 8d 45 b8 lea -0x48(%ebp),%eax
10b322: 50 push %eax
10b323: e8 0c ee ff ff call 10a134 <rtems_filesystem_freenode>
10b328: 83 c4 10 add $0x10,%esp
rtems_filesystem_freenode( &old_loc );
10b32b: 83 ec 0c sub $0xc,%esp
10b32e: 8d 45 cc lea -0x34(%ebp),%eax
10b331: 50 push %eax
10b332: e8 fd ed ff ff call 10a134 <rtems_filesystem_freenode>
10b337: eb 3e jmp 10b377 <_rename_r+0x15b>
/*
* 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 ) {
10b339: 8b 45 b4 mov -0x4c(%ebp),%eax
10b33c: 39 45 c8 cmp %eax,-0x38(%ebp)
10b33f: 74 3e je 10b37f <_rename_r+0x163>
rtems_filesystem_freenode( &new_parent_loc );
10b341: 83 ec 0c sub $0xc,%esp
10b344: 56 push %esi
10b345: e8 ea ed ff ff call 10a134 <rtems_filesystem_freenode>
if ( free_old_parentloc )
10b34a: 83 c4 10 add $0x10,%esp
10b34d: 84 db test %bl,%bl
10b34f: 74 0f je 10b360 <_rename_r+0x144>
rtems_filesystem_freenode( &old_parent_loc );
10b351: 83 ec 0c sub $0xc,%esp
10b354: 8d 45 b8 lea -0x48(%ebp),%eax
10b357: 50 push %eax
10b358: e8 d7 ed ff ff call 10a134 <rtems_filesystem_freenode>
10b35d: 83 c4 10 add $0x10,%esp
rtems_filesystem_freenode( &old_loc );
10b360: 83 ec 0c sub $0xc,%esp
10b363: 8d 45 cc lea -0x34(%ebp),%eax
10b366: 50 push %eax
10b367: e8 c8 ed ff ff call 10a134 <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( EXDEV );
10b36c: e8 5f 95 00 00 call 1148d0 <__errno>
10b371: c7 00 12 00 00 00 movl $0x12,(%eax)
10b377: 83 c4 10 add $0x10,%esp
10b37a: 83 cf ff or $0xffffffff,%edi
10b37d: eb 41 jmp 10b3c0 <_rename_r+0x1a4>
}
result = (*new_parent_loc.ops->rename_h)( &old_parent_loc, &old_loc, &new_parent_loc, name );
10b37f: ff 75 e0 pushl -0x20(%ebp)
10b382: 56 push %esi
10b383: 57 push %edi
10b384: 8d 55 b8 lea -0x48(%ebp),%edx
10b387: 52 push %edx
10b388: 8b 45 b0 mov -0x50(%ebp),%eax
10b38b: 89 55 90 mov %edx,-0x70(%ebp)
10b38e: ff 50 40 call *0x40(%eax)
10b391: 89 c7 mov %eax,%edi
rtems_filesystem_freenode( &new_parent_loc );
10b393: 89 34 24 mov %esi,(%esp)
10b396: e8 99 ed ff ff call 10a134 <rtems_filesystem_freenode>
if ( free_old_parentloc )
10b39b: 83 c4 10 add $0x10,%esp
10b39e: 84 db test %bl,%bl
10b3a0: 8b 55 90 mov -0x70(%ebp),%edx
10b3a3: 74 0c je 10b3b1 <_rename_r+0x195>
rtems_filesystem_freenode( &old_parent_loc );
10b3a5: 83 ec 0c sub $0xc,%esp
10b3a8: 52 push %edx
10b3a9: e8 86 ed ff ff call 10a134 <rtems_filesystem_freenode>
10b3ae: 83 c4 10 add $0x10,%esp
rtems_filesystem_freenode( &old_loc );
10b3b1: 83 ec 0c sub $0xc,%esp
10b3b4: 8d 45 cc lea -0x34(%ebp),%eax
10b3b7: 50 push %eax
10b3b8: e8 77 ed ff ff call 10a134 <rtems_filesystem_freenode>
return result;
10b3bd: 83 c4 10 add $0x10,%esp
}
10b3c0: 89 f8 mov %edi,%eax
10b3c2: 8d 65 f4 lea -0xc(%ebp),%esp
10b3c5: 5b pop %ebx
10b3c6: 5e pop %esi
10b3c7: 5f pop %edi
10b3c8: c9 leave
10b3c9: c3 ret
0010a818 <aio_cancel>:
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
10a818: 55 push %ebp
10a819: 89 e5 mov %esp,%ebp
10a81b: 57 push %edi
10a81c: 56 push %esi
10a81d: 53 push %ebx
10a81e: 83 ec 18 sub $0x18,%esp
10a821: 8b 75 08 mov 0x8(%ebp),%esi
10a824: 8b 5d 0c mov 0xc(%ebp),%ebx
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
10a827: 68 d8 72 12 00 push $0x1272d8
10a82c: e8 2f 10 00 00 call 10b860 <pthread_mutex_lock>
if (fcntl (fildes, F_GETFD) < 0) {
10a831: 5f pop %edi
10a832: 58 pop %eax
10a833: 6a 01 push $0x1
10a835: 56 push %esi
10a836: e8 f1 60 00 00 call 11092c <fcntl>
10a83b: 83 c4 10 add $0x10,%esp
10a83e: 85 c0 test %eax,%eax
10a840: 79 1d jns 10a85f <aio_cancel+0x47>
pthread_mutex_unlock(&aio_request_queue.mutex);
10a842: 83 ec 0c sub $0xc,%esp
10a845: 68 d8 72 12 00 push $0x1272d8
10a84a: e8 91 10 00 00 call 10b8e0 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EBADF);
10a84f: e8 94 8e 00 00 call 1136e8 <__errno>
10a854: c7 00 09 00 00 00 movl $0x9,(%eax)
10a85a: e9 e3 00 00 00 jmp 10a942 <aio_cancel+0x12a>
}
/* if aiocbp is NULL remove all request for given file descriptor */
if (aiocbp == NULL) {
10a85f: 85 db test %ebx,%ebx
10a861: 0f 85 bd 00 00 00 jne 10a924 <aio_cancel+0x10c>
AIO_printf ("Cancel all requests\n");
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
10a867: 51 push %ecx
10a868: 6a 00 push $0x0
10a86a: 56 push %esi
10a86b: 68 20 73 12 00 push $0x127320
10a870: e8 27 03 00 00 call 10ab9c <rtems_aio_search_fd>
10a875: 89 c3 mov %eax,%ebx
if (r_chain == NULL) {
10a877: 83 c4 10 add $0x10,%esp
10a87a: 85 c0 test %eax,%eax
10a87c: 75 6c jne 10a8ea <aio_cancel+0xd2>
AIO_printf ("Request chain not on [WQ]\n");
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
10a87e: 81 3d 2c 73 12 00 30 cmpl $0x127330,0x12732c
10a885: 73 12 00
10a888: 0f 84 07 01 00 00 je 10a995 <aio_cancel+0x17d> <== NEVER TAKEN
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
10a88e: 52 push %edx
10a88f: 6a 00 push $0x0
10a891: 56 push %esi
10a892: 68 2c 73 12 00 push $0x12732c
10a897: e8 00 03 00 00 call 10ab9c <rtems_aio_search_fd>
10a89c: 89 c3 mov %eax,%ebx
if (r_chain == NULL) {
10a89e: 83 c4 10 add $0x10,%esp
10a8a1: 85 c0 test %eax,%eax
10a8a3: 75 17 jne 10a8bc <aio_cancel+0xa4>
pthread_mutex_unlock(&aio_request_queue.mutex);
10a8a5: 83 ec 0c sub $0xc,%esp
10a8a8: 68 d8 72 12 00 push $0x1272d8
10a8ad: e8 2e 10 00 00 call 10b8e0 <pthread_mutex_unlock>
return AIO_ALLDONE;
10a8b2: 83 c4 10 add $0x10,%esp
10a8b5: b3 02 mov $0x2,%bl
10a8b7: e9 21 01 00 00 jmp 10a9dd <aio_cancel+0x1c5>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
10a8bc: 83 ec 0c sub $0xc,%esp
10a8bf: 50 push %eax
10a8c0: e8 fb 26 00 00 call 10cfc0 <_Chain_Extract>
}
AIO_printf ("Request chain on [IQ]\n");
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
10a8c5: 89 1c 24 mov %ebx,(%esp)
10a8c8: e8 12 06 00 00 call 10aedf <rtems_aio_remove_fd>
pthread_mutex_destroy (&r_chain->mutex);
10a8cd: 8d 73 1c lea 0x1c(%ebx),%esi
10a8d0: 89 34 24 mov %esi,(%esp)
10a8d3: e8 68 0d 00 00 call 10b640 <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->mutex);
10a8d8: 89 34 24 mov %esi,(%esp)
10a8db: e8 6c 0a 00 00 call 10b34c <pthread_cond_destroy>
free (r_chain);
10a8e0: 89 1c 24 mov %ebx,(%esp)
10a8e3: e8 88 d4 ff ff call 107d70 <free>
10a8e8: eb 24 jmp 10a90e <aio_cancel+0xf6>
return AIO_ALLDONE;
}
AIO_printf ("Request chain on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
10a8ea: 8d 70 1c lea 0x1c(%eax),%esi
10a8ed: 83 ec 0c sub $0xc,%esp
10a8f0: 56 push %esi
10a8f1: e8 6a 0f 00 00 call 10b860 <pthread_mutex_lock>
10a8f6: 89 1c 24 mov %ebx,(%esp)
10a8f9: e8 c2 26 00 00 call 10cfc0 <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
10a8fe: 89 1c 24 mov %ebx,(%esp)
10a901: e8 d9 05 00 00 call 10aedf <rtems_aio_remove_fd>
pthread_mutex_unlock (&r_chain->mutex);
10a906: 89 34 24 mov %esi,(%esp)
10a909: e8 d2 0f 00 00 call 10b8e0 <pthread_mutex_unlock>
pthread_mutex_unlock (&aio_request_queue.mutex);
10a90e: c7 04 24 d8 72 12 00 movl $0x1272d8,(%esp)
10a915: e8 c6 0f 00 00 call 10b8e0 <pthread_mutex_unlock>
return AIO_CANCELED;
10a91a: 83 c4 10 add $0x10,%esp
10a91d: 31 db xor %ebx,%ebx
10a91f: e9 b9 00 00 00 jmp 10a9dd <aio_cancel+0x1c5>
} else {
AIO_printf ("Cancel request\n");
if (aiocbp->aio_fildes != fildes) {
10a924: 8b 3b mov (%ebx),%edi
10a926: 39 f7 cmp %esi,%edi
10a928: 74 23 je 10a94d <aio_cancel+0x135>
pthread_mutex_unlock (&aio_request_queue.mutex);
10a92a: 83 ec 0c sub $0xc,%esp
10a92d: 68 d8 72 12 00 push $0x1272d8
10a932: e8 a9 0f 00 00 call 10b8e0 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EINVAL);
10a937: e8 ac 8d 00 00 call 1136e8 <__errno>
10a93c: c7 00 16 00 00 00 movl $0x16,(%eax)
10a942: 83 c4 10 add $0x10,%esp
10a945: 83 cb ff or $0xffffffff,%ebx
10a948: e9 90 00 00 00 jmp 10a9dd <aio_cancel+0x1c5>
}
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
10a94d: 50 push %eax
10a94e: 6a 00 push $0x0
10a950: 57 push %edi
10a951: 68 20 73 12 00 push $0x127320
10a956: e8 41 02 00 00 call 10ab9c <rtems_aio_search_fd>
10a95b: 89 c6 mov %eax,%esi
if (r_chain == NULL) {
10a95d: 83 c4 10 add $0x10,%esp
10a960: 85 c0 test %eax,%eax
10a962: 75 48 jne 10a9ac <aio_cancel+0x194>
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
10a964: 81 3d 2c 73 12 00 30 cmpl $0x127330,0x12732c
10a96b: 73 12 00
10a96e: 74 25 je 10a995 <aio_cancel+0x17d> <== NEVER TAKEN
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
10a970: 56 push %esi
10a971: 6a 00 push $0x0
10a973: 57 push %edi
10a974: 68 2c 73 12 00 push $0x12732c
10a979: e8 1e 02 00 00 call 10ab9c <rtems_aio_search_fd>
if (r_chain == NULL) {
10a97e: 83 c4 10 add $0x10,%esp
10a981: 85 c0 test %eax,%eax
10a983: 74 a5 je 10a92a <aio_cancel+0x112>
rtems_set_errno_and_return_minus_one (EINVAL);
}
AIO_printf ("Request on [IQ]\n");
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
10a985: 51 push %ecx
10a986: 51 push %ecx
10a987: 53 push %ebx
10a988: 83 c0 08 add $0x8,%eax
10a98b: 50 push %eax
10a98c: e8 97 05 00 00 call 10af28 <rtems_aio_remove_req>
10a991: 89 c3 mov %eax,%ebx
10a993: eb 39 jmp 10a9ce <aio_cancel+0x1b6>
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
} else {
pthread_mutex_unlock (&aio_request_queue.mutex);
10a995: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10a998: 68 d8 72 12 00 push $0x1272d8 <== NOT EXECUTED
10a99d: e8 3e 0f 00 00 call 10b8e0 <pthread_mutex_unlock> <== NOT EXECUTED
return AIO_ALLDONE;
10a9a2: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10a9a5: bb 02 00 00 00 mov $0x2,%ebx <== NOT EXECUTED
10a9aa: eb 31 jmp 10a9dd <aio_cancel+0x1c5> <== NOT EXECUTED
}
}
AIO_printf ("Request on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
10a9ac: 8d 78 1c lea 0x1c(%eax),%edi
10a9af: 83 ec 0c sub $0xc,%esp
10a9b2: 57 push %edi
10a9b3: e8 a8 0e 00 00 call 10b860 <pthread_mutex_lock>
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
10a9b8: 58 pop %eax
10a9b9: 5a pop %edx
10a9ba: 53 push %ebx
10a9bb: 83 c6 08 add $0x8,%esi
10a9be: 56 push %esi
10a9bf: e8 64 05 00 00 call 10af28 <rtems_aio_remove_req>
10a9c4: 89 c3 mov %eax,%ebx
pthread_mutex_unlock (&r_chain->mutex);
10a9c6: 89 3c 24 mov %edi,(%esp)
10a9c9: e8 12 0f 00 00 call 10b8e0 <pthread_mutex_unlock>
pthread_mutex_unlock (&aio_request_queue.mutex);
10a9ce: c7 04 24 d8 72 12 00 movl $0x1272d8,(%esp)
10a9d5: e8 06 0f 00 00 call 10b8e0 <pthread_mutex_unlock>
return result;
10a9da: 83 c4 10 add $0x10,%esp
}
return AIO_ALLDONE;
}
10a9dd: 89 d8 mov %ebx,%eax
10a9df: 8d 65 f4 lea -0xc(%ebp),%esp
10a9e2: 5b pop %ebx
10a9e3: 5e pop %esi
10a9e4: 5f pop %edi
10a9e5: c9 leave
10a9e6: c3 ret
0010a9f4 <aio_fsync>:
int aio_fsync(
int op,
struct aiocb *aiocbp
)
{
10a9f4: 55 push %ebp
10a9f5: 89 e5 mov %esp,%ebp
10a9f7: 53 push %ebx
10a9f8: 83 ec 04 sub $0x4,%esp
10a9fb: 8b 5d 0c mov 0xc(%ebp),%ebx
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
10a9fe: 81 7d 08 00 20 00 00 cmpl $0x2000,0x8(%ebp)
10aa05: 74 1b je 10aa22 <aio_fsync+0x2e>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
10aa07: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx)
10aa0e: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10aa15: e8 ce 8c 00 00 call 1136e8 <__errno>
10aa1a: c7 00 16 00 00 00 movl $0x16,(%eax)
10aa20: eb 74 jmp 10aa96 <aio_fsync+0xa2>
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
10aa22: 50 push %eax
10aa23: 50 push %eax
10aa24: 6a 03 push $0x3
10aa26: ff 33 pushl (%ebx)
10aa28: e8 ff 5e 00 00 call 11092c <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
10aa2d: 83 e0 03 and $0x3,%eax
10aa30: 48 dec %eax
10aa31: 83 c4 10 add $0x10,%esp
10aa34: 83 f8 01 cmp $0x1,%eax
10aa37: 76 1b jbe 10aa54 <aio_fsync+0x60>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
10aa39: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx)
10aa40: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10aa47: e8 9c 8c 00 00 call 1136e8 <__errno>
10aa4c: c7 00 09 00 00 00 movl $0x9,(%eax)
10aa52: eb 42 jmp 10aa96 <aio_fsync+0xa2>
req = malloc (sizeof (rtems_aio_request));
10aa54: 83 ec 0c sub $0xc,%esp
10aa57: 6a 18 push $0x18
10aa59: e8 96 d7 ff ff call 1081f4 <malloc>
if (req == NULL)
10aa5e: 83 c4 10 add $0x10,%esp
10aa61: 85 c0 test %eax,%eax
10aa63: 75 1b jne 10aa80 <aio_fsync+0x8c> <== ALWAYS TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
10aa65: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED
10aa6c: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED
10aa73: e8 70 8c 00 00 call 1136e8 <__errno> <== NOT EXECUTED
10aa78: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED
10aa7e: eb 16 jmp 10aa96 <aio_fsync+0xa2> <== NOT EXECUTED
req->aiocbp = aiocbp;
10aa80: 89 58 14 mov %ebx,0x14(%eax)
req->aiocbp->aio_lio_opcode = LIO_SYNC;
10aa83: c7 43 2c 03 00 00 00 movl $0x3,0x2c(%ebx)
return rtems_aio_enqueue (req);
10aa8a: 89 45 08 mov %eax,0x8(%ebp)
}
10aa8d: 8b 5d fc mov -0x4(%ebp),%ebx
10aa90: 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);
10aa91: e9 ef 04 00 00 jmp 10af85 <rtems_aio_enqueue>
}
10aa96: 83 c8 ff or $0xffffffff,%eax
10aa99: 8b 5d fc mov -0x4(%ebp),%ebx
10aa9c: c9 leave
10aa9d: c3 ret
0010b188 <aio_read>:
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
10b188: 55 push %ebp
10b189: 89 e5 mov %esp,%ebp
10b18b: 53 push %ebx
10b18c: 83 ec 0c sub $0xc,%esp
10b18f: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
10b192: 6a 03 push $0x3
10b194: ff 33 pushl (%ebx)
10b196: e8 91 57 00 00 call 11092c <fcntl>
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
10b19b: 83 e0 03 and $0x3,%eax
10b19e: 83 c4 10 add $0x10,%esp
10b1a1: 83 f8 02 cmp $0x2,%eax
10b1a4: 74 1f je 10b1c5 <aio_read+0x3d>
10b1a6: 85 c0 test %eax,%eax
10b1a8: 74 1b je 10b1c5 <aio_read+0x3d> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
10b1aa: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx)
10b1b1: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10b1b8: e8 2b 85 00 00 call 1136e8 <__errno>
10b1bd: c7 00 09 00 00 00 movl $0x9,(%eax)
10b1c3: eb 69 jmp 10b22e <aio_read+0xa6>
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
10b1c5: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
10b1c9: 75 06 jne 10b1d1 <aio_read+0x49>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
10b1cb: 83 7b 08 00 cmpl $0x0,0x8(%ebx)
10b1cf: 79 1b jns 10b1ec <aio_read+0x64>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
10b1d1: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx)
10b1d8: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10b1df: e8 04 85 00 00 call 1136e8 <__errno>
10b1e4: c7 00 16 00 00 00 movl $0x16,(%eax)
10b1ea: eb 42 jmp 10b22e <aio_read+0xa6>
req = malloc (sizeof (rtems_aio_request));
10b1ec: 83 ec 0c sub $0xc,%esp
10b1ef: 6a 18 push $0x18
10b1f1: e8 fe cf ff ff call 1081f4 <malloc>
if (req == NULL)
10b1f6: 83 c4 10 add $0x10,%esp
10b1f9: 85 c0 test %eax,%eax
10b1fb: 75 1b jne 10b218 <aio_read+0x90> <== ALWAYS TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
10b1fd: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED
10b204: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED
10b20b: e8 d8 84 00 00 call 1136e8 <__errno> <== NOT EXECUTED
10b210: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED
10b216: eb 16 jmp 10b22e <aio_read+0xa6> <== NOT EXECUTED
req->aiocbp = aiocbp;
10b218: 89 58 14 mov %ebx,0x14(%eax)
req->aiocbp->aio_lio_opcode = LIO_READ;
10b21b: c7 43 2c 01 00 00 00 movl $0x1,0x2c(%ebx)
return rtems_aio_enqueue (req);
10b222: 89 45 08 mov %eax,0x8(%ebp)
}
10b225: 8b 5d fc mov -0x4(%ebp),%ebx
10b228: 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);
10b229: e9 57 fd ff ff jmp 10af85 <rtems_aio_enqueue>
}
10b22e: 83 c8 ff or $0xffffffff,%eax
10b231: 8b 5d fc mov -0x4(%ebp),%ebx
10b234: c9 leave
10b235: c3 ret
0010b244 <aio_write>:
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
10b244: 55 push %ebp
10b245: 89 e5 mov %esp,%ebp
10b247: 53 push %ebx
10b248: 83 ec 0c sub $0xc,%esp
10b24b: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
10b24e: 6a 03 push $0x3
10b250: ff 33 pushl (%ebx)
10b252: e8 d5 56 00 00 call 11092c <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
10b257: 83 e0 03 and $0x3,%eax
10b25a: 48 dec %eax
10b25b: 83 c4 10 add $0x10,%esp
10b25e: 83 f8 01 cmp $0x1,%eax
10b261: 76 1b jbe 10b27e <aio_write+0x3a>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
10b263: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx)
10b26a: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10b271: e8 72 84 00 00 call 1136e8 <__errno>
10b276: c7 00 09 00 00 00 movl $0x9,(%eax)
10b27c: eb 69 jmp 10b2e7 <aio_write+0xa3>
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
10b27e: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
10b282: 75 06 jne 10b28a <aio_write+0x46>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
10b284: 83 7b 08 00 cmpl $0x0,0x8(%ebx)
10b288: 79 1b jns 10b2a5 <aio_write+0x61>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
10b28a: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx)
10b291: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10b298: e8 4b 84 00 00 call 1136e8 <__errno>
10b29d: c7 00 16 00 00 00 movl $0x16,(%eax)
10b2a3: eb 42 jmp 10b2e7 <aio_write+0xa3>
req = malloc (sizeof (rtems_aio_request));
10b2a5: 83 ec 0c sub $0xc,%esp
10b2a8: 6a 18 push $0x18
10b2aa: e8 45 cf ff ff call 1081f4 <malloc>
if (req == NULL)
10b2af: 83 c4 10 add $0x10,%esp
10b2b2: 85 c0 test %eax,%eax
10b2b4: 75 1b jne 10b2d1 <aio_write+0x8d> <== ALWAYS TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
10b2b6: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED
10b2bd: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED
10b2c4: e8 1f 84 00 00 call 1136e8 <__errno> <== NOT EXECUTED
10b2c9: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED
10b2cf: eb 16 jmp 10b2e7 <aio_write+0xa3> <== NOT EXECUTED
req->aiocbp = aiocbp;
10b2d1: 89 58 14 mov %ebx,0x14(%eax)
req->aiocbp->aio_lio_opcode = LIO_WRITE;
10b2d4: c7 43 2c 02 00 00 00 movl $0x2,0x2c(%ebx)
return rtems_aio_enqueue (req);
10b2db: 89 45 08 mov %eax,0x8(%ebp)
}
10b2de: 8b 5d fc mov -0x4(%ebp),%ebx
10b2e1: 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);
10b2e2: e9 9e fc ff ff jmp 10af85 <rtems_aio_enqueue>
}
10b2e7: 83 c8 ff or $0xffffffff,%eax
10b2ea: 8b 5d fc mov -0x4(%ebp),%ebx
10b2ed: c9 leave
10b2ee: c3 ret
00107548 <chroot>:
#include <rtems/seterr.h>
int chroot(
const char *pathname
)
{
107548: 55 push %ebp
107549: 89 e5 mov %esp,%ebp
10754b: 57 push %edi
10754c: 56 push %esi
10754d: 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) {
107550: 81 3d 6c 30 12 00 48 cmpl $0x125248,0x12306c
107557: 52 12 00
10755a: 75 1e jne 10757a <chroot+0x32>
rtems_libio_set_private_env(); /* try to set a new private env*/
10755c: e8 f0 10 00 00 call 108651 <rtems_libio_set_private_env>
if (rtems_current_user_env == &rtems_global_user_env) /* not ok */
107561: 81 3d 6c 30 12 00 48 cmpl $0x125248,0x12306c
107568: 52 12 00
10756b: 75 0d jne 10757a <chroot+0x32>
rtems_set_errno_and_return_minus_one( ENOTSUP );
10756d: e8 8e a3 00 00 call 111900 <__errno>
107572: c7 00 86 00 00 00 movl $0x86,(%eax)
107578: eb 22 jmp 10759c <chroot+0x54>
}
result = chdir(pathname);
10757a: 83 ec 0c sub $0xc,%esp
10757d: ff 75 08 pushl 0x8(%ebp)
107580: e8 b7 74 00 00 call 10ea3c <chdir>
if (result) {
107585: 83 c4 10 add $0x10,%esp
107588: 85 c0 test %eax,%eax
10758a: 74 15 je 1075a1 <chroot+0x59>
rtems_set_errno_and_return_minus_one( errno );
10758c: e8 6f a3 00 00 call 111900 <__errno>
107591: 89 c6 mov %eax,%esi
107593: e8 68 a3 00 00 call 111900 <__errno>
107598: 8b 00 mov (%eax),%eax
10759a: 89 06 mov %eax,(%esi)
10759c: 83 c8 ff or $0xffffffff,%eax
10759f: eb 44 jmp 1075e5 <chroot+0x9d>
}
/* clone the new root location */
if (rtems_filesystem_evaluate_path(".", 1, 0, &loc, 0)) {
1075a1: 83 ec 0c sub $0xc,%esp
1075a4: 6a 00 push $0x0
1075a6: 8d 75 e4 lea -0x1c(%ebp),%esi
1075a9: 56 push %esi
1075aa: 6a 00 push $0x0
1075ac: 6a 01 push $0x1
1075ae: 68 ea fc 11 00 push $0x11fcea
1075b3: e8 02 01 00 00 call 1076ba <rtems_filesystem_evaluate_path>
1075b8: 83 c4 20 add $0x20,%esp
1075bb: 85 c0 test %eax,%eax
1075bd: 75 cd jne 10758c <chroot+0x44> <== 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);
1075bf: 83 ec 0c sub $0xc,%esp
1075c2: a1 6c 30 12 00 mov 0x12306c,%eax
1075c7: 83 c0 18 add $0x18,%eax
1075ca: 50 push %eax
1075cb: e8 a8 01 00 00 call 107778 <rtems_filesystem_freenode>
rtems_filesystem_root = loc;
1075d0: 8b 3d 6c 30 12 00 mov 0x12306c,%edi
1075d6: 83 c7 18 add $0x18,%edi
1075d9: b9 05 00 00 00 mov $0x5,%ecx
1075de: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return 0;
1075e0: 83 c4 10 add $0x10,%esp
1075e3: 31 c0 xor %eax,%eax
}
1075e5: 8d 65 f8 lea -0x8(%ebp),%esp
1075e8: 5e pop %esi
1075e9: 5f pop %edi
1075ea: c9 leave
1075eb: c3 ret
00109fec <clock_gettime>:
int clock_gettime(
clockid_t clock_id,
struct timespec *tp
)
{
109fec: 55 push %ebp
109fed: 89 e5 mov %esp,%ebp
109fef: 83 ec 08 sub $0x8,%esp
109ff2: 8b 45 08 mov 0x8(%ebp),%eax
109ff5: 8b 55 0c mov 0xc(%ebp),%edx
if ( !tp )
109ff8: 85 d2 test %edx,%edx
109ffa: 74 3c je 10a038 <clock_gettime+0x4c>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
109ffc: 83 f8 01 cmp $0x1,%eax
109fff: 75 0b jne 10a00c <clock_gettime+0x20>
_TOD_Get(tp);
10a001: 83 ec 0c sub $0xc,%esp
10a004: 52 push %edx
10a005: e8 a6 1b 00 00 call 10bbb0 <_TOD_Get>
10a00a: eb 13 jmp 10a01f <clock_gettime+0x33>
return 0;
}
#ifdef CLOCK_MONOTONIC
if ( clock_id == CLOCK_MONOTONIC ) {
10a00c: 83 f8 04 cmp $0x4,%eax
10a00f: 74 05 je 10a016 <clock_gettime+0x2a> <== NEVER TAKEN
return 0;
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME ) {
10a011: 83 f8 02 cmp $0x2,%eax
10a014: 75 10 jne 10a026 <clock_gettime+0x3a>
_TOD_Get_uptime_as_timespec( tp );
10a016: 83 ec 0c sub $0xc,%esp
10a019: 52 push %edx
10a01a: e8 e5 1b 00 00 call 10bc04 <_TOD_Get_uptime_as_timespec>
return 0;
10a01f: 83 c4 10 add $0x10,%esp
10a022: 31 c0 xor %eax,%eax
10a024: eb 20 jmp 10a046 <clock_gettime+0x5a>
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME )
10a026: 83 f8 03 cmp $0x3,%eax
10a029: 75 0d jne 10a038 <clock_gettime+0x4c>
rtems_set_errno_and_return_minus_one( ENOSYS );
10a02b: e8 9c 7f 00 00 call 111fcc <__errno>
10a030: c7 00 58 00 00 00 movl $0x58,(%eax)
10a036: eb 0b jmp 10a043 <clock_gettime+0x57>
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
10a038: e8 8f 7f 00 00 call 111fcc <__errno>
10a03d: c7 00 16 00 00 00 movl $0x16,(%eax)
10a043: 83 c8 ff or $0xffffffff,%eax
return 0;
}
10a046: c9 leave
10a047: c3 ret
0010a048 <clock_settime>:
int clock_settime(
clockid_t clock_id,
const struct timespec *tp
)
{
10a048: 55 push %ebp
10a049: 89 e5 mov %esp,%ebp
10a04b: 83 ec 08 sub $0x8,%esp
10a04e: 8b 45 08 mov 0x8(%ebp),%eax
10a051: 8b 55 0c mov 0xc(%ebp),%edx
if ( !tp )
10a054: 85 d2 test %edx,%edx
10a056: 74 44 je 10a09c <clock_settime+0x54> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
10a058: 83 f8 01 cmp $0x1,%eax
10a05b: 75 28 jne 10a085 <clock_settime+0x3d>
if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 )
10a05d: 81 3a ff e4 da 21 cmpl $0x21dae4ff,(%edx)
10a063: 76 37 jbe 10a09c <clock_settime+0x54>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10a065: a1 a0 73 12 00 mov 0x1273a0,%eax
10a06a: 40 inc %eax
10a06b: a3 a0 73 12 00 mov %eax,0x1273a0
rtems_set_errno_and_return_minus_one( EINVAL );
_Thread_Disable_dispatch();
_TOD_Set( tp );
10a070: 83 ec 0c sub $0xc,%esp
10a073: 52 push %edx
10a074: e8 e3 1b 00 00 call 10bc5c <_TOD_Set>
_Thread_Enable_dispatch();
10a079: e8 38 2f 00 00 call 10cfb6 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
10a07e: 83 c4 10 add $0x10,%esp
10a081: 31 c0 xor %eax,%eax
10a083: eb 25 jmp 10a0aa <clock_settime+0x62>
_Thread_Disable_dispatch();
_TOD_Set( tp );
_Thread_Enable_dispatch();
}
#ifdef _POSIX_CPUTIME
else if ( clock_id == CLOCK_PROCESS_CPUTIME )
10a085: 83 f8 02 cmp $0x2,%eax
10a088: 74 05 je 10a08f <clock_settime+0x47>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME )
10a08a: 83 f8 03 cmp $0x3,%eax
10a08d: 75 0d jne 10a09c <clock_settime+0x54>
rtems_set_errno_and_return_minus_one( ENOSYS );
10a08f: e8 38 7f 00 00 call 111fcc <__errno>
10a094: c7 00 58 00 00 00 movl $0x58,(%eax)
10a09a: eb 0b jmp 10a0a7 <clock_settime+0x5f>
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
10a09c: e8 2b 7f 00 00 call 111fcc <__errno>
10a0a1: c7 00 16 00 00 00 movl $0x16,(%eax)
10a0a7: 83 c8 ff or $0xffffffff,%eax
return 0;
}
10a0aa: c9 leave
10a0ab: c3 ret
0010d4d0 <devFS_evaluate_path>:
const char *pathname,
size_t pathnamelen,
int flags,
rtems_filesystem_location_info_t *pathloc
)
{
10d4d0: 55 push %ebp
10d4d1: 89 e5 mov %esp,%ebp
10d4d3: 57 push %edi
10d4d4: 56 push %esi
10d4d5: 53 push %ebx
10d4d6: 83 ec 1c sub $0x1c,%esp
10d4d9: 8b 4d 0c mov 0xc(%ebp),%ecx
10d4dc: 8b 5d 14 mov 0x14(%ebp),%ebx
int i;
rtems_device_name_t *device_name_table;
/* see if 'flags' is valid */
if ( !rtems_libio_is_valid_perms( flags ) )
10d4df: f7 45 10 f8 ff ff ff testl $0xfffffff8,0x10(%ebp)
10d4e6: 74 0d je 10d4f5 <devFS_evaluate_path+0x25><== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EPERM );
10d4e8: e8 53 22 00 00 call 10f740 <__errno> <== NOT EXECUTED
10d4ed: c7 00 01 00 00 00 movl $0x1,(%eax) <== NOT EXECUTED
10d4f3: eb 77 jmp 10d56c <devFS_evaluate_path+0x9c><== NOT EXECUTED
/* get the device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
10d4f5: 8b 33 mov (%ebx),%esi
if (!device_name_table)
10d4f7: 85 f6 test %esi,%esi
10d4f9: 74 04 je 10d4ff <devFS_evaluate_path+0x2f>
10d4fb: 31 ff xor %edi,%edi
10d4fd: eb 5a jmp 10d559 <devFS_evaluate_path+0x89>
rtems_set_errno_and_return_minus_one( EFAULT );
10d4ff: e8 3c 22 00 00 call 10f740 <__errno>
10d504: c7 00 0e 00 00 00 movl $0xe,(%eax)
10d50a: eb 60 jmp 10d56c <devFS_evaluate_path+0x9c>
for (i = 0; i < rtems_device_table_size; i++) {
if (!device_name_table[i].device_name)
10d50c: 8b 16 mov (%esi),%edx
10d50e: 85 d2 test %edx,%edx
10d510: 74 43 je 10d555 <devFS_evaluate_path+0x85>
continue;
if (strncmp(pathname, device_name_table[i].device_name, pathnamelen) != 0)
10d512: 50 push %eax
10d513: 51 push %ecx
10d514: 52 push %edx
10d515: ff 75 08 pushl 0x8(%ebp)
10d518: 89 55 e4 mov %edx,-0x1c(%ebp)
10d51b: 89 4d e0 mov %ecx,-0x20(%ebp)
10d51e: e8 f1 2e 00 00 call 110414 <strncmp>
10d523: 83 c4 10 add $0x10,%esp
10d526: 85 c0 test %eax,%eax
10d528: 8b 55 e4 mov -0x1c(%ebp),%edx
10d52b: 8b 4d e0 mov -0x20(%ebp),%ecx
10d52e: 75 25 jne 10d555 <devFS_evaluate_path+0x85>
continue;
if (device_name_table[i].device_name[pathnamelen] != '\0')
10d530: 80 3c 0a 00 cmpb $0x0,(%edx,%ecx,1)
10d534: 75 1f jne 10d555 <devFS_evaluate_path+0x85><== NEVER TAKEN
continue;
/* find the device, set proper values */
pathloc->node_access = (void *)&device_name_table[i];
10d536: 89 33 mov %esi,(%ebx)
pathloc->handlers = &devFS_file_handlers;
10d538: c7 43 08 ac 0f 12 00 movl $0x120fac,0x8(%ebx)
pathloc->ops = &devFS_ops;
10d53f: c7 43 0c 64 0f 12 00 movl $0x120f64,0xc(%ebx)
pathloc->mt_entry = rtems_filesystem_root.mt_entry;
10d546: a1 00 11 12 00 mov 0x121100,%eax
10d54b: 8b 40 28 mov 0x28(%eax),%eax
10d54e: 89 43 10 mov %eax,0x10(%ebx)
return 0;
10d551: 31 c0 xor %eax,%eax
10d553: eb 1a jmp 10d56f <devFS_evaluate_path+0x9f>
/* 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++) {
10d555: 47 inc %edi
10d556: 83 c6 14 add $0x14,%esi
10d559: 3b 3d 48 f1 11 00 cmp 0x11f148,%edi
10d55f: 72 ab jb 10d50c <devFS_evaluate_path+0x3c>
pathloc->mt_entry = rtems_filesystem_root.mt_entry;
return 0;
}
/* no such file or directory */
rtems_set_errno_and_return_minus_one( ENOENT );
10d561: e8 da 21 00 00 call 10f740 <__errno>
10d566: c7 00 02 00 00 00 movl $0x2,(%eax)
10d56c: 83 c8 ff or $0xffffffff,%eax
}
10d56f: 8d 65 f4 lea -0xc(%ebp),%esp
10d572: 5b pop %ebx
10d573: 5e pop %esi
10d574: 5f pop %edi
10d575: c9 leave
10d576: c3 ret
00106c70 <devFS_mknod>:
const char *path,
mode_t mode,
dev_t dev,
rtems_filesystem_location_info_t *pathloc
)
{
106c70: 55 push %ebp
106c71: 89 e5 mov %esp,%ebp
106c73: 57 push %edi
106c74: 56 push %esi
106c75: 53 push %ebx
106c76: 83 ec 1c sub $0x1c,%esp
106c79: 8b 7d 08 mov 0x8(%ebp),%edi
106c7c: 8b 4d 10 mov 0x10(%ebp),%ecx
106c7f: 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') &&
106c82: 80 3f 64 cmpb $0x64,(%edi)
106c85: 75 18 jne 106c9f <devFS_mknod+0x2f>
106c87: 80 7f 01 65 cmpb $0x65,0x1(%edi)
106c8b: 75 12 jne 106c9f <devFS_mknod+0x2f> <== NEVER TAKEN
106c8d: 80 7f 02 76 cmpb $0x76,0x2(%edi)
106c91: 75 0c jne 106c9f <devFS_mknod+0x2f> <== NEVER TAKEN
(path[2] == 'v') && (path[3] == '\0'))
return 0;
106c93: 31 c0 xor %eax,%eax
* actually passed in is 'dev', not '/dev'. Just return 0 to
* indicate we are OK.
*/
if ((path[0] == 'd') && (path[1] == 'e') &&
(path[2] == 'v') && (path[3] == '\0'))
106c95: 80 7f 03 00 cmpb $0x0,0x3(%edi)
106c99: 0f 84 c9 00 00 00 je 106d68 <devFS_mknod+0xf8>
return 0;
/* must be a character device or a block device */
if (!S_ISBLK(mode) && !S_ISCHR(mode))
106c9f: 8b 45 0c mov 0xc(%ebp),%eax
106ca2: 25 00 f0 00 00 and $0xf000,%eax
106ca7: 3d 00 20 00 00 cmp $0x2000,%eax
106cac: 74 14 je 106cc2 <devFS_mknod+0x52>
106cae: 3d 00 60 00 00 cmp $0x6000,%eax
106cb3: 74 0d je 106cc2 <devFS_mknod+0x52>
rtems_set_errno_and_return_minus_one( EINVAL );
106cb5: e8 86 8a 00 00 call 10f740 <__errno>
106cba: c7 00 16 00 00 00 movl $0x16,(%eax)
106cc0: eb 23 jmp 106ce5 <devFS_mknod+0x75>
)
{
union __rtems_dev_t temp;
temp.device = device;
return temp.__overlay.major;
106cc2: 89 4d e4 mov %ecx,-0x1c(%ebp)
dev_t device
)
{
union __rtems_dev_t temp;
temp.device = device;
106cc5: 89 55 e0 mov %edx,-0x20(%ebp)
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;
106cc8: 8b 45 18 mov 0x18(%ebp),%eax
106ccb: 8b 08 mov (%eax),%ecx
if (!device_name_table)
106ccd: 85 c9 test %ecx,%ecx
106ccf: 74 09 je 106cda <devFS_mknod+0x6a>
106cd1: 89 ca mov %ecx,%edx
106cd3: 83 ce ff or $0xffffffff,%esi
106cd6: 31 db xor %ebx,%ebx
106cd8: eb 46 jmp 106d20 <devFS_mknod+0xb0>
rtems_set_errno_and_return_minus_one( EFAULT );
106cda: e8 61 8a 00 00 call 10f740 <__errno>
106cdf: c7 00 0e 00 00 00 movl $0xe,(%eax)
106ce5: 83 c8 ff or $0xffffffff,%eax
106ce8: eb 7e jmp 106d68 <devFS_mknod+0xf8>
for (slot = -1, i = 0; i < rtems_device_table_size; i++){
if (device_name_table[i].device_name == NULL)
106cea: 8b 02 mov (%edx),%eax
106cec: 85 c0 test %eax,%eax
106cee: 74 2a je 106d1a <devFS_mknod+0xaa>
slot = i;
else
if (strcmp(path, device_name_table[i].device_name) == 0)
106cf0: 83 ec 08 sub $0x8,%esp
106cf3: 50 push %eax
106cf4: 57 push %edi
106cf5: 89 55 d8 mov %edx,-0x28(%ebp)
106cf8: 89 4d dc mov %ecx,-0x24(%ebp)
106cfb: e8 6c 96 00 00 call 11036c <strcmp>
106d00: 83 c4 10 add $0x10,%esp
106d03: 85 c0 test %eax,%eax
106d05: 8b 55 d8 mov -0x28(%ebp),%edx
106d08: 8b 4d dc mov -0x24(%ebp),%ecx
106d0b: 75 0f jne 106d1c <devFS_mknod+0xac>
rtems_set_errno_and_return_minus_one( EEXIST );
106d0d: e8 2e 8a 00 00 call 10f740 <__errno>
106d12: c7 00 11 00 00 00 movl $0x11,(%eax)
106d18: eb cb jmp 106ce5 <devFS_mknod+0x75>
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
for (slot = -1, i = 0; i < rtems_device_table_size; i++){
if (device_name_table[i].device_name == NULL)
slot = i;
106d1a: 89 de mov %ebx,%esi
/* 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++){
106d1c: 43 inc %ebx
106d1d: 83 c2 14 add $0x14,%edx
106d20: 3b 1d 48 f1 11 00 cmp 0x11f148,%ebx
106d26: 72 c2 jb 106cea <devFS_mknod+0x7a>
else
if (strcmp(path, device_name_table[i].device_name) == 0)
rtems_set_errno_and_return_minus_one( EEXIST );
}
if (slot == -1)
106d28: 83 fe ff cmp $0xffffffff,%esi
106d2b: 75 0d jne 106d3a <devFS_mknod+0xca>
rtems_set_errno_and_return_minus_one( ENOMEM );
106d2d: e8 0e 8a 00 00 call 10f740 <__errno>
106d32: c7 00 0c 00 00 00 movl $0xc,(%eax)
106d38: eb ab jmp 106ce5 <devFS_mknod+0x75>
_ISR_Disable(level);
106d3a: 9c pushf
106d3b: fa cli
106d3c: 5b pop %ebx
device_name_table[slot].device_name = (char *)path;
106d3d: 6b d6 14 imul $0x14,%esi,%edx
106d40: 8d 14 11 lea (%ecx,%edx,1),%edx
106d43: 89 3a mov %edi,(%edx)
device_name_table[slot].device_name_length = strlen(path);
106d45: 31 c0 xor %eax,%eax
106d47: 83 c9 ff or $0xffffffff,%ecx
106d4a: f2 ae repnz scas %es:(%edi),%al
106d4c: f7 d1 not %ecx
106d4e: 49 dec %ecx
106d4f: 89 4a 04 mov %ecx,0x4(%edx)
device_name_table[slot].major = major;
106d52: 8b 45 e4 mov -0x1c(%ebp),%eax
106d55: 89 42 08 mov %eax,0x8(%edx)
device_name_table[slot].minor = minor;
106d58: 8b 45 e0 mov -0x20(%ebp),%eax
106d5b: 89 42 0c mov %eax,0xc(%edx)
device_name_table[slot].mode = mode;
106d5e: 8b 45 0c mov 0xc(%ebp),%eax
106d61: 89 42 10 mov %eax,0x10(%edx)
_ISR_Enable(level);
106d64: 53 push %ebx
106d65: 9d popf
return 0;
106d66: 31 c0 xor %eax,%eax
}
106d68: 8d 65 f4 lea -0xc(%ebp),%esp
106d6b: 5b pop %ebx
106d6c: 5e pop %esi
106d6d: 5f pop %edi
106d6e: c9 leave
106d6f: c3 ret
001080d8 <drainOutput>:
/*
* Drain output queue
*/
static void
drainOutput (struct rtems_termios_tty *tty)
{
1080d8: 55 push %ebp
1080d9: 89 e5 mov %esp,%ebp
1080db: 53 push %ebx
1080dc: 83 ec 04 sub $0x4,%esp
1080df: 89 c3 mov %eax,%ebx
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) {
1080e1: 83 b8 b4 00 00 00 00 cmpl $0x0,0xb4(%eax)
1080e8: 74 46 je 108130 <drainOutput+0x58>
rtems_interrupt_disable (level);
1080ea: 9c pushf
1080eb: fa cli
1080ec: 58 pop %eax
while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) {
1080ed: eb 2f jmp 10811e <drainOutput+0x46>
tty->rawOutBufState = rob_wait;
1080ef: c7 83 94 00 00 00 02 movl $0x2,0x94(%ebx)
1080f6: 00 00 00
rtems_interrupt_enable (level);
1080f9: 50 push %eax
1080fa: 9d popf
sc = rtems_semaphore_obtain(
1080fb: 50 push %eax
1080fc: 6a 00 push $0x0
1080fe: 6a 00 push $0x0
108100: ff b3 8c 00 00 00 pushl 0x8c(%ebx)
108106: e8 b1 20 00 00 call 10a1bc <rtems_semaphore_obtain>
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
10810b: 83 c4 10 add $0x10,%esp
10810e: 85 c0 test %eax,%eax
108110: 74 09 je 10811b <drainOutput+0x43> <== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
108112: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
108115: 50 push %eax <== NOT EXECUTED
108116: e8 6d 26 00 00 call 10a788 <rtems_fatal_error_occurred><== NOT EXECUTED
rtems_interrupt_disable (level);
10811b: 9c pushf
10811c: fa cli
10811d: 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) {
10811e: 8b 8b 84 00 00 00 mov 0x84(%ebx),%ecx
108124: 8b 93 80 00 00 00 mov 0x80(%ebx),%edx
10812a: 39 d1 cmp %edx,%ecx
10812c: 75 c1 jne 1080ef <drainOutput+0x17>
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);
10812e: 50 push %eax
10812f: 9d popf
}
}
108130: 8b 5d fc mov -0x4(%ebp),%ebx
108133: c9 leave
108134: c3 ret
00108c8f <echo>:
/*
* Echo a typed character
*/
static void
echo (unsigned char c, struct rtems_termios_tty *tty)
{
108c8f: 55 push %ebp
108c90: 89 e5 mov %esp,%ebp
108c92: 53 push %ebx
108c93: 83 ec 24 sub $0x24,%esp
if ((tty->termios.c_lflag & ECHOCTL) &&
108c96: f6 42 3d 02 testb $0x2,0x3d(%edx)
108c9a: 74 3e je 108cda <echo+0x4b> <== NEVER TAKEN
iscntrl(c) && (c != '\t') && (c != '\n')) {
108c9c: 0f b6 c8 movzbl %al,%ecx
108c9f: 8b 1d 3c 31 12 00 mov 0x12313c,%ebx
108ca5: f6 44 0b 01 20 testb $0x20,0x1(%ebx,%ecx,1)
108caa: 74 2e je 108cda <echo+0x4b>
108cac: 3c 09 cmp $0x9,%al
108cae: 74 2a je 108cda <echo+0x4b>
108cb0: 3c 0a cmp $0xa,%al
108cb2: 74 26 je 108cda <echo+0x4b>
char echobuf[2];
echobuf[0] = '^';
108cb4: c6 45 f6 5e movb $0x5e,-0xa(%ebp)
echobuf[1] = c ^ 0x40;
108cb8: 83 f0 40 xor $0x40,%eax
108cbb: 88 45 f7 mov %al,-0x9(%ebp)
rtems_termios_puts (echobuf, 2, tty);
108cbe: 50 push %eax
108cbf: 52 push %edx
108cc0: 6a 02 push $0x2
108cc2: 8d 45 f6 lea -0xa(%ebp),%eax
108cc5: 50 push %eax
108cc6: 89 55 e4 mov %edx,-0x1c(%ebp)
108cc9: e8 84 fd ff ff call 108a52 <rtems_termios_puts>
tty->column += 2;
108cce: 8b 55 e4 mov -0x1c(%ebp),%edx
108cd1: 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')) {
108cd5: 83 c4 10 add $0x10,%esp
108cd8: eb 08 jmp 108ce2 <echo+0x53>
echobuf[0] = '^';
echobuf[1] = c ^ 0x40;
rtems_termios_puts (echobuf, 2, tty);
tty->column += 2;
} else {
oproc (c, tty);
108cda: 0f b6 c0 movzbl %al,%eax
108cdd: e8 90 fe ff ff call 108b72 <oproc>
}
}
108ce2: 8b 5d fc mov -0x4(%ebp),%ebx
108ce5: c9 leave
108ce6: c3 ret
0010814e <endgrent>:
void endgrent(void)
{
10814e: 55 push %ebp
10814f: 89 e5 mov %esp,%ebp
108151: 83 ec 08 sub $0x8,%esp
if (group_fp != NULL)
108154: a1 b8 6b 12 00 mov 0x126bb8,%eax
108159: 85 c0 test %eax,%eax
10815b: 74 0c je 108169 <endgrent+0x1b> <== NEVER TAKEN
fclose(group_fp);
10815d: 83 ec 0c sub $0xc,%esp
108160: 50 push %eax
108161: e8 aa 9e 00 00 call 112010 <fclose>
108166: 83 c4 10 add $0x10,%esp
}
108169: c9 leave
10816a: c3 ret
00108001 <endpwent>:
void endpwent(void)
{
108001: 55 push %ebp
108002: 89 e5 mov %esp,%ebp
108004: 83 ec 08 sub $0x8,%esp
if (passwd_fp != NULL)
108007: a1 94 6c 12 00 mov 0x126c94,%eax
10800c: 85 c0 test %eax,%eax
10800e: 74 0c je 10801c <endpwent+0x1b> <== NEVER TAKEN
fclose(passwd_fp);
108010: 83 ec 0c sub $0xc,%esp
108013: 50 push %eax
108014: e8 f7 9f 00 00 call 112010 <fclose>
108019: 83 c4 10 add $0x10,%esp
}
10801c: c9 leave
10801d: c3 ret
00108ce7 <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)
{
108ce7: 55 push %ebp
108ce8: 89 e5 mov %esp,%ebp
108cea: 57 push %edi
108ceb: 56 push %esi
108cec: 53 push %ebx
108ced: 83 ec 2c sub $0x2c,%esp
108cf0: 89 c3 mov %eax,%ebx
108cf2: 89 55 e4 mov %edx,-0x1c(%ebp)
if (tty->ccount == 0)
108cf5: 83 78 20 00 cmpl $0x0,0x20(%eax)
108cf9: 0f 84 59 01 00 00 je 108e58 <erase+0x171>
return;
if (lineFlag) {
108cff: 85 d2 test %edx,%edx
108d01: 0f 84 46 01 00 00 je 108e4d <erase+0x166>
if (!(tty->termios.c_lflag & ECHO)) {
108d07: 8b 40 3c mov 0x3c(%eax),%eax
108d0a: a8 08 test $0x8,%al
108d0c: 75 0c jne 108d1a <erase+0x33> <== ALWAYS TAKEN
tty->ccount = 0;
108d0e: c7 43 20 00 00 00 00 movl $0x0,0x20(%ebx) <== NOT EXECUTED
return;
108d15: e9 3e 01 00 00 jmp 108e58 <erase+0x171> <== NOT EXECUTED
}
if (!(tty->termios.c_lflag & ECHOE)) {
108d1a: a8 10 test $0x10,%al
108d1c: 0f 85 2b 01 00 00 jne 108e4d <erase+0x166> <== ALWAYS TAKEN
tty->ccount = 0;
108d22: c7 43 20 00 00 00 00 movl $0x0,0x20(%ebx) <== NOT EXECUTED
echo (tty->termios.c_cc[VKILL], tty);
108d29: 0f b6 43 44 movzbl 0x44(%ebx),%eax <== NOT EXECUTED
108d2d: 89 da mov %ebx,%edx <== NOT EXECUTED
108d2f: e8 5b ff ff ff call 108c8f <echo> <== NOT EXECUTED
if (tty->termios.c_lflag & ECHOK)
108d34: f6 43 3c 20 testb $0x20,0x3c(%ebx) <== NOT EXECUTED
108d38: 0f 84 1a 01 00 00 je 108e58 <erase+0x171> <== NOT EXECUTED
echo ('\n', tty);
108d3e: 89 da mov %ebx,%edx <== NOT EXECUTED
108d40: b8 0a 00 00 00 mov $0xa,%eax <== NOT EXECUTED
108d45: eb 2a jmp 108d71 <erase+0x8a> <== NOT EXECUTED
return;
}
}
while (tty->ccount) {
unsigned char c = tty->cbuf[--tty->ccount];
108d47: 8b 7b 1c mov 0x1c(%ebx),%edi
108d4a: 8d 50 ff lea -0x1(%eax),%edx
108d4d: 89 53 20 mov %edx,0x20(%ebx)
108d50: 8a 4c 07 ff mov -0x1(%edi,%eax,1),%cl
if (tty->termios.c_lflag & ECHO) {
108d54: 8b 53 3c mov 0x3c(%ebx),%edx
108d57: f6 c2 08 test $0x8,%dl
108d5a: 0f 84 e7 00 00 00 je 108e47 <erase+0x160> <== NEVER TAKEN
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
108d60: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp)
108d64: 75 17 jne 108d7d <erase+0x96>
108d66: f6 c2 10 test $0x10,%dl
108d69: 75 12 jne 108d7d <erase+0x96> <== ALWAYS TAKEN
echo (tty->termios.c_cc[VERASE], tty);
108d6b: 0f b6 43 43 movzbl 0x43(%ebx),%eax <== NOT EXECUTED
108d6f: 89 da mov %ebx,%edx <== NOT EXECUTED
}
}
if (!lineFlag)
break;
}
}
108d71: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
108d74: 5b pop %ebx <== NOT EXECUTED
108d75: 5e pop %esi <== NOT EXECUTED
108d76: 5f pop %edi <== NOT EXECUTED
108d77: 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);
108d78: e9 12 ff ff ff jmp 108c8f <echo> <== NOT EXECUTED
} else if (c == '\t') {
108d7d: 80 f9 09 cmp $0x9,%cl
108d80: 8b 35 3c 31 12 00 mov 0x12313c,%esi
108d86: 89 75 e0 mov %esi,-0x20(%ebp)
108d89: 75 60 jne 108deb <erase+0x104>
int col = tty->read_start_column;
108d8b: 8b 73 2c mov 0x2c(%ebx),%esi
int i = 0;
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
108d8e: b9 01 00 00 00 mov $0x1,%ecx
c = tty->cbuf[i++];
if (c == '\t') {
col = (col | 7) + 1;
} else if (iscntrl (c)) {
if (tty->termios.c_lflag & ECHOCTL)
108d93: 81 e2 00 02 00 00 and $0x200,%edx
108d99: 89 55 dc mov %edx,-0x24(%ebp)
108d9c: 89 45 d4 mov %eax,-0x2c(%ebp)
int i = 0;
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
108d9f: eb 28 jmp 108dc9 <erase+0xe2>
c = tty->cbuf[i++];
108da1: 8a 54 0f ff mov -0x1(%edi,%ecx,1),%dl
if (c == '\t') {
108da5: 80 fa 09 cmp $0x9,%dl
108da8: 75 05 jne 108daf <erase+0xc8>
col = (col | 7) + 1;
108daa: 83 ce 07 or $0x7,%esi
108dad: eb 18 jmp 108dc7 <erase+0xe0>
} else if (iscntrl (c)) {
108daf: 0f b6 d2 movzbl %dl,%edx
108db2: 8b 45 e0 mov -0x20(%ebp),%eax
108db5: f6 44 10 01 20 testb $0x20,0x1(%eax,%edx,1)
108dba: 74 0b je 108dc7 <erase+0xe0> <== ALWAYS TAKEN
if (tty->termios.c_lflag & ECHOCTL)
108dbc: 83 7d dc 00 cmpl $0x0,-0x24(%ebp) <== NOT EXECUTED
108dc0: 74 06 je 108dc8 <erase+0xe1> <== NOT EXECUTED
col += 2;
108dc2: 83 c6 02 add $0x2,%esi <== NOT EXECUTED
108dc5: eb 01 jmp 108dc8 <erase+0xe1> <== NOT EXECUTED
} else {
col++;
108dc7: 46 inc %esi
108dc8: 41 inc %ecx
int i = 0;
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
108dc9: 3b 4d d4 cmp -0x2c(%ebp),%ecx
108dcc: 75 d3 jne 108da1 <erase+0xba>
108dce: eb 14 jmp 108de4 <erase+0xfd>
/*
* Back up over the tab
*/
while (tty->column > col) {
rtems_termios_puts ("\b", 1, tty);
108dd0: 57 push %edi
108dd1: 53 push %ebx
108dd2: 6a 01 push $0x1
108dd4: 68 68 f0 11 00 push $0x11f068
108dd9: e8 74 fc ff ff call 108a52 <rtems_termios_puts>
tty->column--;
108dde: ff 4b 28 decl 0x28(%ebx)
108de1: 83 c4 10 add $0x10,%esp
}
/*
* Back up over the tab
*/
while (tty->column > col) {
108de4: 39 73 28 cmp %esi,0x28(%ebx)
108de7: 7f e7 jg 108dd0 <erase+0xe9>
108de9: eb 5c jmp 108e47 <erase+0x160>
rtems_termios_puts ("\b", 1, tty);
tty->column--;
}
}
else {
if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) {
108deb: 0f b6 f1 movzbl %cl,%esi
108dee: 8b 45 e0 mov -0x20(%ebp),%eax
108df1: f6 44 30 01 20 testb $0x20,0x1(%eax,%esi,1)
108df6: 74 21 je 108e19 <erase+0x132> <== ALWAYS TAKEN
108df8: 80 e6 02 and $0x2,%dh <== NOT EXECUTED
108dfb: 74 1c je 108e19 <erase+0x132> <== NOT EXECUTED
rtems_termios_puts ("\b \b", 3, tty);
108dfd: 51 push %ecx <== NOT EXECUTED
108dfe: 53 push %ebx <== NOT EXECUTED
108dff: 6a 03 push $0x3 <== NOT EXECUTED
108e01: 68 66 f0 11 00 push $0x11f066 <== NOT EXECUTED
108e06: e8 47 fc ff ff call 108a52 <rtems_termios_puts> <== NOT EXECUTED
if (tty->column)
108e0b: 8b 43 28 mov 0x28(%ebx),%eax <== NOT EXECUTED
108e0e: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
108e11: 85 c0 test %eax,%eax <== NOT EXECUTED
108e13: 74 04 je 108e19 <erase+0x132> <== NOT EXECUTED
tty->column--;
108e15: 48 dec %eax <== NOT EXECUTED
108e16: 89 43 28 mov %eax,0x28(%ebx) <== NOT EXECUTED
}
if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) {
108e19: a1 3c 31 12 00 mov 0x12313c,%eax
108e1e: f6 44 30 01 20 testb $0x20,0x1(%eax,%esi,1)
108e23: 74 06 je 108e2b <erase+0x144> <== ALWAYS TAKEN
108e25: f6 43 3d 02 testb $0x2,0x3d(%ebx) <== NOT EXECUTED
108e29: 74 1c je 108e47 <erase+0x160> <== NOT EXECUTED
rtems_termios_puts ("\b \b", 3, tty);
108e2b: 52 push %edx
108e2c: 53 push %ebx
108e2d: 6a 03 push $0x3
108e2f: 68 66 f0 11 00 push $0x11f066
108e34: e8 19 fc ff ff call 108a52 <rtems_termios_puts>
if (tty->column)
108e39: 8b 43 28 mov 0x28(%ebx),%eax
108e3c: 83 c4 10 add $0x10,%esp
108e3f: 85 c0 test %eax,%eax
108e41: 74 04 je 108e47 <erase+0x160> <== NEVER TAKEN
tty->column--;
108e43: 48 dec %eax
108e44: 89 43 28 mov %eax,0x28(%ebx)
}
}
}
if (!lineFlag)
108e47: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp)
108e4b: 74 0b je 108e58 <erase+0x171>
echo ('\n', tty);
return;
}
}
while (tty->ccount) {
108e4d: 8b 43 20 mov 0x20(%ebx),%eax
108e50: 85 c0 test %eax,%eax
108e52: 0f 85 ef fe ff ff jne 108d47 <erase+0x60>
}
}
if (!lineFlag)
break;
}
}
108e58: 8d 65 f4 lea -0xc(%ebp),%esp
108e5b: 5b pop %ebx
108e5c: 5e pop %esi
108e5d: 5f pop %edi
108e5e: c9 leave
108e5f: c3 ret
00107c08 <fcntl>:
int fcntl(
int fd,
int cmd,
...
)
{
107c08: 55 push %ebp
107c09: 89 e5 mov %esp,%ebp
107c0b: 57 push %edi
107c0c: 56 push %esi
107c0d: 53 push %ebx
107c0e: 83 ec 0c sub $0xc,%esp
107c11: 8b 5d 08 mov 0x8(%ebp),%ebx
int ret;
va_list ap;
va_start( ap, cmd );
107c14: 8d 75 10 lea 0x10(%ebp),%esi
int fd2;
int flags;
int mask;
int ret = 0;
rtems_libio_check_fd( fd );
107c17: 8b 0d 44 21 12 00 mov 0x122144,%ecx
107c1d: 39 cb cmp %ecx,%ebx
107c1f: 73 14 jae 107c35 <fcntl+0x2d>
iop = rtems_libio_iop( fd );
107c21: 8b 15 f8 61 12 00 mov 0x1261f8,%edx
107c27: 6b db 38 imul $0x38,%ebx,%ebx
107c2a: 8d 1c 1a lea (%edx,%ebx,1),%ebx
rtems_libio_check_is_open(iop);
107c2d: 8b 43 14 mov 0x14(%ebx),%eax
107c30: f6 c4 01 test $0x1,%ah
107c33: 75 10 jne 107c45 <fcntl+0x3d>
107c35: e8 56 a3 00 00 call 111f90 <__errno>
107c3a: c7 00 09 00 00 00 movl $0x9,(%eax)
107c40: e9 e6 00 00 00 jmp 107d2b <fcntl+0x123>
/*
* This switch should contain all the cases from POSIX.
*/
switch ( cmd ) {
107c45: 83 7d 0c 09 cmpl $0x9,0xc(%ebp)
107c49: 0f 87 af 00 00 00 ja 107cfe <fcntl+0xf6>
107c4f: 8b 7d 0c mov 0xc(%ebp),%edi
107c52: ff 24 bd b4 08 12 00 jmp *0x1208b4(,%edi,4)
case F_DUPFD: /* dup */
fd2 = va_arg( ap, int );
107c59: 8b 36 mov (%esi),%esi
if ( fd2 )
107c5b: 85 f6 test %esi,%esi
107c5d: 74 0e je 107c6d <fcntl+0x65>
diop = rtems_libio_iop( fd2 );
107c5f: 31 c0 xor %eax,%eax
107c61: 39 ce cmp %ecx,%esi
107c63: 73 15 jae 107c7a <fcntl+0x72> <== NEVER TAKEN
107c65: 6b c6 38 imul $0x38,%esi,%eax
107c68: 8d 04 02 lea (%edx,%eax,1),%eax
107c6b: eb 0d jmp 107c7a <fcntl+0x72>
else {
/* allocate a file control block */
diop = rtems_libio_allocate();
107c6d: e8 d1 04 00 00 call 108143 <rtems_libio_allocate>
if ( diop == 0 ) {
107c72: 85 c0 test %eax,%eax
107c74: 0f 84 b1 00 00 00 je 107d2b <fcntl+0x123> <== NEVER TAKEN
ret = -1;
break;
}
}
diop->flags = iop->flags;
107c7a: 8b 53 14 mov 0x14(%ebx),%edx
107c7d: 89 50 14 mov %edx,0x14(%eax)
diop->pathinfo = iop->pathinfo;
107c80: 8d 78 18 lea 0x18(%eax),%edi
107c83: 8d 73 18 lea 0x18(%ebx),%esi
107c86: b9 05 00 00 00 mov $0x5,%ecx
107c8b: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
ret = (int) (diop - rtems_libio_iops);
107c8d: 2b 05 f8 61 12 00 sub 0x1261f8,%eax
107c93: c1 f8 03 sar $0x3,%eax
107c96: 69 f0 b7 6d db b6 imul $0xb6db6db7,%eax,%esi
107c9c: eb 6d jmp 107d0b <fcntl+0x103>
break;
case F_GETFD: /* get f_flags */
ret = ((iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC) != 0);
107c9e: f6 c4 08 test $0x8,%ah
107ca1: 0f 95 c0 setne %al
107ca4: 0f b6 c0 movzbl %al,%eax
107ca7: 89 c6 mov %eax,%esi
107ca9: eb 64 jmp 107d0f <fcntl+0x107>
* 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 ) )
107cab: 83 3e 00 cmpl $0x0,(%esi)
107cae: 74 05 je 107cb5 <fcntl+0xad>
iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC;
107cb0: 80 cc 08 or $0x8,%ah
107cb3: eb 03 jmp 107cb8 <fcntl+0xb0>
else
iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC;
107cb5: 80 e4 f7 and $0xf7,%ah
107cb8: 89 43 14 mov %eax,0x14(%ebx)
107cbb: eb 30 jmp 107ced <fcntl+0xe5>
break;
case F_GETFL: /* more flags (cloexec) */
ret = rtems_libio_to_fcntl_flags( iop->flags );
107cbd: 83 ec 0c sub $0xc,%esp
107cc0: 50 push %eax
107cc1: e8 3f 04 00 00 call 108105 <rtems_libio_to_fcntl_flags>
107cc6: 89 c6 mov %eax,%esi
107cc8: 83 c4 10 add $0x10,%esp
107ccb: eb 3e jmp 107d0b <fcntl+0x103>
break;
case F_SETFL:
flags = rtems_libio_fcntl_flags( va_arg( ap, int ) );
107ccd: 83 ec 0c sub $0xc,%esp
107cd0: ff 36 pushl (%esi)
107cd2: e8 f9 03 00 00 call 1080d0 <rtems_libio_fcntl_flags>
/*
* XXX If we are turning on append, should we seek to the end?
*/
iop->flags = (iop->flags & ~mask) | (flags & mask);
107cd7: 25 01 02 00 00 and $0x201,%eax
107cdc: 8b 53 14 mov 0x14(%ebx),%edx
107cdf: 81 e2 fe fd ff ff and $0xfffffdfe,%edx
107ce5: 09 d0 or %edx,%eax
107ce7: 89 43 14 mov %eax,0x14(%ebx)
107cea: 83 c4 10 add $0x10,%esp
rtems_libio_t *iop;
rtems_libio_t *diop;
int fd2;
int flags;
int mask;
int ret = 0;
107ced: 31 f6 xor %esi,%esi
107cef: eb 1e jmp 107d0f <fcntl+0x107>
errno = ENOTSUP;
ret = -1;
break;
case F_GETOWN: /* for sockets. */
errno = ENOTSUP;
107cf1: e8 9a a2 00 00 call 111f90 <__errno>
107cf6: c7 00 86 00 00 00 movl $0x86,(%eax)
107cfc: eb 2d jmp 107d2b <fcntl+0x123>
ret = -1;
break;
default:
errno = EINVAL;
107cfe: e8 8d a2 00 00 call 111f90 <__errno>
107d03: c7 00 16 00 00 00 movl $0x16,(%eax)
107d09: eb 20 jmp 107d2b <fcntl+0x123>
/*
* If we got this far successfully, then we give the optional
* filesystem specific handler a chance to process this.
*/
if (ret >= 0) {
107d0b: 85 f6 test %esi,%esi
107d0d: 78 1f js 107d2e <fcntl+0x126> <== NEVER TAKEN
int err = (*iop->pathinfo.handlers->fcntl_h)( cmd, iop );
107d0f: 50 push %eax
107d10: 50 push %eax
107d11: 8b 43 20 mov 0x20(%ebx),%eax
107d14: 53 push %ebx
107d15: ff 75 0c pushl 0xc(%ebp)
107d18: ff 50 30 call *0x30(%eax)
107d1b: 89 c3 mov %eax,%ebx
if (err) {
107d1d: 83 c4 10 add $0x10,%esp
107d20: 85 c0 test %eax,%eax
107d22: 74 0a je 107d2e <fcntl+0x126> <== ALWAYS TAKEN
errno = err;
107d24: e8 67 a2 00 00 call 111f90 <__errno> <== NOT EXECUTED
107d29: 89 18 mov %ebx,(%eax) <== NOT EXECUTED
ret = -1;
107d2b: 83 ce ff or $0xffffffff,%esi
va_list ap;
va_start( ap, cmd );
ret = vfcntl(fd,cmd,ap);
va_end(ap);
return ret;
}
107d2e: 89 f0 mov %esi,%eax
107d30: 8d 65 f4 lea -0xc(%ebp),%esp
107d33: 5b pop %ebx
107d34: 5e pop %esi
107d35: 5f pop %edi
107d36: c9 leave
107d37: c3 ret
0010fb83 <fifo_open>:
*/
int fifo_open(
pipe_control_t **pipep,
rtems_libio_t *iop
)
{
10fb83: 55 push %ebp
10fb84: 89 e5 mov %esp,%ebp
10fb86: 57 push %edi
10fb87: 56 push %esi
10fb88: 53 push %ebx
10fb89: 83 ec 2c sub $0x2c,%esp
static rtems_status_code pipe_lock(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (pipe_semaphore == RTEMS_ID_NONE) {
10fb8c: 83 3d 20 70 12 00 00 cmpl $0x0,0x127020
10fb93: 75 50 jne 10fbe5 <fifo_open+0x62>
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 );
10fb95: 53 push %ebx
10fb96: 6a 00 push $0x0
10fb98: 6a 00 push $0x0
10fb9a: ff 35 20 72 12 00 pushl 0x127220
10fba0: e8 bb c0 ff ff call 10bc60 <rtems_semaphore_obtain>
rtems_libio_lock();
if (pipe_semaphore == RTEMS_ID_NONE) {
10fba5: 83 c4 10 add $0x10,%esp
free(pipe);
}
static rtems_status_code pipe_lock(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
10fba8: 31 db xor %ebx,%ebx
if (pipe_semaphore == RTEMS_ID_NONE) {
rtems_libio_lock();
if (pipe_semaphore == RTEMS_ID_NONE) {
10fbaa: 83 3d 20 70 12 00 00 cmpl $0x0,0x127020
10fbb1: 75 1d jne 10fbd0 <fifo_open+0x4d> <== NEVER TAKEN
sc = rtems_semaphore_create(
10fbb3: 83 ec 0c sub $0xc,%esp
10fbb6: 68 20 70 12 00 push $0x127020
10fbbb: 6a 00 push $0x0
10fbbd: 6a 54 push $0x54
10fbbf: 6a 01 push $0x1
10fbc1: 68 45 50 49 50 push $0x50495045
10fbc6: e8 6d be ff ff call 10ba38 <rtems_semaphore_create>
10fbcb: 89 c3 mov %eax,%ebx
10fbcd: 83 c4 20 add $0x20,%esp
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
10fbd0: 83 ec 0c sub $0xc,%esp
10fbd3: ff 35 20 72 12 00 pushl 0x127220
10fbd9: e8 6e c1 ff ff call 10bd4c <rtems_semaphore_release>
}
rtems_libio_unlock();
}
if (sc == RTEMS_SUCCESSFUL) {
10fbde: 83 c4 10 add $0x10,%esp
10fbe1: 85 db test %ebx,%ebx
10fbe3: 75 19 jne 10fbfe <fifo_open+0x7b>
sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
10fbe5: 51 push %ecx
10fbe6: 6a 00 push $0x0
10fbe8: 6a 00 push $0x0
10fbea: ff 35 20 70 12 00 pushl 0x127020
10fbf0: e8 6b c0 ff ff call 10bc60 <rtems_semaphore_obtain>
}
if (sc == RTEMS_SUCCESSFUL) {
10fbf5: 83 c4 10 add $0x10,%esp
return 0;
10fbf8: 31 f6 xor %esi,%esi
if (sc == RTEMS_SUCCESSFUL) {
sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
}
if (sc == RTEMS_SUCCESSFUL) {
10fbfa: 85 c0 test %eax,%eax
10fbfc: 74 05 je 10fc03 <fifo_open+0x80> <== ALWAYS TAKEN
return 0;
} else {
return -ENOMEM;
10fbfe: be f4 ff ff ff mov $0xfffffff4,%esi
{
pipe_control_t *pipe;
int err = 0;
err = pipe_lock();
if (err)
10fc03: 85 f6 test %esi,%esi
10fc05: 0f 85 37 03 00 00 jne 10ff42 <fifo_open+0x3bf>
return err;
pipe = *pipep;
10fc0b: 8b 45 08 mov 0x8(%ebp),%eax
10fc0e: 8b 18 mov (%eax),%ebx
if (pipe == NULL) {
10fc10: 85 db test %ebx,%ebx
10fc12: 0f 85 56 01 00 00 jne 10fd6e <fifo_open+0x1eb>
{
static char c = 'a';
pipe_control_t *pipe;
int err = -ENOMEM;
pipe = malloc(sizeof(pipe_control_t));
10fc18: 83 ec 0c sub $0xc,%esp
10fc1b: 6a 34 push $0x34
10fc1d: e8 be 93 ff ff call 108fe0 <malloc>
10fc22: 89 c3 mov %eax,%ebx
10fc24: 89 45 d4 mov %eax,-0x2c(%ebp)
if (pipe == NULL)
10fc27: 83 c4 10 add $0x10,%esp
10fc2a: 85 c0 test %eax,%eax
10fc2c: 0f 84 35 01 00 00 je 10fd67 <fifo_open+0x1e4>
return err;
memset(pipe, 0, sizeof(pipe_control_t));
10fc32: b9 0d 00 00 00 mov $0xd,%ecx
10fc37: 89 c7 mov %eax,%edi
10fc39: 89 f0 mov %esi,%eax
10fc3b: f3 ab rep stos %eax,%es:(%edi)
pipe->Size = PIPE_BUF;
10fc3d: c7 43 04 00 02 00 00 movl $0x200,0x4(%ebx)
pipe->Buffer = malloc(pipe->Size);
10fc44: 83 ec 0c sub $0xc,%esp
10fc47: 68 00 02 00 00 push $0x200
10fc4c: e8 8f 93 ff ff call 108fe0 <malloc>
10fc51: 89 03 mov %eax,(%ebx)
if (! pipe->Buffer)
10fc53: 83 c4 10 add $0x10,%esp
10fc56: 85 c0 test %eax,%eax
10fc58: 0f 84 fb 00 00 00 je 10fd59 <fifo_open+0x1d6> <== NEVER TAKEN
goto err_buf;
err = -ENOMEM;
if (rtems_barrier_create(
10fc5e: 8d 43 2c lea 0x2c(%ebx),%eax
10fc61: 50 push %eax
10fc62: 6a 00 push $0x0
10fc64: 6a 00 push $0x0
rtems_build_name ('P', 'I', 'r', c),
10fc66: 0f be 05 a8 50 12 00 movsbl 0x1250a8,%eax
if (! pipe->Buffer)
goto err_buf;
err = -ENOMEM;
if (rtems_barrier_create(
10fc6d: 0d 00 72 49 50 or $0x50497200,%eax
10fc72: 50 push %eax
10fc73: e8 40 18 00 00 call 1114b8 <rtems_barrier_create>
10fc78: 83 c4 10 add $0x10,%esp
10fc7b: 85 c0 test %eax,%eax
10fc7d: 0f 85 c6 00 00 00 jne 10fd49 <fifo_open+0x1c6>
rtems_build_name ('P', 'I', 'r', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->readBarrier) != RTEMS_SUCCESSFUL)
goto err_rbar;
if (rtems_barrier_create(
10fc83: 8d 43 30 lea 0x30(%ebx),%eax
10fc86: 50 push %eax
10fc87: 6a 00 push $0x0
10fc89: 6a 00 push $0x0
rtems_build_name ('P', 'I', 'w', c),
10fc8b: 0f be 05 a8 50 12 00 movsbl 0x1250a8,%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(
10fc92: 0d 00 77 49 50 or $0x50497700,%eax
10fc97: 50 push %eax
10fc98: e8 1b 18 00 00 call 1114b8 <rtems_barrier_create>
10fc9d: 83 c4 10 add $0x10,%esp
10fca0: 85 c0 test %eax,%eax
10fca2: 0f 85 90 00 00 00 jne 10fd38 <fifo_open+0x1b5>
rtems_build_name ('P', 'I', 'w', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->writeBarrier) != RTEMS_SUCCESSFUL)
goto err_wbar;
if (rtems_semaphore_create(
10fca8: 83 ec 0c sub $0xc,%esp
10fcab: 8d 43 28 lea 0x28(%ebx),%eax
10fcae: 50 push %eax
10fcaf: 6a 00 push $0x0
10fcb1: 6a 10 push $0x10
10fcb3: 6a 01 push $0x1
rtems_build_name ('P', 'I', 's', c), 1,
10fcb5: 0f be 05 a8 50 12 00 movsbl 0x1250a8,%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(
10fcbc: 0d 00 73 49 50 or $0x50497300,%eax
10fcc1: 50 push %eax
10fcc2: e8 71 bd ff ff call 10ba38 <rtems_semaphore_create>
10fcc7: 83 c4 20 add $0x20,%esp
10fcca: 85 c0 test %eax,%eax
10fccc: 75 59 jne 10fd27 <fifo_open+0x1a4>
Objects_Id id,
Objects_Locations *location
)
{
return (Barrier_Control *)
_Objects_Get( &_Barrier_Information, id, location );
10fcce: 52 push %edx
/* 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
10fccf: 8d 7d e0 lea -0x20(%ebp),%edi
10fcd2: 57 push %edi
10fcd3: ff 73 2c pushl 0x2c(%ebx)
10fcd6: 68 5c 7c 12 00 push $0x127c5c
10fcdb: e8 c8 d4 ff ff call 10d1a8 <_Objects_Get>
|= STATES_INTERRUPTIBLE_BY_SIGNAL;
10fce0: 81 48 4c 00 00 00 10 orl $0x10000000,0x4c(%eax)
_Thread_Enable_dispatch();
10fce7: e8 9e df ff ff call 10dc8a <_Thread_Enable_dispatch>
10fcec: 83 c4 0c add $0xc,%esp
10fcef: 57 push %edi
10fcf0: ff 73 30 pushl 0x30(%ebx)
10fcf3: 68 5c 7c 12 00 push $0x127c5c
10fcf8: e8 ab d4 ff ff call 10d1a8 <_Objects_Get>
_Barrier_Get(pipe->writeBarrier, &location)->Barrier.Wait_queue.state
|= STATES_INTERRUPTIBLE_BY_SIGNAL;
10fcfd: 81 48 4c 00 00 00 10 orl $0x10000000,0x4c(%eax)
_Thread_Enable_dispatch();
10fd04: e8 81 df ff ff call 10dc8a <_Thread_Enable_dispatch>
#ifdef RTEMS_POSIX_API
pipe_interruptible(pipe);
#endif
*pipep = pipe;
if (c ++ == 'z')
10fd09: a0 a8 50 12 00 mov 0x1250a8,%al
10fd0e: 8d 50 01 lea 0x1(%eax),%edx
10fd11: 88 15 a8 50 12 00 mov %dl,0x1250a8
10fd17: 83 c4 10 add $0x10,%esp
10fd1a: 3c 7a cmp $0x7a,%al
10fd1c: 75 50 jne 10fd6e <fifo_open+0x1eb>
c = 'a';
10fd1e: c6 05 a8 50 12 00 61 movb $0x61,0x1250a8
10fd25: eb 47 jmp 10fd6e <fifo_open+0x1eb>
return 0;
err_sem:
rtems_barrier_delete(pipe->writeBarrier);
10fd27: 83 ec 0c sub $0xc,%esp
10fd2a: 8b 55 d4 mov -0x2c(%ebp),%edx
10fd2d: ff 72 30 pushl 0x30(%edx)
10fd30: e8 3b 18 00 00 call 111570 <rtems_barrier_delete>
10fd35: 83 c4 10 add $0x10,%esp
err_wbar:
rtems_barrier_delete(pipe->readBarrier);
10fd38: 83 ec 0c sub $0xc,%esp
10fd3b: 8b 45 d4 mov -0x2c(%ebp),%eax
10fd3e: ff 70 2c pushl 0x2c(%eax)
10fd41: e8 2a 18 00 00 call 111570 <rtems_barrier_delete>
10fd46: 83 c4 10 add $0x10,%esp
err_rbar:
free(pipe->Buffer);
10fd49: 83 ec 0c sub $0xc,%esp
10fd4c: 8b 55 d4 mov -0x2c(%ebp),%edx
10fd4f: ff 32 pushl (%edx)
10fd51: e8 66 8c ff ff call 1089bc <free>
10fd56: 83 c4 10 add $0x10,%esp
err_buf:
free(pipe);
10fd59: 83 ec 0c sub $0xc,%esp
10fd5c: ff 75 d4 pushl -0x2c(%ebp)
10fd5f: e8 58 8c ff ff call 1089bc <free>
10fd64: 83 c4 10 add $0x10,%esp
if (err)
goto out;
}
if (! PIPE_LOCK(pipe))
err = -EINTR;
10fd67: be f4 ff ff ff mov $0xfffffff4,%esi
10fd6c: eb 33 jmp 10fda1 <fifo_open+0x21e>
err = pipe_alloc(&pipe);
if (err)
goto out;
}
if (! PIPE_LOCK(pipe))
10fd6e: 50 push %eax
10fd6f: 6a 00 push $0x0
10fd71: 6a 00 push $0x0
10fd73: ff 73 28 pushl 0x28(%ebx)
10fd76: e8 e5 be ff ff call 10bc60 <rtems_semaphore_obtain>
10fd7b: 83 c4 10 add $0x10,%esp
10fd7e: 85 c0 test %eax,%eax
10fd80: 74 05 je 10fd87 <fifo_open+0x204> <== ALWAYS TAKEN
err = -EINTR;
10fd82: be fc ff ff ff mov $0xfffffffc,%esi <== NOT EXECUTED
if (*pipep == NULL) {
10fd87: 8b 45 08 mov 0x8(%ebp),%eax
10fd8a: 83 38 00 cmpl $0x0,(%eax)
10fd8d: 75 12 jne 10fda1 <fifo_open+0x21e>
if (err)
10fd8f: 85 f6 test %esi,%esi
10fd91: 74 09 je 10fd9c <fifo_open+0x219> <== ALWAYS TAKEN
pipe_free(pipe);
10fd93: 89 d8 mov %ebx,%eax <== NOT EXECUTED
10fd95: e8 1c fd ff ff call 10fab6 <pipe_free> <== NOT EXECUTED
10fd9a: eb 05 jmp 10fda1 <fifo_open+0x21e> <== NOT EXECUTED
else
*pipep = pipe;
10fd9c: 8b 55 08 mov 0x8(%ebp),%edx
10fd9f: 89 1a mov %ebx,(%edx)
}
out:
pipe_unlock();
10fda1: e8 fa fc ff ff call 10faa0 <pipe_unlock>
pipe_control_t *pipe;
unsigned int prevCounter;
int err;
err = pipe_new(pipep);
if (err)
10fda6: 85 f6 test %esi,%esi
10fda8: 0f 85 94 01 00 00 jne 10ff42 <fifo_open+0x3bf>
return err;
pipe = *pipep;
10fdae: 8b 45 08 mov 0x8(%ebp),%eax
10fdb1: 8b 18 mov (%eax),%ebx
switch (LIBIO_ACCMODE(iop)) {
10fdb3: 8b 55 0c mov 0xc(%ebp),%edx
10fdb6: 8b 42 14 mov 0x14(%edx),%eax
10fdb9: 83 e0 06 and $0x6,%eax
10fdbc: 83 f8 04 cmp $0x4,%eax
10fdbf: 0f 84 91 00 00 00 je 10fe56 <fifo_open+0x2d3>
10fdc5: 83 f8 06 cmp $0x6,%eax
10fdc8: 0f 84 10 01 00 00 je 10fede <fifo_open+0x35b>
10fdce: 83 f8 02 cmp $0x2,%eax
10fdd1: 0f 85 49 01 00 00 jne 10ff20 <fifo_open+0x39d> <== NEVER TAKEN
case LIBIO_FLAGS_READ:
pipe->readerCounter ++;
10fdd7: ff 43 20 incl 0x20(%ebx)
if (pipe->Readers ++ == 0)
10fdda: 8b 43 10 mov 0x10(%ebx),%eax
10fddd: 8d 50 01 lea 0x1(%eax),%edx
10fde0: 89 53 10 mov %edx,0x10(%ebx)
10fde3: 85 c0 test %eax,%eax
10fde5: 75 11 jne 10fdf8 <fifo_open+0x275> <== NEVER TAKEN
PIPE_WAKEUPWRITERS(pipe);
10fde7: 57 push %edi
10fde8: 57 push %edi
10fde9: 8d 45 e4 lea -0x1c(%ebp),%eax
10fdec: 50 push %eax
10fded: ff 73 30 pushl 0x30(%ebx)
10fdf0: e8 03 18 00 00 call 1115f8 <rtems_barrier_release>
10fdf5: 83 c4 10 add $0x10,%esp
if (pipe->Writers == 0) {
10fdf8: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
10fdfc: 0f 85 1e 01 00 00 jne 10ff20 <fifo_open+0x39d>
/* Not an error */
if (LIBIO_NODELAY(iop))
10fe02: 8b 45 0c mov 0xc(%ebp),%eax
10fe05: f6 40 14 01 testb $0x1,0x14(%eax)
10fe09: 0f 85 11 01 00 00 jne 10ff20 <fifo_open+0x39d>
break;
prevCounter = pipe->writerCounter;
10fe0f: 8b 7b 24 mov 0x24(%ebx),%edi
err = -EINTR;
/* Wait until a writer opens the pipe */
do {
PIPE_UNLOCK(pipe);
10fe12: 83 ec 0c sub $0xc,%esp
10fe15: ff 73 28 pushl 0x28(%ebx)
10fe18: e8 2f bf ff ff call 10bd4c <rtems_semaphore_release>
if (! PIPE_READWAIT(pipe))
10fe1d: 5a pop %edx
10fe1e: 59 pop %ecx
10fe1f: 6a 00 push $0x0
10fe21: ff 73 2c pushl 0x2c(%ebx)
10fe24: e8 27 18 00 00 call 111650 <rtems_barrier_wait>
10fe29: 83 c4 10 add $0x10,%esp
10fe2c: 85 c0 test %eax,%eax
10fe2e: 0f 85 f9 00 00 00 jne 10ff2d <fifo_open+0x3aa> <== NEVER TAKEN
goto out_error;
if (! PIPE_LOCK(pipe))
10fe34: 50 push %eax
10fe35: 6a 00 push $0x0
10fe37: 6a 00 push $0x0
10fe39: ff 73 28 pushl 0x28(%ebx)
10fe3c: e8 1f be ff ff call 10bc60 <rtems_semaphore_obtain>
10fe41: 83 c4 10 add $0x10,%esp
10fe44: 85 c0 test %eax,%eax
10fe46: 0f 85 e1 00 00 00 jne 10ff2d <fifo_open+0x3aa> <== NEVER TAKEN
goto out_error;
} while (prevCounter == pipe->writerCounter);
10fe4c: 3b 7b 24 cmp 0x24(%ebx),%edi
10fe4f: 74 c1 je 10fe12 <fifo_open+0x28f> <== NEVER TAKEN
10fe51: e9 ca 00 00 00 jmp 10ff20 <fifo_open+0x39d>
}
break;
case LIBIO_FLAGS_WRITE:
pipe->writerCounter ++;
10fe56: ff 43 24 incl 0x24(%ebx)
if (pipe->Writers ++ == 0)
10fe59: 8b 43 14 mov 0x14(%ebx),%eax
10fe5c: 8d 50 01 lea 0x1(%eax),%edx
10fe5f: 89 53 14 mov %edx,0x14(%ebx)
10fe62: 85 c0 test %eax,%eax
10fe64: 75 11 jne 10fe77 <fifo_open+0x2f4> <== NEVER TAKEN
PIPE_WAKEUPREADERS(pipe);
10fe66: 57 push %edi
10fe67: 57 push %edi
10fe68: 8d 45 e4 lea -0x1c(%ebp),%eax
10fe6b: 50 push %eax
10fe6c: ff 73 2c pushl 0x2c(%ebx)
10fe6f: e8 84 17 00 00 call 1115f8 <rtems_barrier_release>
10fe74: 83 c4 10 add $0x10,%esp
if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) {
10fe77: 83 7b 10 00 cmpl $0x0,0x10(%ebx)
10fe7b: 0f 85 9f 00 00 00 jne 10ff20 <fifo_open+0x39d>
10fe81: 8b 55 0c mov 0xc(%ebp),%edx
10fe84: f6 42 14 01 testb $0x1,0x14(%edx)
10fe88: 74 18 je 10fea2 <fifo_open+0x31f>
PIPE_UNLOCK(pipe);
10fe8a: 83 ec 0c sub $0xc,%esp
10fe8d: ff 73 28 pushl 0x28(%ebx)
10fe90: e8 b7 be ff ff call 10bd4c <rtems_semaphore_release>
err = -ENXIO;
goto out_error;
10fe95: 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;
10fe98: be fa ff ff ff mov $0xfffffffa,%esi
goto out_error;
10fe9d: e9 90 00 00 00 jmp 10ff32 <fifo_open+0x3af>
}
if (pipe->Readers == 0) {
prevCounter = pipe->readerCounter;
10fea2: 8b 7b 20 mov 0x20(%ebx),%edi
err = -EINTR;
do {
PIPE_UNLOCK(pipe);
10fea5: 83 ec 0c sub $0xc,%esp
10fea8: ff 73 28 pushl 0x28(%ebx)
10feab: e8 9c be ff ff call 10bd4c <rtems_semaphore_release>
if (! PIPE_WRITEWAIT(pipe))
10feb0: 5a pop %edx
10feb1: 59 pop %ecx
10feb2: 6a 00 push $0x0
10feb4: ff 73 30 pushl 0x30(%ebx)
10feb7: e8 94 17 00 00 call 111650 <rtems_barrier_wait>
10febc: 83 c4 10 add $0x10,%esp
10febf: 85 c0 test %eax,%eax
10fec1: 75 6a jne 10ff2d <fifo_open+0x3aa> <== NEVER TAKEN
goto out_error;
if (! PIPE_LOCK(pipe))
10fec3: 50 push %eax
10fec4: 6a 00 push $0x0
10fec6: 6a 00 push $0x0
10fec8: ff 73 28 pushl 0x28(%ebx)
10fecb: e8 90 bd ff ff call 10bc60 <rtems_semaphore_obtain>
10fed0: 83 c4 10 add $0x10,%esp
10fed3: 85 c0 test %eax,%eax
10fed5: 75 56 jne 10ff2d <fifo_open+0x3aa> <== NEVER TAKEN
goto out_error;
} while (prevCounter == pipe->readerCounter);
10fed7: 3b 7b 20 cmp 0x20(%ebx),%edi
10feda: 74 c9 je 10fea5 <fifo_open+0x322> <== NEVER TAKEN
10fedc: eb 42 jmp 10ff20 <fifo_open+0x39d>
}
break;
case LIBIO_FLAGS_READ_WRITE:
pipe->readerCounter ++;
10fede: ff 43 20 incl 0x20(%ebx)
if (pipe->Readers ++ == 0)
10fee1: 8b 43 10 mov 0x10(%ebx),%eax
10fee4: 8d 50 01 lea 0x1(%eax),%edx
10fee7: 89 53 10 mov %edx,0x10(%ebx)
10feea: 85 c0 test %eax,%eax
10feec: 75 11 jne 10feff <fifo_open+0x37c> <== NEVER TAKEN
PIPE_WAKEUPWRITERS(pipe);
10feee: 51 push %ecx
10feef: 51 push %ecx
10fef0: 8d 45 e4 lea -0x1c(%ebp),%eax
10fef3: 50 push %eax
10fef4: ff 73 30 pushl 0x30(%ebx)
10fef7: e8 fc 16 00 00 call 1115f8 <rtems_barrier_release>
10fefc: 83 c4 10 add $0x10,%esp
pipe->writerCounter ++;
10feff: ff 43 24 incl 0x24(%ebx)
if (pipe->Writers ++ == 0)
10ff02: 8b 43 14 mov 0x14(%ebx),%eax
10ff05: 8d 50 01 lea 0x1(%eax),%edx
10ff08: 89 53 14 mov %edx,0x14(%ebx)
10ff0b: 85 c0 test %eax,%eax
10ff0d: 75 11 jne 10ff20 <fifo_open+0x39d> <== NEVER TAKEN
PIPE_WAKEUPREADERS(pipe);
10ff0f: 52 push %edx
10ff10: 52 push %edx
10ff11: 8d 45 e4 lea -0x1c(%ebp),%eax
10ff14: 50 push %eax
10ff15: ff 73 2c pushl 0x2c(%ebx)
10ff18: e8 db 16 00 00 call 1115f8 <rtems_barrier_release>
10ff1d: 83 c4 10 add $0x10,%esp
break;
}
PIPE_UNLOCK(pipe);
10ff20: 83 ec 0c sub $0xc,%esp
10ff23: ff 73 28 pushl 0x28(%ebx)
10ff26: e8 21 be ff ff call 10bd4c <rtems_semaphore_release>
10ff2b: eb 12 jmp 10ff3f <fifo_open+0x3bc>
goto out_error;
}
if (pipe->Readers == 0) {
prevCounter = pipe->readerCounter;
err = -EINTR;
10ff2d: be fc ff ff ff mov $0xfffffffc,%esi <== NOT EXECUTED
PIPE_UNLOCK(pipe);
return 0;
out_error:
pipe_release(pipep, iop);
10ff32: 50 push %eax
10ff33: 50 push %eax
10ff34: ff 75 0c pushl 0xc(%ebp)
10ff37: ff 75 08 pushl 0x8(%ebp)
10ff3a: e8 b2 fb ff ff call 10faf1 <pipe_release>
return err;
10ff3f: 83 c4 10 add $0x10,%esp
}
10ff42: 89 f0 mov %esi,%eax
10ff44: 8d 65 f4 lea -0xc(%ebp),%esp
10ff47: 5b pop %ebx
10ff48: 5e pop %esi
10ff49: 5f pop %edi
10ff4a: c9 leave
10ff4b: c3 ret
00107dac <fpathconf>:
long fpathconf(
int fd,
int name
)
{
107dac: 55 push %ebp
107dad: 89 e5 mov %esp,%ebp
107daf: 83 ec 08 sub $0x8,%esp
107db2: 8b 45 08 mov 0x8(%ebp),%eax
107db5: 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);
107db8: 3b 05 44 21 12 00 cmp 0x122144,%eax
107dbe: 73 11 jae 107dd1 <fpathconf+0x25>
iop = rtems_libio_iop(fd);
107dc0: 6b c0 38 imul $0x38,%eax,%eax
107dc3: 03 05 f8 61 12 00 add 0x1261f8,%eax
rtems_libio_check_is_open(iop);
107dc9: 8b 48 14 mov 0x14(%eax),%ecx
107dcc: f6 c5 01 test $0x1,%ch
107dcf: 75 0d jne 107dde <fpathconf+0x32> <== ALWAYS TAKEN
107dd1: e8 ba a1 00 00 call 111f90 <__errno>
107dd6: c7 00 09 00 00 00 movl $0x9,(%eax)
107ddc: eb 5b jmp 107e39 <fpathconf+0x8d>
rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ);
107dde: 80 e1 02 and $0x2,%cl
107de1: 74 4b je 107e2e <fpathconf+0x82>
/*
* Now process the information request.
*/
the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options;
107de3: 8b 40 28 mov 0x28(%eax),%eax
switch ( name ) {
107de6: 83 fa 0b cmp $0xb,%edx
107de9: 77 43 ja 107e2e <fpathconf+0x82>
107deb: ff 24 95 dc 08 12 00 jmp *0x1208dc(,%edx,4)
case _PC_LINK_MAX:
return_value = the_limits->link_max;
107df2: 8b 40 38 mov 0x38(%eax),%eax
break;
107df5: eb 45 jmp 107e3c <fpathconf+0x90>
case _PC_MAX_CANON:
return_value = the_limits->max_canon;
107df7: 8b 40 3c mov 0x3c(%eax),%eax
break;
107dfa: eb 40 jmp 107e3c <fpathconf+0x90>
case _PC_MAX_INPUT:
return_value = the_limits->max_input;
107dfc: 8b 40 40 mov 0x40(%eax),%eax
break;
107dff: eb 3b jmp 107e3c <fpathconf+0x90>
case _PC_NAME_MAX:
return_value = the_limits->name_max;
107e01: 8b 40 44 mov 0x44(%eax),%eax
break;
107e04: eb 36 jmp 107e3c <fpathconf+0x90>
case _PC_PATH_MAX:
return_value = the_limits->path_max;
107e06: 8b 40 48 mov 0x48(%eax),%eax
break;
107e09: eb 31 jmp 107e3c <fpathconf+0x90>
case _PC_PIPE_BUF:
return_value = the_limits->pipe_buf;
107e0b: 8b 40 4c mov 0x4c(%eax),%eax
break;
107e0e: eb 2c jmp 107e3c <fpathconf+0x90>
case _PC_CHOWN_RESTRICTED:
return_value = the_limits->posix_chown_restrictions;
107e10: 8b 40 54 mov 0x54(%eax),%eax
break;
107e13: eb 27 jmp 107e3c <fpathconf+0x90>
case _PC_NO_TRUNC:
return_value = the_limits->posix_no_trunc;
107e15: 8b 40 58 mov 0x58(%eax),%eax
break;
107e18: eb 22 jmp 107e3c <fpathconf+0x90>
case _PC_VDISABLE:
return_value = the_limits->posix_vdisable;
107e1a: 8b 40 64 mov 0x64(%eax),%eax
break;
107e1d: eb 1d jmp 107e3c <fpathconf+0x90>
case _PC_ASYNC_IO:
return_value = the_limits->posix_async_io;
107e1f: 8b 40 50 mov 0x50(%eax),%eax
break;
107e22: eb 18 jmp 107e3c <fpathconf+0x90>
case _PC_PRIO_IO:
return_value = the_limits->posix_prio_io;
107e24: 8b 40 5c mov 0x5c(%eax),%eax
break;
107e27: eb 13 jmp 107e3c <fpathconf+0x90>
case _PC_SYNC_IO:
return_value = the_limits->posix_sync_io;
107e29: 8b 40 60 mov 0x60(%eax),%eax
break;
107e2c: eb 0e jmp 107e3c <fpathconf+0x90>
default:
rtems_set_errno_and_return_minus_one( EINVAL );
107e2e: e8 5d a1 00 00 call 111f90 <__errno>
107e33: c7 00 16 00 00 00 movl $0x16,(%eax)
107e39: 83 c8 ff or $0xffffffff,%eax
break;
}
return return_value;
}
107e3c: c9 leave
107e3d: c3 ret
00107378 <free>:
#include <stdlib.h>
void free(
void *ptr
)
{
107378: 55 push %ebp
107379: 89 e5 mov %esp,%ebp
10737b: 53 push %ebx
10737c: 83 ec 04 sub $0x4,%esp
10737f: 8b 5d 08 mov 0x8(%ebp),%ebx
MSBUMP(free_calls, 1);
107382: ff 05 1c 52 12 00 incl 0x12521c
if ( !ptr )
107388: 85 db test %ebx,%ebx
10738a: 74 5f je 1073eb <free+0x73>
return;
/*
* Do not attempt to free memory if in a critical section or ISR.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
10738c: 83 3d 9c 54 12 00 03 cmpl $0x3,0x12549c
107393: 75 15 jne 1073aa <free+0x32> <== NEVER TAKEN
!malloc_is_system_state_OK() ) {
107395: e8 56 01 00 00 call 1074f0 <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()) &&
10739a: 84 c0 test %al,%al
10739c: 75 0c jne 1073aa <free+0x32>
!malloc_is_system_state_OK() ) {
malloc_deferred_free(ptr);
10739e: 89 5d 08 mov %ebx,0x8(%ebp)
RTEMS_Malloc_Heap->area_begin,
RTEMS_Malloc_Heap->area_end
);
}
}
1073a1: 8b 5d fc mov -0x4(%ebp),%ebx
1073a4: 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);
1073a5: e9 ae 01 00 00 jmp 107558 <malloc_deferred_free>
}
/*
* If configured, update the statistics
*/
if ( rtems_malloc_statistics_helpers )
1073aa: a1 70 36 12 00 mov 0x123670,%eax
1073af: 85 c0 test %eax,%eax
1073b1: 74 0a je 1073bd <free+0x45>
(*rtems_malloc_statistics_helpers->at_free)(ptr);
1073b3: 83 ec 0c sub $0xc,%esp
1073b6: 53 push %ebx
1073b7: ff 50 08 call *0x8(%eax)
1073ba: 83 c4 10 add $0x10,%esp
if ( !_Protected_heap_Free( RTEMS_Malloc_Heap, ptr ) ) {
1073bd: 50 push %eax
1073be: 50 push %eax
1073bf: 53 push %ebx
1073c0: ff 35 80 11 12 00 pushl 0x121180
1073c6: e8 39 46 00 00 call 10ba04 <_Protected_heap_Free>
1073cb: 83 c4 10 add $0x10,%esp
1073ce: 84 c0 test %al,%al
1073d0: 75 19 jne 1073eb <free+0x73>
printk( "Program heap: free of bad pointer %p -- range %p - %p \n",
ptr,
RTEMS_Malloc_Heap->area_begin,
RTEMS_Malloc_Heap->area_end
1073d2: a1 80 11 12 00 mov 0x121180,%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",
1073d7: ff 70 1c pushl 0x1c(%eax)
1073da: ff 70 18 pushl 0x18(%eax)
1073dd: 53 push %ebx
1073de: 68 87 ef 11 00 push $0x11ef87
1073e3: e8 fc 0b 00 00 call 107fe4 <printk>
1073e8: 83 c4 10 add $0x10,%esp
RTEMS_Malloc_Heap->area_begin,
RTEMS_Malloc_Heap->area_end
);
}
}
1073eb: 8b 5d fc mov -0x4(%ebp),%ebx
1073ee: c9 leave
1073ef: c3 ret
00108614 <free_user_env>:
* NOTE: this must be called with
* thread dispatching disabled!
*/
static void
free_user_env(void *venv)
{
108614: 55 push %ebp
108615: 89 e5 mov %esp,%ebp
108617: 53 push %ebx
108618: 83 ec 04 sub $0x4,%esp
10861b: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_user_env_t *env = (rtems_user_env_t*) venv ;
if (env != &rtems_global_user_env
10861e: 81 fb 48 52 12 00 cmp $0x125248,%ebx
108624: 74 26 je 10864c <free_user_env+0x38> <== NEVER TAKEN
#ifdef HAVE_USERENV_REFCNT
&& --env->refcnt <= 0
#endif
) {
rtems_filesystem_freenode( &env->current_directory);
108626: 83 ec 0c sub $0xc,%esp
108629: 8d 43 04 lea 0x4(%ebx),%eax
10862c: 50 push %eax
10862d: e8 46 f1 ff ff call 107778 <rtems_filesystem_freenode>
rtems_filesystem_freenode( &env->root_directory);
108632: 8d 43 18 lea 0x18(%ebx),%eax
108635: 89 04 24 mov %eax,(%esp)
108638: e8 3b f1 ff ff call 107778 <rtems_filesystem_freenode>
free(env);
10863d: 83 c4 10 add $0x10,%esp
108640: 89 5d 08 mov %ebx,0x8(%ebp)
}
}
108643: 8b 5d fc mov -0x4(%ebp),%ebx
108646: c9 leave
&& --env->refcnt <= 0
#endif
) {
rtems_filesystem_freenode( &env->current_directory);
rtems_filesystem_freenode( &env->root_directory);
free(env);
108647: e9 40 f1 ff ff jmp 10778c <free>
}
}
10864c: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
10864f: c9 leave <== NOT EXECUTED
108650: c3 ret <== NOT EXECUTED
0011e7a8 <getdents>:
int getdents(
int dd_fd,
char *dd_buf,
int dd_len
)
{
11e7a8: 55 push %ebp
11e7a9: 89 e5 mov %esp,%ebp
11e7ab: 57 push %edi
11e7ac: 56 push %esi
11e7ad: 53 push %ebx
11e7ae: 83 ec 2c sub $0x2c,%esp
11e7b1: 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 );
11e7b4: 31 db xor %ebx,%ebx
11e7b6: 3b 05 44 31 12 00 cmp 0x123144,%eax
11e7bc: 73 09 jae 11e7c7 <getdents+0x1f> <== NEVER TAKEN
11e7be: 6b d8 38 imul $0x38,%eax,%ebx
11e7c1: 03 1d 40 73 12 00 add 0x127340,%ebx
/*
* Make sure we are working on a directory
*/
loc = iop->pathinfo;
11e7c7: 8d 7d d4 lea -0x2c(%ebp),%edi
11e7ca: 8d 73 18 lea 0x18(%ebx),%esi
11e7cd: b9 05 00 00 00 mov $0x5,%ecx
11e7d2: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY )
11e7d4: 83 ec 0c sub $0xc,%esp
11e7d7: 8d 45 d4 lea -0x2c(%ebp),%eax
11e7da: 50 push %eax
11e7db: 8b 45 e0 mov -0x20(%ebp),%eax
11e7de: ff 50 10 call *0x10(%eax)
11e7e1: 83 c4 10 add $0x10,%esp
11e7e4: 48 dec %eax
11e7e5: 74 10 je 11e7f7 <getdents+0x4f>
rtems_set_errno_and_return_minus_one( ENOTDIR );
11e7e7: e8 d4 38 ff ff call 1120c0 <__errno>
11e7ec: c7 00 14 00 00 00 movl $0x14,(%eax)
11e7f2: 83 c8 ff or $0xffffffff,%eax
11e7f5: eb 11 jmp 11e808 <getdents+0x60>
/*
* 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 );
11e7f7: 50 push %eax
11e7f8: 8b 43 20 mov 0x20(%ebx),%eax
11e7fb: ff 75 10 pushl 0x10(%ebp)
11e7fe: ff 75 0c pushl 0xc(%ebp)
11e801: 53 push %ebx
11e802: ff 50 08 call *0x8(%eax)
11e805: 83 c4 10 add $0x10,%esp
}
11e808: 8d 65 f4 lea -0xc(%ebp),%esp
11e80b: 5b pop %ebx
11e80c: 5e pop %esi
11e80d: 5f pop %edi
11e80e: c9 leave
11e80f: c3 ret
00107f88 <getpwent>:
struct passwd *getpwent(void)
{
107f88: 55 push %ebp
107f89: 89 e5 mov %esp,%ebp
107f8b: 83 ec 08 sub $0x8,%esp
if (passwd_fp == NULL)
107f8e: a1 94 6c 12 00 mov 0x126c94,%eax
return NULL;
107f93: 31 d2 xor %edx,%edx
return p;
}
struct passwd *getpwent(void)
{
if (passwd_fp == NULL)
107f95: 85 c0 test %eax,%eax
107f97: 74 29 je 107fc2 <getpwent+0x3a> <== NEVER TAKEN
return NULL;
if (!scanpw(passwd_fp, &pwent, pwbuf, sizeof pwbuf))
107f99: 83 ec 0c sub $0xc,%esp
107f9c: 68 c8 00 00 00 push $0xc8
107fa1: b9 b4 6c 12 00 mov $0x126cb4,%ecx
107fa6: ba 98 6c 12 00 mov $0x126c98,%edx
107fab: e8 e9 fb ff ff call 107b99 <scanpw>
107fb0: 83 c4 10 add $0x10,%esp
return NULL;
107fb3: 31 d2 xor %edx,%edx
107fb5: 85 c0 test %eax,%eax
107fb7: 0f 95 c2 setne %dl
107fba: f7 da neg %edx
107fbc: 81 e2 98 6c 12 00 and $0x126c98,%edx
return &pwent;
}
107fc2: 89 d0 mov %edx,%eax
107fc4: c9 leave
107fc5: c3 ret
00110710 <imfs_dir_open>:
rtems_libio_t *iop,
const char *pathname,
uint32_t flag,
uint32_t mode
)
{
110710: 55 push %ebp
110711: 89 e5 mov %esp,%ebp
110713: 8b 55 08 mov 0x8(%ebp),%edx
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 )
110716: 8b 4a 18 mov 0x18(%edx),%ecx
return -1; /* It wasn't a directory --> return error */
110719: 83 c8 ff or $0xffffffff,%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 )
11071c: 83 79 4c 01 cmpl $0x1,0x4c(%ecx)
110720: 75 10 jne 110732 <imfs_dir_open+0x22> <== NEVER TAKEN
return -1; /* It wasn't a directory --> return error */
iop->offset = 0;
110722: c7 42 0c 00 00 00 00 movl $0x0,0xc(%edx)
110729: c7 42 10 00 00 00 00 movl $0x0,0x10(%edx)
return 0;
110730: 31 c0 xor %eax,%eax
}
110732: c9 leave
110733: c3 ret
00110979 <imfs_dir_rmnod>:
int imfs_dir_rmnod(
rtems_filesystem_location_info_t *parent_pathloc, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN */
)
{
110979: 55 push %ebp
11097a: 89 e5 mov %esp,%ebp
11097c: 53 push %ebx
11097d: 83 ec 04 sub $0x4,%esp
110980: 8b 45 0c mov 0xc(%ebp),%eax
IMFS_jnode_t *the_jnode;
the_jnode = (IMFS_jnode_t *) pathloc->node_access;
110983: 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 );
110985: 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 ) )
110988: 39 53 50 cmp %edx,0x50(%ebx)
11098b: 74 0d je 11099a <imfs_dir_rmnod+0x21>
rtems_set_errno_and_return_minus_one( ENOTEMPTY );
11098d: e8 a6 07 00 00 call 111138 <__errno>
110992: c7 00 5a 00 00 00 movl $0x5a,(%eax)
110998: eb 13 jmp 1109ad <imfs_dir_rmnod+0x34>
/*
* You cannot remove the file system root node.
*/
if ( pathloc->mt_entry->mt_fs_root.node_access == pathloc->node_access )
11099a: 8b 40 10 mov 0x10(%eax),%eax
11099d: 39 58 1c cmp %ebx,0x1c(%eax)
1109a0: 75 10 jne 1109b2 <imfs_dir_rmnod+0x39>
rtems_set_errno_and_return_minus_one( EBUSY );
1109a2: e8 91 07 00 00 call 111138 <__errno>
1109a7: c7 00 10 00 00 00 movl $0x10,(%eax)
1109ad: 83 c8 ff or $0xffffffff,%eax
1109b0: eb 1c jmp 1109ce <imfs_dir_rmnod+0x55>
/*
* You cannot remove a mountpoint.
*/
if ( the_jnode->info.directory.mt_fs != NULL )
1109b2: 83 7b 5c 00 cmpl $0x0,0x5c(%ebx)
1109b6: 75 ea jne 1109a2 <imfs_dir_rmnod+0x29> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EBUSY );
IMFS_create_orphan( the_jnode );
1109b8: 83 ec 0c sub $0xc,%esp
1109bb: 53 push %ebx
1109bc: e8 1b d5 ff ff call 10dedc <IMFS_create_orphan>
IMFS_check_node_remove( the_jnode );
1109c1: 89 1c 24 mov %ebx,(%esp)
1109c4: e8 55 d5 ff ff call 10df1e <IMFS_check_node_remove>
return 0;
1109c9: 83 c4 10 add $0x10,%esp
1109cc: 31 c0 xor %eax,%eax
}
1109ce: 8b 5d fc mov -0x4(%ebp),%ebx
1109d1: c9 leave
1109d2: c3 ret
00107c9c <init_etc_passwd_group>:
/*
* Initialize useable but dummy databases
*/
void init_etc_passwd_group(void)
{
107c9c: 55 push %ebp
107c9d: 89 e5 mov %esp,%ebp
107c9f: 53 push %ebx
107ca0: 83 ec 04 sub $0x4,%esp
FILE *fp;
static char etc_passwd_initted = 0;
if (etc_passwd_initted)
107ca3: 80 3d 7c 6d 12 00 00 cmpb $0x0,0x126d7c
107caa: 0f 85 b8 00 00 00 jne 107d68 <init_etc_passwd_group+0xcc>
return;
etc_passwd_initted = 1;
107cb0: c6 05 7c 6d 12 00 01 movb $0x1,0x126d7c
mkdir("/etc", 0777);
107cb7: 50 push %eax
107cb8: 50 push %eax
107cb9: 68 ff 01 00 00 push $0x1ff
107cbe: 68 13 08 12 00 push $0x120813
107cc3: e8 7c 07 00 00 call 108444 <mkdir>
/*
* Initialize /etc/passwd
*/
if ((fp = fopen("/etc/passwd", "r")) != NULL) {
107cc8: 59 pop %ecx
107cc9: 5b pop %ebx
107cca: 68 12 f5 11 00 push $0x11f512
107ccf: 68 18 08 12 00 push $0x120818
107cd4: e8 3b aa 00 00 call 112714 <fopen>
107cd9: 83 c4 10 add $0x10,%esp
107cdc: 85 c0 test %eax,%eax
107cde: 74 06 je 107ce6 <init_etc_passwd_group+0x4a>
fclose(fp);
107ce0: 83 ec 0c sub $0xc,%esp
107ce3: 50 push %eax
107ce4: eb 2a jmp 107d10 <init_etc_passwd_group+0x74>
}
else if ((fp = fopen("/etc/passwd", "w")) != NULL) {
107ce6: 52 push %edx
107ce7: 52 push %edx
107ce8: 68 2c f4 11 00 push $0x11f42c
107ced: 68 18 08 12 00 push $0x120818
107cf2: e8 1d aa 00 00 call 112714 <fopen>
107cf7: 89 c3 mov %eax,%ebx
107cf9: 83 c4 10 add $0x10,%esp
107cfc: 85 c0 test %eax,%eax
107cfe: 74 18 je 107d18 <init_etc_passwd_group+0x7c><== NEVER TAKEN
fprintf(fp, "root:*:0:0:root::/:/bin/sh\n"
107d00: 50 push %eax
107d01: 50 push %eax
107d02: 53 push %ebx
107d03: 68 24 08 12 00 push $0x120824
107d08: e8 d3 aa 00 00 call 1127e0 <fputs>
"rtems:*:1:1:RTEMS Application::/:/bin/sh\n"
"tty:!:2:2:tty owner::/:/bin/false\n" );
fclose(fp);
107d0d: 89 1c 24 mov %ebx,(%esp)
107d10: e8 fb a2 00 00 call 112010 <fclose>
107d15: 83 c4 10 add $0x10,%esp
}
/*
* Initialize /etc/group
*/
if ((fp = fopen("/etc/group", "r")) != NULL) {
107d18: 51 push %ecx
107d19: 51 push %ecx
107d1a: 68 12 f5 11 00 push $0x11f512
107d1f: 68 8b 08 12 00 push $0x12088b
107d24: e8 eb a9 00 00 call 112714 <fopen>
107d29: 83 c4 10 add $0x10,%esp
107d2c: 85 c0 test %eax,%eax
107d2e: 74 06 je 107d36 <init_etc_passwd_group+0x9a>
fclose(fp);
107d30: 83 ec 0c sub $0xc,%esp
107d33: 50 push %eax
107d34: eb 2a jmp 107d60 <init_etc_passwd_group+0xc4>
}
else if ((fp = fopen("/etc/group", "w")) != NULL) {
107d36: 52 push %edx
107d37: 52 push %edx
107d38: 68 2c f4 11 00 push $0x11f42c
107d3d: 68 8b 08 12 00 push $0x12088b
107d42: e8 cd a9 00 00 call 112714 <fopen>
107d47: 89 c3 mov %eax,%ebx
107d49: 83 c4 10 add $0x10,%esp
107d4c: 85 c0 test %eax,%eax
107d4e: 74 18 je 107d68 <init_etc_passwd_group+0xcc><== NEVER TAKEN
fprintf( fp, "root:x:0:root\n"
107d50: 50 push %eax
107d51: 50 push %eax
107d52: 53 push %ebx
107d53: 68 96 08 12 00 push $0x120896
107d58: e8 83 aa 00 00 call 1127e0 <fputs>
"rtems:x:1:rtems\n"
"tty:x:2:tty\n" );
fclose(fp);
107d5d: 89 1c 24 mov %ebx,(%esp)
107d60: e8 ab a2 00 00 call 112010 <fclose>
107d65: 83 c4 10 add $0x10,%esp
}
}
107d68: 8b 5d fc mov -0x4(%ebp),%ebx
107d6b: c9 leave
107d6c: c3 ret
00108e60 <iproc>:
/*
* Process a single input character
*/
static int
iproc (unsigned char c, struct rtems_termios_tty *tty)
{
108e60: 55 push %ebp
108e61: 89 e5 mov %esp,%ebp
108e63: 53 push %ebx
108e64: 83 ec 14 sub $0x14,%esp
108e67: 89 d3 mov %edx,%ebx
108e69: 88 c1 mov %al,%cl
if (tty->termios.c_iflag & ISTRIP)
108e6b: 8b 52 30 mov 0x30(%edx),%edx
108e6e: f6 c2 20 test $0x20,%dl
108e71: 74 03 je 108e76 <iproc+0x16> <== ALWAYS TAKEN
c &= 0x7f;
108e73: 83 e1 7f and $0x7f,%ecx <== NOT EXECUTED
if (tty->termios.c_iflag & IUCLC)
108e76: f6 c6 02 test $0x2,%dh
108e79: 74 16 je 108e91 <iproc+0x31>
c = tolower (c);
108e7b: 0f b6 c9 movzbl %cl,%ecx
108e7e: a1 3c 31 12 00 mov 0x12313c,%eax
108e83: 0f be 44 08 01 movsbl 0x1(%eax,%ecx,1),%eax
108e88: 83 e0 03 and $0x3,%eax
108e8b: 48 dec %eax
108e8c: 75 03 jne 108e91 <iproc+0x31>
108e8e: 83 c1 20 add $0x20,%ecx
if (c == '\r') {
108e91: 80 f9 0d cmp $0xd,%cl
108e94: 75 14 jne 108eaa <iproc+0x4a>
if (tty->termios.c_iflag & IGNCR)
return 0;
108e96: 31 c0 xor %eax,%eax
if (tty->termios.c_iflag & IUCLC)
c = tolower (c);
if (c == '\r') {
if (tty->termios.c_iflag & IGNCR)
108e98: f6 c2 80 test $0x80,%dl
108e9b: 0f 85 d9 00 00 00 jne 108f7a <iproc+0x11a> <== NEVER TAKEN
return 0;
if (tty->termios.c_iflag & ICRNL)
108ea1: 80 e6 01 and $0x1,%dh
108ea4: 74 1a je 108ec0 <iproc+0x60> <== NEVER TAKEN
c = '\n';
108ea6: b1 0a mov $0xa,%cl
108ea8: eb 16 jmp 108ec0 <iproc+0x60>
} else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) {
108eaa: 80 f9 0a cmp $0xa,%cl
108ead: 75 09 jne 108eb8 <iproc+0x58>
108eaf: 80 e2 40 and $0x40,%dl
108eb2: 74 0c je 108ec0 <iproc+0x60> <== ALWAYS TAKEN
c = '\r';
108eb4: b1 0d mov $0xd,%cl <== NOT EXECUTED
108eb6: eb 08 jmp 108ec0 <iproc+0x60> <== NOT EXECUTED
}
if ((c != '\0') && (tty->termios.c_lflag & ICANON)) {
108eb8: 84 c9 test %cl,%cl
108eba: 0f 84 87 00 00 00 je 108f47 <iproc+0xe7> <== NEVER TAKEN
108ec0: 8b 53 3c mov 0x3c(%ebx),%edx
108ec3: f6 c2 02 test $0x2,%dl
108ec6: 74 7f je 108f47 <iproc+0xe7>
if (c == tty->termios.c_cc[VERASE]) {
108ec8: 3a 4b 43 cmp 0x43(%ebx),%cl
108ecb: 75 04 jne 108ed1 <iproc+0x71>
erase (tty, 0);
108ecd: 31 d2 xor %edx,%edx
108ecf: eb 0a jmp 108edb <iproc+0x7b>
return 0;
}
else if (c == tty->termios.c_cc[VKILL]) {
108ed1: 3a 4b 44 cmp 0x44(%ebx),%cl
108ed4: 75 11 jne 108ee7 <iproc+0x87>
erase (tty, 1);
108ed6: ba 01 00 00 00 mov $0x1,%edx
108edb: 89 d8 mov %ebx,%eax
108edd: e8 05 fe ff ff call 108ce7 <erase>
108ee2: e9 91 00 00 00 jmp 108f78 <iproc+0x118>
return 0;
}
else if (c == tty->termios.c_cc[VEOF]) {
return 1;
108ee7: b8 01 00 00 00 mov $0x1,%eax
}
else if (c == tty->termios.c_cc[VKILL]) {
erase (tty, 1);
return 0;
}
else if (c == tty->termios.c_cc[VEOF]) {
108eec: 3a 4b 45 cmp 0x45(%ebx),%cl
108eef: 0f 84 85 00 00 00 je 108f7a <iproc+0x11a> <== NEVER TAKEN
return 1;
} else if (c == '\n') {
108ef5: 80 f9 0a cmp $0xa,%cl
108ef8: 75 1a jne 108f14 <iproc+0xb4>
if (tty->termios.c_lflag & (ECHO | ECHONL))
108efa: 80 e2 48 and $0x48,%dl
108efd: 74 09 je 108f08 <iproc+0xa8> <== NEVER TAKEN
echo (c, tty);
108eff: 89 da mov %ebx,%edx
108f01: b0 0a mov $0xa,%al
108f03: e8 87 fd ff ff call 108c8f <echo>
tty->cbuf[tty->ccount++] = c;
108f08: 8b 43 20 mov 0x20(%ebx),%eax
108f0b: 8b 53 1c mov 0x1c(%ebx),%edx
108f0e: c6 04 02 0a movb $0xa,(%edx,%eax,1)
108f12: eb 28 jmp 108f3c <iproc+0xdc>
return 1;
} else if ((c == tty->termios.c_cc[VEOL]) ||
108f14: 3a 4b 4c cmp 0x4c(%ebx),%cl
108f17: 74 05 je 108f1e <iproc+0xbe> <== NEVER TAKEN
108f19: 3a 4b 51 cmp 0x51(%ebx),%cl
108f1c: 75 29 jne 108f47 <iproc+0xe7> <== ALWAYS TAKEN
(c == tty->termios.c_cc[VEOL2])) {
if (tty->termios.c_lflag & ECHO)
108f1e: 80 e2 08 and $0x8,%dl <== NOT EXECUTED
108f21: 74 10 je 108f33 <iproc+0xd3> <== NOT EXECUTED
echo (c, tty);
108f23: 0f b6 c1 movzbl %cl,%eax <== NOT EXECUTED
108f26: 89 da mov %ebx,%edx <== NOT EXECUTED
108f28: 88 4d f4 mov %cl,-0xc(%ebp) <== NOT EXECUTED
108f2b: e8 5f fd ff ff call 108c8f <echo> <== NOT EXECUTED
108f30: 8a 4d f4 mov -0xc(%ebp),%cl <== NOT EXECUTED
tty->cbuf[tty->ccount++] = c;
108f33: 8b 43 20 mov 0x20(%ebx),%eax <== NOT EXECUTED
108f36: 8b 53 1c mov 0x1c(%ebx),%edx <== NOT EXECUTED
108f39: 88 0c 02 mov %cl,(%edx,%eax,1) <== NOT EXECUTED
108f3c: 40 inc %eax
108f3d: 89 43 20 mov %eax,0x20(%ebx)
return 1;
108f40: b8 01 00 00 00 mov $0x1,%eax
108f45: eb 33 jmp 108f7a <iproc+0x11a>
}
/*
* FIXME: Should do IMAXBEL handling somehow
*/
if (tty->ccount < (CBUFSIZE-1)) {
108f47: 8b 15 70 30 12 00 mov 0x123070,%edx
108f4d: 4a dec %edx
if (tty->termios.c_lflag & ECHO)
echo (c, tty);
tty->cbuf[tty->ccount++] = c;
}
return 0;
108f4e: 31 c0 xor %eax,%eax
}
/*
* FIXME: Should do IMAXBEL handling somehow
*/
if (tty->ccount < (CBUFSIZE-1)) {
108f50: 39 53 20 cmp %edx,0x20(%ebx)
108f53: 7d 25 jge 108f7a <iproc+0x11a> <== NEVER TAKEN
if (tty->termios.c_lflag & ECHO)
108f55: f6 43 3c 08 testb $0x8,0x3c(%ebx)
108f59: 74 10 je 108f6b <iproc+0x10b> <== NEVER TAKEN
echo (c, tty);
108f5b: 0f b6 c1 movzbl %cl,%eax
108f5e: 89 da mov %ebx,%edx
108f60: 88 4d f4 mov %cl,-0xc(%ebp)
108f63: e8 27 fd ff ff call 108c8f <echo>
108f68: 8a 4d f4 mov -0xc(%ebp),%cl
tty->cbuf[tty->ccount++] = c;
108f6b: 8b 43 20 mov 0x20(%ebx),%eax
108f6e: 8b 53 1c mov 0x1c(%ebx),%edx
108f71: 88 0c 02 mov %cl,(%edx,%eax,1)
108f74: 40 inc %eax
108f75: 89 43 20 mov %eax,0x20(%ebx)
}
return 0;
108f78: 31 c0 xor %eax,%eax
}
108f7a: 83 c4 14 add $0x14,%esp
108f7d: 5b pop %ebx
108f7e: c9 leave
108f7f: c3 ret
00121f58 <killinfo>:
int killinfo(
pid_t pid,
int sig,
const union sigval *value
)
{
121f58: 55 push %ebp
121f59: 89 e5 mov %esp,%ebp
121f5b: 57 push %edi
121f5c: 56 push %esi
121f5d: 53 push %ebx
121f5e: 83 ec 4c sub $0x4c,%esp
121f61: 8b 5d 0c mov 0xc(%ebp),%ebx
121f64: 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() )
121f67: e8 64 fd ff ff call 121cd0 <getpid>
121f6c: 39 45 08 cmp %eax,0x8(%ebp)
121f6f: 74 0d je 121f7e <killinfo+0x26>
rtems_set_errno_and_return_minus_one( ESRCH );
121f71: e8 5a 3a ff ff call 1159d0 <__errno>
121f76: c7 00 03 00 00 00 movl $0x3,(%eax)
121f7c: eb 0f jmp 121f8d <killinfo+0x35>
/*
* Validate the signal passed.
*/
if ( !sig )
121f7e: 85 db test %ebx,%ebx
121f80: 75 13 jne 121f95 <killinfo+0x3d>
rtems_set_errno_and_return_minus_one( EINVAL );
121f82: e8 49 3a ff ff call 1159d0 <__errno>
121f87: c7 00 16 00 00 00 movl $0x16,(%eax)
121f8d: 83 c8 ff or $0xffffffff,%eax
121f90: e9 ef 01 00 00 jmp 122184 <killinfo+0x22c>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
121f95: 8d 4b ff lea -0x1(%ebx),%ecx
if ( !is_valid_signo(sig) )
121f98: 83 f9 1f cmp $0x1f,%ecx
121f9b: 77 e5 ja 121f82 <killinfo+0x2a>
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 )
121f9d: 6b d3 0c imul $0xc,%ebx,%edx
return 0;
121fa0: 31 c0 xor %eax,%eax
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 )
121fa2: 83 ba 18 ba 12 00 01 cmpl $0x1,0x12ba18(%edx)
121fa9: 0f 84 d5 01 00 00 je 122184 <killinfo+0x22c>
/*
* 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 ) )
121faf: 83 fb 04 cmp $0x4,%ebx
121fb2: 74 0a je 121fbe <killinfo+0x66>
121fb4: 83 fb 08 cmp $0x8,%ebx
121fb7: 74 05 je 121fbe <killinfo+0x66>
121fb9: 83 fb 0b cmp $0xb,%ebx
121fbc: 75 16 jne 121fd4 <killinfo+0x7c>
return pthread_kill( pthread_self(), sig );
121fbe: e8 85 03 00 00 call 122348 <pthread_self>
121fc3: 56 push %esi
121fc4: 56 push %esi
121fc5: 53 push %ebx
121fc6: 50 push %eax
121fc7: e8 d8 02 00 00 call 1222a4 <pthread_kill>
121fcc: 83 c4 10 add $0x10,%esp
121fcf: e9 b0 01 00 00 jmp 122184 <killinfo+0x22c>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
121fd4: be 01 00 00 00 mov $0x1,%esi
121fd9: d3 e6 shl %cl,%esi
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
121fdb: 89 5d dc mov %ebx,-0x24(%ebp)
siginfo->si_code = SI_USER;
121fde: c7 45 e0 01 00 00 00 movl $0x1,-0x20(%ebp)
if ( !value ) {
121fe5: 85 ff test %edi,%edi
121fe7: 75 09 jne 121ff2 <killinfo+0x9a>
siginfo->si_value.sival_int = 0;
121fe9: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
121ff0: eb 05 jmp 121ff7 <killinfo+0x9f>
} else {
siginfo->si_value = *value;
121ff2: 8b 07 mov (%edi),%eax
121ff4: 89 45 e4 mov %eax,-0x1c(%ebp)
121ff7: a1 b4 b4 12 00 mov 0x12b4b4,%eax
121ffc: 40 inc %eax
121ffd: a3 b4 b4 12 00 mov %eax,0x12b4b4
/*
* 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;
122002: a1 dc b9 12 00 mov 0x12b9dc,%eax
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( _POSIX_signals_Is_interested( api, mask ) ) {
122007: 8b 90 ec 00 00 00 mov 0xec(%eax),%edx
12200d: 8b 92 d0 00 00 00 mov 0xd0(%edx),%edx
122013: f7 d2 not %edx
122015: 85 d6 test %edx,%esi
122017: 0f 85 ed 00 00 00 jne 12210a <killinfo+0x1b2>
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
12201d: 8b 15 9c bb 12 00 mov 0x12bb9c,%edx
/* 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 );
122023: eb 23 jmp 122048 <killinfo+0xf0>
!_Chain_Is_tail( the_chain, the_node ) ;
the_node = the_node->next ) {
the_thread = (Thread_Control *)the_node;
122025: 89 d0 mov %edx,%eax
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
122027: 8b 8a ec 00 00 00 mov 0xec(%edx),%ecx
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
12202d: 85 72 30 test %esi,0x30(%edx)
122030: 0f 85 d4 00 00 00 jne 12210a <killinfo+0x1b2>
/*
* Is this thread is blocked waiting for another signal but has
* not blocked this one?
*/
if (~api->signals_blocked & mask)
122036: 8b 89 d0 00 00 00 mov 0xd0(%ecx),%ecx
12203c: f7 d1 not %ecx
12203e: 85 ce test %ecx,%esi
122040: 0f 85 c4 00 00 00 jne 12210a <killinfo+0x1b2>
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 ) {
122046: 8b 12 mov (%edx),%edx
/* 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 );
122048: 81 fa a0 bb 12 00 cmp $0x12bba0,%edx
12204e: 75 d5 jne 122025 <killinfo+0xcd>
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
122050: 0f b6 0d 24 72 12 00 movzbl 0x127224,%ecx
122057: 41 inc %ecx
*
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
122058: 31 c0 xor %eax,%eax
interested_priority = PRIORITY_MAXIMUM + 1;
for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) {
12205a: c7 45 cc 02 00 00 00 movl $0x2,-0x34(%ebp)
/*
* This can occur when no one is interested and an API is not configured.
*/
if ( !_Objects_Information_table[ the_api ] )
122061: 8b 7d cc mov -0x34(%ebp),%edi
122064: 8b 14 bd 8c b4 12 00 mov 0x12b48c(,%edi,4),%edx
12206b: 85 d2 test %edx,%edx
12206d: 0f 84 86 00 00 00 je 1220f9 <killinfo+0x1a1> <== NEVER TAKEN
continue;
the_info = _Objects_Information_table[ the_api ][ 1 ];
122073: 8b 52 04 mov 0x4(%edx),%edx
*/
if ( !the_info )
continue;
#endif
maximum = the_info->maximum;
122076: 0f b7 7a 10 movzwl 0x10(%edx),%edi
12207a: 89 7d c4 mov %edi,-0x3c(%ebp)
object_table = the_info->local_table;
12207d: 8b 52 1c mov 0x1c(%edx),%edx
122080: 89 55 c0 mov %edx,-0x40(%ebp)
for ( index = 1 ; index <= maximum ; index++ ) {
122083: c7 45 d0 01 00 00 00 movl $0x1,-0x30(%ebp)
12208a: 89 5d b4 mov %ebx,-0x4c(%ebp)
12208d: eb 5f jmp 1220ee <killinfo+0x196>
the_thread = (Thread_Control *) object_table[ index ];
12208f: 8b 5d d0 mov -0x30(%ebp),%ebx
122092: 8b 7d c0 mov -0x40(%ebp),%edi
122095: 8b 14 9f mov (%edi,%ebx,4),%edx
if ( !the_thread )
122098: 85 d2 test %edx,%edx
12209a: 74 4f je 1220eb <killinfo+0x193>
/*
* If this thread is of lower priority than the interested thread,
* go on to the next thread.
*/
if ( the_thread->current_priority > interested_priority )
12209c: 8b 5a 14 mov 0x14(%edx),%ebx
12209f: 89 5d d4 mov %ebx,-0x2c(%ebp)
1220a2: 39 cb cmp %ecx,%ebx
1220a4: 77 45 ja 1220eb <killinfo+0x193>
#if defined(RTEMS_DEBUG)
if ( !api )
continue;
#endif
if ( !_POSIX_signals_Is_interested( api, mask ) )
1220a6: 8b ba ec 00 00 00 mov 0xec(%edx),%edi
1220ac: 8b bf d0 00 00 00 mov 0xd0(%edi),%edi
1220b2: f7 d7 not %edi
1220b4: 85 fe test %edi,%esi
1220b6: 74 33 je 1220eb <killinfo+0x193>
*
* 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 ) {
1220b8: 39 cb cmp %ecx,%ebx
1220ba: 72 2a jb 1220e6 <killinfo+0x18e>
* and blocking interruptibutable by signal.
*
* If the interested thread is ready, don't think about changing.
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
1220bc: 85 c0 test %eax,%eax
1220be: 74 2b je 1220eb <killinfo+0x193> <== NEVER TAKEN
1220c0: 8b 78 10 mov 0x10(%eax),%edi
1220c3: 89 7d c8 mov %edi,-0x38(%ebp)
1220c6: 85 ff test %edi,%edi
1220c8: 74 21 je 1220eb <killinfo+0x193> <== NEVER TAKEN
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
1220ca: 8b 7a 10 mov 0x10(%edx),%edi
1220cd: 85 ff test %edi,%edi
1220cf: 74 15 je 1220e6 <killinfo+0x18e>
continue;
}
DEBUG_STEP("6");
/* prefer blocked/interruptible over blocked/not interruptible */
if ( !_States_Is_interruptible_by_signal(interested->current_state) ) {
1220d1: f7 45 c8 00 00 00 10 testl $0x10000000,-0x38(%ebp)
1220d8: 75 11 jne 1220eb <killinfo+0x193>
DEBUG_STEP("7");
if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) {
1220da: 81 e7 00 00 00 10 and $0x10000000,%edi
1220e0: 74 09 je 1220eb <killinfo+0x193>
1220e2: 89 d9 mov %ebx,%ecx
1220e4: eb 03 jmp 1220e9 <killinfo+0x191>
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
1220e6: 8b 4d d4 mov -0x2c(%ebp),%ecx
1220e9: 89 d0 mov %edx,%eax
#endif
maximum = the_info->maximum;
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
1220eb: ff 45 d0 incl -0x30(%ebp)
1220ee: 8b 55 c4 mov -0x3c(%ebp),%edx
1220f1: 39 55 d0 cmp %edx,-0x30(%ebp)
1220f4: 76 99 jbe 12208f <killinfo+0x137>
1220f6: 8b 5d b4 mov -0x4c(%ebp),%ebx
* + 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++) {
1220f9: ff 45 cc incl -0x34(%ebp)
1220fc: 83 7d cc 04 cmpl $0x4,-0x34(%ebp)
122100: 0f 85 5b ff ff ff jne 122061 <killinfo+0x109>
}
}
}
}
if ( interested ) {
122106: 85 c0 test %eax,%eax
122108: 74 13 je 12211d <killinfo+0x1c5>
/*
* 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 ) ) {
12210a: 51 push %ecx
mask = signo_to_mask( sig );
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
12210b: 8d 55 dc lea -0x24(%ebp),%edx
/*
* 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 ) ) {
12210e: 52 push %edx
12210f: 53 push %ebx
122110: 50 push %eax
122111: e8 8a 00 00 00 call 1221a0 <_POSIX_signals_Unblock_thread>
122116: 83 c4 10 add $0x10,%esp
122119: 84 c0 test %al,%al
12211b: 75 60 jne 12217d <killinfo+0x225>
/*
* 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 );
12211d: 83 ec 0c sub $0xc,%esp
122120: 56 push %esi
122121: e8 66 00 00 00 call 12218c <_POSIX_signals_Set_process_signals>
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
122126: 6b db 0c imul $0xc,%ebx,%ebx
122129: 83 c4 10 add $0x10,%esp
12212c: 83 bb 10 ba 12 00 02 cmpl $0x2,0x12ba10(%ebx)
122133: 75 48 jne 12217d <killinfo+0x225>
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get( &_POSIX_signals_Inactive_siginfo );
122135: 83 ec 0c sub $0xc,%esp
122138: 68 90 bb 12 00 push $0x12bb90
12213d: e8 4e d0 fe ff call 10f190 <_Chain_Get>
if ( !psiginfo ) {
122142: 83 c4 10 add $0x10,%esp
122145: 85 c0 test %eax,%eax
122147: 75 15 jne 12215e <killinfo+0x206>
_Thread_Enable_dispatch();
122149: e8 6c e8 fe ff call 1109ba <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
12214e: e8 7d 38 ff ff call 1159d0 <__errno>
122153: c7 00 0b 00 00 00 movl $0xb,(%eax)
122159: e9 2f fe ff ff jmp 121f8d <killinfo+0x35>
}
psiginfo->Info = *siginfo;
12215e: 8d 78 08 lea 0x8(%eax),%edi
122161: 8d 75 dc lea -0x24(%ebp),%esi
122164: b9 03 00 00 00 mov $0x3,%ecx
122169: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
12216b: 52 push %edx
12216c: 52 push %edx
12216d: 50 push %eax
12216e: 81 c3 08 bc 12 00 add $0x12bc08,%ebx
122174: 53 push %ebx
122175: e8 da cf fe ff call 10f154 <_Chain_Append>
12217a: 83 c4 10 add $0x10,%esp
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
12217d: e8 38 e8 fe ff call 1109ba <_Thread_Enable_dispatch>
return 0;
122182: 31 c0 xor %eax,%eax
}
122184: 8d 65 f4 lea -0xc(%ebp),%esp
122187: 5b pop %ebx
122188: 5e pop %esi
122189: 5f pop %edi
12218a: c9 leave
12218b: c3 ret
0011d094 <libc_wrapup>:
extern void _wrapup_reent(struct _reent *);
extern void _reclaim_reent(struct _reent *);
void libc_wrapup(void)
{
11d094: 55 push %ebp
11d095: 89 e5 mov %esp,%ebp
11d097: 53 push %ebx
11d098: 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()))
11d09b: 83 3d 9c 54 12 00 03 cmpl $0x3,0x12549c
11d0a2: 75 4f jne 11d0f3 <libc_wrapup+0x5f> <== NEVER TAKEN
/*
* This was already done if the user called exit() directly .
_wrapup_reent(0);
*/
if (_REENT != _global_impure_ptr) {
11d0a4: 8b 1d 80 fa 11 00 mov 0x11fa80,%ebx
11d0aa: 39 1d 40 31 12 00 cmp %ebx,0x123140
11d0b0: 74 12 je 11d0c4 <libc_wrapup+0x30>
_wrapup_reent(_global_impure_ptr);
11d0b2: 83 ec 0c sub $0xc,%esp
11d0b5: 53 push %ebx
11d0b6: e8 b5 05 00 00 call 11d670 <_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;
11d0bb: 89 1d 40 31 12 00 mov %ebx,0x123140
11d0c1: 83 c4 10 add $0x10,%esp
*
* Should this be changed to do *all* file streams?
* _fwalk (_REENT, fclose);
*/
fclose (stdin);
11d0c4: 83 ec 0c sub $0xc,%esp
11d0c7: a1 40 31 12 00 mov 0x123140,%eax
11d0cc: ff 70 04 pushl 0x4(%eax)
11d0cf: e8 bc 41 ff ff call 111290 <fclose>
fclose (stdout);
11d0d4: 5a pop %edx
11d0d5: a1 40 31 12 00 mov 0x123140,%eax
11d0da: ff 70 08 pushl 0x8(%eax)
11d0dd: e8 ae 41 ff ff call 111290 <fclose>
fclose (stderr);
11d0e2: 58 pop %eax
11d0e3: a1 40 31 12 00 mov 0x123140,%eax
11d0e8: ff 70 0c pushl 0xc(%eax)
11d0eb: e8 a0 41 ff ff call 111290 <fclose>
11d0f0: 83 c4 10 add $0x10,%esp
}
11d0f3: 8b 5d fc mov -0x4(%ebp),%ebx
11d0f6: c9 leave
11d0f7: c3 ret
0011cfa0 <lseek>:
off_t lseek(
int fd,
off_t offset,
int whence
)
{
11cfa0: 55 push %ebp
11cfa1: 89 e5 mov %esp,%ebp
11cfa3: 57 push %edi
11cfa4: 56 push %esi
11cfa5: 53 push %ebx
11cfa6: 83 ec 1c sub $0x1c,%esp
11cfa9: 8b 5d 08 mov 0x8(%ebp),%ebx
11cfac: 8b 45 0c mov 0xc(%ebp),%eax
11cfaf: 8b 55 10 mov 0x10(%ebp),%edx
11cfb2: 8b 4d 14 mov 0x14(%ebp),%ecx
rtems_libio_t *iop;
off_t old_offset;
off_t status;
rtems_libio_check_fd( fd );
11cfb5: 3b 1d 44 11 12 00 cmp 0x121144,%ebx
11cfbb: 73 0f jae 11cfcc <lseek+0x2c>
iop = rtems_libio_iop( fd );
11cfbd: 6b db 38 imul $0x38,%ebx,%ebx
11cfc0: 03 1d f8 51 12 00 add 0x1251f8,%ebx
rtems_libio_check_is_open(iop);
11cfc6: f6 43 15 01 testb $0x1,0x15(%ebx)
11cfca: 75 0d jne 11cfd9 <lseek+0x39>
11cfcc: e8 67 41 ff ff call 111138 <__errno>
11cfd1: c7 00 09 00 00 00 movl $0x9,(%eax)
11cfd7: eb 4b jmp 11d024 <lseek+0x84>
/*
* Now process the lseek().
*/
old_offset = iop->offset;
11cfd9: 8b 73 0c mov 0xc(%ebx),%esi
11cfdc: 8b 7b 10 mov 0x10(%ebx),%edi
11cfdf: 89 75 e0 mov %esi,-0x20(%ebp)
11cfe2: 89 7d e4 mov %edi,-0x1c(%ebp)
switch ( whence ) {
11cfe5: 83 f9 01 cmp $0x1,%ecx
11cfe8: 74 11 je 11cffb <lseek+0x5b>
11cfea: 83 f9 02 cmp $0x2,%ecx
11cfed: 74 18 je 11d007 <lseek+0x67>
11cfef: 85 c9 test %ecx,%ecx
11cff1: 75 26 jne 11d019 <lseek+0x79>
case SEEK_SET:
iop->offset = offset;
11cff3: 89 43 0c mov %eax,0xc(%ebx)
11cff6: 89 53 10 mov %edx,0x10(%ebx)
break;
11cff9: eb 30 jmp 11d02b <lseek+0x8b>
case SEEK_CUR:
iop->offset += offset;
11cffb: 8b 75 e0 mov -0x20(%ebp),%esi
11cffe: 8b 7d e4 mov -0x1c(%ebp),%edi
11d001: 01 c6 add %eax,%esi
11d003: 11 d7 adc %edx,%edi
11d005: eb 0a jmp 11d011 <lseek+0x71>
break;
case SEEK_END:
iop->offset = iop->size + offset;
11d007: 89 c6 mov %eax,%esi
11d009: 89 d7 mov %edx,%edi
11d00b: 03 73 04 add 0x4(%ebx),%esi
11d00e: 13 7b 08 adc 0x8(%ebx),%edi
11d011: 89 73 0c mov %esi,0xc(%ebx)
11d014: 89 7b 10 mov %edi,0x10(%ebx)
break;
11d017: eb 12 jmp 11d02b <lseek+0x8b>
default:
rtems_set_errno_and_return_minus_one( EINVAL );
11d019: e8 1a 41 ff ff call 111138 <__errno>
11d01e: c7 00 16 00 00 00 movl $0x16,(%eax)
11d024: 83 c8 ff or $0xffffffff,%eax
11d027: 89 c2 mov %eax,%edx
11d029: eb 23 jmp 11d04e <lseek+0xae>
/*
* At this time, handlers assume iop->offset has the desired
* new offset.
*/
status = (*iop->pathinfo.handlers->lseek_h)( iop, offset, whence );
11d02b: 8b 73 20 mov 0x20(%ebx),%esi
11d02e: 51 push %ecx
11d02f: 52 push %edx
11d030: 50 push %eax
11d031: 53 push %ebx
11d032: ff 56 14 call *0x14(%esi)
if ( status == (off_t) -1 )
11d035: 83 c4 10 add $0x10,%esp
11d038: 83 fa ff cmp $0xffffffff,%edx
11d03b: 75 11 jne 11d04e <lseek+0xae>
11d03d: 83 f8 ff cmp $0xffffffff,%eax
11d040: 75 0c jne 11d04e <lseek+0xae> <== NEVER TAKEN
iop->offset = old_offset;
11d042: 8b 75 e0 mov -0x20(%ebp),%esi
11d045: 8b 7d e4 mov -0x1c(%ebp),%edi
11d048: 89 73 0c mov %esi,0xc(%ebx)
11d04b: 89 7b 10 mov %edi,0x10(%ebx)
/*
* So if the operation failed, we have to restore iop->offset.
*/
return status;
}
11d04e: 8d 65 f4 lea -0xc(%ebp),%esp
11d051: 5b pop %ebx
11d052: 5e pop %esi
11d053: 5f pop %edi
11d054: c9 leave
11d055: c3 ret
00107614 <malloc>:
#include "malloc_p.h"
void *malloc(
size_t size
)
{
107614: 55 push %ebp
107615: 89 e5 mov %esp,%ebp
107617: 56 push %esi
107618: 53 push %ebx
107619: 8b 75 08 mov 0x8(%ebp),%esi
void *return_this;
MSBUMP(malloc_calls, 1);
10761c: ff 05 14 52 12 00 incl 0x125214
/*
* If some free's have been deferred, then do them now.
*/
malloc_deferred_frees_process();
107622: e8 07 ff ff ff call 10752e <malloc_deferred_frees_process>
/*
* Validate the parameters
*/
if ( !size )
return (void *) 0;
107627: 31 db xor %ebx,%ebx
malloc_deferred_frees_process();
/*
* Validate the parameters
*/
if ( !size )
107629: 85 f6 test %esi,%esi
10762b: 74 78 je 1076a5 <malloc+0x91>
return (void *) 0;
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
10762d: 83 3d 9c 54 12 00 03 cmpl $0x3,0x12549c
107634: 75 09 jne 10763f <malloc+0x2b>
!malloc_is_system_state_OK() )
107636: e8 b5 fe ff ff call 1074f0 <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()) &&
10763b: 84 c0 test %al,%al
10763d: 74 66 je 1076a5 <malloc+0x91> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE void *_Protected_heap_Allocate(
Heap_Control *heap,
uintptr_t size
)
{
return _Protected_heap_Allocate_aligned_with_boundary( heap, size, 0, 0 );
10763f: 6a 00 push $0x0
107641: 6a 00 push $0x0
107643: 56 push %esi
107644: ff 35 80 11 12 00 pushl 0x121180
10764a: e8 7d 43 00 00 call 10b9cc <_Protected_heap_Allocate_aligned_with_boundary>
* If this fails then return a NULL pointer.
*/
return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size );
if ( !return_this ) {
10764f: 83 c4 10 add $0x10,%esp
107652: 89 c3 mov %eax,%ebx
107654: 85 c0 test %eax,%eax
107656: 75 28 jne 107680 <malloc+0x6c>
if (rtems_malloc_sbrk_helpers)
107658: a1 74 36 12 00 mov 0x123674,%eax
10765d: 85 c0 test %eax,%eax
10765f: 74 10 je 107671 <malloc+0x5d>
return_this = (*rtems_malloc_sbrk_helpers->extend)( size );
107661: 83 ec 0c sub $0xc,%esp
107664: 56 push %esi
107665: ff 50 04 call *0x4(%eax)
107668: 89 c3 mov %eax,%ebx
if ( !return_this ) {
10766a: 83 c4 10 add $0x10,%esp
10766d: 85 c0 test %eax,%eax
10766f: 75 0f jne 107680 <malloc+0x6c>
errno = ENOMEM;
107671: e8 c2 9a 00 00 call 111138 <__errno>
107676: c7 00 0c 00 00 00 movl $0xc,(%eax)
return (void *) 0;
10767c: 31 db xor %ebx,%ebx
10767e: eb 25 jmp 1076a5 <malloc+0x91>
}
/*
* If the user wants us to dirty the allocated memory, then do it.
*/
if ( rtems_malloc_dirty_helper )
107680: a1 78 36 12 00 mov 0x123678,%eax
107685: 85 c0 test %eax,%eax
107687: 74 09 je 107692 <malloc+0x7e>
(*rtems_malloc_dirty_helper)( return_this, size );
107689: 52 push %edx
10768a: 52 push %edx
10768b: 56 push %esi
10768c: 53 push %ebx
10768d: ff d0 call *%eax
10768f: 83 c4 10 add $0x10,%esp
/*
* If configured, update the statistics
*/
if ( rtems_malloc_statistics_helpers )
107692: a1 70 36 12 00 mov 0x123670,%eax
107697: 85 c0 test %eax,%eax
107699: 74 0a je 1076a5 <malloc+0x91>
(*rtems_malloc_statistics_helpers->at_malloc)(return_this);
10769b: 83 ec 0c sub $0xc,%esp
10769e: 53 push %ebx
10769f: ff 50 04 call *0x4(%eax)
1076a2: 83 c4 10 add $0x10,%esp
return return_this;
}
1076a5: 89 d8 mov %ebx,%eax
1076a7: 8d 65 f8 lea -0x8(%ebp),%esp
1076aa: 5b pop %ebx
1076ab: 5e pop %esi
1076ac: c9 leave
1076ad: c3 ret
0010797c <malloc_sbrk_extend_and_allocate>:
}
void *malloc_sbrk_extend_and_allocate(
size_t size
)
{
10797c: 55 push %ebp
10797d: 89 e5 mov %esp,%ebp
10797f: 57 push %edi
107980: 56 push %esi
107981: 53 push %ebx
107982: 83 ec 0c sub $0xc,%esp
107985: 8b 7d 08 mov 0x8(%ebp),%edi
* 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;
107988: 8b 0d 94 53 12 00 mov 0x125394,%ecx
if ( sbrk_amount == 0 )
return (void *) 0;
10798e: 31 f6 xor %esi,%esi
* in "page" amounts.
*/
sbrk_amount = RTEMS_Malloc_Sbrk_amount;
if ( sbrk_amount == 0 )
107990: 85 c9 test %ecx,%ecx
107992: 74 67 je 1079fb <malloc_sbrk_extend_and_allocate+0x7f><== NEVER TAKEN
return (void *) 0;
the_size = ((size + sbrk_amount) / sbrk_amount * sbrk_amount);
107994: 8d 1c 0f lea (%edi,%ecx,1),%ebx
107997: 89 d8 mov %ebx,%eax
107999: 31 d2 xor %edx,%edx
10799b: f7 f1 div %ecx
10799d: 89 c3 mov %eax,%ebx
10799f: 0f af d9 imul %ecx,%ebx
starting_address = (void *) sbrk(the_size);
1079a2: 83 ec 0c sub $0xc,%esp
1079a5: 53 push %ebx
1079a6: e8 a8 8a ff ff call 100453 <sbrk>
if ( starting_address == (void*) -1 )
1079ab: 83 c4 10 add $0x10,%esp
1079ae: 83 f8 ff cmp $0xffffffff,%eax
1079b1: 74 48 je 1079fb <malloc_sbrk_extend_and_allocate+0x7f>
return (void *) 0;
if ( !_Protected_heap_Extend(
1079b3: 52 push %edx
1079b4: 53 push %ebx
1079b5: 50 push %eax
1079b6: ff 35 80 11 12 00 pushl 0x121180
1079bc: e8 a3 43 00 00 call 10bd64 <_Protected_heap_Extend>
1079c1: 83 c4 10 add $0x10,%esp
1079c4: 84 c0 test %al,%al
1079c6: 75 18 jne 1079e0 <malloc_sbrk_extend_and_allocate+0x64>
RTEMS_Malloc_Heap, starting_address, the_size) ) {
sbrk(-the_size);
1079c8: 83 ec 0c sub $0xc,%esp
1079cb: f7 db neg %ebx
1079cd: 53 push %ebx
1079ce: e8 80 8a ff ff call 100453 <sbrk>
errno = ENOMEM;
1079d3: e8 38 9d 00 00 call 111710 <__errno>
1079d8: c7 00 0c 00 00 00 movl $0xc,(%eax)
1079de: eb 18 jmp 1079f8 <malloc_sbrk_extend_and_allocate+0x7c>
return (void *) 0;
}
MSBUMP(space_available, the_size);
1079e0: 01 1d 68 53 12 00 add %ebx,0x125368
1079e6: 6a 00 push $0x0
1079e8: 6a 00 push $0x0
1079ea: 57 push %edi
1079eb: ff 35 80 11 12 00 pushl 0x121180
1079f1: e8 36 43 00 00 call 10bd2c <_Protected_heap_Allocate_aligned_with_boundary>
1079f6: 89 c6 mov %eax,%esi
return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size );
return return_this;
1079f8: 83 c4 10 add $0x10,%esp
}
1079fb: 89 f0 mov %esi,%eax
1079fd: 8d 65 f4 lea -0xc(%ebp),%esp
107a00: 5b pop %ebx
107a01: 5e pop %esi
107a02: 5f pop %edi
107a03: c9 leave
107a04: c3 ret
0011041b <memfile_ftruncate>:
*/
int memfile_ftruncate(
rtems_libio_t *iop,
rtems_off64_t length
)
{
11041b: 55 push %ebp
11041c: 89 e5 mov %esp,%ebp
11041e: 53 push %ebx
11041f: 83 ec 14 sub $0x14,%esp
110422: 8b 4d 08 mov 0x8(%ebp),%ecx
110425: 8b 45 0c mov 0xc(%ebp),%eax
110428: 8b 55 10 mov 0x10(%ebp),%edx
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
11042b: 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 )
11042e: 3b 53 54 cmp 0x54(%ebx),%edx
110431: 7c 15 jl 110448 <memfile_ftruncate+0x2d><== NEVER TAKEN
110433: 7f 05 jg 11043a <memfile_ftruncate+0x1f><== NEVER TAKEN
110435: 3b 43 50 cmp 0x50(%ebx),%eax
110438: 76 0e jbe 110448 <memfile_ftruncate+0x2d>
return IMFS_memfile_extend( the_jnode, length );
11043a: 51 push %ecx
11043b: 52 push %edx
11043c: 50 push %eax
11043d: 53 push %ebx
11043e: e8 bf fc ff ff call 110102 <IMFS_memfile_extend>
110443: 83 c4 10 add $0x10,%esp
110446: eb 24 jmp 11046c <memfile_ftruncate+0x51>
/*
* 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;
110448: 89 43 50 mov %eax,0x50(%ebx)
11044b: 89 53 54 mov %edx,0x54(%ebx)
iop->size = the_jnode->info.file.size;
11044e: 89 41 04 mov %eax,0x4(%ecx)
110451: 89 51 08 mov %edx,0x8(%ecx)
IMFS_update_atime( the_jnode );
110454: 50 push %eax
110455: 50 push %eax
110456: 6a 00 push $0x0
110458: 8d 45 f0 lea -0x10(%ebp),%eax
11045b: 50 push %eax
11045c: e8 8f 6f ff ff call 1073f0 <gettimeofday>
110461: 8b 45 f0 mov -0x10(%ebp),%eax
110464: 89 43 40 mov %eax,0x40(%ebx)
return 0;
110467: 83 c4 10 add $0x10,%esp
11046a: 31 c0 xor %eax,%eax
}
11046c: 8b 5d fc mov -0x4(%ebp),%ebx
11046f: c9 leave
110470: c3 ret
00110471 <memfile_lseek>:
rtems_off64_t memfile_lseek(
rtems_libio_t *iop,
rtems_off64_t offset,
int whence
)
{
110471: 55 push %ebp
110472: 89 e5 mov %esp,%ebp
110474: 56 push %esi
110475: 53 push %ebx
110476: 8b 5d 08 mov 0x8(%ebp),%ebx
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
110479: 8b 73 18 mov 0x18(%ebx),%esi
if (the_jnode->type == IMFS_LINEAR_FILE) {
11047c: 83 7e 4c 06 cmpl $0x6,0x4c(%esi)
110480: 75 1a jne 11049c <memfile_lseek+0x2b>
if (iop->offset > the_jnode->info.linearfile.size)
110482: 8b 56 50 mov 0x50(%esi),%edx
110485: 8b 46 54 mov 0x54(%esi),%eax
110488: 39 43 10 cmp %eax,0x10(%ebx)
11048b: 7c 41 jl 1104ce <memfile_lseek+0x5d> <== NEVER TAKEN
11048d: 7f 05 jg 110494 <memfile_lseek+0x23> <== NEVER TAKEN
11048f: 39 53 0c cmp %edx,0xc(%ebx)
110492: 76 3a jbe 1104ce <memfile_lseek+0x5d> <== ALWAYS TAKEN
iop->offset = the_jnode->info.linearfile.size;
110494: 89 53 0c mov %edx,0xc(%ebx) <== NOT EXECUTED
110497: 89 43 10 mov %eax,0x10(%ebx) <== NOT EXECUTED
11049a: eb 32 jmp 1104ce <memfile_lseek+0x5d> <== NOT EXECUTED
}
else { /* Must be a block file (IMFS_MEMORY_FILE). */
if (IMFS_memfile_extend( the_jnode, iop->offset ))
11049c: 50 push %eax
11049d: ff 73 10 pushl 0x10(%ebx)
1104a0: ff 73 0c pushl 0xc(%ebx)
1104a3: 56 push %esi
1104a4: e8 59 fc ff ff call 110102 <IMFS_memfile_extend>
1104a9: 83 c4 10 add $0x10,%esp
1104ac: 85 c0 test %eax,%eax
1104ae: 74 12 je 1104c2 <memfile_lseek+0x51>
rtems_set_errno_and_return_minus_one( ENOSPC );
1104b0: e8 83 0c 00 00 call 111138 <__errno>
1104b5: c7 00 1c 00 00 00 movl $0x1c,(%eax)
1104bb: 83 c8 ff or $0xffffffff,%eax
1104be: 89 c2 mov %eax,%edx
1104c0: eb 12 jmp 1104d4 <memfile_lseek+0x63>
iop->size = the_jnode->info.file.size;
1104c2: 8b 46 50 mov 0x50(%esi),%eax
1104c5: 8b 56 54 mov 0x54(%esi),%edx
1104c8: 89 43 04 mov %eax,0x4(%ebx)
1104cb: 89 53 08 mov %edx,0x8(%ebx)
}
return iop->offset;
1104ce: 8b 43 0c mov 0xc(%ebx),%eax
1104d1: 8b 53 10 mov 0x10(%ebx),%edx
}
1104d4: 8d 65 f8 lea -0x8(%ebp),%esp
1104d7: 5b pop %ebx
1104d8: 5e pop %esi
1104d9: c9 leave
1104da: c3 ret
0011038c <memfile_open>:
rtems_libio_t *iop,
const char *pathname,
uint32_t flag,
uint32_t mode
)
{
11038c: 55 push %ebp
11038d: 89 e5 mov %esp,%ebp
11038f: 56 push %esi
110390: 53 push %ebx
110391: 8b 75 08 mov 0x8(%ebp),%esi
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
110394: 8b 5e 18 mov 0x18(%esi),%ebx
/*
* Perform 'copy on write' for linear files
*/
if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND))
110397: f7 46 14 04 02 00 00 testl $0x204,0x14(%esi)
11039e: 74 54 je 1103f4 <memfile_open+0x68>
&& (the_jnode->type == IMFS_LINEAR_FILE)) {
1103a0: 83 7b 4c 06 cmpl $0x6,0x4c(%ebx)
1103a4: 75 4e jne 1103f4 <memfile_open+0x68> <== ALWAYS TAKEN
uint32_t count = the_jnode->info.linearfile.size;
1103a6: 8b 43 50 mov 0x50(%ebx),%eax <== NOT EXECUTED
const unsigned char *buffer = the_jnode->info.linearfile.direct;
1103a9: 8b 53 58 mov 0x58(%ebx),%edx <== NOT EXECUTED
the_jnode->type = IMFS_MEMORY_FILE;
1103ac: c7 43 4c 05 00 00 00 movl $0x5,0x4c(%ebx) <== NOT EXECUTED
the_jnode->info.file.size = 0;
1103b3: c7 43 50 00 00 00 00 movl $0x0,0x50(%ebx) <== NOT EXECUTED
1103ba: c7 43 54 00 00 00 00 movl $0x0,0x54(%ebx) <== NOT EXECUTED
the_jnode->info.file.indirect = 0;
1103c1: c7 43 58 00 00 00 00 movl $0x0,0x58(%ebx) <== NOT EXECUTED
the_jnode->info.file.doubly_indirect = 0;
1103c8: c7 43 5c 00 00 00 00 movl $0x0,0x5c(%ebx) <== NOT EXECUTED
the_jnode->info.file.triply_indirect = 0;
1103cf: c7 43 60 00 00 00 00 movl $0x0,0x60(%ebx) <== NOT EXECUTED
if ((count != 0)
1103d6: 85 c0 test %eax,%eax <== NOT EXECUTED
1103d8: 74 1a je 1103f4 <memfile_open+0x68> <== NOT EXECUTED
&& (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1))
1103da: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
1103dd: 50 push %eax <== NOT EXECUTED
1103de: 52 push %edx <== NOT EXECUTED
1103df: 6a 00 push $0x0 <== NOT EXECUTED
1103e1: 6a 00 push $0x0 <== NOT EXECUTED
1103e3: 53 push %ebx <== NOT EXECUTED
1103e4: e8 0b fe ff ff call 1101f4 <IMFS_memfile_write> <== NOT EXECUTED
1103e9: 89 c2 mov %eax,%edx <== NOT EXECUTED
1103eb: 83 c4 20 add $0x20,%esp <== NOT EXECUTED
return -1;
1103ee: 83 c8 ff or $0xffffffff,%eax <== NOT EXECUTED
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))
1103f1: 42 inc %edx <== NOT EXECUTED
1103f2: 74 20 je 110414 <memfile_open+0x88> <== NOT EXECUTED
return -1;
}
if (iop->flags & LIBIO_FLAGS_APPEND)
1103f4: f6 46 15 02 testb $0x2,0x15(%esi)
1103f8: 74 0c je 110406 <memfile_open+0x7a>
iop->offset = the_jnode->info.file.size;
1103fa: 8b 43 50 mov 0x50(%ebx),%eax
1103fd: 8b 53 54 mov 0x54(%ebx),%edx
110400: 89 46 0c mov %eax,0xc(%esi)
110403: 89 56 10 mov %edx,0x10(%esi)
iop->size = the_jnode->info.file.size;
110406: 8b 43 50 mov 0x50(%ebx),%eax
110409: 8b 53 54 mov 0x54(%ebx),%edx
11040c: 89 46 04 mov %eax,0x4(%esi)
11040f: 89 56 08 mov %edx,0x8(%esi)
return 0;
110412: 31 c0 xor %eax,%eax
}
110414: 8d 65 f8 lea -0x8(%ebp),%esp
110417: 5b pop %ebx
110418: 5e pop %esi
110419: c9 leave
11041a: c3 ret
00107809 <mount>:
const char *target,
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
107809: 55 push %ebp
10780a: 89 e5 mov %esp,%ebp
10780c: 57 push %edi
10780d: 56 push %esi
10780e: 53 push %ebx
10780f: 83 ec 4c sub $0x4c,%esp
107812: 8b 75 10 mov 0x10(%ebp),%esi
/*
* Are the file system options valid?
*/
if ( options != RTEMS_FILESYSTEM_READ_ONLY &&
107815: 83 7d 14 01 cmpl $0x1,0x14(%ebp)
107819: 77 13 ja 10782e <mount+0x25>
rtems_set_errno_and_return_minus_one( EINVAL );
/*
* Get mount handler
*/
mount_h = rtems_filesystem_get_mount_handler( filesystemtype );
10781b: 83 ec 0c sub $0xc,%esp
10781e: 56 push %esi
10781f: e8 83 6c 00 00 call 10e4a7 <rtems_filesystem_get_mount_handler>
107824: 89 45 b0 mov %eax,-0x50(%ebp)
if ( !mount_h )
107827: 83 c4 10 add $0x10,%esp
10782a: 85 c0 test %eax,%eax
10782c: 75 10 jne 10783e <mount+0x35>
rtems_set_errno_and_return_minus_one( EINVAL );
10782e: e8 05 99 00 00 call 111138 <__errno>
107833: c7 00 16 00 00 00 movl $0x16,(%eax)
107839: e9 ca 00 00 00 jmp 107908 <mount+0xff>
{
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;
10783e: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)
107842: 0f 95 45 b7 setne -0x49(%ebp)
const char *target_or_null,
const char *filesystemtype,
size_t *target_length_ptr
)
{
const char *target = target_or_null != NULL ? target_or_null : "/";
107846: 8b 45 0c mov 0xc(%ebp),%eax
107849: 89 45 b8 mov %eax,-0x48(%ebp)
10784c: 80 7d b7 00 cmpb $0x0,-0x49(%ebp)
107850: 75 07 jne 107859 <mount+0x50>
107852: c7 45 b8 80 ef 11 00 movl $0x11ef80,-0x48(%ebp)
size_t filesystemtype_size = strlen( filesystemtype ) + 1;
107859: 83 ca ff or $0xffffffff,%edx
10785c: 31 c0 xor %eax,%eax
10785e: 89 d1 mov %edx,%ecx
107860: 89 f7 mov %esi,%edi
107862: f2 ae repnz scas %es:(%edi),%al
107864: f7 d1 not %ecx
107866: 89 4d bc mov %ecx,-0x44(%ebp)
size_t source_size = source_or_null != NULL ?
strlen( source_or_null ) + 1 : 0;
107869: c7 45 c4 00 00 00 00 movl $0x0,-0x3c(%ebp)
107870: 83 7d 08 00 cmpl $0x0,0x8(%ebp)
107874: 74 0c je 107882 <mount+0x79>
107876: 89 d1 mov %edx,%ecx
107878: 8b 7d 08 mov 0x8(%ebp),%edi
10787b: f2 ae repnz scas %es:(%edi),%al
10787d: f7 d1 not %ecx
10787f: 89 4d c4 mov %ecx,-0x3c(%ebp)
size_t target_size = strlen( target ) + 1;
107882: 31 c0 xor %eax,%eax
107884: 83 c9 ff or $0xffffffff,%ecx
107887: 8b 7d b8 mov -0x48(%ebp),%edi
10788a: f2 ae repnz scas %es:(%edi),%al
10788c: f7 d1 not %ecx
10788e: 89 4d c0 mov %ecx,-0x40(%ebp)
107891: 49 dec %ecx
107892: 89 4d ac mov %ecx,-0x54(%ebp)
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 );
107895: 50 push %eax
107896: 50 push %eax
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;
107897: 8b 55 c4 mov -0x3c(%ebp),%edx
10789a: 8b 7d bc mov -0x44(%ebp),%edi
10789d: 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 )
1078a1: 03 45 c0 add -0x40(%ebp),%eax
+ filesystemtype_size + source_size + target_size;
rtems_filesystem_mount_table_entry_t *mt_entry = calloc( 1, size );
1078a4: 50 push %eax
1078a5: 6a 01 push $0x1
1078a7: e8 60 f9 ff ff call 10720c <calloc>
1078ac: 89 c3 mov %eax,%ebx
if ( mt_entry != NULL ) {
1078ae: 83 c4 10 add $0x10,%esp
1078b1: 85 c0 test %eax,%eax
1078b3: 74 48 je 1078fd <mount+0xf4> <== NEVER TAKEN
char *str = (char *) mt_entry + sizeof( *mt_entry );
1078b5: 8d 40 74 lea 0x74(%eax),%eax
memcpy( str, filesystemtype, filesystemtype_size );
1078b8: 89 c7 mov %eax,%edi
1078ba: 8b 4d bc mov -0x44(%ebp),%ecx
1078bd: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
1078bf: 89 fa mov %edi,%edx
mt_entry->type = str;
1078c1: 89 43 6c mov %eax,0x6c(%ebx)
str += filesystemtype_size;
memcpy( str, source_or_null, source_size );
1078c4: 8b 75 08 mov 0x8(%ebp),%esi
1078c7: 8b 4d c4 mov -0x3c(%ebp),%ecx
1078ca: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
1078cc: 89 f8 mov %edi,%eax
mt_entry->dev = str;
1078ce: 89 53 70 mov %edx,0x70(%ebx)
str += source_size;
memcpy( str, target, target_size );
1078d1: 8b 75 b8 mov -0x48(%ebp),%esi
1078d4: 8b 4d c0 mov -0x40(%ebp),%ecx
1078d7: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
mt_entry->target = str;
1078d9: 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;
1078dc: 89 5b 2c mov %ebx,0x2c(%ebx)
mt_entry->options = options;
1078df: 8b 45 14 mov 0x14(%ebp),%eax
1078e2: 89 43 30 mov %eax,0x30(%ebx)
mt_entry->pathconf_limits_and_options = rtems_filesystem_default_pathconf;
1078e5: 8d 7b 38 lea 0x38(%ebx),%edi
1078e8: be c0 ef 11 00 mov $0x11efc0,%esi
1078ed: b1 0c mov $0xc,%cl
1078ef: 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 ) {
1078f1: 80 7d b7 00 cmpb $0x0,-0x49(%ebp)
1078f5: 0f 84 a3 00 00 00 je 10799e <mount+0x195>
1078fb: eb 13 jmp 107910 <mount+0x107>
target,
filesystemtype,
&target_length
);
if ( !mt_entry )
rtems_set_errno_and_return_minus_one( ENOMEM );
1078fd: e8 36 98 00 00 call 111138 <__errno> <== NOT EXECUTED
107902: c7 00 0c 00 00 00 movl $0xc,(%eax) <== NOT EXECUTED
107908: 83 c8 ff or $0xffffffff,%eax
10790b: e9 26 01 00 00 jmp 107a36 <mount+0x22d>
* The mount_point should be a directory with read/write/execute
* permissions in the existing tree.
*/
if ( has_target ) {
if ( rtems_filesystem_evaluate_path(
107910: 83 ec 0c sub $0xc,%esp
107913: 6a 01 push $0x1
107915: 8d 75 d4 lea -0x2c(%ebp),%esi
107918: 56 push %esi
107919: 6a 07 push $0x7
10791b: ff 75 ac pushl -0x54(%ebp)
10791e: ff 75 0c pushl 0xc(%ebp)
107921: e8 80 f9 ff ff call 1072a6 <rtems_filesystem_evaluate_path>
107926: 83 c4 20 add $0x20,%esp
107929: 40 inc %eax
10792a: 0f 84 df 00 00 00 je 107a0f <mount+0x206> <== NEVER TAKEN
/*
* Test to see if it is a directory
*/
if ( loc.ops->node_type_h( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
107930: 83 ec 0c sub $0xc,%esp
107933: 56 push %esi
107934: 8b 45 e0 mov -0x20(%ebp),%eax
107937: ff 50 10 call *0x10(%eax)
10793a: 83 c4 10 add $0x10,%esp
10793d: 48 dec %eax
10793e: 74 10 je 107950 <mount+0x147>
errno = ENOTDIR;
107940: e8 f3 97 00 00 call 111138 <__errno>
107945: c7 00 14 00 00 00 movl $0x14,(%eax)
goto cleanup_and_bail;
10794b: e9 c1 00 00 00 jmp 107a11 <mount+0x208>
/*
* You can only mount one file system onto a single mount point.
*/
if ( rtems_filesystem_mount_iterate( is_node_fs_root, loc.node_access ) ) {
107950: 57 push %edi
107951: 57 push %edi
107952: ff 75 d4 pushl -0x2c(%ebp)
107955: 68 80 77 10 00 push $0x107780
10795a: e8 62 fe ff ff call 1077c1 <rtems_filesystem_mount_iterate>
10795f: 83 c4 10 add $0x10,%esp
107962: 84 c0 test %al,%al
107964: 74 10 je 107976 <mount+0x16d>
errno = EBUSY;
107966: e8 cd 97 00 00 call 111138 <__errno>
10796b: c7 00 10 00 00 00 movl $0x10,(%eax)
goto cleanup_and_bail;
107971: e9 9b 00 00 00 jmp 107a11 <mount+0x208>
* 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;
107976: 8b 45 d4 mov -0x2c(%ebp),%eax
107979: 89 43 08 mov %eax,0x8(%ebx)
mt_entry->mt_point_node.handlers = loc.handlers;
10797c: 8b 45 dc mov -0x24(%ebp),%eax
10797f: 89 43 10 mov %eax,0x10(%ebx)
mt_entry->mt_point_node.ops = loc.ops;
107982: 8b 45 e0 mov -0x20(%ebp),%eax
107985: 89 43 14 mov %eax,0x14(%ebx)
mt_entry->mt_point_node.mt_entry = loc.mt_entry;
107988: 8b 55 e4 mov -0x1c(%ebp),%edx
10798b: 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 ) ) {
10798e: 83 ec 0c sub $0xc,%esp
107991: 53 push %ebx
107992: ff 50 20 call *0x20(%eax)
107995: 83 c4 10 add $0x10,%esp
107998: 85 c0 test %eax,%eax
10799a: 74 1d je 1079b9 <mount+0x1b0> <== ALWAYS TAKEN
10799c: eb 73 jmp 107a11 <mount+0x208> <== NOT EXECUTED
)
{
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;
10799e: 31 f6 xor %esi,%esi
}
} else {
/*
* Do we already have a base file system ?
*/
if ( !rtems_chain_is_empty( &mount_chain ) ) {
1079a0: 81 3d 64 2f 12 00 68 cmpl $0x122f68,0x122f64
1079a7: 2f 12 00
1079aa: 74 0d je 1079b9 <mount+0x1b0> <== ALWAYS TAKEN
errno = EINVAL;
1079ac: e8 87 97 00 00 call 111138 <__errno> <== NOT EXECUTED
1079b1: c7 00 16 00 00 00 movl $0x16,(%eax) <== NOT EXECUTED
goto cleanup_and_bail;
1079b7: eb 58 jmp 107a11 <mount+0x208> <== NOT EXECUTED
* 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 ) ) {
1079b9: 51 push %ecx
1079ba: 51 push %ecx
1079bb: ff 75 18 pushl 0x18(%ebp)
1079be: 53 push %ebx
1079bf: ff 55 b0 call *-0x50(%ebp)
1079c2: 83 c4 10 add $0x10,%esp
1079c5: 85 c0 test %eax,%eax
1079c7: 74 0f je 1079d8 <mount+0x1cf>
/*
* Try to undo the mount operation
*/
loc.ops->unmount_h( mt_entry );
1079c9: 83 ec 0c sub $0xc,%esp
1079cc: 53 push %ebx
1079cd: 8b 45 e0 mov -0x20(%ebp),%eax
1079d0: ff 50 28 call *0x28(%eax)
goto cleanup_and_bail;
1079d3: 83 c4 10 add $0x10,%esp
1079d6: eb 39 jmp 107a11 <mount+0x208>
}
/*
* Add the mount table entry to the mount table chain
*/
rtems_libio_lock();
1079d8: e8 b4 fd ff ff call 107791 <rtems_libio_lock>
1079dd: 52 push %edx
1079de: 52 push %edx
1079df: 53 push %ebx
1079e0: 68 64 2f 12 00 push $0x122f64
1079e5: e8 4a 30 00 00 call 10aa34 <_Chain_Append>
rtems_chain_append( &mount_chain, &mt_entry->Node );
rtems_libio_unlock();
1079ea: e8 bc fd ff ff call 1077ab <rtems_libio_unlock>
if ( !has_target )
1079ef: 83 c4 10 add $0x10,%esp
rtems_filesystem_root = mt_entry->mt_fs_root;
return 0;
1079f2: 31 c0 xor %eax,%eax
*/
rtems_libio_lock();
rtems_chain_append( &mount_chain, &mt_entry->Node );
rtems_libio_unlock();
if ( !has_target )
1079f4: 80 7d b7 00 cmpb $0x0,-0x49(%ebp)
1079f8: 75 3c jne 107a36 <mount+0x22d>
rtems_filesystem_root = mt_entry->mt_fs_root;
1079fa: 8b 3d 80 30 12 00 mov 0x123080,%edi
107a00: 83 c7 18 add $0x18,%edi
107a03: 8d 73 1c lea 0x1c(%ebx),%esi
107a06: b9 05 00 00 00 mov $0x5,%ecx
107a0b: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
107a0d: eb 27 jmp 107a36 <mount+0x22d>
)
{
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;
107a0f: 31 f6 xor %esi,%esi
return 0;
cleanup_and_bail:
free( mt_entry );
107a11: 83 ec 0c sub $0xc,%esp
107a14: 53 push %ebx
107a15: e8 5e f9 ff ff call 107378 <free>
if ( loc_to_free )
107a1a: 83 c4 10 add $0x10,%esp
rtems_filesystem_freenode( loc_to_free );
return -1;
107a1d: 83 c8 ff or $0xffffffff,%eax
cleanup_and_bail:
free( mt_entry );
if ( loc_to_free )
107a20: 85 f6 test %esi,%esi
107a22: 74 12 je 107a36 <mount+0x22d> <== NEVER TAKEN
rtems_filesystem_freenode( loc_to_free );
107a24: 83 ec 0c sub $0xc,%esp
107a27: 56 push %esi
107a28: 89 45 a8 mov %eax,-0x58(%ebp)
107a2b: e8 34 f9 ff ff call 107364 <rtems_filesystem_freenode>
107a30: 83 c4 10 add $0x10,%esp
107a33: 8b 45 a8 mov -0x58(%ebp),%eax
return -1;
}
107a36: 8d 65 f4 lea -0xc(%ebp),%esp
107a39: 5b pop %ebx
107a3a: 5e pop %esi
107a3b: 5f pop %edi
107a3c: c9 leave
107a3d: c3 ret
00107d90 <mount_and_make_target_path>:
const char *target,
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
107d90: 55 push %ebp
107d91: 89 e5 mov %esp,%ebp
107d93: 57 push %edi
107d94: 56 push %esi
107d95: 53 push %ebx
107d96: 83 ec 1c sub $0x1c,%esp
107d99: 8b 4d 08 mov 0x8(%ebp),%ecx
107d9c: 8b 5d 0c mov 0xc(%ebp),%ebx
107d9f: 8b 75 10 mov 0x10(%ebp),%esi
107da2: 8b 7d 14 mov 0x14(%ebp),%edi
107da5: 8b 55 18 mov 0x18(%ebp),%edx
int rv = -1;
if (target != NULL) {
107da8: 85 db test %ebx,%ebx
107daa: 74 3b je 107de7 <mount_and_make_target_path+0x57>
rv = rtems_mkdir(target, S_IRWXU | S_IRWXG | S_IRWXO);
107dac: 50 push %eax
107dad: 50 push %eax
107dae: 68 ff 01 00 00 push $0x1ff
107db3: 53 push %ebx
107db4: 89 55 e0 mov %edx,-0x20(%ebp)
107db7: 89 4d e4 mov %ecx,-0x1c(%ebp)
107dba: e8 bd 08 00 00 call 10867c <rtems_mkdir>
if (rv == 0) {
107dbf: 83 c4 10 add $0x10,%esp
107dc2: 85 c0 test %eax,%eax
107dc4: 8b 55 e0 mov -0x20(%ebp),%edx
107dc7: 8b 4d e4 mov -0x1c(%ebp),%ecx
107dca: 75 29 jne 107df5 <mount_and_make_target_path+0x65><== NEVER TAKEN
rv = mount(
107dcc: 89 55 18 mov %edx,0x18(%ebp)
107dcf: 89 7d 14 mov %edi,0x14(%ebp)
107dd2: 89 75 10 mov %esi,0x10(%ebp)
107dd5: 89 5d 0c mov %ebx,0xc(%ebp)
107dd8: 89 4d 08 mov %ecx,0x8(%ebp)
} else {
errno = EINVAL;
}
return rv;
}
107ddb: 8d 65 f4 lea -0xc(%ebp),%esp
107dde: 5b pop %ebx
107ddf: 5e pop %esi
107de0: 5f pop %edi
107de1: c9 leave
int rv = -1;
if (target != NULL) {
rv = rtems_mkdir(target, S_IRWXU | S_IRWXG | S_IRWXO);
if (rv == 0) {
rv = mount(
107de2: e9 a2 00 00 00 jmp 107e89 <mount>
options,
data
);
}
} else {
errno = EINVAL;
107de7: e8 c8 99 00 00 call 1117b4 <__errno>
107dec: c7 00 16 00 00 00 movl $0x16,(%eax)
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
int rv = -1;
107df2: 83 c8 ff or $0xffffffff,%eax
} else {
errno = EINVAL;
}
return rv;
}
107df5: 8d 65 f4 lea -0xc(%ebp),%esp
107df8: 5b pop %ebx
107df9: 5e pop %esi
107dfa: 5f pop %edi
107dfb: c9 leave
107dfc: c3 ret
00107a99 <newlib_create_hook>:
*/
bool newlib_create_hook(
rtems_tcb *current_task __attribute__((unused)),
rtems_tcb *creating_task
)
{
107a99: 55 push %ebp
107a9a: 89 e5 mov %esp,%ebp
107a9c: 57 push %edi
107a9d: 56 push %esi
107a9e: 53 push %ebx
107a9f: 83 ec 1c sub $0x1c,%esp
struct _reent *ptr;
if (_Thread_libc_reent == 0)
107aa2: 83 3d c8 53 12 00 00 cmpl $0x0,0x1253c8
107aa9: 75 14 jne 107abf <newlib_create_hook+0x26>
{
_REENT = _global_impure_ptr;
107aab: a1 80 fa 11 00 mov 0x11fa80,%eax
107ab0: a3 40 31 12 00 mov %eax,0x123140
RTEMS_INLINE_ROUTINE void _Thread_Set_libc_reent (
struct _reent **libc_reent
)
{
_Thread_libc_reent = libc_reent;
107ab5: c7 05 c8 53 12 00 40 movl $0x123140,0x1253c8
107abc: 31 12 00
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));
107abf: 83 ec 0c sub $0xc,%esp
107ac2: 68 24 04 00 00 push $0x424
107ac7: e8 7e 55 00 00 call 10d04a <_Workspace_Allocate>
107acc: 89 c2 mov %eax,%edx
#endif
if (ptr) {
107ace: 83 c4 10 add $0x10,%esp
_REENT_INIT_PTR((ptr)); /* GCC extension: structure constants */
creating_task->libc_reent = ptr;
return TRUE;
}
return FALSE;
107ad1: 31 c0 xor %eax,%eax
* hooks run with thread dispatching disabled.
*/
ptr = (struct _reent *) _Workspace_Allocate(sizeof(struct _reent));
#endif
if (ptr) {
107ad3: 85 d2 test %edx,%edx
107ad5: 0f 84 28 02 00 00 je 107d03 <newlib_create_hook+0x26a><== NEVER TAKEN
_REENT_INIT_PTR((ptr)); /* GCC extension: structure constants */
107adb: c7 02 00 00 00 00 movl $0x0,(%edx)
107ae1: 8d b2 ec 02 00 00 lea 0x2ec(%edx),%esi
107ae7: 89 72 04 mov %esi,0x4(%edx)
107aea: 8d 8a 54 03 00 00 lea 0x354(%edx),%ecx
107af0: 89 4a 08 mov %ecx,0x8(%edx)
107af3: 8d 8a bc 03 00 00 lea 0x3bc(%edx),%ecx
107af9: 89 4a 0c mov %ecx,0xc(%edx)
107afc: c7 42 10 00 00 00 00 movl $0x0,0x10(%edx)
107b03: 8d 4a 14 lea 0x14(%edx),%ecx
107b06: bb 19 00 00 00 mov $0x19,%ebx
107b0b: 89 cf mov %ecx,%edi
107b0d: 89 d9 mov %ebx,%ecx
107b0f: f3 aa rep stos %al,%es:(%edi)
107b11: 89 cb mov %ecx,%ebx
107b13: c7 42 30 00 00 00 00 movl $0x0,0x30(%edx)
107b1a: c7 42 34 12 ed 11 00 movl $0x11ed12,0x34(%edx)
107b21: c7 42 38 00 00 00 00 movl $0x0,0x38(%edx)
107b28: c7 42 3c 00 00 00 00 movl $0x0,0x3c(%edx)
107b2f: c7 42 40 00 00 00 00 movl $0x0,0x40(%edx)
107b36: c7 42 44 00 00 00 00 movl $0x0,0x44(%edx)
107b3d: c7 42 48 00 00 00 00 movl $0x0,0x48(%edx)
107b44: c7 42 4c 00 00 00 00 movl $0x0,0x4c(%edx)
107b4b: c7 42 50 00 00 00 00 movl $0x0,0x50(%edx)
107b52: c7 42 54 00 00 00 00 movl $0x0,0x54(%edx)
107b59: c7 42 58 00 00 00 00 movl $0x0,0x58(%edx)
107b60: c7 42 5c 00 00 00 00 movl $0x0,0x5c(%edx)
107b67: c6 42 60 00 movb $0x0,0x60(%edx)
107b6b: 8d 42 7c lea 0x7c(%edx),%eax
107b6e: 89 45 e4 mov %eax,-0x1c(%ebp)
107b71: b1 09 mov $0x9,%cl
107b73: 89 c7 mov %eax,%edi
107b75: 89 d8 mov %ebx,%eax
107b77: f3 ab rep stos %eax,%es:(%edi)
107b79: c7 82 a0 00 00 00 00 movl $0x0,0xa0(%edx)
107b80: 00 00 00
107b83: c7 82 a4 00 00 00 01 movl $0x1,0xa4(%edx)
107b8a: 00 00 00
107b8d: c7 82 a8 00 00 00 00 movl $0x0,0xa8(%edx)
107b94: 00 00 00
107b97: 66 c7 82 ac 00 00 00 movw $0x330e,0xac(%edx)
107b9e: 0e 33
107ba0: 66 c7 82 ae 00 00 00 movw $0xabcd,0xae(%edx)
107ba7: cd ab
107ba9: 66 c7 82 b0 00 00 00 movw $0x1234,0xb0(%edx)
107bb0: 34 12
107bb2: 66 c7 82 b2 00 00 00 movw $0xe66d,0xb2(%edx)
107bb9: 6d e6
107bbb: 66 c7 82 b4 00 00 00 movw $0xdeec,0xb4(%edx)
107bc2: ec de
107bc4: 66 c7 82 b6 00 00 00 movw $0x5,0xb6(%edx)
107bcb: 05 00
107bcd: 66 c7 82 b8 00 00 00 movw $0xb,0xb8(%edx)
107bd4: 0b 00
107bd6: c7 82 bc 00 00 00 00 movl $0x0,0xbc(%edx)
107bdd: 00 00 00
107be0: c7 82 c0 00 00 00 00 movl $0x0,0xc0(%edx)
107be7: 00 00 00
107bea: c7 82 c4 00 00 00 00 movl $0x0,0xc4(%edx)
107bf1: 00 00 00
107bf4: c7 82 c8 00 00 00 00 movl $0x0,0xc8(%edx)
107bfb: 00 00 00
107bfe: c7 82 cc 00 00 00 00 movl $0x0,0xcc(%edx)
107c05: 00 00 00
107c08: c7 82 d0 00 00 00 00 movl $0x0,0xd0(%edx)
107c0f: 00 00 00
107c12: c7 82 f8 00 00 00 00 movl $0x0,0xf8(%edx)
107c19: 00 00 00
107c1c: c7 82 fc 00 00 00 00 movl $0x0,0xfc(%edx)
107c23: 00 00 00
107c26: c7 82 00 01 00 00 00 movl $0x0,0x100(%edx)
107c2d: 00 00 00
107c30: c7 82 04 01 00 00 00 movl $0x0,0x104(%edx)
107c37: 00 00 00
107c3a: c7 82 08 01 00 00 00 movl $0x0,0x108(%edx)
107c41: 00 00 00
107c44: c7 82 0c 01 00 00 00 movl $0x0,0x10c(%edx)
107c4b: 00 00 00
107c4e: c7 82 10 01 00 00 00 movl $0x0,0x110(%edx)
107c55: 00 00 00
107c58: c7 82 14 01 00 00 00 movl $0x0,0x114(%edx)
107c5f: 00 00 00
107c62: c7 82 18 01 00 00 00 movl $0x0,0x118(%edx)
107c69: 00 00 00
107c6c: c7 82 1c 01 00 00 00 movl $0x0,0x11c(%edx)
107c73: 00 00 00
107c76: c6 82 d4 00 00 00 00 movb $0x0,0xd4(%edx)
107c7d: c6 82 dc 00 00 00 00 movb $0x0,0xdc(%edx)
107c84: c7 82 f4 00 00 00 00 movl $0x0,0xf4(%edx)
107c8b: 00 00 00
107c8e: c7 82 48 01 00 00 00 movl $0x0,0x148(%edx)
107c95: 00 00 00
107c98: c7 82 4c 01 00 00 00 movl $0x0,0x14c(%edx)
107c9f: 00 00 00
107ca2: c7 82 50 01 00 00 00 movl $0x0,0x150(%edx)
107ca9: 00 00 00
107cac: c7 82 54 01 00 00 00 movl $0x0,0x154(%edx)
107cb3: 00 00 00
107cb6: c7 82 d4 02 00 00 00 movl $0x0,0x2d4(%edx)
107cbd: 00 00 00
107cc0: c7 82 d4 01 00 00 00 movl $0x0,0x1d4(%edx)
107cc7: 00 00 00
107cca: c7 82 dc 02 00 00 00 movl $0x0,0x2dc(%edx)
107cd1: 00 00 00
107cd4: c7 82 e0 02 00 00 00 movl $0x0,0x2e0(%edx)
107cdb: 00 00 00
107cde: c7 82 e4 02 00 00 00 movl $0x0,0x2e4(%edx)
107ce5: 00 00 00
107ce8: c7 82 e8 02 00 00 00 movl $0x0,0x2e8(%edx)
107cef: 00 00 00
107cf2: b1 4e mov $0x4e,%cl
107cf4: 89 f7 mov %esi,%edi
107cf6: f3 ab rep stos %eax,%es:(%edi)
creating_task->libc_reent = ptr;
107cf8: 8b 45 0c mov 0xc(%ebp),%eax
107cfb: 89 90 e4 00 00 00 mov %edx,0xe4(%eax)
return TRUE;
107d01: b0 01 mov $0x1,%al
}
return FALSE;
}
107d03: 8d 65 f4 lea -0xc(%ebp),%esp
107d06: 5b pop %ebx
107d07: 5e pop %esi
107d08: 5f pop %edi
107d09: c9 leave
107d0a: c3 ret
00107d0b <newlib_delete_hook>:
void newlib_delete_hook(
rtems_tcb *current_task,
rtems_tcb *deleted_task
)
{
107d0b: 55 push %ebp
107d0c: 89 e5 mov %esp,%ebp
107d0e: 57 push %edi
107d0f: 56 push %esi
107d10: 53 push %ebx
107d11: 83 ec 0c sub $0xc,%esp
107d14: 8b 7d 08 mov 0x8(%ebp),%edi
107d17: 8b 75 0c mov 0xc(%ebp),%esi
/*
* The reentrancy structure was allocated by newlib using malloc()
*/
if (current_task == deleted_task) {
107d1a: 39 f7 cmp %esi,%edi
107d1c: 75 08 jne 107d26 <newlib_delete_hook+0x1b>
ptr = _REENT;
107d1e: 8b 1d 40 31 12 00 mov 0x123140,%ebx
107d24: eb 06 jmp 107d2c <newlib_delete_hook+0x21>
} else {
ptr = deleted_task->libc_reent;
107d26: 8b 9e e4 00 00 00 mov 0xe4(%esi),%ebx
}
if (ptr && ptr != _global_impure_ptr) {
107d2c: 85 db test %ebx,%ebx
107d2e: 74 20 je 107d50 <newlib_delete_hook+0x45><== NEVER TAKEN
107d30: 3b 1d 80 fa 11 00 cmp 0x11fa80,%ebx
107d36: 74 18 je 107d50 <newlib_delete_hook+0x45>
_reclaim_reent(ptr);
*/
/*
* Just in case there are some buffers lying around.
*/
_fwalk(ptr, newlib_free_buffers);
107d38: 50 push %eax
107d39: 50 push %eax
107d3a: 68 48 7a 10 00 push $0x107a48
107d3f: 53 push %ebx
107d40: e8 db 9b 00 00 call 111920 <_fwalk>
#if REENT_MALLOCED
free(ptr);
#else
_Workspace_Free(ptr);
107d45: 89 1c 24 mov %ebx,(%esp)
107d48: e8 16 53 00 00 call 10d063 <_Workspace_Free>
107d4d: 83 c4 10 add $0x10,%esp
#endif
}
deleted_task->libc_reent = NULL;
107d50: c7 86 e4 00 00 00 00 movl $0x0,0xe4(%esi)
107d57: 00 00 00
/*
* Require the switch back to another task to install its own
*/
if ( current_task == deleted_task ) {
107d5a: 39 f7 cmp %esi,%edi
107d5c: 75 0a jne 107d68 <newlib_delete_hook+0x5d>
_REENT = 0;
107d5e: c7 05 40 31 12 00 00 movl $0x0,0x123140
107d65: 00 00 00
}
}
107d68: 8d 65 f4 lea -0xc(%ebp),%esp
107d6b: 5b pop %ebx
107d6c: 5e pop %esi
107d6d: 5f pop %edi
107d6e: c9 leave
107d6f: c3 ret
00107a48 <newlib_free_buffers>:
*/
int newlib_free_buffers(
FILE *fp
)
{
107a48: 55 push %ebp
107a49: 89 e5 mov %esp,%ebp
107a4b: 53 push %ebx
107a4c: 83 ec 10 sub $0x10,%esp
107a4f: 8b 5d 08 mov 0x8(%ebp),%ebx
switch ( fileno(fp) ) {
107a52: 53 push %ebx
107a53: e8 b4 9a 00 00 call 11150c <fileno>
107a58: 83 c4 10 add $0x10,%esp
107a5b: 83 f8 02 cmp $0x2,%eax
107a5e: 77 26 ja 107a86 <newlib_free_buffers+0x3e><== NEVER TAKEN
case 0:
case 1:
case 2:
if (fp->_flags & __SMBF) {
107a60: f6 43 0c 80 testb $0x80,0xc(%ebx)
107a64: 74 2c je 107a92 <newlib_free_buffers+0x4a><== ALWAYS TAKEN
free( fp->_bf._base );
107a66: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
107a69: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
107a6c: e8 07 f9 ff ff call 107378 <free> <== NOT EXECUTED
fp->_flags &= ~__SMBF;
107a71: 66 81 63 0c 7f ff andw $0xff7f,0xc(%ebx) <== NOT EXECUTED
fp->_bf._base = fp->_p = (unsigned char *) NULL;
107a77: c7 03 00 00 00 00 movl $0x0,(%ebx) <== NOT EXECUTED
107a7d: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx) <== NOT EXECUTED
107a84: eb 09 jmp 107a8f <newlib_free_buffers+0x47><== NOT EXECUTED
}
break;
default:
fclose(fp);
107a86: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
107a89: 53 push %ebx <== NOT EXECUTED
107a8a: e8 01 98 00 00 call 111290 <fclose> <== NOT EXECUTED
107a8f: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
return 0;
}
107a92: 31 c0 xor %eax,%eax
107a94: 8b 5d fc mov -0x4(%ebp),%ebx
107a97: c9 leave
107a98: c3 ret
00107dd0 <open>:
int open(
const char *pathname,
int flags,
...
)
{
107dd0: 55 push %ebp
107dd1: 89 e5 mov %esp,%ebp
107dd3: 57 push %edi
107dd4: 56 push %esi
107dd5: 53 push %ebx
107dd6: 83 ec 3c sub $0x3c,%esp
/*
* Set the Evaluation flags
*/
eval_flags = 0;
status = flags + 1;
107dd9: 8b 45 0c mov 0xc(%ebp),%eax
107ddc: 40 inc %eax
if ( ( status & _FREAD ) == _FREAD )
107ddd: 89 c6 mov %eax,%esi
107ddf: 83 e6 01 and $0x1,%esi
eval_flags |= RTEMS_LIBIO_PERMS_READ;
107de2: f7 de neg %esi
107de4: 83 e6 04 and $0x4,%esi
if ( ( status & _FWRITE ) == _FWRITE )
107de7: a8 02 test $0x2,%al
107de9: 74 03 je 107dee <open+0x1e>
eval_flags |= RTEMS_LIBIO_PERMS_WRITE;
107deb: 83 ce 02 or $0x2,%esi
va_start(ap, flags);
mode = va_arg( ap, int );
107dee: 8b 45 10 mov 0x10(%ebp),%eax
107df1: 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();
107df4: e8 92 64 00 00 call 10e28b <rtems_libio_allocate>
107df9: 89 c3 mov %eax,%ebx
if ( iop == 0 ) {
107dfb: 85 c0 test %eax,%eax
107dfd: 0f 84 56 01 00 00 je 107f59 <open+0x189>
}
/*
* See if the file exists.
*/
status = rtems_filesystem_evaluate_path(
107e03: 83 c9 ff or $0xffffffff,%ecx
107e06: 8b 7d 08 mov 0x8(%ebp),%edi
107e09: 31 c0 xor %eax,%eax
107e0b: f2 ae repnz scas %es:(%edi),%al
107e0d: f7 d1 not %ecx
107e0f: 49 dec %ecx
107e10: 83 ec 0c sub $0xc,%esp
107e13: 6a 01 push $0x1
107e15: 8d 45 d4 lea -0x2c(%ebp),%eax
107e18: 50 push %eax
107e19: 56 push %esi
107e1a: 51 push %ecx
107e1b: ff 75 08 pushl 0x8(%ebp)
107e1e: e8 83 f4 ff ff call 1072a6 <rtems_filesystem_evaluate_path>
107e23: 89 c6 mov %eax,%esi
pathname, strlen( pathname ), eval_flags, &loc, true );
if ( status == -1 ) {
107e25: 83 c4 20 add $0x20,%esp
107e28: 83 f8 ff cmp $0xffffffff,%eax
107e2b: 75 6c jne 107e99 <open+0xc9>
if ( errno != ENOENT ) {
107e2d: e8 06 93 00 00 call 111138 <__errno>
107e32: 83 38 02 cmpl $0x2,(%eax)
107e35: 75 27 jne 107e5e <open+0x8e>
rc = errno;
goto done;
}
/* If the file does not exist and we are not trying to create it--> error */
if ( !(flags & O_CREAT) ) {
107e37: f7 45 0c 00 02 00 00 testl $0x200,0xc(%ebp)
107e3e: 0f 84 1c 01 00 00 je 107f60 <open+0x190>
rc = ENOENT;
goto done;
}
/* Create the node for the new regular file */
rc = mknod( pathname, S_IFREG | mode, 0LL );
107e44: 6a 00 push $0x0
107e46: 6a 00 push $0x0
107e48: 8b 45 c4 mov -0x3c(%ebp),%eax
107e4b: 80 cc 80 or $0x80,%ah
107e4e: 50 push %eax
107e4f: ff 75 08 pushl 0x8(%ebp)
107e52: e8 75 f8 ff ff call 1076cc <mknod>
if ( rc ) {
107e57: 83 c4 10 add $0x10,%esp
107e5a: 85 c0 test %eax,%eax
107e5c: 74 0e je 107e6c <open+0x9c> <== ALWAYS TAKEN
rc = errno;
107e5e: e8 d5 92 00 00 call 111138 <__errno>
107e63: 8b 30 mov (%eax),%esi
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;
107e65: 31 ff xor %edi,%edi
/* Create the node for the new regular file */
rc = mknod( pathname, S_IFREG | mode, 0LL );
if ( rc ) {
rc = errno;
goto done;
107e67: e9 10 01 00 00 jmp 107f7c <open+0x1ac>
/*
* 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(
107e6c: 89 f1 mov %esi,%ecx
107e6e: 8b 7d 08 mov 0x8(%ebp),%edi
107e71: 31 c0 xor %eax,%eax
107e73: f2 ae repnz scas %es:(%edi),%al
107e75: f7 d1 not %ecx
107e77: 49 dec %ecx
107e78: 83 ec 0c sub $0xc,%esp
107e7b: 6a 01 push $0x1
107e7d: 8d 45 d4 lea -0x2c(%ebp),%eax
107e80: 50 push %eax
107e81: 6a 00 push $0x0
107e83: 51 push %ecx
107e84: ff 75 08 pushl 0x8(%ebp)
107e87: e8 1a f4 ff ff call 1072a6 <rtems_filesystem_evaluate_path>
pathname, strlen( pathname ), 0x0, &loc, true );
if ( status != 0 ) { /* The file did not exist */
107e8c: 83 c4 20 add $0x20,%esp
107e8f: 85 c0 test %eax,%eax
107e91: 0f 85 d2 00 00 00 jne 107f69 <open+0x199> <== NEVER TAKEN
107e97: eb 13 jmp 107eac <open+0xdc>
rc = EACCES;
goto done;
}
} else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) {
107e99: 8b 45 0c mov 0xc(%ebp),%eax
107e9c: 25 00 0a 00 00 and $0xa00,%eax
107ea1: 3d 00 0a 00 00 cmp $0xa00,%eax
107ea6: 0f 84 c6 00 00 00 je 107f72 <open+0x1a2>
/*
* Fill in the file control block based on the loc structure
* returned by successful path evaluation.
*/
iop->flags |= rtems_libio_fcntl_flags( flags );
107eac: 8b 73 14 mov 0x14(%ebx),%esi
107eaf: 83 ec 0c sub $0xc,%esp
107eb2: ff 75 0c pushl 0xc(%ebp)
107eb5: e8 5e 63 00 00 call 10e218 <rtems_libio_fcntl_flags>
107eba: 09 f0 or %esi,%eax
107ebc: 89 43 14 mov %eax,0x14(%ebx)
iop->pathinfo = loc;
107ebf: 8d 7b 18 lea 0x18(%ebx),%edi
107ec2: 8d 75 d4 lea -0x2c(%ebp),%esi
107ec5: b9 05 00 00 00 mov $0x5,%ecx
107eca: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode );
107ecc: 8b 43 20 mov 0x20(%ebx),%eax
107ecf: ff 75 c4 pushl -0x3c(%ebp)
107ed2: ff 75 0c pushl 0xc(%ebp)
107ed5: ff 75 08 pushl 0x8(%ebp)
107ed8: 53 push %ebx
107ed9: ff 10 call *(%eax)
if ( rc ) {
107edb: 83 c4 20 add $0x20,%esp
107ede: 85 c0 test %eax,%eax
107ee0: 74 0f je 107ef1 <open+0x121>
rc = errno;
107ee2: e8 51 92 00 00 call 111138 <__errno>
107ee7: 8b 30 mov (%eax),%esi
rc = EEXIST;
loc_to_free = &loc;
goto done;
}
loc_to_free = &loc;
107ee9: 8d 7d d4 lea -0x2c(%ebp),%edi
iop->pathinfo = loc;
rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode );
if ( rc ) {
rc = errno;
goto done;
107eec: e9 8b 00 00 00 jmp 107f7c <open+0x1ac>
}
/*
* Optionally truncate the file.
*/
if ( (flags & O_TRUNC) == O_TRUNC ) {
107ef1: f7 45 0c 00 04 00 00 testl $0x400,0xc(%ebp)
107ef8: 0f 84 ae 00 00 00 je 107fac <open+0x1dc>
rc = ftruncate( iop - rtems_libio_iops, 0 );
107efe: 50 push %eax
107eff: 6a 00 push $0x0
107f01: 6a 00 push $0x0
107f03: 89 d8 mov %ebx,%eax
107f05: 2b 05 f8 51 12 00 sub 0x1251f8,%eax
107f0b: c1 f8 03 sar $0x3,%eax
107f0e: 69 c0 b7 6d db b6 imul $0xb6db6db7,%eax,%eax
107f14: 50 push %eax
107f15: e8 16 62 00 00 call 10e130 <ftruncate>
107f1a: 89 c6 mov %eax,%esi
if ( rc ) {
107f1c: 83 c4 10 add $0x10,%esp
107f1f: 85 c0 test %eax,%eax
107f21: 0f 84 85 00 00 00 je 107fac <open+0x1dc>
if(errno) rc = errno;
107f27: e8 0c 92 00 00 call 111138 <__errno>
107f2c: 83 38 00 cmpl $0x0,(%eax)
107f2f: 74 07 je 107f38 <open+0x168> <== NEVER TAKEN
107f31: e8 02 92 00 00 call 111138 <__errno>
107f36: 8b 30 mov (%eax),%esi
close( iop - rtems_libio_iops );
107f38: 83 ec 0c sub $0xc,%esp
107f3b: 2b 1d f8 51 12 00 sub 0x1251f8,%ebx
107f41: c1 fb 03 sar $0x3,%ebx
107f44: 69 db b7 6d db b6 imul $0xb6db6db7,%ebx,%ebx
107f4a: 53 push %ebx
107f4b: e8 70 61 00 00 call 10e0c0 <close>
107f50: 83 c4 10 add $0x10,%esp
/* those are released by close(): */
iop = 0;
loc_to_free = NULL;
107f53: 31 ff xor %edi,%edi
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;
107f55: 31 db xor %ebx,%ebx
107f57: eb 23 jmp 107f7c <open+0x1ac>
*/
/* allocate a file control block */
iop = rtems_libio_allocate();
if ( iop == 0 ) {
rc = ENFILE;
107f59: be 17 00 00 00 mov $0x17,%esi
107f5e: eb 40 jmp 107fa0 <open+0x1d0>
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;
107f60: 31 ff xor %edi,%edi
goto done;
}
/* If the file does not exist and we are not trying to create it--> error */
if ( !(flags & O_CREAT) ) {
rc = ENOENT;
107f62: be 02 00 00 00 mov $0x2,%esi
107f67: eb 17 jmp 107f80 <open+0x1b0>
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;
107f69: 31 ff xor %edi,%edi <== NOT EXECUTED
* 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;
107f6b: be 0d 00 00 00 mov $0xd,%esi <== NOT EXECUTED
107f70: eb 0e jmp 107f80 <open+0x1b0> <== NOT EXECUTED
}
} 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;
107f72: 8d 7d d4 lea -0x2c(%ebp),%edi
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;
107f75: be 11 00 00 00 mov $0x11,%esi
107f7a: eb 04 jmp 107f80 <open+0x1b0>
* Single exit and clean up path.
*/
done:
va_end(ap);
if ( rc ) {
107f7c: 85 f6 test %esi,%esi
107f7e: 74 2c je 107fac <open+0x1dc> <== NEVER TAKEN
if ( iop )
107f80: 85 db test %ebx,%ebx
107f82: 74 0c je 107f90 <open+0x1c0>
rtems_libio_free( iop );
107f84: 83 ec 0c sub $0xc,%esp
107f87: 53 push %ebx
107f88: e8 77 63 00 00 call 10e304 <rtems_libio_free>
107f8d: 83 c4 10 add $0x10,%esp
if ( loc_to_free )
107f90: 85 ff test %edi,%edi
107f92: 74 0c je 107fa0 <open+0x1d0>
rtems_filesystem_freenode( loc_to_free );
107f94: 83 ec 0c sub $0xc,%esp
107f97: 57 push %edi
107f98: e8 c7 f3 ff ff call 107364 <rtems_filesystem_freenode>
107f9d: 83 c4 10 add $0x10,%esp
rtems_set_errno_and_return_minus_one( rc );
107fa0: e8 93 91 00 00 call 111138 <__errno>
107fa5: 89 30 mov %esi,(%eax)
107fa7: 83 c8 ff or $0xffffffff,%eax
107faa: eb 0f jmp 107fbb <open+0x1eb>
}
return iop - rtems_libio_iops;
107fac: 2b 1d f8 51 12 00 sub 0x1251f8,%ebx
107fb2: c1 fb 03 sar $0x3,%ebx
107fb5: 69 c3 b7 6d db b6 imul $0xb6db6db7,%ebx,%eax
}
107fbb: 8d 65 f4 lea -0xc(%ebp),%esp
107fbe: 5b pop %ebx
107fbf: 5e pop %esi
107fc0: 5f pop %edi
107fc1: c9 leave
107fc2: c3 ret
00108b72 <oproc>:
/*
* Handle output processing
*/
static void
oproc (unsigned char c, struct rtems_termios_tty *tty)
{
108b72: 55 push %ebp
108b73: 89 e5 mov %esp,%ebp
108b75: 56 push %esi
108b76: 53 push %ebx
108b77: 83 ec 10 sub $0x10,%esp
108b7a: 89 d3 mov %edx,%ebx
108b7c: 88 45 f4 mov %al,-0xc(%ebp)
int i;
if (tty->termios.c_oflag & OPOST) {
108b7f: 8b 52 34 mov 0x34(%edx),%edx
108b82: f6 c2 01 test $0x1,%dl
108b85: 0f 84 ed 00 00 00 je 108c78 <oproc+0x106> <== NEVER TAKEN
switch (c) {
108b8b: 3c 09 cmp $0x9,%al
108b8d: 74 75 je 108c04 <oproc+0x92>
108b8f: 77 0d ja 108b9e <oproc+0x2c> <== ALWAYS TAKEN
108b91: 3c 08 cmp $0x8,%al <== NOT EXECUTED
108b93: 0f 85 aa 00 00 00 jne 108c43 <oproc+0xd1> <== NOT EXECUTED
108b99: e9 98 00 00 00 jmp 108c36 <oproc+0xc4> <== NOT EXECUTED
108b9e: 3c 0a cmp $0xa,%al
108ba0: 74 0a je 108bac <oproc+0x3a>
108ba2: 3c 0d cmp $0xd,%al
108ba4: 0f 85 99 00 00 00 jne 108c43 <oproc+0xd1> <== ALWAYS TAKEN
108baa: eb 32 jmp 108bde <oproc+0x6c> <== NOT EXECUTED
case '\n':
if (tty->termios.c_oflag & ONLRET)
108bac: f6 c2 20 test $0x20,%dl
108baf: 74 07 je 108bb8 <oproc+0x46> <== ALWAYS TAKEN
tty->column = 0;
108bb1: c7 43 28 00 00 00 00 movl $0x0,0x28(%ebx) <== NOT EXECUTED
if (tty->termios.c_oflag & ONLCR) {
108bb8: 80 e2 04 and $0x4,%dl
108bbb: 0f 84 b7 00 00 00 je 108c78 <oproc+0x106> <== NEVER TAKEN
rtems_termios_puts ("\r", 1, tty);
108bc1: 56 push %esi
108bc2: 53 push %ebx
108bc3: 6a 01 push $0x1
108bc5: 68 64 f0 11 00 push $0x11f064
108bca: e8 83 fe ff ff call 108a52 <rtems_termios_puts>
tty->column = 0;
108bcf: c7 43 28 00 00 00 00 movl $0x0,0x28(%ebx)
108bd6: 83 c4 10 add $0x10,%esp
108bd9: e9 9a 00 00 00 jmp 108c78 <oproc+0x106>
}
break;
case '\r':
if ((tty->termios.c_oflag & ONOCR) && (tty->column == 0))
108bde: f6 c2 10 test $0x10,%dl <== NOT EXECUTED
108be1: 74 0a je 108bed <oproc+0x7b> <== NOT EXECUTED
108be3: 83 7b 28 00 cmpl $0x0,0x28(%ebx) <== NOT EXECUTED
108be7: 0f 84 9b 00 00 00 je 108c88 <oproc+0x116> <== NOT EXECUTED
return;
if (tty->termios.c_oflag & OCRNL) {
108bed: f6 c2 08 test $0x8,%dl <== NOT EXECUTED
108bf0: 74 09 je 108bfb <oproc+0x89> <== NOT EXECUTED
c = '\n';
108bf2: c6 45 f4 0a movb $0xa,-0xc(%ebp) <== NOT EXECUTED
if (tty->termios.c_oflag & ONLRET)
108bf6: 80 e2 20 and $0x20,%dl <== NOT EXECUTED
108bf9: 74 7d je 108c78 <oproc+0x106> <== NOT EXECUTED
tty->column = 0;
break;
}
tty->column = 0;
108bfb: c7 43 28 00 00 00 00 movl $0x0,0x28(%ebx) <== NOT EXECUTED
break;
108c02: eb 74 jmp 108c78 <oproc+0x106> <== NOT EXECUTED
case '\t':
i = 8 - (tty->column & 7);
108c04: 8b 4b 28 mov 0x28(%ebx),%ecx
108c07: 89 ce mov %ecx,%esi
108c09: 83 e6 07 and $0x7,%esi
108c0c: b8 08 00 00 00 mov $0x8,%eax
108c11: 29 f0 sub %esi,%eax
if ((tty->termios.c_oflag & TABDLY) == XTABS) {
108c13: 81 e2 00 18 00 00 and $0x1800,%edx
108c19: 81 fa 00 18 00 00 cmp $0x1800,%edx
108c1f: 8d 14 08 lea (%eax,%ecx,1),%edx
108c22: 75 0d jne 108c31 <oproc+0xbf> <== NEVER TAKEN
tty->column += i;
108c24: 89 53 28 mov %edx,0x28(%ebx)
rtems_termios_puts ( " ", i, tty);
108c27: 51 push %ecx
108c28: 53 push %ebx
108c29: 50 push %eax
108c2a: 68 24 ec 11 00 push $0x11ec24
108c2f: eb 4f jmp 108c80 <oproc+0x10e>
return;
}
tty->column += i;
108c31: 89 53 28 mov %edx,0x28(%ebx) <== NOT EXECUTED
break;
108c34: eb 42 jmp 108c78 <oproc+0x106> <== NOT EXECUTED
case '\b':
if (tty->column > 0)
108c36: 8b 43 28 mov 0x28(%ebx),%eax <== NOT EXECUTED
108c39: 85 c0 test %eax,%eax <== NOT EXECUTED
108c3b: 7e 3b jle 108c78 <oproc+0x106> <== NOT EXECUTED
tty->column--;
108c3d: 48 dec %eax <== NOT EXECUTED
108c3e: 89 43 28 mov %eax,0x28(%ebx) <== NOT EXECUTED
108c41: eb 35 jmp 108c78 <oproc+0x106> <== NOT EXECUTED
break;
default:
if (tty->termios.c_oflag & OLCUC)
108c43: 80 e2 02 and $0x2,%dl
108c46: 74 1c je 108c64 <oproc+0xf2> <== ALWAYS TAKEN
c = toupper(c);
108c48: 0f b6 c0 movzbl %al,%eax <== NOT EXECUTED
108c4b: 8b 15 3c 31 12 00 mov 0x12313c,%edx <== NOT EXECUTED
108c51: 0f be 54 02 01 movsbl 0x1(%edx,%eax,1),%edx <== NOT EXECUTED
108c56: 83 e2 03 and $0x3,%edx <== NOT EXECUTED
108c59: 83 fa 02 cmp $0x2,%edx <== NOT EXECUTED
108c5c: 75 03 jne 108c61 <oproc+0xef> <== NOT EXECUTED
108c5e: 83 e8 20 sub $0x20,%eax <== NOT EXECUTED
108c61: 88 45 f4 mov %al,-0xc(%ebp) <== NOT EXECUTED
if (!iscntrl(c))
108c64: 0f b6 45 f4 movzbl -0xc(%ebp),%eax
108c68: 8b 15 3c 31 12 00 mov 0x12313c,%edx
108c6e: f6 44 02 01 20 testb $0x20,0x1(%edx,%eax,1)
108c73: 75 03 jne 108c78 <oproc+0x106> <== NEVER TAKEN
tty->column++;
108c75: ff 43 28 incl 0x28(%ebx)
break;
}
}
rtems_termios_puts (&c, 1, tty);
108c78: 52 push %edx
108c79: 53 push %ebx
108c7a: 6a 01 push $0x1
108c7c: 8d 45 f4 lea -0xc(%ebp),%eax
108c7f: 50 push %eax
108c80: e8 cd fd ff ff call 108a52 <rtems_termios_puts>
108c85: 83 c4 10 add $0x10,%esp
}
108c88: 8d 65 f8 lea -0x8(%ebp),%esp
108c8b: 5b pop %ebx
108c8c: 5e pop %esi
108c8d: c9 leave
108c8e: c3 ret
0010ef5c <pipe_create>:
* Called by pipe() to create an anonymous pipe.
*/
int pipe_create(
int filsdes[2]
)
{
10ef5c: 55 push %ebp
10ef5d: 89 e5 mov %esp,%ebp
10ef5f: 57 push %edi
10ef60: 56 push %esi
10ef61: 53 push %ebx
10ef62: 83 ec 34 sub $0x34,%esp
rtems_libio_t *iop;
int err = 0;
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
10ef65: 68 ff 01 00 00 push $0x1ff
10ef6a: 68 fc 0d 12 00 push $0x120dfc
10ef6f: e8 58 14 00 00 call 1103cc <rtems_mkdir>
10ef74: 83 c4 10 add $0x10,%esp
return -1;
10ef77: c7 45 d4 ff ff ff ff movl $0xffffffff,-0x2c(%ebp)
)
{
rtems_libio_t *iop;
int err = 0;
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
10ef7e: 85 c0 test %eax,%eax
10ef80: 0f 85 e8 00 00 00 jne 10f06e <pipe_create+0x112> <== NEVER TAKEN
return -1;
/* /tmp/.fifoXXXX */
char fifopath[15];
memcpy(fifopath, "/tmp/.fifo", 10);
10ef86: 8d 5d d9 lea -0x27(%ebp),%ebx
10ef89: be 01 0e 12 00 mov $0x120e01,%esi
10ef8e: b9 0a 00 00 00 mov $0xa,%ecx
10ef93: 89 df mov %ebx,%edi
10ef95: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
sprintf(fifopath + 10, "%04x", rtems_pipe_no ++);
10ef97: 0f b7 05 20 60 12 00 movzwl 0x126020,%eax
10ef9e: 8d 50 01 lea 0x1(%eax),%edx
10efa1: 66 89 15 20 60 12 00 mov %dx,0x126020
10efa8: 57 push %edi
10efa9: 50 push %eax
10efaa: 68 0c 0e 12 00 push $0x120e0c
10efaf: 8d 45 e3 lea -0x1d(%ebp),%eax
10efb2: 50 push %eax
10efb3: e8 c0 43 00 00 call 113378 <sprintf>
/* Try creating FIFO file until find an available file name */
while (mkfifo(fifopath, S_IRUSR|S_IWUSR) != 0) {
10efb8: 59 pop %ecx
10efb9: 5e pop %esi
10efba: 68 80 01 00 00 push $0x180
10efbf: 53 push %ebx
10efc0: e8 c7 11 00 00 call 11018c <mkfifo>
10efc5: 83 c4 10 add $0x10,%esp
10efc8: 85 c0 test %eax,%eax
10efca: 74 0a je 10efd6 <pipe_create+0x7a>
if (errno != EEXIST){
10efcc: e8 bb 39 00 00 call 11298c <__errno>
10efd1: e9 98 00 00 00 jmp 10f06e <pipe_create+0x112>
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);
10efd6: 52 push %edx
10efd7: 52 push %edx
10efd8: 68 00 40 00 00 push $0x4000
10efdd: 53 push %ebx
10efde: e8 4d 9e ff ff call 108e30 <open>
10efe3: 8b 55 08 mov 0x8(%ebp),%edx
10efe6: 89 02 mov %eax,(%edx)
if (filsdes[0] < 0) {
10efe8: 83 c4 10 add $0x10,%esp
10efeb: 85 c0 test %eax,%eax
10efed: 79 0d jns 10effc <pipe_create+0xa0>
err = errno;
10efef: e8 98 39 00 00 call 11298c <__errno>
10eff4: 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);
10eff6: 83 ec 0c sub $0xc,%esp
10eff9: 53 push %ebx
10effa: eb 51 jmp 10f04d <pipe_create+0xf1>
}
else {
/* Reset open file to blocking mode */
iop = rtems_libio_iop(filsdes[0]);
10effc: 31 d2 xor %edx,%edx
10effe: 3b 05 44 21 12 00 cmp 0x122144,%eax
10f004: 73 09 jae 10f00f <pipe_create+0xb3> <== NEVER TAKEN
10f006: 6b d0 38 imul $0x38,%eax,%edx
10f009: 03 15 20 62 12 00 add 0x126220,%edx
iop->flags &= ~LIBIO_FLAGS_NO_DELAY;
10f00f: 83 62 14 fe andl $0xfffffffe,0x14(%edx)
filsdes[1] = open(fifopath, O_WRONLY);
10f013: 50 push %eax
10f014: 50 push %eax
10f015: 6a 01 push $0x1
10f017: 8d 45 d9 lea -0x27(%ebp),%eax
10f01a: 50 push %eax
10f01b: e8 10 9e ff ff call 108e30 <open>
10f020: 8b 55 08 mov 0x8(%ebp),%edx
10f023: 89 42 04 mov %eax,0x4(%edx)
if (filsdes[1] < 0) {
10f026: 83 c4 10 add $0x10,%esp
int pipe_create(
int filsdes[2]
)
{
rtems_libio_t *iop;
int err = 0;
10f029: 31 f6 xor %esi,%esi
iop = rtems_libio_iop(filsdes[0]);
iop->flags &= ~LIBIO_FLAGS_NO_DELAY;
filsdes[1] = open(fifopath, O_WRONLY);
if (filsdes[1] < 0) {
10f02b: 85 c0 test %eax,%eax
10f02d: 79 17 jns 10f046 <pipe_create+0xea>
err = errno;
10f02f: e8 58 39 00 00 call 11298c <__errno>
10f034: 8b 30 mov (%eax),%esi
close(filsdes[0]);
10f036: 83 ec 0c sub $0xc,%esp
10f039: 8b 45 08 mov 0x8(%ebp),%eax
10f03c: ff 30 pushl (%eax)
10f03e: e8 d1 8f ff ff call 108014 <close>
10f043: 83 c4 10 add $0x10,%esp
}
unlink(fifopath);
10f046: 83 ec 0c sub $0xc,%esp
10f049: 8d 45 d9 lea -0x27(%ebp),%eax
10f04c: 50 push %eax
10f04d: e8 7a b9 ff ff call 10a9cc <unlink>
10f052: 83 c4 10 add $0x10,%esp
}
if(err != 0)
rtems_set_errno_and_return_minus_one(err);
return 0;
10f055: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp)
err = errno;
close(filsdes[0]);
}
unlink(fifopath);
}
if(err != 0)
10f05c: 85 f6 test %esi,%esi
10f05e: 74 0e je 10f06e <pipe_create+0x112>
rtems_set_errno_and_return_minus_one(err);
10f060: e8 27 39 00 00 call 11298c <__errno>
10f065: 89 30 mov %esi,(%eax)
10f067: c7 45 d4 ff ff ff ff movl $0xffffffff,-0x2c(%ebp)
return 0;
}
10f06e: 8b 45 d4 mov -0x2c(%ebp),%eax
10f071: 8d 65 f4 lea -0xc(%ebp),%esp
10f074: 5b pop %ebx
10f075: 5e pop %esi
10f076: 5f pop %edi
10f077: c9 leave
10f078: c3 ret
0011025b <pipe_ioctl>:
pipe_control_t *pipe,
uint32_t cmd,
void *buffer,
rtems_libio_t *iop
)
{
11025b: 55 push %ebp
11025c: 89 e5 mov %esp,%ebp
11025e: 56 push %esi
11025f: 53 push %ebx
110260: 8b 5d 08 mov 0x8(%ebp),%ebx
110263: 8b 75 10 mov 0x10(%ebp),%esi
*(unsigned int *)buffer = pipe->Length;
PIPE_UNLOCK(pipe);
return 0;
}
return -EINVAL;
110266: b8 ea ff ff ff mov $0xffffffea,%eax
uint32_t cmd,
void *buffer,
rtems_libio_t *iop
)
{
if (cmd == FIONREAD) {
11026b: 81 7d 0c 7f 66 04 40 cmpl $0x4004667f,0xc(%ebp)
110272: 75 36 jne 1102aa <pipe_ioctl+0x4f>
if (buffer == NULL)
return -EFAULT;
110274: b0 f2 mov $0xf2,%al
void *buffer,
rtems_libio_t *iop
)
{
if (cmd == FIONREAD) {
if (buffer == NULL)
110276: 85 f6 test %esi,%esi
110278: 74 30 je 1102aa <pipe_ioctl+0x4f>
return -EFAULT;
if (! PIPE_LOCK(pipe))
11027a: 51 push %ecx
11027b: 6a 00 push $0x0
11027d: 6a 00 push $0x0
11027f: ff 73 28 pushl 0x28(%ebx)
110282: e8 d9 b9 ff ff call 10bc60 <rtems_semaphore_obtain>
110287: 89 c2 mov %eax,%edx
110289: 83 c4 10 add $0x10,%esp
return -EINTR;
11028c: b8 fc ff ff ff mov $0xfffffffc,%eax
{
if (cmd == FIONREAD) {
if (buffer == NULL)
return -EFAULT;
if (! PIPE_LOCK(pipe))
110291: 85 d2 test %edx,%edx
110293: 75 15 jne 1102aa <pipe_ioctl+0x4f> <== NEVER TAKEN
return -EINTR;
/* Return length of pipe */
*(unsigned int *)buffer = pipe->Length;
110295: 8b 43 0c mov 0xc(%ebx),%eax
110298: 89 06 mov %eax,(%esi)
PIPE_UNLOCK(pipe);
11029a: 83 ec 0c sub $0xc,%esp
11029d: ff 73 28 pushl 0x28(%ebx)
1102a0: e8 a7 ba ff ff call 10bd4c <rtems_semaphore_release>
return 0;
1102a5: 83 c4 10 add $0x10,%esp
1102a8: 31 c0 xor %eax,%eax
}
return -EINVAL;
}
1102aa: 8d 65 f8 lea -0x8(%ebp),%esp
1102ad: 5b pop %ebx
1102ae: 5e pop %esi
1102af: c9 leave
1102b0: c3 ret
0010ff4c <pipe_read>:
pipe_control_t *pipe,
void *buffer,
size_t count,
rtems_libio_t *iop
)
{
10ff4c: 55 push %ebp
10ff4d: 89 e5 mov %esp,%ebp
10ff4f: 57 push %edi
10ff50: 56 push %esi
10ff51: 53 push %ebx
10ff52: 83 ec 30 sub $0x30,%esp
10ff55: 8b 5d 08 mov 0x8(%ebp),%ebx
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
10ff58: 6a 00 push $0x0
10ff5a: 6a 00 push $0x0
10ff5c: ff 73 28 pushl 0x28(%ebx)
10ff5f: e8 fc bc ff ff call 10bc60 <rtems_semaphore_obtain>
10ff64: 83 c4 10 add $0x10,%esp
return -EINTR;
10ff67: be fc ff ff ff mov $0xfffffffc,%esi
rtems_libio_t *iop
)
{
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
10ff6c: 85 c0 test %eax,%eax
10ff6e: 0f 85 2f 01 00 00 jne 1100a3 <pipe_read+0x157> <== NEVER TAKEN
10ff74: c7 45 d0 00 00 00 00 movl $0x0,-0x30(%ebp)
10ff7b: e9 f0 00 00 00 jmp 110070 <pipe_read+0x124>
return -EINTR;
while (read < count) {
while (PIPE_EMPTY(pipe)) {
/* Not an error */
if (pipe->Writers == 0)
10ff80: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
10ff84: 0f 84 f2 00 00 00 je 11007c <pipe_read+0x130>
goto out_locked;
if (LIBIO_NODELAY(iop)) {
10ff8a: 8b 45 14 mov 0x14(%ebp),%eax
10ff8d: f6 40 14 01 testb $0x1,0x14(%eax)
10ff91: 0f 85 e9 00 00 00 jne 110080 <pipe_read+0x134>
ret = -EAGAIN;
goto out_locked;
}
/* Wait until pipe is no more empty or no writer exists */
pipe->waitingReaders ++;
10ff97: ff 43 18 incl 0x18(%ebx)
PIPE_UNLOCK(pipe);
10ff9a: 83 ec 0c sub $0xc,%esp
10ff9d: ff 73 28 pushl 0x28(%ebx)
10ffa0: e8 a7 bd ff ff call 10bd4c <rtems_semaphore_release>
if (! PIPE_READWAIT(pipe))
10ffa5: 5f pop %edi
10ffa6: 58 pop %eax
10ffa7: 6a 00 push $0x0
10ffa9: ff 73 2c pushl 0x2c(%ebx)
10ffac: e8 9f 16 00 00 call 111650 <rtems_barrier_wait>
10ffb1: 83 c4 0c add $0xc,%esp
10ffb4: 83 f8 01 cmp $0x1,%eax
10ffb7: 19 f6 sbb %esi,%esi
10ffb9: f7 d6 not %esi
10ffbb: 83 e6 fc and $0xfffffffc,%esi
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
10ffbe: 6a 00 push $0x0
10ffc0: 6a 00 push $0x0
10ffc2: ff 73 28 pushl 0x28(%ebx)
10ffc5: e8 96 bc ff ff call 10bc60 <rtems_semaphore_obtain>
10ffca: 83 c4 10 add $0x10,%esp
10ffcd: 85 c0 test %eax,%eax
10ffcf: 0f 85 c0 00 00 00 jne 110095 <pipe_read+0x149> <== NEVER TAKEN
/* WARN waitingReaders not restored! */
ret = -EINTR;
goto out_nolock;
}
pipe->waitingReaders --;
10ffd5: ff 4b 18 decl 0x18(%ebx)
if (ret != 0)
10ffd8: 85 f6 test %esi,%esi
10ffda: 0f 85 a5 00 00 00 jne 110085 <pipe_read+0x139> <== NEVER TAKEN
if (! PIPE_LOCK(pipe))
return -EINTR;
while (read < count) {
while (PIPE_EMPTY(pipe)) {
10ffe0: 8b 53 0c mov 0xc(%ebx),%edx
10ffe3: 85 d2 test %edx,%edx
10ffe5: 74 99 je 10ff80 <pipe_read+0x34>
if (ret != 0)
goto out_locked;
}
/* Read chunk bytes */
chunk = MIN(count - read, pipe->Length);
10ffe7: 8b 45 10 mov 0x10(%ebp),%eax
10ffea: 2b 45 d0 sub -0x30(%ebp),%eax
10ffed: 89 55 d4 mov %edx,-0x2c(%ebp)
10fff0: 39 c2 cmp %eax,%edx
10fff2: 76 03 jbe 10fff7 <pipe_read+0xab>
10fff4: 89 45 d4 mov %eax,-0x2c(%ebp)
chunk1 = pipe->Size - pipe->Start;
10fff7: 8b 73 08 mov 0x8(%ebx),%esi
10fffa: 8b 43 04 mov 0x4(%ebx),%eax
10fffd: 29 f0 sub %esi,%eax
if (chunk > chunk1) {
10ffff: 39 45 d4 cmp %eax,-0x2c(%ebp)
110002: 8b 7d 0c mov 0xc(%ebp),%edi
110005: 8b 4d d0 mov -0x30(%ebp),%ecx
110008: 8d 14 0f lea (%edi,%ecx,1),%edx
11000b: 7e 1b jle 110028 <pipe_read+0xdc>
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1);
11000d: 03 33 add (%ebx),%esi
11000f: 89 d7 mov %edx,%edi
110011: 89 c1 mov %eax,%ecx
110013: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1);
110015: 8b 55 d0 mov -0x30(%ebp),%edx
110018: 01 c2 add %eax,%edx
11001a: 03 55 0c add 0xc(%ebp),%edx
11001d: 8b 4d d4 mov -0x2c(%ebp),%ecx
110020: 29 c1 sub %eax,%ecx
110022: 8b 33 mov (%ebx),%esi
110024: 89 d7 mov %edx,%edi
110026: eb 07 jmp 11002f <pipe_read+0xe3>
}
else
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk);
110028: 03 33 add (%ebx),%esi
11002a: 89 d7 mov %edx,%edi
11002c: 8b 4d d4 mov -0x2c(%ebp),%ecx
11002f: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
pipe->Start += chunk;
110031: 8b 45 d4 mov -0x2c(%ebp),%eax
110034: 03 43 08 add 0x8(%ebx),%eax
pipe->Start %= pipe->Size;
110037: 31 d2 xor %edx,%edx
110039: f7 73 04 divl 0x4(%ebx)
11003c: 89 53 08 mov %edx,0x8(%ebx)
pipe->Length -= chunk;
11003f: 8b 43 0c mov 0xc(%ebx),%eax
110042: 2b 45 d4 sub -0x2c(%ebp),%eax
110045: 89 43 0c mov %eax,0xc(%ebx)
/* For buffering optimization */
if (PIPE_EMPTY(pipe))
110048: 85 c0 test %eax,%eax
11004a: 75 07 jne 110053 <pipe_read+0x107>
pipe->Start = 0;
11004c: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx)
if (pipe->waitingWriters > 0)
110053: 83 7b 1c 00 cmpl $0x0,0x1c(%ebx)
110057: 74 11 je 11006a <pipe_read+0x11e>
PIPE_WAKEUPWRITERS(pipe);
110059: 56 push %esi
11005a: 56 push %esi
11005b: 8d 45 e4 lea -0x1c(%ebp),%eax
11005e: 50 push %eax
11005f: ff 73 30 pushl 0x30(%ebx)
110062: e8 91 15 00 00 call 1115f8 <rtems_barrier_release>
110067: 83 c4 10 add $0x10,%esp
read += chunk;
11006a: 8b 4d d4 mov -0x2c(%ebp),%ecx
11006d: 01 4d d0 add %ecx,-0x30(%ebp)
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
return -EINTR;
while (read < count) {
110070: 8b 7d 10 mov 0x10(%ebp),%edi
110073: 39 7d d0 cmp %edi,-0x30(%ebp)
110076: 0f 82 64 ff ff ff jb 10ffe0 <pipe_read+0x94>
while (PIPE_EMPTY(pipe)) {
/* Not an error */
if (pipe->Writers == 0)
11007c: 31 f6 xor %esi,%esi
11007e: eb 05 jmp 110085 <pipe_read+0x139>
goto out_locked;
if (LIBIO_NODELAY(iop)) {
ret = -EAGAIN;
110080: be f5 ff ff ff mov $0xfffffff5,%esi
PIPE_WAKEUPWRITERS(pipe);
read += chunk;
}
out_locked:
PIPE_UNLOCK(pipe);
110085: 83 ec 0c sub $0xc,%esp
110088: ff 73 28 pushl 0x28(%ebx)
11008b: e8 bc bc ff ff call 10bd4c <rtems_semaphore_release>
110090: 83 c4 10 add $0x10,%esp
110093: eb 05 jmp 11009a <pipe_read+0x14e>
PIPE_UNLOCK(pipe);
if (! PIPE_READWAIT(pipe))
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
/* WARN waitingReaders not restored! */
ret = -EINTR;
110095: be fc ff ff ff mov $0xfffffffc,%esi <== NOT EXECUTED
out_locked:
PIPE_UNLOCK(pipe);
out_nolock:
if (read > 0)
11009a: 83 7d d0 00 cmpl $0x0,-0x30(%ebp)
11009e: 7e 03 jle 1100a3 <pipe_read+0x157>
1100a0: 8b 75 d0 mov -0x30(%ebp),%esi
return read;
return ret;
}
1100a3: 89 f0 mov %esi,%eax
1100a5: 8d 65 f4 lea -0xc(%ebp),%esp
1100a8: 5b pop %ebx
1100a9: 5e pop %esi
1100aa: 5f pop %edi
1100ab: c9 leave
1100ac: c3 ret
0010faf1 <pipe_release>:
*/
void pipe_release(
pipe_control_t **pipep,
rtems_libio_t *iop
)
{
10faf1: 55 push %ebp
10faf2: 89 e5 mov %esp,%ebp
10faf4: 57 push %edi
10faf5: 56 push %esi
10faf6: 53 push %ebx
10faf7: 83 ec 1c sub $0x1c,%esp
10fafa: 8b 7d 08 mov 0x8(%ebp),%edi
pipe_control_t *pipe = *pipep;
10fafd: 8b 1f mov (%edi),%ebx
/* WARN pipe not released! */
if (!PIPE_LOCK(pipe))
rtems_fatal_error_occurred(0xdeadbeef);
#endif
mode = LIBIO_ACCMODE(iop);
10faff: 8b 45 0c mov 0xc(%ebp),%eax
10fb02: 8b 40 14 mov 0x14(%eax),%eax
10fb05: 89 c6 mov %eax,%esi
10fb07: 83 e6 06 and $0x6,%esi
if (mode & LIBIO_FLAGS_READ)
10fb0a: a8 02 test $0x2,%al
10fb0c: 74 03 je 10fb11 <pipe_release+0x20>
pipe->Readers --;
10fb0e: ff 4b 10 decl 0x10(%ebx)
if (mode & LIBIO_FLAGS_WRITE)
10fb11: f7 c6 04 00 00 00 test $0x4,%esi
10fb17: 74 03 je 10fb1c <pipe_release+0x2b>
pipe->Writers --;
10fb19: ff 4b 14 decl 0x14(%ebx)
PIPE_UNLOCK(pipe);
10fb1c: 83 ec 0c sub $0xc,%esp
10fb1f: ff 73 28 pushl 0x28(%ebx)
10fb22: e8 25 c2 ff ff call 10bd4c <rtems_semaphore_release>
if (pipe->Readers == 0 && pipe->Writers == 0) {
10fb27: 8b 43 10 mov 0x10(%ebx),%eax
10fb2a: 83 c4 10 add $0x10,%esp
10fb2d: 85 c0 test %eax,%eax
10fb2f: 75 15 jne 10fb46 <pipe_release+0x55>
10fb31: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
10fb35: 75 0f jne 10fb46 <pipe_release+0x55>
#if 0
/* To delete an anonymous pipe file when all users closed it */
if (pipe->Anonymous)
delfile = TRUE;
#endif
pipe_free(pipe);
10fb37: 89 d8 mov %ebx,%eax
10fb39: e8 78 ff ff ff call 10fab6 <pipe_free>
*pipep = NULL;
10fb3e: c7 07 00 00 00 00 movl $0x0,(%edi)
10fb44: eb 30 jmp 10fb76 <pipe_release+0x85>
}
else if (pipe->Readers == 0 && mode != LIBIO_FLAGS_WRITE)
10fb46: 83 fe 04 cmp $0x4,%esi
10fb49: 74 0f je 10fb5a <pipe_release+0x69>
10fb4b: 85 c0 test %eax,%eax
10fb4d: 75 0b jne 10fb5a <pipe_release+0x69> <== NEVER TAKEN
/* Notify waiting Writers that all their partners left */
PIPE_WAKEUPWRITERS(pipe);
10fb4f: 57 push %edi
10fb50: 57 push %edi
10fb51: 8d 45 e4 lea -0x1c(%ebp),%eax
10fb54: 50 push %eax
10fb55: ff 73 30 pushl 0x30(%ebx)
10fb58: eb 14 jmp 10fb6e <pipe_release+0x7d>
else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ)
10fb5a: 83 fe 02 cmp $0x2,%esi
10fb5d: 74 17 je 10fb76 <pipe_release+0x85> <== NEVER TAKEN
10fb5f: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
10fb63: 75 11 jne 10fb76 <pipe_release+0x85> <== NEVER TAKEN
PIPE_WAKEUPREADERS(pipe);
10fb65: 56 push %esi
10fb66: 56 push %esi
10fb67: 8d 45 e4 lea -0x1c(%ebp),%eax
10fb6a: 50 push %eax
10fb6b: ff 73 2c pushl 0x2c(%ebx)
10fb6e: e8 85 1a 00 00 call 1115f8 <rtems_barrier_release>
10fb73: 83 c4 10 add $0x10,%esp
pipe_unlock();
10fb76: e8 25 ff ff ff call 10faa0 <pipe_unlock>
iop->flags &= ~LIBIO_FLAGS_OPEN;
if(iop->pathinfo.ops->unlink_h(&iop->pathinfo))
return;
#endif
}
10fb7b: 8d 65 f4 lea -0xc(%ebp),%esp
10fb7e: 5b pop %ebx
10fb7f: 5e pop %esi
10fb80: 5f pop %edi
10fb81: c9 leave
10fb82: c3 ret
001100ad <pipe_write>:
pipe_control_t *pipe,
const void *buffer,
size_t count,
rtems_libio_t *iop
)
{
1100ad: 55 push %ebp
1100ae: 89 e5 mov %esp,%ebp
1100b0: 57 push %edi
1100b1: 56 push %esi
1100b2: 53 push %ebx
1100b3: 83 ec 2c sub $0x2c,%esp
1100b6: 8b 5d 08 mov 0x8(%ebp),%ebx
int chunk, chunk1, written = 0, ret = 0;
/* Write nothing */
if (count == 0)
return 0;
1100b9: 31 f6 xor %esi,%esi
)
{
int chunk, chunk1, written = 0, ret = 0;
/* Write nothing */
if (count == 0)
1100bb: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
1100bf: 0f 84 8c 01 00 00 je 110251 <pipe_write+0x1a4> <== NEVER TAKEN
return 0;
if (! PIPE_LOCK(pipe))
1100c5: 52 push %edx
1100c6: 6a 00 push $0x0
1100c8: 6a 00 push $0x0
1100ca: ff 73 28 pushl 0x28(%ebx)
1100cd: e8 8e bb ff ff call 10bc60 <rtems_semaphore_obtain>
1100d2: 83 c4 10 add $0x10,%esp
return -EINTR;
1100d5: be fc ff ff ff mov $0xfffffffc,%esi
/* Write nothing */
if (count == 0)
return 0;
if (! PIPE_LOCK(pipe))
1100da: 85 c0 test %eax,%eax
1100dc: 0f 85 6f 01 00 00 jne 110251 <pipe_write+0x1a4> <== NEVER TAKEN
return -EINTR;
if (pipe->Readers == 0) {
1100e2: 83 7b 10 00 cmpl $0x0,0x10(%ebx)
1100e6: 0f 84 16 01 00 00 je 110202 <pipe_write+0x155>
ret = -EPIPE;
goto out_locked;
}
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
1100ec: bf 01 00 00 00 mov $0x1,%edi
1100f1: 8b 45 10 mov 0x10(%ebp),%eax
1100f4: 3b 43 04 cmp 0x4(%ebx),%eax
1100f7: 77 02 ja 1100fb <pipe_write+0x4e> <== NEVER TAKEN
1100f9: 89 c7 mov %eax,%edi
/* Wait until there is chunk bytes space or no reader exists */
pipe->waitingWriters ++;
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
ret = -EINTR;
1100fb: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp)
110102: e9 eb 00 00 00 jmp 1101f2 <pipe_write+0x145>
/* 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) {
if (LIBIO_NODELAY(iop)) {
110107: 8b 4d 14 mov 0x14(%ebp),%ecx
11010a: f6 41 14 01 testb $0x1,0x14(%ecx)
11010e: 0f 85 fc 00 00 00 jne 110210 <pipe_write+0x163>
ret = -EAGAIN;
goto out_locked;
}
/* Wait until there is chunk bytes space or no reader exists */
pipe->waitingWriters ++;
110114: ff 43 1c incl 0x1c(%ebx)
PIPE_UNLOCK(pipe);
110117: 83 ec 0c sub $0xc,%esp
11011a: ff 73 28 pushl 0x28(%ebx)
11011d: e8 2a bc ff ff call 10bd4c <rtems_semaphore_release>
if (! PIPE_WRITEWAIT(pipe))
110122: 5e pop %esi
110123: 58 pop %eax
110124: 6a 00 push $0x0
110126: ff 73 30 pushl 0x30(%ebx)
110129: e8 22 15 00 00 call 111650 <rtems_barrier_wait>
11012e: 83 c4 0c add $0xc,%esp
110131: 83 f8 01 cmp $0x1,%eax
110134: 19 f6 sbb %esi,%esi
110136: f7 d6 not %esi
110138: 83 e6 fc and $0xfffffffc,%esi
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
11013b: 6a 00 push $0x0
11013d: 6a 00 push $0x0
11013f: ff 73 28 pushl 0x28(%ebx)
110142: e8 19 bb ff ff call 10bc60 <rtems_semaphore_obtain>
110147: 83 c4 10 add $0x10,%esp
11014a: 85 c0 test %eax,%eax
11014c: 0f 85 f1 00 00 00 jne 110243 <pipe_write+0x196> <== NEVER TAKEN
/* WARN waitingWriters not restored! */
ret = -EINTR;
goto out_nolock;
}
pipe->waitingWriters --;
110152: ff 4b 1c decl 0x1c(%ebx)
if (ret != 0)
110155: 85 f6 test %esi,%esi
110157: 0f 85 bf 00 00 00 jne 11021c <pipe_write+0x16f> <== NEVER TAKEN
goto out_locked;
if (pipe->Readers == 0) {
11015d: 83 7b 10 00 cmpl $0x0,0x10(%ebx)
110161: 0f 84 b0 00 00 00 je 110217 <pipe_write+0x16a> <== NEVER TAKEN
/* 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) {
110167: 8b 73 04 mov 0x4(%ebx),%esi
11016a: 8b 43 0c mov 0xc(%ebx),%eax
11016d: 89 f1 mov %esi,%ecx
11016f: 29 c1 sub %eax,%ecx
110171: 39 f9 cmp %edi,%ecx
110173: 72 92 jb 110107 <pipe_write+0x5a>
ret = -EPIPE;
goto out_locked;
}
}
chunk = MIN(count - written, PIPE_SPACE(pipe));
110175: 8b 55 10 mov 0x10(%ebp),%edx
110178: 2b 55 d4 sub -0x2c(%ebp),%edx
11017b: 89 4d d0 mov %ecx,-0x30(%ebp)
11017e: 39 d1 cmp %edx,%ecx
110180: 76 03 jbe 110185 <pipe_write+0xd8>
110182: 89 55 d0 mov %edx,-0x30(%ebp)
chunk1 = pipe->Size - PIPE_WSTART(pipe);
110185: 03 43 08 add 0x8(%ebx),%eax
110188: 31 d2 xor %edx,%edx
11018a: f7 f6 div %esi
11018c: 29 d6 sub %edx,%esi
11018e: 89 75 cc mov %esi,-0x34(%ebp)
if (chunk > chunk1) {
110191: 39 75 d0 cmp %esi,-0x30(%ebp)
110194: 8b 4d 0c mov 0xc(%ebp),%ecx
110197: 8b 45 d4 mov -0x2c(%ebp),%eax
11019a: 8d 34 01 lea (%ecx,%eax,1),%esi
11019d: 7e 20 jle 1101bf <pipe_write+0x112>
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk1);
11019f: 8b 03 mov (%ebx),%eax
1101a1: 01 d0 add %edx,%eax
1101a3: 89 c7 mov %eax,%edi
1101a5: 8b 4d cc mov -0x34(%ebp),%ecx
1101a8: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
memcpy(pipe->Buffer, buffer + written + chunk1, chunk - chunk1);
1101aa: 8b 03 mov (%ebx),%eax
1101ac: 8b 4d d0 mov -0x30(%ebp),%ecx
1101af: 2b 4d cc sub -0x34(%ebp),%ecx
1101b2: 8b 75 cc mov -0x34(%ebp),%esi
1101b5: 03 75 d4 add -0x2c(%ebp),%esi
1101b8: 03 75 0c add 0xc(%ebp),%esi
1101bb: 89 c7 mov %eax,%edi
1101bd: eb 09 jmp 1101c8 <pipe_write+0x11b>
}
else
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk);
1101bf: 8b 03 mov (%ebx),%eax
1101c1: 01 d0 add %edx,%eax
1101c3: 89 c7 mov %eax,%edi
1101c5: 8b 4d d0 mov -0x30(%ebp),%ecx
1101c8: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
pipe->Length += chunk;
1101ca: 8b 45 d0 mov -0x30(%ebp),%eax
1101cd: 01 43 0c add %eax,0xc(%ebx)
if (pipe->waitingReaders > 0)
1101d0: 83 7b 18 00 cmpl $0x0,0x18(%ebx)
1101d4: 74 11 je 1101e7 <pipe_write+0x13a>
PIPE_WAKEUPREADERS(pipe);
1101d6: 51 push %ecx
1101d7: 51 push %ecx
1101d8: 8d 4d e4 lea -0x1c(%ebp),%ecx
1101db: 51 push %ecx
1101dc: ff 73 2c pushl 0x2c(%ebx)
1101df: e8 14 14 00 00 call 1115f8 <rtems_barrier_release>
1101e4: 83 c4 10 add $0x10,%esp
written += chunk;
1101e7: 8b 45 d0 mov -0x30(%ebp),%eax
1101ea: 01 45 d4 add %eax,-0x2c(%ebp)
/* Write of more than PIPE_BUF bytes can be interleaved */
chunk = 1;
1101ed: bf 01 00 00 00 mov $0x1,%edi
}
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
1101f2: 8b 4d 10 mov 0x10(%ebp),%ecx
1101f5: 39 4d d4 cmp %ecx,-0x2c(%ebp)
1101f8: 0f 82 69 ff ff ff jb 110167 <pipe_write+0xba>
1101fe: 31 f6 xor %esi,%esi
110200: eb 1a jmp 11021c <pipe_write+0x16f>
if (! PIPE_LOCK(pipe))
return -EINTR;
if (pipe->Readers == 0) {
ret = -EPIPE;
110202: be e0 ff ff ff mov $0xffffffe0,%esi
const void *buffer,
size_t count,
rtems_libio_t *iop
)
{
int chunk, chunk1, written = 0, ret = 0;
110207: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp)
11020e: eb 0c jmp 11021c <pipe_write+0x16f>
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
while (PIPE_SPACE(pipe) < chunk) {
if (LIBIO_NODELAY(iop)) {
ret = -EAGAIN;
110210: be f5 ff ff ff mov $0xfffffff5,%esi
110215: eb 05 jmp 11021c <pipe_write+0x16f>
pipe->waitingWriters --;
if (ret != 0)
goto out_locked;
if (pipe->Readers == 0) {
ret = -EPIPE;
110217: be e0 ff ff ff mov $0xffffffe0,%esi <== NOT EXECUTED
/* Write of more than PIPE_BUF bytes can be interleaved */
chunk = 1;
}
out_locked:
PIPE_UNLOCK(pipe);
11021c: 83 ec 0c sub $0xc,%esp
11021f: ff 73 28 pushl 0x28(%ebx)
110222: e8 25 bb ff ff call 10bd4c <rtems_semaphore_release>
110227: 83 c4 10 add $0x10,%esp
out_nolock:
#ifdef RTEMS_POSIX_API
/* Signal SIGPIPE */
if (ret == -EPIPE)
11022a: 83 fe e0 cmp $0xffffffe0,%esi
11022d: 75 19 jne 110248 <pipe_write+0x19b>
kill(getpid(), SIGPIPE);
11022f: e8 24 07 00 00 call 110958 <getpid>
110234: 52 push %edx
110235: 52 push %edx
110236: 6a 0d push $0xd
110238: 50 push %eax
110239: e8 a2 09 00 00 call 110be0 <kill>
11023e: 83 c4 10 add $0x10,%esp
110241: eb 05 jmp 110248 <pipe_write+0x19b>
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
/* WARN waitingWriters not restored! */
ret = -EINTR;
110243: be fc ff ff ff mov $0xfffffffc,%esi <== NOT EXECUTED
/* Signal SIGPIPE */
if (ret == -EPIPE)
kill(getpid(), SIGPIPE);
#endif
if (written > 0)
110248: 83 7d d4 00 cmpl $0x0,-0x2c(%ebp)
11024c: 7e 03 jle 110251 <pipe_write+0x1a4>
11024e: 8b 75 d4 mov -0x2c(%ebp),%esi
return written;
return ret;
}
110251: 89 f0 mov %esi,%eax
110253: 8d 65 f4 lea -0xc(%ebp),%esp
110256: 5b pop %ebx
110257: 5e pop %esi
110258: 5f pop %edi
110259: c9 leave
11025a: c3 ret
0010a888 <posix_memalign>:
int posix_memalign(
void **pointer,
size_t alignment,
size_t size
)
{
10a888: 55 push %ebp
10a889: 89 e5 mov %esp,%ebp
10a88b: 53 push %ebx
10a88c: 83 ec 04 sub $0x4,%esp
10a88f: 8b 45 0c mov 0xc(%ebp),%eax
/*
* Update call statistics
*/
MSBUMP(memalign_calls, 1);
10a892: ff 05 44 bb 12 00 incl 0x12bb44
if (((alignment - 1) & alignment) != 0 || (alignment < sizeof(void *)))
10a898: 8d 58 ff lea -0x1(%eax),%ebx
10a89b: 85 c3 test %eax,%ebx
10a89d: 75 0d jne 10a8ac <posix_memalign+0x24> <== NEVER TAKEN
10a89f: 83 f8 03 cmp $0x3,%eax
10a8a2: 76 08 jbe 10a8ac <posix_memalign+0x24>
/*
* rtems_memalign does all of the error checking work EXCEPT
* for adding restrictionso on the alignment.
*/
return rtems_memalign( pointer, alignment, size );
}
10a8a4: 59 pop %ecx
10a8a5: 5b pop %ebx
10a8a6: c9 leave
/*
* rtems_memalign does all of the error checking work EXCEPT
* for adding restrictionso on the alignment.
*/
return rtems_memalign( pointer, alignment, size );
10a8a7: e9 74 01 00 00 jmp 10aa20 <rtems_memalign>
}
10a8ac: b8 16 00 00 00 mov $0x16,%eax
10a8b1: 5a pop %edx
10a8b2: 5b pop %ebx
10a8b3: c9 leave
10a8b4: c3 ret
0010efd8 <pthread_attr_getdetachstate>:
int pthread_attr_getdetachstate(
const pthread_attr_t *attr,
int *detachstate
)
{
10efd8: 55 push %ebp
10efd9: 89 e5 mov %esp,%ebp
10efdb: 8b 55 08 mov 0x8(%ebp),%edx
10efde: 8b 4d 0c mov 0xc(%ebp),%ecx
if ( !attr || !attr->is_initialized || !detachstate )
return EINVAL;
10efe1: b8 16 00 00 00 mov $0x16,%eax
int pthread_attr_getdetachstate(
const pthread_attr_t *attr,
int *detachstate
)
{
if ( !attr || !attr->is_initialized || !detachstate )
10efe6: 85 d2 test %edx,%edx
10efe8: 74 17 je 10f001 <pthread_attr_getdetachstate+0x29><== NEVER TAKEN
10efea: 85 c9 test %ecx,%ecx
10efec: 74 0e je 10effc <pthread_attr_getdetachstate+0x24>
10efee: 83 3a 00 cmpl $0x0,(%edx)
10eff1: 74 09 je 10effc <pthread_attr_getdetachstate+0x24>
return EINVAL;
*detachstate = attr->detachstate;
10eff3: 8b 42 3c mov 0x3c(%edx),%eax
10eff6: 89 01 mov %eax,(%ecx)
return 0;
10eff8: 31 c0 xor %eax,%eax
10effa: eb 05 jmp 10f001 <pthread_attr_getdetachstate+0x29>
const pthread_attr_t *attr,
int *detachstate
)
{
if ( !attr || !attr->is_initialized || !detachstate )
return EINVAL;
10effc: b8 16 00 00 00 mov $0x16,%eax
*detachstate = attr->detachstate;
return 0;
}
10f001: c9 leave
10f002: c3 ret
0010f24c <pthread_attr_setschedpolicy>:
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
10f24c: 55 push %ebp
10f24d: 89 e5 mov %esp,%ebp
10f24f: 8b 55 08 mov 0x8(%ebp),%edx
10f252: 8b 4d 0c mov 0xc(%ebp),%ecx
if ( !attr || !attr->is_initialized )
return EINVAL;
10f255: b8 16 00 00 00 mov $0x16,%eax
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
10f25a: 85 d2 test %edx,%edx
10f25c: 74 1e je 10f27c <pthread_attr_setschedpolicy+0x30>
10f25e: 83 3a 00 cmpl $0x0,(%edx)
10f261: 74 19 je 10f27c <pthread_attr_setschedpolicy+0x30>
return EINVAL;
switch ( policy ) {
10f263: 83 f9 04 cmp $0x4,%ecx
10f266: 77 0f ja 10f277 <pthread_attr_setschedpolicy+0x2b>
10f268: b0 01 mov $0x1,%al
10f26a: d3 e0 shl %cl,%eax
10f26c: a8 17 test $0x17,%al
10f26e: 74 07 je 10f277 <pthread_attr_setschedpolicy+0x2b><== NEVER TAKEN
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
case SCHED_SPORADIC:
attr->schedpolicy = policy;
10f270: 89 4a 14 mov %ecx,0x14(%edx)
return 0;
10f273: 31 c0 xor %eax,%eax
10f275: eb 05 jmp 10f27c <pthread_attr_setschedpolicy+0x30>
default:
return ENOTSUP;
10f277: b8 86 00 00 00 mov $0x86,%eax
}
}
10f27c: c9 leave
10f27d: c3 ret
0010a56c <pthread_barrier_init>:
int pthread_barrier_init(
pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr,
unsigned int count
)
{
10a56c: 55 push %ebp
10a56d: 89 e5 mov %esp,%ebp
10a56f: 57 push %edi
10a570: 56 push %esi
10a571: 53 push %ebx
10a572: 83 ec 1c sub $0x1c,%esp
10a575: 8b 5d 08 mov 0x8(%ebp),%ebx
10a578: 8b 75 10 mov 0x10(%ebp),%esi
/*
* Error check parameters
*/
if ( !barrier )
return EINVAL;
10a57b: b8 16 00 00 00 mov $0x16,%eax
const pthread_barrierattr_t *the_attr;
/*
* Error check parameters
*/
if ( !barrier )
10a580: 85 db test %ebx,%ebx
10a582: 0f 84 96 00 00 00 je 10a61e <pthread_barrier_init+0xb2>
return EINVAL;
if ( count == 0 )
10a588: 85 f6 test %esi,%esi
10a58a: 0f 84 8e 00 00 00 je 10a61e <pthread_barrier_init+0xb2>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
10a590: 8b 7d 0c mov 0xc(%ebp),%edi
10a593: 85 ff test %edi,%edi
10a595: 75 0f jne 10a5a6 <pthread_barrier_init+0x3a>
the_attr = attr;
} else {
(void) pthread_barrierattr_init( &my_attr );
10a597: 83 ec 0c sub $0xc,%esp
10a59a: 8d 7d d8 lea -0x28(%ebp),%edi
10a59d: 57 push %edi
10a59e: e8 19 ff ff ff call 10a4bc <pthread_barrierattr_init>
10a5a3: 83 c4 10 add $0x10,%esp
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
return EINVAL;
10a5a6: b8 16 00 00 00 mov $0x16,%eax
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
10a5ab: 83 3f 00 cmpl $0x0,(%edi)
10a5ae: 74 6e je 10a61e <pthread_barrier_init+0xb2>
return EINVAL;
switch ( the_attr->process_shared ) {
10a5b0: 83 7f 04 00 cmpl $0x0,0x4(%edi)
10a5b4: 75 68 jne 10a61e <pthread_barrier_init+0xb2><== NEVER TAKEN
}
/*
* Convert from POSIX attributes to Core Barrier attributes
*/
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
10a5b6: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
the_attributes.maximum_count = count;
10a5bd: 89 75 e4 mov %esi,-0x1c(%ebp)
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10a5c0: a1 50 63 12 00 mov 0x126350,%eax
10a5c5: 40 inc %eax
10a5c6: a3 50 63 12 00 mov %eax,0x126350
* 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 );
10a5cb: 83 ec 0c sub $0xc,%esp
10a5ce: 68 f4 66 12 00 push $0x1266f4
10a5d3: e8 0c 1e 00 00 call 10c3e4 <_Objects_Allocate>
10a5d8: 89 c6 mov %eax,%esi
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
10a5da: 83 c4 10 add $0x10,%esp
10a5dd: 85 c0 test %eax,%eax
10a5df: 75 0c jne 10a5ed <pthread_barrier_init+0x81>
_Thread_Enable_dispatch();
10a5e1: e8 dc 2c 00 00 call 10d2c2 <_Thread_Enable_dispatch>
return EAGAIN;
10a5e6: b8 0b 00 00 00 mov $0xb,%eax
10a5eb: eb 31 jmp 10a61e <pthread_barrier_init+0xb2>
}
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
10a5ed: 50 push %eax
10a5ee: 50 push %eax
10a5ef: 8d 45 e0 lea -0x20(%ebp),%eax
10a5f2: 50 push %eax
10a5f3: 8d 46 10 lea 0x10(%esi),%eax
10a5f6: 50 push %eax
10a5f7: e8 a8 14 00 00 call 10baa4 <_CORE_barrier_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10a5fc: 8b 46 08 mov 0x8(%esi),%eax
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10a5ff: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10a602: 8b 15 10 67 12 00 mov 0x126710,%edx
10a608: 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;
10a60b: c7 46 0c 00 00 00 00 movl $0x0,0xc(%esi)
);
/*
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
10a612: 89 03 mov %eax,(%ebx)
_Thread_Enable_dispatch();
10a614: e8 a9 2c 00 00 call 10d2c2 <_Thread_Enable_dispatch>
return 0;
10a619: 83 c4 10 add $0x10,%esp
10a61c: 31 c0 xor %eax,%eax
}
10a61e: 8d 65 f4 lea -0xc(%ebp),%esp
10a621: 5b pop %ebx
10a622: 5e pop %esi
10a623: 5f pop %edi
10a624: c9 leave
10a625: c3 ret
00109f20 <pthread_cleanup_push>:
void pthread_cleanup_push(
void (*routine)( void * ),
void *arg
)
{
109f20: 55 push %ebp
109f21: 89 e5 mov %esp,%ebp
109f23: 56 push %esi
109f24: 53 push %ebx
109f25: 8b 5d 08 mov 0x8(%ebp),%ebx
109f28: 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 )
109f2b: 85 db test %ebx,%ebx
109f2d: 74 4b je 109f7a <pthread_cleanup_push+0x5a>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
109f2f: a1 48 63 12 00 mov 0x126348,%eax
109f34: 40 inc %eax
109f35: a3 48 63 12 00 mov %eax,0x126348
return;
_Thread_Disable_dispatch();
handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) );
109f3a: 83 ec 0c sub $0xc,%esp
109f3d: 6a 10 push $0x10
109f3f: e8 3e 3c 00 00 call 10db82 <_Workspace_Allocate>
if ( handler ) {
109f44: 83 c4 10 add $0x10,%esp
109f47: 85 c0 test %eax,%eax
109f49: 74 24 je 109f6f <pthread_cleanup_push+0x4f><== NEVER TAKEN
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
109f4b: 8b 15 70 68 12 00 mov 0x126870,%edx
handler_stack = &thread_support->Cancellation_Handlers;
109f51: 8b 92 ec 00 00 00 mov 0xec(%edx),%edx
109f57: 81 c2 e4 00 00 00 add $0xe4,%edx
handler->routine = routine;
109f5d: 89 58 08 mov %ebx,0x8(%eax)
handler->arg = arg;
109f60: 89 70 0c mov %esi,0xc(%eax)
_Chain_Append( handler_stack, &handler->Node );
109f63: 51 push %ecx
109f64: 51 push %ecx
109f65: 50 push %eax
109f66: 52 push %edx
109f67: e8 84 15 00 00 call 10b4f0 <_Chain_Append>
109f6c: 83 c4 10 add $0x10,%esp
}
_Thread_Enable_dispatch();
}
109f6f: 8d 65 f8 lea -0x8(%ebp),%esp
109f72: 5b pop %ebx
109f73: 5e pop %esi
109f74: c9 leave
handler->routine = routine;
handler->arg = arg;
_Chain_Append( handler_stack, &handler->Node );
}
_Thread_Enable_dispatch();
109f75: e9 3c 2d 00 00 jmp 10ccb6 <_Thread_Enable_dispatch>
}
109f7a: 8d 65 f8 lea -0x8(%ebp),%esp
109f7d: 5b pop %ebx
109f7e: 5e pop %esi
109f7f: c9 leave
109f80: c3 ret
0010ac94 <pthread_cond_init>:
int pthread_cond_init(
pthread_cond_t *cond,
const pthread_condattr_t *attr
)
{
10ac94: 55 push %ebp
10ac95: 89 e5 mov %esp,%ebp
10ac97: 56 push %esi
10ac98: 53 push %ebx
POSIX_Condition_variables_Control *the_cond;
const pthread_condattr_t *the_attr;
if ( attr ) the_attr = attr;
10ac99: 8b 5d 0c mov 0xc(%ebp),%ebx
10ac9c: 85 db test %ebx,%ebx
10ac9e: 75 05 jne 10aca5 <pthread_cond_init+0x11>
else the_attr = &_POSIX_Condition_variables_Default_attributes;
10aca0: bb b4 15 12 00 mov $0x1215b4,%ebx
/*
* Be careful about attributes when global!!!
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
return EINVAL;
10aca5: b8 16 00 00 00 mov $0x16,%eax
else the_attr = &_POSIX_Condition_variables_Default_attributes;
/*
* Be careful about attributes when global!!!
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
10acaa: 83 7b 04 01 cmpl $0x1,0x4(%ebx)
10acae: 74 76 je 10ad26 <pthread_cond_init+0x92><== NEVER TAKEN
return EINVAL;
if ( !the_attr->is_initialized )
10acb0: 83 3b 00 cmpl $0x0,(%ebx)
10acb3: 74 71 je 10ad26 <pthread_cond_init+0x92>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10acb5: a1 60 73 12 00 mov 0x127360,%eax
10acba: 40 inc %eax
10acbb: a3 60 73 12 00 mov %eax,0x127360
RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control
*_POSIX_Condition_variables_Allocate( void )
{
return (POSIX_Condition_variables_Control *)
_Objects_Allocate( &_POSIX_Condition_variables_Information );
10acc0: 83 ec 0c sub $0xc,%esp
10acc3: 68 9c 77 12 00 push $0x12779c
10acc8: e8 f7 22 00 00 call 10cfc4 <_Objects_Allocate>
10accd: 89 c6 mov %eax,%esi
_Thread_Disable_dispatch();
the_cond = _POSIX_Condition_variables_Allocate();
if ( !the_cond ) {
10accf: 83 c4 10 add $0x10,%esp
10acd2: 85 c0 test %eax,%eax
10acd4: 75 0c jne 10ace2 <pthread_cond_init+0x4e>
_Thread_Enable_dispatch();
10acd6: e8 c7 31 00 00 call 10dea2 <_Thread_Enable_dispatch>
return ENOMEM;
10acdb: b8 0c 00 00 00 mov $0xc,%eax
10ace0: eb 44 jmp 10ad26 <pthread_cond_init+0x92>
}
the_cond->process_shared = the_attr->process_shared;
10ace2: 8b 43 04 mov 0x4(%ebx),%eax
10ace5: 89 46 10 mov %eax,0x10(%esi)
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
10ace8: c7 46 14 00 00 00 00 movl $0x0,0x14(%esi)
_Thread_queue_Initialize(
10acef: 6a 74 push $0x74
10acf1: 68 00 08 00 10 push $0x10000800
10acf6: 6a 00 push $0x0
10acf8: 8d 46 18 lea 0x18(%esi),%eax
10acfb: 50 push %eax
10acfc: e8 5f 38 00 00 call 10e560 <_Thread_queue_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10ad01: 8b 46 08 mov 0x8(%esi),%eax
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10ad04: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10ad07: 8b 15 b8 77 12 00 mov 0x1277b8,%edx
10ad0d: 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;
10ad10: c7 46 0c 00 00 00 00 movl $0x0,0xc(%esi)
&_POSIX_Condition_variables_Information,
&the_cond->Object,
0
);
*cond = the_cond->Object.id;
10ad17: 8b 55 08 mov 0x8(%ebp),%edx
10ad1a: 89 02 mov %eax,(%edx)
_Thread_Enable_dispatch();
10ad1c: e8 81 31 00 00 call 10dea2 <_Thread_Enable_dispatch>
return 0;
10ad21: 83 c4 10 add $0x10,%esp
10ad24: 31 c0 xor %eax,%eax
}
10ad26: 8d 65 f8 lea -0x8(%ebp),%esp
10ad29: 5b pop %ebx
10ad2a: 5e pop %esi
10ad2b: c9 leave
10ad2c: c3 ret
0010ab48 <pthread_condattr_destroy>:
*/
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
10ab48: 55 push %ebp
10ab49: 89 e5 mov %esp,%ebp
10ab4b: 8b 55 08 mov 0x8(%ebp),%edx
if ( !attr || attr->is_initialized == false )
return EINVAL;
10ab4e: b8 16 00 00 00 mov $0x16,%eax
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
10ab53: 85 d2 test %edx,%edx
10ab55: 74 0d je 10ab64 <pthread_condattr_destroy+0x1c>
10ab57: 83 3a 00 cmpl $0x0,(%edx)
10ab5a: 74 08 je 10ab64 <pthread_condattr_destroy+0x1c><== NEVER TAKEN
return EINVAL;
attr->is_initialized = false;
10ab5c: c7 02 00 00 00 00 movl $0x0,(%edx)
return 0;
10ab62: 30 c0 xor %al,%al
}
10ab64: c9 leave
10ab65: c3 ret
0010a27c <pthread_create>:
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)( void * ),
void *arg
)
{
10a27c: 55 push %ebp
10a27d: 89 e5 mov %esp,%ebp
10a27f: 57 push %edi
10a280: 56 push %esi
10a281: 53 push %ebx
10a282: 83 ec 5c sub $0x5c,%esp
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
return EFAULT;
10a285: c7 45 b4 0e 00 00 00 movl $0xe,-0x4c(%ebp)
int schedpolicy = SCHED_RR;
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
10a28c: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
10a290: 0f 84 0f 02 00 00 je 10a4a5 <pthread_create+0x229>
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
10a296: 8b 5d 0c mov 0xc(%ebp),%ebx
10a299: 85 db test %ebx,%ebx
10a29b: 75 05 jne 10a2a2 <pthread_create+0x26>
10a29d: bb 40 02 12 00 mov $0x120240,%ebx
if ( !the_attr->is_initialized )
return EINVAL;
10a2a2: c7 45 b4 16 00 00 00 movl $0x16,-0x4c(%ebp)
if ( !start_routine )
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
if ( !the_attr->is_initialized )
10a2a9: 83 3b 00 cmpl $0x0,(%ebx)
10a2ac: 0f 84 f3 01 00 00 je 10a4a5 <pthread_create+0x229>
* 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) )
10a2b2: 83 7b 04 00 cmpl $0x0,0x4(%ebx)
10a2b6: 74 0e je 10a2c6 <pthread_create+0x4a>
10a2b8: a1 44 22 12 00 mov 0x122244,%eax
10a2bd: 39 43 08 cmp %eax,0x8(%ebx)
10a2c0: 0f 82 df 01 00 00 jb 10a4a5 <pthread_create+0x229>
* 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 ) {
10a2c6: 8b 43 10 mov 0x10(%ebx),%eax
10a2c9: 83 f8 01 cmp $0x1,%eax
10a2cc: 74 0b je 10a2d9 <pthread_create+0x5d>
10a2ce: 83 f8 02 cmp $0x2,%eax
10a2d1: 0f 85 c7 01 00 00 jne 10a49e <pthread_create+0x222>
10a2d7: eb 1f jmp 10a2f8 <pthread_create+0x7c>
case PTHREAD_INHERIT_SCHED:
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
10a2d9: a1 78 68 12 00 mov 0x126878,%eax
10a2de: 8b b0 ec 00 00 00 mov 0xec(%eax),%esi
schedpolicy = api->schedpolicy;
10a2e4: 8b 86 84 00 00 00 mov 0x84(%esi),%eax
10a2ea: 89 45 ac mov %eax,-0x54(%ebp)
schedparam = api->schedparam;
10a2ed: 8d 7d c4 lea -0x3c(%ebp),%edi
10a2f0: 81 c6 88 00 00 00 add $0x88,%esi
10a2f6: eb 0c jmp 10a304 <pthread_create+0x88>
break;
case PTHREAD_EXPLICIT_SCHED:
schedpolicy = the_attr->schedpolicy;
10a2f8: 8b 43 14 mov 0x14(%ebx),%eax
10a2fb: 89 45 ac mov %eax,-0x54(%ebp)
schedparam = the_attr->schedparam;
10a2fe: 8d 7d c4 lea -0x3c(%ebp),%edi
10a301: 8d 73 18 lea 0x18(%ebx),%esi
10a304: b9 07 00 00 00 mov $0x7,%ecx
10a309: 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 )
return ENOTSUP;
10a30b: c7 45 b4 86 00 00 00 movl $0x86,-0x4c(%ebp)
/*
* Check the contentionscope since rtems only supports PROCESS wide
* contention (i.e. no system wide contention).
*/
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
10a312: 83 7b 0c 00 cmpl $0x0,0xc(%ebx)
10a316: 0f 85 89 01 00 00 jne 10a4a5 <pthread_create+0x229>
return ENOTSUP;
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
10a31c: 83 ec 0c sub $0xc,%esp
10a31f: ff 75 c4 pushl -0x3c(%ebp)
10a322: e8 2d 59 00 00 call 10fc54 <_POSIX_Priority_Is_valid>
10a327: 83 c4 10 add $0x10,%esp
return EINVAL;
10a32a: c7 45 b4 16 00 00 00 movl $0x16,-0x4c(%ebp)
return ENOTSUP;
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
10a331: 84 c0 test %al,%al
10a333: 0f 84 6c 01 00 00 je 10a4a5 <pthread_create+0x229> <== NEVER TAKEN
return EINVAL;
core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
10a339: 8b 45 c4 mov -0x3c(%ebp),%eax
10a33c: 89 45 a8 mov %eax,-0x58(%ebp)
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
10a33f: 0f b6 3d 48 22 12 00 movzbl 0x122248,%edi
/*
* Set the core scheduling policy information.
*/
rc = _POSIX_Thread_Translate_sched_param(
10a346: 8d 45 e0 lea -0x20(%ebp),%eax
10a349: 50 push %eax
10a34a: 8d 45 e4 lea -0x1c(%ebp),%eax
10a34d: 50 push %eax
10a34e: 8d 45 c4 lea -0x3c(%ebp),%eax
10a351: 50 push %eax
10a352: ff 75 ac pushl -0x54(%ebp)
10a355: e8 1a 59 00 00 call 10fc74 <_POSIX_Thread_Translate_sched_param>
10a35a: 89 45 b4 mov %eax,-0x4c(%ebp)
schedpolicy,
&schedparam,
&budget_algorithm,
&budget_callout
);
if ( rc )
10a35d: 83 c4 10 add $0x10,%esp
10a360: 85 c0 test %eax,%eax
10a362: 0f 85 3d 01 00 00 jne 10a4a5 <pthread_create+0x229>
#endif
/*
* Lock the allocator mutex for protection
*/
_RTEMS_Lock_allocator();
10a368: 83 ec 0c sub $0xc,%esp
10a36b: ff 35 f4 63 12 00 pushl 0x1263f4
10a371: e8 4e 15 00 00 call 10b8c4 <_API_Mutex_Lock>
* _POSIX_Threads_Allocate
*/
RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void )
{
return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information );
10a376: c7 04 24 74 65 12 00 movl $0x126574,(%esp)
10a37d: e8 a2 1e 00 00 call 10c224 <_Objects_Allocate>
10a382: 89 45 b0 mov %eax,-0x50(%ebp)
* Allocate the thread control block.
*
* NOTE: Global threads are not currently supported.
*/
the_thread = _POSIX_Threads_Allocate();
if ( !the_thread ) {
10a385: 83 c4 10 add $0x10,%esp
10a388: 85 c0 test %eax,%eax
10a38a: 75 05 jne 10a391 <pthread_create+0x115>
_RTEMS_Unlock_allocator();
10a38c: 83 ec 0c sub $0xc,%esp
10a38f: eb 53 jmp 10a3e4 <pthread_create+0x168>
/*
* Initialize the core thread for this task.
*/
name.name_p = NULL; /* posix threads don't have a name by default */
status = _Thread_Initialize(
10a391: 8b 4d e0 mov -0x20(%ebp),%ecx
10a394: 8b 75 e4 mov -0x1c(%ebp),%esi
10a397: 8b 53 08 mov 0x8(%ebx),%edx
10a39a: a1 44 22 12 00 mov 0x122244,%eax
10a39f: d1 e0 shl %eax
10a3a1: 39 d0 cmp %edx,%eax
10a3a3: 73 02 jae 10a3a7 <pthread_create+0x12b>
10a3a5: 89 d0 mov %edx,%eax
10a3a7: 52 push %edx
10a3a8: 6a 00 push $0x0
10a3aa: 6a 00 push $0x0
10a3ac: 51 push %ecx
10a3ad: 56 push %esi
10a3ae: 6a 01 push $0x1
10a3b0: 81 e7 ff 00 00 00 and $0xff,%edi
10a3b6: 2b 7d a8 sub -0x58(%ebp),%edi
10a3b9: 57 push %edi
10a3ba: 6a 01 push $0x1
10a3bc: 50 push %eax
10a3bd: ff 73 04 pushl 0x4(%ebx)
10a3c0: ff 75 b0 pushl -0x50(%ebp)
10a3c3: 68 74 65 12 00 push $0x126574
10a3c8: e8 cb 2d 00 00 call 10d198 <_Thread_Initialize>
budget_callout,
0, /* isr level */
name /* posix threads don't have a name */
);
if ( !status ) {
10a3cd: 83 c4 30 add $0x30,%esp
10a3d0: 84 c0 test %al,%al
10a3d2: 75 2a jne 10a3fe <pthread_create+0x182>
RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free (
Thread_Control *the_pthread
)
{
_Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object );
10a3d4: 56 push %esi
10a3d5: 56 push %esi
10a3d6: ff 75 b0 pushl -0x50(%ebp)
10a3d9: 68 74 65 12 00 push $0x126574
10a3de: e8 35 21 00 00 call 10c518 <_Objects_Free>
_POSIX_Threads_Free( the_thread );
_RTEMS_Unlock_allocator();
10a3e3: 5b pop %ebx
10a3e4: ff 35 f4 63 12 00 pushl 0x1263f4
10a3ea: e8 1d 15 00 00 call 10b90c <_API_Mutex_Unlock>
return EAGAIN;
10a3ef: 83 c4 10 add $0x10,%esp
10a3f2: c7 45 b4 0b 00 00 00 movl $0xb,-0x4c(%ebp)
10a3f9: e9 a7 00 00 00 jmp 10a4a5 <pthread_create+0x229>
}
/*
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10a3fe: 8b 45 b0 mov -0x50(%ebp),%eax
10a401: 8b 90 ec 00 00 00 mov 0xec(%eax),%edx
api->Attributes = *the_attr;
10a407: b9 10 00 00 00 mov $0x10,%ecx
10a40c: 89 d7 mov %edx,%edi
10a40e: 89 de mov %ebx,%esi
10a410: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
api->detachstate = the_attr->detachstate;
10a412: 8b 43 3c mov 0x3c(%ebx),%eax
10a415: 89 42 40 mov %eax,0x40(%edx)
api->schedpolicy = schedpolicy;
10a418: 8b 45 ac mov -0x54(%ebp),%eax
10a41b: 89 82 84 00 00 00 mov %eax,0x84(%edx)
api->schedparam = schedparam;
10a421: 8d ba 88 00 00 00 lea 0x88(%edx),%edi
10a427: 8d 75 c4 lea -0x3c(%ebp),%esi
10a42a: b1 07 mov $0x7,%cl
10a42c: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
10a42e: 83 ec 0c sub $0xc,%esp
10a431: 6a 00 push $0x0
10a433: ff 75 14 pushl 0x14(%ebp)
10a436: ff 75 10 pushl 0x10(%ebp)
10a439: 6a 01 push $0x1
10a43b: ff 75 b0 pushl -0x50(%ebp)
10a43e: 89 55 a4 mov %edx,-0x5c(%ebp)
10a441: e8 72 35 00 00 call 10d9b8 <_Thread_Start>
_RTEMS_Unlock_allocator();
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
10a446: 83 c4 20 add $0x20,%esp
10a449: 83 7d ac 04 cmpl $0x4,-0x54(%ebp)
10a44d: 8b 55 a4 mov -0x5c(%ebp),%edx
10a450: 75 2e jne 10a480 <pthread_create+0x204>
_Watchdog_Insert_ticks(
10a452: 83 ec 0c sub $0xc,%esp
&api->Sporadic_timer,
_Timespec_To_ticks( &api->schedparam.sched_ss_repl_period )
10a455: 8d 82 90 00 00 00 lea 0x90(%edx),%eax
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
_Watchdog_Insert_ticks(
10a45b: 50 push %eax
10a45c: e8 a7 36 00 00 call 10db08 <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10a461: 8b 55 a4 mov -0x5c(%ebp),%edx
10a464: 89 82 b4 00 00 00 mov %eax,0xb4(%edx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10a46a: 58 pop %eax
10a46b: 59 pop %ecx
10a46c: 81 c2 a8 00 00 00 add $0xa8,%edx
10a472: 52 push %edx
10a473: 68 14 64 12 00 push $0x126414
10a478: e8 3f 39 00 00 call 10ddbc <_Watchdog_Insert>
10a47d: 83 c4 10 add $0x10,%esp
}
/*
* Return the id and indicate we successfully created the thread
*/
*thread = the_thread->Object.id;
10a480: 8b 45 b0 mov -0x50(%ebp),%eax
10a483: 8b 50 08 mov 0x8(%eax),%edx
10a486: 8b 45 08 mov 0x8(%ebp),%eax
10a489: 89 10 mov %edx,(%eax)
_RTEMS_Unlock_allocator();
10a48b: 83 ec 0c sub $0xc,%esp
10a48e: ff 35 f4 63 12 00 pushl 0x1263f4
10a494: e8 73 14 00 00 call 10b90c <_API_Mutex_Unlock>
return 0;
10a499: 83 c4 10 add $0x10,%esp
10a49c: eb 07 jmp 10a4a5 <pthread_create+0x229>
schedpolicy = the_attr->schedpolicy;
schedparam = the_attr->schedparam;
break;
default:
return EINVAL;
10a49e: c7 45 b4 16 00 00 00 movl $0x16,-0x4c(%ebp)
*/
*thread = the_thread->Object.id;
_RTEMS_Unlock_allocator();
return 0;
}
10a4a5: 8b 45 b4 mov -0x4c(%ebp),%eax
10a4a8: 8d 65 f4 lea -0xc(%ebp),%esp
10a4ab: 5b pop %ebx
10a4ac: 5e pop %esi
10a4ad: 5f pop %edi
10a4ae: c9 leave
10a4af: c3 ret
00110d4c <pthread_exit>:
}
void pthread_exit(
void *value_ptr
)
{
110d4c: 55 push %ebp
110d4d: 89 e5 mov %esp,%ebp
110d4f: 83 ec 10 sub $0x10,%esp
_POSIX_Thread_Exit( _Thread_Executing, value_ptr );
110d52: ff 75 08 pushl 0x8(%ebp)
110d55: ff 35 68 58 12 00 pushl 0x125868
110d5b: e8 88 ff ff ff call 110ce8 <_POSIX_Thread_Exit>
110d60: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
110d63: c9 leave <== NOT EXECUTED
110d64: c3 ret <== NOT EXECUTED
001222a4 <pthread_kill>:
int pthread_kill(
pthread_t thread,
int sig
)
{
1222a4: 55 push %ebp
1222a5: 89 e5 mov %esp,%ebp
1222a7: 57 push %edi
1222a8: 56 push %esi
1222a9: 53 push %ebx
1222aa: 83 ec 1c sub $0x1c,%esp
1222ad: 8b 5d 0c mov 0xc(%ebp),%ebx
POSIX_API_Control *api;
Thread_Control *the_thread;
Objects_Locations location;
if ( !sig )
1222b0: 85 db test %ebx,%ebx
1222b2: 74 08 je 1222bc <pthread_kill+0x18>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
1222b4: 8d 7b ff lea -0x1(%ebx),%edi
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
1222b7: 83 ff 1f cmp $0x1f,%edi
1222ba: 76 0d jbe 1222c9 <pthread_kill+0x25>
rtems_set_errno_and_return_minus_one( EINVAL );
1222bc: e8 0f 37 ff ff call 1159d0 <__errno>
1222c1: c7 00 16 00 00 00 movl $0x16,(%eax)
1222c7: eb 73 jmp 12233c <pthread_kill+0x98>
the_thread = _Thread_Get( thread, &location );
1222c9: 52 push %edx
1222ca: 52 push %edx
1222cb: 8d 45 e4 lea -0x1c(%ebp),%eax
1222ce: 50 push %eax
1222cf: ff 75 08 pushl 0x8(%ebp)
1222d2: e8 05 e7 fe ff call 1109dc <_Thread_Get>
1222d7: 89 c6 mov %eax,%esi
switch ( location ) {
1222d9: 83 c4 10 add $0x10,%esp
1222dc: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp)
1222e0: 75 4f jne 122331 <pthread_kill+0x8d> <== NEVER TAKEN
case OBJECTS_LOCAL:
/*
* If sig == 0 then just validate arguments
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
1222e2: 8b 90 ec 00 00 00 mov 0xec(%eax),%edx
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
1222e8: 6b c3 0c imul $0xc,%ebx,%eax
1222eb: 83 b8 18 ba 12 00 01 cmpl $0x1,0x12ba18(%eax)
1222f2: 74 34 je 122328 <pthread_kill+0x84>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
1222f4: b8 01 00 00 00 mov $0x1,%eax
1222f9: 89 f9 mov %edi,%ecx
1222fb: d3 e0 shl %cl,%eax
return 0;
}
/* XXX critical section */
api->signals_pending |= signo_to_mask( sig );
1222fd: 09 82 d4 00 00 00 or %eax,0xd4(%edx)
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
122303: 50 push %eax
122304: 6a 00 push $0x0
122306: 53 push %ebx
122307: 56 push %esi
122308: e8 93 fe ff ff call 1221a0 <_POSIX_signals_Unblock_thread>
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
12230d: 83 c4 10 add $0x10,%esp
122310: 83 3d d8 b9 12 00 00 cmpl $0x0,0x12b9d8
122317: 74 0f je 122328 <pthread_kill+0x84>
122319: 3b 35 dc b9 12 00 cmp 0x12b9dc,%esi
12231f: 75 07 jne 122328 <pthread_kill+0x84>
_Thread_Dispatch_necessary = true;
122321: c6 05 e8 b9 12 00 01 movb $0x1,0x12b9e8
}
_Thread_Enable_dispatch();
122328: e8 8d e6 fe ff call 1109ba <_Thread_Enable_dispatch>
return 0;
12232d: 31 c0 xor %eax,%eax
12232f: eb 0e jmp 12233f <pthread_kill+0x9b>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
122331: e8 9a 36 ff ff call 1159d0 <__errno> <== NOT EXECUTED
122336: c7 00 03 00 00 00 movl $0x3,(%eax) <== NOT EXECUTED
12233c: 83 c8 ff or $0xffffffff,%eax
}
12233f: 8d 65 f4 lea -0xc(%ebp),%esp
122342: 5b pop %ebx
122343: 5e pop %esi
122344: 5f pop %edi
122345: c9 leave
122346: c3 ret
0010bf78 <pthread_mutex_timedlock>:
int pthread_mutex_timedlock(
pthread_mutex_t *mutex,
const struct timespec *abstime
)
{
10bf78: 55 push %ebp
10bf79: 89 e5 mov %esp,%ebp
10bf7b: 53 push %ebx
10bf7c: 83 ec 2c sub $0x2c,%esp
*
* 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 );
10bf7f: 8d 45 f4 lea -0xc(%ebp),%eax
10bf82: 50 push %eax
10bf83: ff 75 0c pushl 0xc(%ebp)
10bf86: e8 b9 00 00 00 call 10c044 <_POSIX_Absolute_timeout_to_ticks>
10bf8b: 89 c3 mov %eax,%ebx
int _EXFUN(pthread_mutex_trylock, (pthread_mutex_t *__mutex));
int _EXFUN(pthread_mutex_unlock, (pthread_mutex_t *__mutex));
#if defined(_POSIX_TIMEOUTS)
int _EXFUN(pthread_mutex_timedlock,
10bf8d: 83 c4 0c add $0xc,%esp
10bf90: 83 f8 03 cmp $0x3,%eax
10bf93: 0f 94 c2 sete %dl
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
10bf96: ff 75 f4 pushl -0xc(%ebp)
10bf99: 0f b6 c2 movzbl %dl,%eax
10bf9c: 50 push %eax
10bf9d: ff 75 08 pushl 0x8(%ebp)
10bfa0: 88 55 e4 mov %dl,-0x1c(%ebp)
10bfa3: e8 e8 fe ff ff call 10be90 <_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) ) {
10bfa8: 83 c4 10 add $0x10,%esp
10bfab: 8a 55 e4 mov -0x1c(%ebp),%dl
10bfae: 84 d2 test %dl,%dl
10bfb0: 75 1d jne 10bfcf <pthread_mutex_timedlock+0x57>
10bfb2: 83 f8 10 cmp $0x10,%eax
10bfb5: 75 18 jne 10bfcf <pthread_mutex_timedlock+0x57><== NEVER TAKEN
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
10bfb7: 85 db test %ebx,%ebx
10bfb9: 74 08 je 10bfc3 <pthread_mutex_timedlock+0x4b><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10bfbb: 4b dec %ebx
10bfbc: 83 fb 01 cmp $0x1,%ebx
10bfbf: 77 0e ja 10bfcf <pthread_mutex_timedlock+0x57><== NEVER TAKEN
10bfc1: eb 07 jmp 10bfca <pthread_mutex_timedlock+0x52>
* 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;
10bfc3: b8 16 00 00 00 mov $0x16,%eax <== NOT EXECUTED
10bfc8: eb 05 jmp 10bfcf <pthread_mutex_timedlock+0x57><== NOT EXECUTED
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
10bfca: b8 74 00 00 00 mov $0x74,%eax
}
return lock_status;
}
10bfcf: 8b 5d fc mov -0x4(%ebp),%ebx
10bfd2: c9 leave
10bfd3: c3 ret
0010bbf0 <pthread_mutexattr_setpshared>:
int pthread_mutexattr_setpshared(
pthread_mutexattr_t *attr,
int pshared
)
{
10bbf0: 55 push %ebp
10bbf1: 89 e5 mov %esp,%ebp
10bbf3: 8b 55 08 mov 0x8(%ebp),%edx
10bbf6: 8b 4d 0c mov 0xc(%ebp),%ecx
if ( !attr || !attr->is_initialized )
return EINVAL;
10bbf9: b8 16 00 00 00 mov $0x16,%eax
int pthread_mutexattr_setpshared(
pthread_mutexattr_t *attr,
int pshared
)
{
if ( !attr || !attr->is_initialized )
10bbfe: 85 d2 test %edx,%edx
10bc00: 74 0f je 10bc11 <pthread_mutexattr_setpshared+0x21>
10bc02: 83 3a 00 cmpl $0x0,(%edx)
10bc05: 74 0a je 10bc11 <pthread_mutexattr_setpshared+0x21>
return EINVAL;
switch ( pshared ) {
10bc07: 83 f9 01 cmp $0x1,%ecx
10bc0a: 77 05 ja 10bc11 <pthread_mutexattr_setpshared+0x21><== NEVER TAKEN
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
10bc0c: 89 4a 04 mov %ecx,0x4(%edx)
return 0;
10bc0f: 30 c0 xor %al,%al
default:
return EINVAL;
}
}
10bc11: c9 leave
10bc12: c3 ret
00109e18 <pthread_mutexattr_settype>:
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
int pthread_mutexattr_settype(
pthread_mutexattr_t *attr,
int type
)
{
109e18: 55 push %ebp
109e19: 89 e5 mov %esp,%ebp
109e1b: 8b 55 08 mov 0x8(%ebp),%edx
109e1e: 8b 4d 0c mov 0xc(%ebp),%ecx
if ( !attr || !attr->is_initialized )
return EINVAL;
109e21: b8 16 00 00 00 mov $0x16,%eax
int pthread_mutexattr_settype(
pthread_mutexattr_t *attr,
int type
)
{
if ( !attr || !attr->is_initialized )
109e26: 85 d2 test %edx,%edx
109e28: 74 0f je 109e39 <pthread_mutexattr_settype+0x21>
109e2a: 83 3a 00 cmpl $0x0,(%edx)
109e2d: 74 0a je 109e39 <pthread_mutexattr_settype+0x21><== NEVER TAKEN
return EINVAL;
switch ( type ) {
109e2f: 83 f9 03 cmp $0x3,%ecx
109e32: 77 05 ja 109e39 <pthread_mutexattr_settype+0x21>
case PTHREAD_MUTEX_NORMAL:
case PTHREAD_MUTEX_RECURSIVE:
case PTHREAD_MUTEX_ERRORCHECK:
case PTHREAD_MUTEX_DEFAULT:
attr->type = type;
109e34: 89 4a 10 mov %ecx,0x10(%edx)
return 0;
109e37: 30 c0 xor %al,%al
default:
return EINVAL;
}
}
109e39: c9 leave
109e3a: c3 ret
0010a8c8 <pthread_once>:
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
10a8c8: 55 push %ebp
10a8c9: 89 e5 mov %esp,%ebp
10a8cb: 56 push %esi
10a8cc: 53 push %ebx
10a8cd: 83 ec 10 sub $0x10,%esp
10a8d0: 8b 5d 08 mov 0x8(%ebp),%ebx
10a8d3: 8b 75 0c mov 0xc(%ebp),%esi
if ( !once_control || !init_routine )
10a8d6: 85 f6 test %esi,%esi
10a8d8: 74 51 je 10a92b <pthread_once+0x63>
10a8da: 85 db test %ebx,%ebx
10a8dc: 74 4d je 10a92b <pthread_once+0x63>
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
10a8de: 31 c0 xor %eax,%eax
)
{
if ( !once_control || !init_routine )
return EINVAL;
if ( !once_control->init_executed ) {
10a8e0: 83 7b 04 00 cmpl $0x0,0x4(%ebx)
10a8e4: 75 4a jne 10a930 <pthread_once+0x68>
rtems_mode saveMode;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
10a8e6: 52 push %edx
10a8e7: 8d 45 f4 lea -0xc(%ebp),%eax
10a8ea: 50 push %eax
10a8eb: 68 00 01 00 00 push $0x100
10a8f0: 68 00 01 00 00 push $0x100
10a8f5: e8 9e 0a 00 00 call 10b398 <rtems_task_mode>
if ( !once_control->init_executed ) {
10a8fa: 83 c4 10 add $0x10,%esp
10a8fd: 83 7b 04 00 cmpl $0x0,0x4(%ebx)
10a901: 75 0f jne 10a912 <pthread_once+0x4a> <== NEVER TAKEN
once_control->is_initialized = true;
10a903: c7 03 01 00 00 00 movl $0x1,(%ebx)
once_control->init_executed = true;
10a909: c7 43 04 01 00 00 00 movl $0x1,0x4(%ebx)
(*init_routine)();
10a910: ff d6 call *%esi
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
10a912: 50 push %eax
10a913: 8d 45 f4 lea -0xc(%ebp),%eax
10a916: 50 push %eax
10a917: 68 00 01 00 00 push $0x100
10a91c: ff 75 f4 pushl -0xc(%ebp)
10a91f: e8 74 0a 00 00 call 10b398 <rtems_task_mode>
10a924: 83 c4 10 add $0x10,%esp
}
return 0;
10a927: 31 c0 xor %eax,%eax
10a929: eb 05 jmp 10a930 <pthread_once+0x68>
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
if ( !once_control || !init_routine )
return EINVAL;
10a92b: b8 16 00 00 00 mov $0x16,%eax
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
}
10a930: 8d 65 f8 lea -0x8(%ebp),%esp
10a933: 5b pop %ebx
10a934: 5e pop %esi
10a935: c9 leave
10a936: c3 ret
0010b0f4 <pthread_rwlock_init>:
int pthread_rwlock_init(
pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr
)
{
10b0f4: 55 push %ebp
10b0f5: 89 e5 mov %esp,%ebp
10b0f7: 56 push %esi
10b0f8: 53 push %ebx
10b0f9: 83 ec 10 sub $0x10,%esp
10b0fc: 8b 5d 08 mov 0x8(%ebp),%ebx
/*
* Error check parameters
*/
if ( !rwlock )
return EINVAL;
10b0ff: b8 16 00 00 00 mov $0x16,%eax
const pthread_rwlockattr_t *the_attr;
/*
* Error check parameters
*/
if ( !rwlock )
10b104: 85 db test %ebx,%ebx
10b106: 0f 84 8b 00 00 00 je 10b197 <pthread_rwlock_init+0xa3>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
10b10c: 8b 75 0c mov 0xc(%ebp),%esi
10b10f: 85 f6 test %esi,%esi
10b111: 75 0f jne 10b122 <pthread_rwlock_init+0x2e>
the_attr = attr;
} else {
(void) pthread_rwlockattr_init( &default_attr );
10b113: 83 ec 0c sub $0xc,%esp
10b116: 8d 75 ec lea -0x14(%ebp),%esi
10b119: 56 push %esi
10b11a: e8 5d 09 00 00 call 10ba7c <pthread_rwlockattr_init>
10b11f: 83 c4 10 add $0x10,%esp
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
return EINVAL;
10b122: b8 16 00 00 00 mov $0x16,%eax
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
10b127: 83 3e 00 cmpl $0x0,(%esi)
10b12a: 74 6b je 10b197 <pthread_rwlock_init+0xa3><== NEVER TAKEN
return EINVAL;
switch ( the_attr->process_shared ) {
10b12c: 83 7e 04 00 cmpl $0x0,0x4(%esi)
10b130: 75 65 jne 10b197 <pthread_rwlock_init+0xa3><== NEVER TAKEN
*/
RTEMS_INLINE_ROUTINE void _CORE_RWLock_Initialize_attributes(
CORE_RWLock_Attributes *the_attributes
)
{
the_attributes->XXX = 0;
10b132: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp)
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b139: a1 50 83 12 00 mov 0x128350,%eax
10b13e: 40 inc %eax
10b13f: a3 50 83 12 00 mov %eax,0x128350
* 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 );
10b144: 83 ec 0c sub $0xc,%esp
10b147: 68 34 85 12 00 push $0x128534
10b14c: e8 33 23 00 00 call 10d484 <_Objects_Allocate>
10b151: 89 c6 mov %eax,%esi
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
10b153: 83 c4 10 add $0x10,%esp
10b156: 85 c0 test %eax,%eax
10b158: 75 0c jne 10b166 <pthread_rwlock_init+0x72>
_Thread_Enable_dispatch();
10b15a: e8 03 32 00 00 call 10e362 <_Thread_Enable_dispatch>
return EAGAIN;
10b15f: b8 0b 00 00 00 mov $0xb,%eax
10b164: eb 31 jmp 10b197 <pthread_rwlock_init+0xa3>
}
_CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes );
10b166: 50 push %eax
10b167: 50 push %eax
10b168: 8d 45 f4 lea -0xc(%ebp),%eax
10b16b: 50 push %eax
10b16c: 8d 46 10 lea 0x10(%esi),%eax
10b16f: 50 push %eax
10b170: e8 7b 1b 00 00 call 10ccf0 <_CORE_RWLock_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10b175: 8b 46 08 mov 0x8(%esi),%eax
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10b178: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10b17b: 8b 15 50 85 12 00 mov 0x128550,%edx
10b181: 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;
10b184: c7 46 0c 00 00 00 00 movl $0x0,0xc(%esi)
&_POSIX_RWLock_Information,
&the_rwlock->Object,
0
);
*rwlock = the_rwlock->Object.id;
10b18b: 89 03 mov %eax,(%ebx)
_Thread_Enable_dispatch();
10b18d: e8 d0 31 00 00 call 10e362 <_Thread_Enable_dispatch>
return 0;
10b192: 83 c4 10 add $0x10,%esp
10b195: 31 c0 xor %eax,%eax
}
10b197: 8d 65 f8 lea -0x8(%ebp),%esp
10b19a: 5b pop %ebx
10b19b: 5e pop %esi
10b19c: c9 leave
10b19d: c3 ret
0010b208 <pthread_rwlock_timedrdlock>:
int pthread_rwlock_timedrdlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
10b208: 55 push %ebp
10b209: 89 e5 mov %esp,%ebp
10b20b: 57 push %edi
10b20c: 56 push %esi
10b20d: 53 push %ebx
10b20e: 83 ec 2c sub $0x2c,%esp
10b211: 8b 7d 08 mov 0x8(%ebp),%edi
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
return EINVAL;
10b214: bb 16 00 00 00 mov $0x16,%ebx
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
10b219: 85 ff test %edi,%edi
10b21b: 0f 84 87 00 00 00 je 10b2a8 <pthread_rwlock_timedrdlock+0xa0>
*
* 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 );
10b221: 50 push %eax
10b222: 50 push %eax
10b223: 8d 45 e0 lea -0x20(%ebp),%eax
10b226: 50 push %eax
10b227: ff 75 0c pushl 0xc(%ebp)
10b22a: e8 65 59 00 00 call 110b94 <_POSIX_Absolute_timeout_to_ticks>
10b22f: 89 c6 mov %eax,%esi
10b231: 83 c4 0c add $0xc,%esp
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
10b234: 8d 45 e4 lea -0x1c(%ebp),%eax
10b237: 50 push %eax
10b238: ff 37 pushl (%edi)
10b23a: 68 34 85 12 00 push $0x128534
10b23f: e8 6c 26 00 00 call 10d8b0 <_Objects_Get>
switch ( location ) {
10b244: 83 c4 10 add $0x10,%esp
10b247: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp)
10b24b: 75 5b jne 10b2a8 <pthread_rwlock_timedrdlock+0xa0>
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,
10b24d: 83 fe 03 cmp $0x3,%esi
10b250: 0f 94 c2 sete %dl
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_reading(
10b253: 83 ec 0c sub $0xc,%esp
10b256: 6a 00 push $0x0
10b258: ff 75 e0 pushl -0x20(%ebp)
10b25b: 0f b6 ca movzbl %dl,%ecx
10b25e: 51 push %ecx
10b25f: ff 37 pushl (%edi)
10b261: 83 c0 10 add $0x10,%eax
10b264: 50 push %eax
10b265: 88 55 d4 mov %dl,-0x2c(%ebp)
10b268: e8 b7 1a 00 00 call 10cd24 <_CORE_RWLock_Obtain_for_reading>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
10b26d: 83 c4 20 add $0x20,%esp
10b270: e8 ed 30 00 00 call 10e362 <_Thread_Enable_dispatch>
if ( !do_wait ) {
10b275: 8a 55 d4 mov -0x2c(%ebp),%dl
10b278: 84 d2 test %dl,%dl
10b27a: 75 17 jne 10b293 <pthread_rwlock_timedrdlock+0x8b>
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
10b27c: a1 78 88 12 00 mov 0x128878,%eax
10b281: 83 78 34 02 cmpl $0x2,0x34(%eax)
10b285: 75 0c jne 10b293 <pthread_rwlock_timedrdlock+0x8b>
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
10b287: 85 f6 test %esi,%esi
10b289: 74 1d je 10b2a8 <pthread_rwlock_timedrdlock+0xa0><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10b28b: 4e dec %esi
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
10b28c: b3 74 mov $0x74,%bl
_Thread_Enable_dispatch();
if ( !do_wait ) {
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10b28e: 83 fe 01 cmp $0x1,%esi
10b291: 76 15 jbe 10b2a8 <pthread_rwlock_timedrdlock+0xa0><== ALWAYS TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
10b293: 83 ec 0c sub $0xc,%esp
(CORE_RWLock_Status) _Thread_Executing->Wait.return_code
10b296: a1 78 88 12 00 mov 0x128878,%eax
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
10b29b: ff 70 34 pushl 0x34(%eax)
10b29e: e8 bd 00 00 00 call 10b360 <_POSIX_RWLock_Translate_core_RWLock_return_code>
10b2a3: 89 c3 mov %eax,%ebx
10b2a5: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10b2a8: 89 d8 mov %ebx,%eax
10b2aa: 8d 65 f4 lea -0xc(%ebp),%esp
10b2ad: 5b pop %ebx
10b2ae: 5e pop %esi
10b2af: 5f pop %edi
10b2b0: c9 leave
10b2b1: c3 ret
0010b2b4 <pthread_rwlock_timedwrlock>:
int pthread_rwlock_timedwrlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
10b2b4: 55 push %ebp
10b2b5: 89 e5 mov %esp,%ebp
10b2b7: 57 push %edi
10b2b8: 56 push %esi
10b2b9: 53 push %ebx
10b2ba: 83 ec 2c sub $0x2c,%esp
10b2bd: 8b 7d 08 mov 0x8(%ebp),%edi
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
return EINVAL;
10b2c0: bb 16 00 00 00 mov $0x16,%ebx
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
10b2c5: 85 ff test %edi,%edi
10b2c7: 0f 84 87 00 00 00 je 10b354 <pthread_rwlock_timedwrlock+0xa0>
*
* 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 );
10b2cd: 50 push %eax
10b2ce: 50 push %eax
10b2cf: 8d 45 e0 lea -0x20(%ebp),%eax
10b2d2: 50 push %eax
10b2d3: ff 75 0c pushl 0xc(%ebp)
10b2d6: e8 b9 58 00 00 call 110b94 <_POSIX_Absolute_timeout_to_ticks>
10b2db: 89 c6 mov %eax,%esi
10b2dd: 83 c4 0c add $0xc,%esp
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
10b2e0: 8d 45 e4 lea -0x1c(%ebp),%eax
10b2e3: 50 push %eax
10b2e4: ff 37 pushl (%edi)
10b2e6: 68 34 85 12 00 push $0x128534
10b2eb: e8 c0 25 00 00 call 10d8b0 <_Objects_Get>
switch ( location ) {
10b2f0: 83 c4 10 add $0x10,%esp
10b2f3: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp)
10b2f7: 75 5b jne 10b354 <pthread_rwlock_timedwrlock+0xa0>
(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,
10b2f9: 83 fe 03 cmp $0x3,%esi
10b2fc: 0f 94 c2 sete %dl
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_writing(
10b2ff: 83 ec 0c sub $0xc,%esp
10b302: 6a 00 push $0x0
10b304: ff 75 e0 pushl -0x20(%ebp)
10b307: 0f b6 ca movzbl %dl,%ecx
10b30a: 51 push %ecx
10b30b: ff 37 pushl (%edi)
10b30d: 83 c0 10 add $0x10,%eax
10b310: 50 push %eax
10b311: 88 55 d4 mov %dl,-0x2c(%ebp)
10b314: e8 c3 1a 00 00 call 10cddc <_CORE_RWLock_Obtain_for_writing>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
10b319: 83 c4 20 add $0x20,%esp
10b31c: e8 41 30 00 00 call 10e362 <_Thread_Enable_dispatch>
if ( !do_wait &&
10b321: 8a 55 d4 mov -0x2c(%ebp),%dl
10b324: 84 d2 test %dl,%dl
10b326: 75 17 jne 10b33f <pthread_rwlock_timedwrlock+0x8b>
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
10b328: a1 78 88 12 00 mov 0x128878,%eax
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
10b32d: 83 78 34 02 cmpl $0x2,0x34(%eax)
10b331: 75 0c jne 10b33f <pthread_rwlock_timedwrlock+0x8b>
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
10b333: 85 f6 test %esi,%esi
10b335: 74 1d je 10b354 <pthread_rwlock_timedwrlock+0xa0><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10b337: 4e dec %esi
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
10b338: b3 74 mov $0x74,%bl
_Thread_Enable_dispatch();
if ( !do_wait &&
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10b33a: 83 fe 01 cmp $0x1,%esi
10b33d: 76 15 jbe 10b354 <pthread_rwlock_timedwrlock+0xa0><== ALWAYS TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
10b33f: 83 ec 0c sub $0xc,%esp
(CORE_RWLock_Status) _Thread_Executing->Wait.return_code
10b342: a1 78 88 12 00 mov 0x128878,%eax
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
10b347: ff 70 34 pushl 0x34(%eax)
10b34a: e8 11 00 00 00 call 10b360 <_POSIX_RWLock_Translate_core_RWLock_return_code>
10b34f: 89 c3 mov %eax,%ebx
10b351: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10b354: 89 d8 mov %ebx,%eax
10b356: 8d 65 f4 lea -0xc(%ebp),%esp
10b359: 5b pop %ebx
10b35a: 5e pop %esi
10b35b: 5f pop %edi
10b35c: c9 leave
10b35d: c3 ret
0010ba9c <pthread_rwlockattr_setpshared>:
int pthread_rwlockattr_setpshared(
pthread_rwlockattr_t *attr,
int pshared
)
{
10ba9c: 55 push %ebp
10ba9d: 89 e5 mov %esp,%ebp
10ba9f: 8b 55 08 mov 0x8(%ebp),%edx
10baa2: 8b 4d 0c mov 0xc(%ebp),%ecx
if ( !attr )
return EINVAL;
10baa5: b8 16 00 00 00 mov $0x16,%eax
int pthread_rwlockattr_setpshared(
pthread_rwlockattr_t *attr,
int pshared
)
{
if ( !attr )
10baaa: 85 d2 test %edx,%edx
10baac: 74 0f je 10babd <pthread_rwlockattr_setpshared+0x21>
return EINVAL;
if ( !attr->is_initialized )
10baae: 83 3a 00 cmpl $0x0,(%edx)
10bab1: 74 0a je 10babd <pthread_rwlockattr_setpshared+0x21>
return EINVAL;
switch ( pshared ) {
10bab3: 83 f9 01 cmp $0x1,%ecx
10bab6: 77 05 ja 10babd <pthread_rwlockattr_setpshared+0x21><== NEVER TAKEN
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
10bab8: 89 4a 04 mov %ecx,0x4(%edx)
return 0;
10babb: 30 c0 xor %al,%al
default:
return EINVAL;
}
}
10babd: c9 leave
10babe: c3 ret
0010c798 <pthread_setschedparam>:
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
10c798: 55 push %ebp
10c799: 89 e5 mov %esp,%ebp
10c79b: 57 push %edi
10c79c: 56 push %esi
10c79d: 53 push %ebx
10c79e: 83 ec 2c sub $0x2c,%esp
10c7a1: 8b 75 10 mov 0x10(%ebp),%esi
/*
* Check all the parameters
*/
if ( !param )
return EINVAL;
10c7a4: c7 45 d4 16 00 00 00 movl $0x16,-0x2c(%ebp)
int rc;
/*
* Check all the parameters
*/
if ( !param )
10c7ab: 85 f6 test %esi,%esi
10c7ad: 0f 84 fc 00 00 00 je 10c8af <pthread_setschedparam+0x117>
return EINVAL;
rc = _POSIX_Thread_Translate_sched_param(
10c7b3: 8d 45 e0 lea -0x20(%ebp),%eax
10c7b6: 50 push %eax
10c7b7: 8d 45 e4 lea -0x1c(%ebp),%eax
10c7ba: 50 push %eax
10c7bb: 56 push %esi
10c7bc: ff 75 0c pushl 0xc(%ebp)
10c7bf: e8 20 53 00 00 call 111ae4 <_POSIX_Thread_Translate_sched_param>
10c7c4: 89 45 d4 mov %eax,-0x2c(%ebp)
policy,
param,
&budget_algorithm,
&budget_callout
);
if ( rc )
10c7c7: 83 c4 10 add $0x10,%esp
10c7ca: 85 c0 test %eax,%eax
10c7cc: 0f 85 dd 00 00 00 jne 10c8af <pthread_setschedparam+0x117>
return rc;
/*
* Actually change the scheduling policy and parameters
*/
the_thread = _Thread_Get( thread, &location );
10c7d2: 53 push %ebx
10c7d3: 53 push %ebx
10c7d4: 8d 45 dc lea -0x24(%ebp),%eax
10c7d7: 50 push %eax
10c7d8: ff 75 08 pushl 0x8(%ebp)
10c7db: e8 54 27 00 00 call 10ef34 <_Thread_Get>
10c7e0: 89 c2 mov %eax,%edx
switch ( location ) {
10c7e2: 83 c4 10 add $0x10,%esp
10c7e5: 83 7d dc 00 cmpl $0x0,-0x24(%ebp)
10c7e9: 0f 85 b9 00 00 00 jne 10c8a8 <pthread_setschedparam+0x110>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10c7ef: 8b 98 ec 00 00 00 mov 0xec(%eax),%ebx
if ( api->schedpolicy == SCHED_SPORADIC )
10c7f5: 83 bb 84 00 00 00 04 cmpl $0x4,0x84(%ebx)
10c7fc: 75 18 jne 10c816 <pthread_setschedparam+0x7e>
(void) _Watchdog_Remove( &api->Sporadic_timer );
10c7fe: 83 ec 0c sub $0xc,%esp
10c801: 8d 83 a8 00 00 00 lea 0xa8(%ebx),%eax
10c807: 50 push %eax
10c808: 89 55 d0 mov %edx,-0x30(%ebp)
10c80b: e8 68 35 00 00 call 10fd78 <_Watchdog_Remove>
10c810: 83 c4 10 add $0x10,%esp
10c813: 8b 55 d0 mov -0x30(%ebp),%edx
api->schedpolicy = policy;
10c816: 8b 45 0c mov 0xc(%ebp),%eax
10c819: 89 83 84 00 00 00 mov %eax,0x84(%ebx)
api->schedparam = *param;
10c81f: 8d bb 88 00 00 00 lea 0x88(%ebx),%edi
10c825: b9 07 00 00 00 mov $0x7,%ecx
10c82a: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
the_thread->budget_algorithm = budget_algorithm;
10c82c: 8b 45 e4 mov -0x1c(%ebp),%eax
10c82f: 89 42 7c mov %eax,0x7c(%edx)
the_thread->budget_callout = budget_callout;
10c832: 8b 45 e0 mov -0x20(%ebp),%eax
10c835: 89 82 80 00 00 00 mov %eax,0x80(%edx)
switch ( api->schedpolicy ) {
10c83b: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)
10c83f: 78 60 js 10c8a1 <pthread_setschedparam+0x109><== NEVER TAKEN
10c841: 83 7d 0c 02 cmpl $0x2,0xc(%ebp)
10c845: 7e 08 jle 10c84f <pthread_setschedparam+0xb7>
10c847: 83 7d 0c 04 cmpl $0x4,0xc(%ebp)
10c84b: 75 54 jne 10c8a1 <pthread_setschedparam+0x109><== NEVER TAKEN
10c84d: eb 24 jmp 10c873 <pthread_setschedparam+0xdb>
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
10c84f: a1 c0 a3 12 00 mov 0x12a3c0,%eax
10c854: 89 42 78 mov %eax,0x78(%edx)
10c857: 0f b6 05 88 62 12 00 movzbl 0x126288,%eax
10c85e: 2b 83 88 00 00 00 sub 0x88(%ebx),%eax
the_thread->real_priority =
10c864: 89 42 18 mov %eax,0x18(%edx)
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
10c867: 51 push %ecx
10c868: 6a 01 push $0x1
10c86a: 50 push %eax
10c86b: 52 push %edx
10c86c: e8 cb 22 00 00 call 10eb3c <_Thread_Change_priority>
10c871: eb 2b jmp 10c89e <pthread_setschedparam+0x106>
true
);
break;
case SCHED_SPORADIC:
api->ss_high_priority = api->schedparam.sched_priority;
10c873: 8b 83 88 00 00 00 mov 0x88(%ebx),%eax
10c879: 89 83 a4 00 00 00 mov %eax,0xa4(%ebx)
_Watchdog_Remove( &api->Sporadic_timer );
10c87f: 83 ec 0c sub $0xc,%esp
10c882: 81 c3 a8 00 00 00 add $0xa8,%ebx
10c888: 53 push %ebx
10c889: 89 55 d0 mov %edx,-0x30(%ebp)
10c88c: e8 e7 34 00 00 call 10fd78 <_Watchdog_Remove>
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
10c891: 58 pop %eax
10c892: 5a pop %edx
10c893: 8b 55 d0 mov -0x30(%ebp),%edx
10c896: 52 push %edx
10c897: 6a 00 push $0x0
10c899: e8 e5 fd ff ff call 10c683 <_POSIX_Threads_Sporadic_budget_TSR>
break;
10c89e: 83 c4 10 add $0x10,%esp
}
_Thread_Enable_dispatch();
10c8a1: e8 6c 26 00 00 call 10ef12 <_Thread_Enable_dispatch>
return 0;
10c8a6: eb 07 jmp 10c8af <pthread_setschedparam+0x117>
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
10c8a8: c7 45 d4 03 00 00 00 movl $0x3,-0x2c(%ebp)
}
10c8af: 8b 45 d4 mov -0x2c(%ebp),%eax
10c8b2: 8d 65 f4 lea -0xc(%ebp),%esp
10c8b5: 5b pop %ebx
10c8b6: 5e pop %esi
10c8b7: 5f pop %edi
10c8b8: c9 leave
10c8b9: c3 ret
0010a690 <pthread_testcancel>:
*
* 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
*/
void pthread_testcancel( void )
{
10a690: 55 push %ebp
10a691: 89 e5 mov %esp,%ebp
10a693: 53 push %ebx
10a694: 83 ec 04 sub $0x4,%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() )
10a697: 83 3d 6c 68 12 00 00 cmpl $0x0,0x12686c
10a69e: 75 48 jne 10a6e8 <pthread_testcancel+0x58><== NEVER TAKEN
return;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
10a6a0: a1 70 68 12 00 mov 0x126870,%eax
10a6a5: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
10a6ab: 8b 15 48 63 12 00 mov 0x126348,%edx
10a6b1: 42 inc %edx
10a6b2: 89 15 48 63 12 00 mov %edx,0x126348
*/
void pthread_testcancel( void )
{
POSIX_API_Control *thread_support;
bool cancel = false;
10a6b8: 31 db xor %ebx,%ebx
return;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
10a6ba: 83 b8 d8 00 00 00 00 cmpl $0x0,0xd8(%eax)
10a6c1: 75 0a jne 10a6cd <pthread_testcancel+0x3d><== NEVER TAKEN
/* Setting Cancelability State, P1003.1c/Draft 10, p. 183 */
int _EXFUN(pthread_setcancelstate, (int __state, int *__oldstate));
int _EXFUN(pthread_setcanceltype, (int __type, int *__oldtype));
void _EXFUN(pthread_testcancel, (void));
10a6c3: 83 b8 e0 00 00 00 00 cmpl $0x0,0xe0(%eax)
10a6ca: 0f 95 c3 setne %bl
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
10a6cd: e8 e4 25 00 00 call 10ccb6 <_Thread_Enable_dispatch>
if ( cancel )
10a6d2: 84 db test %bl,%bl
10a6d4: 74 12 je 10a6e8 <pthread_testcancel+0x58>
_POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED );
10a6d6: 50 push %eax
10a6d7: 50 push %eax
10a6d8: 6a ff push $0xffffffff
10a6da: ff 35 70 68 12 00 pushl 0x126870
10a6e0: e8 bf 52 00 00 call 10f9a4 <_POSIX_Thread_Exit>
10a6e5: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
10a6e8: 8b 5d fc mov -0x4(%ebp),%ebx
10a6eb: c9 leave
10a6ec: c3 ret
0011d114 <read>:
ssize_t read(
int fd,
void *buffer,
size_t count
)
{
11d114: 55 push %ebp
11d115: 89 e5 mov %esp,%ebp
11d117: 56 push %esi
11d118: 53 push %ebx
11d119: 8b 5d 08 mov 0x8(%ebp),%ebx
11d11c: 8b 55 0c mov 0xc(%ebp),%edx
11d11f: 8b 4d 10 mov 0x10(%ebp),%ecx
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
11d122: 3b 1d 44 11 12 00 cmp 0x121144,%ebx
11d128: 73 14 jae 11d13e <read+0x2a> <== NEVER TAKEN
iop = rtems_libio_iop( fd );
11d12a: 6b db 38 imul $0x38,%ebx,%ebx
11d12d: 03 1d f8 51 12 00 add 0x1251f8,%ebx
rtems_libio_check_is_open( iop );
11d133: 8b 73 14 mov 0x14(%ebx),%esi
11d136: f7 c6 00 01 00 00 test $0x100,%esi
11d13c: 75 0d jne 11d14b <read+0x37>
11d13e: e8 f5 3f ff ff call 111138 <__errno>
11d143: c7 00 09 00 00 00 movl $0x9,(%eax)
11d149: eb 1a jmp 11d165 <read+0x51>
rtems_libio_check_buffer( buffer );
11d14b: 85 d2 test %edx,%edx
11d14d: 74 0b je 11d15a <read+0x46> <== NEVER TAKEN
rtems_libio_check_count( count );
11d14f: 31 c0 xor %eax,%eax
11d151: 85 c9 test %ecx,%ecx
11d153: 74 31 je 11d186 <read+0x72>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ );
11d155: 83 e6 02 and $0x2,%esi
11d158: 75 10 jne 11d16a <read+0x56>
11d15a: e8 d9 3f ff ff call 111138 <__errno>
11d15f: c7 00 16 00 00 00 movl $0x16,(%eax)
11d165: 83 c8 ff or $0xffffffff,%eax
11d168: eb 1c jmp 11d186 <read+0x72>
/*
* Now process the read().
*/
rc = (*iop->pathinfo.handlers->read_h)( iop, buffer, count );
11d16a: 50 push %eax
11d16b: 8b 43 20 mov 0x20(%ebx),%eax
11d16e: 51 push %ecx
11d16f: 52 push %edx
11d170: 53 push %ebx
11d171: ff 50 08 call *0x8(%eax)
if ( rc > 0 )
11d174: 83 c4 10 add $0x10,%esp
11d177: 85 c0 test %eax,%eax
11d179: 7e 0b jle 11d186 <read+0x72>
iop->offset += rc;
11d17b: 89 c1 mov %eax,%ecx
11d17d: c1 f9 1f sar $0x1f,%ecx
11d180: 01 43 0c add %eax,0xc(%ebx)
11d183: 11 4b 10 adc %ecx,0x10(%ebx)
return rc;
}
11d186: 8d 65 f8 lea -0x8(%ebp),%esp
11d189: 5b pop %ebx
11d18a: 5e pop %esi
11d18b: c9 leave
11d18c: c3 ret
00109ef8 <readlink>:
ssize_t readlink(
const char *pathname,
char *buf,
size_t bufsize
)
{
109ef8: 55 push %ebp
109ef9: 89 e5 mov %esp,%ebp
109efb: 57 push %edi
109efc: 56 push %esi
109efd: 53 push %ebx
109efe: 83 ec 2c sub $0x2c,%esp
109f01: 8b 55 08 mov 0x8(%ebp),%edx
109f04: 8b 5d 0c mov 0xc(%ebp),%ebx
rtems_filesystem_location_info_t loc;
int result;
if (!buf)
109f07: 85 db test %ebx,%ebx
109f09: 75 10 jne 109f1b <readlink+0x23>
rtems_set_errno_and_return_minus_one( EFAULT );
109f0b: e8 34 99 00 00 call 113844 <__errno>
109f10: c7 00 0e 00 00 00 movl $0xe,(%eax)
109f16: 83 cf ff or $0xffffffff,%edi
109f19: eb 69 jmp 109f84 <readlink+0x8c>
result = rtems_filesystem_evaluate_path( pathname, strlen( pathname ),
109f1b: 31 c0 xor %eax,%eax
109f1d: 83 c9 ff or $0xffffffff,%ecx
109f20: 89 d7 mov %edx,%edi
109f22: f2 ae repnz scas %es:(%edi),%al
109f24: f7 d1 not %ecx
109f26: 49 dec %ecx
109f27: 83 ec 0c sub $0xc,%esp
109f2a: 6a 00 push $0x0
109f2c: 8d 75 d4 lea -0x2c(%ebp),%esi
109f2f: 56 push %esi
109f30: 6a 00 push $0x0
109f32: 51 push %ecx
109f33: 52 push %edx
109f34: e8 49 f0 ff ff call 108f82 <rtems_filesystem_evaluate_path>
0, &loc, false );
if ( result != 0 )
109f39: 83 c4 20 add $0x20,%esp
return -1;
109f3c: 83 cf ff or $0xffffffff,%edi
if (!buf)
rtems_set_errno_and_return_minus_one( EFAULT );
result = rtems_filesystem_evaluate_path( pathname, strlen( pathname ),
0, &loc, false );
if ( result != 0 )
109f3f: 85 c0 test %eax,%eax
109f41: 75 41 jne 109f84 <readlink+0x8c> <== NEVER TAKEN
return -1;
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
109f43: 83 ec 0c sub $0xc,%esp
109f46: 56 push %esi
109f47: 8b 45 e0 mov -0x20(%ebp),%eax
109f4a: ff 50 10 call *0x10(%eax)
109f4d: 83 c4 10 add $0x10,%esp
109f50: 83 f8 04 cmp $0x4,%eax
109f53: 74 16 je 109f6b <readlink+0x73>
rtems_filesystem_freenode( &loc );
109f55: 83 ec 0c sub $0xc,%esp
109f58: 56 push %esi
109f59: e8 e2 f0 ff ff call 109040 <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( EINVAL );
109f5e: e8 e1 98 00 00 call 113844 <__errno>
109f63: c7 00 16 00 00 00 movl $0x16,(%eax)
109f69: eb 16 jmp 109f81 <readlink+0x89>
}
result = (*loc.ops->readlink_h)( &loc, buf, bufsize );
109f6b: 50 push %eax
109f6c: ff 75 10 pushl 0x10(%ebp)
109f6f: 53 push %ebx
109f70: 56 push %esi
109f71: 8b 45 e0 mov -0x20(%ebp),%eax
109f74: ff 50 3c call *0x3c(%eax)
109f77: 89 c7 mov %eax,%edi
rtems_filesystem_freenode( &loc );
109f79: 89 34 24 mov %esi,(%esp)
109f7c: e8 bf f0 ff ff call 109040 <rtems_filesystem_freenode>
return result;
109f81: 83 c4 10 add $0x10,%esp
}
109f84: 89 f8 mov %edi,%eax
109f86: 8d 65 f4 lea -0xc(%ebp),%esp
109f89: 5b pop %ebx
109f8a: 5e pop %esi
109f8b: 5f pop %edi
109f8c: c9 leave
109f8d: c3 ret
00108ca8 <readv>:
ssize_t readv(
int fd,
const struct iovec *iov,
int iovcnt
)
{
108ca8: 55 push %ebp
108ca9: 89 e5 mov %esp,%ebp
108cab: 57 push %edi
108cac: 56 push %esi
108cad: 53 push %ebx
108cae: 83 ec 2c sub $0x2c,%esp
108cb1: 8b 75 08 mov 0x8(%ebp),%esi
108cb4: 8b 7d 0c mov 0xc(%ebp),%edi
int v;
int bytes;
rtems_libio_t *iop;
bool all_zeros;
rtems_libio_check_fd( fd );
108cb7: 3b 35 44 21 12 00 cmp 0x122144,%esi
108cbd: 73 11 jae 108cd0 <readv+0x28>
iop = rtems_libio_iop( fd );
108cbf: 6b f6 38 imul $0x38,%esi,%esi
108cc2: 03 35 f8 61 12 00 add 0x1261f8,%esi
rtems_libio_check_is_open( iop );
108cc8: 8b 46 14 mov 0x14(%esi),%eax
108ccb: f6 c4 01 test $0x1,%ah
108cce: 75 10 jne 108ce0 <readv+0x38>
108cd0: e8 33 90 00 00 call 111d08 <__errno>
108cd5: c7 00 09 00 00 00 movl $0x9,(%eax)
108cdb: e9 a4 00 00 00 jmp 108d84 <readv+0xdc>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ );
108ce0: a8 02 test $0x2,%al
108ce2: 74 35 je 108d19 <readv+0x71> <== NEVER TAKEN
/*
* Argument validation on IO vector
*/
if ( !iov )
108ce4: 85 ff test %edi,%edi
108ce6: 74 31 je 108d19 <readv+0x71>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt <= 0 )
108ce8: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
108cec: 7e 2b jle 108d19 <readv+0x71>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt > IOV_MAX )
108cee: 81 7d 10 00 04 00 00 cmpl $0x400,0x10(%ebp)
108cf5: 7f 22 jg 108d19 <readv+0x71> <== NEVER TAKEN
108cf7: b2 01 mov $0x1,%dl
108cf9: 31 c0 xor %eax,%eax
108cfb: 31 c9 xor %ecx,%ecx
108cfd: 89 75 d4 mov %esi,-0x2c(%ebp)
108d00: eb 03 jmp 108d05 <readv+0x5d>
if ( iov[v].iov_base == 0 )
rtems_set_errno_and_return_minus_one( EINVAL );
/* check for wrap */
old = total;
total += iov[v].iov_len;
108d02: 8b 4d e4 mov -0x1c(%ebp),%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 )
108d05: 83 3c c7 00 cmpl $0x0,(%edi,%eax,8)
108d09: 74 0e je 108d19 <readv+0x71>
rtems_set_errno_and_return_minus_one( EINVAL );
/* check for wrap */
old = total;
total += iov[v].iov_len;
108d0b: 8b 5c c7 04 mov 0x4(%edi,%eax,8),%ebx
108d0f: 8d 34 19 lea (%ecx,%ebx,1),%esi
108d12: 89 75 e4 mov %esi,-0x1c(%ebp)
if ( total < old )
108d15: 39 ce cmp %ecx,%esi
108d17: 7d 0d jge 108d26 <readv+0x7e>
rtems_set_errno_and_return_minus_one( EINVAL );
108d19: e8 ea 8f 00 00 call 111d08 <__errno>
108d1e: c7 00 16 00 00 00 movl $0x16,(%eax)
108d24: eb 5e jmp 108d84 <readv+0xdc>
if ( iov[v].iov_len )
all_zeros = false;
108d26: 85 db test %ebx,%ebx
108d28: 0f 94 c1 sete %cl
108d2b: f7 d9 neg %ecx
108d2d: 21 ca and %ecx,%edx
* 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++ ) {
108d2f: 40 inc %eax
108d30: 3b 45 10 cmp 0x10(%ebp),%eax
108d33: 7c cd jl 108d02 <readv+0x5a>
108d35: 8b 75 d4 mov -0x2c(%ebp),%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;
108d38: 31 db xor %ebx,%ebx
/*
* 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 ) {
108d3a: 84 d2 test %dl,%dl
108d3c: 75 49 jne 108d87 <readv+0xdf>
108d3e: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
/*
* Now process the readv().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
bytes = (*iop->pathinfo.handlers->read_h)(
108d45: 50 push %eax
108d46: 8b 46 20 mov 0x20(%esi),%eax
108d49: 8b 55 e4 mov -0x1c(%ebp),%edx
108d4c: ff 74 d7 04 pushl 0x4(%edi,%edx,8)
108d50: ff 34 d7 pushl (%edi,%edx,8)
108d53: 56 push %esi
108d54: ff 50 08 call *0x8(%eax)
iop,
iov[v].iov_base,
iov[v].iov_len
);
if ( bytes < 0 )
108d57: 83 c4 10 add $0x10,%esp
108d5a: 83 f8 00 cmp $0x0,%eax
108d5d: 7c 25 jl 108d84 <readv+0xdc> <== NEVER TAKEN
return -1;
if ( bytes > 0 ) {
108d5f: 74 0d je 108d6e <readv+0xc6> <== NEVER TAKEN
iop->offset += bytes;
108d61: 89 c1 mov %eax,%ecx
108d63: c1 f9 1f sar $0x1f,%ecx
108d66: 01 46 0c add %eax,0xc(%esi)
108d69: 11 4e 10 adc %ecx,0x10(%esi)
total += bytes;
108d6c: 01 c3 add %eax,%ebx
}
if (bytes != iov[ v ].iov_len)
108d6e: 8b 55 e4 mov -0x1c(%ebp),%edx
108d71: 3b 44 d7 04 cmp 0x4(%edi,%edx,8),%eax
108d75: 75 10 jne 108d87 <readv+0xdf> <== NEVER TAKEN
}
/*
* Now process the readv().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
108d77: 42 inc %edx
108d78: 89 55 e4 mov %edx,-0x1c(%ebp)
108d7b: 8b 45 10 mov 0x10(%ebp),%eax
108d7e: 39 c2 cmp %eax,%edx
108d80: 7c c3 jl 108d45 <readv+0x9d>
108d82: eb 03 jmp 108d87 <readv+0xdf>
iov[v].iov_base,
iov[v].iov_len
);
if ( bytes < 0 )
return -1;
108d84: 83 cb ff or $0xffffffff,%ebx
if (bytes != iov[ v ].iov_len)
break;
}
return total;
}
108d87: 89 d8 mov %ebx,%eax
108d89: 8d 65 f4 lea -0xc(%ebp),%esp
108d8c: 5b pop %ebx
108d8d: 5e pop %esi
108d8e: 5f pop %edi
108d8f: c9 leave
108d90: c3 ret
0011d218 <realloc>:
void *realloc(
void *ptr,
size_t size
)
{
11d218: 55 push %ebp
11d219: 89 e5 mov %esp,%ebp
11d21b: 57 push %edi
11d21c: 56 push %esi
11d21d: 53 push %ebx
11d21e: 83 ec 2c sub $0x2c,%esp
11d221: 8b 5d 08 mov 0x8(%ebp),%ebx
11d224: 8b 75 0c mov 0xc(%ebp),%esi
uintptr_t old_size;
char *new_area;
MSBUMP(realloc_calls, 1);
11d227: ff 05 20 52 12 00 incl 0x125220
/*
* Do not attempt to allocate memory if in a critical section or ISR.
*/
if (_System_state_Is_up(_System_state_Get())) {
11d22d: 83 3d 9c 54 12 00 03 cmpl $0x3,0x12549c
11d234: 75 1a jne 11d250 <realloc+0x38> <== NEVER TAKEN
if (_Thread_Dispatch_disable_level > 0)
11d236: a1 40 53 12 00 mov 0x125340,%eax
11d23b: 85 c0 test %eax,%eax
11d23d: 0f 85 ad 00 00 00 jne 11d2f0 <realloc+0xd8> <== NEVER TAKEN
return (void *) 0;
if (_ISR_Nest_level > 0)
11d243: 83 3d 64 58 12 00 00 cmpl $0x0,0x125864
11d24a: 0f 85 a0 00 00 00 jne 11d2f0 <realloc+0xd8> <== NEVER TAKEN
}
/*
* Continue with realloc().
*/
if ( !ptr )
11d250: 85 db test %ebx,%ebx
11d252: 75 13 jne 11d267 <realloc+0x4f>
return malloc( size );
11d254: 83 ec 0c sub $0xc,%esp
11d257: 56 push %esi
11d258: e8 b7 a3 fe ff call 107614 <malloc>
11d25d: 89 c3 mov %eax,%ebx
11d25f: 83 c4 10 add $0x10,%esp
11d262: e9 8b 00 00 00 jmp 11d2f2 <realloc+0xda>
if ( !size ) {
11d267: 85 f6 test %esi,%esi
11d269: 75 0e jne 11d279 <realloc+0x61> <== ALWAYS TAKEN
free( ptr );
11d26b: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
11d26e: 53 push %ebx <== NOT EXECUTED
11d26f: e8 04 a1 fe ff call 107378 <free> <== NOT EXECUTED
return (void *) 0;
11d274: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
11d277: eb 77 jmp 11d2f0 <realloc+0xd8> <== NOT EXECUTED
}
if ( !_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, ptr, &old_size) ) {
11d279: 52 push %edx
11d27a: 8d 45 e4 lea -0x1c(%ebp),%eax
11d27d: 50 push %eax
11d27e: 53 push %ebx
11d27f: ff 35 80 11 12 00 pushl 0x121180
11d285: e8 ee 00 00 00 call 11d378 <_Protected_heap_Get_block_size>
11d28a: 83 c4 10 add $0x10,%esp
11d28d: 84 c0 test %al,%al
11d28f: 75 0d jne 11d29e <realloc+0x86>
errno = EINVAL;
11d291: e8 a2 3e ff ff call 111138 <__errno>
11d296: c7 00 16 00 00 00 movl $0x16,(%eax)
11d29c: eb 52 jmp 11d2f0 <realloc+0xd8>
}
/*
* Now resize it.
*/
if ( _Protected_heap_Resize_block( RTEMS_Malloc_Heap, ptr, size ) ) {
11d29e: 50 push %eax
11d29f: 56 push %esi
11d2a0: 53 push %ebx
11d2a1: ff 35 80 11 12 00 pushl 0x121180
11d2a7: e8 04 01 00 00 call 11d3b0 <_Protected_heap_Resize_block>
11d2ac: 83 c4 10 add $0x10,%esp
11d2af: 84 c0 test %al,%al
11d2b1: 75 3f jne 11d2f2 <realloc+0xda>
* 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 );
11d2b3: 83 ec 0c sub $0xc,%esp
11d2b6: 56 push %esi
11d2b7: e8 58 a3 fe ff call 107614 <malloc>
MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */
11d2bc: ff 0d 14 52 12 00 decl 0x125214
if ( !new_area ) {
11d2c2: 83 c4 10 add $0x10,%esp
11d2c5: 85 c0 test %eax,%eax
11d2c7: 74 27 je 11d2f0 <realloc+0xd8>
return (void *) 0;
}
memcpy( new_area, ptr, (size < old_size) ? size : old_size );
11d2c9: 8b 55 e4 mov -0x1c(%ebp),%edx
11d2cc: 89 f1 mov %esi,%ecx
11d2ce: 39 d6 cmp %edx,%esi
11d2d0: 76 02 jbe 11d2d4 <realloc+0xbc> <== NEVER TAKEN
11d2d2: 89 d1 mov %edx,%ecx
11d2d4: 89 c7 mov %eax,%edi
11d2d6: 89 de mov %ebx,%esi
11d2d8: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
free( ptr );
11d2da: 83 ec 0c sub $0xc,%esp
11d2dd: 53 push %ebx
11d2de: 89 45 d4 mov %eax,-0x2c(%ebp)
11d2e1: e8 92 a0 fe ff call 107378 <free>
return new_area;
11d2e6: 83 c4 10 add $0x10,%esp
11d2e9: 8b 45 d4 mov -0x2c(%ebp),%eax
11d2ec: 89 c3 mov %eax,%ebx
11d2ee: eb 02 jmp 11d2f2 <realloc+0xda>
new_area = malloc( size );
MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */
if ( !new_area ) {
return (void *) 0;
11d2f0: 31 db xor %ebx,%ebx
memcpy( new_area, ptr, (size < old_size) ? size : old_size );
free( ptr );
return new_area;
}
11d2f2: 89 d8 mov %ebx,%eax
11d2f4: 8d 65 f4 lea -0xc(%ebp),%esp
11d2f7: 5b pop %ebx
11d2f8: 5e pop %esi
11d2f9: 5f pop %edi
11d2fa: c9 leave
11d2fb: c3 ret
001083e4 <rmdir>:
#include <rtems/seterr.h>
int rmdir(
const char *pathname
)
{
1083e4: 55 push %ebp
1083e5: 89 e5 mov %esp,%ebp
1083e7: 57 push %edi
1083e8: 56 push %esi
1083e9: 53 push %ebx
1083ea: 83 ec 58 sub $0x58,%esp
/*
* Get the parent node of the node we wish to remove. Find the parent path.
*/
parentpathlen = rtems_filesystem_dirname ( pathname );
1083ed: ff 75 08 pushl 0x8(%ebp)
1083f0: e8 da f2 ff ff call 1076cf <rtems_filesystem_dirname>
1083f5: 89 45 b4 mov %eax,-0x4c(%ebp)
if ( parentpathlen == 0 )
1083f8: 83 c4 10 add $0x10,%esp
1083fb: 85 c0 test %eax,%eax
1083fd: 8d 45 d0 lea -0x30(%ebp),%eax
108400: 75 15 jne 108417 <rmdir+0x33>
rtems_filesystem_get_start_loc( pathname, &i, &parentloc );
108402: 51 push %ecx
108403: 50 push %eax
108404: 8d 45 e4 lea -0x1c(%ebp),%eax
108407: 50 push %eax
108408: ff 75 08 pushl 0x8(%ebp)
10840b: e8 08 01 00 00 call 108518 <rtems_filesystem_get_start_loc>
108410: 83 c4 10 add $0x10,%esp
const char *name;
rtems_filesystem_location_info_t parentloc;
rtems_filesystem_location_info_t loc;
int i;
int result;
bool free_parentloc = false;
108413: 31 db xor %ebx,%ebx
108415: eb 25 jmp 10843c <rmdir+0x58>
parentpathlen = rtems_filesystem_dirname ( pathname );
if ( parentpathlen == 0 )
rtems_filesystem_get_start_loc( pathname, &i, &parentloc );
else {
result = rtems_filesystem_evaluate_path(pathname, parentpathlen,
108417: 83 ec 0c sub $0xc,%esp
10841a: 6a 00 push $0x0
10841c: 50 push %eax
10841d: 6a 02 push $0x2
10841f: ff 75 b4 pushl -0x4c(%ebp)
108422: ff 75 08 pushl 0x8(%ebp)
108425: e8 64 f2 ff ff call 10768e <rtems_filesystem_evaluate_path>
10842a: 89 c2 mov %eax,%edx
RTEMS_LIBIO_PERMS_WRITE,
&parentloc,
false );
if ( result != 0 )
10842c: 83 c4 20 add $0x20,%esp
return -1;
10842f: 83 c8 ff or $0xffffffff,%eax
else {
result = rtems_filesystem_evaluate_path(pathname, parentpathlen,
RTEMS_LIBIO_PERMS_WRITE,
&parentloc,
false );
if ( result != 0 )
108432: 85 d2 test %edx,%edx
108434: 0f 85 d6 00 00 00 jne 108510 <rmdir+0x12c> <== NEVER TAKEN
return -1;
free_parentloc = true;
10843a: b3 01 mov $0x1,%bl
/*
* Start from the parent to find the node that should be under it.
*/
loc = parentloc;
10843c: 8d 7d bc lea -0x44(%ebp),%edi
10843f: 8d 75 d0 lea -0x30(%ebp),%esi
108442: b9 05 00 00 00 mov $0x5,%ecx
108447: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
name = pathname + parentpathlen;
108449: 8b 75 08 mov 0x8(%ebp),%esi
10844c: 03 75 b4 add -0x4c(%ebp),%esi
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
10844f: 83 c9 ff or $0xffffffff,%ecx
108452: 89 f7 mov %esi,%edi
108454: 31 c0 xor %eax,%eax
108456: f2 ae repnz scas %es:(%edi),%al
108458: f7 d1 not %ecx
10845a: 49 dec %ecx
10845b: 52 push %edx
10845c: 52 push %edx
10845d: 51 push %ecx
10845e: 56 push %esi
10845f: e8 aa f2 ff ff call 10770e <rtems_filesystem_prefix_separators>
108464: 01 c6 add %eax,%esi
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
108466: 83 c9 ff or $0xffffffff,%ecx
108469: 89 f7 mov %esi,%edi
10846b: 31 c0 xor %eax,%eax
10846d: f2 ae repnz scas %es:(%edi),%al
10846f: f7 d1 not %ecx
108471: 49 dec %ecx
108472: c7 04 24 00 00 00 00 movl $0x0,(%esp)
108479: 8d 7d bc lea -0x44(%ebp),%edi
10847c: 57 push %edi
10847d: 6a 00 push $0x0
10847f: 51 push %ecx
108480: 56 push %esi
108481: e8 aa f1 ff ff call 107630 <rtems_filesystem_evaluate_relative_path>
0, &loc, false );
if ( result != 0 ) {
108486: 83 c4 20 add $0x20,%esp
108489: 85 c0 test %eax,%eax
10848b: 74 13 je 1084a0 <rmdir+0xbc>
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
return -1;
10848d: 83 c8 ff or $0xffffffff,%eax
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 )
108490: 84 db test %bl,%bl
108492: 74 7c je 108510 <rmdir+0x12c>
rtems_filesystem_freenode( &parentloc );
108494: 83 ec 0c sub $0xc,%esp
108497: 8d 55 d0 lea -0x30(%ebp),%edx
10849a: 52 push %edx
10849b: 89 45 b0 mov %eax,-0x50(%ebp)
10849e: eb 65 jmp 108505 <rmdir+0x121>
}
/*
* Verify you can remove this node as a directory.
*/
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
1084a0: 83 ec 0c sub $0xc,%esp
1084a3: 57 push %edi
1084a4: 8b 45 c8 mov -0x38(%ebp),%eax
1084a7: ff 50 10 call *0x10(%eax)
1084aa: 83 c4 10 add $0x10,%esp
1084ad: 48 dec %eax
1084ae: 74 2f je 1084df <rmdir+0xfb>
rtems_filesystem_freenode( &loc );
1084b0: 83 ec 0c sub $0xc,%esp
1084b3: 57 push %edi
1084b4: e8 93 f2 ff ff call 10774c <rtems_filesystem_freenode>
if ( free_parentloc )
1084b9: 83 c4 10 add $0x10,%esp
1084bc: 84 db test %bl,%bl
1084be: 74 0f je 1084cf <rmdir+0xeb> <== NEVER TAKEN
rtems_filesystem_freenode( &parentloc );
1084c0: 83 ec 0c sub $0xc,%esp
1084c3: 8d 45 d0 lea -0x30(%ebp),%eax
1084c6: 50 push %eax
1084c7: e8 80 f2 ff ff call 10774c <rtems_filesystem_freenode>
1084cc: 83 c4 10 add $0x10,%esp
rtems_set_errno_and_return_minus_one( ENOTDIR );
1084cf: e8 04 94 00 00 call 1118d8 <__errno>
1084d4: c7 00 14 00 00 00 movl $0x14,(%eax)
1084da: 83 c8 ff or $0xffffffff,%eax
1084dd: eb 31 jmp 108510 <rmdir+0x12c>
/*
* Use the filesystems rmnod to remove the node.
*/
result = (*loc.handlers->rmnod_h)( &parentloc, &loc );
1084df: 50 push %eax
1084e0: 50 push %eax
1084e1: 57 push %edi
1084e2: 8d 75 d0 lea -0x30(%ebp),%esi
1084e5: 56 push %esi
1084e6: 8b 45 c4 mov -0x3c(%ebp),%eax
1084e9: ff 50 34 call *0x34(%eax)
rtems_filesystem_freenode( &loc );
1084ec: 89 3c 24 mov %edi,(%esp)
1084ef: 89 45 b0 mov %eax,-0x50(%ebp)
1084f2: e8 55 f2 ff ff call 10774c <rtems_filesystem_freenode>
if ( free_parentloc )
1084f7: 83 c4 10 add $0x10,%esp
1084fa: 84 db test %bl,%bl
1084fc: 8b 45 b0 mov -0x50(%ebp),%eax
1084ff: 74 0f je 108510 <rmdir+0x12c>
rtems_filesystem_freenode( &parentloc );
108501: 83 ec 0c sub $0xc,%esp
108504: 56 push %esi
108505: e8 42 f2 ff ff call 10774c <rtems_filesystem_freenode>
10850a: 83 c4 10 add $0x10,%esp
10850d: 8b 45 b0 mov -0x50(%ebp),%eax
return result;
}
108510: 8d 65 f4 lea -0xc(%ebp),%esp
108513: 5b pop %ebx
108514: 5e pop %esi
108515: 5f pop %edi
108516: c9 leave
108517: c3 ret
0010af85 <rtems_aio_enqueue>:
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
10af85: 55 push %ebp
10af86: 89 e5 mov %esp,%ebp
10af88: 57 push %edi
10af89: 56 push %esi
10af8a: 53 push %ebx
10af8b: 83 ec 58 sub $0x58,%esp
10af8e: 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);
10af91: 68 d8 72 12 00 push $0x1272d8
10af96: e8 c5 08 00 00 call 10b860 <pthread_mutex_lock>
10af9b: 89 45 b4 mov %eax,-0x4c(%ebp)
if (result != 0) {
10af9e: 83 c4 10 add $0x10,%esp
10afa1: 85 c0 test %eax,%eax
10afa3: 74 0e je 10afb3 <rtems_aio_enqueue+0x2e><== ALWAYS TAKEN
free (req);
10afa5: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10afa8: 53 push %ebx <== NOT EXECUTED
10afa9: e8 c2 cd ff ff call 107d70 <free> <== NOT EXECUTED
10afae: e9 c6 01 00 00 jmp 10b179 <rtems_aio_enqueue+0x1f4><== NOT EXECUTED
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);
10afb3: e8 a4 10 00 00 call 10c05c <pthread_self>
10afb8: 57 push %edi
10afb9: 8d 55 c4 lea -0x3c(%ebp),%edx
10afbc: 52 push %edx
10afbd: 8d 55 e0 lea -0x20(%ebp),%edx
10afc0: 52 push %edx
10afc1: 50 push %eax
10afc2: e8 9d 0c 00 00 call 10bc64 <pthread_getschedparam>
req->caller_thread = pthread_self ();
10afc7: e8 90 10 00 00 call 10c05c <pthread_self>
10afcc: 89 43 10 mov %eax,0x10(%ebx)
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
10afcf: 8b 43 14 mov 0x14(%ebx),%eax
10afd2: 8b 55 c4 mov -0x3c(%ebp),%edx
10afd5: 2b 50 14 sub 0x14(%eax),%edx
10afd8: 89 53 0c mov %edx,0xc(%ebx)
req->policy = policy;
10afdb: 8b 55 e0 mov -0x20(%ebp),%edx
10afde: 89 53 08 mov %edx,0x8(%ebx)
req->aiocbp->error_code = EINPROGRESS;
10afe1: c7 40 30 77 00 00 00 movl $0x77,0x30(%eax)
req->aiocbp->return_value = 0;
10afe8: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
if ((aio_request_queue.idle_threads == 0) &&
10afef: 83 c4 10 add $0x10,%esp
10aff2: 83 3d 40 73 12 00 00 cmpl $0x0,0x127340
10aff9: 0f 85 b7 00 00 00 jne 10b0b6 <rtems_aio_enqueue+0x131><== NEVER TAKEN
10afff: 83 3d 3c 73 12 00 04 cmpl $0x4,0x12733c
10b006: 0f 8f aa 00 00 00 jg 10b0b6 <rtems_aio_enqueue+0x131>
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);
10b00c: 56 push %esi
10b00d: 6a 01 push $0x1
10b00f: ff 30 pushl (%eax)
10b011: 68 20 73 12 00 push $0x127320
10b016: e8 81 fb ff ff call 10ab9c <rtems_aio_search_fd>
10b01b: 89 c6 mov %eax,%esi
if (r_chain->new_fd == 1) {
10b01d: 83 c4 10 add $0x10,%esp
10b020: 83 78 18 01 cmpl $0x1,0x18(%eax)
10b024: 8d 50 08 lea 0x8(%eax),%edx
10b027: 8d 78 1c lea 0x1c(%eax),%edi
10b02a: 8d 40 20 lea 0x20(%eax),%eax
10b02d: 89 45 b0 mov %eax,-0x50(%ebp)
10b030: 75 66 jne 10b098 <rtems_aio_enqueue+0x113>
RTEMS_INLINE_ROUTINE void _Chain_Prepend(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert(_Chain_Head(the_chain), the_node);
10b032: 51 push %ecx
10b033: 51 push %ecx
10b034: 53 push %ebx
10b035: 52 push %edx
10b036: e8 c1 1f 00 00 call 10cffc <_Chain_Insert>
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
10b03b: c7 46 18 00 00 00 00 movl $0x0,0x18(%esi)
pthread_mutex_init (&r_chain->mutex, NULL);
10b042: 5b pop %ebx
10b043: 58 pop %eax
10b044: 6a 00 push $0x0
10b046: 57 push %edi
10b047: e8 f4 06 00 00 call 10b740 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
10b04c: 5a pop %edx
10b04d: 59 pop %ecx
10b04e: 6a 00 push $0x0
10b050: ff 75 b0 pushl -0x50(%ebp)
10b053: e8 a8 03 00 00 call 10b400 <pthread_cond_init>
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
10b058: 56 push %esi
10b059: 68 78 ac 10 00 push $0x10ac78
10b05e: 68 e0 72 12 00 push $0x1272e0
10b063: 8d 45 e4 lea -0x1c(%ebp),%eax
10b066: 50 push %eax
10b067: e8 c4 09 00 00 call 10ba30 <pthread_create>
10b06c: 89 c3 mov %eax,%ebx
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
10b06e: 83 c4 20 add $0x20,%esp
10b071: 85 c0 test %eax,%eax
10b073: 74 18 je 10b08d <rtems_aio_enqueue+0x108><== ALWAYS TAKEN
pthread_mutex_unlock (&aio_request_queue.mutex);
10b075: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10b078: 68 d8 72 12 00 push $0x1272d8 <== NOT EXECUTED
10b07d: e8 5e 08 00 00 call 10b8e0 <pthread_mutex_unlock> <== NOT EXECUTED
return result;
10b082: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10b085: 89 5d b4 mov %ebx,-0x4c(%ebp) <== NOT EXECUTED
10b088: e9 ef 00 00 00 jmp 10b17c <rtems_aio_enqueue+0x1f7><== NOT EXECUTED
}
++aio_request_queue.active_threads;
10b08d: ff 05 3c 73 12 00 incl 0x12733c
10b093: e9 d4 00 00 00 jmp 10b16c <rtems_aio_enqueue+0x1e7>
}
else {
/* put request in the fd chain it belongs to */
pthread_mutex_lock (&r_chain->mutex);
10b098: 83 ec 0c sub $0xc,%esp
10b09b: 57 push %edi
10b09c: 89 55 ac mov %edx,-0x54(%ebp)
10b09f: e8 bc 07 00 00 call 10b860 <pthread_mutex_lock>
rtems_aio_insert_prio (&r_chain->perfd, req);
10b0a4: 5e pop %esi
10b0a5: 58 pop %eax
10b0a6: 53 push %ebx
10b0a7: 8b 55 ac mov -0x54(%ebp),%edx
10b0aa: 52 push %edx
10b0ab: e8 ec fd ff ff call 10ae9c <rtems_aio_insert_prio>
pthread_cond_signal (&r_chain->cond);
10b0b0: 5b pop %ebx
10b0b1: ff 75 b0 pushl -0x50(%ebp)
10b0b4: eb 36 jmp 10b0ec <rtems_aio_enqueue+0x167>
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,
10b0b6: 51 push %ecx
10b0b7: 6a 00 push $0x0
10b0b9: ff 30 pushl (%eax)
10b0bb: 68 20 73 12 00 push $0x127320
10b0c0: e8 d7 fa ff ff call 10ab9c <rtems_aio_search_fd>
10b0c5: 89 c6 mov %eax,%esi
req->aiocbp->aio_fildes, 0);
if (r_chain != NULL)
10b0c7: 83 c4 10 add $0x10,%esp
10b0ca: 85 c0 test %eax,%eax
10b0cc: 74 2d je 10b0fb <rtems_aio_enqueue+0x176>
{
pthread_mutex_lock (&r_chain->mutex);
10b0ce: 8d 78 1c lea 0x1c(%eax),%edi
10b0d1: 83 ec 0c sub $0xc,%esp
10b0d4: 57 push %edi
10b0d5: e8 86 07 00 00 call 10b860 <pthread_mutex_lock>
rtems_aio_insert_prio (&r_chain->perfd, req);
10b0da: 58 pop %eax
10b0db: 5a pop %edx
10b0dc: 53 push %ebx
10b0dd: 8d 46 08 lea 0x8(%esi),%eax
10b0e0: 50 push %eax
10b0e1: e8 b6 fd ff ff call 10ae9c <rtems_aio_insert_prio>
pthread_cond_signal (&r_chain->cond);
10b0e6: 83 c6 20 add $0x20,%esi
10b0e9: 89 34 24 mov %esi,(%esp)
10b0ec: e8 ab 03 00 00 call 10b49c <pthread_cond_signal>
pthread_mutex_unlock (&r_chain->mutex);
10b0f1: 89 3c 24 mov %edi,(%esp)
10b0f4: e8 e7 07 00 00 call 10b8e0 <pthread_mutex_unlock>
10b0f9: eb 6e jmp 10b169 <rtems_aio_enqueue+0x1e4>
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
10b0fb: 56 push %esi
10b0fc: 6a 01 push $0x1
10b0fe: 8b 43 14 mov 0x14(%ebx),%eax
10b101: ff 30 pushl (%eax)
10b103: 68 2c 73 12 00 push $0x12732c
10b108: e8 8f fa ff ff call 10ab9c <rtems_aio_search_fd>
10b10d: 89 c6 mov %eax,%esi
if (r_chain->new_fd == 1) {
10b10f: 83 c4 10 add $0x10,%esp
10b112: 83 78 18 01 cmpl $0x1,0x18(%eax)
10b116: 8d 40 08 lea 0x8(%eax),%eax
10b119: 75 2c jne 10b147 <rtems_aio_enqueue+0x1c2>
10b11b: 51 push %ecx
10b11c: 51 push %ecx
10b11d: 53 push %ebx
10b11e: 50 push %eax
10b11f: e8 d8 1e 00 00 call 10cffc <_Chain_Insert>
/* 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;
10b124: c7 46 18 00 00 00 00 movl $0x0,0x18(%esi)
pthread_mutex_init (&r_chain->mutex, NULL);
10b12b: 58 pop %eax
10b12c: 5a pop %edx
10b12d: 6a 00 push $0x0
10b12f: 8d 46 1c lea 0x1c(%esi),%eax
10b132: 50 push %eax
10b133: e8 08 06 00 00 call 10b740 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
10b138: 5b pop %ebx
10b139: 5f pop %edi
10b13a: 6a 00 push $0x0
10b13c: 83 c6 20 add $0x20,%esi
10b13f: 56 push %esi
10b140: e8 bb 02 00 00 call 10b400 <pthread_cond_init>
10b145: eb 09 jmp 10b150 <rtems_aio_enqueue+0x1cb>
} else
/* just insert the request in the existing fd chain */
rtems_aio_insert_prio (&r_chain->perfd, req);
10b147: 51 push %ecx
10b148: 51 push %ecx
10b149: 53 push %ebx
10b14a: 50 push %eax
10b14b: e8 4c fd ff ff call 10ae9c <rtems_aio_insert_prio>
10b150: 83 c4 10 add $0x10,%esp
if (aio_request_queue.idle_threads > 0)
10b153: 83 3d 40 73 12 00 00 cmpl $0x0,0x127340
10b15a: 7e 10 jle 10b16c <rtems_aio_enqueue+0x1e7><== ALWAYS TAKEN
pthread_cond_signal (&aio_request_queue.new_req);
10b15c: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10b15f: 68 dc 72 12 00 push $0x1272dc <== NOT EXECUTED
10b164: e8 33 03 00 00 call 10b49c <pthread_cond_signal> <== NOT EXECUTED
10b169: 83 c4 10 add $0x10,%esp
}
}
pthread_mutex_unlock (&aio_request_queue.mutex);
10b16c: 83 ec 0c sub $0xc,%esp
10b16f: 68 d8 72 12 00 push $0x1272d8
10b174: e8 67 07 00 00 call 10b8e0 <pthread_mutex_unlock>
return 0;
10b179: 83 c4 10 add $0x10,%esp
}
10b17c: 8b 45 b4 mov -0x4c(%ebp),%eax
10b17f: 8d 65 f4 lea -0xc(%ebp),%esp
10b182: 5b pop %ebx
10b183: 5e pop %esi
10b184: 5f pop %edi
10b185: c9 leave
10b186: c3 ret
0010ac78 <rtems_aio_handle>:
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
10ac78: 55 push %ebp
10ac79: 89 e5 mov %esp,%ebp
10ac7b: 57 push %edi
10ac7c: 56 push %esi
10ac7d: 53 push %ebx
10ac7e: 83 ec 4c sub $0x4c,%esp
rtems_aio_request_chain *r_chain = arg;
10ac81: 8b 5d 08 mov 0x8(%ebp),%ebx
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
10ac84: 8d 7d dc lea -0x24(%ebp),%edi
/* 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);
10ac87: 8d 43 1c lea 0x1c(%ebx),%eax
10ac8a: 89 45 b4 mov %eax,-0x4c(%ebp)
10ac8d: 83 ec 0c sub $0xc,%esp
10ac90: 50 push %eax
10ac91: e8 ca 0b 00 00 call 10b860 <pthread_mutex_lock>
if (result != 0)
10ac96: 83 c4 10 add $0x10,%esp
10ac99: 85 c0 test %eax,%eax
10ac9b: 0f 85 f1 01 00 00 jne 10ae92 <rtems_aio_handle+0x21a><== NEVER TAKEN
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10aca1: 8b 73 08 mov 0x8(%ebx),%esi
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10aca4: 8d 43 0c lea 0xc(%ebx),%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)) {
10aca7: 39 c6 cmp %eax,%esi
10aca9: 0f 84 cd 00 00 00 je 10ad7c <rtems_aio_handle+0x104>
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);
10acaf: e8 a8 13 00 00 call 10c05c <pthread_self>
10acb4: 52 push %edx
10acb5: 8d 55 c0 lea -0x40(%ebp),%edx
10acb8: 52 push %edx
10acb9: 8d 4d e4 lea -0x1c(%ebp),%ecx
10acbc: 51 push %ecx
10acbd: 50 push %eax
10acbe: e8 a1 0f 00 00 call 10bc64 <pthread_getschedparam>
param.sched_priority = req->priority;
10acc3: 8b 46 0c mov 0xc(%esi),%eax
10acc6: 89 45 c0 mov %eax,-0x40(%ebp)
pthread_setschedparam (pthread_self(), req->policy, ¶m);
10acc9: 8b 56 08 mov 0x8(%esi),%edx
10accc: 89 55 b0 mov %edx,-0x50(%ebp)
10accf: e8 88 13 00 00 call 10c05c <pthread_self>
10acd4: 83 c4 0c add $0xc,%esp
10acd7: 8d 4d c0 lea -0x40(%ebp),%ecx
10acda: 51 push %ecx
10acdb: 8b 55 b0 mov -0x50(%ebp),%edx
10acde: 52 push %edx
10acdf: 50 push %eax
10ace0: e8 87 13 00 00 call 10c06c <pthread_setschedparam>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
10ace5: 89 34 24 mov %esi,(%esp)
10ace8: e8 d3 22 00 00 call 10cfc0 <_Chain_Extract>
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
10aced: 59 pop %ecx
10acee: ff 75 b4 pushl -0x4c(%ebp)
10acf1: e8 ea 0b 00 00 call 10b8e0 <pthread_mutex_unlock>
switch (req->aiocbp->aio_lio_opcode) {
10acf6: 8b 46 14 mov 0x14(%esi),%eax
10acf9: 83 c4 10 add $0x10,%esp
10acfc: 8b 50 2c mov 0x2c(%eax),%edx
10acff: 83 fa 02 cmp $0x2,%edx
10ad02: 74 20 je 10ad24 <rtems_aio_handle+0xac>
10ad04: 83 fa 03 cmp $0x3,%edx
10ad07: 74 36 je 10ad3f <rtems_aio_handle+0xc7> <== NEVER TAKEN
10ad09: 4a dec %edx
10ad0a: 75 45 jne 10ad51 <rtems_aio_handle+0xd9> <== NEVER TAKEN
case LIO_READ:
AIO_printf ("read\n");
result = pread (req->aiocbp->aio_fildes,
10ad0c: 83 ec 0c sub $0xc,%esp
10ad0f: ff 70 08 pushl 0x8(%eax)
10ad12: ff 70 04 pushl 0x4(%eax)
10ad15: ff 70 10 pushl 0x10(%eax)
10ad18: ff 70 0c pushl 0xc(%eax)
10ad1b: ff 30 pushl (%eax)
10ad1d: e8 fe 93 00 00 call 114120 <pread>
10ad22: eb 16 jmp 10ad3a <rtems_aio_handle+0xc2>
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_WRITE:
AIO_printf ("write\n");
result = pwrite (req->aiocbp->aio_fildes,
10ad24: 83 ec 0c sub $0xc,%esp
10ad27: ff 70 08 pushl 0x8(%eax)
10ad2a: ff 70 04 pushl 0x4(%eax)
10ad2d: ff 70 10 pushl 0x10(%eax)
10ad30: ff 70 0c pushl 0xc(%eax)
10ad33: ff 30 pushl (%eax)
10ad35: e8 9a 94 00 00 call 1141d4 <pwrite>
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
10ad3a: 83 c4 20 add $0x20,%esp
10ad3d: eb 0d jmp 10ad4c <rtems_aio_handle+0xd4>
case LIO_SYNC:
AIO_printf ("sync\n");
result = fsync (req->aiocbp->aio_fildes);
10ad3f: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10ad42: ff 30 pushl (%eax) <== NOT EXECUTED
10ad44: e8 33 5d 00 00 call 110a7c <fsync> <== NOT EXECUTED
break;
10ad49: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
default:
result = -1;
}
if (result == -1) {
10ad4c: 83 f8 ff cmp $0xffffffff,%eax
10ad4f: 75 19 jne 10ad6a <rtems_aio_handle+0xf2> <== ALWAYS TAKEN
req->aiocbp->return_value = -1;
10ad51: 8b 76 14 mov 0x14(%esi),%esi <== NOT EXECUTED
10ad54: c7 46 34 ff ff ff ff movl $0xffffffff,0x34(%esi) <== NOT EXECUTED
req->aiocbp->error_code = errno;
10ad5b: e8 88 89 00 00 call 1136e8 <__errno> <== NOT EXECUTED
10ad60: 8b 00 mov (%eax),%eax <== NOT EXECUTED
10ad62: 89 46 30 mov %eax,0x30(%esi) <== NOT EXECUTED
10ad65: e9 1d ff ff ff jmp 10ac87 <rtems_aio_handle+0xf> <== NOT EXECUTED
} else {
req->aiocbp->return_value = result;
10ad6a: 8b 56 14 mov 0x14(%esi),%edx
10ad6d: 89 42 34 mov %eax,0x34(%edx)
req->aiocbp->error_code = 0;
10ad70: c7 42 30 00 00 00 00 movl $0x0,0x30(%edx)
10ad77: e9 0b ff ff ff jmp 10ac87 <rtems_aio_handle+0xf>
struct timespec timeout;
AIO_printf ("Chain is empty [WQ], wait for work\n");
pthread_mutex_unlock (&r_chain->mutex);
10ad7c: 83 ec 0c sub $0xc,%esp
10ad7f: ff 75 b4 pushl -0x4c(%ebp)
10ad82: e8 59 0b 00 00 call 10b8e0 <pthread_mutex_unlock>
pthread_mutex_lock (&aio_request_queue.mutex);
10ad87: c7 04 24 d8 72 12 00 movl $0x1272d8,(%esp)
10ad8e: e8 cd 0a 00 00 call 10b860 <pthread_mutex_lock>
if (rtems_chain_is_empty (chain))
10ad93: 83 c4 10 add $0x10,%esp
10ad96: 39 73 08 cmp %esi,0x8(%ebx)
10ad99: 0f 85 de 00 00 00 jne 10ae7d <rtems_aio_handle+0x205><== NEVER TAKEN
{
clock_gettime (CLOCK_REALTIME, &timeout);
10ad9f: 52 push %edx
10ada0: 52 push %edx
10ada1: 57 push %edi
10ada2: 6a 01 push $0x1
10ada4: e8 47 05 00 00 call 10b2f0 <clock_gettime>
timeout.tv_sec += 3;
10ada9: 83 45 dc 03 addl $0x3,-0x24(%ebp)
timeout.tv_nsec = 0;
10adad: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
result = pthread_cond_timedwait (&r_chain->cond,
10adb4: 8d 73 20 lea 0x20(%ebx),%esi
10adb7: 83 c4 0c add $0xc,%esp
10adba: 57 push %edi
10adbb: 68 d8 72 12 00 push $0x1272d8
10adc0: 56 push %esi
10adc1: e8 46 07 00 00 call 10b50c <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) {
10adc6: 83 c4 10 add $0x10,%esp
10adc9: 83 f8 74 cmp $0x74,%eax
10adcc: 0f 85 ab 00 00 00 jne 10ae7d <rtems_aio_handle+0x205><== NEVER TAKEN
10add2: 83 ec 0c sub $0xc,%esp
10add5: 53 push %ebx
10add6: e8 e5 21 00 00 call 10cfc0 <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
pthread_mutex_destroy (&r_chain->mutex);
10addb: 58 pop %eax
10addc: ff 75 b4 pushl -0x4c(%ebp)
10addf: e8 5c 08 00 00 call 10b640 <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->cond);
10ade4: 89 34 24 mov %esi,(%esp)
10ade7: e8 60 05 00 00 call 10b34c <pthread_cond_destroy>
free (r_chain);
10adec: 89 1c 24 mov %ebx,(%esp)
10adef: e8 7c cf ff ff call 107d70 <free>
/* 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)) {
10adf4: 83 c4 10 add $0x10,%esp
10adf7: 81 3d 2c 73 12 00 30 cmpl $0x127330,0x12732c
10adfe: 73 12 00
10ae01: 75 54 jne 10ae57 <rtems_aio_handle+0x1df>
AIO_printf ("Chain is empty [IQ], wait for work\n");
++aio_request_queue.idle_threads;
10ae03: ff 05 40 73 12 00 incl 0x127340
--aio_request_queue.active_threads;
10ae09: ff 0d 3c 73 12 00 decl 0x12733c
clock_gettime (CLOCK_REALTIME, &timeout);
10ae0f: 53 push %ebx
10ae10: 53 push %ebx
10ae11: 57 push %edi
10ae12: 6a 01 push $0x1
10ae14: e8 d7 04 00 00 call 10b2f0 <clock_gettime>
timeout.tv_sec += 3;
10ae19: 83 45 dc 03 addl $0x3,-0x24(%ebp)
timeout.tv_nsec = 0;
10ae1d: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
result = pthread_cond_timedwait (&aio_request_queue.new_req,
10ae24: 83 c4 0c add $0xc,%esp
10ae27: 57 push %edi
10ae28: 68 d8 72 12 00 push $0x1272d8
10ae2d: 68 dc 72 12 00 push $0x1272dc
10ae32: e8 d5 06 00 00 call 10b50c <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) {
10ae37: 83 c4 10 add $0x10,%esp
10ae3a: 83 f8 74 cmp $0x74,%eax
10ae3d: 75 18 jne 10ae57 <rtems_aio_handle+0x1df><== NEVER TAKEN
AIO_printf ("Etimeout\n");
--aio_request_queue.idle_threads;
10ae3f: ff 0d 40 73 12 00 decl 0x127340
pthread_mutex_unlock (&aio_request_queue.mutex);
10ae45: 83 ec 0c sub $0xc,%esp
10ae48: 68 d8 72 12 00 push $0x1272d8
10ae4d: e8 8e 0a 00 00 call 10b8e0 <pthread_mutex_unlock>
return NULL;
10ae52: 83 c4 10 add $0x10,%esp
10ae55: eb 3b jmp 10ae92 <rtems_aio_handle+0x21a>
}
}
/* 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;
10ae57: ff 0d 40 73 12 00 decl 0x127340
++aio_request_queue.active_threads;
10ae5d: ff 05 3c 73 12 00 incl 0x12733c
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10ae63: 8b 1d 2c 73 12 00 mov 0x12732c,%ebx
10ae69: 83 ec 0c sub $0xc,%esp
10ae6c: 53 push %ebx
10ae6d: e8 4e 21 00 00 call 10cfc0 <_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);
10ae72: 89 1c 24 mov %ebx,(%esp)
10ae75: e8 cd fd ff ff call 10ac47 <rtems_aio_move_to_work>
10ae7a: 83 c4 10 add $0x10,%esp
}
}
/* 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);
10ae7d: 83 ec 0c sub $0xc,%esp
10ae80: 68 d8 72 12 00 push $0x1272d8
10ae85: e8 56 0a 00 00 call 10b8e0 <pthread_mutex_unlock>
10ae8a: 83 c4 10 add $0x10,%esp
10ae8d: e9 f5 fd ff ff jmp 10ac87 <rtems_aio_handle+0xf>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10ae92: 31 c0 xor %eax,%eax
10ae94: 8d 65 f4 lea -0xc(%ebp),%esp
10ae97: 5b pop %ebx
10ae98: 5e pop %esi
10ae99: 5f pop %edi
10ae9a: c9 leave
10ae9b: c3 ret
0010aaa0 <rtems_aio_init>:
* 0 - if initialization succeeded
*/
int
rtems_aio_init (void)
{
10aaa0: 55 push %ebp
10aaa1: 89 e5 mov %esp,%ebp
10aaa3: 53 push %ebx
10aaa4: 83 ec 10 sub $0x10,%esp
int result = 0;
result = pthread_attr_init (&aio_request_queue.attr);
10aaa7: 68 e0 72 12 00 push $0x1272e0
10aaac: e8 33 0f 00 00 call 10b9e4 <pthread_attr_init>
10aab1: 89 c3 mov %eax,%ebx
if (result != 0)
10aab3: 83 c4 10 add $0x10,%esp
10aab6: 85 c0 test %eax,%eax
10aab8: 0f 85 d7 00 00 00 jne 10ab95 <rtems_aio_init+0xf5> <== NEVER TAKEN
return result;
result =
10aabe: 51 push %ecx
10aabf: 51 push %ecx
10aac0: 6a 00 push $0x0
10aac2: 68 e0 72 12 00 push $0x1272e0
10aac7: e8 40 0f 00 00 call 10ba0c <pthread_attr_setdetachstate>
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
10aacc: 83 c4 10 add $0x10,%esp
10aacf: 85 c0 test %eax,%eax
10aad1: 74 10 je 10aae3 <rtems_aio_init+0x43> <== ALWAYS TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
10aad3: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10aad6: 68 e0 72 12 00 push $0x1272e0 <== NOT EXECUTED
10aadb: e8 e4 0e 00 00 call 10b9c4 <pthread_attr_destroy> <== NOT EXECUTED
10aae0: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
10aae3: 52 push %edx
10aae4: 52 push %edx
10aae5: 6a 00 push $0x0
10aae7: 68 d8 72 12 00 push $0x1272d8
10aaec: e8 4f 0c 00 00 call 10b740 <pthread_mutex_init>
if (result != 0)
10aaf1: 83 c4 10 add $0x10,%esp
10aaf4: 85 c0 test %eax,%eax
10aaf6: 74 10 je 10ab08 <rtems_aio_init+0x68> <== ALWAYS TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
10aaf8: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10aafb: 68 e0 72 12 00 push $0x1272e0 <== NOT EXECUTED
10ab00: e8 bf 0e 00 00 call 10b9c4 <pthread_attr_destroy> <== NOT EXECUTED
10ab05: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
10ab08: 50 push %eax
10ab09: 50 push %eax
10ab0a: 6a 00 push $0x0
10ab0c: 68 dc 72 12 00 push $0x1272dc
10ab11: e8 ea 08 00 00 call 10b400 <pthread_cond_init>
10ab16: 89 c3 mov %eax,%ebx
if (result != 0) {
10ab18: 83 c4 10 add $0x10,%esp
10ab1b: 85 c0 test %eax,%eax
10ab1d: 74 1c je 10ab3b <rtems_aio_init+0x9b> <== ALWAYS TAKEN
pthread_mutex_destroy (&aio_request_queue.mutex);
10ab1f: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10ab22: 68 d8 72 12 00 push $0x1272d8 <== NOT EXECUTED
10ab27: e8 14 0b 00 00 call 10b640 <pthread_mutex_destroy> <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
10ab2c: c7 04 24 e0 72 12 00 movl $0x1272e0,(%esp) <== NOT EXECUTED
10ab33: e8 8c 0e 00 00 call 10b9c4 <pthread_attr_destroy> <== NOT EXECUTED
10ab38: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10ab3b: c7 05 20 73 12 00 24 movl $0x127324,0x127320
10ab42: 73 12 00
head->previous = NULL;
10ab45: c7 05 24 73 12 00 00 movl $0x0,0x127324
10ab4c: 00 00 00
tail->previous = head;
10ab4f: c7 05 28 73 12 00 20 movl $0x127320,0x127328
10ab56: 73 12 00
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10ab59: c7 05 2c 73 12 00 30 movl $0x127330,0x12732c
10ab60: 73 12 00
head->previous = NULL;
10ab63: c7 05 30 73 12 00 00 movl $0x0,0x127330
10ab6a: 00 00 00
tail->previous = head;
10ab6d: c7 05 34 73 12 00 2c movl $0x12732c,0x127334
10ab74: 73 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;
10ab77: c7 05 3c 73 12 00 00 movl $0x0,0x12733c
10ab7e: 00 00 00
aio_request_queue.idle_threads = 0;
10ab81: c7 05 40 73 12 00 00 movl $0x0,0x127340
10ab88: 00 00 00
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
10ab8b: c7 05 38 73 12 00 0b movl $0xb00b,0x127338
10ab92: b0 00 00
return result;
}
10ab95: 89 d8 mov %ebx,%eax
10ab97: 8b 5d fc mov -0x4(%ebp),%ebx
10ab9a: c9 leave
10ab9b: c3 ret
0010ae9c <rtems_aio_insert_prio>:
* NONE
*/
void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
10ae9c: 55 push %ebp
10ae9d: 89 e5 mov %esp,%ebp
10ae9f: 56 push %esi
10aea0: 53 push %ebx
10aea1: 8b 4d 08 mov 0x8(%ebp),%ecx
10aea4: 8b 55 0c mov 0xc(%ebp),%edx
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10aea7: 8b 01 mov (%ecx),%eax
10aea9: 8d 59 04 lea 0x4(%ecx),%ebx
rtems_chain_node *node;
AIO_printf ("FD exists \n");
node = rtems_chain_first (chain);
if (rtems_chain_is_empty (chain)) {
10aeac: 39 d8 cmp %ebx,%eax
10aeae: 74 27 je 10aed7 <rtems_aio_insert_prio+0x3b><== NEVER TAKEN
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;
10aeb0: 8b 48 14 mov 0x14(%eax),%ecx
10aeb3: 8b 49 14 mov 0x14(%ecx),%ecx
while (req->aiocbp->aio_reqprio > prio &&
10aeb6: 8b 72 14 mov 0x14(%edx),%esi
10aeb9: 8b 76 14 mov 0x14(%esi),%esi
10aebc: eb 08 jmp 10aec6 <rtems_aio_insert_prio+0x2a>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10aebe: 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;
10aec0: 8b 48 14 mov 0x14(%eax),%ecx <== NOT EXECUTED
10aec3: 8b 49 14 mov 0x14(%ecx),%ecx <== 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 &&
10aec6: 39 ce cmp %ecx,%esi
10aec8: 7e 04 jle 10aece <rtems_aio_insert_prio+0x32><== ALWAYS TAKEN
10aeca: 39 d8 cmp %ebx,%eax <== NOT EXECUTED
10aecc: 75 f0 jne 10aebe <rtems_aio_insert_prio+0x22><== 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 );
10aece: 89 55 0c mov %edx,0xc(%ebp)
10aed1: 8b 40 04 mov 0x4(%eax),%eax
10aed4: 89 45 08 mov %eax,0x8(%ebp)
}
rtems_chain_insert (node->previous, &req->next_prio);
}
}
10aed7: 5b pop %ebx
10aed8: 5e pop %esi
10aed9: c9 leave
10aeda: e9 1d 21 00 00 jmp 10cffc <_Chain_Insert>
0010ac47 <rtems_aio_move_to_work>:
* NONE
*/
void
rtems_aio_move_to_work (rtems_aio_request_chain *r_chain)
{
10ac47: 55 push %ebp
10ac48: 89 e5 mov %esp,%ebp
10ac4a: 83 ec 08 sub $0x8,%esp
10ac4d: 8b 55 08 mov 0x8(%ebp),%edx
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10ac50: a1 20 73 12 00 mov 0x127320,%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 &&
10ac55: 8b 4a 14 mov 0x14(%edx),%ecx
10ac58: eb 02 jmp 10ac5c <rtems_aio_move_to_work+0x15>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10ac5a: 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 &&
10ac5c: 39 48 14 cmp %ecx,0x14(%eax)
10ac5f: 7d 07 jge 10ac68 <rtems_aio_move_to_work+0x21>
10ac61: 3d 24 73 12 00 cmp $0x127324,%eax
10ac66: 75 f2 jne 10ac5a <rtems_aio_move_to_work+0x13><== ALWAYS TAKEN
10ac68: 51 push %ecx
10ac69: 51 push %ecx
10ac6a: 52 push %edx
10ac6b: ff 70 04 pushl 0x4(%eax)
10ac6e: e8 89 23 00 00 call 10cffc <_Chain_Insert>
10ac73: 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);
}
10ac76: c9 leave
10ac77: c3 ret
0010af28 <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)
{
10af28: 55 push %ebp
10af29: 89 e5 mov %esp,%ebp
10af2b: 53 push %ebx
10af2c: 83 ec 04 sub $0x4,%esp
10af2f: 8b 55 08 mov 0x8(%ebp),%edx
10af32: 8b 4d 0c mov 0xc(%ebp),%ecx
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10af35: 8b 1a mov (%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 );
10af37: 83 c2 04 add $0x4,%edx
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
if (rtems_chain_is_empty (chain))
return AIO_ALLDONE;
10af3a: b8 02 00 00 00 mov $0x2,%eax
* AIO_CANCELED - if request was canceled
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
if (rtems_chain_is_empty (chain))
10af3f: 39 d3 cmp %edx,%ebx
10af41: 75 08 jne 10af4b <rtems_aio_remove_req+0x23>
10af43: eb 3b jmp 10af80 <rtems_aio_remove_req+0x58>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10af45: 8b 18 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) {
10af47: 39 d3 cmp %edx,%ebx <== NOT EXECUTED
10af49: 74 30 je 10af7b <rtems_aio_remove_req+0x53><== NOT EXECUTED
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
10af4b: 89 d8 mov %ebx,%eax
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) {
10af4d: 39 4b 14 cmp %ecx,0x14(%ebx)
10af50: 75 f3 jne 10af45 <rtems_aio_remove_req+0x1d><== NEVER TAKEN
10af52: 83 ec 0c sub $0xc,%esp
10af55: 53 push %ebx
10af56: e8 65 20 00 00 call 10cfc0 <_Chain_Extract>
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
else
{
rtems_chain_extract (node);
current->aiocbp->error_code = ECANCELED;
10af5b: 8b 43 14 mov 0x14(%ebx),%eax
10af5e: c7 40 30 8c 00 00 00 movl $0x8c,0x30(%eax)
current->aiocbp->return_value = -1;
10af65: c7 40 34 ff ff ff ff movl $0xffffffff,0x34(%eax)
free (current);
10af6c: 89 1c 24 mov %ebx,(%esp)
10af6f: e8 fc cd ff ff call 107d70 <free>
}
return AIO_CANCELED;
10af74: 83 c4 10 add $0x10,%esp
10af77: 31 c0 xor %eax,%eax
10af79: eb 05 jmp 10af80 <rtems_aio_remove_req+0x58>
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
}
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
10af7b: b8 01 00 00 00 mov $0x1,%eax <== NOT EXECUTED
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
}
10af80: 8b 5d fc mov -0x4(%ebp),%ebx
10af83: c9 leave
10af84: c3 ret
0010acc8 <rtems_chain_get_with_wait>:
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
10acc8: 55 push %ebp
10acc9: 89 e5 mov %esp,%ebp
10accb: 57 push %edi
10accc: 56 push %esi
10accd: 53 push %ebx
10acce: 83 ec 1c sub $0x1c,%esp
10acd1: 8b 7d 0c mov 0xc(%ebp),%edi
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
) {
rtems_event_set out;
sc = rtems_event_receive(
10acd4: 8d 75 e4 lea -0x1c(%ebp),%esi
10acd7: eb 13 jmp 10acec <rtems_chain_get_with_wait+0x24>
10acd9: 56 push %esi
10acda: ff 75 10 pushl 0x10(%ebp)
10acdd: 6a 00 push $0x0
10acdf: 57 push %edi
10ace0: e8 0f f5 ff ff call 10a1f4 <rtems_event_receive>
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
10ace5: 83 c4 10 add $0x10,%esp
10ace8: 85 c0 test %eax,%eax
10acea: 75 16 jne 10ad02 <rtems_chain_get_with_wait+0x3a><== ALWAYS TAKEN
*/
RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get(
rtems_chain_control *the_chain
)
{
return _Chain_Get( the_chain );
10acec: 83 ec 0c sub $0xc,%esp
10acef: ff 75 08 pushl 0x8(%ebp)
10acf2: e8 a5 04 00 00 call 10b19c <_Chain_Get>
10acf7: 89 c3 mov %eax,%ebx
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
10acf9: 83 c4 10 add $0x10,%esp
10acfc: 85 c0 test %eax,%eax
10acfe: 74 d9 je 10acd9 <rtems_chain_get_with_wait+0x11>
10ad00: 31 c0 xor %eax,%eax
timeout,
&out
);
}
*node_ptr = node;
10ad02: 8b 55 14 mov 0x14(%ebp),%edx
10ad05: 89 1a mov %ebx,(%edx)
return sc;
}
10ad07: 8d 65 f4 lea -0xc(%ebp),%esp
10ad0a: 5b pop %ebx
10ad0b: 5e pop %esi
10ad0c: 5f pop %edi
10ad0d: c9 leave
10ad0e: c3 ret
001076c8 <rtems_cpu_usage_report_with_plugin>:
void rtems_cpu_usage_report_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
1076c8: 55 push %ebp
1076c9: 89 e5 mov %esp,%ebp
1076cb: 57 push %edi
1076cc: 56 push %esi
1076cd: 53 push %ebx
1076ce: 83 ec 6c sub $0x6c,%esp
Timestamp_Control uptime, total, ran, uptime_at_last_reset;
#else
uint32_t total_units = 0;
#endif
if ( !print )
1076d1: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)
1076d5: 0f 84 74 01 00 00 je 10784f <rtems_cpu_usage_report_with_plugin+0x187><== 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__
uptime_at_last_reset = CPU_usage_Uptime_at_last_reset;
1076db: a1 60 96 12 00 mov 0x129660,%eax
1076e0: 8b 15 64 96 12 00 mov 0x129664,%edx
1076e6: 89 45 c0 mov %eax,-0x40(%ebp)
1076e9: 89 55 c4 mov %edx,-0x3c(%ebp)
}
}
}
#endif
(*print)(
1076ec: 53 push %ebx
1076ed: 53 push %ebx
1076ee: 68 a1 14 12 00 push $0x1214a1
1076f3: ff 75 08 pushl 0x8(%ebp)
1076f6: ff 55 0c call *0xc(%ebp)
1076f9: 83 c4 10 add $0x10,%esp
" ID | NAME | TICKS | PERCENT\n"
#endif
"------------+----------------------------------------+---------------+---------\n"
);
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
1076fc: bf 01 00 00 00 mov $0x1,%edi
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
107701: 8b 04 bd 9c 90 12 00 mov 0x12909c(,%edi,4),%eax
107708: 8b 70 04 mov 0x4(%eax),%esi
if ( information ) {
10770b: 85 f6 test %esi,%esi
10770d: 0f 84 14 01 00 00 je 107827 <rtems_cpu_usage_report_with_plugin+0x15f><== NEVER TAKEN
107713: c7 45 94 01 00 00 00 movl $0x1,-0x6c(%ebp)
10771a: e9 fb 00 00 00 jmp 10781a <rtems_cpu_usage_report_with_plugin+0x152>
for ( i=1 ; i <= information->maximum ; i++ ) {
the_thread = (Thread_Control *)information->local_table[ i ];
10771f: 8b 46 1c mov 0x1c(%esi),%eax
107722: 8b 4d 94 mov -0x6c(%ebp),%ecx
107725: 8b 14 88 mov (%eax,%ecx,4),%edx
if ( !the_thread )
107728: 85 d2 test %edx,%edx
10772a: 0f 84 e7 00 00 00 je 107817 <rtems_cpu_usage_report_with_plugin+0x14f><== NEVER TAKEN
continue;
rtems_object_get_name( the_thread->Object.id, sizeof(name), name );
107730: 51 push %ecx
107731: 8d 5d a3 lea -0x5d(%ebp),%ebx
107734: 53 push %ebx
107735: 6a 0d push $0xd
107737: ff 72 08 pushl 0x8(%edx)
10773a: 89 55 90 mov %edx,-0x70(%ebp)
10773d: e8 fa 39 00 00 call 10b13c <rtems_object_get_name>
(*print)(
107742: 53 push %ebx
107743: 8b 55 90 mov -0x70(%ebp),%edx
107746: ff 72 08 pushl 0x8(%edx)
107749: 68 13 16 12 00 push $0x121613
10774e: ff 75 08 pushl 0x8(%ebp)
107751: 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;
107754: 8b 55 90 mov -0x70(%ebp),%edx
107757: 8b 8a 84 00 00 00 mov 0x84(%edx),%ecx
10775d: 8b 9a 88 00 00 00 mov 0x88(%edx),%ebx
107763: 89 4d c8 mov %ecx,-0x38(%ebp)
107766: 89 5d cc mov %ebx,-0x34(%ebp)
if ( _Thread_Executing->Object.id == the_thread->Object.id ) {
107769: 83 c4 20 add $0x20,%esp
10776c: a1 2c 96 12 00 mov 0x12962c,%eax
107771: 8b 5a 08 mov 0x8(%edx),%ebx
107774: 39 58 08 cmp %ebx,0x8(%eax)
107777: 75 45 jne 1077be <rtems_cpu_usage_report_with_plugin+0xf6>
Timestamp_Control used;
Timestamp_Control last = _Thread_Time_of_last_context_switch;
107779: a1 74 91 12 00 mov 0x129174,%eax
10777e: 8b 15 78 91 12 00 mov 0x129178,%edx
107784: 89 45 b0 mov %eax,-0x50(%ebp)
107787: 89 55 b4 mov %edx,-0x4c(%ebp)
_TOD_Get_uptime( &uptime );
10778a: 83 ec 0c sub $0xc,%esp
10778d: 8d 45 d8 lea -0x28(%ebp),%eax
107790: 50 push %eax
107791: e8 1a 4b 00 00 call 10c2b0 <_TOD_Get_uptime>
_Timestamp_Subtract( &last, &uptime, &used );
107796: 83 c4 0c add $0xc,%esp
107799: 8d 45 b8 lea -0x48(%ebp),%eax
10779c: 50 push %eax
10779d: 8d 55 d8 lea -0x28(%ebp),%edx
1077a0: 52 push %edx
1077a1: 8d 55 b0 lea -0x50(%ebp),%edx
1077a4: 52 push %edx
1077a5: 89 45 90 mov %eax,-0x70(%ebp)
1077a8: e8 f7 6a 00 00 call 10e2a4 <_Timespec_Subtract>
_Timestamp_Add_to( &ran, &used );
1077ad: 58 pop %eax
1077ae: 5a pop %edx
1077af: 8b 45 90 mov -0x70(%ebp),%eax
1077b2: 50 push %eax
1077b3: 8d 45 c8 lea -0x38(%ebp),%eax
1077b6: 50 push %eax
1077b7: e8 fc 69 00 00 call 10e1b8 <_Timespec_Add_to>
1077bc: eb 0c jmp 1077ca <rtems_cpu_usage_report_with_plugin+0x102>
} else {
_TOD_Get_uptime( &uptime );
1077be: 83 ec 0c sub $0xc,%esp
1077c1: 8d 4d d8 lea -0x28(%ebp),%ecx
1077c4: 51 push %ecx
1077c5: e8 e6 4a 00 00 call 10c2b0 <_TOD_Get_uptime>
1077ca: 83 c4 0c add $0xc,%esp
}
_Timestamp_Subtract( &uptime_at_last_reset, &uptime, &total );
1077cd: 8d 5d d0 lea -0x30(%ebp),%ebx
1077d0: 53 push %ebx
1077d1: 8d 45 d8 lea -0x28(%ebp),%eax
1077d4: 50 push %eax
1077d5: 8d 55 c0 lea -0x40(%ebp),%edx
1077d8: 52 push %edx
1077d9: e8 c6 6a 00 00 call 10e2a4 <_Timespec_Subtract>
_Timestamp_Divide( &ran, &total, &ival, &fval );
1077de: 8d 4d e0 lea -0x20(%ebp),%ecx
1077e1: 51 push %ecx
1077e2: 8d 45 e4 lea -0x1c(%ebp),%eax
1077e5: 50 push %eax
1077e6: 53 push %ebx
1077e7: 8d 45 c8 lea -0x38(%ebp),%eax
1077ea: 50 push %eax
1077eb: e8 f8 69 00 00 call 10e1e8 <_Timespec_Divide>
/*
* Print the information
*/
(*print)( context,
1077f0: 83 c4 18 add $0x18,%esp
1077f3: ff 75 e0 pushl -0x20(%ebp)
1077f6: ff 75 e4 pushl -0x1c(%ebp)
1077f9: 8b 45 cc mov -0x34(%ebp),%eax
1077fc: b9 e8 03 00 00 mov $0x3e8,%ecx
107801: 31 d2 xor %edx,%edx
107803: f7 f1 div %ecx
107805: 50 push %eax
107806: ff 75 c8 pushl -0x38(%ebp)
107809: 68 26 16 12 00 push $0x121626
10780e: ff 75 08 pushl 0x8(%ebp)
107811: ff 55 0c call *0xc(%ebp)
107814: 83 c4 20 add $0x20,%esp
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
if ( information ) {
for ( i=1 ; i <= information->maximum ; i++ ) {
107817: ff 45 94 incl -0x6c(%ebp)
10781a: 0f b7 46 10 movzwl 0x10(%esi),%eax
10781e: 39 45 94 cmp %eax,-0x6c(%ebp)
107821: 0f 86 f8 fe ff ff jbe 10771f <rtems_cpu_usage_report_with_plugin+0x57>
" ID | NAME | TICKS | PERCENT\n"
#endif
"------------+----------------------------------------+---------------+---------\n"
);
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
107827: 47 inc %edi
107828: 83 ff 04 cmp $0x4,%edi
10782b: 0f 85 d0 fe ff ff jne 107701 <rtems_cpu_usage_report_with_plugin+0x39>
}
}
}
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)(
107831: 8b 45 d4 mov -0x2c(%ebp),%eax
107834: b9 e8 03 00 00 mov $0x3e8,%ecx
107839: 31 d2 xor %edx,%edx
10783b: f7 f1 div %ecx
10783d: 50 push %eax
10783e: ff 75 d0 pushl -0x30(%ebp)
107841: 68 3e 16 12 00 push $0x12163e
107846: ff 75 08 pushl 0x8(%ebp)
107849: ff 55 0c call *0xc(%ebp)
10784c: 83 c4 10 add $0x10,%esp
"-------------------------------------------------------------------------------\n",
_Watchdog_Ticks_since_boot - CPU_usage_Ticks_at_last_reset,
total_units
);
#endif
}
10784f: 8d 65 f4 lea -0xc(%ebp),%esp
107852: 5b pop %ebx
107853: 5e pop %esi
107854: 5f pop %edi
107855: c9 leave
107856: c3 ret
001110b8 <rtems_deviceio_errno>:
[RTEMS_IO_ERROR] = EIO,
[RTEMS_PROXY_BLOCKING] = EIO
};
int rtems_deviceio_errno(rtems_status_code sc)
{
1110b8: 55 push %ebp
1110b9: 89 e5 mov %esp,%ebp
1110bb: 53 push %ebx
1110bc: 83 ec 04 sub $0x4,%esp
1110bf: 8b 55 08 mov 0x8(%ebp),%edx
if (sc == RTEMS_SUCCESSFUL) {
return 0;
1110c2: 31 c0 xor %eax,%eax
[RTEMS_PROXY_BLOCKING] = EIO
};
int rtems_deviceio_errno(rtems_status_code sc)
{
if (sc == RTEMS_SUCCESSFUL) {
1110c4: 85 d2 test %edx,%edx
1110c6: 74 1b je 1110e3 <rtems_deviceio_errno+0x2b>
return 0;
} else {
int eno = EINVAL;
1110c8: bb 16 00 00 00 mov $0x16,%ebx
if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) {
1110cd: 83 fa 1c cmp $0x1c,%edx
1110d0: 77 07 ja 1110d9 <rtems_deviceio_errno+0x21><== NEVER TAKEN
eno = status_code_to_errno [sc];
1110d2: 8b 1c 95 54 f7 11 00 mov 0x11f754(,%edx,4),%ebx
}
errno = eno;
1110d9: e8 5a 00 00 00 call 111138 <__errno>
1110de: 89 18 mov %ebx,(%eax)
return -1;
1110e0: 83 c8 ff or $0xffffffff,%eax
}
}
1110e3: 5a pop %edx
1110e4: 5b pop %ebx
1110e5: c9 leave
1110e6: c3 ret
0010e4a7 <rtems_filesystem_get_mount_handler>:
rtems_filesystem_fsmount_me_t
rtems_filesystem_get_mount_handler(
const char *type
)
{
10e4a7: 55 push %ebp
10e4a8: 89 e5 mov %esp,%ebp
10e4aa: 83 ec 18 sub $0x18,%esp
10e4ad: 8b 45 08 mov 0x8(%ebp),%eax
find_arg fa = {
10e4b0: 89 45 f0 mov %eax,-0x10(%ebp)
10e4b3: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp)
.type = type,
.mount_h = NULL
};
if ( type != NULL ) {
10e4ba: 85 c0 test %eax,%eax
10e4bc: 74 13 je 10e4d1 <rtems_filesystem_get_mount_handler+0x2a><== NEVER TAKEN
rtems_filesystem_iterate( find_handler, &fa );
10e4be: 50 push %eax
10e4bf: 50 push %eax
10e4c0: 8d 45 f0 lea -0x10(%ebp),%eax
10e4c3: 50 push %eax
10e4c4: 68 d0 e3 10 00 push $0x10e3d0
10e4c9: e8 62 ff ff ff call 10e430 <rtems_filesystem_iterate>
10e4ce: 83 c4 10 add $0x10,%esp
}
return fa.mount_h;
}
10e4d1: 8b 45 f4 mov -0xc(%ebp),%eax
10e4d4: c9 leave
10e4d5: c3 ret
0010712c <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 )
{
10712c: 55 push %ebp
10712d: 89 e5 mov %esp,%ebp
10712f: 57 push %edi
107130: 56 push %esi
107131: 53 push %ebx
107132: 83 ec 2c sub $0x2c,%esp
/*
* Set the default umask to "022".
*/
rtems_filesystem_umask = 022;
107135: a1 80 30 12 00 mov 0x123080,%eax
10713a: c7 40 2c 12 00 00 00 movl $0x12,0x2c(%eax)
/*
* mount the first filesystem.
*/
if ( rtems_filesystem_mount_table_size == 0 )
107141: 83 3d e0 d7 11 00 00 cmpl $0x0,0x11d7e0
107148: 75 0a jne 107154 <rtems_filesystem_initialize+0x28><== ALWAYS TAKEN
rtems_fatal_error_occurred( 0xABCD0001 );
10714a: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10714d: 68 01 00 cd ab push $0xabcd0001 <== NOT EXECUTED
107152: eb 28 jmp 10717c <rtems_filesystem_initialize+0x50><== NOT EXECUTED
mt = &rtems_filesystem_mount_table[0];
107154: a1 4c 11 12 00 mov 0x12114c,%eax
status = mount( mt->device, mt->mount_point, mt->type, mt->fsoptions, NULL );
107159: 83 ec 0c sub $0xc,%esp
10715c: 6a 00 push $0x0
10715e: ff 70 04 pushl 0x4(%eax)
107161: ff 30 pushl (%eax)
107163: ff 70 0c pushl 0xc(%eax)
107166: ff 70 08 pushl 0x8(%eax)
107169: e8 9b 06 00 00 call 107809 <mount>
if ( status == -1 )
10716e: 83 c4 20 add $0x20,%esp
107171: 40 inc %eax
107172: 75 0d jne 107181 <rtems_filesystem_initialize+0x55><== ALWAYS TAKEN
rtems_fatal_error_occurred( 0xABCD0002 );
107174: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
107177: 68 02 00 cd ab push $0xabcd0002 <== NOT EXECUTED
10717c: e8 07 36 00 00 call 10a788 <rtems_fatal_error_occurred><== NOT EXECUTED
rtems_filesystem_link_counts = 0;
107181: a1 80 30 12 00 mov 0x123080,%eax
107186: 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);
10718c: 83 ec 0c sub $0xc,%esp
10718f: 6a 00 push $0x0
107191: 8d 5d d4 lea -0x2c(%ebp),%ebx
107194: 53 push %ebx
107195: 6a 00 push $0x0
107197: 6a 01 push $0x1
107199: 68 80 ef 11 00 push $0x11ef80
10719e: e8 03 01 00 00 call 1072a6 <rtems_filesystem_evaluate_path>
rtems_filesystem_root = loc;
1071a3: 8b 3d 80 30 12 00 mov 0x123080,%edi
1071a9: 83 c7 18 add $0x18,%edi
1071ac: b9 05 00 00 00 mov $0x5,%ecx
1071b1: 89 de mov %ebx,%esi
1071b3: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* One more clone for the current node */
rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0);
1071b5: 83 c4 14 add $0x14,%esp
1071b8: 6a 00 push $0x0
1071ba: 53 push %ebx
1071bb: 6a 00 push $0x0
1071bd: 6a 01 push $0x1
1071bf: 68 80 ef 11 00 push $0x11ef80
1071c4: e8 dd 00 00 00 call 1072a6 <rtems_filesystem_evaluate_path>
rtems_filesystem_current = loc;
1071c9: 8b 3d 80 30 12 00 mov 0x123080,%edi
1071cf: 83 c7 04 add $0x4,%edi
1071d2: b9 05 00 00 00 mov $0x5,%ecx
1071d7: 89 de mov %ebx,%esi
1071d9: 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);
1071db: 83 c4 18 add $0x18,%esp
1071de: 68 ff 01 00 00 push $0x1ff
1071e3: 68 82 ef 11 00 push $0x11ef82
1071e8: e8 c3 04 00 00 call 1076b0 <mkdir>
if ( status != 0 )
1071ed: 83 c4 10 add $0x10,%esp
1071f0: 85 c0 test %eax,%eax
1071f2: 74 0d je 107201 <rtems_filesystem_initialize+0xd5><== ALWAYS TAKEN
rtems_fatal_error_occurred( 0xABCD0003 );
1071f4: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
1071f7: 68 03 00 cd ab push $0xabcd0003 <== NOT EXECUTED
1071fc: e9 7b ff ff ff jmp 10717c <rtems_filesystem_initialize+0x50><== NOT EXECUTED
* 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.
*/
}
107201: 8d 65 f4 lea -0xc(%ebp),%esp
107204: 5b pop %ebx
107205: 5e pop %esi
107206: 5f pop %edi
107207: c9 leave
107208: c3 ret
0010e430 <rtems_filesystem_iterate>:
bool rtems_filesystem_iterate(
rtems_per_filesystem_routine routine,
void *routine_arg
)
{
10e430: 55 push %ebp
10e431: 89 e5 mov %esp,%ebp
10e433: 57 push %edi
10e434: 56 push %esi
10e435: 53 push %ebx
10e436: 83 ec 1c sub $0x1c,%esp
10e439: 8b 75 08 mov 0x8(%ebp),%esi
10e43c: 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;
10e43f: 31 c0 xor %eax,%eax
bool rtems_filesystem_iterate(
rtems_per_filesystem_routine routine,
void *routine_arg
)
{
const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0];
10e441: bb c0 d7 11 00 mov $0x11d7c0,%ebx
rtems_chain_node *node = NULL;
bool stop = false;
while ( table_entry->type && !stop ) {
10e446: eb 0c jmp 10e454 <rtems_filesystem_iterate+0x24>
stop = (*routine)( table_entry, routine_arg );
10e448: 51 push %ecx
10e449: 51 push %ecx
10e44a: 57 push %edi
10e44b: 53 push %ebx
10e44c: ff d6 call *%esi
++table_entry;
10e44e: 83 c3 08 add $0x8,%ebx
10e451: 83 c4 10 add $0x10,%esp
{
const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0];
rtems_chain_node *node = NULL;
bool stop = false;
while ( table_entry->type && !stop ) {
10e454: 83 3b 00 cmpl $0x0,(%ebx)
10e457: 74 06 je 10e45f <rtems_filesystem_iterate+0x2f>
10e459: 84 c0 test %al,%al
10e45b: 74 eb je 10e448 <rtems_filesystem_iterate+0x18>
10e45d: eb 40 jmp 10e49f <rtems_filesystem_iterate+0x6f>
stop = (*routine)( table_entry, routine_arg );
++table_entry;
}
if ( !stop ) {
10e45f: 84 c0 test %al,%al
10e461: 75 3c jne 10e49f <rtems_filesystem_iterate+0x6f>
rtems_libio_lock();
10e463: 88 45 e4 mov %al,-0x1c(%ebp)
10e466: e8 95 ff ff ff call 10e400 <rtems_libio_lock>
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
}
10e46b: 8b 1d a8 30 12 00 mov 0x1230a8,%ebx
++table_entry;
}
if ( !stop ) {
rtems_libio_lock();
for (
10e471: 8a 55 e4 mov -0x1c(%ebp),%dl
10e474: eb 10 jmp 10e486 <rtems_filesystem_iterate+0x56>
!rtems_chain_is_tail( &filesystem_chain, node ) && !stop;
node = rtems_chain_next( node )
) {
const filesystem_node *fsn = (filesystem_node *) node;
stop = (*routine)( &fsn->entry, routine_arg );
10e476: 52 push %edx
10e477: 52 push %edx
10e478: 57 push %edi
10e479: 8d 43 08 lea 0x8(%ebx),%eax
10e47c: 50 push %eax
10e47d: ff d6 call *%esi
10e47f: 88 c2 mov %al,%dl
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
}
10e481: 8b 1b mov (%ebx),%ebx
if ( !stop ) {
rtems_libio_lock();
for (
node = rtems_chain_first( &filesystem_chain );
!rtems_chain_is_tail( &filesystem_chain, node ) && !stop;
node = rtems_chain_next( node )
10e483: 83 c4 10 add $0x10,%esp
++table_entry;
}
if ( !stop ) {
rtems_libio_lock();
for (
10e486: 81 fb ac 30 12 00 cmp $0x1230ac,%ebx
10e48c: 74 04 je 10e492 <rtems_filesystem_iterate+0x62>
node = rtems_chain_first( &filesystem_chain );
!rtems_chain_is_tail( &filesystem_chain, node ) && !stop;
10e48e: 84 d2 test %dl,%dl
10e490: 74 e4 je 10e476 <rtems_filesystem_iterate+0x46><== ALWAYS TAKEN
) {
const filesystem_node *fsn = (filesystem_node *) node;
stop = (*routine)( &fsn->entry, routine_arg );
}
rtems_libio_unlock();
10e492: 88 55 e4 mov %dl,-0x1c(%ebp)
10e495: e8 80 ff ff ff call 10e41a <rtems_libio_unlock>
10e49a: 8a 55 e4 mov -0x1c(%ebp),%dl
10e49d: 88 d0 mov %dl,%al
}
return stop;
}
10e49f: 8d 65 f4 lea -0xc(%ebp),%esp
10e4a2: 5b pop %ebx
10e4a3: 5e pop %esi
10e4a4: 5f pop %edi
10e4a5: c9 leave
10e4a6: c3 ret
001077c1 <rtems_filesystem_mount_iterate>:
bool rtems_filesystem_mount_iterate(
rtems_per_filesystem_mount_routine routine,
void *routine_arg
)
{
1077c1: 55 push %ebp
1077c2: 89 e5 mov %esp,%ebp
1077c4: 57 push %edi
1077c5: 56 push %esi
1077c6: 53 push %ebx
1077c7: 83 ec 1c sub $0x1c,%esp
1077ca: 8b 7d 08 mov 0x8(%ebp),%edi
1077cd: 8b 75 0c mov 0xc(%ebp),%esi
rtems_chain_node *node = NULL;
bool stop = false;
rtems_libio_lock();
1077d0: e8 bc ff ff ff call 107791 <rtems_libio_lock>
stop = (*routine)( mt_entry, routine_arg );
}
rtems_libio_unlock();
return stop;
}
1077d5: 8b 1d 64 2f 12 00 mov 0x122f64,%ebx
rtems_per_filesystem_mount_routine routine,
void *routine_arg
)
{
rtems_chain_node *node = NULL;
bool stop = false;
1077db: 31 c0 xor %eax,%eax
rtems_libio_lock();
for (
1077dd: eb 0b jmp 1077ea <rtems_filesystem_mount_iterate+0x29>
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 );
1077df: 50 push %eax
1077e0: 50 push %eax
1077e1: 56 push %esi
1077e2: 53 push %ebx
1077e3: ff d7 call *%edi
}
rtems_libio_unlock();
return stop;
}
1077e5: 8b 1b mov (%ebx),%ebx
rtems_libio_lock();
for (
node = rtems_chain_first( &mount_chain );
!rtems_chain_is_tail( &mount_chain, node ) && !stop;
node = rtems_chain_next( node )
1077e7: 83 c4 10 add $0x10,%esp
{
rtems_chain_node *node = NULL;
bool stop = false;
rtems_libio_lock();
for (
1077ea: 81 fb 68 2f 12 00 cmp $0x122f68,%ebx
1077f0: 74 04 je 1077f6 <rtems_filesystem_mount_iterate+0x35>
node = rtems_chain_first( &mount_chain );
!rtems_chain_is_tail( &mount_chain, node ) && !stop;
1077f2: 84 c0 test %al,%al
1077f4: 74 e9 je 1077df <rtems_filesystem_mount_iterate+0x1e><== ALWAYS TAKEN
const rtems_filesystem_mount_table_entry_t *mt_entry =
(rtems_filesystem_mount_table_entry_t *) node;
stop = (*routine)( mt_entry, routine_arg );
}
rtems_libio_unlock();
1077f6: 88 45 e4 mov %al,-0x1c(%ebp)
1077f9: e8 ad ff ff ff call 1077ab <rtems_libio_unlock>
return stop;
}
1077fe: 8a 45 e4 mov -0x1c(%ebp),%al
107801: 8d 65 f4 lea -0xc(%ebp),%esp
107804: 5b pop %ebx
107805: 5e pop %esi
107806: 5f pop %edi
107807: c9 leave
107808: c3 ret
00107326 <rtems_filesystem_prefix_separators>:
int rtems_filesystem_prefix_separators(
const char *pathname,
int pathnamelen
)
{
107326: 55 push %ebp
107327: 89 e5 mov %esp,%ebp
107329: 57 push %edi
10732a: 56 push %esi
10732b: 53 push %ebx
10732c: 83 ec 0c sub $0xc,%esp
10732f: 8b 7d 08 mov 0x8(%ebp),%edi
107332: 8b 75 0c mov 0xc(%ebp),%esi
/*
* Eat any separators at start of the path.
*/
int stripped = 0;
107335: 31 db xor %ebx,%ebx
while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) )
107337: eb 01 jmp 10733a <rtems_filesystem_prefix_separators+0x14>
{
pathname++;
pathnamelen--;
stripped++;
107339: 43 inc %ebx
{
/*
* Eat any separators at start of the path.
*/
int stripped = 0;
while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) )
10733a: 8a 04 1f mov (%edi,%ebx,1),%al
10733d: 39 de cmp %ebx,%esi
10733f: 74 17 je 107358 <rtems_filesystem_prefix_separators+0x32><== NEVER TAKEN
107341: 84 c0 test %al,%al
107343: 74 13 je 107358 <rtems_filesystem_prefix_separators+0x32><== NEVER TAKEN
107345: 83 ec 0c sub $0xc,%esp
107348: 0f be c0 movsbl %al,%eax
10734b: 50 push %eax
10734c: e8 03 0d 00 00 call 108054 <rtems_filesystem_is_separator>
107351: 83 c4 10 add $0x10,%esp
107354: 85 c0 test %eax,%eax
107356: 75 e1 jne 107339 <rtems_filesystem_prefix_separators+0x13>
pathname++;
pathnamelen--;
stripped++;
}
return stripped;
}
107358: 89 d8 mov %ebx,%eax
10735a: 8d 65 f4 lea -0xc(%ebp),%esp
10735d: 5b pop %ebx
10735e: 5e pop %esi
10735f: 5f pop %edi
107360: c9 leave
107361: c3 ret
00107bed <rtems_gxx_key_create>:
int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *))
{
107bed: 55 push %ebp
107bee: 89 e5 mov %esp,%ebp
107bf0: 56 push %esi
107bf1: 53 push %ebx
107bf2: 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 ) );
107bf5: 83 ec 0c sub $0xc,%esp
107bf8: 6a 08 push $0x8
107bfa: e8 89 03 00 00 call 107f88 <malloc>
107bff: 89 c3 mov %eax,%ebx
*key = new_key;
107c01: 8b 45 08 mov 0x8(%ebp),%eax
107c04: 89 18 mov %ebx,(%eax)
new_key->val = NULL;
107c06: c7 03 00 00 00 00 movl $0x0,(%ebx)
new_key->dtor = dtor;
107c0c: 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 );
107c0f: 83 c4 0c add $0xc,%esp
107c12: 56 push %esi
107c13: 53 push %ebx
107c14: 6a 00 push $0x0
107c16: e8 41 34 00 00 call 10b05c <rtems_task_variable_add>
107c1b: 89 c2 mov %eax,%edx
if ( status == RTEMS_SUCCESSFUL )
107c1d: 83 c4 10 add $0x10,%esp
return 0;
107c20: 31 c0 xor %eax,%eax
);
#endif
/* 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 )
107c22: 85 d2 test %edx,%edx
107c24: 74 0f je 107c35 <rtems_gxx_key_create+0x48><== ALWAYS TAKEN
return 0;
free( new_key );
107c26: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
107c29: 53 push %ebx <== NOT EXECUTED
107c2a: e8 79 fe ff ff call 107aa8 <free> <== NOT EXECUTED
return -1;
107c2f: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
107c32: 83 c8 ff or $0xffffffff,%eax <== NOT EXECUTED
}
107c35: 8d 65 f8 lea -0x8(%ebp),%esp
107c38: 5b pop %ebx
107c39: 5e pop %esi
107c3a: c9 leave
107c3b: c3 ret
00107c4c <rtems_gxx_key_delete>:
int rtems_gxx_key_delete (__gthread_key_t key)
{
107c4c: 55 push %ebp
107c4d: 89 e5 mov %esp,%ebp
107c4f: 53 push %ebx
107c50: 83 ec 0c sub $0xc,%esp
107c53: 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 );
107c56: 53 push %ebx
107c57: 6a 00 push $0x0
107c59: e8 92 34 00 00 call 10b0f0 <rtems_task_variable_delete>
if ( status == RTEMS_SUCCESSFUL ) {
107c5e: 83 c4 10 add $0x10,%esp
107c61: 85 c0 test %eax,%eax
107c63: 75 11 jne 107c76 <rtems_gxx_key_delete+0x2a><== NEVER TAKEN
/* Hmm - hopefully all tasks using this key have gone away... */
if ( key ) free( *(void **)key );
107c65: 85 db test %ebx,%ebx
107c67: 74 0d je 107c76 <rtems_gxx_key_delete+0x2a><== NEVER TAKEN
107c69: 83 ec 0c sub $0xc,%esp
107c6c: ff 33 pushl (%ebx)
107c6e: e8 35 fe ff ff call 107aa8 <free>
107c73: 83 c4 10 add $0x10,%esp
return 0;
}
key = NULL;
return 0;
}
107c76: 31 c0 xor %eax,%eax
107c78: 8b 5d fc mov -0x4(%ebp),%ebx
107c7b: c9 leave
107c7c: c3 ret
00107b94 <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))
{
107b94: 55 push %ebp
107b95: 89 e5 mov %esp,%ebp
107b97: 56 push %esi
107b98: 53 push %ebx
107b99: 83 ec 10 sub $0x10,%esp
107b9c: 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 ) {
107b9f: 8b 03 mov (%ebx),%eax
107ba1: 85 c0 test %eax,%eax
107ba3: 75 3f jne 107be4 <rtems_gxx_once+0x50>
rtems_mode saveMode;
__gthread_once_t o;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
107ba5: 52 push %edx
107ba6: 8d 45 f4 lea -0xc(%ebp),%eax
107ba9: 50 push %eax
107baa: 68 00 01 00 00 push $0x100
107baf: 68 00 01 00 00 push $0x100
107bb4: e8 23 33 00 00 call 10aedc <rtems_task_mode>
if ( (o = *(volatile __gthread_once_t *)once) == 0 ) {
107bb9: 8b 33 mov (%ebx),%esi
107bbb: 83 c4 10 add $0x10,%esp
107bbe: 85 f6 test %esi,%esi
107bc0: 75 06 jne 107bc8 <rtems_gxx_once+0x34> <== NEVER TAKEN
*(volatile __gthread_once_t *)once = 1;
107bc2: c7 03 01 00 00 00 movl $0x1,(%ebx)
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
107bc8: 50 push %eax
107bc9: 8d 45 f4 lea -0xc(%ebp),%eax
107bcc: 50 push %eax
107bcd: 68 00 01 00 00 push $0x100
107bd2: ff 75 f4 pushl -0xc(%ebp)
107bd5: e8 02 33 00 00 call 10aedc <rtems_task_mode>
if ( o == 0 )
107bda: 83 c4 10 add $0x10,%esp
107bdd: 85 f6 test %esi,%esi
107bdf: 75 03 jne 107be4 <rtems_gxx_once+0x50> <== NEVER TAKEN
(*func)();
107be1: ff 55 0c call *0xc(%ebp)
}
return 0;
}
107be4: 31 c0 xor %eax,%eax
107be6: 8d 65 f8 lea -0x8(%ebp),%esp
107be9: 5b pop %ebx
107bea: 5e pop %esi
107beb: c9 leave
107bec: c3 ret
00107cd5 <rtems_gxx_setspecific>:
int rtems_gxx_setspecific(__gthread_key_t key, const void *ptr)
{
107cd5: 55 push %ebp
107cd6: 89 e5 mov %esp,%ebp
107cd8: 53 push %ebx
107cd9: 83 ec 08 sub $0x8,%esp
107cdc: 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 );
107cdf: ff 73 04 pushl 0x4(%ebx)
107ce2: 53 push %ebx
107ce3: 6a 00 push $0x0
107ce5: e8 72 33 00 00 call 10b05c <rtems_task_variable_add>
107cea: 89 c2 mov %eax,%edx
if ( status == RTEMS_SUCCESSFUL ) {
107cec: 83 c4 10 add $0x10,%esp
/* now let's set the proper value */
key->val = (void *)ptr;
return 0;
}
return -1;
107cef: 83 c8 ff or $0xffffffff,%eax
);
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)key, key->dtor );
if ( status == RTEMS_SUCCESSFUL ) {
107cf2: 85 d2 test %edx,%edx
107cf4: 75 07 jne 107cfd <rtems_gxx_setspecific+0x28><== NEVER TAKEN
/* now let's set the proper value */
key->val = (void *)ptr;
107cf6: 8b 45 0c mov 0xc(%ebp),%eax
107cf9: 89 03 mov %eax,(%ebx)
return 0;
107cfb: 31 c0 xor %eax,%eax
}
return -1;
}
107cfd: 8b 5d fc mov -0x4(%ebp),%ebx
107d00: c9 leave
107d01: c3 ret
0010a9e4 <rtems_heap_allocate_aligned_with_boundary>:
void *rtems_heap_allocate_aligned_with_boundary(
size_t size,
uintptr_t alignment,
uintptr_t boundary
)
{
10a9e4: 55 push %ebp
10a9e5: 89 e5 mov %esp,%ebp
10a9e7: 83 ec 08 sub $0x8,%esp
if (
10a9ea: 83 3d c8 bd 12 00 03 cmpl $0x3,0x12bdc8
10a9f1: 75 0d jne 10aa00 <rtems_heap_allocate_aligned_with_boundary+0x1c><== NEVER TAKEN
_System_state_Is_up( _System_state_Get() )
&& !malloc_is_system_state_OK()
10a9f3: e8 10 f1 ff ff call 109b08 <malloc_is_system_state_OK>
10a9f8: 88 c2 mov %al,%dl
) {
return NULL;
10a9fa: 31 c0 xor %eax,%eax
uintptr_t boundary
)
{
if (
_System_state_Is_up( _System_state_Get() )
&& !malloc_is_system_state_OK()
10a9fc: 84 d2 test %dl,%dl
10a9fe: 74 1c je 10aa1c <rtems_heap_allocate_aligned_with_boundary+0x38>
) {
return NULL;
}
malloc_deferred_frees_process();
10aa00: e8 41 f1 ff ff call 109b46 <malloc_deferred_frees_process>
/* FIXME: Statistics, boundary checks */
return _Protected_heap_Allocate_aligned_with_boundary(
10aa05: ff 75 10 pushl 0x10(%ebp)
10aa08: ff 75 0c pushl 0xc(%ebp)
10aa0b: ff 75 08 pushl 0x8(%ebp)
10aa0e: ff 35 80 71 12 00 pushl 0x127180
10aa14: e8 ef 43 00 00 call 10ee08 <_Protected_heap_Allocate_aligned_with_boundary>
10aa19: 83 c4 10 add $0x10,%esp
RTEMS_Malloc_Heap,
size,
alignment,
boundary
);
}
10aa1c: c9 leave
10aa1d: c3 ret
00107052 <rtems_io_lookup_name>:
rtems_status_code rtems_io_lookup_name(
const char *name,
rtems_driver_name_t *device_info
)
{
107052: 55 push %ebp
107053: 89 e5 mov %esp,%ebp
107055: 57 push %edi
107056: 56 push %esi
107057: 53 push %ebx
107058: 83 ec 48 sub $0x48,%esp
10705b: 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(
10705e: 31 c0 xor %eax,%eax
107060: 83 c9 ff or $0xffffffff,%ecx
107063: 89 f7 mov %esi,%edi
107065: f2 ae repnz scas %es:(%edi),%al
107067: f7 d1 not %ecx
107069: 49 dec %ecx
10706a: 6a 01 push $0x1
10706c: 8d 55 d4 lea -0x2c(%ebp),%edx
10706f: 52 push %edx
107070: 6a 00 push $0x0
107072: 51 push %ecx
107073: 56 push %esi
107074: 89 55 c4 mov %edx,-0x3c(%ebp)
107077: e8 2a 02 00 00 call 1072a6 <rtems_filesystem_evaluate_path>
10707c: 89 c7 mov %eax,%edi
name, strlen( name ), 0x00, &loc, true );
the_jnode = loc.node_access;
10707e: 8b 5d d4 mov -0x2c(%ebp),%ebx
node_type = (*loc.ops->node_type_h)( &loc );
107081: 83 c4 14 add $0x14,%esp
107084: 8b 55 c4 mov -0x3c(%ebp),%edx
107087: 52 push %edx
107088: 8b 45 e0 mov -0x20(%ebp),%eax
10708b: ff 50 10 call *0x10(%eax)
if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) {
10708e: 83 c4 10 add $0x10,%esp
107091: 83 f8 02 cmp $0x2,%eax
107094: 8b 55 c4 mov -0x3c(%ebp),%edx
107097: 75 07 jne 1070a0 <rtems_io_lookup_name+0x4e>
107099: 85 ff test %edi,%edi
10709b: 0f 95 c0 setne %al
10709e: 74 16 je 1070b6 <rtems_io_lookup_name+0x64><== ALWAYS TAKEN
rtems_filesystem_freenode( &loc );
1070a0: 83 ec 0c sub $0xc,%esp
1070a3: 8d 45 d4 lea -0x2c(%ebp),%eax
1070a6: 50 push %eax
1070a7: e8 b8 02 00 00 call 107364 <rtems_filesystem_freenode>
return RTEMS_UNSATISFIED;
1070ac: 83 c4 10 add $0x10,%esp
1070af: b8 0d 00 00 00 mov $0xd,%eax
1070b4: eb 32 jmp 1070e8 <rtems_io_lookup_name+0x96>
}
device_info->device_name = (char *) name;
1070b6: 8b 4d 0c mov 0xc(%ebp),%ecx
1070b9: 89 31 mov %esi,(%ecx)
device_info->device_name_length = strlen( name );
1070bb: 83 c9 ff or $0xffffffff,%ecx
1070be: 89 f7 mov %esi,%edi
1070c0: f2 ae repnz scas %es:(%edi),%al
1070c2: f7 d1 not %ecx
1070c4: 49 dec %ecx
1070c5: 8b 45 0c mov 0xc(%ebp),%eax
1070c8: 89 48 04 mov %ecx,0x4(%eax)
device_info->major = the_jnode->info.device.major;
1070cb: 8b 43 50 mov 0x50(%ebx),%eax
1070ce: 8b 4d 0c mov 0xc(%ebp),%ecx
1070d1: 89 41 08 mov %eax,0x8(%ecx)
device_info->minor = the_jnode->info.device.minor;
1070d4: 8b 43 54 mov 0x54(%ebx),%eax
1070d7: 89 41 0c mov %eax,0xc(%ecx)
rtems_filesystem_freenode( &loc );
1070da: 83 ec 0c sub $0xc,%esp
1070dd: 52 push %edx
1070de: e8 81 02 00 00 call 107364 <rtems_filesystem_freenode>
return RTEMS_SUCCESSFUL;
1070e3: 83 c4 10 add $0x10,%esp
1070e6: 31 c0 xor %eax,%eax
}
1070e8: 8d 65 f4 lea -0xc(%ebp),%esp
1070eb: 5b pop %ebx
1070ec: 5e pop %esi
1070ed: 5f pop %edi
1070ee: c9 leave
1070ef: c3 ret
0010c7b4 <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)
{
10c7b4: 55 push %ebp
10c7b5: 89 e5 mov %esp,%ebp
10c7b7: 57 push %edi
10c7b8: 56 push %esi
10c7b9: 53 push %ebx
10c7ba: 83 ec 0c sub $0xc,%esp
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
10c7bd: 83 7d 08 00 cmpl $0x0,0x8(%ebp)
10c7c1: 74 3d je 10c800 <rtems_iterate_over_all_threads+0x4c><== NEVER TAKEN
10c7c3: bb 01 00 00 00 mov $0x1,%ebx
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
10c7c8: 8b 04 9d 9c 90 12 00 mov 0x12909c(,%ebx,4),%eax
10c7cf: 8b 78 04 mov 0x4(%eax),%edi
if ( !information )
10c7d2: be 01 00 00 00 mov $0x1,%esi
10c7d7: 85 ff test %edi,%edi
10c7d9: 75 17 jne 10c7f2 <rtems_iterate_over_all_threads+0x3e>
10c7db: eb 1d jmp 10c7fa <rtems_iterate_over_all_threads+0x46>
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
the_thread = (Thread_Control *)information->local_table[ i ];
10c7dd: 8b 47 1c mov 0x1c(%edi),%eax
10c7e0: 8b 04 b0 mov (%eax,%esi,4),%eax
if ( !the_thread )
10c7e3: 85 c0 test %eax,%eax
10c7e5: 74 0a je 10c7f1 <rtems_iterate_over_all_threads+0x3d><== NEVER TAKEN
continue;
(*routine)(the_thread);
10c7e7: 83 ec 0c sub $0xc,%esp
10c7ea: 50 push %eax
10c7eb: ff 55 08 call *0x8(%ebp)
10c7ee: 83 c4 10 add $0x10,%esp
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
10c7f1: 46 inc %esi
10c7f2: 0f b7 47 10 movzwl 0x10(%edi),%eax
10c7f6: 39 c6 cmp %eax,%esi
10c7f8: 76 e3 jbe 10c7dd <rtems_iterate_over_all_threads+0x29>
Objects_Information *information;
if ( !routine )
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
10c7fa: 43 inc %ebx
10c7fb: 83 fb 04 cmp $0x4,%ebx
10c7fe: 75 c8 jne 10c7c8 <rtems_iterate_over_all_threads+0x14>
(*routine)(the_thread);
}
}
}
10c800: 8d 65 f4 lea -0xc(%ebp),%esp
10c803: 5b pop %ebx
10c804: 5e pop %esi
10c805: 5f pop %edi
10c806: c9 leave
10c807: c3 ret
0010e304 <rtems_libio_free>:
*/
void rtems_libio_free(
rtems_libio_t *iop
)
{
10e304: 55 push %ebp
10e305: 89 e5 mov %esp,%ebp
10e307: 53 push %ebx
10e308: 83 ec 04 sub $0x4,%esp
10e30b: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_libio_lock();
10e30e: e8 d5 fe ff ff call 10e1e8 <rtems_libio_lock>
if (iop->sem)
10e313: 8b 43 2c mov 0x2c(%ebx),%eax
10e316: 85 c0 test %eax,%eax
10e318: 74 0c je 10e326 <rtems_libio_free+0x22> <== NEVER TAKEN
rtems_semaphore_delete(iop->sem);
10e31a: 83 ec 0c sub $0xc,%esp
10e31d: 50 push %eax
10e31e: e8 09 be ff ff call 10a12c <rtems_semaphore_delete>
10e323: 83 c4 10 add $0x10,%esp
iop->flags &= ~LIBIO_FLAGS_OPEN;
10e326: 81 63 14 ff fe ff ff andl $0xfffffeff,0x14(%ebx)
iop->data1 = rtems_libio_iop_freelist;
10e32d: a1 fc 51 12 00 mov 0x1251fc,%eax
10e332: 89 43 34 mov %eax,0x34(%ebx)
rtems_libio_iop_freelist = iop;
10e335: 89 1d fc 51 12 00 mov %ebx,0x1251fc
rtems_libio_unlock();
}
10e33b: 8b 5d fc mov -0x4(%ebp),%ebx
10e33e: c9 leave
iop->flags &= ~LIBIO_FLAGS_OPEN;
iop->data1 = rtems_libio_iop_freelist;
rtems_libio_iop_freelist = iop;
rtems_libio_unlock();
10e33f: e9 be fe ff ff jmp 10e202 <rtems_libio_unlock>
00107464 <rtems_libio_init>:
*
* Called by BSP startup code to initialize the libio subsystem.
*/
void rtems_libio_init( void )
{
107464: 55 push %ebp
107465: 89 e5 mov %esp,%ebp
107467: 53 push %ebx
107468: 83 ec 04 sub $0x4,%esp
rtems_status_code rc;
uint32_t i;
rtems_libio_t *iop;
if (rtems_libio_number_iops > 0)
10746b: 8b 1d 44 11 12 00 mov 0x121144,%ebx
107471: 85 db test %ebx,%ebx
107473: 74 3e je 1074b3 <rtems_libio_init+0x4f> <== NEVER TAKEN
{
rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops,
107475: 50 push %eax
107476: 50 push %eax
107477: 6a 38 push $0x38
107479: 53 push %ebx
10747a: e8 8d fd ff ff call 10720c <calloc>
10747f: a3 f8 51 12 00 mov %eax,0x1251f8
sizeof(rtems_libio_t));
if (rtems_libio_iops == NULL)
107484: 83 c4 10 add $0x10,%esp
107487: 85 c0 test %eax,%eax
107489: 75 07 jne 107492 <rtems_libio_init+0x2e>
rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
10748b: 83 ec 0c sub $0xc,%esp
10748e: 6a 1a push $0x1a
107490: eb 44 jmp 1074d6 <rtems_libio_init+0x72>
iop = rtems_libio_iop_freelist = rtems_libio_iops;
107492: a3 fc 51 12 00 mov %eax,0x1251fc
107497: 89 c2 mov %eax,%edx
for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++)
107499: 31 c9 xor %ecx,%ecx
10749b: eb 03 jmp 1074a0 <rtems_libio_init+0x3c>
iop->data1 = iop + 1;
10749d: 89 52 fc mov %edx,-0x4(%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++)
1074a0: 41 inc %ecx
1074a1: 83 c2 38 add $0x38,%edx
1074a4: 39 d9 cmp %ebx,%ecx
1074a6: 72 f5 jb 10749d <rtems_libio_init+0x39>
iop->data1 = iop + 1;
iop->data1 = NULL;
1074a8: 6b db 38 imul $0x38,%ebx,%ebx
1074ab: c7 44 18 fc 00 00 00 movl $0x0,-0x4(%eax,%ebx,1)
1074b2: 00
/*
* Create the binary semaphore used to provide mutual exclusion
* on the IOP Table.
*/
rc = rtems_semaphore_create(
1074b3: 83 ec 0c sub $0xc,%esp
1074b6: 68 00 52 12 00 push $0x125200
1074bb: 6a 00 push $0x0
1074bd: 6a 54 push $0x54
1074bf: 6a 01 push $0x1
1074c1: 68 4f 49 42 4c push $0x4c42494f
1074c6: e8 c9 2a 00 00 call 109f94 <rtems_semaphore_create>
1,
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&rtems_libio_semaphore
);
if ( rc != RTEMS_SUCCESSFUL )
1074cb: 83 c4 20 add $0x20,%esp
1074ce: 85 c0 test %eax,%eax
1074d0: 74 09 je 1074db <rtems_libio_init+0x77> <== ALWAYS TAKEN
rtems_fatal_error_occurred( rc );
1074d2: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
1074d5: 50 push %eax <== NOT EXECUTED
1074d6: e8 ad 32 00 00 call 10a788 <rtems_fatal_error_occurred>
/*
* Initialize the base file system infrastructure.
*/
if (rtems_fs_init_helper)
1074db: a1 40 11 12 00 mov 0x121140,%eax
1074e0: 85 c0 test %eax,%eax
1074e2: 74 06 je 1074ea <rtems_libio_init+0x86> <== NEVER TAKEN
(* rtems_fs_init_helper)();
}
1074e4: 8b 5d fc mov -0x4(%ebp),%ebx
1074e7: c9 leave
/*
* Initialize the base file system infrastructure.
*/
if (rtems_fs_init_helper)
(* rtems_fs_init_helper)();
1074e8: ff e0 jmp *%eax
}
1074ea: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
1074ed: c9 leave <== NOT EXECUTED
1074ee: c3 ret <== NOT EXECUTED
00108651 <rtems_libio_set_private_env>:
rtems_status_code rtems_libio_set_private_env(void)
{
108651: 55 push %ebp
108652: 89 e5 mov %esp,%ebp
108654: 57 push %edi
108655: 56 push %esi
108656: 53 push %ebx
108657: 83 ec 3c sub $0x3c,%esp
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_id task_id = rtems_task_self();
10865a: e8 4d 27 00 00 call 10adac <rtems_task_self>
10865f: 89 c3 mov %eax,%ebx
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);
108661: 83 ec 0c sub $0xc,%esp
108664: 6a 00 push $0x0
108666: 8d 45 d4 lea -0x2c(%ebp),%eax
108669: 50 push %eax
10866a: 6a 00 push $0x0
10866c: 6a 01 push $0x1
10866e: 68 e8 f7 11 00 push $0x11f7e8
108673: e8 42 f0 ff ff call 1076ba <rtems_filesystem_evaluate_path>
108678: 89 c2 mov %eax,%edx
if (rv != 0)
10867a: 83 c4 20 add $0x20,%esp
error_1:
rtems_filesystem_freenode(&root_loc);
error_0:
return RTEMS_NO_MEMORY;
10867d: b8 1a 00 00 00 mov $0x1a,%eax
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);
if (rv != 0)
108682: 85 d2 test %edx,%edx
108684: 0f 85 c0 00 00 00 jne 10874a <rtems_libio_set_private_env+0xf9><== NEVER TAKEN
goto error_0;
rv = rtems_filesystem_evaluate_path("/", 1, 0, ¤t_loc, 0);
10868a: 83 ec 0c sub $0xc,%esp
10868d: 6a 00 push $0x0
10868f: 8d 45 c0 lea -0x40(%ebp),%eax
108692: 50 push %eax
108693: 6a 00 push $0x0
108695: 6a 01 push $0x1
108697: 68 e8 f7 11 00 push $0x11f7e8
10869c: e8 19 f0 ff ff call 1076ba <rtems_filesystem_evaluate_path>
if (rv != 0)
1086a1: 83 c4 20 add $0x20,%esp
1086a4: 85 c0 test %eax,%eax
1086a6: 0f 85 8a 00 00 00 jne 108736 <rtems_libio_set_private_env+0xe5><== 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
1086ac: a1 6c 30 12 00 mov 0x12306c,%eax
/*
* Bharath: I'm not sure if the check can be reduced to
* if( rtems_current_user_env->task_id != task_id ) {
*/
if (
1086b1: 3d 48 52 12 00 cmp $0x125248,%eax
1086b6: 74 04 je 1086bc <rtems_libio_set_private_env+0x6b>
rtems_current_user_env == &rtems_global_user_env
|| rtems_current_user_env->task_id != task_id
1086b8: 39 18 cmp %ebx,(%eax)
1086ba: 74 32 je 1086ee <rtems_libio_set_private_env+0x9d>
) {
new_env = malloc(sizeof(rtems_user_env_t));
1086bc: 83 ec 0c sub $0xc,%esp
1086bf: 6a 48 push $0x48
1086c1: e8 66 f5 ff ff call 107c2c <malloc>
1086c6: 89 c6 mov %eax,%esi
if (new_env == NULL)
1086c8: 83 c4 10 add $0x10,%esp
1086cb: 85 c0 test %eax,%eax
1086cd: 74 58 je 108727 <rtems_libio_set_private_env+0xd6>
#ifdef HAVE_USERENV_REFCNT
new_env->refcnt = 1;
#endif
sc = rtems_task_variable_add(
1086cf: 50 push %eax
1086d0: 68 14 86 10 00 push $0x108614
1086d5: 68 6c 30 12 00 push $0x12306c
1086da: 6a 00 push $0x0
1086dc: e8 3f 27 00 00 call 10ae20 <rtems_task_variable_add>
RTEMS_SELF,
(void*)&rtems_current_user_env,
(void(*)(void *))free_user_env
);
if (sc != RTEMS_SUCCESSFUL)
1086e1: 83 c4 10 add $0x10,%esp
1086e4: 85 c0 test %eax,%eax
1086e6: 75 33 jne 10871b <rtems_libio_set_private_env+0xca>
goto error_3;
rtems_current_user_env = new_env;
1086e8: 89 35 6c 30 12 00 mov %esi,0x12306c
}
/* Inherit the global values */
*rtems_current_user_env = rtems_global_user_env;
1086ee: a1 6c 30 12 00 mov 0x12306c,%eax
1086f3: be 48 52 12 00 mov $0x125248,%esi
1086f8: b9 12 00 00 00 mov $0x12,%ecx
1086fd: 89 c7 mov %eax,%edi
1086ff: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
rtems_current_user_env->task_id = task_id;
108701: 89 18 mov %ebx,(%eax)
* 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;
108703: 8d 78 18 lea 0x18(%eax),%edi
108706: 8d 75 d4 lea -0x2c(%ebp),%esi
108709: b1 05 mov $0x5,%cl
10870b: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
rtems_filesystem_current = current_loc;
10870d: 8d 78 04 lea 0x4(%eax),%edi
108710: 8d 75 c0 lea -0x40(%ebp),%esi
108713: b1 05 mov $0x5,%cl
108715: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return RTEMS_SUCCESSFUL;
108717: 31 c0 xor %eax,%eax
108719: eb 2f jmp 10874a <rtems_libio_set_private_env+0xf9>
error_3:
free(new_env);
10871b: 83 ec 0c sub $0xc,%esp
10871e: 56 push %esi
10871f: e8 68 f0 ff ff call 10778c <free>
108724: 83 c4 10 add $0x10,%esp
error_2:
rtems_filesystem_freenode(¤t_loc);
108727: 83 ec 0c sub $0xc,%esp
10872a: 8d 45 c0 lea -0x40(%ebp),%eax
10872d: 50 push %eax
10872e: e8 45 f0 ff ff call 107778 <rtems_filesystem_freenode>
108733: 83 c4 10 add $0x10,%esp
error_1:
rtems_filesystem_freenode(&root_loc);
108736: 83 ec 0c sub $0xc,%esp
108739: 8d 45 d4 lea -0x2c(%ebp),%eax
10873c: 50 push %eax
10873d: e8 36 f0 ff ff call 107778 <rtems_filesystem_freenode>
108742: 83 c4 10 add $0x10,%esp
error_0:
return RTEMS_NO_MEMORY;
108745: b8 1a 00 00 00 mov $0x1a,%eax
}
10874a: 8d 65 f4 lea -0xc(%ebp),%esp
10874d: 5b pop %ebx
10874e: 5e pop %esi
10874f: 5f pop %edi
108750: c9 leave
108751: c3 ret
00108752 <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)
{
108752: 55 push %ebp
108753: 89 e5 mov %esp,%ebp
108755: 56 push %esi
108756: 53 push %ebx
108757: 83 ec 20 sub $0x20,%esp
10875a: 8b 75 08 mov 0x8(%ebp),%esi
rtems_id current_task_id;
/*
* get current task id
*/
current_task_id = rtems_task_self();
10875d: e8 4a 26 00 00 call 10adac <rtems_task_self>
108762: 89 c3 mov %eax,%ebx
* 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;
108764: 31 c0 xor %eax,%eax
/*
* 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 )
108766: 39 de cmp %ebx,%esi
108768: 74 3c je 1087a6 <rtems_libio_share_private_env+0x54><== NEVER TAKEN
return RTEMS_SUCCESSFUL;
/*
* Try to get the requested user environment
*/
sc = rtems_task_variable_get(
10876a: 52 push %edx
task_id,
(void*)&rtems_current_user_env,
(void*)&shared_user_env );
10876b: 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(
10876e: 50 push %eax
10876f: 68 6c 30 12 00 push $0x12306c
108774: 56 push %esi
108775: e8 3a 27 00 00 call 10aeb4 <rtems_task_variable_get>
(void*)&shared_user_env );
/*
* If it was not successful, return the error code
*/
if (sc != RTEMS_SUCCESSFUL)
10877a: 83 c4 10 add $0x10,%esp
10877d: 85 c0 test %eax,%eax
10877f: 75 25 jne 1087a6 <rtems_libio_share_private_env+0x54>
* 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) {
108781: 8b 15 6c 30 12 00 mov 0x12306c,%edx
108787: 39 1a cmp %ebx,(%edx)
108789: 75 12 jne 10879d <rtems_libio_share_private_env+0x4b>
rtems_user_env_t *tmp = rtems_current_user_env;
free_user_env( tmp );
10878b: 83 ec 0c sub $0xc,%esp
10878e: 52 push %edx
10878f: 89 45 e4 mov %eax,-0x1c(%ebp)
108792: e8 7d fe ff ff call 108614 <free_user_env>
108797: 83 c4 10 add $0x10,%esp
10879a: 8b 45 e4 mov -0x1c(%ebp),%eax
}
/* the current_user_env is the same pointer that remote env */
rtems_current_user_env = shared_user_env;
10879d: 8b 55 f4 mov -0xc(%ebp),%edx
1087a0: 89 15 6c 30 12 00 mov %edx,0x12306c
#ifdef HAVE_USERENV_REFCNT
rtems_current_user_env->refcnt++;
#endif
return RTEMS_SUCCESSFUL;
}
1087a6: 8d 65 f8 lea -0x8(%ebp),%esp
1087a9: 5b pop %ebx
1087aa: 5e pop %esi
1087ab: c9 leave
1087ac: c3 ret
0010e24d <rtems_libio_to_fcntl_flags>:
*/
uint32_t rtems_libio_to_fcntl_flags(
uint32_t flags
)
{
10e24d: 55 push %ebp
10e24e: 89 e5 mov %esp,%ebp
10e250: 8b 55 08 mov 0x8(%ebp),%edx
uint32_t fcntl_flags = 0;
if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) {
10e253: 89 d1 mov %edx,%ecx
10e255: 83 e1 06 and $0x6,%ecx
fcntl_flags |= O_RDWR;
10e258: b8 02 00 00 00 mov $0x2,%eax
uint32_t flags
)
{
uint32_t fcntl_flags = 0;
if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) {
10e25d: 83 f9 06 cmp $0x6,%ecx
10e260: 74 0f je 10e271 <rtems_libio_to_fcntl_flags+0x24>
fcntl_flags |= O_RDWR;
} else if ( (flags & LIBIO_FLAGS_READ) == LIBIO_FLAGS_READ) {
fcntl_flags |= O_RDONLY;
10e262: 30 c0 xor %al,%al
{
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) {
10e264: f6 c2 02 test $0x2,%dl
10e267: 75 08 jne 10e271 <rtems_libio_to_fcntl_flags+0x24><== ALWAYS TAKEN
)
{
uint32_t fcntl_flags = 0;
if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) {
fcntl_flags |= O_RDWR;
10e269: 31 c0 xor %eax,%eax
10e26b: f6 c2 04 test $0x4,%dl <== NOT EXECUTED
10e26e: 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 ) {
10e271: f6 c2 01 test $0x1,%dl
10e274: 74 03 je 10e279 <rtems_libio_to_fcntl_flags+0x2c>
fcntl_flags |= O_NONBLOCK;
10e276: 80 cc 40 or $0x40,%ah
}
if ( (flags & LIBIO_FLAGS_APPEND) == LIBIO_FLAGS_APPEND ) {
10e279: f6 c6 02 test $0x2,%dh
10e27c: 74 03 je 10e281 <rtems_libio_to_fcntl_flags+0x34>
fcntl_flags |= O_APPEND;
10e27e: 83 c8 08 or $0x8,%eax
}
if ( (flags & LIBIO_FLAGS_CREATE) == LIBIO_FLAGS_CREATE ) {
10e281: 80 e6 04 and $0x4,%dh
10e284: 74 03 je 10e289 <rtems_libio_to_fcntl_flags+0x3c>
fcntl_flags |= O_CREAT;
10e286: 80 cc 02 or $0x2,%ah
}
return fcntl_flags;
}
10e289: c9 leave
10e28a: c3 ret
00109e0c <rtems_malloc_statistics_at_free>:
* size and thus we skip updating the statistics.
*/
static void rtems_malloc_statistics_at_free(
void *pointer
)
{
109e0c: 55 push %ebp
109e0d: 89 e5 mov %esp,%ebp
109e0f: 83 ec 1c sub $0x1c,%esp
uintptr_t size;
if (_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &size) ) {
109e12: 8d 45 f4 lea -0xc(%ebp),%eax
109e15: 50 push %eax
109e16: ff 75 08 pushl 0x8(%ebp)
109e19: ff 35 80 71 12 00 pushl 0x127180
109e1f: e8 8c 50 00 00 call 10eeb0 <_Protected_heap_Get_block_size>
109e24: 83 c4 10 add $0x10,%esp
109e27: 84 c0 test %al,%al
109e29: 74 11 je 109e3c <rtems_malloc_statistics_at_free+0x30><== NEVER TAKEN
MSBUMP(lifetime_freed, size);
109e2b: 8b 45 f4 mov -0xc(%ebp),%eax
109e2e: 31 d2 xor %edx,%edx
109e30: 01 05 60 bb 12 00 add %eax,0x12bb60
109e36: 11 15 64 bb 12 00 adc %edx,0x12bb64
}
}
109e3c: c9 leave
109e3d: c3 ret
00109e3e <rtems_malloc_statistics_at_malloc>:
}
static void rtems_malloc_statistics_at_malloc(
void *pointer
)
{
109e3e: 55 push %ebp
109e3f: 89 e5 mov %esp,%ebp
109e41: 83 ec 18 sub $0x18,%esp
109e44: 8b 45 08 mov 0x8(%ebp),%eax
uintptr_t actual_size = 0;
109e47: 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 )
109e4e: 85 c0 test %eax,%eax
109e50: 74 43 je 109e95 <rtems_malloc_statistics_at_malloc+0x57><== NEVER TAKEN
return;
_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &actual_size);
109e52: 52 push %edx
109e53: 8d 55 f4 lea -0xc(%ebp),%edx
109e56: 52 push %edx
109e57: 50 push %eax
109e58: ff 35 80 71 12 00 pushl 0x127180
109e5e: e8 4d 50 00 00 call 10eeb0 <_Protected_heap_Get_block_size>
MSBUMP(lifetime_allocated, actual_size);
109e63: 8b 45 f4 mov -0xc(%ebp),%eax
109e66: 31 d2 xor %edx,%edx
109e68: 03 05 58 bb 12 00 add 0x12bb58,%eax
109e6e: 13 15 5c bb 12 00 adc 0x12bb5c,%edx
109e74: a3 58 bb 12 00 mov %eax,0x12bb58
109e79: 89 15 5c bb 12 00 mov %edx,0x12bb5c
current_depth = (uint32_t) (s->lifetime_allocated - s->lifetime_freed);
109e7f: 2b 05 60 bb 12 00 sub 0x12bb60,%eax
if (current_depth > s->max_depth)
109e85: 83 c4 10 add $0x10,%esp
109e88: 3b 05 54 bb 12 00 cmp 0x12bb54,%eax
109e8e: 76 05 jbe 109e95 <rtems_malloc_statistics_at_malloc+0x57>
s->max_depth = current_depth;
109e90: a3 54 bb 12 00 mov %eax,0x12bb54
}
109e95: c9 leave
109e96: c3 ret
00111aac <rtems_memalign>:
int rtems_memalign(
void **pointer,
size_t alignment,
size_t size
)
{
111aac: 55 push %ebp
111aad: 89 e5 mov %esp,%ebp
111aaf: 57 push %edi
111ab0: 56 push %esi
111ab1: 53 push %ebx
111ab2: 83 ec 0c sub $0xc,%esp
111ab5: 8b 5d 08 mov 0x8(%ebp),%ebx
/*
* Parameter error checks
*/
if ( !pointer )
return EINVAL;
111ab8: be 16 00 00 00 mov $0x16,%esi
void *return_this;
/*
* Parameter error checks
*/
if ( !pointer )
111abd: 85 db test %ebx,%ebx
111abf: 74 55 je 111b16 <rtems_memalign+0x6a>
return EINVAL;
*pointer = NULL;
111ac1: 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()) &&
111ac7: 83 3d 54 85 12 00 03 cmpl $0x3,0x128554
111ace: 75 09 jne 111ad9 <rtems_memalign+0x2d> <== NEVER TAKEN
!malloc_is_system_state_OK() )
111ad0: e8 57 67 ff ff call 10822c <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()) &&
111ad5: 84 c0 test %al,%al
111ad7: 74 3d je 111b16 <rtems_memalign+0x6a> <== NEVER TAKEN
return EINVAL;
/*
* If some free's have been deferred, then do them now.
*/
malloc_deferred_frees_process();
111ad9: e8 8c 67 ff ff call 10826a <malloc_deferred_frees_process>
Heap_Control *heap,
uintptr_t size,
uintptr_t alignment
)
{
return
111ade: 6a 00 push $0x0
111ae0: ff 75 0c pushl 0xc(%ebp)
111ae3: ff 75 10 pushl 0x10(%ebp)
111ae6: ff 35 80 41 12 00 pushl 0x124180
111aec: e8 77 af ff ff call 10ca68 <_Protected_heap_Allocate_aligned_with_boundary>
111af1: 89 c7 mov %eax,%edi
return_this = _Protected_heap_Allocate_aligned(
RTEMS_Malloc_Heap,
size,
alignment
);
if ( !return_this )
111af3: 83 c4 10 add $0x10,%esp
return ENOMEM;
111af6: be 0c 00 00 00 mov $0xc,%esi
return_this = _Protected_heap_Allocate_aligned(
RTEMS_Malloc_Heap,
size,
alignment
);
if ( !return_this )
111afb: 85 c0 test %eax,%eax
111afd: 74 17 je 111b16 <rtems_memalign+0x6a>
return ENOMEM;
/*
* If configured, update the more involved statistics
*/
if ( rtems_malloc_statistics_helpers )
111aff: a1 90 66 12 00 mov 0x126690,%eax
111b04: 85 c0 test %eax,%eax
111b06: 74 0a je 111b12 <rtems_memalign+0x66>
(*rtems_malloc_statistics_helpers->at_malloc)(pointer);
111b08: 83 ec 0c sub $0xc,%esp
111b0b: 53 push %ebx
111b0c: ff 50 04 call *0x4(%eax)
111b0f: 83 c4 10 add $0x10,%esp
*pointer = return_this;
111b12: 89 3b mov %edi,(%ebx)
return 0;
111b14: 31 f6 xor %esi,%esi
}
111b16: 89 f0 mov %esi,%eax
111b18: 8d 65 f4 lea -0xc(%ebp),%esp
111b1b: 5b pop %ebx
111b1c: 5e pop %esi
111b1d: 5f pop %edi
111b1e: c9 leave
111b1f: c3 ret
001103cc <rtems_mkdir>:
return (retval);
}
int
rtems_mkdir(const char *path, mode_t mode)
{
1103cc: 55 push %ebp
1103cd: 89 e5 mov %esp,%ebp
1103cf: 57 push %edi
1103d0: 56 push %esi
1103d1: 53 push %ebx
1103d2: 83 ec 78 sub $0x78,%esp
int success = 0;
char *dup_path = strdup(path);
1103d5: ff 75 08 pushl 0x8(%ebp)
1103d8: e8 87 32 00 00 call 113664 <strdup>
1103dd: 89 c3 mov %eax,%ebx
if (dup_path != NULL) {
1103df: 83 c4 10 add $0x10,%esp
success = build(dup_path, mode);
free(dup_path);
}
return success != 0 ? 0 : -1;
1103e2: 83 c8 ff or $0xffffffff,%eax
rtems_mkdir(const char *path, mode_t mode)
{
int success = 0;
char *dup_path = strdup(path);
if (dup_path != NULL) {
1103e5: 85 db test %ebx,%ebx
1103e7: 0f 84 1e 01 00 00 je 11050b <rtems_mkdir+0x13f> <== NEVER TAKEN
p = path;
oumask = 0;
retval = 1;
if (p[0] == '/') /* Skip leading '/'. */
++p;
1103ed: 31 c0 xor %eax,%eax
1103ef: 80 3b 2f cmpb $0x2f,(%ebx)
1103f2: 0f 94 c0 sete %al
1103f5: 8d 3c 03 lea (%ebx,%eax,1),%edi
char *p;
p = path;
oumask = 0;
retval = 1;
if (p[0] == '/') /* Skip leading '/'. */
1103f8: c7 45 94 00 00 00 00 movl $0x0,-0x6c(%ebp)
1103ff: b8 01 00 00 00 mov $0x1,%eax
++p;
for (first = 1, last = 0; !last ; ++p) {
if (p[0] == '\0')
110404: 8a 0f mov (%edi),%cl
last = 1;
110406: ba 01 00 00 00 mov $0x1,%edx
oumask = 0;
retval = 1;
if (p[0] == '/') /* Skip leading '/'. */
++p;
for (first = 1, last = 0; !last ; ++p) {
if (p[0] == '\0')
11040b: 84 c9 test %cl,%cl
11040d: 74 0b je 11041a <rtems_mkdir+0x4e>
last = 1;
else if (p[0] != '/')
11040f: 80 f9 2f cmp $0x2f,%cl
110412: 0f 85 c8 00 00 00 jne 1104e0 <rtems_mkdir+0x114>
110418: 30 d2 xor %dl,%dl
continue;
*p = '\0';
11041a: c6 07 00 movb $0x0,(%edi)
if (!last && p[1] == '\0')
11041d: be 01 00 00 00 mov $0x1,%esi
110422: 85 d2 test %edx,%edx
110424: 75 0b jne 110431 <rtems_mkdir+0x65>
110426: 31 d2 xor %edx,%edx
110428: 80 7f 01 00 cmpb $0x0,0x1(%edi)
11042c: 0f 94 c2 sete %dl
11042f: 89 d6 mov %edx,%esi
last = 1;
if (first) {
110431: 85 c0 test %eax,%eax
110433: 74 1a je 11044f <rtems_mkdir+0x83>
* mkdir [-m mode] dir
*
* We change the user's umask and then restore it,
* instead of doing chmod's.
*/
oumask = umask(0);
110435: 83 ec 0c sub $0xc,%esp
110438: 6a 00 push $0x0
11043a: e8 75 01 00 00 call 1105b4 <umask>
11043f: 89 45 94 mov %eax,-0x6c(%ebp)
numask = oumask & ~(S_IWUSR | S_IXUSR);
110442: 24 3f and $0x3f,%al
(void)umask(numask);
110444: 89 04 24 mov %eax,(%esp)
110447: e8 68 01 00 00 call 1105b4 <umask>
11044c: 83 c4 10 add $0x10,%esp
first = 0;
}
if (last)
(void)umask(oumask);
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
11044f: b8 ff 01 00 00 mov $0x1ff,%eax
oumask = umask(0);
numask = oumask & ~(S_IWUSR | S_IXUSR);
(void)umask(numask);
first = 0;
}
if (last)
110454: 85 f6 test %esi,%esi
110456: 74 11 je 110469 <rtems_mkdir+0x9d>
(void)umask(oumask);
110458: 83 ec 0c sub $0xc,%esp
11045b: ff 75 94 pushl -0x6c(%ebp)
11045e: e8 51 01 00 00 call 1105b4 <umask>
110463: 83 c4 10 add $0x10,%esp
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
110466: 8b 45 0c mov 0xc(%ebp),%eax
110469: 52 push %edx
11046a: 52 push %edx
11046b: 50 push %eax
11046c: 53 push %ebx
11046d: e8 9e 82 ff ff call 108710 <mkdir>
110472: 83 c4 10 add $0x10,%esp
110475: 85 c0 test %eax,%eax
110477: 79 5e jns 1104d7 <rtems_mkdir+0x10b>
if (errno == EEXIST || errno == EISDIR) {
110479: e8 0e 25 00 00 call 11298c <__errno>
11047e: 83 38 11 cmpl $0x11,(%eax)
110481: 74 0a je 11048d <rtems_mkdir+0xc1>
110483: e8 04 25 00 00 call 11298c <__errno>
110488: 83 38 15 cmpl $0x15,(%eax)
11048b: 75 59 jne 1104e6 <rtems_mkdir+0x11a> <== ALWAYS TAKEN
if (stat(path, &sb) < 0) {
11048d: 50 push %eax
11048e: 50 push %eax
11048f: 8d 45 a0 lea -0x60(%ebp),%eax
110492: 50 push %eax
110493: 53 push %ebx
110494: e8 8b 00 00 00 call 110524 <stat>
110499: 83 c4 10 add $0x10,%esp
11049c: 85 c0 test %eax,%eax
11049e: 78 46 js 1104e6 <rtems_mkdir+0x11a> <== NEVER TAKEN
retval = 0;
break;
} else if (!S_ISDIR(sb.st_mode)) {
1104a0: 8b 45 ac mov -0x54(%ebp),%eax
1104a3: 25 00 f0 00 00 and $0xf000,%eax
1104a8: 3d 00 40 00 00 cmp $0x4000,%eax
1104ad: 74 22 je 1104d1 <rtems_mkdir+0x105>
if (last)
1104af: 85 f6 test %esi,%esi
1104b1: 74 0f je 1104c2 <rtems_mkdir+0xf6>
errno = EEXIST;
1104b3: e8 d4 24 00 00 call 11298c <__errno>
1104b8: c7 00 11 00 00 00 movl $0x11,(%eax)
else
errno = ENOTDIR;
retval = 0;
1104be: 31 ff xor %edi,%edi
1104c0: eb 38 jmp 1104fa <rtems_mkdir+0x12e>
break;
} else if (!S_ISDIR(sb.st_mode)) {
if (last)
errno = EEXIST;
else
errno = ENOTDIR;
1104c2: e8 c5 24 00 00 call 11298c <__errno>
1104c7: c7 00 14 00 00 00 movl $0x14,(%eax)
retval = 0;
1104cd: 31 ff xor %edi,%edi
1104cf: eb 1b jmp 1104ec <rtems_mkdir+0x120>
break;
}
if (last)
1104d1: 85 f6 test %esi,%esi
1104d3: 75 3e jne 110513 <rtems_mkdir+0x147>
1104d5: eb 04 jmp 1104db <rtems_mkdir+0x10f>
} else {
retval = 0;
break;
}
}
if (!last)
1104d7: 85 f6 test %esi,%esi
1104d9: 75 3f jne 11051a <rtems_mkdir+0x14e>
*p = '/';
1104db: c6 07 2f movb $0x2f,(%edi)
1104de: 31 c0 xor %eax,%eax
p = path;
oumask = 0;
retval = 1;
if (p[0] == '/') /* Skip leading '/'. */
++p;
for (first = 1, last = 0; !last ; ++p) {
1104e0: 47 inc %edi
1104e1: e9 1e ff ff ff jmp 110404 <rtems_mkdir+0x38>
if (last)
(void)umask(oumask);
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
if (errno == EEXIST || errno == EISDIR) {
if (stat(path, &sb) < 0) {
retval = 0;
1104e6: 31 ff xor %edi,%edi
}
}
if (!last)
*p = '/';
}
if (!first && !last)
1104e8: 85 f6 test %esi,%esi
1104ea: 75 0e jne 1104fa <rtems_mkdir+0x12e> <== ALWAYS TAKEN
(void)umask(oumask);
1104ec: 83 ec 0c sub $0xc,%esp
1104ef: ff 75 94 pushl -0x6c(%ebp)
1104f2: e8 bd 00 00 00 call 1105b4 <umask>
1104f7: 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);
1104fa: 83 ec 0c sub $0xc,%esp
1104fd: 53 push %ebx
1104fe: e8 b1 7c ff ff call 1081b4 <free>
}
return success != 0 ? 0 : -1;
110503: 83 c4 10 add $0x10,%esp
110506: 83 ff 01 cmp $0x1,%edi
110509: 19 c0 sbb %eax,%eax
}
11050b: 8d 65 f4 lea -0xc(%ebp),%esp
11050e: 5b pop %ebx
11050f: 5e pop %esi
110510: 5f pop %edi
110511: c9 leave
110512: c3 ret
errno = ENOTDIR;
retval = 0;
break;
}
if (last)
retval = 2;
110513: bf 02 00 00 00 mov $0x2,%edi
110518: eb e0 jmp 1104fa <rtems_mkdir+0x12e>
} else {
retval = 0;
break;
}
}
if (!last)
11051a: bf 01 00 00 00 mov $0x1,%edi
11051f: eb d9 jmp 1104fa <rtems_mkdir+0x12e>
001148e0 <rtems_partition_create>:
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
1148e0: 55 push %ebp
1148e1: 89 e5 mov %esp,%ebp
1148e3: 57 push %edi
1148e4: 56 push %esi
1148e5: 53 push %ebx
1148e6: 83 ec 1c sub $0x1c,%esp
1148e9: 8b 75 0c mov 0xc(%ebp),%esi
1148ec: 8b 55 10 mov 0x10(%ebp),%edx
1148ef: 8b 7d 14 mov 0x14(%ebp),%edi
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
1148f2: b8 03 00 00 00 mov $0x3,%eax
rtems_id *id
)
{
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
1148f7: 83 7d 08 00 cmpl $0x0,0x8(%ebp)
1148fb: 0f 84 ce 00 00 00 je 1149cf <rtems_partition_create+0xef>
return RTEMS_INVALID_NAME;
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
114901: b0 09 mov $0x9,%al
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !starting_address )
114903: 85 f6 test %esi,%esi
114905: 0f 84 c4 00 00 00 je 1149cf <rtems_partition_create+0xef>
return RTEMS_INVALID_ADDRESS;
if ( !id )
11490b: 83 7d 1c 00 cmpl $0x0,0x1c(%ebp)
11490f: 0f 84 ba 00 00 00 je 1149cf <rtems_partition_create+0xef><== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
114915: 85 ff test %edi,%edi
114917: 0f 84 ad 00 00 00 je 1149ca <rtems_partition_create+0xea>
11491d: 85 d2 test %edx,%edx
11491f: 0f 84 a5 00 00 00 je 1149ca <rtems_partition_create+0xea>
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
114925: b0 08 mov $0x8,%al
return RTEMS_INVALID_ADDRESS;
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
114927: 39 fa cmp %edi,%edx
114929: 0f 82 a0 00 00 00 jb 1149cf <rtems_partition_create+0xef>
11492f: f7 c7 03 00 00 00 test $0x3,%edi
114935: 0f 85 94 00 00 00 jne 1149cf <rtems_partition_create+0xef>
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
return RTEMS_INVALID_ADDRESS;
11493b: b0 09 mov $0x9,%al
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
11493d: f7 c6 03 00 00 00 test $0x3,%esi
114943: 0f 85 86 00 00 00 jne 1149cf <rtems_partition_create+0xef>
114949: a1 d4 f0 13 00 mov 0x13f0d4,%eax
11494e: 40 inc %eax
11494f: a3 d4 f0 13 00 mov %eax,0x13f0d4
* 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 );
114954: 83 ec 0c sub $0xc,%esp
114957: 68 64 ef 13 00 push $0x13ef64
11495c: 89 55 e4 mov %edx,-0x1c(%ebp)
11495f: e8 20 3e 00 00 call 118784 <_Objects_Allocate>
114964: 89 c3 mov %eax,%ebx
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
114966: 83 c4 10 add $0x10,%esp
114969: 85 c0 test %eax,%eax
11496b: 8b 55 e4 mov -0x1c(%ebp),%edx
11496e: 75 0c jne 11497c <rtems_partition_create+0x9c>
_Thread_Enable_dispatch();
114970: e8 29 4d 00 00 call 11969e <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
114975: b8 05 00 00 00 mov $0x5,%eax
11497a: eb 53 jmp 1149cf <rtems_partition_create+0xef>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
11497c: 89 70 10 mov %esi,0x10(%eax)
the_partition->length = length;
11497f: 89 50 14 mov %edx,0x14(%eax)
the_partition->buffer_size = buffer_size;
114982: 89 78 18 mov %edi,0x18(%eax)
the_partition->attribute_set = attribute_set;
114985: 8b 45 18 mov 0x18(%ebp),%eax
114988: 89 43 1c mov %eax,0x1c(%ebx)
the_partition->number_of_used_blocks = 0;
11498b: c7 43 20 00 00 00 00 movl $0x0,0x20(%ebx)
_Chain_Initialize( &the_partition->Memory, starting_address,
114992: 57 push %edi
114993: 89 d0 mov %edx,%eax
114995: 31 d2 xor %edx,%edx
114997: f7 f7 div %edi
114999: 50 push %eax
11499a: 56 push %esi
11499b: 8d 43 24 lea 0x24(%ebx),%eax
11499e: 50 push %eax
11499f: e8 84 2a 00 00 call 117428 <_Chain_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
1149a4: 8b 43 08 mov 0x8(%ebx),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
1149a7: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
1149aa: 8b 15 80 ef 13 00 mov 0x13ef80,%edx
1149b0: 89 1c 8a mov %ebx,(%edx,%ecx,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
1149b3: 8b 55 08 mov 0x8(%ebp),%edx
1149b6: 89 53 0c mov %edx,0xc(%ebx)
&_Partition_Information,
&the_partition->Object,
(Objects_Name) name
);
*id = the_partition->Object.id;
1149b9: 8b 55 1c mov 0x1c(%ebp),%edx
1149bc: 89 02 mov %eax,(%edx)
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
1149be: e8 db 4c 00 00 call 11969e <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
1149c3: 83 c4 10 add $0x10,%esp
1149c6: 31 c0 xor %eax,%eax
1149c8: eb 05 jmp 1149cf <rtems_partition_create+0xef>
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;
1149ca: b8 08 00 00 00 mov $0x8,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
1149cf: 8d 65 f4 lea -0xc(%ebp),%esp
1149d2: 5b pop %ebx
1149d3: 5e pop %esi
1149d4: 5f pop %edi
1149d5: c9 leave
1149d6: c3 ret
0010b085 <rtems_rate_monotonic_period>:
rtems_status_code rtems_rate_monotonic_period(
rtems_id id,
rtems_interval length
)
{
10b085: 55 push %ebp
10b086: 89 e5 mov %esp,%ebp
10b088: 57 push %edi
10b089: 56 push %esi
10b08a: 53 push %ebx
10b08b: 83 ec 30 sub $0x30,%esp
10b08e: 8b 75 08 mov 0x8(%ebp),%esi
10b091: 8b 5d 0c mov 0xc(%ebp),%ebx
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 );
10b094: 8d 45 e4 lea -0x1c(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Rate_monotonic_Control *)
_Objects_Get( &_Rate_monotonic_Information, id, location );
10b097: 50 push %eax
10b098: 56 push %esi
10b099: 68 74 83 12 00 push $0x128374
10b09e: e8 39 1e 00 00 call 10cedc <_Objects_Get>
10b0a3: 89 c7 mov %eax,%edi
switch ( location ) {
10b0a5: 83 c4 10 add $0x10,%esp
10b0a8: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp)
10b0ac: 0f 85 3b 01 00 00 jne 10b1ed <rtems_rate_monotonic_period+0x168>
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
10b0b2: a1 8c 89 12 00 mov 0x12898c,%eax
10b0b7: 39 47 40 cmp %eax,0x40(%edi)
10b0ba: 74 0f je 10b0cb <rtems_rate_monotonic_period+0x46>
_Thread_Enable_dispatch();
10b0bc: e8 cd 28 00 00 call 10d98e <_Thread_Enable_dispatch>
return RTEMS_NOT_OWNER_OF_RESOURCE;
10b0c1: be 17 00 00 00 mov $0x17,%esi
10b0c6: e9 27 01 00 00 jmp 10b1f2 <rtems_rate_monotonic_period+0x16d>
}
if ( length == RTEMS_PERIOD_STATUS ) {
10b0cb: 85 db test %ebx,%ebx
10b0cd: 75 1b jne 10b0ea <rtems_rate_monotonic_period+0x65>
switch ( the_period->state ) {
10b0cf: 8b 47 38 mov 0x38(%edi),%eax
10b0d2: 31 f6 xor %esi,%esi
10b0d4: 83 f8 04 cmp $0x4,%eax
10b0d7: 77 07 ja 10b0e0 <rtems_rate_monotonic_period+0x5b><== NEVER TAKEN
10b0d9: 8b 34 85 8c 16 12 00 mov 0x12168c(,%eax,4),%esi
case RATE_MONOTONIC_ACTIVE:
default: /* unreached -- only to remove warnings */
return_value = RTEMS_SUCCESSFUL;
break;
}
_Thread_Enable_dispatch();
10b0e0: e8 a9 28 00 00 call 10d98e <_Thread_Enable_dispatch>
return( return_value );
10b0e5: e9 08 01 00 00 jmp 10b1f2 <rtems_rate_monotonic_period+0x16d>
}
_ISR_Disable( level );
10b0ea: 9c pushf
10b0eb: fa cli
10b0ec: 8f 45 d4 popl -0x2c(%ebp)
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
10b0ef: 8b 47 38 mov 0x38(%edi),%eax
10b0f2: 85 c0 test %eax,%eax
10b0f4: 75 4c jne 10b142 <rtems_rate_monotonic_period+0xbd>
_ISR_Enable( level );
10b0f6: ff 75 d4 pushl -0x2c(%ebp)
10b0f9: 9d popf
/*
* Baseline statistics information for the beginning of a period.
*/
_Rate_monotonic_Initiate_statistics( the_period );
10b0fa: 83 ec 0c sub $0xc,%esp
10b0fd: 57 push %edi
10b0fe: e8 3f fe ff ff call 10af42 <_Rate_monotonic_Initiate_statistics>
the_period->state = RATE_MONOTONIC_ACTIVE;
10b103: c7 47 38 02 00 00 00 movl $0x2,0x38(%edi)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10b10a: c7 47 18 00 00 00 00 movl $0x0,0x18(%edi)
the_watchdog->routine = routine;
10b111: c7 47 2c fc b3 10 00 movl $0x10b3fc,0x2c(%edi)
the_watchdog->id = id;
10b118: 89 77 30 mov %esi,0x30(%edi)
the_watchdog->user_data = user_data;
10b11b: c7 47 34 00 00 00 00 movl $0x0,0x34(%edi)
_Rate_monotonic_Timeout,
id,
NULL
);
the_period->next_length = length;
10b122: 89 5f 3c mov %ebx,0x3c(%edi)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10b125: 89 5f 1c mov %ebx,0x1c(%edi)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10b128: 58 pop %eax
10b129: 5a pop %edx
_Watchdog_Insert_ticks( &the_period->Timer, length );
10b12a: 83 c7 10 add $0x10,%edi
10b12d: 57 push %edi
10b12e: 68 28 85 12 00 push $0x128528
10b133: e8 68 35 00 00 call 10e6a0 <_Watchdog_Insert>
_Thread_Enable_dispatch();
10b138: e8 51 28 00 00 call 10d98e <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10b13d: 83 c4 10 add $0x10,%esp
10b140: eb 65 jmp 10b1a7 <rtems_rate_monotonic_period+0x122>
}
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
10b142: 83 f8 02 cmp $0x2,%eax
10b145: 75 64 jne 10b1ab <rtems_rate_monotonic_period+0x126>
/*
* Update statistics from the concluding period.
*/
_Rate_monotonic_Update_statistics( the_period );
10b147: 83 ec 0c sub $0xc,%esp
10b14a: 57 push %edi
10b14b: e8 5a fe ff ff call 10afaa <_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;
10b150: c7 47 38 01 00 00 00 movl $0x1,0x38(%edi)
the_period->next_length = length;
10b157: 89 5f 3c mov %ebx,0x3c(%edi)
_ISR_Enable( level );
10b15a: ff 75 d4 pushl -0x2c(%ebp)
10b15d: 9d popf
_Thread_Executing->Wait.id = the_period->Object.id;
10b15e: a1 8c 89 12 00 mov 0x12898c,%eax
10b163: 8b 57 08 mov 0x8(%edi),%edx
10b166: 89 50 20 mov %edx,0x20(%eax)
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
10b169: 5b pop %ebx
10b16a: 5e pop %esi
10b16b: 68 00 40 00 00 push $0x4000
10b170: 50 push %eax
10b171: e8 8a 2f 00 00 call 10e100 <_Thread_Set_state>
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
10b176: 9c pushf
10b177: fa cli
10b178: 5a pop %edx
local_state = the_period->state;
10b179: 8b 47 38 mov 0x38(%edi),%eax
the_period->state = RATE_MONOTONIC_ACTIVE;
10b17c: c7 47 38 02 00 00 00 movl $0x2,0x38(%edi)
_ISR_Enable( level );
10b183: 52 push %edx
10b184: 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 )
10b185: 83 c4 10 add $0x10,%esp
10b188: 83 f8 03 cmp $0x3,%eax
10b18b: 75 15 jne 10b1a2 <rtems_rate_monotonic_period+0x11d>
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
10b18d: 51 push %ecx
10b18e: 51 push %ecx
10b18f: 68 00 40 00 00 push $0x4000
10b194: ff 35 8c 89 12 00 pushl 0x12898c
10b19a: e8 d9 24 00 00 call 10d678 <_Thread_Clear_state>
10b19f: 83 c4 10 add $0x10,%esp
_Thread_Enable_dispatch();
10b1a2: e8 e7 27 00 00 call 10d98e <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10b1a7: 31 f6 xor %esi,%esi
10b1a9: eb 47 jmp 10b1f2 <rtems_rate_monotonic_period+0x16d>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b1ab: be 04 00 00 00 mov $0x4,%esi
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_EXPIRED ) {
10b1b0: 83 f8 04 cmp $0x4,%eax
10b1b3: 75 3d jne 10b1f2 <rtems_rate_monotonic_period+0x16d><== NEVER TAKEN
/*
* Update statistics from the concluding period
*/
_Rate_monotonic_Update_statistics( the_period );
10b1b5: 83 ec 0c sub $0xc,%esp
10b1b8: 57 push %edi
10b1b9: e8 ec fd ff ff call 10afaa <_Rate_monotonic_Update_statistics>
_ISR_Enable( level );
10b1be: ff 75 d4 pushl -0x2c(%ebp)
10b1c1: 9d popf
the_period->state = RATE_MONOTONIC_ACTIVE;
10b1c2: c7 47 38 02 00 00 00 movl $0x2,0x38(%edi)
the_period->next_length = length;
10b1c9: 89 5f 3c mov %ebx,0x3c(%edi)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10b1cc: 89 5f 1c mov %ebx,0x1c(%edi)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10b1cf: 58 pop %eax
10b1d0: 5a pop %edx
_Watchdog_Insert_ticks( &the_period->Timer, length );
10b1d1: 83 c7 10 add $0x10,%edi
10b1d4: 57 push %edi
10b1d5: 68 28 85 12 00 push $0x128528
10b1da: e8 c1 34 00 00 call 10e6a0 <_Watchdog_Insert>
_Thread_Enable_dispatch();
10b1df: e8 aa 27 00 00 call 10d98e <_Thread_Enable_dispatch>
return RTEMS_TIMEOUT;
10b1e4: 83 c4 10 add $0x10,%esp
10b1e7: 66 be 06 00 mov $0x6,%si
10b1eb: eb 05 jmp 10b1f2 <rtems_rate_monotonic_period+0x16d>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b1ed: be 04 00 00 00 mov $0x4,%esi
}
10b1f2: 89 f0 mov %esi,%eax
10b1f4: 8d 65 f4 lea -0xc(%ebp),%esp
10b1f7: 5b pop %ebx
10b1f8: 5e pop %esi
10b1f9: 5f pop %edi
10b1fa: c9 leave
10b1fb: c3 ret
0010b1fc <rtems_rate_monotonic_report_statistics_with_plugin>:
*/
void rtems_rate_monotonic_report_statistics_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
10b1fc: 55 push %ebp
10b1fd: 89 e5 mov %esp,%ebp
10b1ff: 57 push %edi
10b200: 56 push %esi
10b201: 53 push %ebx
10b202: 83 ec 7c sub $0x7c,%esp
10b205: 8b 5d 08 mov 0x8(%ebp),%ebx
10b208: 8b 7d 0c mov 0xc(%ebp),%edi
rtems_id id;
rtems_rate_monotonic_period_statistics the_stats;
rtems_rate_monotonic_period_status the_status;
char name[5];
if ( !print )
10b20b: 85 ff test %edi,%edi
10b20d: 0f 84 2b 01 00 00 je 10b33e <rtems_rate_monotonic_report_statistics_with_plugin+0x142><== NEVER TAKEN
return;
(*print)( context, "Period information by period\n" );
10b213: 52 push %edx
10b214: 52 push %edx
10b215: 68 a0 16 12 00 push $0x1216a0
10b21a: 53 push %ebx
10b21b: ff d7 call *%edi
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)( context, "--- CPU times are in seconds ---\n" );
10b21d: 5e pop %esi
10b21e: 58 pop %eax
10b21f: 68 be 16 12 00 push $0x1216be
10b224: 53 push %ebx
10b225: ff d7 call *%edi
(*print)( context, "--- Wall times are in seconds ---\n" );
10b227: 5a pop %edx
10b228: 59 pop %ecx
10b229: 68 e0 16 12 00 push $0x1216e0
10b22e: 53 push %ebx
10b22f: ff d7 call *%edi
Be sure to test the various cases.
(*print)( context,"\
1234567890123456789012345678901234567890123456789012345678901234567890123456789\
\n");
*/
(*print)( context, " ID OWNER COUNT MISSED "
10b231: 5e pop %esi
10b232: 58 pop %eax
10b233: 68 03 17 12 00 push $0x121703
10b238: 53 push %ebx
10b239: ff d7 call *%edi
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
10b23b: 5a pop %edx
10b23c: 59 pop %ecx
10b23d: 68 4e 17 12 00 push $0x12174e
10b242: 53 push %ebx
10b243: ff d7 call *%edi
/*
* 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 ;
10b245: 8b 35 7c 83 12 00 mov 0x12837c,%esi
10b24b: 83 c4 10 add $0x10,%esp
10b24e: e9 df 00 00 00 jmp 10b332 <rtems_rate_monotonic_report_statistics_with_plugin+0x136>
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
status = rtems_rate_monotonic_get_statistics( id, &the_stats );
10b253: 50 push %eax
10b254: 50 push %eax
10b255: 8d 45 88 lea -0x78(%ebp),%eax
10b258: 50 push %eax
10b259: 56 push %esi
10b25a: e8 c1 56 00 00 call 110920 <rtems_rate_monotonic_get_statistics>
if ( status != RTEMS_SUCCESSFUL )
10b25f: 83 c4 10 add $0x10,%esp
10b262: 85 c0 test %eax,%eax
10b264: 0f 85 c7 00 00 00 jne 10b331 <rtems_rate_monotonic_report_statistics_with_plugin+0x135>
#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 );
10b26a: 51 push %ecx
10b26b: 51 push %ecx
10b26c: 8d 55 c0 lea -0x40(%ebp),%edx
10b26f: 52 push %edx
10b270: 56 push %esi
10b271: e8 4e 57 00 00 call 1109c4 <rtems_rate_monotonic_get_status>
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
10b276: 83 c4 0c add $0xc,%esp
10b279: 8d 45 e3 lea -0x1d(%ebp),%eax
10b27c: 50 push %eax
10b27d: 6a 05 push $0x5
10b27f: ff 75 c0 pushl -0x40(%ebp)
10b282: e8 01 02 00 00 call 10b488 <rtems_object_get_name>
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
10b287: 58 pop %eax
10b288: 5a pop %edx
10b289: ff 75 8c pushl -0x74(%ebp)
10b28c: ff 75 88 pushl -0x78(%ebp)
10b28f: 8d 55 e3 lea -0x1d(%ebp),%edx
10b292: 52 push %edx
10b293: 56 push %esi
10b294: 68 9a 17 12 00 push $0x12179a
10b299: 53 push %ebx
10b29a: ff d7 call *%edi
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
10b29c: 8b 45 88 mov -0x78(%ebp),%eax
10b29f: 83 c4 20 add $0x20,%esp
10b2a2: 85 c0 test %eax,%eax
10b2a4: 75 0f jne 10b2b5 <rtems_rate_monotonic_report_statistics_with_plugin+0xb9>
(*print)( context, "\n" );
10b2a6: 51 push %ecx
10b2a7: 51 push %ecx
10b2a8: 68 04 1a 12 00 push $0x121a04
10b2ad: 53 push %ebx
10b2ae: ff d7 call *%edi
continue;
10b2b0: 83 c4 10 add $0x10,%esp
10b2b3: eb 7c jmp 10b331 <rtems_rate_monotonic_report_statistics_with_plugin+0x135>
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 );
10b2b5: 52 push %edx
10b2b6: 8d 55 d8 lea -0x28(%ebp),%edx
10b2b9: 52 push %edx
10b2ba: 50 push %eax
10b2bb: 8d 45 a0 lea -0x60(%ebp),%eax
10b2be: 50 push %eax
10b2bf: e8 b0 30 00 00 call 10e374 <_Timespec_Divide_by_integer>
(*print)( context,
10b2c4: 8b 45 dc mov -0x24(%ebp),%eax
10b2c7: b9 e8 03 00 00 mov $0x3e8,%ecx
10b2cc: 99 cltd
10b2cd: f7 f9 idiv %ecx
10b2cf: 50 push %eax
10b2d0: ff 75 d8 pushl -0x28(%ebp)
10b2d3: 8b 45 9c mov -0x64(%ebp),%eax
10b2d6: 99 cltd
10b2d7: f7 f9 idiv %ecx
10b2d9: 50 push %eax
10b2da: ff 75 98 pushl -0x68(%ebp)
10b2dd: 8b 45 94 mov -0x6c(%ebp),%eax
10b2e0: 99 cltd
10b2e1: f7 f9 idiv %ecx
10b2e3: 50 push %eax
10b2e4: ff 75 90 pushl -0x70(%ebp)
10b2e7: 68 b1 17 12 00 push $0x1217b1
10b2ec: 53 push %ebx
10b2ed: 89 4d 84 mov %ecx,-0x7c(%ebp)
10b2f0: ff d7 call *%edi
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);
10b2f2: 83 c4 2c add $0x2c,%esp
10b2f5: 8d 55 d8 lea -0x28(%ebp),%edx
10b2f8: 52 push %edx
10b2f9: ff 75 88 pushl -0x78(%ebp)
{
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
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;
10b2fc: 8d 45 b8 lea -0x48(%ebp),%eax
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
10b2ff: 50 push %eax
10b300: e8 6f 30 00 00 call 10e374 <_Timespec_Divide_by_integer>
(*print)( context,
10b305: 8b 45 dc mov -0x24(%ebp),%eax
10b308: 8b 4d 84 mov -0x7c(%ebp),%ecx
10b30b: 99 cltd
10b30c: f7 f9 idiv %ecx
10b30e: 50 push %eax
10b30f: ff 75 d8 pushl -0x28(%ebp)
10b312: 8b 45 b4 mov -0x4c(%ebp),%eax
10b315: 99 cltd
10b316: f7 f9 idiv %ecx
10b318: 50 push %eax
10b319: ff 75 b0 pushl -0x50(%ebp)
10b31c: 8b 45 ac mov -0x54(%ebp),%eax
10b31f: 99 cltd
10b320: f7 f9 idiv %ecx
10b322: 50 push %eax
10b323: ff 75 a8 pushl -0x58(%ebp)
10b326: 68 d0 17 12 00 push $0x1217d0
10b32b: 53 push %ebx
10b32c: ff d7 call *%edi
10b32e: 83 c4 30 add $0x30,%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++ ) {
10b331: 46 inc %esi
/*
* 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 ;
10b332: 3b 35 80 83 12 00 cmp 0x128380,%esi
10b338: 0f 86 15 ff ff ff jbe 10b253 <rtems_rate_monotonic_report_statistics_with_plugin+0x57>
the_stats.min_wall_time, the_stats.max_wall_time, ival_wall, fval_wall
);
#endif
}
}
}
10b33e: 8d 65 f4 lea -0xc(%ebp),%esp
10b341: 5b pop %ebx
10b342: 5e pop %esi
10b343: 5f pop %edi
10b344: c9 leave
10b345: c3 ret
00115c40 <rtems_signal_send>:
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
115c40: 55 push %ebp
115c41: 89 e5 mov %esp,%ebp
115c43: 53 push %ebx
115c44: 83 ec 14 sub $0x14,%esp
115c47: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
115c4a: b8 0a 00 00 00 mov $0xa,%eax
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
115c4f: 85 db test %ebx,%ebx
115c51: 74 6d je 115cc0 <rtems_signal_send+0x80>
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
115c53: 50 push %eax
115c54: 50 push %eax
115c55: 8d 45 f4 lea -0xc(%ebp),%eax
115c58: 50 push %eax
115c59: ff 75 08 pushl 0x8(%ebp)
115c5c: e8 5f 3a 00 00 call 1196c0 <_Thread_Get>
switch ( location ) {
115c61: 83 c4 10 add $0x10,%esp
115c64: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
115c68: 75 51 jne 115cbb <rtems_signal_send+0x7b>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
115c6a: 8b 90 e8 00 00 00 mov 0xe8(%eax),%edx
asr = &api->Signal;
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
115c70: 83 7a 0c 00 cmpl $0x0,0xc(%edx)
115c74: 74 39 je 115caf <rtems_signal_send+0x6f>
if ( asr->is_enabled ) {
115c76: 80 7a 08 00 cmpb $0x0,0x8(%edx)
115c7a: 74 22 je 115c9e <rtems_signal_send+0x5e>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
115c7c: 9c pushf
115c7d: fa cli
115c7e: 59 pop %ecx
*signal_set |= signals;
115c7f: 09 5a 14 or %ebx,0x14(%edx)
_ISR_Enable( _level );
115c82: 51 push %ecx
115c83: 9d popf
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
115c84: 83 3d 00 f6 13 00 00 cmpl $0x0,0x13f600
115c8b: 74 19 je 115ca6 <rtems_signal_send+0x66>
115c8d: 3b 05 04 f6 13 00 cmp 0x13f604,%eax
115c93: 75 11 jne 115ca6 <rtems_signal_send+0x66><== NEVER TAKEN
_Thread_Dispatch_necessary = true;
115c95: c6 05 10 f6 13 00 01 movb $0x1,0x13f610
115c9c: eb 08 jmp 115ca6 <rtems_signal_send+0x66>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
115c9e: 9c pushf
115c9f: fa cli
115ca0: 58 pop %eax
*signal_set |= signals;
115ca1: 09 5a 18 or %ebx,0x18(%edx)
_ISR_Enable( _level );
115ca4: 50 push %eax
115ca5: 9d popf
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
115ca6: e8 f3 39 00 00 call 11969e <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
115cab: 31 c0 xor %eax,%eax
115cad: eb 11 jmp 115cc0 <rtems_signal_send+0x80>
}
_Thread_Enable_dispatch();
115caf: e8 ea 39 00 00 call 11969e <_Thread_Enable_dispatch>
return RTEMS_NOT_DEFINED;
115cb4: b8 0b 00 00 00 mov $0xb,%eax
115cb9: eb 05 jmp 115cc0 <rtems_signal_send+0x80>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
115cbb: b8 04 00 00 00 mov $0x4,%eax
}
115cc0: 8b 5d fc mov -0x4(%ebp),%ebx
115cc3: c9 leave
115cc4: c3 ret
001072f4 <rtems_stack_checker_begin_extension>:
* rtems_stack_checker_Begin_extension
*/
void rtems_stack_checker_begin_extension(
Thread_Control *the_thread
)
{
1072f4: 55 push %ebp
1072f5: 89 e5 mov %esp,%ebp
1072f7: 57 push %edi
1072f8: 56 push %esi
1072f9: 8b 45 08 mov 0x8(%ebp),%eax
Stack_check_Control *the_pattern;
if ( the_thread->Object.id == 0 ) /* skip system tasks */
1072fc: 83 78 08 00 cmpl $0x0,0x8(%eax)
107300: 74 15 je 107317 <rtems_stack_checker_begin_extension+0x23><== NEVER TAKEN
return;
the_pattern = Stack_check_Get_pattern_area(&the_thread->Start.Initial_stack);
*the_pattern = Stack_check_Pattern;
107302: 8b b8 bc 00 00 00 mov 0xbc(%eax),%edi
107308: 83 c7 08 add $0x8,%edi
10730b: be 28 72 12 00 mov $0x127228,%esi
107310: b9 04 00 00 00 mov $0x4,%ecx
107315: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
}
107317: 5e pop %esi
107318: 5f pop %edi
107319: c9 leave
10731a: c3 ret
001072cd <rtems_stack_checker_create_extension>:
*/
bool rtems_stack_checker_create_extension(
Thread_Control *running __attribute__((unused)),
Thread_Control *the_thread
)
{
1072cd: 55 push %ebp
1072ce: 89 e5 mov %esp,%ebp
1072d0: 57 push %edi
1072d1: 8b 7d 0c mov 0xc(%ebp),%edi
Stack_check_Initialize();
1072d4: e8 8a ff ff ff call 107263 <Stack_check_Initialize>
if (the_thread)
1072d9: 85 ff test %edi,%edi
1072db: 74 12 je 1072ef <rtems_stack_checker_create_extension+0x22><== NEVER TAKEN
Stack_check_Dope_stack(&the_thread->Start.Initial_stack);
1072dd: 8b 8f b8 00 00 00 mov 0xb8(%edi),%ecx
1072e3: 8b 97 bc 00 00 00 mov 0xbc(%edi),%edx
1072e9: b0 a5 mov $0xa5,%al
1072eb: 89 d7 mov %edx,%edi
1072ed: f3 aa rep stos %al,%es:(%edi)
return true;
}
1072ef: b0 01 mov $0x1,%al
1072f1: 5f pop %edi
1072f2: c9 leave
1072f3: c3 ret
00107428 <rtems_stack_checker_is_blown>:
/*
* Check if blown
*/
bool rtems_stack_checker_is_blown( void )
{
107428: 55 push %ebp
107429: 89 e5 mov %esp,%ebp
10742b: 53 push %ebx
10742c: 83 ec 04 sub $0x4,%esp
Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack;
10742f: a1 1c 79 12 00 mov 0x12791c,%eax
)
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
107434: 8b 90 bc 00 00 00 mov 0xbc(%eax),%edx
return false;
10743a: 31 db xor %ebx,%ebx
)
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
10743c: 39 d5 cmp %edx,%ebp
10743e: 72 0e jb 10744e <rtems_stack_checker_is_blown+0x26><== NEVER TAKEN
return false;
}
if ( sp > (the_stack->area + the_stack->size) ) {
107440: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax
107446: 8d 04 02 lea (%edx,%eax,1),%eax
}
/*
* Check if blown
*/
bool rtems_stack_checker_is_blown( void )
107449: 39 c5 cmp %eax,%ebp
10744b: 0f 96 c3 setbe %bl
{
Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack;
bool sp_ok;
bool pattern_ok = true;
10744e: b0 01 mov $0x1,%al
/*
* The stack checker must be initialized before the pattern is there
* to check.
*/
if ( Stack_check_Initialized ) {
107450: 83 3d 18 6f 12 00 00 cmpl $0x0,0x126f18
107457: 74 19 je 107472 <rtems_stack_checker_is_blown+0x4a><== NEVER TAKEN
pattern_ok = (!memcmp(
107459: 83 c2 08 add $0x8,%edx
10745c: 51 push %ecx
10745d: 6a 10 push $0x10
10745f: 68 28 72 12 00 push $0x127228
107464: 52 push %edx
107465: e8 4a cb 00 00 call 113fb4 <memcmp>
10746a: 83 c4 10 add $0x10,%esp
10746d: 85 c0 test %eax,%eax
10746f: 0f 94 c0 sete %al
/*
* Let's report as much as we can.
*/
if ( !sp_ok || !pattern_ok ) {
107472: 84 db test %bl,%bl
107474: 74 04 je 10747a <rtems_stack_checker_is_blown+0x52><== NEVER TAKEN
107476: 84 c0 test %al,%al
107478: 75 11 jne 10748b <rtems_stack_checker_is_blown+0x63><== ALWAYS TAKEN
Stack_check_report_blown_task( _Thread_Executing, pattern_ok );
10747a: 52 push %edx <== NOT EXECUTED
10747b: 52 push %edx <== NOT EXECUTED
10747c: 0f b6 c0 movzbl %al,%eax <== NOT EXECUTED
10747f: 50 push %eax <== NOT EXECUTED
107480: ff 35 1c 79 12 00 pushl 0x12791c <== NOT EXECUTED
107486: e8 90 fe ff ff call 10731b <Stack_check_report_blown_task><== NOT EXECUTED
/*
* The Stack Pointer and the Pattern Area are OK so return false.
*/
return false;
}
10748b: 31 c0 xor %eax,%eax
10748d: 8b 5d fc mov -0x4(%ebp),%ebx
107490: c9 leave
107491: c3 ret
001074f7 <rtems_stack_checker_report_usage>:
void rtems_stack_checker_report_usage( void )
{
1074f7: 55 push %ebp <== NOT EXECUTED
1074f8: 89 e5 mov %esp,%ebp <== NOT EXECUTED
1074fa: 83 ec 10 sub $0x10,%esp <== NOT EXECUTED
rtems_stack_checker_report_usage_with_plugin( NULL, printk_plugin );
1074fd: 68 80 8c 10 00 push $0x108c80 <== NOT EXECUTED
107502: 6a 00 push $0x0 <== NOT EXECUTED
107504: e8 89 ff ff ff call 107492 <rtems_stack_checker_report_usage_with_plugin><== NOT EXECUTED
107509: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
10750c: c9 leave <== NOT EXECUTED
10750d: c3 ret <== NOT EXECUTED
00107492 <rtems_stack_checker_report_usage_with_plugin>:
void rtems_stack_checker_report_usage_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
107492: 55 push %ebp <== NOT EXECUTED
107493: 89 e5 mov %esp,%ebp <== NOT EXECUTED
107495: 56 push %esi <== NOT EXECUTED
107496: 53 push %ebx <== NOT EXECUTED
107497: 8b 75 08 mov 0x8(%ebp),%esi <== NOT EXECUTED
10749a: 8b 5d 0c mov 0xc(%ebp),%ebx <== NOT EXECUTED
if ( !print )
10749d: 85 db test %ebx,%ebx <== NOT EXECUTED
10749f: 74 4f je 1074f0 <rtems_stack_checker_report_usage_with_plugin+0x5e><== NOT EXECUTED
return;
print_context = context;
1074a1: 89 35 10 6f 12 00 mov %esi,0x126f10 <== NOT EXECUTED
print_handler = print;
1074a7: 89 1d 14 6f 12 00 mov %ebx,0x126f14 <== NOT EXECUTED
(*print)( context, "Stack usage by thread\n");
1074ad: 51 push %ecx <== NOT EXECUTED
1074ae: 51 push %ecx <== NOT EXECUTED
1074af: 68 73 17 12 00 push $0x121773 <== NOT EXECUTED
1074b4: 56 push %esi <== NOT EXECUTED
1074b5: ff d3 call *%ebx <== NOT EXECUTED
(*print)( context,
1074b7: 58 pop %eax <== NOT EXECUTED
1074b8: 5a pop %edx <== NOT EXECUTED
1074b9: 68 8a 17 12 00 push $0x12178a <== NOT EXECUTED
1074be: 56 push %esi <== NOT EXECUTED
1074bf: 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 );
1074c1: c7 04 24 48 71 10 00 movl $0x107148,(%esp) <== NOT EXECUTED
1074c8: e8 fb 63 00 00 call 10d8c8 <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);
1074cd: c7 04 24 ff ff ff ff movl $0xffffffff,(%esp) <== NOT EXECUTED
1074d4: e8 6f fc ff ff call 107148 <Stack_check_Dump_threads_usage><== NOT EXECUTED
#endif
print_context = NULL;
1074d9: c7 05 10 6f 12 00 00 movl $0x0,0x126f10 <== NOT EXECUTED
1074e0: 00 00 00
print_handler = NULL;
1074e3: c7 05 14 6f 12 00 00 movl $0x0,0x126f14 <== NOT EXECUTED
1074ea: 00 00 00
1074ed: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
1074f0: 8d 65 f8 lea -0x8(%ebp),%esp <== NOT EXECUTED
1074f3: 5b pop %ebx <== NOT EXECUTED
1074f4: 5e pop %esi <== NOT EXECUTED
1074f5: c9 leave <== NOT EXECUTED
1074f6: c3 ret <== NOT EXECUTED
001073cf <rtems_stack_checker_switch_extension>:
*/
void rtems_stack_checker_switch_extension(
Thread_Control *running __attribute__((unused)),
Thread_Control *heir __attribute__((unused))
)
{
1073cf: 55 push %ebp
1073d0: 89 e5 mov %esp,%ebp
1073d2: 53 push %ebx
1073d3: 83 ec 14 sub $0x14,%esp
1073d6: 8b 5d 08 mov 0x8(%ebp),%ebx
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);
1073d9: 8b 83 bc 00 00 00 mov 0xbc(%ebx),%eax
1073df: 8d 48 08 lea 0x8(%eax),%ecx
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
return false;
1073e2: 31 d2 xor %edx,%edx
)
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
1073e4: 39 c5 cmp %eax,%ebp
1073e6: 72 0b jb 1073f3 <rtems_stack_checker_switch_extension+0x24><== NEVER TAKEN
return false;
}
if ( sp > (the_stack->area + the_stack->size) ) {
1073e8: 03 83 b8 00 00 00 add 0xb8(%ebx),%eax
}
/*
* rtems_stack_checker_switch_extension
*/
void rtems_stack_checker_switch_extension(
1073ee: 39 c5 cmp %eax,%ebp
1073f0: 0f 96 c2 setbe %dl
/*
* 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,
1073f3: 50 push %eax
1073f4: 6a 10 push $0x10
1073f6: 68 28 72 12 00 push $0x127228
1073fb: 51 push %ecx
1073fc: 88 55 f4 mov %dl,-0xc(%ebp)
1073ff: e8 b0 cb 00 00 call 113fb4 <memcmp>
107404: 83 c4 10 add $0x10,%esp
107407: 85 c0 test %eax,%eax
107409: 0f 94 c0 sete %al
(void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES));
if ( !sp_ok || !pattern_ok ) {
10740c: 8a 55 f4 mov -0xc(%ebp),%dl
10740f: 84 d2 test %dl,%dl
107411: 74 04 je 107417 <rtems_stack_checker_switch_extension+0x48><== NEVER TAKEN
107413: 84 c0 test %al,%al
107415: 75 0c jne 107423 <rtems_stack_checker_switch_extension+0x54><== ALWAYS TAKEN
Stack_check_report_blown_task( running, pattern_ok );
107417: 52 push %edx <== NOT EXECUTED
107418: 52 push %edx <== NOT EXECUTED
107419: 0f b6 c0 movzbl %al,%eax <== NOT EXECUTED
10741c: 50 push %eax <== NOT EXECUTED
10741d: 53 push %ebx <== NOT EXECUTED
10741e: e8 f8 fe ff ff call 10731b <Stack_check_report_blown_task><== NOT EXECUTED
}
}
107423: 8b 5d fc mov -0x4(%ebp),%ebx
107426: c9 leave
107427: c3 ret
0010f070 <rtems_string_to_double>:
rtems_status_code rtems_string_to_double (
const char *s,
double *n,
char **endptr
)
{
10f070: 55 push %ebp
10f071: 89 e5 mov %esp,%ebp
10f073: 57 push %edi
10f074: 56 push %esi
10f075: 53 push %ebx
10f076: 83 ec 2c sub $0x2c,%esp
10f079: 8b 75 08 mov 0x8(%ebp),%esi
10f07c: 8b 5d 0c mov 0xc(%ebp),%ebx
10f07f: 8b 7d 10 mov 0x10(%ebp),%edi
double result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
10f082: ba 09 00 00 00 mov $0x9,%edx
)
{
double result;
char *end;
if ( !n )
10f087: 85 db test %ebx,%ebx
10f089: 0f 84 95 00 00 00 je 10f124 <rtems_string_to_double+0xb4>
return RTEMS_INVALID_ADDRESS;
errno = 0;
10f08f: e8 54 2a 00 00 call 111ae8 <__errno>
10f094: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
10f09a: c7 03 00 00 00 00 movl $0x0,(%ebx)
10f0a0: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx)
result = strtod( s, &end );
10f0a7: 50 push %eax
10f0a8: 50 push %eax
10f0a9: 8d 45 e4 lea -0x1c(%ebp),%eax
10f0ac: 50 push %eax
10f0ad: 56 push %esi
10f0ae: e8 e5 54 00 00 call 114598 <strtod>
if ( endptr )
10f0b3: 83 c4 10 add $0x10,%esp
10f0b6: 85 ff test %edi,%edi
10f0b8: 74 05 je 10f0bf <rtems_string_to_double+0x4f>
*endptr = end;
10f0ba: 8b 45 e4 mov -0x1c(%ebp),%eax
10f0bd: 89 07 mov %eax,(%edi)
if ( end == s )
return RTEMS_NOT_DEFINED;
10f0bf: ba 0b 00 00 00 mov $0xb,%edx
result = strtod( s, &end );
if ( endptr )
*endptr = end;
if ( end == s )
10f0c4: 39 75 e4 cmp %esi,-0x1c(%ebp)
10f0c7: 74 4d je 10f116 <rtems_string_to_double+0xa6>
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f0c9: dd 5d c8 fstpl -0x38(%ebp)
10f0cc: e8 17 2a 00 00 call 111ae8 <__errno>
10f0d1: 83 38 22 cmpl $0x22,(%eax)
10f0d4: dd 45 c8 fldl -0x38(%ebp)
10f0d7: 75 37 jne 10f110 <rtems_string_to_double+0xa0>
10f0d9: d9 ee fldz
10f0db: d9 c9 fxch %st(1)
10f0dd: dd e1 fucom %st(1)
10f0df: df e0 fnstsw %ax
10f0e1: dd d9 fstp %st(1)
10f0e3: 9e sahf
10f0e4: 7a 07 jp 10f0ed <rtems_string_to_double+0x7d><== NEVER TAKEN
(( result == 0 ) || ( result == HUGE_VAL ) || ( result == -HUGE_VAL )))
return RTEMS_INVALID_NUMBER;
10f0e6: ba 0a 00 00 00 mov $0xa,%edx
*endptr = end;
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f0eb: 74 2d je 10f11a <rtems_string_to_double+0xaa><== NEVER TAKEN
(( result == 0 ) || ( result == HUGE_VAL ) || ( result == -HUGE_VAL )))
return RTEMS_INVALID_NUMBER;
10f0ed: ba 0a 00 00 00 mov $0xa,%edx
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
(( result == 0 ) || ( result == HUGE_VAL ) || ( result == -HUGE_VAL )))
10f0f2: dd 05 30 3e 12 00 fldl 0x123e30
10f0f8: d9 c9 fxch %st(1)
10f0fa: dd e1 fucom %st(1)
10f0fc: df e0 fnstsw %ax
10f0fe: dd d9 fstp %st(1)
10f100: 9e sahf
10f101: 77 1b ja 10f11e <rtems_string_to_double+0xae><== ALWAYS TAKEN
10f103: dd 05 38 3e 12 00 fldl 0x123e38 <== NOT EXECUTED
10f109: dd e9 fucomp %st(1) <== NOT EXECUTED
10f10b: df e0 fnstsw %ax <== NOT EXECUTED
10f10d: 9e sahf <== NOT EXECUTED
10f10e: 77 12 ja 10f122 <rtems_string_to_double+0xb2><== NOT EXECUTED
return RTEMS_INVALID_NUMBER;
*n = result;
10f110: dd 1b fstpl (%ebx)
return RTEMS_SUCCESSFUL;
10f112: 31 d2 xor %edx,%edx
10f114: eb 0e jmp 10f124 <rtems_string_to_double+0xb4>
10f116: dd d8 fstp %st(0)
10f118: eb 0a jmp 10f124 <rtems_string_to_double+0xb4>
10f11a: dd d8 fstp %st(0) <== NOT EXECUTED
10f11c: eb 06 jmp 10f124 <rtems_string_to_double+0xb4><== NOT EXECUTED
10f11e: dd d8 fstp %st(0)
10f120: eb 02 jmp 10f124 <rtems_string_to_double+0xb4>
10f122: dd d8 fstp %st(0) <== NOT EXECUTED
}
10f124: 89 d0 mov %edx,%eax
10f126: 8d 65 f4 lea -0xc(%ebp),%esp
10f129: 5b pop %ebx
10f12a: 5e pop %esi
10f12b: 5f pop %edi
10f12c: c9 leave
10f12d: c3 ret
0010f130 <rtems_string_to_float>:
rtems_status_code rtems_string_to_float (
const char *s,
float *n,
char **endptr
)
{
10f130: 55 push %ebp
10f131: 89 e5 mov %esp,%ebp
10f133: 57 push %edi
10f134: 56 push %esi
10f135: 53 push %ebx
10f136: 83 ec 2c sub $0x2c,%esp
10f139: 8b 75 08 mov 0x8(%ebp),%esi
10f13c: 8b 5d 0c mov 0xc(%ebp),%ebx
10f13f: 8b 7d 10 mov 0x10(%ebp),%edi
float result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
10f142: ba 09 00 00 00 mov $0x9,%edx
)
{
float result;
char *end;
if ( !n )
10f147: 85 db test %ebx,%ebx
10f149: 0f 84 8e 00 00 00 je 10f1dd <rtems_string_to_float+0xad>
return RTEMS_INVALID_ADDRESS;
errno = 0;
10f14f: e8 94 29 00 00 call 111ae8 <__errno>
10f154: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
10f15a: c7 03 00 00 00 00 movl $0x0,(%ebx)
result = strtof( s, &end );
10f160: 50 push %eax
10f161: 50 push %eax
10f162: 8d 45 e4 lea -0x1c(%ebp),%eax
10f165: 50 push %eax
10f166: 56 push %esi
10f167: e8 48 54 00 00 call 1145b4 <strtof>
if ( endptr )
10f16c: 83 c4 10 add $0x10,%esp
10f16f: 85 ff test %edi,%edi
10f171: 74 05 je 10f178 <rtems_string_to_float+0x48>
*endptr = end;
10f173: 8b 45 e4 mov -0x1c(%ebp),%eax
10f176: 89 07 mov %eax,(%edi)
if ( end == s )
return RTEMS_NOT_DEFINED;
10f178: ba 0b 00 00 00 mov $0xb,%edx
result = strtof( s, &end );
if ( endptr )
*endptr = end;
if ( end == s )
10f17d: 39 75 e4 cmp %esi,-0x1c(%ebp)
10f180: 74 4d je 10f1cf <rtems_string_to_float+0x9f>
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f182: d9 5d c8 fstps -0x38(%ebp)
10f185: e8 5e 29 00 00 call 111ae8 <__errno>
10f18a: 83 38 22 cmpl $0x22,(%eax)
10f18d: d9 45 c8 flds -0x38(%ebp)
10f190: 75 37 jne 10f1c9 <rtems_string_to_float+0x99>
10f192: d9 ee fldz
10f194: d9 c9 fxch %st(1)
10f196: dd e1 fucom %st(1)
10f198: df e0 fnstsw %ax
10f19a: dd d9 fstp %st(1)
10f19c: 9e sahf
10f19d: 7a 07 jp 10f1a6 <rtems_string_to_float+0x76><== NEVER TAKEN
(( result == 0 ) || ( result == HUGE_VALF ) || ( result == -HUGE_VALF )))
return RTEMS_INVALID_NUMBER;
10f19f: ba 0a 00 00 00 mov $0xa,%edx
*endptr = end;
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f1a4: 74 2d je 10f1d3 <rtems_string_to_float+0xa3><== NEVER TAKEN
(( result == 0 ) || ( result == HUGE_VALF ) || ( result == -HUGE_VALF )))
return RTEMS_INVALID_NUMBER;
10f1a6: ba 0a 00 00 00 mov $0xa,%edx
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
(( result == 0 ) || ( result == HUGE_VALF ) || ( result == -HUGE_VALF )))
10f1ab: d9 05 40 3e 12 00 flds 0x123e40
10f1b1: d9 c9 fxch %st(1)
10f1b3: dd e1 fucom %st(1)
10f1b5: df e0 fnstsw %ax
10f1b7: dd d9 fstp %st(1)
10f1b9: 9e sahf
10f1ba: 77 1b ja 10f1d7 <rtems_string_to_float+0xa7><== ALWAYS TAKEN
10f1bc: d9 05 44 3e 12 00 flds 0x123e44 <== NOT EXECUTED
10f1c2: dd e9 fucomp %st(1) <== NOT EXECUTED
10f1c4: df e0 fnstsw %ax <== NOT EXECUTED
10f1c6: 9e sahf <== NOT EXECUTED
10f1c7: 77 12 ja 10f1db <rtems_string_to_float+0xab><== NOT EXECUTED
return RTEMS_INVALID_NUMBER;
*n = result;
10f1c9: d9 1b fstps (%ebx)
return RTEMS_SUCCESSFUL;
10f1cb: 31 d2 xor %edx,%edx
10f1cd: eb 0e jmp 10f1dd <rtems_string_to_float+0xad>
10f1cf: dd d8 fstp %st(0)
10f1d1: eb 0a jmp 10f1dd <rtems_string_to_float+0xad>
10f1d3: dd d8 fstp %st(0) <== NOT EXECUTED
10f1d5: eb 06 jmp 10f1dd <rtems_string_to_float+0xad><== NOT EXECUTED
10f1d7: dd d8 fstp %st(0)
10f1d9: eb 02 jmp 10f1dd <rtems_string_to_float+0xad>
10f1db: dd d8 fstp %st(0) <== NOT EXECUTED
}
10f1dd: 89 d0 mov %edx,%eax
10f1df: 8d 65 f4 lea -0xc(%ebp),%esp
10f1e2: 5b pop %ebx
10f1e3: 5e pop %esi
10f1e4: 5f pop %edi
10f1e5: c9 leave
10f1e6: c3 ret
0010f1e8 <rtems_string_to_int>:
const char *s,
int *n,
char **endptr,
int base
)
{
10f1e8: 55 push %ebp
10f1e9: 89 e5 mov %esp,%ebp
10f1eb: 57 push %edi
10f1ec: 56 push %esi
10f1ed: 53 push %ebx
10f1ee: 83 ec 2c sub $0x2c,%esp
10f1f1: 8b 7d 08 mov 0x8(%ebp),%edi
10f1f4: 8b 75 0c mov 0xc(%ebp),%esi
10f1f7: 8b 55 10 mov 0x10(%ebp),%edx
long result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
10f1fa: b8 09 00 00 00 mov $0x9,%eax
)
{
long result;
char *end;
if ( !n )
10f1ff: 85 f6 test %esi,%esi
10f201: 74 6b je 10f26e <rtems_string_to_int+0x86>
return RTEMS_INVALID_ADDRESS;
errno = 0;
10f203: 89 55 d4 mov %edx,-0x2c(%ebp)
10f206: e8 dd 28 00 00 call 111ae8 <__errno>
10f20b: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
10f211: c7 06 00 00 00 00 movl $0x0,(%esi)
result = strtol( s, &end, base );
10f217: 50 push %eax
10f218: ff 75 14 pushl 0x14(%ebp)
10f21b: 8d 45 e4 lea -0x1c(%ebp),%eax
10f21e: 50 push %eax
10f21f: 57 push %edi
10f220: e8 4f 55 00 00 call 114774 <strtol>
10f225: 89 c3 mov %eax,%ebx
if ( endptr )
10f227: 83 c4 10 add $0x10,%esp
10f22a: 8b 55 d4 mov -0x2c(%ebp),%edx
10f22d: 85 d2 test %edx,%edx
10f22f: 74 05 je 10f236 <rtems_string_to_int+0x4e>
*endptr = end;
10f231: 8b 45 e4 mov -0x1c(%ebp),%eax
10f234: 89 02 mov %eax,(%edx)
if ( end == s )
return RTEMS_NOT_DEFINED;
10f236: b8 0b 00 00 00 mov $0xb,%eax
result = strtol( s, &end, base );
if ( endptr )
*endptr = end;
if ( end == s )
10f23b: 39 7d e4 cmp %edi,-0x1c(%ebp)
10f23e: 74 2e je 10f26e <rtems_string_to_int+0x86>
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f240: e8 a3 28 00 00 call 111ae8 <__errno>
10f245: 83 38 22 cmpl $0x22,(%eax)
10f248: 75 19 jne 10f263 <rtems_string_to_int+0x7b>
10f24a: 81 fb ff ff ff 7f cmp $0x7fffffff,%ebx
10f250: 74 17 je 10f269 <rtems_string_to_int+0x81><== ALWAYS TAKEN
10f252: 85 db test %ebx,%ebx <== NOT EXECUTED
10f254: 74 13 je 10f269 <rtems_string_to_int+0x81><== NOT EXECUTED
(( result == 0 ) || ( result == LONG_MAX ) || ( result == LONG_MIN )))
return RTEMS_INVALID_NUMBER;
10f256: b8 0a 00 00 00 mov $0xa,%eax <== NOT EXECUTED
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
(( result == 0 ) || ( result == LONG_MAX ) || ( result == LONG_MIN )))
10f25b: 81 fb 00 00 00 80 cmp $0x80000000,%ebx <== NOT EXECUTED
10f261: 74 0b je 10f26e <rtems_string_to_int+0x86><== NOT EXECUTED
errno = ERANGE;
return RTEMS_INVALID_NUMBER;
}
#endif
*n = result;
10f263: 89 1e mov %ebx,(%esi)
return RTEMS_SUCCESSFUL;
10f265: 31 c0 xor %eax,%eax
10f267: eb 05 jmp 10f26e <rtems_string_to_int+0x86>
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
(( result == 0 ) || ( result == LONG_MAX ) || ( result == LONG_MIN )))
return RTEMS_INVALID_NUMBER;
10f269: b8 0a 00 00 00 mov $0xa,%eax
#endif
*n = result;
return RTEMS_SUCCESSFUL;
}
10f26e: 8d 65 f4 lea -0xc(%ebp),%esp
10f271: 5b pop %ebx
10f272: 5e pop %esi
10f273: 5f pop %edi
10f274: c9 leave
10f275: c3 ret
0010f324 <rtems_string_to_long>:
const char *s,
long *n,
char **endptr,
int base
)
{
10f324: 55 push %ebp
10f325: 89 e5 mov %esp,%ebp
10f327: 57 push %edi
10f328: 56 push %esi
10f329: 53 push %ebx
10f32a: 83 ec 2c sub $0x2c,%esp
10f32d: 8b 7d 08 mov 0x8(%ebp),%edi
10f330: 8b 75 0c mov 0xc(%ebp),%esi
10f333: 8b 55 10 mov 0x10(%ebp),%edx
long result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
10f336: b8 09 00 00 00 mov $0x9,%eax
)
{
long result;
char *end;
if ( !n )
10f33b: 85 f6 test %esi,%esi
10f33d: 74 6b je 10f3aa <rtems_string_to_long+0x86>
return RTEMS_INVALID_ADDRESS;
errno = 0;
10f33f: 89 55 d4 mov %edx,-0x2c(%ebp)
10f342: e8 a1 27 00 00 call 111ae8 <__errno>
10f347: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
10f34d: c7 06 00 00 00 00 movl $0x0,(%esi)
result = strtol( s, &end, base );
10f353: 50 push %eax
10f354: ff 75 14 pushl 0x14(%ebp)
10f357: 8d 45 e4 lea -0x1c(%ebp),%eax
10f35a: 50 push %eax
10f35b: 57 push %edi
10f35c: e8 13 54 00 00 call 114774 <strtol>
10f361: 89 c3 mov %eax,%ebx
if ( endptr )
10f363: 83 c4 10 add $0x10,%esp
10f366: 8b 55 d4 mov -0x2c(%ebp),%edx
10f369: 85 d2 test %edx,%edx
10f36b: 74 05 je 10f372 <rtems_string_to_long+0x4e>
*endptr = end;
10f36d: 8b 45 e4 mov -0x1c(%ebp),%eax
10f370: 89 02 mov %eax,(%edx)
if ( end == s )
return RTEMS_NOT_DEFINED;
10f372: b8 0b 00 00 00 mov $0xb,%eax
result = strtol( s, &end, base );
if ( endptr )
*endptr = end;
if ( end == s )
10f377: 39 7d e4 cmp %edi,-0x1c(%ebp)
10f37a: 74 2e je 10f3aa <rtems_string_to_long+0x86>
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f37c: e8 67 27 00 00 call 111ae8 <__errno>
10f381: 83 38 22 cmpl $0x22,(%eax)
10f384: 75 19 jne 10f39f <rtems_string_to_long+0x7b>
10f386: 81 fb ff ff ff 7f cmp $0x7fffffff,%ebx
10f38c: 74 17 je 10f3a5 <rtems_string_to_long+0x81>
10f38e: 85 db test %ebx,%ebx
10f390: 74 13 je 10f3a5 <rtems_string_to_long+0x81><== NEVER TAKEN
(( result == 0 ) || ( result == LONG_MAX ) || ( result == LONG_MIN )))
return RTEMS_INVALID_NUMBER;
10f392: b8 0a 00 00 00 mov $0xa,%eax
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
(( result == 0 ) || ( result == LONG_MAX ) || ( result == LONG_MIN )))
10f397: 81 fb 00 00 00 80 cmp $0x80000000,%ebx
10f39d: 74 0b je 10f3aa <rtems_string_to_long+0x86><== ALWAYS TAKEN
return RTEMS_INVALID_NUMBER;
*n = result;
10f39f: 89 1e mov %ebx,(%esi)
return RTEMS_SUCCESSFUL;
10f3a1: 31 c0 xor %eax,%eax
10f3a3: eb 05 jmp 10f3aa <rtems_string_to_long+0x86>
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
(( result == 0 ) || ( result == LONG_MAX ) || ( result == LONG_MIN )))
return RTEMS_INVALID_NUMBER;
10f3a5: b8 0a 00 00 00 mov $0xa,%eax
*n = result;
return RTEMS_SUCCESSFUL;
}
10f3aa: 8d 65 f4 lea -0xc(%ebp),%esp
10f3ad: 5b pop %ebx
10f3ae: 5e pop %esi
10f3af: 5f pop %edi
10f3b0: c9 leave
10f3b1: c3 ret
0010f278 <rtems_string_to_long_long>:
const char *s,
long long *n,
char **endptr,
int base
)
{
10f278: 55 push %ebp
10f279: 89 e5 mov %esp,%ebp
10f27b: 57 push %edi
10f27c: 56 push %esi
10f27d: 53 push %ebx
10f27e: 83 ec 2c sub $0x2c,%esp
10f281: 8b 5d 0c mov 0xc(%ebp),%ebx
10f284: 8b 7d 10 mov 0x10(%ebp),%edi
long long result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
10f287: b8 09 00 00 00 mov $0x9,%eax
)
{
long long result;
char *end;
if ( !n )
10f28c: 85 db test %ebx,%ebx
10f28e: 0f 84 85 00 00 00 je 10f319 <rtems_string_to_long_long+0xa1>
return RTEMS_INVALID_ADDRESS;
errno = 0;
10f294: e8 4f 28 00 00 call 111ae8 <__errno>
10f299: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
10f29f: c7 03 00 00 00 00 movl $0x0,(%ebx)
10f2a5: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx)
result = strtoll( s, &end, base );
10f2ac: 50 push %eax
10f2ad: ff 75 14 pushl 0x14(%ebp)
10f2b0: 8d 45 e4 lea -0x1c(%ebp),%eax
10f2b3: 50 push %eax
10f2b4: ff 75 08 pushl 0x8(%ebp)
10f2b7: e8 d4 54 00 00 call 114790 <strtoll>
10f2bc: 89 c6 mov %eax,%esi
if ( endptr )
10f2be: 83 c4 10 add $0x10,%esp
10f2c1: 85 ff test %edi,%edi
10f2c3: 74 05 je 10f2ca <rtems_string_to_long_long+0x52>
*endptr = end;
10f2c5: 8b 45 e4 mov -0x1c(%ebp),%eax
10f2c8: 89 07 mov %eax,(%edi)
if ( end == s )
return RTEMS_NOT_DEFINED;
10f2ca: b8 0b 00 00 00 mov $0xb,%eax
result = strtoll( s, &end, base );
if ( endptr )
*endptr = end;
if ( end == s )
10f2cf: 8b 4d 08 mov 0x8(%ebp),%ecx
10f2d2: 39 4d e4 cmp %ecx,-0x1c(%ebp)
10f2d5: 74 42 je 10f319 <rtems_string_to_long_long+0xa1>
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f2d7: 89 55 d4 mov %edx,-0x2c(%ebp)
10f2da: e8 09 28 00 00 call 111ae8 <__errno>
10f2df: 83 38 22 cmpl $0x22,(%eax)
10f2e2: 8b 55 d4 mov -0x2c(%ebp),%edx
10f2e5: 75 24 jne 10f30b <rtems_string_to_long_long+0x93>
(( result == 0 ) || ( result == LONG_LONG_MAX ) || ( result == LONG_LONG_MIN )))
10f2e7: 89 f1 mov %esi,%ecx
10f2e9: f7 d1 not %ecx
10f2eb: 89 d0 mov %edx,%eax
10f2ed: 35 ff ff ff 7f xor $0x7fffffff,%eax
*endptr = end;
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f2f2: 09 c1 or %eax,%ecx
10f2f4: 74 1e je 10f314 <rtems_string_to_long_long+0x9c>
10f2f6: 89 f0 mov %esi,%eax
10f2f8: 09 d0 or %edx,%eax
10f2fa: 74 18 je 10f314 <rtems_string_to_long_long+0x9c><== NEVER TAKEN
(( result == 0 ) || ( result == LONG_LONG_MAX ) || ( result == LONG_LONG_MIN )))
10f2fc: 8d 8a 00 00 00 80 lea -0x80000000(%edx),%ecx
return RTEMS_INVALID_NUMBER;
10f302: b8 0a 00 00 00 mov $0xa,%eax
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
(( result == 0 ) || ( result == LONG_LONG_MAX ) || ( result == LONG_LONG_MIN )))
10f307: 09 f1 or %esi,%ecx
10f309: 74 0e je 10f319 <rtems_string_to_long_long+0xa1><== ALWAYS TAKEN
return RTEMS_INVALID_NUMBER;
*n = result;
10f30b: 89 33 mov %esi,(%ebx)
10f30d: 89 53 04 mov %edx,0x4(%ebx)
return RTEMS_SUCCESSFUL;
10f310: 31 c0 xor %eax,%eax
10f312: eb 05 jmp 10f319 <rtems_string_to_long_long+0xa1>
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
(( result == 0 ) || ( result == LONG_LONG_MAX ) || ( result == LONG_LONG_MIN )))
return RTEMS_INVALID_NUMBER;
10f314: b8 0a 00 00 00 mov $0xa,%eax
*n = result;
return RTEMS_SUCCESSFUL;
}
10f319: 8d 65 f4 lea -0xc(%ebp),%esp
10f31c: 5b pop %ebx
10f31d: 5e pop %esi
10f31e: 5f pop %edi
10f31f: c9 leave
10f320: c3 ret
0010f3cc <rtems_string_to_unsigned_char>:
const char *s,
unsigned char *n,
char **endptr,
int base
)
{
10f3cc: 55 push %ebp
10f3cd: 89 e5 mov %esp,%ebp
10f3cf: 57 push %edi
10f3d0: 56 push %esi
10f3d1: 53 push %ebx
10f3d2: 83 ec 2c sub $0x2c,%esp
10f3d5: 8b 7d 08 mov 0x8(%ebp),%edi
10f3d8: 8b 5d 0c mov 0xc(%ebp),%ebx
10f3db: 8b 55 10 mov 0x10(%ebp),%edx
unsigned long result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
10f3de: b8 09 00 00 00 mov $0x9,%eax
)
{
unsigned long result;
char *end;
if ( !n )
10f3e3: 85 db test %ebx,%ebx
10f3e5: 74 71 je 10f458 <rtems_string_to_unsigned_char+0x8c>
return RTEMS_INVALID_ADDRESS;
errno = 0;
10f3e7: 89 55 d4 mov %edx,-0x2c(%ebp)
10f3ea: e8 f9 26 00 00 call 111ae8 <__errno>
10f3ef: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
10f3f5: c6 03 00 movb $0x0,(%ebx)
result = strtoul( s, &end, base );
10f3f8: 50 push %eax
10f3f9: ff 75 14 pushl 0x14(%ebp)
10f3fc: 8d 45 e4 lea -0x1c(%ebp),%eax
10f3ff: 50 push %eax
10f400: 57 push %edi
10f401: e8 2a 58 00 00 call 114c30 <strtoul>
10f406: 89 c6 mov %eax,%esi
if ( endptr )
10f408: 83 c4 10 add $0x10,%esp
10f40b: 8b 55 d4 mov -0x2c(%ebp),%edx
10f40e: 85 d2 test %edx,%edx
10f410: 74 05 je 10f417 <rtems_string_to_unsigned_char+0x4b>
*endptr = end;
10f412: 8b 45 e4 mov -0x1c(%ebp),%eax
10f415: 89 02 mov %eax,(%edx)
if ( end == s )
return RTEMS_NOT_DEFINED;
10f417: b8 0b 00 00 00 mov $0xb,%eax
result = strtoul( s, &end, base );
if ( endptr )
*endptr = end;
if ( end == s )
10f41c: 39 7d e4 cmp %edi,-0x1c(%ebp)
10f41f: 74 37 je 10f458 <rtems_string_to_unsigned_char+0x8c>
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f421: e8 c2 26 00 00 call 111ae8 <__errno>
10f426: 83 38 22 cmpl $0x22,(%eax)
10f429: 75 0d jne 10f438 <rtems_string_to_unsigned_char+0x6c><== ALWAYS TAKEN
(( result == 0 ) || ( result == ULONG_MAX )))
10f42b: 8d 56 ff lea -0x1(%esi),%edx <== NOT EXECUTED
return RTEMS_INVALID_NUMBER;
10f42e: b8 0a 00 00 00 mov $0xa,%eax <== NOT EXECUTED
*endptr = end;
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f433: 83 fa fd cmp $0xfffffffd,%edx <== NOT EXECUTED
10f436: 77 20 ja 10f458 <rtems_string_to_unsigned_char+0x8c><== NOT EXECUTED
(( result == 0 ) || ( result == ULONG_MAX )))
return RTEMS_INVALID_NUMBER;
#if (UCHAR_MAX < ULONG_MAX)
if ( result > UCHAR_MAX ) {
10f438: 81 fe ff 00 00 00 cmp $0xff,%esi
10f43e: 76 12 jbe 10f452 <rtems_string_to_unsigned_char+0x86><== ALWAYS TAKEN
errno = ERANGE;
10f440: e8 a3 26 00 00 call 111ae8 <__errno> <== NOT EXECUTED
10f445: c7 00 22 00 00 00 movl $0x22,(%eax) <== NOT EXECUTED
return RTEMS_INVALID_NUMBER;
10f44b: b8 0a 00 00 00 mov $0xa,%eax <== NOT EXECUTED
10f450: eb 06 jmp 10f458 <rtems_string_to_unsigned_char+0x8c><== NOT EXECUTED
}
#endif
*n = result;
10f452: 89 f0 mov %esi,%eax
10f454: 88 03 mov %al,(%ebx)
return RTEMS_SUCCESSFUL;
10f456: 31 c0 xor %eax,%eax
}
10f458: 8d 65 f4 lea -0xc(%ebp),%esp
10f45b: 5b pop %ebx
10f45c: 5e pop %esi
10f45d: 5f pop %edi
10f45e: c9 leave
10f45f: c3 ret
0010f460 <rtems_string_to_unsigned_int>:
const char *s,
unsigned int *n,
char **endptr,
int base
)
{
10f460: 55 push %ebp
10f461: 89 e5 mov %esp,%ebp
10f463: 57 push %edi
10f464: 56 push %esi
10f465: 53 push %ebx
10f466: 83 ec 2c sub $0x2c,%esp
10f469: 8b 7d 08 mov 0x8(%ebp),%edi
10f46c: 8b 5d 0c mov 0xc(%ebp),%ebx
10f46f: 8b 55 10 mov 0x10(%ebp),%edx
unsigned long result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
10f472: b8 09 00 00 00 mov $0x9,%eax
)
{
unsigned long result;
char *end;
if ( !n )
10f477: 85 db test %ebx,%ebx
10f479: 74 58 je 10f4d3 <rtems_string_to_unsigned_int+0x73>
return RTEMS_INVALID_ADDRESS;
errno = 0;
10f47b: 89 55 d4 mov %edx,-0x2c(%ebp)
10f47e: e8 65 26 00 00 call 111ae8 <__errno>
10f483: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
10f489: c7 03 00 00 00 00 movl $0x0,(%ebx)
result = strtoul( s, &end, base );
10f48f: 50 push %eax
10f490: ff 75 14 pushl 0x14(%ebp)
10f493: 8d 45 e4 lea -0x1c(%ebp),%eax
10f496: 50 push %eax
10f497: 57 push %edi
10f498: e8 93 57 00 00 call 114c30 <strtoul>
10f49d: 89 c6 mov %eax,%esi
if ( endptr )
10f49f: 83 c4 10 add $0x10,%esp
10f4a2: 8b 55 d4 mov -0x2c(%ebp),%edx
10f4a5: 85 d2 test %edx,%edx
10f4a7: 74 05 je 10f4ae <rtems_string_to_unsigned_int+0x4e>
*endptr = end;
10f4a9: 8b 45 e4 mov -0x1c(%ebp),%eax
10f4ac: 89 02 mov %eax,(%edx)
if ( end == s )
return RTEMS_NOT_DEFINED;
10f4ae: b8 0b 00 00 00 mov $0xb,%eax
result = strtoul( s, &end, base );
if ( endptr )
*endptr = end;
if ( end == s )
10f4b3: 39 7d e4 cmp %edi,-0x1c(%ebp)
10f4b6: 74 1b je 10f4d3 <rtems_string_to_unsigned_int+0x73>
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f4b8: e8 2b 26 00 00 call 111ae8 <__errno>
10f4bd: 83 38 22 cmpl $0x22,(%eax)
10f4c0: 75 0d jne 10f4cf <rtems_string_to_unsigned_int+0x6f>
(( result == 0 ) || ( result == ULONG_MAX )))
10f4c2: 8d 56 ff lea -0x1(%esi),%edx
return RTEMS_INVALID_NUMBER;
10f4c5: b8 0a 00 00 00 mov $0xa,%eax
*endptr = end;
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f4ca: 83 fa fd cmp $0xfffffffd,%edx
10f4cd: 77 04 ja 10f4d3 <rtems_string_to_unsigned_int+0x73><== ALWAYS TAKEN
errno = ERANGE;
return RTEMS_INVALID_NUMBER;
}
#endif
*n = result;
10f4cf: 89 33 mov %esi,(%ebx)
return RTEMS_SUCCESSFUL;
10f4d1: 31 c0 xor %eax,%eax
}
10f4d3: 8d 65 f4 lea -0xc(%ebp),%esp
10f4d6: 5b pop %ebx
10f4d7: 5e pop %esi
10f4d8: 5f pop %edi
10f4d9: c9 leave
10f4da: c3 ret
0010f578 <rtems_string_to_unsigned_long>:
const char *s,
unsigned long *n,
char **endptr,
int base
)
{
10f578: 55 push %ebp
10f579: 89 e5 mov %esp,%ebp
10f57b: 57 push %edi
10f57c: 56 push %esi
10f57d: 53 push %ebx
10f57e: 83 ec 2c sub $0x2c,%esp
10f581: 8b 7d 08 mov 0x8(%ebp),%edi
10f584: 8b 5d 0c mov 0xc(%ebp),%ebx
10f587: 8b 55 10 mov 0x10(%ebp),%edx
unsigned long result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
10f58a: b8 09 00 00 00 mov $0x9,%eax
)
{
unsigned long result;
char *end;
if ( !n )
10f58f: 85 db test %ebx,%ebx
10f591: 74 58 je 10f5eb <rtems_string_to_unsigned_long+0x73>
return RTEMS_INVALID_ADDRESS;
errno = 0;
10f593: 89 55 d4 mov %edx,-0x2c(%ebp)
10f596: e8 4d 25 00 00 call 111ae8 <__errno>
10f59b: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
10f5a1: c7 03 00 00 00 00 movl $0x0,(%ebx)
result = strtoul( s, &end, base );
10f5a7: 50 push %eax
10f5a8: ff 75 14 pushl 0x14(%ebp)
10f5ab: 8d 45 e4 lea -0x1c(%ebp),%eax
10f5ae: 50 push %eax
10f5af: 57 push %edi
10f5b0: e8 7b 56 00 00 call 114c30 <strtoul>
10f5b5: 89 c6 mov %eax,%esi
if ( endptr )
10f5b7: 83 c4 10 add $0x10,%esp
10f5ba: 8b 55 d4 mov -0x2c(%ebp),%edx
10f5bd: 85 d2 test %edx,%edx
10f5bf: 74 05 je 10f5c6 <rtems_string_to_unsigned_long+0x4e>
*endptr = end;
10f5c1: 8b 45 e4 mov -0x1c(%ebp),%eax
10f5c4: 89 02 mov %eax,(%edx)
if ( end == s )
return RTEMS_NOT_DEFINED;
10f5c6: b8 0b 00 00 00 mov $0xb,%eax
result = strtoul( s, &end, base );
if ( endptr )
*endptr = end;
if ( end == s )
10f5cb: 39 7d e4 cmp %edi,-0x1c(%ebp)
10f5ce: 74 1b je 10f5eb <rtems_string_to_unsigned_long+0x73>
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f5d0: e8 13 25 00 00 call 111ae8 <__errno>
10f5d5: 83 38 22 cmpl $0x22,(%eax)
10f5d8: 75 0d jne 10f5e7 <rtems_string_to_unsigned_long+0x6f>
(( result == 0 ) || ( result == ULONG_MAX )))
10f5da: 8d 56 ff lea -0x1(%esi),%edx
return RTEMS_INVALID_NUMBER;
10f5dd: b8 0a 00 00 00 mov $0xa,%eax
*endptr = end;
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f5e2: 83 fa fd cmp $0xfffffffd,%edx
10f5e5: 77 04 ja 10f5eb <rtems_string_to_unsigned_long+0x73><== ALWAYS TAKEN
(( result == 0 ) || ( result == ULONG_MAX )))
return RTEMS_INVALID_NUMBER;
*n = result;
10f5e7: 89 33 mov %esi,(%ebx)
return RTEMS_SUCCESSFUL;
10f5e9: 31 c0 xor %eax,%eax
}
10f5eb: 8d 65 f4 lea -0xc(%ebp),%esp
10f5ee: 5b pop %ebx
10f5ef: 5e pop %esi
10f5f0: 5f pop %edi
10f5f1: c9 leave
10f5f2: c3 ret
0010f4dc <rtems_string_to_unsigned_long_long>:
const char *s,
unsigned long long *n,
char **endptr,
int base
)
{
10f4dc: 55 push %ebp
10f4dd: 89 e5 mov %esp,%ebp
10f4df: 57 push %edi
10f4e0: 56 push %esi
10f4e1: 53 push %ebx
10f4e2: 83 ec 2c sub $0x2c,%esp
10f4e5: 8b 7d 08 mov 0x8(%ebp),%edi
10f4e8: 8b 5d 0c mov 0xc(%ebp),%ebx
10f4eb: 8b 75 10 mov 0x10(%ebp),%esi
unsigned long long result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
10f4ee: b8 09 00 00 00 mov $0x9,%eax
)
{
unsigned long long result;
char *end;
if ( !n )
10f4f3: 85 db test %ebx,%ebx
10f4f5: 74 76 je 10f56d <rtems_string_to_unsigned_long_long+0x91>
return RTEMS_INVALID_ADDRESS;
errno = 0;
10f4f7: e8 ec 25 00 00 call 111ae8 <__errno>
10f4fc: c7 00 00 00 00 00 movl $0x0,(%eax)
*n = 0;
10f502: c7 03 00 00 00 00 movl $0x0,(%ebx)
10f508: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx)
result = strtoull( s, &end, base );
10f50f: 50 push %eax
10f510: ff 75 14 pushl 0x14(%ebp)
10f513: 8d 45 e4 lea -0x1c(%ebp),%eax
10f516: 50 push %eax
10f517: 57 push %edi
10f518: e8 2f 57 00 00 call 114c4c <strtoull>
10f51d: 89 d1 mov %edx,%ecx
10f51f: 89 c2 mov %eax,%edx
if ( endptr )
10f521: 83 c4 10 add $0x10,%esp
10f524: 85 f6 test %esi,%esi
10f526: 74 05 je 10f52d <rtems_string_to_unsigned_long_long+0x51>
*endptr = end;
10f528: 8b 45 e4 mov -0x1c(%ebp),%eax
10f52b: 89 06 mov %eax,(%esi)
if ( end == s )
return RTEMS_NOT_DEFINED;
10f52d: b8 0b 00 00 00 mov $0xb,%eax
result = strtoull( s, &end, base );
if ( endptr )
*endptr = end;
if ( end == s )
10f532: 39 7d e4 cmp %edi,-0x1c(%ebp)
10f535: 74 36 je 10f56d <rtems_string_to_unsigned_long_long+0x91>
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f537: 89 55 d4 mov %edx,-0x2c(%ebp)
10f53a: 89 4d d0 mov %ecx,-0x30(%ebp)
10f53d: e8 a6 25 00 00 call 111ae8 <__errno>
10f542: 83 38 22 cmpl $0x22,(%eax)
10f545: 8b 55 d4 mov -0x2c(%ebp),%edx
10f548: 8b 4d d0 mov -0x30(%ebp),%ecx
10f54b: 75 19 jne 10f566 <rtems_string_to_unsigned_long_long+0x8a>
(( result == 0 ) || ( result == ULONG_LONG_MAX )))
10f54d: 89 d6 mov %edx,%esi
10f54f: 89 cf mov %ecx,%edi
10f551: 83 c6 ff add $0xffffffff,%esi
10f554: 83 d7 ff adc $0xffffffff,%edi
*endptr = end;
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f557: 83 ff ff cmp $0xffffffff,%edi
10f55a: 72 0a jb 10f566 <rtems_string_to_unsigned_long_long+0x8a><== NEVER TAKEN
(( result == 0 ) || ( result == ULONG_LONG_MAX )))
return RTEMS_INVALID_NUMBER;
10f55c: b8 0a 00 00 00 mov $0xa,%eax
*endptr = end;
if ( end == s )
return RTEMS_NOT_DEFINED;
if ( ( errno == ERANGE ) &&
10f561: 83 fe fd cmp $0xfffffffd,%esi
10f564: 77 07 ja 10f56d <rtems_string_to_unsigned_long_long+0x91><== ALWAYS TAKEN
(( result == 0 ) || ( result == ULONG_LONG_MAX )))
return RTEMS_INVALID_NUMBER;
*n = result;
10f566: 89 13 mov %edx,(%ebx)
10f568: 89 4b 04 mov %ecx,0x4(%ebx)
return RTEMS_SUCCESSFUL;
10f56b: 31 c0 xor %eax,%eax
}
10f56d: 8d 65 f4 lea -0xc(%ebp),%esp
10f570: 5b pop %ebx
10f571: 5e pop %esi
10f572: 5f pop %edi
10f573: c9 leave
10f574: c3 ret
001070ac <rtems_tarfs_load>:
int rtems_tarfs_load(
char *mountpoint,
uint8_t *tar_image,
size_t tar_size
)
{
1070ac: 55 push %ebp
1070ad: 89 e5 mov %esp,%ebp
1070af: 57 push %edi
1070b0: 56 push %esi
1070b1: 53 push %ebx
1070b2: 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(
1070b8: 31 c0 xor %eax,%eax
1070ba: 83 c9 ff or $0xffffffff,%ecx
1070bd: 8b 7d 08 mov 0x8(%ebp),%edi
1070c0: f2 ae repnz scas %es:(%edi),%al
1070c2: f7 d1 not %ecx
1070c4: 49 dec %ecx
1070c5: 6a 00 push $0x0
1070c7: 8d 45 d0 lea -0x30(%ebp),%eax
1070ca: 50 push %eax
1070cb: 6a 00 push $0x0
1070cd: 51 push %ecx
1070ce: ff 75 08 pushl 0x8(%ebp)
1070d1: e8 d4 09 00 00 call 107aaa <rtems_filesystem_evaluate_path>
1070d6: 89 85 54 fe ff ff mov %eax,-0x1ac(%ebp)
strlen(mountpoint),
0,
&root_loc,
0
);
if (status != 0)
1070dc: 83 c4 20 add $0x20,%esp
1070df: 85 c0 test %eax,%eax
1070e1: 0f 85 d9 01 00 00 jne 1072c0 <rtems_tarfs_load+0x214>
return -1;
if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops)
1070e7: 8b 45 dc mov -0x24(%ebp),%eax
1070ea: 31 f6 xor %esi,%esi
1070ec: 3d b0 45 12 00 cmp $0x1245b0,%eax
1070f1: 74 1b je 10710e <rtems_tarfs_load+0x62>
1070f3: 3d 98 4f 12 00 cmp $0x124f98,%eax
1070f8: 0f 85 c2 01 00 00 jne 1072c0 <rtems_tarfs_load+0x214><== ALWAYS TAKEN
1070fe: 8b b5 54 fe ff ff mov -0x1ac(%ebp),%esi <== NOT EXECUTED
107104: eb 08 jmp 10710e <rtems_tarfs_load+0x62> <== NOT EXECUTED
107106: 8b b5 50 fe ff ff mov -0x1b0(%ebp),%esi
10710c: eb 18 jmp 107126 <rtems_tarfs_load+0x7a>
* should not have this path.
*/
else if (linkflag == REGTYPE) {
const char *name;
loc = root_loc;
10710e: 8d 45 bc lea -0x44(%ebp),%eax
107111: 89 85 34 fe ff ff mov %eax,-0x1cc(%ebp)
107117: 8d 55 d0 lea -0x30(%ebp),%edx
10711a: 89 95 30 fe ff ff mov %edx,-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);
107120: 8d 9d 58 fe ff ff lea -0x1a8(%ebp),%ebx
/*
* Create an IMFS node structure pointing to tar image memory.
*/
offset = 0;
while (1) {
if (offset + 512 > tar_size)
107126: 8d 86 00 02 00 00 lea 0x200(%esi),%eax
10712c: 89 85 50 fe ff ff mov %eax,-0x1b0(%ebp)
107132: 8b 55 10 mov 0x10(%ebp),%edx
107135: 39 d0 cmp %edx,%eax
107137: 0f 87 8d 01 00 00 ja 1072ca <rtems_tarfs_load+0x21e><== NEVER TAKEN
break;
/*
* Read a header.
*/
hdr_ptr = (char *) &tar_image[offset];
10713d: 03 75 0c add 0xc(%ebp),%esi
offset += 512;
if (strncmp(&hdr_ptr[257], "ustar", 5))
107140: 8d 86 01 01 00 00 lea 0x101(%esi),%eax
107146: 52 push %edx
107147: 6a 05 push $0x5
107149: 68 f8 45 12 00 push $0x1245f8
10714e: 50 push %eax
10714f: e8 a8 e5 00 00 call 1156fc <strncmp>
107154: 83 c4 10 add $0x10,%esp
107157: 85 c0 test %eax,%eax
107159: 0f 85 6b 01 00 00 jne 1072ca <rtems_tarfs_load+0x21e>
break;
strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE);
10715f: 50 push %eax
107160: 6a 63 push $0x63
107162: 56 push %esi
107163: 8d 85 58 ff ff ff lea -0xa8(%ebp),%eax
107169: 50 push %eax
10716a: e8 1d e6 00 00 call 11578c <strncpy>
filename[MAX_NAME_FIELD_SIZE] = '\0';
10716f: c6 45 bb 00 movb $0x0,-0x45(%ebp)
linkflag = hdr_ptr[156];
107173: 8a 96 9c 00 00 00 mov 0x9c(%esi),%dl
file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8);
107179: 59 pop %ecx
10717a: 5f pop %edi
10717b: 6a 08 push $0x8
10717d: 8d 46 64 lea 0x64(%esi),%eax
107180: 50 push %eax
107181: 88 95 44 fe ff ff mov %dl,-0x1bc(%ebp)
107187: e8 b4 6e 00 00 call 10e040 <_rtems_octal2ulong>
10718c: 89 85 48 fe ff ff mov %eax,-0x1b8(%ebp)
file_size = _rtems_octal2ulong(&hdr_ptr[124], 12);
107192: 5f pop %edi
107193: 58 pop %eax
107194: 6a 0c push $0xc
107196: 8d 46 7c lea 0x7c(%esi),%eax
107199: 50 push %eax
10719a: e8 a1 6e 00 00 call 10e040 <_rtems_octal2ulong>
10719f: 89 85 4c fe ff ff mov %eax,-0x1b4(%ebp)
hdr_chksum = _rtems_octal2ulong(&hdr_ptr[148], 8);
1071a5: 5a pop %edx
1071a6: 59 pop %ecx
1071a7: 6a 08 push $0x8
1071a9: 8d 86 94 00 00 00 lea 0x94(%esi),%eax
1071af: 50 push %eax
1071b0: e8 8b 6e 00 00 call 10e040 <_rtems_octal2ulong>
1071b5: 89 c7 mov %eax,%edi
if (_rtems_tar_header_checksum(hdr_ptr) != hdr_chksum)
1071b7: 89 34 24 mov %esi,(%esp)
1071ba: e8 af 6e 00 00 call 10e06e <_rtems_tar_header_checksum>
1071bf: 83 c4 10 add $0x10,%esp
1071c2: 39 f8 cmp %edi,%eax
1071c4: 8a 95 44 fe ff ff mov -0x1bc(%ebp),%dl
1071ca: 0f 85 fa 00 00 00 jne 1072ca <rtems_tarfs_load+0x21e><== 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) {
1071d0: 80 fa 35 cmp $0x35,%dl
1071d3: 75 57 jne 10722c <rtems_tarfs_load+0x180>
strcpy(full_filename, mountpoint);
1071d5: 50 push %eax
1071d6: 50 push %eax
1071d7: ff 75 08 pushl 0x8(%ebp)
1071da: 53 push %ebx
1071db: e8 b4 e1 00 00 call 115394 <strcpy>
if (full_filename[strlen(full_filename)-1] != '/')
1071e0: 31 c0 xor %eax,%eax
1071e2: 83 c9 ff or $0xffffffff,%ecx
1071e5: 89 df mov %ebx,%edi
1071e7: f2 ae repnz scas %es:(%edi),%al
1071e9: f7 d1 not %ecx
1071eb: 83 c4 10 add $0x10,%esp
1071ee: 80 bc 0d 56 fe ff ff cmpb $0x2f,-0x1aa(%ebp,%ecx,1)
1071f5: 2f
1071f6: 74 10 je 107208 <rtems_tarfs_load+0x15c><== ALWAYS TAKEN
strcat(full_filename, "/");
1071f8: 57 push %edi <== NOT EXECUTED
1071f9: 57 push %edi <== NOT EXECUTED
1071fa: 68 59 04 12 00 push $0x120459 <== NOT EXECUTED
1071ff: 53 push %ebx <== NOT EXECUTED
107200: e8 db df 00 00 call 1151e0 <strcat> <== NOT EXECUTED
107205: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
strcat(full_filename, filename);
107208: 56 push %esi
107209: 56 push %esi
10720a: 8d 95 58 ff ff ff lea -0xa8(%ebp),%edx
107210: 52 push %edx
107211: 53 push %ebx
107212: e8 c9 df 00 00 call 1151e0 <strcat>
mkdir(full_filename, S_IRWXU | S_IRWXG | S_IRWXO);
107217: 5a pop %edx
107218: 59 pop %ecx
107219: 68 ff 01 00 00 push $0x1ff
10721e: 53 push %ebx
10721f: e8 58 0f 00 00 call 10817c <mkdir>
107224: 83 c4 10 add $0x10,%esp
107227: e9 da fe ff ff jmp 107106 <rtems_tarfs_load+0x5a>
* 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) {
10722c: 80 fa 30 cmp $0x30,%dl
10722f: 0f 85 d1 fe ff ff jne 107106 <rtems_tarfs_load+0x5a>
const char *name;
loc = root_loc;
107235: b9 05 00 00 00 mov $0x5,%ecx
10723a: 8b bd 34 fe ff ff mov -0x1cc(%ebp),%edi
107240: 8b b5 30 fe ff ff mov -0x1d0(%ebp),%esi
107246: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) {
107248: 50 push %eax
107249: 8d 45 e4 lea -0x1c(%ebp),%eax
10724c: 50 push %eax
10724d: 8d 55 bc lea -0x44(%ebp),%edx
107250: 52 push %edx
107251: 8d 85 58 ff ff ff lea -0xa8(%ebp),%eax
107257: 50 push %eax
107258: e8 0f 79 00 00 call 10eb6c <IMFS_evaluate_for_make>
10725d: 83 c4 10 add $0x10,%esp
107260: 85 c0 test %eax,%eax
107262: 75 41 jne 1072a5 <rtems_tarfs_load+0x1f9><== NEVER TAKEN
node = IMFS_create_node(
107264: 83 ec 0c sub $0xc,%esp
107267: 6a 00 push $0x0
&loc,
IMFS_LINEAR_FILE, (char *)name,
(file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG,
107269: 8b 85 48 fe ff ff mov -0x1b8(%ebp),%eax
10726f: 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(
107274: 80 cc 80 or $0x80,%ah
107277: 50 push %eax
107278: ff 75 e4 pushl -0x1c(%ebp)
10727b: 6a 06 push $0x6
10727d: 8d 55 bc lea -0x44(%ebp),%edx
107280: 52 push %edx
107281: e8 d9 73 00 00 call 10e65f <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;
107286: 8b 95 4c fe ff ff mov -0x1b4(%ebp),%edx
10728c: 89 50 50 mov %edx,0x50(%eax)
10728f: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
node->info.linearfile.direct = &tar_image[offset];
107296: 8b 55 0c mov 0xc(%ebp),%edx
107299: 03 95 50 fe ff ff add -0x1b0(%ebp),%edx
10729f: 89 50 58 mov %edx,0x58(%eax)
1072a2: 83 c4 20 add $0x20,%esp
}
nblocks = (((file_size) + 511) & ~511) / 512;
1072a5: 8b 85 4c fe ff ff mov -0x1b4(%ebp),%eax
1072ab: 05 ff 01 00 00 add $0x1ff,%eax
offset += 512 * nblocks;
1072b0: 25 00 fe ff ff and $0xfffffe00,%eax
1072b5: 01 85 50 fe ff ff add %eax,-0x1b0(%ebp)
1072bb: e9 46 fe ff ff jmp 107106 <rtems_tarfs_load+0x5a>
);
if (status != 0)
return -1;
if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops)
return -1;
1072c0: c7 85 54 fe ff ff ff movl $0xffffffff,-0x1ac(%ebp)
1072c7: ff ff ff
nblocks = (((file_size) + 511) & ~511) / 512;
offset += 512 * nblocks;
}
}
return status;
}
1072ca: 8b 85 54 fe ff ff mov -0x1ac(%ebp),%eax
1072d0: 8d 65 f4 lea -0xc(%ebp),%esp
1072d3: 5b pop %ebx
1072d4: 5e pop %esi
1072d5: 5f pop %edi
1072d6: c9 leave
1072d7: c3 ret
00110d68 <rtems_task_mode>:
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
110d68: 55 push %ebp
110d69: 89 e5 mov %esp,%ebp
110d6b: 57 push %edi
110d6c: 56 push %esi
110d6d: 53 push %ebx
110d6e: 83 ec 1c sub $0x1c,%esp
110d71: 8b 4d 10 mov 0x10(%ebp),%ecx
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
110d74: b8 09 00 00 00 mov $0x9,%eax
ASR_Information *asr;
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
110d79: 85 c9 test %ecx,%ecx
110d7b: 0f 84 fb 00 00 00 je 110e7c <rtems_task_mode+0x114>
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
110d81: 8b 35 68 58 12 00 mov 0x125868,%esi
api = executing->API_Extensions[ THREAD_API_RTEMS ];
110d87: 8b 9e e8 00 00 00 mov 0xe8(%esi),%ebx
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
110d8d: 80 7e 74 01 cmpb $0x1,0x74(%esi)
110d91: 19 ff sbb %edi,%edi
110d93: 81 e7 00 01 00 00 and $0x100,%edi
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
110d99: 83 7e 7c 00 cmpl $0x0,0x7c(%esi)
110d9d: 74 06 je 110da5 <rtems_task_mode+0x3d>
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
110d9f: 81 cf 00 02 00 00 or $0x200,%edi
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
110da5: 80 7b 08 01 cmpb $0x1,0x8(%ebx)
110da9: 19 d2 sbb %edx,%edx
110dab: 81 e2 00 04 00 00 and $0x400,%edx
old_mode |= _ISR_Get_level();
110db1: 89 55 e4 mov %edx,-0x1c(%ebp)
110db4: 89 4d e0 mov %ecx,-0x20(%ebp)
110db7: e8 59 c6 ff ff call 10d415 <_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;
110dbc: 8b 55 e4 mov -0x1c(%ebp),%edx
110dbf: 09 d0 or %edx,%eax
old_mode |= _ISR_Get_level();
110dc1: 09 f8 or %edi,%eax
110dc3: 8b 4d e0 mov -0x20(%ebp),%ecx
110dc6: 89 01 mov %eax,(%ecx)
*previous_mode_set = old_mode;
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
110dc8: f7 45 0c 00 01 00 00 testl $0x100,0xc(%ebp)
110dcf: 74 0b je 110ddc <rtems_task_mode+0x74>
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
110dd1: f7 45 08 00 01 00 00 testl $0x100,0x8(%ebp)
110dd8: 0f 94 46 74 sete 0x74(%esi)
if ( mask & RTEMS_TIMESLICE_MASK ) {
110ddc: f7 45 0c 00 02 00 00 testl $0x200,0xc(%ebp)
110de3: 74 21 je 110e06 <rtems_task_mode+0x9e>
if ( _Modes_Is_timeslice(mode_set) ) {
110de5: f7 45 08 00 02 00 00 testl $0x200,0x8(%ebp)
110dec: 74 11 je 110dff <rtems_task_mode+0x97>
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
110dee: c7 46 7c 01 00 00 00 movl $0x1,0x7c(%esi)
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
110df5: a1 10 53 12 00 mov 0x125310,%eax
110dfa: 89 46 78 mov %eax,0x78(%esi)
110dfd: eb 07 jmp 110e06 <rtems_task_mode+0x9e>
} else
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
110dff: c7 46 7c 00 00 00 00 movl $0x0,0x7c(%esi)
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
110e06: f6 45 0c 01 testb $0x1,0xc(%ebp)
110e0a: 74 0a je 110e16 <rtems_task_mode+0xae>
*/
RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
Modes_Control mode_set
)
{
_ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
110e0c: f6 45 08 01 testb $0x1,0x8(%ebp)
110e10: 74 03 je 110e15 <rtems_task_mode+0xad>
110e12: fa cli
110e13: eb 01 jmp 110e16 <rtems_task_mode+0xae>
110e15: fb sti
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
110e16: 31 c9 xor %ecx,%ecx
if ( mask & RTEMS_ASR_MASK ) {
110e18: f7 45 0c 00 04 00 00 testl $0x400,0xc(%ebp)
110e1f: 74 2a je 110e4b <rtems_task_mode+0xe3>
* Output:
* *previous_mode_set - previous mode set
* always return RTEMS_SUCCESSFUL;
*/
rtems_status_code rtems_task_mode(
110e21: f7 45 08 00 04 00 00 testl $0x400,0x8(%ebp)
110e28: 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 ) {
110e2b: 3a 43 08 cmp 0x8(%ebx),%al
110e2e: 74 1b je 110e4b <rtems_task_mode+0xe3>
asr->is_enabled = is_asr_enabled;
110e30: 88 43 08 mov %al,0x8(%ebx)
)
{
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
110e33: 9c pushf
110e34: fa cli
110e35: 58 pop %eax
_signals = information->signals_pending;
110e36: 8b 53 18 mov 0x18(%ebx),%edx
information->signals_pending = information->signals_posted;
110e39: 8b 4b 14 mov 0x14(%ebx),%ecx
110e3c: 89 4b 18 mov %ecx,0x18(%ebx)
information->signals_posted = _signals;
110e3f: 89 53 14 mov %edx,0x14(%ebx)
_ISR_Enable( _level );
110e42: 50 push %eax
110e43: 9d popf
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
110e44: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
110e48: 0f 95 c1 setne %cl
if ( _System_state_Is_up( _System_state_Get() ) ) {
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
110e4b: 31 c0 xor %eax,%eax
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
110e4d: 83 3d 9c 54 12 00 03 cmpl $0x3,0x12549c
110e54: 75 26 jne 110e7c <rtems_task_mode+0x114>
bool are_signals_pending
)
{
Thread_Control *executing;
executing = _Thread_Executing;
110e56: 8b 15 68 58 12 00 mov 0x125868,%edx
if ( are_signals_pending ||
110e5c: 84 c9 test %cl,%cl
110e5e: 75 0e jne 110e6e <rtems_task_mode+0x106>
110e60: 3b 15 6c 58 12 00 cmp 0x12586c,%edx
110e66: 74 14 je 110e7c <rtems_task_mode+0x114>
(!_Thread_Is_heir( executing ) && executing->is_preemptible) ) {
110e68: 80 7a 74 00 cmpb $0x0,0x74(%edx)
110e6c: 74 0e je 110e7c <rtems_task_mode+0x114> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
110e6e: c6 05 74 58 12 00 01 movb $0x1,0x125874
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
110e75: e8 46 b2 ff ff call 10c0c0 <_Thread_Dispatch>
}
return RTEMS_SUCCESSFUL;
110e7a: 31 c0 xor %eax,%eax
}
110e7c: 83 c4 1c add $0x1c,%esp
110e7f: 5b pop %ebx
110e80: 5e pop %esi
110e81: 5f pop %edi
110e82: c9 leave
110e83: c3 ret
0010dd84 <rtems_task_set_priority>:
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
10dd84: 55 push %ebp
10dd85: 89 e5 mov %esp,%ebp
10dd87: 56 push %esi
10dd88: 53 push %ebx
10dd89: 83 ec 10 sub $0x10,%esp
10dd8c: 8b 5d 0c mov 0xc(%ebp),%ebx
10dd8f: 8b 75 10 mov 0x10(%ebp),%esi
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
10dd92: 85 db test %ebx,%ebx
10dd94: 74 10 je 10dda6 <rtems_task_set_priority+0x22>
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 ) );
10dd96: 0f b6 15 24 42 12 00 movzbl 0x124224,%edx
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
10dd9d: b8 13 00 00 00 mov $0x13,%eax
)
{
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
10dda2: 39 d3 cmp %edx,%ebx
10dda4: 77 52 ja 10ddf8 <rtems_task_set_priority+0x74>
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
return RTEMS_INVALID_ADDRESS;
10dda6: b8 09 00 00 00 mov $0x9,%eax
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
10ddab: 85 f6 test %esi,%esi
10ddad: 74 49 je 10ddf8 <rtems_task_set_priority+0x74>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
10ddaf: 51 push %ecx
10ddb0: 51 push %ecx
10ddb1: 8d 45 f4 lea -0xc(%ebp),%eax
10ddb4: 50 push %eax
10ddb5: ff 75 08 pushl 0x8(%ebp)
10ddb8: e8 cb 1e 00 00 call 10fc88 <_Thread_Get>
switch ( location ) {
10ddbd: 83 c4 10 add $0x10,%esp
10ddc0: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
10ddc4: 75 2d jne 10ddf3 <rtems_task_set_priority+0x6f>
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
10ddc6: 8b 50 14 mov 0x14(%eax),%edx
10ddc9: 89 16 mov %edx,(%esi)
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
10ddcb: 85 db test %ebx,%ebx
10ddcd: 74 1b je 10ddea <rtems_task_set_priority+0x66>
the_thread->real_priority = new_priority;
10ddcf: 89 58 18 mov %ebx,0x18(%eax)
if ( the_thread->resource_count == 0 ||
10ddd2: 83 78 1c 00 cmpl $0x0,0x1c(%eax)
10ddd6: 74 05 je 10dddd <rtems_task_set_priority+0x59>
10ddd8: 39 58 14 cmp %ebx,0x14(%eax)
10dddb: 76 0d jbe 10ddea <rtems_task_set_priority+0x66><== ALWAYS TAKEN
the_thread->current_priority > new_priority )
_Thread_Change_priority( the_thread, new_priority, false );
10dddd: 52 push %edx
10ddde: 6a 00 push $0x0
10dde0: 53 push %ebx
10dde1: 50 push %eax
10dde2: e8 a9 1a 00 00 call 10f890 <_Thread_Change_priority>
10dde7: 83 c4 10 add $0x10,%esp
}
_Thread_Enable_dispatch();
10ddea: e8 77 1e 00 00 call 10fc66 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10ddef: 31 c0 xor %eax,%eax
10ddf1: eb 05 jmp 10ddf8 <rtems_task_set_priority+0x74>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10ddf3: b8 04 00 00 00 mov $0x4,%eax
}
10ddf8: 8d 65 f8 lea -0x8(%ebp),%esp
10ddfb: 5b pop %ebx
10ddfc: 5e pop %esi
10ddfd: c9 leave
10ddfe: c3 ret
0010855b <rtems_termios_close>:
}
}
rtems_status_code
rtems_termios_close (void *arg)
{
10855b: 55 push %ebp
10855c: 89 e5 mov %esp,%ebp
10855e: 56 push %esi
10855f: 53 push %ebx
108560: 8b 75 08 mov 0x8(%ebp),%esi
rtems_libio_open_close_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
108563: 8b 06 mov (%esi),%eax
108565: 8b 58 34 mov 0x34(%eax),%ebx
rtems_status_code sc;
sc = rtems_semaphore_obtain(
108568: 51 push %ecx
108569: 6a 00 push $0x0
10856b: 6a 00 push $0x0
10856d: ff 35 3c 52 12 00 pushl 0x12523c
108573: e8 44 1c 00 00 call 10a1bc <rtems_semaphore_obtain>
rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
108578: 83 c4 10 add $0x10,%esp
10857b: 85 c0 test %eax,%eax
10857d: 0f 85 88 00 00 00 jne 10860b <rtems_termios_close+0xb0><== NEVER TAKEN
rtems_fatal_error_occurred (sc);
if (--tty->refcount == 0) {
108583: 8b 43 08 mov 0x8(%ebx),%eax
108586: 48 dec %eax
108587: 89 43 08 mov %eax,0x8(%ebx)
10858a: 85 c0 test %eax,%eax
10858c: 0f 85 3e 01 00 00 jne 1086d0 <rtems_termios_close+0x175>
if (rtems_termios_linesw[tty->t_line].l_close != NULL) {
108592: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax
108598: c1 e0 05 shl $0x5,%eax
10859b: 8b 80 f8 4e 12 00 mov 0x124ef8(%eax),%eax
1085a1: 85 c0 test %eax,%eax
1085a3: 74 08 je 1085ad <rtems_termios_close+0x52>
/*
* call discipline-specific close
*/
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
1085a5: 83 ec 0c sub $0xc,%esp
1085a8: 53 push %ebx
1085a9: ff d0 call *%eax
1085ab: eb 26 jmp 1085d3 <rtems_termios_close+0x78>
} else {
/*
* default: just flush output buffer
*/
sc = rtems_semaphore_obtain(tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
1085ad: 52 push %edx
1085ae: 6a 00 push $0x0
1085b0: 6a 00 push $0x0
1085b2: ff 73 18 pushl 0x18(%ebx)
1085b5: e8 02 1c 00 00 call 10a1bc <rtems_semaphore_obtain>
if (sc != RTEMS_SUCCESSFUL) {
1085ba: 83 c4 10 add $0x10,%esp
1085bd: 85 c0 test %eax,%eax
1085bf: 75 4a jne 10860b <rtems_termios_close+0xb0><== NEVER TAKEN
rtems_fatal_error_occurred (sc);
}
drainOutput (tty);
1085c1: 89 d8 mov %ebx,%eax
1085c3: e8 10 fb ff ff call 1080d8 <drainOutput>
rtems_semaphore_release (tty->osem);
1085c8: 83 ec 0c sub $0xc,%esp
1085cb: ff 73 18 pushl 0x18(%ebx)
1085ce: e8 d5 1c 00 00 call 10a2a8 <rtems_semaphore_release>
1085d3: 83 c4 10 add $0x10,%esp
}
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
1085d6: 83 bb b4 00 00 00 02 cmpl $0x2,0xb4(%ebx)
1085dd: 75 35 jne 108614 <rtems_termios_close+0xb9>
/*
* send "terminate" to I/O tasks
*/
sc = rtems_event_send( tty->rxTaskId, TERMIOS_RX_TERMINATE_EVENT );
1085df: 50 push %eax
1085e0: 50 push %eax
1085e1: 6a 01 push $0x1
1085e3: ff b3 c4 00 00 00 pushl 0xc4(%ebx)
1085e9: e8 66 17 00 00 call 109d54 <rtems_event_send>
if (sc != RTEMS_SUCCESSFUL)
1085ee: 83 c4 10 add $0x10,%esp
1085f1: 85 c0 test %eax,%eax
1085f3: 75 16 jne 10860b <rtems_termios_close+0xb0><== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_event_send( tty->txTaskId, TERMIOS_TX_TERMINATE_EVENT );
1085f5: 51 push %ecx
1085f6: 51 push %ecx
1085f7: 6a 01 push $0x1
1085f9: ff b3 c8 00 00 00 pushl 0xc8(%ebx)
1085ff: e8 50 17 00 00 call 109d54 <rtems_event_send>
if (sc != RTEMS_SUCCESSFUL)
108604: 83 c4 10 add $0x10,%esp
108607: 85 c0 test %eax,%eax
108609: 74 09 je 108614 <rtems_termios_close+0xb9><== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
10860b: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10860e: 50 push %eax <== NOT EXECUTED
10860f: e8 74 21 00 00 call 10a788 <rtems_fatal_error_occurred><== NOT EXECUTED
}
if (tty->device.lastClose)
108614: 8b 83 9c 00 00 00 mov 0x9c(%ebx),%eax
10861a: 85 c0 test %eax,%eax
10861c: 74 0d je 10862b <rtems_termios_close+0xd0>
(*tty->device.lastClose)(tty->major, tty->minor, arg);
10861e: 52 push %edx
10861f: 56 push %esi
108620: ff 73 10 pushl 0x10(%ebx)
108623: ff 73 0c pushl 0xc(%ebx)
108626: ff d0 call *%eax
108628: 83 c4 10 add $0x10,%esp
if (tty->forw == NULL) {
10862b: 8b 13 mov (%ebx),%edx
10862d: 85 d2 test %edx,%edx
10862f: 8b 43 04 mov 0x4(%ebx),%eax
108632: 75 11 jne 108645 <rtems_termios_close+0xea>
rtems_termios_ttyTail = tty->back;
108634: a3 40 52 12 00 mov %eax,0x125240
if ( rtems_termios_ttyTail != NULL ) {
108639: 85 c0 test %eax,%eax
10863b: 74 0b je 108648 <rtems_termios_close+0xed>
rtems_termios_ttyTail->forw = NULL;
10863d: c7 00 00 00 00 00 movl $0x0,(%eax)
108643: eb 03 jmp 108648 <rtems_termios_close+0xed>
}
} else {
tty->forw->back = tty->back;
108645: 89 42 04 mov %eax,0x4(%edx)
}
if (tty->back == NULL) {
108648: 8b 53 04 mov 0x4(%ebx),%edx
10864b: 85 d2 test %edx,%edx
10864d: 8b 03 mov (%ebx),%eax
10864f: 75 12 jne 108663 <rtems_termios_close+0x108>
rtems_termios_ttyHead = tty->forw;
108651: a3 44 52 12 00 mov %eax,0x125244
if ( rtems_termios_ttyHead != NULL ) {
108656: 85 c0 test %eax,%eax
108658: 74 0b je 108665 <rtems_termios_close+0x10a>
rtems_termios_ttyHead->back = NULL;
10865a: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)
108661: eb 02 jmp 108665 <rtems_termios_close+0x10a>
}
} else {
tty->back->forw = tty->forw;
108663: 89 02 mov %eax,(%edx)
}
rtems_semaphore_delete (tty->isem);
108665: 83 ec 0c sub $0xc,%esp
108668: ff 73 14 pushl 0x14(%ebx)
10866b: e8 bc 1a 00 00 call 10a12c <rtems_semaphore_delete>
rtems_semaphore_delete (tty->osem);
108670: 59 pop %ecx
108671: ff 73 18 pushl 0x18(%ebx)
108674: e8 b3 1a 00 00 call 10a12c <rtems_semaphore_delete>
rtems_semaphore_delete (tty->rawOutBuf.Semaphore);
108679: 5a pop %edx
10867a: ff b3 8c 00 00 00 pushl 0x8c(%ebx)
108680: e8 a7 1a 00 00 call 10a12c <rtems_semaphore_delete>
if ((tty->device.pollRead == NULL) ||
108685: 83 c4 10 add $0x10,%esp
108688: 83 bb a0 00 00 00 00 cmpl $0x0,0xa0(%ebx)
10868f: 74 09 je 10869a <rtems_termios_close+0x13f>
108691: 83 bb b4 00 00 00 02 cmpl $0x2,0xb4(%ebx)
108698: 75 0e jne 1086a8 <rtems_termios_close+0x14d>
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN))
rtems_semaphore_delete (tty->rawInBuf.Semaphore);
10869a: 83 ec 0c sub $0xc,%esp
10869d: ff 73 68 pushl 0x68(%ebx)
1086a0: e8 87 1a 00 00 call 10a12c <rtems_semaphore_delete>
1086a5: 83 c4 10 add $0x10,%esp
free (tty->rawInBuf.theBuf);
1086a8: 83 ec 0c sub $0xc,%esp
1086ab: ff 73 58 pushl 0x58(%ebx)
1086ae: e8 c5 ec ff ff call 107378 <free>
free (tty->rawOutBuf.theBuf);
1086b3: 58 pop %eax
1086b4: ff 73 7c pushl 0x7c(%ebx)
1086b7: e8 bc ec ff ff call 107378 <free>
free (tty->cbuf);
1086bc: 5e pop %esi
1086bd: ff 73 1c pushl 0x1c(%ebx)
1086c0: e8 b3 ec ff ff call 107378 <free>
free (tty);
1086c5: 89 1c 24 mov %ebx,(%esp)
1086c8: e8 ab ec ff ff call 107378 <free>
1086cd: 83 c4 10 add $0x10,%esp
}
rtems_semaphore_release (rtems_termios_ttyMutex);
1086d0: 83 ec 0c sub $0xc,%esp
1086d3: ff 35 3c 52 12 00 pushl 0x12523c
1086d9: e8 ca 1b 00 00 call 10a2a8 <rtems_semaphore_release>
return RTEMS_SUCCESSFUL;
}
1086de: 31 c0 xor %eax,%eax
1086e0: 8d 65 f8 lea -0x8(%ebp),%esp
1086e3: 5b pop %ebx
1086e4: 5e pop %esi
1086e5: c9 leave
1086e6: c3 ret
00109894 <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)
{
109894: 55 push %ebp
109895: 89 e5 mov %esp,%ebp
109897: 83 ec 08 sub $0x8,%esp
10989a: 8b 45 08 mov 0x8(%ebp),%eax
rtems_status_code sc;
/*
* sum up character count already sent
*/
tty->t_dqlen += len;
10989d: 8b 55 0c mov 0xc(%ebp),%edx
1098a0: 01 90 90 00 00 00 add %edx,0x90(%eax)
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
1098a6: 83 b8 b4 00 00 00 02 cmpl $0x2,0xb4(%eax)
1098ad: 75 1f jne 1098ce <rtems_termios_dequeue_characters+0x3a>
/*
* send wake up to transmitter task
*/
sc = rtems_event_send(tty->txTaskId, TERMIOS_TX_START_EVENT);
1098af: 52 push %edx
1098b0: 52 push %edx
1098b1: 6a 02 push $0x2
1098b3: ff b0 c8 00 00 00 pushl 0xc8(%eax)
1098b9: e8 96 04 00 00 call 109d54 <rtems_event_send>
if (sc != RTEMS_SUCCESSFUL)
1098be: 83 c4 10 add $0x10,%esp
1098c1: 85 c0 test %eax,%eax
1098c3: 74 30 je 1098f5 <rtems_termios_dequeue_characters+0x61><== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
1098c5: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
1098c8: 50 push %eax <== NOT EXECUTED
1098c9: e8 ba 0e 00 00 call 10a788 <rtems_fatal_error_occurred><== NOT EXECUTED
return 0; /* nothing to output in IRQ... */
}
if (tty->t_line == PPPDISC ) {
1098ce: 83 b8 cc 00 00 00 05 cmpl $0x5,0xcc(%eax)
1098d5: 75 15 jne 1098ec <rtems_termios_dequeue_characters+0x58>
/*
* call any line discipline start function
*/
if (rtems_termios_linesw[tty->t_line].l_start != NULL) {
1098d7: 8b 15 a8 4f 12 00 mov 0x124fa8,%edx
1098dd: 85 d2 test %edx,%edx
1098df: 74 14 je 1098f5 <rtems_termios_dequeue_characters+0x61><== NEVER TAKEN
rtems_termios_linesw[tty->t_line].l_start(tty);
1098e1: 83 ec 0c sub $0xc,%esp
1098e4: 50 push %eax
1098e5: ff d2 call *%edx
1098e7: 83 c4 10 add $0x10,%esp
1098ea: eb 09 jmp 1098f5 <rtems_termios_dequeue_characters+0x61>
}
return 0; /* nothing to output in IRQ... */
}
return rtems_termios_refill_transmitter(tty);
1098ec: 89 45 08 mov %eax,0x8(%ebp)
}
1098ef: c9 leave
rtems_termios_linesw[tty->t_line].l_start(tty);
}
return 0; /* nothing to output in IRQ... */
}
return rtems_termios_refill_transmitter(tty);
1098f0: e9 6d fd ff ff jmp 109662 <rtems_termios_refill_transmitter>
}
1098f5: 31 c0 xor %eax,%eax
1098f7: c9 leave
1098f8: c3 ret
00109373 <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)
{
109373: 55 push %ebp
109374: 89 e5 mov %esp,%ebp
109376: 57 push %edi
109377: 56 push %esi
109378: 53 push %ebx
109379: 83 ec 2c sub $0x2c,%esp
10937c: 8b 5d 08 mov 0x8(%ebp),%ebx
10937f: 8b 7d 0c mov 0xc(%ebp),%edi
109382: 8b 4d 10 mov 0x10(%ebp),%ecx
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) {
109385: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax
10938b: c1 e0 05 shl $0x5,%eax
10938e: 89 ca mov %ecx,%edx
109390: 83 b8 04 4f 12 00 00 cmpl $0x0,0x124f04(%eax)
109397: 75 3b jne 1093d4 <rtems_termios_enqueue_raw_characters+0x61>
109399: 89 4d e0 mov %ecx,-0x20(%ebp)
10939c: c6 45 df 00 movb $0x0,-0x21(%ebp)
1093a0: 31 f6 xor %esi,%esi
/*
* 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);
1093a2: 8d 43 30 lea 0x30(%ebx),%eax
1093a5: 89 45 d4 mov %eax,-0x2c(%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,
1093a8: 8d 53 4a lea 0x4a(%ebx),%edx
1093ab: 89 55 d0 mov %edx,-0x30(%ebp)
1093ae: e9 26 02 00 00 jmp 1095d9 <rtems_termios_enqueue_raw_characters+0x266>
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--) {
c = *buf++;
1093b3: 0f be 0f movsbl (%edi),%ecx
1093b6: 47 inc %edi
rtems_termios_linesw[tty->t_line].l_rint(c,tty);
1093b7: 56 push %esi
1093b8: 56 push %esi
1093b9: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax
1093bf: c1 e0 05 shl $0x5,%eax
1093c2: 53 push %ebx
1093c3: 51 push %ecx
1093c4: 89 55 cc mov %edx,-0x34(%ebp)
1093c7: ff 90 04 4f 12 00 call *0x124f04(%eax)
1093cd: 8b 55 cc mov -0x34(%ebp),%edx
1093d0: 4a dec %edx
1093d1: 83 c4 10 add $0x10,%esp
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--) {
1093d4: 85 d2 test %edx,%edx
1093d6: 75 db jne 1093b3 <rtems_termios_enqueue_raw_characters+0x40>
*/
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;
1093d8: 31 f6 xor %esi,%esi
}
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
1093da: 83 bb e4 00 00 00 00 cmpl $0x0,0xe4(%ebx)
1093e1: 0f 85 0d 02 00 00 jne 1095f4 <rtems_termios_enqueue_raw_characters+0x281><== NEVER TAKEN
1093e7: 8b 83 dc 00 00 00 mov 0xdc(%ebx),%eax
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
tty->tty_rcvwakeup = 1;
}
return 0;
1093ed: 89 d6 mov %edx,%esi
}
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
1093ef: 85 c0 test %eax,%eax
1093f1: 0f 84 fd 01 00 00 je 1095f4 <rtems_termios_enqueue_raw_characters+0x281><== NEVER TAKEN
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
1093f7: 51 push %ecx
1093f8: 51 push %ecx
1093f9: ff b3 e0 00 00 00 pushl 0xe0(%ebx)
1093ff: 8d 53 30 lea 0x30(%ebx),%edx
109402: 52 push %edx
109403: ff d0 call *%eax
tty->tty_rcvwakeup = 1;
109405: c7 83 e4 00 00 00 01 movl $0x1,0xe4(%ebx)
10940c: 00 00 00
10940f: e9 dd 01 00 00 jmp 1095f1 <rtems_termios_enqueue_raw_characters+0x27e>
}
return 0;
}
while (len--) {
c = *buf++;
109414: 8a 0f mov (%edi),%cl
109416: 88 4d de mov %cl,-0x22(%ebp)
109419: 47 inc %edi
/* FIXME: implement IXANY: any character restarts output */
/* if incoming XON/XOFF controls outgoing stream: */
if (tty->flow_ctrl & FL_MDXON) {
10941a: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
109420: f6 c4 02 test $0x2,%ah
109423: 74 46 je 10946b <rtems_termios_enqueue_raw_characters+0xf8>
/* if received char is V_STOP and V_START (both are equal value) */
if (c == tty->termios.c_cc[VSTOP]) {
109425: 0f be c1 movsbl %cl,%eax
109428: 0f b6 53 4a movzbl 0x4a(%ebx),%edx
10942c: 39 d0 cmp %edx,%eax
10942e: 75 28 jne 109458 <rtems_termios_enqueue_raw_characters+0xe5>
if (c == tty->termios.c_cc[VSTART]) {
109430: 0f b6 53 49 movzbl 0x49(%ebx),%edx
109434: 39 d0 cmp %edx,%eax
109436: 75 0b jne 109443 <rtems_termios_enqueue_raw_characters+0xd0><== ALWAYS TAKEN
/* received VSTOP and VSTART==VSTOP? */
/* then toggle "stop output" status */
tty->flow_ctrl = tty->flow_ctrl ^ FL_ORCVXOF;
109438: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10943e: 83 f0 10 xor $0x10,%eax <== NOT EXECUTED
109441: eb 09 jmp 10944c <rtems_termios_enqueue_raw_characters+0xd9><== NOT EXECUTED
}
else {
/* VSTOP received (other code than VSTART) */
/* stop output */
tty->flow_ctrl |= FL_ORCVXOF;
109443: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
109449: 83 c8 10 or $0x10,%eax
10944c: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx)
* 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)
{
109452: c6 45 df 01 movb $0x1,-0x21(%ebp)
109456: eb 19 jmp 109471 <rtems_termios_enqueue_raw_characters+0xfe>
/* stop output */
tty->flow_ctrl |= FL_ORCVXOF;
}
flow_rcv = true;
}
else if (c == tty->termios.c_cc[VSTART]) {
109458: 0f b6 53 49 movzbl 0x49(%ebx),%edx
10945c: 39 d0 cmp %edx,%eax
10945e: 75 0b jne 10946b <rtems_termios_enqueue_raw_characters+0xf8><== ALWAYS TAKEN
/* VSTART received */
/* restart output */
tty->flow_ctrl &= ~FL_ORCVXOF;
109460: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
109466: 83 e0 ef and $0xffffffef,%eax <== NOT EXECUTED
109469: eb e1 jmp 10944c <rtems_termios_enqueue_raw_characters+0xd9><== NOT EXECUTED
flow_rcv = true;
}
}
if (flow_rcv) {
10946b: 80 7d df 00 cmpb $0x0,-0x21(%ebp)
10946f: 74 51 je 1094c2 <rtems_termios_enqueue_raw_characters+0x14f><== ALWAYS TAKEN
/* restart output according to FL_ORCVXOF flag */
if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) {
109471: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
109477: 83 e0 30 and $0x30,%eax
10947a: 83 f8 20 cmp $0x20,%eax
10947d: 0f 85 53 01 00 00 jne 1095d6 <rtems_termios_enqueue_raw_characters+0x263>
/* disable interrupts */
rtems_interrupt_disable(level);
109483: 9c pushf <== NOT EXECUTED
109484: fa cli <== NOT EXECUTED
109485: 8f 45 e4 popl -0x1c(%ebp) <== NOT EXECUTED
tty->flow_ctrl &= ~FL_OSTOP;
109488: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10948e: 83 e0 df and $0xffffffdf,%eax <== NOT EXECUTED
109491: 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) {
109497: 83 bb 94 00 00 00 00 cmpl $0x0,0x94(%ebx) <== NOT EXECUTED
10949e: 74 19 je 1094b9 <rtems_termios_enqueue_raw_characters+0x146><== NOT EXECUTED
/* if chars available, call write function... */
(*tty->device.write)(
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1);
1094a0: 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)(
1094a6: 52 push %edx <== NOT EXECUTED
1094a7: 6a 01 push $0x1 <== NOT EXECUTED
1094a9: 03 43 7c add 0x7c(%ebx),%eax <== NOT EXECUTED
1094ac: 50 push %eax <== NOT EXECUTED
1094ad: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
1094b0: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED
1094b6: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1);
}
/* reenable interrupts */
rtems_interrupt_enable(level);
1094b9: ff 75 e4 pushl -0x1c(%ebp) <== NOT EXECUTED
1094bc: 9d popf <== NOT EXECUTED
1094bd: e9 14 01 00 00 jmp 1095d6 <rtems_termios_enqueue_raw_characters+0x263><== NOT EXECUTED
}
} else {
newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size;
1094c2: 8b 43 60 mov 0x60(%ebx),%eax
1094c5: 8b 4b 64 mov 0x64(%ebx),%ecx
1094c8: 40 inc %eax
1094c9: 31 d2 xor %edx,%edx
1094cb: f7 f1 div %ecx
1094cd: 89 55 e4 mov %edx,-0x1c(%ebp)
/* if chars_in_buffer > highwater */
rtems_interrupt_disable(level);
1094d0: 9c pushf
1094d1: fa cli
1094d2: 8f 45 d8 popl -0x28(%ebp)
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
1094d5: 8b 53 5c mov 0x5c(%ebx),%edx
1094d8: 8b 43 64 mov 0x64(%ebx),%eax
% tty->rawInBuf.Size) > tty->highwater) &&
1094db: 8b 4b 64 mov 0x64(%ebx),%ecx
}
} 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)
1094de: 29 d0 sub %edx,%eax
1094e0: 03 45 e4 add -0x1c(%ebp),%eax
% tty->rawInBuf.Size) > tty->highwater) &&
1094e3: 31 d2 xor %edx,%edx
1094e5: f7 f1 div %ecx
}
} 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)
1094e7: 3b 93 c0 00 00 00 cmp 0xc0(%ebx),%edx
1094ed: 0f 86 98 00 00 00 jbe 10958b <rtems_termios_enqueue_raw_characters+0x218><== ALWAYS TAKEN
% tty->rawInBuf.Size) > tty->highwater) &&
!(tty->flow_ctrl & FL_IREQXOF)) {
1094f3: 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) &&
1094f9: a8 01 test $0x1,%al <== NOT EXECUTED
1094fb: 0f 85 8a 00 00 00 jne 10958b <rtems_termios_enqueue_raw_characters+0x218><== NOT EXECUTED
!(tty->flow_ctrl & FL_IREQXOF)) {
/* incoming data stream should be stopped */
tty->flow_ctrl |= FL_IREQXOF;
109501: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
109507: 83 c8 01 or $0x1,%eax <== NOT EXECUTED
10950a: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF))
109510: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
109516: 25 02 04 00 00 and $0x402,%eax <== NOT EXECUTED
10951b: 3d 00 04 00 00 cmp $0x400,%eax <== NOT EXECUTED
109520: 75 33 jne 109555 <rtems_termios_enqueue_raw_characters+0x1e2><== NOT EXECUTED
== (FL_MDXOF ) ) {
if ((tty->flow_ctrl & FL_OSTOP) ||
109522: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
109528: a8 20 test $0x20,%al <== NOT EXECUTED
10952a: 75 09 jne 109535 <rtems_termios_enqueue_raw_characters+0x1c2><== NOT EXECUTED
10952c: 83 bb 94 00 00 00 00 cmpl $0x0,0x94(%ebx) <== NOT EXECUTED
109533: 75 56 jne 10958b <rtems_termios_enqueue_raw_characters+0x218><== 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;
109535: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10953b: 83 c8 02 or $0x2,%eax <== NOT EXECUTED
10953e: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
(*tty->device.write)(tty->minor,
109544: 51 push %ecx <== NOT EXECUTED
109545: 6a 01 push $0x1 <== NOT EXECUTED
109547: ff 75 d0 pushl -0x30(%ebp) <== NOT EXECUTED
10954a: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
10954d: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED
109553: eb 33 jmp 109588 <rtems_termios_enqueue_raw_characters+0x215><== NOT EXECUTED
(void *)&(tty->termios.c_cc[VSTOP]), 1);
}
} else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) {
109555: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10955b: 25 04 01 00 00 and $0x104,%eax <== NOT EXECUTED
109560: 3d 00 01 00 00 cmp $0x100,%eax <== NOT EXECUTED
109565: 75 24 jne 10958b <rtems_termios_enqueue_raw_characters+0x218><== NOT EXECUTED
tty->flow_ctrl |= FL_IRTSOFF;
109567: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10956d: 83 c8 04 or $0x4,%eax <== NOT EXECUTED
109570: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
/* deactivate RTS line */
if (tty->device.stopRemoteTx != NULL) {
109576: 8b 83 ac 00 00 00 mov 0xac(%ebx),%eax <== NOT EXECUTED
10957c: 85 c0 test %eax,%eax <== NOT EXECUTED
10957e: 74 0b je 10958b <rtems_termios_enqueue_raw_characters+0x218><== NOT EXECUTED
tty->device.stopRemoteTx(tty->minor);
109580: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
109583: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
109586: ff d0 call *%eax <== NOT EXECUTED
109588: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
}
}
/* reenable interrupts */
rtems_interrupt_enable(level);
10958b: ff 75 d8 pushl -0x28(%ebp)
10958e: 9d popf
if (newTail == tty->rawInBuf.Head) {
10958f: 8b 43 5c mov 0x5c(%ebx),%eax
109592: 39 45 e4 cmp %eax,-0x1c(%ebp)
109595: 75 03 jne 10959a <rtems_termios_enqueue_raw_characters+0x227><== ALWAYS TAKEN
dropped++;
109597: 46 inc %esi <== NOT EXECUTED
109598: eb 3c jmp 1095d6 <rtems_termios_enqueue_raw_characters+0x263><== NOT EXECUTED
} else {
tty->rawInBuf.theBuf[newTail] = c;
10959a: 8b 43 58 mov 0x58(%ebx),%eax
10959d: 8a 4d de mov -0x22(%ebp),%cl
1095a0: 8b 55 e4 mov -0x1c(%ebp),%edx
1095a3: 88 0c 10 mov %cl,(%eax,%edx,1)
tty->rawInBuf.Tail = newTail;
1095a6: 89 53 60 mov %edx,0x60(%ebx)
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
1095a9: 83 bb e4 00 00 00 00 cmpl $0x0,0xe4(%ebx)
1095b0: 75 24 jne 1095d6 <rtems_termios_enqueue_raw_characters+0x263><== NEVER TAKEN
1095b2: 8b 83 dc 00 00 00 mov 0xdc(%ebx),%eax
1095b8: 85 c0 test %eax,%eax
1095ba: 74 1a je 1095d6 <rtems_termios_enqueue_raw_characters+0x263><== ALWAYS TAKEN
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
1095bc: 52 push %edx <== NOT EXECUTED
1095bd: 52 push %edx <== NOT EXECUTED
1095be: ff b3 e0 00 00 00 pushl 0xe0(%ebx) <== NOT EXECUTED
1095c4: ff 75 d4 pushl -0x2c(%ebp) <== NOT EXECUTED
1095c7: ff d0 call *%eax <== NOT EXECUTED
tty->tty_rcvwakeup = 1;
1095c9: c7 83 e4 00 00 00 01 movl $0x1,0xe4(%ebx) <== NOT EXECUTED
1095d0: 00 00 00
1095d3: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
1095d6: ff 4d e0 decl -0x20(%ebp)
tty->tty_rcvwakeup = 1;
}
return 0;
}
while (len--) {
1095d9: 83 7d e0 00 cmpl $0x0,-0x20(%ebp)
1095dd: 0f 85 31 fe ff ff jne 109414 <rtems_termios_enqueue_raw_characters+0xa1>
}
}
}
}
tty->rawInBufDropped += dropped;
1095e3: 01 73 78 add %esi,0x78(%ebx)
rtems_semaphore_release (tty->rawInBuf.Semaphore);
1095e6: 83 ec 0c sub $0xc,%esp
1095e9: ff 73 68 pushl 0x68(%ebx)
1095ec: e8 b7 0c 00 00 call 10a2a8 <rtems_semaphore_release>
return dropped;
1095f1: 83 c4 10 add $0x10,%esp
}
1095f4: 89 f0 mov %esi,%eax
1095f6: 8d 65 f4 lea -0xc(%ebp),%esp
1095f9: 5b pop %ebx
1095fa: 5e pop %esi
1095fb: 5f pop %edi
1095fc: c9 leave
1095fd: c3 ret
00108706 <rtems_termios_ioctl>:
}
}
rtems_status_code
rtems_termios_ioctl (void *arg)
{
108706: 55 push %ebp
108707: 89 e5 mov %esp,%ebp
108709: 57 push %edi
10870a: 56 push %esi
10870b: 53 push %ebx
10870c: 83 ec 20 sub $0x20,%esp
rtems_libio_ioctl_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
10870f: 8b 55 08 mov 0x8(%ebp),%edx
108712: 8b 02 mov (%edx),%eax
108714: 8b 58 34 mov 0x34(%eax),%ebx
struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer;
108717: 8b 72 08 mov 0x8(%edx),%esi
rtems_status_code sc;
args->ioctl_return = 0;
10871a: c7 42 0c 00 00 00 00 movl $0x0,0xc(%edx)
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
108721: 6a 00 push $0x0
108723: 6a 00 push $0x0
108725: ff 73 18 pushl 0x18(%ebx)
108728: e8 8f 1a 00 00 call 10a1bc <rtems_semaphore_obtain>
10872d: 89 45 e4 mov %eax,-0x1c(%ebp)
if (sc != RTEMS_SUCCESSFUL) {
108730: 83 c4 10 add $0x10,%esp
108733: 85 c0 test %eax,%eax
108735: 74 0b je 108742 <rtems_termios_ioctl+0x3c><== ALWAYS TAKEN
args->ioctl_return = sc;
108737: 8b 4d 08 mov 0x8(%ebp),%ecx <== NOT EXECUTED
10873a: 89 41 0c mov %eax,0xc(%ecx) <== NOT EXECUTED
return sc;
10873d: e9 05 03 00 00 jmp 108a47 <rtems_termios_ioctl+0x341><== NOT EXECUTED
}
switch (args->command) {
108742: 8b 55 08 mov 0x8(%ebp),%edx
108745: 8b 42 04 mov 0x4(%edx),%eax
108748: 83 f8 04 cmp $0x4,%eax
10874b: 0f 84 4d 02 00 00 je 10899e <rtems_termios_ioctl+0x298>
108751: 77 10 ja 108763 <rtems_termios_ioctl+0x5d>
108753: 83 f8 02 cmp $0x2,%eax
108756: 74 77 je 1087cf <rtems_termios_ioctl+0xc9>
108758: 0f 87 1e 02 00 00 ja 10897c <rtems_termios_ioctl+0x276>
10875e: 48 dec %eax
10875f: 75 2f jne 108790 <rtems_termios_ioctl+0x8a><== NEVER TAKEN
108761: eb 55 jmp 1087b8 <rtems_termios_ioctl+0xb2>
108763: 3d 7f 66 04 40 cmp $0x4004667f,%eax
108768: 0f 84 a5 02 00 00 je 108a13 <rtems_termios_ioctl+0x30d><== NEVER TAKEN
10876e: 77 0a ja 10877a <rtems_termios_ioctl+0x74>
108770: 83 f8 05 cmp $0x5,%eax
108773: 75 1b jne 108790 <rtems_termios_ioctl+0x8a>
108775: e9 0e 02 00 00 jmp 108988 <rtems_termios_ioctl+0x282>
10877a: 3d 1a 74 04 40 cmp $0x4004741a,%eax
10877f: 0f 84 7e 02 00 00 je 108a03 <rtems_termios_ioctl+0x2fd>
108785: 3d 1b 74 04 80 cmp $0x8004741b,%eax
10878a: 0f 84 21 02 00 00 je 1089b1 <rtems_termios_ioctl+0x2ab><== ALWAYS TAKEN
default:
if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) {
108790: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax
108796: c1 e0 05 shl $0x5,%eax
108799: 8b 80 0c 4f 12 00 mov 0x124f0c(%eax),%eax
sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args);
}
else {
sc = RTEMS_INVALID_NUMBER;
10879f: c7 45 e4 0a 00 00 00 movl $0xa,-0x1c(%ebp)
args->ioctl_return = sc;
return sc;
}
switch (args->command) {
default:
if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) {
1087a6: 85 c0 test %eax,%eax
1087a8: 0f 84 82 02 00 00 je 108a30 <rtems_termios_ioctl+0x32a><== NEVER TAKEN
sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args);
1087ae: 52 push %edx
1087af: 52 push %edx
1087b0: ff 75 08 pushl 0x8(%ebp)
1087b3: e9 40 02 00 00 jmp 1089f8 <rtems_termios_ioctl+0x2f2>
sc = RTEMS_INVALID_NUMBER;
}
break;
case RTEMS_IO_GET_ATTRIBUTES:
*(struct termios *)args->buffer = tty->termios;
1087b8: 8b 4d 08 mov 0x8(%ebp),%ecx
1087bb: 8b 41 08 mov 0x8(%ecx),%eax
1087be: 8d 73 30 lea 0x30(%ebx),%esi
1087c1: b9 09 00 00 00 mov $0x9,%ecx
1087c6: 89 c7 mov %eax,%edi
1087c8: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
break;
1087ca: e9 61 02 00 00 jmp 108a30 <rtems_termios_ioctl+0x32a>
case RTEMS_IO_SET_ATTRIBUTES:
tty->termios = *(struct termios *)args->buffer;
1087cf: 8b 45 08 mov 0x8(%ebp),%eax
1087d2: 8b 70 08 mov 0x8(%eax),%esi
1087d5: 8d 7b 30 lea 0x30(%ebx),%edi
1087d8: b9 09 00 00 00 mov $0x9,%ecx
1087dd: 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) &&
1087df: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
1087e5: f6 c4 02 test $0x2,%ah
1087e8: 74 57 je 108841 <rtems_termios_ioctl+0x13b>
1087ea: f6 43 31 04 testb $0x4,0x31(%ebx)
1087ee: 75 51 jne 108841 <rtems_termios_ioctl+0x13b>
!(tty->termios.c_iflag & IXON)) {
/* clear related flags in flow_ctrl */
tty->flow_ctrl &= ~(FL_MDXON | FL_ORCVXOF);
1087f0: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
1087f6: 25 ef fd ff ff and $0xfffffdef,%eax
1087fb: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx)
/* has output been stopped due to received XOFF? */
if (tty->flow_ctrl & FL_OSTOP) {
108801: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
108807: a8 20 test $0x20,%al
108809: 74 36 je 108841 <rtems_termios_ioctl+0x13b><== ALWAYS TAKEN
/* disable interrupts */
rtems_interrupt_disable(level);
10880b: 9c pushf <== NOT EXECUTED
10880c: fa cli <== NOT EXECUTED
10880d: 5e pop %esi <== NOT EXECUTED
tty->flow_ctrl &= ~FL_OSTOP;
10880e: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
108814: 83 e0 df and $0xffffffdf,%eax <== NOT EXECUTED
108817: 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) {
10881d: 83 bb 94 00 00 00 00 cmpl $0x0,0x94(%ebx) <== NOT EXECUTED
108824: 74 19 je 10883f <rtems_termios_ioctl+0x139><== NOT EXECUTED
/* if chars available, call write function... */
(*tty->device.write)(
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
108826: 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)(
10882c: 57 push %edi <== NOT EXECUTED
10882d: 6a 01 push $0x1 <== NOT EXECUTED
10882f: 03 43 7c add 0x7c(%ebx),%eax <== NOT EXECUTED
108832: 50 push %eax <== NOT EXECUTED
108833: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
108836: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED
10883c: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
}
/* reenable interrupts */
rtems_interrupt_enable(level);
10883f: 56 push %esi <== NOT EXECUTED
108840: 9d popf <== NOT EXECUTED
}
}
/* check for incoming XON/XOFF flow control switched off */
if (( tty->flow_ctrl & FL_MDXOF) && !(tty->termios.c_iflag & IXOFF)) {
108841: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
108847: f6 c4 04 test $0x4,%ah
10884a: 74 24 je 108870 <rtems_termios_ioctl+0x16a>
10884c: f6 43 31 10 testb $0x10,0x31(%ebx)
108850: 75 1e jne 108870 <rtems_termios_ioctl+0x16a><== NEVER TAKEN
/* clear related flags in flow_ctrl */
tty->flow_ctrl &= ~(FL_MDXOF);
108852: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
108858: 80 e4 fb and $0xfb,%ah
10885b: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx)
/* FIXME: what happens, if we had sent XOFF but not yet XON? */
tty->flow_ctrl &= ~(FL_ISNTXOF);
108861: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
108867: 83 e0 fd and $0xfffffffd,%eax
10886a: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx)
}
/* check for incoming RTS/CTS flow control switched off */
if (( tty->flow_ctrl & FL_MDRTS) && !(tty->termios.c_cflag & CRTSCTS)) {
108870: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
108876: f6 c4 01 test $0x1,%ah
108879: 74 43 je 1088be <rtems_termios_ioctl+0x1b8><== ALWAYS TAKEN
10887b: 83 7b 38 00 cmpl $0x0,0x38(%ebx) <== NOT EXECUTED
10887f: 78 3d js 1088be <rtems_termios_ioctl+0x1b8><== NOT EXECUTED
/* clear related flags in flow_ctrl */
tty->flow_ctrl &= ~(FL_MDRTS);
108881: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
108887: 80 e4 fe and $0xfe,%ah <== NOT EXECUTED
10888a: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
/* restart remote Tx, if it was stopped */
if ((tty->flow_ctrl & FL_IRTSOFF) && (tty->device.startRemoteTx != NULL)) {
108890: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
108896: a8 04 test $0x4,%al <== NOT EXECUTED
108898: 74 15 je 1088af <rtems_termios_ioctl+0x1a9><== NOT EXECUTED
10889a: 8b 83 b0 00 00 00 mov 0xb0(%ebx),%eax <== NOT EXECUTED
1088a0: 85 c0 test %eax,%eax <== NOT EXECUTED
1088a2: 74 0b je 1088af <rtems_termios_ioctl+0x1a9><== NOT EXECUTED
tty->device.startRemoteTx(tty->minor);
1088a4: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
1088a7: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
1088aa: ff d0 call *%eax <== NOT EXECUTED
1088ac: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
tty->flow_ctrl &= ~(FL_IRTSOFF);
1088af: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
1088b5: 83 e0 fb and $0xfffffffb,%eax <== NOT EXECUTED
1088b8: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== 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) {
1088be: 83 7b 38 00 cmpl $0x0,0x38(%ebx)
1088c2: 79 0f jns 1088d3 <rtems_termios_ioctl+0x1cd><== ALWAYS TAKEN
tty->flow_ctrl |= FL_MDRTS;
1088c4: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
1088ca: 80 cc 01 or $0x1,%ah <== NOT EXECUTED
1088cd: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
}
/* check for incoming XON/XOF flow control switched on */
if (tty->termios.c_iflag & IXOFF) {
1088d3: 8b 53 30 mov 0x30(%ebx),%edx
1088d6: f6 c6 10 test $0x10,%dh
1088d9: 74 0f je 1088ea <rtems_termios_ioctl+0x1e4>
tty->flow_ctrl |= FL_MDXOF;
1088db: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
1088e1: 80 cc 04 or $0x4,%ah
1088e4: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx)
}
/* check for outgoing XON/XOF flow control switched on */
if (tty->termios.c_iflag & IXON) {
1088ea: 80 e6 04 and $0x4,%dh
1088ed: 74 0f je 1088fe <rtems_termios_ioctl+0x1f8>
tty->flow_ctrl |= FL_MDXON;
1088ef: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
1088f5: 80 cc 02 or $0x2,%ah
1088f8: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx)
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) {
1088fe: f6 43 3c 02 testb $0x2,0x3c(%ebx)
108902: 75 39 jne 10893d <rtems_termios_ioctl+0x237>
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
tty->vtimeTicks = tty->termios.c_cc[VTIME] *
108904: 0f b6 73 46 movzbl 0x46(%ebx),%esi
rtems_clock_get_ticks_per_second() / 10;
108908: e8 6f 12 00 00 call 109b7c <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] *
10890d: 0f af c6 imul %esi,%eax
rtems_clock_get_ticks_per_second() / 10;
108910: b9 0a 00 00 00 mov $0xa,%ecx
108915: 31 d2 xor %edx,%edx
108917: f7 f1 div %ecx
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] *
108919: 89 43 54 mov %eax,0x54(%ebx)
rtems_clock_get_ticks_per_second() / 10;
if (tty->termios.c_cc[VTIME]) {
10891c: 80 7b 46 00 cmpb $0x0,0x46(%ebx)
108920: 74 15 je 108937 <rtems_termios_ioctl+0x231>
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
108922: c7 43 6c 00 00 00 00 movl $0x0,0x6c(%ebx)
tty->rawInBufSemaphoreTimeout = tty->vtimeTicks;
108929: 89 43 70 mov %eax,0x70(%ebx)
if (tty->termios.c_cc[VMIN])
10892c: 80 7b 47 00 cmpb $0x0,0x47(%ebx)
108930: 75 19 jne 10894b <rtems_termios_ioctl+0x245>
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
else
tty->rawInBufSemaphoreFirstTimeout = tty->vtimeTicks;
108932: 89 43 74 mov %eax,0x74(%ebx)
108935: eb 24 jmp 10895b <rtems_termios_ioctl+0x255>
} else {
if (tty->termios.c_cc[VMIN]) {
108937: 80 7b 47 00 cmpb $0x0,0x47(%ebx)
10893b: 74 17 je 108954 <rtems_termios_ioctl+0x24e><== ALWAYS TAKEN
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
10893d: c7 43 6c 00 00 00 00 movl $0x0,0x6c(%ebx)
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
108944: c7 43 70 00 00 00 00 movl $0x0,0x70(%ebx)
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
10894b: c7 43 74 00 00 00 00 movl $0x0,0x74(%ebx)
108952: eb 07 jmp 10895b <rtems_termios_ioctl+0x255>
} else {
tty->rawInBufSemaphoreOptions = RTEMS_NO_WAIT;
108954: c7 43 6c 01 00 00 00 movl $0x1,0x6c(%ebx)
}
}
}
if (tty->device.setAttributes)
10895b: 8b 83 a8 00 00 00 mov 0xa8(%ebx),%eax
108961: 85 c0 test %eax,%eax
108963: 0f 84 c7 00 00 00 je 108a30 <rtems_termios_ioctl+0x32a><== NEVER TAKEN
(*tty->device.setAttributes)(tty->minor, &tty->termios);
108969: 56 push %esi
10896a: 56 push %esi
10896b: 8d 53 30 lea 0x30(%ebx),%edx
10896e: 52 push %edx
10896f: ff 73 10 pushl 0x10(%ebx)
108972: ff d0 call *%eax
108974: 83 c4 10 add $0x10,%esp
108977: e9 b4 00 00 00 jmp 108a30 <rtems_termios_ioctl+0x32a>
break;
case RTEMS_IO_TCDRAIN:
drainOutput (tty);
10897c: 89 d8 mov %ebx,%eax
10897e: e8 55 f7 ff ff call 1080d8 <drainOutput>
break;
108983: e9 a8 00 00 00 jmp 108a30 <rtems_termios_ioctl+0x32a>
case RTEMS_IO_SNDWAKEUP:
tty->tty_snd = *wakeup;
108988: 8b 06 mov (%esi),%eax
10898a: 8b 56 04 mov 0x4(%esi),%edx
10898d: 89 83 d4 00 00 00 mov %eax,0xd4(%ebx)
108993: 89 93 d8 00 00 00 mov %edx,0xd8(%ebx)
break;
108999: e9 92 00 00 00 jmp 108a30 <rtems_termios_ioctl+0x32a>
case RTEMS_IO_RCVWAKEUP:
tty->tty_rcv = *wakeup;
10899e: 8b 06 mov (%esi),%eax
1089a0: 8b 56 04 mov 0x4(%esi),%edx
1089a3: 89 83 dc 00 00 00 mov %eax,0xdc(%ebx)
1089a9: 89 93 e0 00 00 00 mov %edx,0xe0(%ebx)
break;
1089af: eb 7f jmp 108a30 <rtems_termios_ioctl+0x32a>
#if 1 /* FIXME */
case TIOCSETD:
/*
* close old line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_close != NULL) {
1089b1: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax
1089b7: c1 e0 05 shl $0x5,%eax
1089ba: 8b 80 f8 4e 12 00 mov 0x124ef8(%eax),%eax
1089c0: 85 c0 test %eax,%eax
1089c2: 74 0c je 1089d0 <rtems_termios_ioctl+0x2ca>
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
1089c4: 83 ec 0c sub $0xc,%esp
1089c7: 53 push %ebx
1089c8: ff d0 call *%eax
1089ca: 89 45 e4 mov %eax,-0x1c(%ebp)
1089cd: 83 c4 10 add $0x10,%esp
}
tty->t_line=*(int*)(args->buffer);
1089d0: 8b 55 08 mov 0x8(%ebp),%edx
1089d3: 8b 42 08 mov 0x8(%edx),%eax
1089d6: 8b 00 mov (%eax),%eax
1089d8: 89 83 cc 00 00 00 mov %eax,0xcc(%ebx)
tty->t_sc = NULL; /* ensure that no more valid data */
1089de: c7 83 d0 00 00 00 00 movl $0x0,0xd0(%ebx)
1089e5: 00 00 00
/*
* open new line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_open != NULL) {
1089e8: c1 e0 05 shl $0x5,%eax
1089eb: 8b 80 f4 4e 12 00 mov 0x124ef4(%eax),%eax
1089f1: 85 c0 test %eax,%eax
1089f3: 74 3b je 108a30 <rtems_termios_ioctl+0x32a><== NEVER TAKEN
sc = rtems_termios_linesw[tty->t_line].l_open(tty);
1089f5: 83 ec 0c sub $0xc,%esp
1089f8: 53 push %ebx
1089f9: ff d0 call *%eax
1089fb: 89 45 e4 mov %eax,-0x1c(%ebp)
1089fe: e9 71 ff ff ff jmp 108974 <rtems_termios_ioctl+0x26e>
}
break;
case TIOCGETD:
*(int*)(args->buffer)=tty->t_line;
108a03: 8b 4d 08 mov 0x8(%ebp),%ecx
108a06: 8b 41 08 mov 0x8(%ecx),%eax
108a09: 8b 93 cc 00 00 00 mov 0xcc(%ebx),%edx
108a0f: 89 10 mov %edx,(%eax)
break;
108a11: eb 1d jmp 108a30 <rtems_termios_ioctl+0x32a>
#endif
case FIONREAD: {
int rawnc = tty->rawInBuf.Tail - tty->rawInBuf.Head;
108a13: 8b 43 60 mov 0x60(%ebx),%eax <== NOT EXECUTED
108a16: 8b 53 5c mov 0x5c(%ebx),%edx <== NOT EXECUTED
if ( rawnc < 0 )
108a19: 29 d0 sub %edx,%eax <== NOT EXECUTED
108a1b: 79 05 jns 108a22 <rtems_termios_ioctl+0x31c><== NOT EXECUTED
rawnc += tty->rawInBuf.Size;
108a1d: 8b 53 64 mov 0x64(%ebx),%edx <== NOT EXECUTED
108a20: 01 d0 add %edx,%eax <== NOT EXECUTED
/* Half guess that this is the right operation */
*(int *)args->buffer = tty->ccount - tty->cindex + rawnc;
108a22: 8b 4d 08 mov 0x8(%ebp),%ecx <== NOT EXECUTED
108a25: 8b 51 08 mov 0x8(%ecx),%edx <== NOT EXECUTED
108a28: 03 43 20 add 0x20(%ebx),%eax <== NOT EXECUTED
108a2b: 2b 43 24 sub 0x24(%ebx),%eax <== NOT EXECUTED
108a2e: 89 02 mov %eax,(%edx) <== NOT EXECUTED
}
break;
}
rtems_semaphore_release (tty->osem);
108a30: 83 ec 0c sub $0xc,%esp
108a33: ff 73 18 pushl 0x18(%ebx)
108a36: e8 6d 18 00 00 call 10a2a8 <rtems_semaphore_release>
args->ioctl_return = sc;
108a3b: 8b 55 e4 mov -0x1c(%ebp),%edx
108a3e: 8b 45 08 mov 0x8(%ebp),%eax
108a41: 89 50 0c mov %edx,0xc(%eax)
return sc;
108a44: 83 c4 10 add $0x10,%esp
}
108a47: 8b 45 e4 mov -0x1c(%ebp),%eax
108a4a: 8d 65 f4 lea -0xc(%ebp),%esp
108a4d: 5b pop %ebx
108a4e: 5e pop %esi
108a4f: 5f pop %edi
108a50: c9 leave
108a51: c3 ret
00108135 <rtems_termios_open>:
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
const rtems_termios_callbacks *callbacks
)
{
108135: 55 push %ebp
108136: 89 e5 mov %esp,%ebp
108138: 57 push %edi
108139: 56 push %esi
10813a: 53 push %ebx
10813b: 83 ec 20 sub $0x20,%esp
struct rtems_termios_tty *tty;
/*
* See if the device has already been opened
*/
sc = rtems_semaphore_obtain(
10813e: 6a 00 push $0x0
108140: 6a 00 push $0x0
108142: ff 35 3c 52 12 00 pushl 0x12523c
108148: e8 6f 20 00 00 call 10a1bc <rtems_semaphore_obtain>
10814d: 89 45 e4 mov %eax,-0x1c(%ebp)
rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
108150: 83 c4 10 add $0x10,%esp
108153: 85 c0 test %eax,%eax
108155: 0f 85 d3 03 00 00 jne 10852e <rtems_termios_open+0x3f9><== NEVER TAKEN
return sc;
for (tty = rtems_termios_ttyHead ; tty != NULL ; tty = tty->forw) {
10815b: 8b 35 44 52 12 00 mov 0x125244,%esi
108161: 89 f2 mov %esi,%edx
108163: eb 16 jmp 10817b <rtems_termios_open+0x46>
if ((tty->major == major) && (tty->minor == minor))
108165: 8b 45 08 mov 0x8(%ebp),%eax
108168: 39 42 0c cmp %eax,0xc(%edx)
10816b: 75 0c jne 108179 <rtems_termios_open+0x44>
10816d: 8b 4d 0c mov 0xc(%ebp),%ecx
108170: 39 4a 10 cmp %ecx,0x10(%edx)
108173: 0f 84 26 03 00 00 je 10849f <rtems_termios_open+0x36a><== ALWAYS TAKEN
sc = rtems_semaphore_obtain(
rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
return sc;
for (tty = rtems_termios_ttyHead ; tty != NULL ; tty = tty->forw) {
108179: 8b 12 mov (%edx),%edx
10817b: 85 d2 test %edx,%edx
10817d: 75 e6 jne 108165 <rtems_termios_open+0x30>
10817f: e9 b5 03 00 00 jmp 108539 <rtems_termios_open+0x404>
/*
* Create a new device
*/
tty = calloc (1, sizeof (struct rtems_termios_tty));
if (tty == NULL) {
rtems_semaphore_release (rtems_termios_ttyMutex);
108184: 83 ec 0c sub $0xc,%esp
108187: eb 30 jmp 1081b9 <rtems_termios_open+0x84>
return RTEMS_NO_MEMORY;
}
/*
* allocate raw input buffer
*/
tty->rawInBuf.Size = RAW_INPUT_BUFFER_SIZE;
108189: a1 74 30 12 00 mov 0x123074,%eax
10818e: 89 42 64 mov %eax,0x64(%edx)
tty->rawInBuf.theBuf = malloc (tty->rawInBuf.Size);
108191: 8b 42 64 mov 0x64(%edx),%eax
108194: 83 ec 0c sub $0xc,%esp
108197: 50 push %eax
108198: 89 55 e0 mov %edx,-0x20(%ebp)
10819b: e8 74 f4 ff ff call 107614 <malloc>
1081a0: 89 c7 mov %eax,%edi
1081a2: 8b 55 e0 mov -0x20(%ebp),%edx
1081a5: 89 42 58 mov %eax,0x58(%edx)
if (tty->rawInBuf.theBuf == NULL) {
1081a8: 83 c4 10 add $0x10,%esp
1081ab: 85 c0 test %eax,%eax
1081ad: 75 24 jne 1081d3 <rtems_termios_open+0x9e>
free(tty);
1081af: 83 ec 0c sub $0xc,%esp
1081b2: 52 push %edx
1081b3: e8 c0 f1 ff ff call 107378 <free>
rtems_semaphore_release (rtems_termios_ttyMutex);
1081b8: 5b pop %ebx
1081b9: ff 35 3c 52 12 00 pushl 0x12523c
1081bf: e8 e4 20 00 00 call 10a2a8 <rtems_semaphore_release>
return RTEMS_NO_MEMORY;
1081c4: 83 c4 10 add $0x10,%esp
1081c7: c7 45 e4 1a 00 00 00 movl $0x1a,-0x1c(%ebp)
1081ce: e9 5b 03 00 00 jmp 10852e <rtems_termios_open+0x3f9>
}
/*
* allocate raw output buffer
*/
tty->rawOutBuf.Size = RAW_OUTPUT_BUFFER_SIZE;
1081d3: a1 78 30 12 00 mov 0x123078,%eax
1081d8: 89 82 88 00 00 00 mov %eax,0x88(%edx)
tty->rawOutBuf.theBuf = malloc (tty->rawOutBuf.Size);
1081de: 8b 82 88 00 00 00 mov 0x88(%edx),%eax
1081e4: 83 ec 0c sub $0xc,%esp
1081e7: 50 push %eax
1081e8: 89 55 e0 mov %edx,-0x20(%ebp)
1081eb: e8 24 f4 ff ff call 107614 <malloc>
1081f0: 8b 55 e0 mov -0x20(%ebp),%edx
1081f3: 89 42 7c mov %eax,0x7c(%edx)
if (tty->rawOutBuf.theBuf == NULL) {
1081f6: 83 c4 10 add $0x10,%esp
1081f9: 85 c0 test %eax,%eax
1081fb: 75 05 jne 108202 <rtems_termios_open+0xcd><== ALWAYS TAKEN
free((void *)(tty->rawInBuf.theBuf));
1081fd: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
108200: eb 2e jmp 108230 <rtems_termios_open+0xfb><== NOT EXECUTED
return RTEMS_NO_MEMORY;
}
/*
* allocate cooked buffer
*/
tty->cbuf = malloc (CBUFSIZE);
108202: 83 ec 0c sub $0xc,%esp
108205: ff 35 70 30 12 00 pushl 0x123070
10820b: 89 55 e0 mov %edx,-0x20(%ebp)
10820e: 89 45 dc mov %eax,-0x24(%ebp)
108211: e8 fe f3 ff ff call 107614 <malloc>
108216: 8b 55 e0 mov -0x20(%ebp),%edx
108219: 89 42 1c mov %eax,0x1c(%edx)
if (tty->cbuf == NULL) {
10821c: 83 c4 10 add $0x10,%esp
10821f: 85 c0 test %eax,%eax
108221: 8b 4d dc mov -0x24(%ebp),%ecx
108224: 75 19 jne 10823f <rtems_termios_open+0x10a>
free((void *)(tty->rawOutBuf.theBuf));
108226: 83 ec 0c sub $0xc,%esp
108229: 51 push %ecx
10822a: e8 49 f1 ff ff call 107378 <free>
free((void *)(tty->rawInBuf.theBuf));
10822f: 59 pop %ecx
108230: 57 push %edi
108231: e8 42 f1 ff ff call 107378 <free>
free(tty);
108236: 5a pop %edx
108237: 8b 55 e0 mov -0x20(%ebp),%edx
10823a: e9 73 ff ff ff jmp 1081b2 <rtems_termios_open+0x7d>
return RTEMS_NO_MEMORY;
}
/*
* Initialize wakeup callbacks
*/
tty->tty_snd.sw_pfn = NULL;
10823f: c7 82 d4 00 00 00 00 movl $0x0,0xd4(%edx)
108246: 00 00 00
tty->tty_snd.sw_arg = NULL;
108249: c7 82 d8 00 00 00 00 movl $0x0,0xd8(%edx)
108250: 00 00 00
tty->tty_rcv.sw_pfn = NULL;
108253: c7 82 dc 00 00 00 00 movl $0x0,0xdc(%edx)
10825a: 00 00 00
tty->tty_rcv.sw_arg = NULL;
10825d: c7 82 e0 00 00 00 00 movl $0x0,0xe0(%edx)
108264: 00 00 00
tty->tty_rcvwakeup = 0;
108267: c7 82 e4 00 00 00 00 movl $0x0,0xe4(%edx)
10826e: 00 00 00
/*
* link tty
*/
tty->forw = rtems_termios_ttyHead;
108271: 89 32 mov %esi,(%edx)
tty->back = NULL;
108273: c7 42 04 00 00 00 00 movl $0x0,0x4(%edx)
if (rtems_termios_ttyHead != NULL)
10827a: 85 f6 test %esi,%esi
10827c: 74 03 je 108281 <rtems_termios_open+0x14c>
rtems_termios_ttyHead->back = tty;
10827e: 89 56 04 mov %edx,0x4(%esi)
rtems_termios_ttyHead = tty;
108281: 89 1d 44 52 12 00 mov %ebx,0x125244
if (rtems_termios_ttyTail == NULL)
108287: 83 3d 40 52 12 00 00 cmpl $0x0,0x125240
10828e: 75 06 jne 108296 <rtems_termios_open+0x161>
rtems_termios_ttyTail = tty;
108290: 89 1d 40 52 12 00 mov %ebx,0x125240
tty->minor = minor;
108296: 8b 45 0c mov 0xc(%ebp),%eax
108299: 89 43 10 mov %eax,0x10(%ebx)
tty->major = major;
10829c: 8b 4d 08 mov 0x8(%ebp),%ecx
10829f: 89 4b 0c mov %ecx,0xc(%ebx)
/*
* Set up mutex semaphores
*/
sc = rtems_semaphore_create (
1082a2: 83 ec 0c sub $0xc,%esp
1082a5: 8d 43 14 lea 0x14(%ebx),%eax
1082a8: 50 push %eax
1082a9: 6a 00 push $0x0
1082ab: 6a 54 push $0x54
1082ad: 6a 01 push $0x1
rtems_build_name ('T', 'R', 'i', c),
1082af: 0f be 05 7c 30 12 00 movsbl 0x12307c,%eax
tty->major = major;
/*
* Set up mutex semaphores
*/
sc = rtems_semaphore_create (
1082b6: 0d 00 69 52 54 or $0x54526900,%eax
1082bb: 50 push %eax
1082bc: 89 55 e0 mov %edx,-0x20(%ebp)
1082bf: e8 d0 1c 00 00 call 109f94 <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)
1082c4: 83 c4 20 add $0x20,%esp
1082c7: 85 c0 test %eax,%eax
1082c9: 8b 55 e0 mov -0x20(%ebp),%edx
1082cc: 0f 85 42 02 00 00 jne 108514 <rtems_termios_open+0x3df>
rtems_fatal_error_occurred (sc);
sc = rtems_semaphore_create (
1082d2: 83 ec 0c sub $0xc,%esp
1082d5: 8d 43 18 lea 0x18(%ebx),%eax
1082d8: 50 push %eax
1082d9: 6a 00 push $0x0
1082db: 6a 54 push $0x54
1082dd: 6a 01 push $0x1
rtems_build_name ('T', 'R', 'o', c),
1082df: 0f be 05 7c 30 12 00 movsbl 0x12307c,%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 (
1082e6: 0d 00 6f 52 54 or $0x54526f00,%eax
1082eb: 50 push %eax
1082ec: 89 55 e0 mov %edx,-0x20(%ebp)
1082ef: e8 a0 1c 00 00 call 109f94 <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)
1082f4: 83 c4 20 add $0x20,%esp
1082f7: 85 c0 test %eax,%eax
1082f9: 8b 55 e0 mov -0x20(%ebp),%edx
1082fc: 0f 85 12 02 00 00 jne 108514 <rtems_termios_open+0x3df>
rtems_fatal_error_occurred (sc);
sc = rtems_semaphore_create (
108302: 83 ec 0c sub $0xc,%esp
108305: 8d 83 8c 00 00 00 lea 0x8c(%ebx),%eax
10830b: 50 push %eax
10830c: 6a 00 push $0x0
10830e: 6a 20 push $0x20
108310: 6a 00 push $0x0
rtems_build_name ('T', 'R', 'x', c),
108312: 0f be 05 7c 30 12 00 movsbl 0x12307c,%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 (
108319: 0d 00 78 52 54 or $0x54527800,%eax
10831e: 50 push %eax
10831f: 89 55 e0 mov %edx,-0x20(%ebp)
108322: e8 6d 1c 00 00 call 109f94 <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)
108327: 83 c4 20 add $0x20,%esp
10832a: 85 c0 test %eax,%eax
10832c: 8b 55 e0 mov -0x20(%ebp),%edx
10832f: 0f 85 df 01 00 00 jne 108514 <rtems_termios_open+0x3df>
rtems_fatal_error_occurred (sc);
tty->rawOutBufState = rob_idle;
108335: c7 83 94 00 00 00 00 movl $0x0,0x94(%ebx)
10833c: 00 00 00
/*
* Set callbacks
*/
tty->device = *callbacks;
10833f: 8d bb 98 00 00 00 lea 0x98(%ebx),%edi
108345: b9 08 00 00 00 mov $0x8,%ecx
10834a: 8b 75 14 mov 0x14(%ebp),%esi
10834d: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/*
* Create I/O tasks
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
10834f: 83 bb b4 00 00 00 02 cmpl $0x2,0xb4(%ebx)
108356: 75 74 jne 1083cc <rtems_termios_open+0x297>
sc = rtems_task_create (
108358: 50 push %eax
108359: 50 push %eax
10835a: 8d 83 c8 00 00 00 lea 0xc8(%ebx),%eax
108360: 50 push %eax
108361: 6a 00 push $0x0
108363: 68 00 05 00 00 push $0x500
108368: 68 00 04 00 00 push $0x400
10836d: 6a 0a push $0xa
rtems_build_name ('T', 'x', 'T', c),
10836f: 0f be 05 7c 30 12 00 movsbl 0x12307c,%eax
/*
* Create I/O tasks
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
sc = rtems_task_create (
108376: 0d 00 54 78 54 or $0x54785400,%eax
10837b: 50 push %eax
10837c: 89 55 e0 mov %edx,-0x20(%ebp)
10837f: e8 b4 1f 00 00 call 10a338 <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)
108384: 83 c4 20 add $0x20,%esp
108387: 85 c0 test %eax,%eax
108389: 8b 55 e0 mov -0x20(%ebp),%edx
10838c: 0f 85 82 01 00 00 jne 108514 <rtems_termios_open+0x3df><== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_task_create (
108392: 57 push %edi
108393: 57 push %edi
108394: 8d 83 c4 00 00 00 lea 0xc4(%ebx),%eax
10839a: 50 push %eax
10839b: 6a 00 push $0x0
10839d: 68 00 05 00 00 push $0x500
1083a2: 68 00 04 00 00 push $0x400
1083a7: 6a 09 push $0x9
rtems_build_name ('R', 'x', 'T', c),
1083a9: 0f be 05 7c 30 12 00 movsbl 0x12307c,%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 (
1083b0: 0d 00 54 78 52 or $0x52785400,%eax
1083b5: 50 push %eax
1083b6: 89 55 e0 mov %edx,-0x20(%ebp)
1083b9: e8 7a 1f 00 00 call 10a338 <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)
1083be: 83 c4 20 add $0x20,%esp
1083c1: 85 c0 test %eax,%eax
1083c3: 8b 55 e0 mov -0x20(%ebp),%edx
1083c6: 0f 85 48 01 00 00 jne 108514 <rtems_termios_open+0x3df><== NEVER TAKEN
rtems_fatal_error_occurred (sc);
}
if ((tty->device.pollRead == NULL) ||
1083cc: 83 bb a0 00 00 00 00 cmpl $0x0,0xa0(%ebx)
1083d3: 74 09 je 1083de <rtems_termios_open+0x2a9>
1083d5: 83 bb b4 00 00 00 02 cmpl $0x2,0xb4(%ebx)
1083dc: 75 30 jne 10840e <rtems_termios_open+0x2d9>
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){
sc = rtems_semaphore_create (
1083de: 83 ec 0c sub $0xc,%esp
1083e1: 8d 43 68 lea 0x68(%ebx),%eax
1083e4: 50 push %eax
1083e5: 6a 00 push $0x0
1083e7: 6a 24 push $0x24
1083e9: 6a 00 push $0x0
rtems_build_name ('T', 'R', 'r', c),
1083eb: 0f be 05 7c 30 12 00 movsbl 0x12307c,%eax
rtems_fatal_error_occurred (sc);
}
if ((tty->device.pollRead == NULL) ||
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){
sc = rtems_semaphore_create (
1083f2: 0d 00 72 52 54 or $0x54527200,%eax
1083f7: 50 push %eax
1083f8: 89 55 e0 mov %edx,-0x20(%ebp)
1083fb: e8 94 1b 00 00 call 109f94 <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)
108400: 83 c4 20 add $0x20,%esp
108403: 85 c0 test %eax,%eax
108405: 8b 55 e0 mov -0x20(%ebp),%edx
108408: 0f 85 06 01 00 00 jne 108514 <rtems_termios_open+0x3df>
}
/*
* Set default parameters
*/
tty->termios.c_iflag = BRKINT | ICRNL | IXON | IMAXBEL;
10840e: c7 43 30 02 25 00 00 movl $0x2502,0x30(%ebx)
tty->termios.c_oflag = OPOST | ONLCR | XTABS;
108415: c7 43 34 05 18 00 00 movl $0x1805,0x34(%ebx)
tty->termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL;
10841c: c7 43 38 bd 08 00 00 movl $0x8bd,0x38(%ebx)
tty->termios.c_lflag =
108423: c7 43 3c 3b 82 00 00 movl $0x823b,0x3c(%ebx)
ISIG | ICANON | IEXTEN | ECHO | ECHOK | ECHOE | ECHOCTL;
tty->termios.c_cc[VINTR] = '\003';
10842a: c6 43 41 03 movb $0x3,0x41(%ebx)
tty->termios.c_cc[VQUIT] = '\034';
10842e: c6 43 42 1c movb $0x1c,0x42(%ebx)
tty->termios.c_cc[VERASE] = '\177';
108432: c6 43 43 7f movb $0x7f,0x43(%ebx)
tty->termios.c_cc[VKILL] = '\025';
108436: c6 43 44 15 movb $0x15,0x44(%ebx)
tty->termios.c_cc[VEOF] = '\004';
10843a: c6 43 45 04 movb $0x4,0x45(%ebx)
tty->termios.c_cc[VEOL] = '\000';
10843e: c6 43 4c 00 movb $0x0,0x4c(%ebx)
tty->termios.c_cc[VEOL2] = '\000';
108442: c6 43 51 00 movb $0x0,0x51(%ebx)
tty->termios.c_cc[VSTART] = '\021';
108446: c6 43 49 11 movb $0x11,0x49(%ebx)
tty->termios.c_cc[VSTOP] = '\023';
10844a: c6 43 4a 13 movb $0x13,0x4a(%ebx)
tty->termios.c_cc[VSUSP] = '\032';
10844e: c6 43 4b 1a movb $0x1a,0x4b(%ebx)
tty->termios.c_cc[VREPRINT] = '\022';
108452: c6 43 4d 12 movb $0x12,0x4d(%ebx)
tty->termios.c_cc[VDISCARD] = '\017';
108456: c6 43 4e 0f movb $0xf,0x4e(%ebx)
tty->termios.c_cc[VWERASE] = '\027';
10845a: c6 43 4f 17 movb $0x17,0x4f(%ebx)
tty->termios.c_cc[VLNEXT] = '\026';
10845e: c6 43 50 16 movb $0x16,0x50(%ebx)
/* start with no flow control, clear flow control flags */
tty->flow_ctrl = 0;
108462: c7 83 b8 00 00 00 00 movl $0x0,0xb8(%ebx)
108469: 00 00 00
/*
* set low/highwater mark for XON/XOFF support
*/
tty->lowwater = tty->rawInBuf.Size * 1/2;
10846c: 8b 43 64 mov 0x64(%ebx),%eax
10846f: d1 e8 shr %eax
108471: 89 83 bc 00 00 00 mov %eax,0xbc(%ebx)
tty->highwater = tty->rawInBuf.Size * 3/4;
108477: 8b 43 64 mov 0x64(%ebx),%eax
10847a: 8d 04 40 lea (%eax,%eax,2),%eax
10847d: c1 e8 02 shr $0x2,%eax
108480: 89 83 c0 00 00 00 mov %eax,0xc0(%ebx)
/*
* Bump name characer
*/
if (c++ == 'z')
108486: a0 7c 30 12 00 mov 0x12307c,%al
10848b: 8d 48 01 lea 0x1(%eax),%ecx
10848e: 88 0d 7c 30 12 00 mov %cl,0x12307c
108494: 3c 7a cmp $0x7a,%al
108496: 75 07 jne 10849f <rtems_termios_open+0x36a>
c = 'a';
108498: c6 05 7c 30 12 00 61 movb $0x61,0x12307c
}
args->iop->data1 = tty;
10849f: 8b 4d 10 mov 0x10(%ebp),%ecx
1084a2: 8b 01 mov (%ecx),%eax
1084a4: 89 50 34 mov %edx,0x34(%eax)
if (!tty->refcount++) {
1084a7: 8b 42 08 mov 0x8(%edx),%eax
1084aa: 8d 48 01 lea 0x1(%eax),%ecx
1084ad: 89 4a 08 mov %ecx,0x8(%edx)
1084b0: 85 c0 test %eax,%eax
1084b2: 75 69 jne 10851d <rtems_termios_open+0x3e8>
if (tty->device.firstOpen)
1084b4: 8b 82 98 00 00 00 mov 0x98(%edx),%eax
1084ba: 85 c0 test %eax,%eax
1084bc: 74 15 je 1084d3 <rtems_termios_open+0x39e>
(*tty->device.firstOpen)(major, minor, arg);
1084be: 56 push %esi
1084bf: ff 75 10 pushl 0x10(%ebp)
1084c2: ff 75 0c pushl 0xc(%ebp)
1084c5: ff 75 08 pushl 0x8(%ebp)
1084c8: 89 55 e0 mov %edx,-0x20(%ebp)
1084cb: ff d0 call *%eax
1084cd: 83 c4 10 add $0x10,%esp
1084d0: 8b 55 e0 mov -0x20(%ebp),%edx
/*
* start I/O tasks, if needed
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
1084d3: 83 ba b4 00 00 00 02 cmpl $0x2,0xb4(%edx)
1084da: 75 41 jne 10851d <rtems_termios_open+0x3e8>
sc = rtems_task_start(
1084dc: 53 push %ebx
1084dd: 52 push %edx
1084de: 68 fe 95 10 00 push $0x1095fe
1084e3: ff b2 c4 00 00 00 pushl 0xc4(%edx)
1084e9: 89 55 e0 mov %edx,-0x20(%ebp)
1084ec: e8 bb 20 00 00 call 10a5ac <rtems_task_start>
tty->rxTaskId, rtems_termios_rxdaemon, (rtems_task_argument)tty);
if (sc != RTEMS_SUCCESSFUL)
1084f1: 83 c4 10 add $0x10,%esp
1084f4: 85 c0 test %eax,%eax
1084f6: 8b 55 e0 mov -0x20(%ebp),%edx
1084f9: 75 19 jne 108514 <rtems_termios_open+0x3df><== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_task_start(
1084fb: 51 push %ecx
1084fc: 52 push %edx
1084fd: 68 30 98 10 00 push $0x109830
108502: ff b2 c8 00 00 00 pushl 0xc8(%edx)
108508: e8 9f 20 00 00 call 10a5ac <rtems_task_start>
tty->txTaskId, rtems_termios_txdaemon, (rtems_task_argument)tty);
if (sc != RTEMS_SUCCESSFUL)
10850d: 83 c4 10 add $0x10,%esp
108510: 85 c0 test %eax,%eax
108512: 74 09 je 10851d <rtems_termios_open+0x3e8><== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
108514: 83 ec 0c sub $0xc,%esp
108517: 50 push %eax
108518: e8 6b 22 00 00 call 10a788 <rtems_fatal_error_occurred>
}
}
rtems_semaphore_release (rtems_termios_ttyMutex);
10851d: 83 ec 0c sub $0xc,%esp
108520: ff 35 3c 52 12 00 pushl 0x12523c
108526: e8 7d 1d 00 00 call 10a2a8 <rtems_semaphore_release>
return RTEMS_SUCCESSFUL;
10852b: 83 c4 10 add $0x10,%esp
}
10852e: 8b 45 e4 mov -0x1c(%ebp),%eax
108531: 8d 65 f4 lea -0xc(%ebp),%esp
108534: 5b pop %ebx
108535: 5e pop %esi
108536: 5f pop %edi
108537: c9 leave
108538: c3 ret
static char c = 'a';
/*
* Create a new device
*/
tty = calloc (1, sizeof (struct rtems_termios_tty));
108539: 52 push %edx
10853a: 52 push %edx
10853b: 68 e8 00 00 00 push $0xe8
108540: 6a 01 push $0x1
108542: e8 c5 ec ff ff call 10720c <calloc>
108547: 89 c2 mov %eax,%edx
108549: 89 c3 mov %eax,%ebx
if (tty == NULL) {
10854b: 83 c4 10 add $0x10,%esp
10854e: 85 c0 test %eax,%eax
108550: 0f 85 33 fc ff ff jne 108189 <rtems_termios_open+0x54>
108556: e9 29 fc ff ff jmp 108184 <rtems_termios_open+0x4f>
00108a52 <rtems_termios_puts>:
* Send characters to device-specific code
*/
void
rtems_termios_puts (
const void *_buf, int len, struct rtems_termios_tty *tty)
{
108a52: 55 push %ebp
108a53: 89 e5 mov %esp,%ebp
108a55: 57 push %edi
108a56: 56 push %esi
108a57: 53 push %ebx
108a58: 83 ec 3c sub $0x3c,%esp
108a5b: 8b 45 08 mov 0x8(%ebp),%eax
108a5e: 8b 75 0c mov 0xc(%ebp),%esi
108a61: 8b 5d 10 mov 0x10(%ebp),%ebx
const unsigned char *buf = _buf;
108a64: 89 c7 mov %eax,%edi
unsigned int newHead;
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) {
108a66: 83 bb b4 00 00 00 00 cmpl $0x0,0xb4(%ebx)
108a6d: 75 1b jne 108a8a <rtems_termios_puts+0x38>
(*tty->device.write)(tty->minor, (void *)buf, len);
108a6f: 89 75 10 mov %esi,0x10(%ebp)
108a72: 89 45 0c mov %eax,0xc(%ebp)
108a75: 8b 43 10 mov 0x10(%ebx),%eax
108a78: 89 45 08 mov %eax,0x8(%ebp)
108a7b: 8b 83 a4 00 00 00 mov 0xa4(%ebx),%eax
tty->rawOutBufState = rob_busy;
}
rtems_interrupt_enable (level);
len--;
}
}
108a81: 8d 65 f4 lea -0xc(%ebp),%esp
108a84: 5b pop %ebx
108a85: 5e pop %esi
108a86: 5f pop %edi
108a87: 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);
108a88: ff e0 jmp *%eax
return;
}
newHead = tty->rawOutBuf.Head;
108a8a: 8b 83 80 00 00 00 mov 0x80(%ebx),%eax
108a90: 89 45 e4 mov %eax,-0x1c(%ebp)
while (len) {
108a93: e9 ca 00 00 00 jmp 108b62 <rtems_termios_puts+0x110>
* len -= ncopy
*
* To minimize latency, the memcpy should be done
* with interrupts enabled.
*/
newHead = (newHead + 1) % tty->rawOutBuf.Size;
108a98: 8b 45 e4 mov -0x1c(%ebp),%eax
108a9b: 40 inc %eax
108a9c: 8b 8b 88 00 00 00 mov 0x88(%ebx),%ecx
108aa2: 31 d2 xor %edx,%edx
108aa4: f7 f1 div %ecx
108aa6: 89 55 c4 mov %edx,-0x3c(%ebp)
108aa9: 89 55 e4 mov %edx,-0x1c(%ebp)
rtems_interrupt_disable (level);
108aac: 9c pushf
108aad: fa cli
108aae: 8f 45 d4 popl -0x2c(%ebp)
108ab1: 8b 55 d4 mov -0x2c(%ebp),%edx
108ab4: 8b 4d c4 mov -0x3c(%ebp),%ecx
while (newHead == tty->rawOutBuf.Tail) {
108ab7: eb 35 jmp 108aee <rtems_termios_puts+0x9c>
tty->rawOutBufState = rob_wait;
108ab9: c7 83 94 00 00 00 02 movl $0x2,0x94(%ebx)
108ac0: 00 00 00
rtems_interrupt_enable (level);
108ac3: 52 push %edx
108ac4: 9d popf
sc = rtems_semaphore_obtain(
108ac5: 50 push %eax
108ac6: 6a 00 push $0x0
108ac8: 6a 00 push $0x0
108aca: ff b3 8c 00 00 00 pushl 0x8c(%ebx)
108ad0: 89 4d e0 mov %ecx,-0x20(%ebp)
108ad3: e8 e4 16 00 00 call 10a1bc <rtems_semaphore_obtain>
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
108ad8: 83 c4 10 add $0x10,%esp
108adb: 85 c0 test %eax,%eax
108add: 8b 4d e0 mov -0x20(%ebp),%ecx
108ae0: 74 09 je 108aeb <rtems_termios_puts+0x99><== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
108ae2: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
108ae5: 50 push %eax <== NOT EXECUTED
108ae6: e8 9d 1c 00 00 call 10a788 <rtems_fatal_error_occurred><== NOT EXECUTED
rtems_interrupt_disable (level);
108aeb: 9c pushf
108aec: fa cli
108aed: 5a pop %edx
* 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) {
108aee: 8b 83 84 00 00 00 mov 0x84(%ebx),%eax
108af4: 39 c1 cmp %eax,%ecx
108af6: 74 c1 je 108ab9 <rtems_termios_puts+0x67>
108af8: 89 55 d4 mov %edx,-0x2c(%ebp)
108afb: 89 4d c4 mov %ecx,-0x3c(%ebp)
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++;
108afe: 8b 8b 80 00 00 00 mov 0x80(%ebx),%ecx
108b04: 8a 07 mov (%edi),%al
108b06: 8b 53 7c mov 0x7c(%ebx),%edx
108b09: 88 04 0a mov %al,(%edx,%ecx,1)
108b0c: 47 inc %edi
tty->rawOutBuf.Head = newHead;
108b0d: 8b 4d c4 mov -0x3c(%ebp),%ecx
108b10: 89 8b 80 00 00 00 mov %ecx,0x80(%ebx)
if (tty->rawOutBufState == rob_idle) {
108b16: 83 bb 94 00 00 00 00 cmpl $0x0,0x94(%ebx)
108b1d: 75 3e jne 108b5d <rtems_termios_puts+0x10b>
/* check, whether XOFF has been received */
if (!(tty->flow_ctrl & FL_ORCVXOF)) {
108b1f: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
108b25: a8 10 test $0x10,%al
108b27: 75 1b jne 108b44 <rtems_termios_puts+0xf2><== NEVER TAKEN
(*tty->device.write)(tty->minor,
(char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
108b29: 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,
108b2f: 51 push %ecx
108b30: 6a 01 push $0x1
108b32: 03 43 7c add 0x7c(%ebx),%eax
108b35: 50 push %eax
108b36: ff 73 10 pushl 0x10(%ebx)
108b39: ff 93 a4 00 00 00 call *0xa4(%ebx)
108b3f: 83 c4 10 add $0x10,%esp
108b42: eb 0f jmp 108b53 <rtems_termios_puts+0x101>
(char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
} else {
/* remember that output has been stopped due to flow ctrl*/
tty->flow_ctrl |= FL_OSTOP;
108b44: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
108b4a: 83 c8 20 or $0x20,%eax <== NOT EXECUTED
108b4d: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
}
tty->rawOutBufState = rob_busy;
108b53: c7 83 94 00 00 00 01 movl $0x1,0x94(%ebx)
108b5a: 00 00 00
}
rtems_interrupt_enable (level);
108b5d: ff 75 d4 pushl -0x2c(%ebp)
108b60: 9d popf
len--;
108b61: 4e dec %esi
if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) {
(*tty->device.write)(tty->minor, (void *)buf, len);
return;
}
newHead = tty->rawOutBuf.Head;
while (len) {
108b62: 85 f6 test %esi,%esi
108b64: 0f 85 2e ff ff ff jne 108a98 <rtems_termios_puts+0x46>
tty->rawOutBufState = rob_busy;
}
rtems_interrupt_enable (level);
len--;
}
}
108b6a: 8d 65 f4 lea -0xc(%ebp),%esp
108b6d: 5b pop %ebx
108b6e: 5e pop %esi
108b6f: 5f pop %edi
108b70: c9 leave
108b71: c3 ret
00109079 <rtems_termios_read>:
return RTEMS_SUCCESSFUL;
}
rtems_status_code
rtems_termios_read (void *arg)
{
109079: 55 push %ebp
10907a: 89 e5 mov %esp,%ebp
10907c: 57 push %edi
10907d: 56 push %esi
10907e: 53 push %ebx
10907f: 83 ec 40 sub $0x40,%esp
109082: 8b 75 08 mov 0x8(%ebp),%esi
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
109085: 8b 06 mov (%esi),%eax
109087: 8b 58 34 mov 0x34(%eax),%ebx
uint32_t count = args->count;
10908a: 8b 46 10 mov 0x10(%esi),%eax
10908d: 89 45 e4 mov %eax,-0x1c(%ebp)
char *buffer = args->buffer;
109090: 8b 46 0c mov 0xc(%esi),%eax
109093: 89 45 e0 mov %eax,-0x20(%ebp)
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
109096: 6a 00 push $0x0
109098: 6a 00 push $0x0
10909a: ff 73 14 pushl 0x14(%ebx)
10909d: e8 1a 11 00 00 call 10a1bc <rtems_semaphore_obtain>
1090a2: 89 45 dc mov %eax,-0x24(%ebp)
if (sc != RTEMS_SUCCESSFUL)
1090a5: 83 c4 10 add $0x10,%esp
1090a8: 85 c0 test %eax,%eax
1090aa: 0f 85 9d 02 00 00 jne 10934d <rtems_termios_read+0x2d4><== NEVER TAKEN
return sc;
if (rtems_termios_linesw[tty->t_line].l_read != NULL) {
1090b0: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax
1090b6: c1 e0 05 shl $0x5,%eax
1090b9: 8b 80 fc 4e 12 00 mov 0x124efc(%eax),%eax
1090bf: 85 c0 test %eax,%eax
1090c1: 74 19 je 1090dc <rtems_termios_read+0x63>
sc = rtems_termios_linesw[tty->t_line].l_read(tty,args);
1090c3: 57 push %edi
1090c4: 57 push %edi
1090c5: 56 push %esi
1090c6: 53 push %ebx
1090c7: ff d0 call *%eax
1090c9: 89 45 dc mov %eax,-0x24(%ebp)
tty->tty_rcvwakeup = 0;
1090cc: c7 83 e4 00 00 00 00 movl $0x0,0xe4(%ebx)
1090d3: 00 00 00
rtems_semaphore_release (tty->isem);
1090d6: 59 pop %ecx
1090d7: e9 66 02 00 00 jmp 109342 <rtems_termios_read+0x2c9>
return sc;
}
if (tty->cindex == tty->ccount) {
1090dc: 8b 43 20 mov 0x20(%ebx),%eax
1090df: 39 43 24 cmp %eax,0x24(%ebx)
1090e2: 0f 85 2d 02 00 00 jne 109315 <rtems_termios_read+0x29c><== NEVER TAKEN
tty->cindex = tty->ccount = 0;
1090e8: c7 43 20 00 00 00 00 movl $0x0,0x20(%ebx)
1090ef: c7 43 24 00 00 00 00 movl $0x0,0x24(%ebx)
tty->read_start_column = tty->column;
1090f6: 8b 43 28 mov 0x28(%ebx),%eax
1090f9: 89 43 2c mov %eax,0x2c(%ebx)
if (tty->device.pollRead != NULL &&
1090fc: 83 bb a0 00 00 00 00 cmpl $0x0,0xa0(%ebx)
109103: 0f 84 c4 00 00 00 je 1091cd <rtems_termios_read+0x154>
109109: 83 bb b4 00 00 00 00 cmpl $0x0,0xb4(%ebx)
109110: 0f 85 b7 00 00 00 jne 1091cd <rtems_termios_read+0x154>
static rtems_status_code
fillBufferPoll (struct rtems_termios_tty *tty)
{
int n;
if (tty->termios.c_lflag & ICANON) {
109116: f6 43 3c 02 testb $0x2,0x3c(%ebx)
10911a: 74 35 je 109151 <rtems_termios_read+0xd8>
for (;;) {
n = (*tty->device.pollRead)(tty->minor);
10911c: 83 ec 0c sub $0xc,%esp
10911f: ff 73 10 pushl 0x10(%ebx)
109122: ff 93 a0 00 00 00 call *0xa0(%ebx)
if (n < 0) {
109128: 83 c4 10 add $0x10,%esp
10912b: 85 c0 test %eax,%eax
10912d: 79 0f jns 10913e <rtems_termios_read+0xc5>
rtems_task_wake_after (1);
10912f: 83 ec 0c sub $0xc,%esp
109132: 6a 01 push $0x1
109134: e8 d7 14 00 00 call 10a610 <rtems_task_wake_after>
109139: 83 c4 10 add $0x10,%esp
10913c: eb de jmp 10911c <rtems_termios_read+0xa3>
} else {
if (siproc (n, tty))
10913e: 0f b6 c0 movzbl %al,%eax
109141: 89 da mov %ebx,%edx
109143: e8 38 fe ff ff call 108f80 <siproc>
109148: 85 c0 test %eax,%eax
10914a: 74 d0 je 10911c <rtems_termios_read+0xa3>
10914c: e9 c4 01 00 00 jmp 109315 <rtems_termios_read+0x29c>
}
}
} else {
rtems_interval then, now;
then = rtems_clock_get_ticks_since_boot();
109151: e8 3a 0a 00 00 call 109b90 <rtems_clock_get_ticks_since_boot>
109156: 89 c7 mov %eax,%edi
for (;;) {
n = (*tty->device.pollRead)(tty->minor);
109158: 83 ec 0c sub $0xc,%esp
10915b: ff 73 10 pushl 0x10(%ebx)
10915e: ff 93 a0 00 00 00 call *0xa0(%ebx)
if (n < 0) {
109164: 83 c4 10 add $0x10,%esp
109167: 85 c0 test %eax,%eax
109169: 79 3d jns 1091a8 <rtems_termios_read+0x12f>
if (tty->termios.c_cc[VMIN]) {
10916b: 80 7b 47 00 cmpb $0x0,0x47(%ebx)
10916f: 74 0e je 10917f <rtems_termios_read+0x106><== NEVER TAKEN
if (tty->termios.c_cc[VTIME] && tty->ccount) {
109171: 80 7b 46 00 cmpb $0x0,0x46(%ebx)
109175: 74 22 je 109199 <rtems_termios_read+0x120><== NEVER TAKEN
109177: 83 7b 20 00 cmpl $0x0,0x20(%ebx)
10917b: 74 1c je 109199 <rtems_termios_read+0x120>
10917d: eb 0a jmp 109189 <rtems_termios_read+0x110>
if ((now - then) > tty->vtimeTicks) {
break;
}
}
} else {
if (!tty->termios.c_cc[VTIME])
10917f: 80 7b 46 00 cmpb $0x0,0x46(%ebx) <== NOT EXECUTED
109183: 0f 84 8c 01 00 00 je 109315 <rtems_termios_read+0x29c><== NOT EXECUTED
break;
now = rtems_clock_get_ticks_since_boot();
109189: e8 02 0a 00 00 call 109b90 <rtems_clock_get_ticks_since_boot>
if ((now - then) > tty->vtimeTicks) {
10918e: 29 f8 sub %edi,%eax
109190: 3b 43 54 cmp 0x54(%ebx),%eax
109193: 0f 87 7c 01 00 00 ja 109315 <rtems_termios_read+0x29c>
break;
}
}
rtems_task_wake_after (1);
109199: 83 ec 0c sub $0xc,%esp
10919c: 6a 01 push $0x1
10919e: e8 6d 14 00 00 call 10a610 <rtems_task_wake_after>
1091a3: 83 c4 10 add $0x10,%esp
1091a6: eb b0 jmp 109158 <rtems_termios_read+0xdf>
} else {
siproc (n, tty);
1091a8: 0f b6 c0 movzbl %al,%eax
1091ab: 89 da mov %ebx,%edx
1091ad: e8 ce fd ff ff call 108f80 <siproc>
if (tty->ccount >= tty->termios.c_cc[VMIN])
1091b2: 8a 43 47 mov 0x47(%ebx),%al
1091b5: 0f b6 d0 movzbl %al,%edx
1091b8: 39 53 20 cmp %edx,0x20(%ebx)
1091bb: 0f 8d 54 01 00 00 jge 109315 <rtems_termios_read+0x29c><== NEVER TAKEN
break;
if (tty->termios.c_cc[VMIN] && tty->termios.c_cc[VTIME])
1091c1: 84 c0 test %al,%al
1091c3: 74 93 je 109158 <rtems_termios_read+0xdf><== NEVER TAKEN
1091c5: 80 7b 46 00 cmpb $0x0,0x46(%ebx)
1091c9: 74 8d je 109158 <rtems_termios_read+0xdf><== NEVER TAKEN
1091cb: eb 84 jmp 109151 <rtems_termios_read+0xd8>
* Fill the input buffer from the raw input queue
*/
static rtems_status_code
fillBufferQueue (struct rtems_termios_tty *tty)
{
rtems_interval timeout = tty->rawInBufSemaphoreFirstTimeout;
1091cd: 8b 53 74 mov 0x74(%ebx),%edx
rtems_status_code sc;
int wait = (int)1;
1091d0: bf 01 00 00 00 mov $0x1,%edi
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)(
1091d5: 8d 43 49 lea 0x49(%ebx),%eax
1091d8: 89 45 d0 mov %eax,-0x30(%ebp)
1091db: e9 e6 00 00 00 jmp 1092c6 <rtems_termios_read+0x24d>
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
(tty->ccount < (CBUFSIZE-1))) {
unsigned char c;
unsigned int newHead;
newHead = (tty->rawInBuf.Head + 1) % tty->rawInBuf.Size;
1091e0: 8b 43 5c mov 0x5c(%ebx),%eax
1091e3: 8b 4b 64 mov 0x64(%ebx),%ecx
1091e6: 40 inc %eax
1091e7: 31 d2 xor %edx,%edx
1091e9: f7 f1 div %ecx
c = tty->rawInBuf.theBuf[newHead];
1091eb: 8b 43 58 mov 0x58(%ebx),%eax
1091ee: 8a 04 10 mov (%eax,%edx,1),%al
1091f1: 88 45 db mov %al,-0x25(%ebp)
tty->rawInBuf.Head = newHead;
1091f4: 89 53 5c mov %edx,0x5c(%ebx)
if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size)
1091f7: 8b 43 60 mov 0x60(%ebx),%eax
1091fa: 89 45 c4 mov %eax,-0x3c(%ebp)
1091fd: 8b 4b 64 mov 0x64(%ebx),%ecx
% tty->rawInBuf.Size)
109200: 8b 43 64 mov 0x64(%ebx),%eax
109203: 89 45 d4 mov %eax,-0x2c(%ebp)
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)
109206: 8b 45 c4 mov -0x3c(%ebp),%eax
109209: 8d 04 01 lea (%ecx,%eax,1),%eax
10920c: 29 d0 sub %edx,%eax
% tty->rawInBuf.Size)
10920e: 31 d2 xor %edx,%edx
109210: f7 75 d4 divl -0x2c(%ebp)
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)
109213: 3b 93 bc 00 00 00 cmp 0xbc(%ebx),%edx
109219: 73 74 jae 10928f <rtems_termios_read+0x216><== NEVER TAKEN
% tty->rawInBuf.Size)
< tty->lowwater) {
tty->flow_ctrl &= ~FL_IREQXOF;
10921b: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
109221: 83 e0 fe and $0xfffffffe,%eax
109224: 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))
10922a: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
109230: 25 02 02 00 00 and $0x202,%eax
109235: 3d 02 02 00 00 cmp $0x202,%eax
10923a: 75 24 jne 109260 <rtems_termios_read+0x1e7><== ALWAYS TAKEN
== (FL_MDXON | FL_ISNTXOF))
&& ((tty->rawOutBufState == rob_idle)
10923c: 83 bb 94 00 00 00 00 cmpl $0x0,0x94(%ebx) <== NOT EXECUTED
109243: 74 0a je 10924f <rtems_termios_read+0x1d6><== NOT EXECUTED
|| (tty->flow_ctrl & FL_OSTOP))) {
109245: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10924b: a8 20 test $0x20,%al <== NOT EXECUTED
10924d: 74 11 je 109260 <rtems_termios_read+0x1e7><== NOT EXECUTED
/* XON should be sent now... */
(*tty->device.write)(
10924f: 52 push %edx <== NOT EXECUTED
109250: 6a 01 push $0x1 <== NOT EXECUTED
109252: ff 75 d0 pushl -0x30(%ebp) <== NOT EXECUTED
109255: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
109258: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED
10925e: eb 2c jmp 10928c <rtems_termios_read+0x213><== NOT EXECUTED
tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1);
} else if (tty->flow_ctrl & FL_MDRTS) {
109260: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
109266: f6 c4 01 test $0x1,%ah
109269: 74 24 je 10928f <rtems_termios_read+0x216><== ALWAYS TAKEN
tty->flow_ctrl &= ~FL_IRTSOFF;
10926b: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
109271: 83 e0 fb and $0xfffffffb,%eax <== NOT EXECUTED
109274: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
/* activate RTS line */
if (tty->device.startRemoteTx != NULL) {
10927a: 8b 83 b0 00 00 00 mov 0xb0(%ebx),%eax <== NOT EXECUTED
109280: 85 c0 test %eax,%eax <== NOT EXECUTED
109282: 74 0b je 10928f <rtems_termios_read+0x216><== NOT EXECUTED
tty->device.startRemoteTx(tty->minor);
109284: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
109287: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
10928a: ff d0 call *%eax <== NOT EXECUTED
10928c: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
}
}
/* continue processing new character */
if (tty->termios.c_lflag & ICANON) {
10928f: f6 43 3c 02 testb $0x2,0x3c(%ebx)
109293: 74 12 je 1092a7 <rtems_termios_read+0x22e><== NEVER TAKEN
if (siproc (c, tty))
109295: 0f b6 45 db movzbl -0x25(%ebp),%eax
109299: 89 da mov %ebx,%edx
10929b: e8 e0 fc ff ff call 108f80 <siproc>
wait = 0;
1092a0: 85 c0 test %eax,%eax
1092a2: 0f 94 c0 sete %al
1092a5: eb 15 jmp 1092bc <rtems_termios_read+0x243>
} else {
siproc (c, tty);
1092a7: 0f b6 45 db movzbl -0x25(%ebp),%eax <== NOT EXECUTED
1092ab: 89 da mov %ebx,%edx <== NOT EXECUTED
1092ad: e8 ce fc ff ff call 108f80 <siproc> <== NOT EXECUTED
if (tty->ccount >= tty->termios.c_cc[VMIN])
1092b2: 0f b6 43 47 movzbl 0x47(%ebx),%eax <== NOT EXECUTED
wait = 0;
1092b6: 39 43 20 cmp %eax,0x20(%ebx) <== NOT EXECUTED
1092b9: 0f 9c c0 setl %al <== NOT EXECUTED
1092bc: 0f b6 c0 movzbl %al,%eax
1092bf: f7 d8 neg %eax
1092c1: 21 c7 and %eax,%edi
}
timeout = tty->rawInBufSemaphoreTimeout;
1092c3: 8b 53 70 mov 0x70(%ebx),%edx
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
1092c6: 8b 4b 5c mov 0x5c(%ebx),%ecx
1092c9: 8b 43 60 mov 0x60(%ebx),%eax
1092cc: 39 c1 cmp %eax,%ecx
1092ce: 74 0f je 1092df <rtems_termios_read+0x266>
(tty->ccount < (CBUFSIZE-1))) {
1092d0: a1 70 30 12 00 mov 0x123070,%eax
1092d5: 48 dec %eax
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
1092d6: 39 43 20 cmp %eax,0x20(%ebx)
1092d9: 0f 8c 01 ff ff ff jl 1091e0 <rtems_termios_read+0x167><== ALWAYS TAKEN
}
/*
* Wait for characters
*/
if ( wait ) {
1092df: 85 ff test %edi,%edi
1092e1: 74 32 je 109315 <rtems_termios_read+0x29c>
sc = rtems_semaphore_obtain(
1092e3: 50 push %eax
1092e4: 52 push %edx
1092e5: ff 73 6c pushl 0x6c(%ebx)
1092e8: ff 73 68 pushl 0x68(%ebx)
1092eb: 89 55 cc mov %edx,-0x34(%ebp)
1092ee: e8 c9 0e 00 00 call 10a1bc <rtems_semaphore_obtain>
tty->rawInBuf.Semaphore, tty->rawInBufSemaphoreOptions, timeout);
if (sc != RTEMS_SUCCESSFUL)
1092f3: 83 c4 10 add $0x10,%esp
1092f6: 85 c0 test %eax,%eax
1092f8: 8b 55 cc mov -0x34(%ebp),%edx
1092fb: 74 c9 je 1092c6 <rtems_termios_read+0x24d><== ALWAYS TAKEN
1092fd: eb 16 jmp 109315 <rtems_termios_read+0x29c><== NOT EXECUTED
if (sc != RTEMS_SUCCESSFUL)
tty->cindex = tty->ccount = 0;
}
while (count && (tty->cindex < tty->ccount)) {
*buffer++ = tty->cbuf[tty->cindex++];
1092ff: 8b 7b 1c mov 0x1c(%ebx),%edi
109302: 8b 45 e4 mov -0x1c(%ebp),%eax
109305: 8a 04 07 mov (%edi,%eax,1),%al
109308: 88 01 mov %al,(%ecx)
10930a: 41 inc %ecx
10930b: 8b 45 e4 mov -0x1c(%ebp),%eax
10930e: 40 inc %eax
10930f: 89 43 24 mov %eax,0x24(%ebx)
count--;
109312: 4a dec %edx
109313: eb 06 jmp 10931b <rtems_termios_read+0x2a2>
109315: 8b 55 e4 mov -0x1c(%ebp),%edx
109318: 8b 4d e0 mov -0x20(%ebp),%ecx
sc = fillBufferQueue (tty);
if (sc != RTEMS_SUCCESSFUL)
tty->cindex = tty->ccount = 0;
}
while (count && (tty->cindex < tty->ccount)) {
10931b: 85 d2 test %edx,%edx
10931d: 74 0b je 10932a <rtems_termios_read+0x2b1>
10931f: 8b 43 24 mov 0x24(%ebx),%eax
109322: 89 45 e4 mov %eax,-0x1c(%ebp)
109325: 3b 43 20 cmp 0x20(%ebx),%eax
109328: 7c d5 jl 1092ff <rtems_termios_read+0x286>
10932a: 89 55 e4 mov %edx,-0x1c(%ebp)
*buffer++ = tty->cbuf[tty->cindex++];
count--;
}
args->bytes_moved = args->count - count;
10932d: 8b 46 10 mov 0x10(%esi),%eax
109330: 29 d0 sub %edx,%eax
109332: 89 46 18 mov %eax,0x18(%esi)
tty->tty_rcvwakeup = 0;
109335: c7 83 e4 00 00 00 00 movl $0x0,0xe4(%ebx)
10933c: 00 00 00
rtems_semaphore_release (tty->isem);
10933f: 83 ec 0c sub $0xc,%esp
109342: ff 73 14 pushl 0x14(%ebx)
109345: e8 5e 0f 00 00 call 10a2a8 <rtems_semaphore_release>
return sc;
10934a: 83 c4 10 add $0x10,%esp
}
10934d: 8b 45 dc mov -0x24(%ebp),%eax
109350: 8d 65 f4 lea -0xc(%ebp),%esp
109353: 5b pop %ebx
109354: 5e pop %esi
109355: 5f pop %edi
109356: c9 leave
109357: c3 ret
00109662 <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)
{
109662: 55 push %ebp
109663: 89 e5 mov %esp,%ebp
109665: 57 push %edi
109666: 56 push %esi
109667: 53 push %ebx
109668: 83 ec 0c sub $0xc,%esp
10966b: 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))
10966e: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
109674: 25 03 04 00 00 and $0x403,%eax
109679: 3d 01 04 00 00 cmp $0x401,%eax
10967e: 75 2c jne 1096ac <rtems_termios_refill_transmitter+0x4a><== ALWAYS TAKEN
== (FL_MDXOF | FL_IREQXOF)) {
/* XOFF should be sent now... */
(*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1);
109680: 57 push %edi <== NOT EXECUTED
109681: 6a 01 push $0x1 <== NOT EXECUTED
109683: 8d 43 4a lea 0x4a(%ebx),%eax <== NOT EXECUTED
109686: 50 push %eax <== NOT EXECUTED
109687: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
10968a: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED
rtems_interrupt_disable(level);
109690: 9c pushf <== NOT EXECUTED
109691: fa cli <== NOT EXECUTED
109692: 5a pop %edx <== NOT EXECUTED
tty->t_dqlen--;
109693: ff 8b 90 00 00 00 decl 0x90(%ebx) <== NOT EXECUTED
tty->flow_ctrl |= FL_ISNTXOF;
109699: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
10969f: 83 c8 02 or $0x2,%eax <== NOT EXECUTED
1096a2: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
rtems_interrupt_enable(level);
1096a8: 52 push %edx <== NOT EXECUTED
1096a9: 9d popf <== NOT EXECUTED
1096aa: eb 38 jmp 1096e4 <rtems_termios_refill_transmitter+0x82><== NOT EXECUTED
nToSend = 1;
} else if ((tty->flow_ctrl & (FL_IREQXOF | FL_ISNTXOF)) == FL_ISNTXOF) {
1096ac: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
1096b2: 83 e0 03 and $0x3,%eax
1096b5: 83 f8 02 cmp $0x2,%eax
1096b8: 75 37 jne 1096f1 <rtems_termios_refill_transmitter+0x8f><== ALWAYS TAKEN
* 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);
1096ba: 56 push %esi <== NOT EXECUTED
1096bb: 6a 01 push $0x1 <== NOT EXECUTED
1096bd: 8d 43 49 lea 0x49(%ebx),%eax <== NOT EXECUTED
1096c0: 50 push %eax <== NOT EXECUTED
1096c1: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
1096c4: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED
rtems_interrupt_disable(level);
1096ca: 9c pushf <== NOT EXECUTED
1096cb: fa cli <== NOT EXECUTED
1096cc: 5a pop %edx <== NOT EXECUTED
tty->t_dqlen--;
1096cd: ff 8b 90 00 00 00 decl 0x90(%ebx) <== NOT EXECUTED
tty->flow_ctrl &= ~FL_ISNTXOF;
1096d3: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
1096d9: 83 e0 fd and $0xfffffffd,%eax <== NOT EXECUTED
1096dc: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
rtems_interrupt_enable(level);
1096e2: 52 push %edx <== NOT EXECUTED
1096e3: 9d popf <== NOT EXECUTED
1096e4: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
nToSend = 1;
1096e7: be 01 00 00 00 mov $0x1,%esi <== NOT EXECUTED
1096ec: e9 35 01 00 00 jmp 109826 <rtems_termios_refill_transmitter+0x1c4><== NOT EXECUTED
} else {
if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) {
1096f1: 8b 93 80 00 00 00 mov 0x80(%ebx),%edx
1096f7: 8b 83 84 00 00 00 mov 0x84(%ebx),%eax
1096fd: 39 c2 cmp %eax,%edx
1096ff: 75 25 jne 109726 <rtems_termios_refill_transmitter+0xc4>
/*
* this should never happen...
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
}
return 0;
109701: 31 f6 xor %esi,%esi
} else {
if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) {
/*
* buffer was empty
*/
if (tty->rawOutBufState == rob_wait) {
109703: 83 bb 94 00 00 00 02 cmpl $0x2,0x94(%ebx)
10970a: 0f 85 16 01 00 00 jne 109826 <rtems_termios_refill_transmitter+0x1c4><== ALWAYS TAKEN
/*
* this should never happen...
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
109710: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
109713: ff b3 8c 00 00 00 pushl 0x8c(%ebx) <== NOT EXECUTED
109719: e8 8a 0b 00 00 call 10a2a8 <rtems_semaphore_release><== NOT EXECUTED
10971e: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
109721: e9 00 01 00 00 jmp 109826 <rtems_termios_refill_transmitter+0x1c4><== NOT EXECUTED
}
return 0;
}
rtems_interrupt_disable(level);
109726: 9c pushf
109727: fa cli
109728: 58 pop %eax
len = tty->t_dqlen;
109729: 8b bb 90 00 00 00 mov 0x90(%ebx),%edi
tty->t_dqlen = 0;
10972f: c7 83 90 00 00 00 00 movl $0x0,0x90(%ebx)
109736: 00 00 00
rtems_interrupt_enable(level);
109739: 50 push %eax
10973a: 9d popf
newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size;
10973b: 8b 83 84 00 00 00 mov 0x84(%ebx),%eax
109741: 8b 8b 88 00 00 00 mov 0x88(%ebx),%ecx
109747: 8d 04 07 lea (%edi,%eax,1),%eax
10974a: 31 d2 xor %edx,%edx
10974c: f7 f1 div %ecx
10974e: 89 d7 mov %edx,%edi
tty->rawOutBuf.Tail = newTail;
109750: 89 93 84 00 00 00 mov %edx,0x84(%ebx)
if (tty->rawOutBufState == rob_wait) {
109756: 83 bb 94 00 00 00 02 cmpl $0x2,0x94(%ebx)
10975d: 75 11 jne 109770 <rtems_termios_refill_transmitter+0x10e>
/*
* wake up any pending writer task
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
10975f: 83 ec 0c sub $0xc,%esp
109762: ff b3 8c 00 00 00 pushl 0x8c(%ebx)
109768: e8 3b 0b 00 00 call 10a2a8 <rtems_semaphore_release>
10976d: 83 c4 10 add $0x10,%esp
}
if (newTail == tty->rawOutBuf.Head) {
109770: 8b 83 80 00 00 00 mov 0x80(%ebx),%eax
109776: 39 c7 cmp %eax,%edi
109778: 75 2a jne 1097a4 <rtems_termios_refill_transmitter+0x142>
/*
* Buffer has become empty
*/
tty->rawOutBufState = rob_idle;
10977a: c7 83 94 00 00 00 00 movl $0x0,0x94(%ebx)
109781: 00 00 00
nToSend = 0;
/*
* check to see if snd wakeup callback was set
*/
if ( tty->tty_snd.sw_pfn != NULL) {
109784: 8b 83 d4 00 00 00 mov 0xd4(%ebx),%eax
if (newTail == tty->rawOutBuf.Head) {
/*
* Buffer has become empty
*/
tty->rawOutBufState = rob_idle;
nToSend = 0;
10978a: 31 f6 xor %esi,%esi
/*
* check to see if snd wakeup callback was set
*/
if ( tty->tty_snd.sw_pfn != NULL) {
10978c: 85 c0 test %eax,%eax
10978e: 0f 84 8c 00 00 00 je 109820 <rtems_termios_refill_transmitter+0x1be><== ALWAYS TAKEN
(*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg);
109794: 51 push %ecx <== NOT EXECUTED
109795: 51 push %ecx <== NOT EXECUTED
109796: ff b3 d8 00 00 00 pushl 0xd8(%ebx) <== NOT EXECUTED
10979c: 8d 53 30 lea 0x30(%ebx),%edx <== NOT EXECUTED
10979f: 52 push %edx <== NOT EXECUTED
1097a0: ff d0 call *%eax <== NOT EXECUTED
1097a2: eb 79 jmp 10981d <rtems_termios_refill_transmitter+0x1bb><== NOT EXECUTED
}
}
/* check, whether output should stop due to received XOFF */
else if ((tty->flow_ctrl & (FL_MDXON | FL_ORCVXOF))
1097a4: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
1097aa: 25 10 02 00 00 and $0x210,%eax
1097af: 3d 10 02 00 00 cmp $0x210,%eax
1097b4: 75 22 jne 1097d8 <rtems_termios_refill_transmitter+0x176><== ALWAYS TAKEN
== (FL_MDXON | FL_ORCVXOF)) {
/* Buffer not empty, but output stops due to XOFF */
/* set flag, that output has been stopped */
rtems_interrupt_disable(level);
1097b6: 9c pushf <== NOT EXECUTED
1097b7: fa cli <== NOT EXECUTED
1097b8: 5a pop %edx <== NOT EXECUTED
tty->flow_ctrl |= FL_OSTOP;
1097b9: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED
1097bf: 83 c8 20 or $0x20,%eax <== NOT EXECUTED
1097c2: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED
tty->rawOutBufState = rob_busy; /*apm*/
1097c8: c7 83 94 00 00 00 01 movl $0x1,0x94(%ebx) <== NOT EXECUTED
1097cf: 00 00 00
rtems_interrupt_enable(level);
1097d2: 52 push %edx <== NOT EXECUTED
1097d3: 9d popf <== NOT EXECUTED
nToSend = 0;
1097d4: 31 f6 xor %esi,%esi <== NOT EXECUTED
1097d6: eb 48 jmp 109820 <rtems_termios_refill_transmitter+0x1be><== NOT EXECUTED
} else {
/*
* Buffer not empty, start tranmitter
*/
if (newTail > tty->rawOutBuf.Head)
1097d8: 8b 83 80 00 00 00 mov 0x80(%ebx),%eax
1097de: 39 c7 cmp %eax,%edi
1097e0: 76 08 jbe 1097ea <rtems_termios_refill_transmitter+0x188>
nToSend = tty->rawOutBuf.Size - newTail;
1097e2: 8b b3 88 00 00 00 mov 0x88(%ebx),%esi
1097e8: eb 06 jmp 1097f0 <rtems_termios_refill_transmitter+0x18e>
else
nToSend = tty->rawOutBuf.Head - newTail;
1097ea: 8b b3 80 00 00 00 mov 0x80(%ebx),%esi
1097f0: 29 fe sub %edi,%esi
/* 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)) {
1097f2: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax
1097f8: f6 c4 06 test $0x6,%ah
1097fb: 74 05 je 109802 <rtems_termios_refill_transmitter+0x1a0>
nToSend = 1;
1097fd: be 01 00 00 00 mov $0x1,%esi
}
tty->rawOutBufState = rob_busy; /*apm*/
109802: c7 83 94 00 00 00 01 movl $0x1,0x94(%ebx)
109809: 00 00 00
(*tty->device.write)(
10980c: 52 push %edx
10980d: 56 push %esi
10980e: 8b 43 7c mov 0x7c(%ebx),%eax
109811: 01 f8 add %edi,%eax
109813: 50 push %eax
109814: ff 73 10 pushl 0x10(%ebx)
109817: ff 93 a4 00 00 00 call *0xa4(%ebx)
10981d: 83 c4 10 add $0x10,%esp
tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend);
}
tty->rawOutBuf.Tail = newTail; /*apm*/
109820: 89 bb 84 00 00 00 mov %edi,0x84(%ebx)
}
return nToSend;
}
109826: 89 f0 mov %esi,%eax
109828: 8d 65 f4 lea -0xc(%ebp),%esp
10982b: 5b pop %ebx
10982c: 5e pop %esi
10982d: 5f pop %edi
10982e: c9 leave
10982f: c3 ret
001095fe <rtems_termios_rxdaemon>:
/*
* this task actually processes any receive events
*/
static rtems_task rtems_termios_rxdaemon(rtems_task_argument argument)
{
1095fe: 55 push %ebp
1095ff: 89 e5 mov %esp,%ebp
109601: 57 push %edi
109602: 56 push %esi
109603: 53 push %ebx
109604: 83 ec 1c sub $0x1c,%esp
109607: 8b 5d 08 mov 0x8(%ebp),%ebx
while (1) {
/*
* wait for rtems event
*/
rtems_event_receive(
10960a: 8d 7d e0 lea -0x20(%ebp),%edi
if (c != EOF) {
/*
* pollRead did call enqueue on its own
*/
c_buf = c;
rtems_termios_enqueue_raw_characters ( tty,&c_buf,1);
10960d: 8d 75 e7 lea -0x19(%ebp),%esi
while (1) {
/*
* wait for rtems event
*/
rtems_event_receive(
109610: 57 push %edi
109611: 6a 00 push $0x0
109613: 6a 02 push $0x2
109615: 6a 03 push $0x3
109617: e8 d8 05 00 00 call 109bf4 <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) {
10961c: 83 c4 10 add $0x10,%esp
10961f: f6 45 e0 01 testb $0x1,-0x20(%ebp)
109623: 74 17 je 10963c <rtems_termios_rxdaemon+0x3e><== ALWAYS TAKEN
tty->rxTaskId = 0;
109625: c7 83 c4 00 00 00 00 movl $0x0,0xc4(%ebx) <== NOT EXECUTED
10962c: 00 00 00
rtems_task_delete(RTEMS_SELF);
10962f: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
109632: 6a 00 push $0x0 <== NOT EXECUTED
109634: e8 37 0e 00 00 call 10a470 <rtems_task_delete> <== NOT EXECUTED
109639: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
/*
* do something
*/
c = tty->device.pollRead(tty->minor);
10963c: 83 ec 0c sub $0xc,%esp
10963f: ff 73 10 pushl 0x10(%ebx)
109642: ff 93 a0 00 00 00 call *0xa0(%ebx)
if (c != EOF) {
109648: 83 c4 10 add $0x10,%esp
10964b: 83 f8 ff cmp $0xffffffff,%eax
10964e: 74 c0 je 109610 <rtems_termios_rxdaemon+0x12>
/*
* pollRead did call enqueue on its own
*/
c_buf = c;
109650: 88 45 e7 mov %al,-0x19(%ebp)
rtems_termios_enqueue_raw_characters ( tty,&c_buf,1);
109653: 50 push %eax
109654: 6a 01 push $0x1
109656: 56 push %esi
109657: 53 push %ebx
109658: e8 16 fd ff ff call 109373 <rtems_termios_enqueue_raw_characters>
10965d: 83 c4 10 add $0x10,%esp
109660: eb ae jmp 109610 <rtems_termios_rxdaemon+0x12>
00109830 <rtems_termios_txdaemon>:
/*
* this task actually processes any transmit events
*/
static rtems_task rtems_termios_txdaemon(rtems_task_argument argument)
{
109830: 55 push %ebp
109831: 89 e5 mov %esp,%ebp
109833: 56 push %esi
109834: 53 push %ebx
109835: 83 ec 10 sub $0x10,%esp
109838: 8b 5d 08 mov 0x8(%ebp),%ebx
while (1) {
/*
* wait for rtems event
*/
rtems_event_receive(
10983b: 8d 75 f4 lea -0xc(%ebp),%esi
10983e: 56 push %esi
10983f: 6a 00 push $0x0
109841: 6a 02 push $0x2
109843: 6a 03 push $0x3
109845: e8 aa 03 00 00 call 109bf4 <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) {
10984a: 83 c4 10 add $0x10,%esp
10984d: f6 45 f4 01 testb $0x1,-0xc(%ebp)
109851: 74 17 je 10986a <rtems_termios_txdaemon+0x3a><== ALWAYS TAKEN
tty->txTaskId = 0;
109853: c7 83 c8 00 00 00 00 movl $0x0,0xc8(%ebx) <== NOT EXECUTED
10985a: 00 00 00
rtems_task_delete(RTEMS_SELF);
10985d: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
109860: 6a 00 push $0x0 <== NOT EXECUTED
109862: e8 09 0c 00 00 call 10a470 <rtems_task_delete> <== NOT EXECUTED
109867: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
/*
* call any line discipline start function
*/
if (rtems_termios_linesw[tty->t_line].l_start != NULL) {
10986a: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax
109870: c1 e0 05 shl $0x5,%eax
109873: 8b 80 08 4f 12 00 mov 0x124f08(%eax),%eax
109879: 85 c0 test %eax,%eax
10987b: 74 09 je 109886 <rtems_termios_txdaemon+0x56><== ALWAYS TAKEN
rtems_termios_linesw[tty->t_line].l_start(tty);
10987d: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
109880: 53 push %ebx <== NOT EXECUTED
109881: ff d0 call *%eax <== NOT EXECUTED
109883: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
/*
* try to push further characters to device
*/
rtems_termios_refill_transmitter(tty);
109886: 83 ec 0c sub $0xc,%esp
109889: 53 push %ebx
10988a: e8 d3 fd ff ff call 109662 <rtems_termios_refill_transmitter>
}
10988f: 83 c4 10 add $0x10,%esp
109892: eb aa jmp 10983e <rtems_termios_txdaemon+0xe>
00108fd2 <rtems_termios_write>:
rtems_termios_puts (&c, 1, tty);
}
rtems_status_code
rtems_termios_write (void *arg)
{
108fd2: 55 push %ebp
108fd3: 89 e5 mov %esp,%ebp
108fd5: 57 push %edi
108fd6: 56 push %esi
108fd7: 53 push %ebx
108fd8: 83 ec 20 sub $0x20,%esp
108fdb: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
108fde: 8b 03 mov (%ebx),%eax
108fe0: 8b 70 34 mov 0x34(%eax),%esi
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
108fe3: 6a 00 push $0x0
108fe5: 6a 00 push $0x0
108fe7: ff 76 18 pushl 0x18(%esi)
108fea: e8 cd 11 00 00 call 10a1bc <rtems_semaphore_obtain>
108fef: 89 c7 mov %eax,%edi
if (sc != RTEMS_SUCCESSFUL)
108ff1: 83 c4 10 add $0x10,%esp
108ff4: 85 c0 test %eax,%eax
108ff6: 75 77 jne 10906f <rtems_termios_write+0x9d><== NEVER TAKEN
return sc;
if (rtems_termios_linesw[tty->t_line].l_write != NULL) {
108ff8: 8b 86 cc 00 00 00 mov 0xcc(%esi),%eax
108ffe: c1 e0 05 shl $0x5,%eax
109001: 8b 80 00 4f 12 00 mov 0x124f00(%eax),%eax
109007: 85 c0 test %eax,%eax
109009: 74 0b je 109016 <rtems_termios_write+0x44>
sc = rtems_termios_linesw[tty->t_line].l_write(tty,args);
10900b: 57 push %edi
10900c: 57 push %edi
10900d: 53 push %ebx
10900e: 56 push %esi
10900f: ff d0 call *%eax
109011: 89 c7 mov %eax,%edi
rtems_semaphore_release (tty->osem);
109013: 5b pop %ebx
109014: eb 4e jmp 109064 <rtems_termios_write+0x92>
return sc;
}
if (tty->termios.c_oflag & OPOST) {
109016: f6 46 34 01 testb $0x1,0x34(%esi)
10901a: 74 2f je 10904b <rtems_termios_write+0x79><== NEVER TAKEN
uint32_t count = args->count;
10901c: 8b 4b 10 mov 0x10(%ebx),%ecx
char *buffer = args->buffer;
10901f: 8b 43 0c mov 0xc(%ebx),%eax
109022: 89 45 e4 mov %eax,-0x1c(%ebp)
while (count--)
109025: eb 18 jmp 10903f <rtems_termios_write+0x6d>
oproc (*buffer++, tty);
109027: 8b 55 e4 mov -0x1c(%ebp),%edx
10902a: 0f b6 02 movzbl (%edx),%eax
10902d: 42 inc %edx
10902e: 89 55 e4 mov %edx,-0x1c(%ebp)
109031: 89 f2 mov %esi,%edx
109033: 89 4d e0 mov %ecx,-0x20(%ebp)
109036: e8 37 fb ff ff call 108b72 <oproc>
10903b: 8b 4d e0 mov -0x20(%ebp),%ecx
10903e: 49 dec %ecx
return sc;
}
if (tty->termios.c_oflag & OPOST) {
uint32_t count = args->count;
char *buffer = args->buffer;
while (count--)
10903f: 85 c9 test %ecx,%ecx
109041: 75 e4 jne 109027 <rtems_termios_write+0x55>
oproc (*buffer++, tty);
args->bytes_moved = args->count;
109043: 8b 43 10 mov 0x10(%ebx),%eax
109046: 89 43 18 mov %eax,0x18(%ebx)
109049: eb 16 jmp 109061 <rtems_termios_write+0x8f>
} else {
rtems_termios_puts (args->buffer, args->count, tty);
10904b: 51 push %ecx <== NOT EXECUTED
10904c: 56 push %esi <== NOT EXECUTED
10904d: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED
109050: ff 73 0c pushl 0xc(%ebx) <== NOT EXECUTED
109053: e8 fa f9 ff ff call 108a52 <rtems_termios_puts> <== NOT EXECUTED
args->bytes_moved = args->count;
109058: 8b 43 10 mov 0x10(%ebx),%eax <== NOT EXECUTED
10905b: 89 43 18 mov %eax,0x18(%ebx) <== NOT EXECUTED
10905e: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
rtems_semaphore_release (tty->osem);
109061: 83 ec 0c sub $0xc,%esp
109064: ff 76 18 pushl 0x18(%esi)
109067: e8 3c 12 00 00 call 10a2a8 <rtems_semaphore_release>
return sc;
10906c: 83 c4 10 add $0x10,%esp
}
10906f: 89 f8 mov %edi,%eax
109071: 8d 65 f4 lea -0xc(%ebp),%esp
109074: 5b pop %ebx
109075: 5e pop %esi
109076: 5f pop %edi
109077: c9 leave
109078: c3 ret
0011648c <rtems_timer_cancel>:
*/
rtems_status_code rtems_timer_cancel(
rtems_id id
)
{
11648c: 55 push %ebp
11648d: 89 e5 mov %esp,%ebp
11648f: 83 ec 1c sub $0x1c,%esp
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
116492: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
116495: 50 push %eax
116496: ff 75 08 pushl 0x8(%ebp)
116499: 68 1c fa 13 00 push $0x13fa1c
11649e: e8 49 27 00 00 call 118bec <_Objects_Get>
switch ( location ) {
1164a3: 83 c4 10 add $0x10,%esp
1164a6: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
1164aa: 75 1e jne 1164ca <rtems_timer_cancel+0x3e>
case OBJECTS_LOCAL:
if ( !_Timer_Is_dormant_class( the_timer->the_class ) )
1164ac: 83 78 38 04 cmpl $0x4,0x38(%eax)
1164b0: 74 0f je 1164c1 <rtems_timer_cancel+0x35><== NEVER TAKEN
(void) _Watchdog_Remove( &the_timer->Ticker );
1164b2: 83 ec 0c sub $0xc,%esp
1164b5: 83 c0 10 add $0x10,%eax
1164b8: 50 push %eax
1164b9: e8 7e 41 00 00 call 11a63c <_Watchdog_Remove>
1164be: 83 c4 10 add $0x10,%esp
_Thread_Enable_dispatch();
1164c1: e8 d8 31 00 00 call 11969e <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
1164c6: 31 c0 xor %eax,%eax
1164c8: eb 05 jmp 1164cf <rtems_timer_cancel+0x43>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1164ca: b8 04 00 00 00 mov $0x4,%eax
}
1164cf: c9 leave
1164d0: c3 ret
001168ec <rtems_timer_server_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
1168ec: 55 push %ebp
1168ed: 89 e5 mov %esp,%ebp
1168ef: 57 push %edi
1168f0: 56 push %esi
1168f1: 53 push %ebx
1168f2: 83 ec 1c sub $0x1c,%esp
1168f5: 8b 7d 0c mov 0xc(%ebp),%edi
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
1168f8: 8b 35 5c fa 13 00 mov 0x13fa5c,%esi
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
1168fe: bb 0e 00 00 00 mov $0xe,%ebx
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
116903: 85 f6 test %esi,%esi
116905: 0f 84 b1 00 00 00 je 1169bc <rtems_timer_server_fire_when+0xd0>
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
11690b: b3 0b mov $0xb,%bl
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
11690d: 80 3d e8 f0 13 00 00 cmpb $0x0,0x13f0e8
116914: 0f 84 a2 00 00 00 je 1169bc <rtems_timer_server_fire_when+0xd0><== NEVER TAKEN
return RTEMS_NOT_DEFINED;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
11691a: b3 09 mov $0x9,%bl
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !routine )
11691c: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
116920: 0f 84 96 00 00 00 je 1169bc <rtems_timer_server_fire_when+0xd0>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
116926: 83 ec 0c sub $0xc,%esp
116929: 57 push %edi
11692a: e8 b5 d6 ff ff call 113fe4 <_TOD_Validate>
11692f: 83 c4 10 add $0x10,%esp
return RTEMS_INVALID_CLOCK;
116932: b3 14 mov $0x14,%bl
return RTEMS_NOT_DEFINED;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
116934: 84 c0 test %al,%al
116936: 0f 84 80 00 00 00 je 1169bc <rtems_timer_server_fire_when+0xd0>
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
11693c: 83 ec 0c sub $0xc,%esp
11693f: 57 push %edi
116940: e8 37 d6 ff ff call 113f7c <_TOD_To_seconds>
116945: 89 c7 mov %eax,%edi
if ( seconds <= _TOD_Seconds_since_epoch() )
116947: 83 c4 10 add $0x10,%esp
11694a: 3b 05 60 f1 13 00 cmp 0x13f160,%eax
116950: 76 6a jbe 1169bc <rtems_timer_server_fire_when+0xd0>
116952: 51 push %ecx
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
116953: 8d 45 e4 lea -0x1c(%ebp),%eax
116956: 50 push %eax
116957: ff 75 08 pushl 0x8(%ebp)
11695a: 68 1c fa 13 00 push $0x13fa1c
11695f: e8 88 22 00 00 call 118bec <_Objects_Get>
116964: 89 c3 mov %eax,%ebx
switch ( location ) {
116966: 83 c4 10 add $0x10,%esp
116969: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp)
11696d: 75 48 jne 1169b7 <rtems_timer_server_fire_when+0xcb>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
11696f: 83 ec 0c sub $0xc,%esp
116972: 8d 40 10 lea 0x10(%eax),%eax
116975: 50 push %eax
116976: e8 c1 3c 00 00 call 11a63c <_Watchdog_Remove>
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
11697b: c7 43 38 03 00 00 00 movl $0x3,0x38(%ebx)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
116982: c7 43 18 00 00 00 00 movl $0x0,0x18(%ebx)
the_watchdog->routine = routine;
116989: 8b 45 10 mov 0x10(%ebp),%eax
11698c: 89 43 2c mov %eax,0x2c(%ebx)
the_watchdog->id = id;
11698f: 8b 45 08 mov 0x8(%ebp),%eax
116992: 89 43 30 mov %eax,0x30(%ebx)
the_watchdog->user_data = user_data;
116995: 8b 45 14 mov 0x14(%ebp),%eax
116998: 89 43 34 mov %eax,0x34(%ebx)
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
11699b: 2b 3d 60 f1 13 00 sub 0x13f160,%edi
1169a1: 89 7b 1c mov %edi,0x1c(%ebx)
(*timer_server->schedule_operation)( timer_server, the_timer );
1169a4: 58 pop %eax
1169a5: 5a pop %edx
1169a6: 53 push %ebx
1169a7: 56 push %esi
1169a8: ff 56 04 call *0x4(%esi)
_Thread_Enable_dispatch();
1169ab: e8 ee 2c 00 00 call 11969e <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
1169b0: 83 c4 10 add $0x10,%esp
1169b3: 31 db xor %ebx,%ebx
1169b5: eb 05 jmp 1169bc <rtems_timer_server_fire_when+0xd0>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1169b7: bb 04 00 00 00 mov $0x4,%ebx
}
1169bc: 89 d8 mov %ebx,%eax
1169be: 8d 65 f4 lea -0xc(%ebp),%esp
1169c1: 5b pop %ebx
1169c2: 5e pop %esi
1169c3: 5f pop %edi
1169c4: c9 leave
1169c5: c3 ret
0010b17d <rtems_verror>:
static int rtems_verror(
rtems_error_code_t error_flag,
const char *printf_format,
va_list arglist
)
{
10b17d: 55 push %ebp
10b17e: 89 e5 mov %esp,%ebp
10b180: 57 push %edi
10b181: 56 push %esi
10b182: 53 push %ebx
10b183: 83 ec 1c sub $0x1c,%esp
10b186: 89 c3 mov %eax,%ebx
10b188: 89 55 e4 mov %edx,-0x1c(%ebp)
10b18b: 89 4d e0 mov %ecx,-0x20(%ebp)
int local_errno = 0;
int chars_written = 0;
rtems_status_code status;
if (error_flag & RTEMS_ERROR_PANIC) {
10b18e: a9 00 00 00 20 test $0x20000000,%eax
10b193: 74 2c je 10b1c1 <rtems_verror+0x44>
if (rtems_panic_in_progress++)
10b195: a1 68 b3 12 00 mov 0x12b368,%eax
10b19a: 8d 50 01 lea 0x1(%eax),%edx
10b19d: 89 15 68 b3 12 00 mov %edx,0x12b368
10b1a3: 85 c0 test %eax,%eax
10b1a5: 74 0b je 10b1b2 <rtems_verror+0x35> <== ALWAYS TAKEN
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b1a7: a1 b4 b4 12 00 mov 0x12b4b4,%eax <== NOT EXECUTED
10b1ac: 40 inc %eax <== NOT EXECUTED
10b1ad: a3 b4 b4 12 00 mov %eax,0x12b4b4 <== NOT EXECUTED
_Thread_Disable_dispatch(); /* disable task switches */
/* don't aggravate things */
if (rtems_panic_in_progress > 2)
return 0;
10b1b2: 31 f6 xor %esi,%esi
if (error_flag & RTEMS_ERROR_PANIC) {
if (rtems_panic_in_progress++)
_Thread_Disable_dispatch(); /* disable task switches */
/* don't aggravate things */
if (rtems_panic_in_progress > 2)
10b1b4: 83 3d 68 b3 12 00 02 cmpl $0x2,0x12b368
10b1bb: 0f 8f da 00 00 00 jg 10b29b <rtems_verror+0x11e> <== NEVER TAKEN
return 0;
}
(void) fflush(stdout); /* in case stdout/stderr same */
10b1c1: 83 ec 0c sub $0xc,%esp
10b1c4: a1 c0 91 12 00 mov 0x1291c0,%eax
10b1c9: ff 70 08 pushl 0x8(%eax)
10b1cc: e8 97 ab 00 00 call 115d68 <fflush>
status = error_flag & ~RTEMS_ERROR_MASK;
10b1d1: 89 df mov %ebx,%edi
10b1d3: 81 e7 ff ff ff 8f and $0x8fffffff,%edi
if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
10b1d9: 83 c4 10 add $0x10,%esp
rtems_error_code_t error_flag,
const char *printf_format,
va_list arglist
)
{
int local_errno = 0;
10b1dc: 31 f6 xor %esi,%esi
}
(void) fflush(stdout); /* in case stdout/stderr same */
status = error_flag & ~RTEMS_ERROR_MASK;
if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
10b1de: 81 e3 00 00 00 40 and $0x40000000,%ebx
10b1e4: 74 07 je 10b1ed <rtems_verror+0x70>
local_errno = errno;
10b1e6: e8 e5 a7 00 00 call 1159d0 <__errno>
10b1eb: 8b 30 mov (%eax),%esi
#if defined(RTEMS_MULTIPROCESSING)
if (_System_state_Is_multiprocessing)
fprintf(stderr, "[%" PRIu32 "] ", _Configuration_MP_table->node);
#endif
chars_written += vfprintf(stderr, printf_format, arglist);
10b1ed: 53 push %ebx
10b1ee: ff 75 e0 pushl -0x20(%ebp)
10b1f1: ff 75 e4 pushl -0x1c(%ebp)
10b1f4: a1 c0 91 12 00 mov 0x1291c0,%eax
10b1f9: ff 70 0c pushl 0xc(%eax)
10b1fc: e8 03 11 01 00 call 11c304 <vfprintf>
10b201: 89 c3 mov %eax,%ebx
if (status)
10b203: 83 c4 10 add $0x10,%esp
10b206: 85 ff test %edi,%edi
10b208: 74 24 je 10b22e <rtems_verror+0xb1>
chars_written +=
fprintf(stderr, " (status: %s)", rtems_status_text(status));
10b20a: 83 ec 0c sub $0xc,%esp
10b20d: 57 push %edi
10b20e: e8 55 ff ff ff call 10b168 <rtems_status_text>
10b213: 83 c4 0c add $0xc,%esp
10b216: 50 push %eax
10b217: 68 93 44 12 00 push $0x124493
10b21c: a1 c0 91 12 00 mov 0x1291c0,%eax
10b221: ff 70 0c pushl 0xc(%eax)
10b224: e8 33 af 00 00 call 11615c <fprintf>
#endif
chars_written += vfprintf(stderr, printf_format, arglist);
if (status)
chars_written +=
10b229: 01 c3 add %eax,%ebx
10b22b: 83 c4 10 add $0x10,%esp
fprintf(stderr, " (status: %s)", rtems_status_text(status));
if (local_errno) {
10b22e: 83 fe 00 cmp $0x0,%esi
10b231: 74 40 je 10b273 <rtems_verror+0xf6>
if ((local_errno > 0) && *strerror(local_errno))
10b233: 7e 25 jle 10b25a <rtems_verror+0xdd>
10b235: 83 ec 0c sub $0xc,%esp
10b238: 56 push %esi
10b239: e8 be b7 00 00 call 1169fc <strerror>
10b23e: 83 c4 10 add $0x10,%esp
10b241: 80 38 00 cmpb $0x0,(%eax)
10b244: 74 14 je 10b25a <rtems_verror+0xdd> <== NEVER TAKEN
chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
10b246: 83 ec 0c sub $0xc,%esp
10b249: 56 push %esi
10b24a: e8 ad b7 00 00 call 1169fc <strerror>
10b24f: 83 c4 0c add $0xc,%esp
10b252: 50 push %eax
10b253: 68 a1 44 12 00 push $0x1244a1
10b258: eb 07 jmp 10b261 <rtems_verror+0xe4>
else
chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
10b25a: 51 push %ecx
10b25b: 56 push %esi
10b25c: 68 ae 44 12 00 push $0x1244ae
10b261: a1 c0 91 12 00 mov 0x1291c0,%eax
10b266: ff 70 0c pushl 0xc(%eax)
10b269: e8 ee ae 00 00 call 11615c <fprintf>
10b26e: 01 c3 add %eax,%ebx
10b270: 83 c4 10 add $0x10,%esp
}
chars_written += fprintf(stderr, "\n");
10b273: 52 push %edx
10b274: 52 push %edx
10b275: 68 10 4c 12 00 push $0x124c10
10b27a: a1 c0 91 12 00 mov 0x1291c0,%eax
10b27f: ff 70 0c pushl 0xc(%eax)
10b282: e8 d5 ae 00 00 call 11615c <fprintf>
10b287: 8d 34 18 lea (%eax,%ebx,1),%esi
(void) fflush(stderr);
10b28a: 58 pop %eax
10b28b: a1 c0 91 12 00 mov 0x1291c0,%eax
10b290: ff 70 0c pushl 0xc(%eax)
10b293: e8 d0 aa 00 00 call 115d68 <fflush>
return chars_written;
10b298: 83 c4 10 add $0x10,%esp
}
10b29b: 89 f0 mov %esi,%eax
10b29d: 8d 65 f4 lea -0xc(%ebp),%esp
10b2a0: 5b pop %ebx
10b2a1: 5e pop %esi
10b2a2: 5f pop %edi
10b2a3: c9 leave
10b2a4: c3 ret
00107960 <scanInt>:
/*
* Extract an integer value from the database
*/
static int
scanInt(FILE *fp, int *val)
{
107960: 55 push %ebp
107961: 89 e5 mov %esp,%ebp
107963: 57 push %edi
107964: 56 push %esi
107965: 53 push %ebx
107966: 83 ec 3c sub $0x3c,%esp
107969: 89 c3 mov %eax,%ebx
10796b: 89 55 e0 mov %edx,-0x20(%ebp)
int c;
unsigned int i = 0;
unsigned int limit = INT_MAX;
int sign = 0;
10796e: 31 f6 xor %esi,%esi
static int
scanInt(FILE *fp, int *val)
{
int c;
unsigned int i = 0;
unsigned int limit = INT_MAX;
107970: c7 45 e4 ff ff ff 7f movl $0x7fffffff,-0x1c(%ebp)
*/
static int
scanInt(FILE *fp, int *val)
{
int c;
unsigned int i = 0;
107977: 31 ff xor %edi,%edi
sign = 1;
}
if (!isdigit(c))
return 0;
d = c - '0';
if ((i > (limit / 10))
107979: 89 7d c4 mov %edi,-0x3c(%ebp)
unsigned int limit = INT_MAX;
int sign = 0;
int d;
for (;;) {
c = getc(fp);
10797c: 8b 43 04 mov 0x4(%ebx),%eax
10797f: 48 dec %eax
107980: 89 43 04 mov %eax,0x4(%ebx)
107983: 85 c0 test %eax,%eax
107985: 79 15 jns 10799c <scanInt+0x3c> <== ALWAYS TAKEN
107987: 50 push %eax <== NOT EXECUTED
107988: 50 push %eax <== NOT EXECUTED
107989: 53 push %ebx <== NOT EXECUTED
10798a: ff 35 00 4e 12 00 pushl 0x124e00 <== NOT EXECUTED
107990: e8 2f bf 00 00 call 1138c4 <__srget_r> <== NOT EXECUTED
107995: 89 c1 mov %eax,%ecx <== NOT EXECUTED
107997: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10799a: eb 08 jmp 1079a4 <scanInt+0x44> <== NOT EXECUTED
10799c: 8b 03 mov (%ebx),%eax
10799e: 0f b6 08 movzbl (%eax),%ecx
1079a1: 40 inc %eax
1079a2: 89 03 mov %eax,(%ebx)
if (c == ':')
1079a4: 83 f9 3a cmp $0x3a,%ecx
1079a7: 74 4a je 1079f3 <scanInt+0x93>
break;
if (sign == 0) {
1079a9: 85 f6 test %esi,%esi
1079ab: 75 11 jne 1079be <scanInt+0x5e>
if (c == '-') {
sign = -1;
limit++;
continue;
}
sign = 1;
1079ad: 66 be 01 00 mov $0x1,%si
for (;;) {
c = getc(fp);
if (c == ':')
break;
if (sign == 0) {
if (c == '-') {
1079b1: 83 f9 2d cmp $0x2d,%ecx
1079b4: 75 08 jne 1079be <scanInt+0x5e>
sign = -1;
limit++;
1079b6: ff 45 e4 incl -0x1c(%ebp)
c = getc(fp);
if (c == ':')
break;
if (sign == 0) {
if (c == '-') {
sign = -1;
1079b9: 83 ce ff or $0xffffffff,%esi
limit++;
continue;
1079bc: eb be jmp 10797c <scanInt+0x1c>
}
sign = 1;
}
if (!isdigit(c))
1079be: a1 fc 4d 12 00 mov 0x124dfc,%eax
1079c3: f6 44 08 01 04 testb $0x4,0x1(%eax,%ecx,1)
1079c8: 74 41 je 107a0b <scanInt+0xab>
return 0;
d = c - '0';
if ((i > (limit / 10))
1079ca: 8b 45 e4 mov -0x1c(%ebp),%eax
1079cd: bf 0a 00 00 00 mov $0xa,%edi
1079d2: 31 d2 xor %edx,%edx
1079d4: f7 f7 div %edi
1079d6: 89 55 d4 mov %edx,-0x2c(%ebp)
1079d9: 39 45 c4 cmp %eax,-0x3c(%ebp)
1079dc: 77 2d ja 107a0b <scanInt+0xab>
}
sign = 1;
}
if (!isdigit(c))
return 0;
d = c - '0';
1079de: 83 e9 30 sub $0x30,%ecx
if ((i > (limit / 10))
|| ((i == (limit / 10)) && (d > (limit % 10))))
1079e1: 39 45 c4 cmp %eax,-0x3c(%ebp)
1079e4: 75 04 jne 1079ea <scanInt+0x8a>
1079e6: 39 d1 cmp %edx,%ecx
1079e8: 77 21 ja 107a0b <scanInt+0xab> <== ALWAYS TAKEN
return 0;
i = i * 10 + d;
1079ea: 6b 7d c4 0a imul $0xa,-0x3c(%ebp),%edi
1079ee: 8d 3c 39 lea (%ecx,%edi,1),%edi
1079f1: eb 86 jmp 107979 <scanInt+0x19>
1079f3: 8b 7d c4 mov -0x3c(%ebp),%edi
}
if (sign == 0)
return 0;
1079f6: 31 c0 xor %eax,%eax
if ((i > (limit / 10))
|| ((i == (limit / 10)) && (d > (limit % 10))))
return 0;
i = i * 10 + d;
}
if (sign == 0)
1079f8: 85 f6 test %esi,%esi
1079fa: 74 11 je 107a0d <scanInt+0xad> <== NEVER TAKEN
return 0;
*val = i * sign;
1079fc: 0f af f7 imul %edi,%esi
1079ff: 8b 45 e0 mov -0x20(%ebp),%eax
107a02: 89 30 mov %esi,(%eax)
return 1;
107a04: b8 01 00 00 00 mov $0x1,%eax
107a09: eb 02 jmp 107a0d <scanInt+0xad>
if (!isdigit(c))
return 0;
d = c - '0';
if ((i > (limit / 10))
|| ((i == (limit / 10)) && (d > (limit % 10))))
return 0;
107a0b: 31 c0 xor %eax,%eax
}
if (sign == 0)
return 0;
*val = i * sign;
return 1;
}
107a0d: 8d 65 f4 lea -0xc(%ebp),%esp
107a10: 5b pop %ebx
107a11: 5e pop %esi
107a12: 5f pop %edi
107a13: c9 leave
107a14: c3 ret
00107aa0 <scangr>:
FILE *fp,
struct group *grp,
char *buffer,
size_t bufsize
)
{
107aa0: 55 push %ebp
107aa1: 89 e5 mov %esp,%ebp
107aa3: 57 push %edi
107aa4: 56 push %esi
107aa5: 53 push %ebx
107aa6: 83 ec 34 sub $0x34,%esp
107aa9: 89 c7 mov %eax,%edi
107aab: 89 d3 mov %edx,%ebx
107aad: 89 4d d4 mov %ecx,-0x2c(%ebp)
int grgid;
char *grmem, *cp;
int memcount;
if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
107ab0: 6a 00 push $0x0
107ab2: 8d 45 08 lea 0x8(%ebp),%eax
107ab5: 50 push %eax
107ab6: 8d 4d d4 lea -0x2c(%ebp),%ecx
107ab9: 89 f8 mov %edi,%eax
107abb: e8 55 ff ff ff call 107a15 <scanString>
107ac0: 83 c4 10 add $0x10,%esp
|| !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0)
|| !scanInt(fp, &grgid)
|| !scanString(fp, &grmem, &buffer, &bufsize, 1))
return 0;
107ac3: 31 f6 xor %esi,%esi
{
int grgid;
char *grmem, *cp;
int memcount;
if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
107ac5: 85 c0 test %eax,%eax
107ac7: 0f 84 c2 00 00 00 je 107b8f <scangr+0xef>
|| !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0)
107acd: 50 push %eax
107ace: 50 push %eax
107acf: 8d 53 04 lea 0x4(%ebx),%edx
107ad2: 6a 00 push $0x0
107ad4: 8d 45 08 lea 0x8(%ebp),%eax
107ad7: 50 push %eax
107ad8: 8d 4d d4 lea -0x2c(%ebp),%ecx
107adb: 89 f8 mov %edi,%eax
107add: e8 33 ff ff ff call 107a15 <scanString>
107ae2: 83 c4 10 add $0x10,%esp
107ae5: 85 c0 test %eax,%eax
107ae7: 0f 84 a2 00 00 00 je 107b8f <scangr+0xef> <== NEVER TAKEN
|| !scanInt(fp, &grgid)
107aed: 8d 55 e4 lea -0x1c(%ebp),%edx
107af0: 89 f8 mov %edi,%eax
107af2: e8 69 fe ff ff call 107960 <scanInt>
107af7: 85 c0 test %eax,%eax
107af9: 0f 84 90 00 00 00 je 107b8f <scangr+0xef> <== NEVER TAKEN
|| !scanString(fp, &grmem, &buffer, &bufsize, 1))
107aff: 51 push %ecx
107b00: 51 push %ecx
107b01: 8d 55 e0 lea -0x20(%ebp),%edx
107b04: 6a 01 push $0x1
107b06: 8d 45 08 lea 0x8(%ebp),%eax
107b09: 50 push %eax
107b0a: 8d 4d d4 lea -0x2c(%ebp),%ecx
107b0d: 89 f8 mov %edi,%eax
107b0f: e8 01 ff ff ff call 107a15 <scanString>
107b14: 83 c4 10 add $0x10,%esp
107b17: 85 c0 test %eax,%eax
107b19: 74 74 je 107b8f <scangr+0xef> <== NEVER TAKEN
return 0;
grp->gr_gid = grgid;
107b1b: 8b 45 e4 mov -0x1c(%ebp),%eax
107b1e: 66 89 43 08 mov %ax,0x8(%ebx)
/*
* Determine number of members
*/
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
107b22: 8b 4d e0 mov -0x20(%ebp),%ecx
107b25: 89 ca mov %ecx,%edx
107b27: b8 01 00 00 00 mov $0x1,%eax
107b2c: 89 c6 mov %eax,%esi
107b2e: eb 0b jmp 107b3b <scangr+0x9b>
if(*cp == ',')
memcount++;
107b30: 3c 2c cmp $0x2c,%al
107b32: 0f 94 c0 sete %al
107b35: 0f b6 c0 movzbl %al,%eax
107b38: 01 c6 add %eax,%esi
grp->gr_gid = grgid;
/*
* Determine number of members
*/
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
107b3a: 42 inc %edx
107b3b: 8a 02 mov (%edx),%al
107b3d: 84 c0 test %al,%al
107b3f: 75 ef jne 107b30 <scangr+0x90>
}
/*
* Hack to produce (hopefully) a suitably-aligned array of pointers
*/
if (bufsize < (((memcount+1)*sizeof(char *)) + 15))
107b41: 8d 04 b5 13 00 00 00 lea 0x13(,%esi,4),%eax
return 0;
107b48: 31 f6 xor %esi,%esi
}
/*
* Hack to produce (hopefully) a suitably-aligned array of pointers
*/
if (bufsize < (((memcount+1)*sizeof(char *)) + 15))
107b4a: 39 45 08 cmp %eax,0x8(%ebp)
107b4d: 72 40 jb 107b8f <scangr+0xef> <== NEVER TAKEN
return 0;
grp->gr_mem = (char **)(((uintptr_t)buffer + 15) & ~15);
107b4f: 8b 45 d4 mov -0x2c(%ebp),%eax
107b52: 83 c0 0f add $0xf,%eax
107b55: 83 e0 f0 and $0xfffffff0,%eax
107b58: 89 43 0c mov %eax,0xc(%ebx)
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
107b5b: 89 08 mov %ecx,(%eax)
}
/*
* Extract a single group record from the database
*/
static int scangr(
107b5d: 8b 45 e0 mov -0x20(%ebp),%eax
107b60: 40 inc %eax
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
107b61: ba 01 00 00 00 mov $0x1,%edx
107b66: eb 11 jmp 107b79 <scangr+0xd9>
if(*cp == ',') {
107b68: 80 f9 2c cmp $0x2c,%cl
107b6b: 75 0b jne 107b78 <scangr+0xd8>
*cp = '\0';
107b6d: c6 40 ff 00 movb $0x0,-0x1(%eax)
grp->gr_mem[memcount++] = cp + 1;
107b71: 8b 4b 0c mov 0xc(%ebx),%ecx
107b74: 89 04 91 mov %eax,(%ecx,%edx,4)
107b77: 42 inc %edx
107b78: 40 inc %eax
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
107b79: 8a 48 ff mov -0x1(%eax),%cl
107b7c: 84 c9 test %cl,%cl
107b7e: 75 e8 jne 107b68 <scangr+0xc8>
if(*cp == ',') {
*cp = '\0';
grp->gr_mem[memcount++] = cp + 1;
}
}
grp->gr_mem[memcount] = NULL;
107b80: 8b 43 0c mov 0xc(%ebx),%eax
107b83: c7 04 90 00 00 00 00 movl $0x0,(%eax,%edx,4)
return 1;
107b8a: be 01 00 00 00 mov $0x1,%esi
}
107b8f: 89 f0 mov %esi,%eax
107b91: 8d 65 f4 lea -0xc(%ebp),%esp
107b94: 5b pop %ebx
107b95: 5e pop %esi
107b96: 5f pop %edi
107b97: c9 leave
107b98: c3 ret
00107b99 <scanpw>:
FILE *fp,
struct passwd *pwd,
char *buffer,
size_t bufsize
)
{
107b99: 55 push %ebp
107b9a: 89 e5 mov %esp,%ebp
107b9c: 57 push %edi
107b9d: 56 push %esi
107b9e: 53 push %ebx
107b9f: 83 ec 34 sub $0x34,%esp
107ba2: 89 c6 mov %eax,%esi
107ba4: 89 d3 mov %edx,%ebx
107ba6: 89 4d d4 mov %ecx,-0x2c(%ebp)
int pwuid, pwgid;
if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0)
107ba9: 8d 7d d4 lea -0x2c(%ebp),%edi
107bac: 6a 00 push $0x0
107bae: 8d 45 08 lea 0x8(%ebp),%eax
107bb1: 50 push %eax
107bb2: 89 f9 mov %edi,%ecx
107bb4: 89 f0 mov %esi,%eax
107bb6: e8 5a fe ff ff call 107a15 <scanString>
107bbb: 83 c4 10 add $0x10,%esp
|| !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;
107bbe: c7 45 d0 00 00 00 00 movl $0x0,-0x30(%ebp)
size_t bufsize
)
{
int pwuid, pwgid;
if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0)
107bc5: 85 c0 test %eax,%eax
107bc7: 0f 84 c4 00 00 00 je 107c91 <scanpw+0xf8>
|| !scanString(fp, &pwd->pw_passwd, &buffer, &bufsize, 0)
107bcd: 51 push %ecx
107bce: 51 push %ecx
107bcf: 8d 53 04 lea 0x4(%ebx),%edx
107bd2: 6a 00 push $0x0
107bd4: 8d 45 08 lea 0x8(%ebp),%eax
107bd7: 50 push %eax
107bd8: 89 f9 mov %edi,%ecx
107bda: 89 f0 mov %esi,%eax
107bdc: e8 34 fe ff ff call 107a15 <scanString>
107be1: 83 c4 10 add $0x10,%esp
107be4: 85 c0 test %eax,%eax
107be6: 0f 84 a5 00 00 00 je 107c91 <scanpw+0xf8> <== NEVER TAKEN
|| !scanInt(fp, &pwuid)
107bec: 8d 55 e4 lea -0x1c(%ebp),%edx
107bef: 89 f0 mov %esi,%eax
107bf1: e8 6a fd ff ff call 107960 <scanInt>
107bf6: 85 c0 test %eax,%eax
107bf8: 0f 84 93 00 00 00 je 107c91 <scanpw+0xf8>
|| !scanInt(fp, &pwgid)
107bfe: 8d 55 e0 lea -0x20(%ebp),%edx
107c01: 89 f0 mov %esi,%eax
107c03: e8 58 fd ff ff call 107960 <scanInt>
107c08: 85 c0 test %eax,%eax
107c0a: 0f 84 81 00 00 00 je 107c91 <scanpw+0xf8>
|| !scanString(fp, &pwd->pw_comment, &buffer, &bufsize, 0)
107c10: 52 push %edx
107c11: 52 push %edx
107c12: 8d 53 0c lea 0xc(%ebx),%edx
107c15: 6a 00 push $0x0
107c17: 8d 45 08 lea 0x8(%ebp),%eax
107c1a: 50 push %eax
107c1b: 89 f9 mov %edi,%ecx
107c1d: 89 f0 mov %esi,%eax
107c1f: e8 f1 fd ff ff call 107a15 <scanString>
107c24: 83 c4 10 add $0x10,%esp
107c27: 85 c0 test %eax,%eax
107c29: 74 66 je 107c91 <scanpw+0xf8> <== NEVER TAKEN
|| !scanString(fp, &pwd->pw_gecos, &buffer, &bufsize, 0)
107c2b: 50 push %eax
107c2c: 50 push %eax
107c2d: 8d 53 10 lea 0x10(%ebx),%edx
107c30: 6a 00 push $0x0
107c32: 8d 45 08 lea 0x8(%ebp),%eax
107c35: 50 push %eax
107c36: 89 f9 mov %edi,%ecx
107c38: 89 f0 mov %esi,%eax
107c3a: e8 d6 fd ff ff call 107a15 <scanString>
107c3f: 83 c4 10 add $0x10,%esp
107c42: 85 c0 test %eax,%eax
107c44: 74 4b je 107c91 <scanpw+0xf8> <== NEVER TAKEN
|| !scanString(fp, &pwd->pw_dir, &buffer, &bufsize, 0)
107c46: 51 push %ecx
107c47: 51 push %ecx
107c48: 8d 53 14 lea 0x14(%ebx),%edx
107c4b: 6a 00 push $0x0
107c4d: 8d 45 08 lea 0x8(%ebp),%eax
107c50: 50 push %eax
107c51: 89 f9 mov %edi,%ecx
107c53: 89 f0 mov %esi,%eax
107c55: e8 bb fd ff ff call 107a15 <scanString>
107c5a: 83 c4 10 add $0x10,%esp
107c5d: 85 c0 test %eax,%eax
107c5f: 74 30 je 107c91 <scanpw+0xf8> <== NEVER TAKEN
|| !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1))
107c61: 52 push %edx
107c62: 52 push %edx
107c63: 8d 53 18 lea 0x18(%ebx),%edx
107c66: 6a 01 push $0x1
107c68: 8d 45 08 lea 0x8(%ebp),%eax
107c6b: 50 push %eax
107c6c: 89 f9 mov %edi,%ecx
107c6e: 89 f0 mov %esi,%eax
107c70: e8 a0 fd ff ff call 107a15 <scanString>
107c75: 83 c4 10 add $0x10,%esp
107c78: 85 c0 test %eax,%eax
107c7a: 74 15 je 107c91 <scanpw+0xf8>
return 0;
pwd->pw_uid = pwuid;
107c7c: 8b 45 e4 mov -0x1c(%ebp),%eax
107c7f: 66 89 43 08 mov %ax,0x8(%ebx)
pwd->pw_gid = pwgid;
107c83: 8b 45 e0 mov -0x20(%ebp),%eax
107c86: 66 89 43 0a mov %ax,0xa(%ebx)
return 1;
107c8a: c7 45 d0 01 00 00 00 movl $0x1,-0x30(%ebp)
}
107c91: 8b 45 d0 mov -0x30(%ebp),%eax
107c94: 8d 65 f4 lea -0xc(%ebp),%esp
107c97: 5b pop %ebx
107c98: 5e pop %esi
107c99: 5f pop %edi
107c9a: c9 leave
107c9b: c3 ret
0010a948 <sched_get_priority_max>:
#include <rtems/posix/priority.h>
int sched_get_priority_max(
int policy
)
{
10a948: 55 push %ebp
10a949: 89 e5 mov %esp,%ebp
10a94b: 83 ec 08 sub $0x8,%esp
10a94e: 8b 4d 08 mov 0x8(%ebp),%ecx
switch ( policy ) {
10a951: 83 f9 04 cmp $0x4,%ecx
10a954: 77 0b ja 10a961 <sched_get_priority_max+0x19>
10a956: b8 01 00 00 00 mov $0x1,%eax
10a95b: d3 e0 shl %cl,%eax
10a95d: a8 17 test $0x17,%al
10a95f: 75 10 jne 10a971 <sched_get_priority_max+0x29><== ALWAYS TAKEN
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
10a961: e8 e2 73 00 00 call 111d48 <__errno>
10a966: c7 00 16 00 00 00 movl $0x16,(%eax)
10a96c: 83 c8 ff or $0xffffffff,%eax
10a96f: eb 08 jmp 10a979 <sched_get_priority_max+0x31>
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
10a971: 0f b6 05 48 22 12 00 movzbl 0x122248,%eax
10a978: 48 dec %eax
}
10a979: c9 leave
10a97a: c3 ret
0010a97c <sched_get_priority_min>:
#include <rtems/posix/priority.h>
int sched_get_priority_min(
int policy
)
{
10a97c: 55 push %ebp
10a97d: 89 e5 mov %esp,%ebp
10a97f: 83 ec 08 sub $0x8,%esp
10a982: 8b 4d 08 mov 0x8(%ebp),%ecx
switch ( policy ) {
10a985: 83 f9 04 cmp $0x4,%ecx
10a988: 77 11 ja 10a99b <sched_get_priority_min+0x1f>
10a98a: ba 01 00 00 00 mov $0x1,%edx
10a98f: d3 e2 shl %cl,%edx
default:
rtems_set_errno_and_return_minus_one( EINVAL );
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
10a991: b8 01 00 00 00 mov $0x1,%eax
int sched_get_priority_min(
int policy
)
{
switch ( policy ) {
10a996: 80 e2 17 and $0x17,%dl
10a999: 75 0e jne 10a9a9 <sched_get_priority_min+0x2d><== ALWAYS TAKEN
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
10a99b: e8 a8 73 00 00 call 111d48 <__errno>
10a9a0: c7 00 16 00 00 00 movl $0x16,(%eax)
10a9a6: 83 c8 ff or $0xffffffff,%eax
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
}
10a9a9: c9 leave
10a9aa: c3 ret
0010a9ac <sched_rr_get_interval>:
int sched_rr_get_interval(
pid_t pid,
struct timespec *interval
)
{
10a9ac: 55 push %ebp
10a9ad: 89 e5 mov %esp,%ebp
10a9af: 56 push %esi
10a9b0: 53 push %ebx
10a9b1: 8b 75 08 mov 0x8(%ebp),%esi
10a9b4: 8b 5d 0c mov 0xc(%ebp),%ebx
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
10a9b7: 85 f6 test %esi,%esi
10a9b9: 74 16 je 10a9d1 <sched_rr_get_interval+0x25><== NEVER TAKEN
10a9bb: e8 90 d0 ff ff call 107a50 <getpid>
10a9c0: 39 c6 cmp %eax,%esi
10a9c2: 74 0d je 10a9d1 <sched_rr_get_interval+0x25>
rtems_set_errno_and_return_minus_one( ESRCH );
10a9c4: e8 7f 73 00 00 call 111d48 <__errno>
10a9c9: c7 00 03 00 00 00 movl $0x3,(%eax)
10a9cf: eb 0f jmp 10a9e0 <sched_rr_get_interval+0x34>
if ( !interval )
10a9d1: 85 db test %ebx,%ebx
10a9d3: 75 10 jne 10a9e5 <sched_rr_get_interval+0x39>
rtems_set_errno_and_return_minus_one( EINVAL );
10a9d5: e8 6e 73 00 00 call 111d48 <__errno>
10a9da: c7 00 16 00 00 00 movl $0x16,(%eax)
10a9e0: 83 c8 ff or $0xffffffff,%eax
10a9e3: eb 13 jmp 10a9f8 <sched_rr_get_interval+0x4c>
_Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval );
10a9e5: 50 push %eax
10a9e6: 50 push %eax
10a9e7: 53 push %ebx
10a9e8: ff 35 20 63 12 00 pushl 0x126320
10a9ee: e8 b9 30 00 00 call 10daac <_Timespec_From_ticks>
return 0;
10a9f3: 83 c4 10 add $0x10,%esp
10a9f6: 31 c0 xor %eax,%eax
}
10a9f8: 8d 65 f8 lea -0x8(%ebp),%esp
10a9fb: 5b pop %ebx
10a9fc: 5e pop %esi
10a9fd: c9 leave
10a9fe: c3 ret
0010d088 <sem_open>:
int oflag,
...
/* mode_t mode, */
/* unsigned int value */
)
{
10d088: 55 push %ebp
10d089: 89 e5 mov %esp,%ebp
10d08b: 57 push %edi
10d08c: 56 push %esi
10d08d: 53 push %ebx
10d08e: 83 ec 2c sub $0x2c,%esp
10d091: 8b 75 08 mov 0x8(%ebp),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10d094: a1 a8 af 12 00 mov 0x12afa8,%eax
10d099: 40 inc %eax
10d09a: a3 a8 af 12 00 mov %eax,0x12afa8
va_list arg;
mode_t mode;
unsigned int value = 0;
10d09f: 31 ff xor %edi,%edi
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
10d0a1: 8b 45 0c mov 0xc(%ebp),%eax
10d0a4: 25 00 02 00 00 and $0x200,%eax
10d0a9: 89 45 d4 mov %eax,-0x2c(%ebp)
10d0ac: 74 03 je 10d0b1 <sem_open+0x29>
va_start(arg, oflag);
mode = (mode_t) va_arg( arg, unsigned int );
value = va_arg( arg, unsigned int );
10d0ae: 8b 7d 14 mov 0x14(%ebp),%edi
va_end(arg);
}
status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id );
10d0b1: 52 push %edx
10d0b2: 52 push %edx
10d0b3: 8d 45 e4 lea -0x1c(%ebp),%eax
10d0b6: 50 push %eax
10d0b7: 56 push %esi
10d0b8: e8 b3 59 00 00 call 112a70 <_POSIX_Semaphore_Name_to_id>
10d0bd: 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 ) {
10d0bf: 83 c4 10 add $0x10,%esp
10d0c2: 85 c0 test %eax,%eax
10d0c4: 74 19 je 10d0df <sem_open+0x57>
/*
* 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) ) ) {
10d0c6: 83 f8 02 cmp $0x2,%eax
10d0c9: 75 06 jne 10d0d1 <sem_open+0x49> <== NEVER TAKEN
10d0cb: 83 7d d4 00 cmpl $0x0,-0x2c(%ebp)
10d0cf: 75 59 jne 10d12a <sem_open+0xa2>
_Thread_Enable_dispatch();
10d0d1: e8 3c 28 00 00 call 10f912 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, sem_t * );
10d0d6: e8 69 7f 00 00 call 115044 <__errno>
10d0db: 89 18 mov %ebx,(%eax)
10d0dd: eb 1f jmp 10d0fe <sem_open+0x76>
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
10d0df: 8b 45 0c mov 0xc(%ebp),%eax
10d0e2: 25 00 0a 00 00 and $0xa00,%eax
10d0e7: 3d 00 0a 00 00 cmp $0xa00,%eax
10d0ec: 75 15 jne 10d103 <sem_open+0x7b>
_Thread_Enable_dispatch();
10d0ee: e8 1f 28 00 00 call 10f912 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
10d0f3: e8 4c 7f 00 00 call 115044 <__errno>
10d0f8: c7 00 11 00 00 00 movl $0x11,(%eax)
10d0fe: 83 c8 ff or $0xffffffff,%eax
10d101: eb 4a jmp 10d14d <sem_open+0xc5>
10d103: 50 push %eax
}
the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
10d104: 8d 45 dc lea -0x24(%ebp),%eax
10d107: 50 push %eax
10d108: ff 75 e4 pushl -0x1c(%ebp)
10d10b: 68 4c b2 12 00 push $0x12b24c
10d110: e8 d7 1c 00 00 call 10edec <_Objects_Get>
10d115: 89 45 e0 mov %eax,-0x20(%ebp)
the_semaphore->open_count += 1;
10d118: ff 40 18 incl 0x18(%eax)
_Thread_Enable_dispatch();
10d11b: e8 f2 27 00 00 call 10f912 <_Thread_Enable_dispatch>
_Thread_Enable_dispatch();
10d120: e8 ed 27 00 00 call 10f912 <_Thread_Enable_dispatch>
goto return_id;
10d125: 83 c4 10 add $0x10,%esp
10d128: eb 1d jmp 10d147 <sem_open+0xbf>
/*
* 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(
10d12a: 8d 45 e0 lea -0x20(%ebp),%eax
10d12d: 50 push %eax
10d12e: 57 push %edi
10d12f: 6a 00 push $0x0
10d131: 56 push %esi
10d132: e8 05 58 00 00 call 11293c <_POSIX_Semaphore_Create_support>
10d137: 89 c3 mov %eax,%ebx
/*
* errno was set by Create_support, so don't set it again.
*/
_Thread_Enable_dispatch();
10d139: e8 d4 27 00 00 call 10f912 <_Thread_Enable_dispatch>
if ( status == -1 )
10d13e: 83 c4 10 add $0x10,%esp
return SEM_FAILED;
10d141: 83 c8 ff or $0xffffffff,%eax
* errno was set by Create_support, so don't set it again.
*/
_Thread_Enable_dispatch();
if ( status == -1 )
10d144: 43 inc %ebx
10d145: 74 06 je 10d14d <sem_open+0xc5>
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;
10d147: 8b 45 e0 mov -0x20(%ebp),%eax
10d14a: 83 c0 08 add $0x8,%eax
#endif
return id;
}
10d14d: 8d 65 f4 lea -0xc(%ebp),%esp
10d150: 5b pop %ebx
10d151: 5e pop %esi
10d152: 5f pop %edi
10d153: c9 leave
10d154: c3 ret
0010a820 <sigaction>:
int sigaction(
int sig,
const struct sigaction *act,
struct sigaction *oact
)
{
10a820: 55 push %ebp
10a821: 89 e5 mov %esp,%ebp
10a823: 57 push %edi
10a824: 56 push %esi
10a825: 53 push %ebx
10a826: 83 ec 1c sub $0x1c,%esp
10a829: 8b 5d 08 mov 0x8(%ebp),%ebx
10a82c: 8b 55 0c mov 0xc(%ebp),%edx
10a82f: 8b 45 10 mov 0x10(%ebp),%eax
ISR_Level level;
if ( oact )
10a832: 85 c0 test %eax,%eax
10a834: 74 12 je 10a848 <sigaction+0x28>
*oact = _POSIX_signals_Vectors[ sig ];
10a836: 6b f3 0c imul $0xc,%ebx,%esi
10a839: 81 c6 fc 78 12 00 add $0x1278fc,%esi
10a83f: b9 03 00 00 00 mov $0x3,%ecx
10a844: 89 c7 mov %eax,%edi
10a846: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
if ( !sig )
10a848: 85 db test %ebx,%ebx
10a84a: 74 0d je 10a859 <sigaction+0x39>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
10a84c: 8d 43 ff lea -0x1(%ebx),%eax
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
10a84f: 83 f8 1f cmp $0x1f,%eax
10a852: 77 05 ja 10a859 <sigaction+0x39>
*
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
10a854: 83 fb 09 cmp $0x9,%ebx
10a857: 75 10 jne 10a869 <sigaction+0x49>
rtems_set_errno_and_return_minus_one( EINVAL );
10a859: e8 6e 77 00 00 call 111fcc <__errno>
10a85e: c7 00 16 00 00 00 movl $0x16,(%eax)
10a864: 83 c8 ff or $0xffffffff,%eax
10a867: eb 57 jmp 10a8c0 <sigaction+0xa0>
* 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;
10a869: 31 c0 xor %eax,%eax
/*
* Evaluate the new action structure and set the global signal vector
* appropriately.
*/
if ( act ) {
10a86b: 85 d2 test %edx,%edx
10a86d: 74 51 je 10a8c0 <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 );
10a86f: 9c pushf
10a870: fa cli
10a871: 8f 45 e4 popl -0x1c(%ebp)
if ( act->sa_handler == SIG_DFL ) {
10a874: 83 7a 08 00 cmpl $0x0,0x8(%edx)
10a878: 75 1a jne 10a894 <sigaction+0x74>
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
10a87a: 6b f3 0c imul $0xc,%ebx,%esi
10a87d: 8d 86 fc 78 12 00 lea 0x1278fc(%esi),%eax
10a883: 81 c6 70 12 12 00 add $0x121270,%esi
10a889: b9 03 00 00 00 mov $0x3,%ecx
10a88e: 89 c7 mov %eax,%edi
10a890: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
10a892: eb 26 jmp 10a8ba <sigaction+0x9a>
} else {
_POSIX_signals_Clear_process_signals( sig );
10a894: 83 ec 0c sub $0xc,%esp
10a897: 53 push %ebx
10a898: 89 55 e0 mov %edx,-0x20(%ebp)
10a89b: e8 bc 4e 00 00 call 10f75c <_POSIX_signals_Clear_process_signals>
_POSIX_signals_Vectors[ sig ] = *act;
10a8a0: 6b db 0c imul $0xc,%ebx,%ebx
10a8a3: 81 c3 fc 78 12 00 add $0x1278fc,%ebx
10a8a9: b9 03 00 00 00 mov $0x3,%ecx
10a8ae: 8b 55 e0 mov -0x20(%ebp),%edx
10a8b1: 89 df mov %ebx,%edi
10a8b3: 89 d6 mov %edx,%esi
10a8b5: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
10a8b7: 83 c4 10 add $0x10,%esp
}
_ISR_Enable( level );
10a8ba: ff 75 e4 pushl -0x1c(%ebp)
10a8bd: 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;
10a8be: 31 c0 xor %eax,%eax
}
10a8c0: 8d 65 f4 lea -0xc(%ebp),%esp
10a8c3: 5b pop %ebx
10a8c4: 5e pop %esi
10a8c5: 5f pop %edi
10a8c6: c9 leave
10a8c7: c3 ret
0010abe7 <sigtimedwait>:
int sigtimedwait(
const sigset_t *set,
siginfo_t *info,
const struct timespec *timeout
)
{
10abe7: 55 push %ebp
10abe8: 89 e5 mov %esp,%ebp
10abea: 57 push %edi
10abeb: 56 push %esi
10abec: 53 push %ebx
10abed: 83 ec 3c sub $0x3c,%esp
10abf0: 8b 75 08 mov 0x8(%ebp),%esi
10abf3: 8b 5d 10 mov 0x10(%ebp),%ebx
ISR_Level level;
/*
* Error check parameters before disabling interrupts.
*/
if ( !set )
10abf6: 85 f6 test %esi,%esi
10abf8: 74 24 je 10ac1e <sigtimedwait+0x37>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
if ( timeout ) {
10abfa: 85 db test %ebx,%ebx
10abfc: 74 30 je 10ac2e <sigtimedwait+0x47>
if ( !_Timespec_Is_valid( timeout ) )
10abfe: 83 ec 0c sub $0xc,%esp
10ac01: 53 push %ebx
10ac02: e8 5d 31 00 00 call 10dd64 <_Timespec_Is_valid>
10ac07: 83 c4 10 add $0x10,%esp
10ac0a: 84 c0 test %al,%al
10ac0c: 74 10 je 10ac1e <sigtimedwait+0x37>
rtems_set_errno_and_return_minus_one( EINVAL );
interval = _Timespec_To_ticks( timeout );
10ac0e: 83 ec 0c sub $0xc,%esp
10ac11: 53 push %ebx
10ac12: e8 a5 31 00 00 call 10ddbc <_Timespec_To_ticks>
if ( !interval )
10ac17: 83 c4 10 add $0x10,%esp
10ac1a: 85 c0 test %eax,%eax
10ac1c: 75 12 jne 10ac30 <sigtimedwait+0x49> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
10ac1e: e8 51 79 00 00 call 112574 <__errno>
10ac23: c7 00 16 00 00 00 movl $0x16,(%eax)
10ac29: e9 39 01 00 00 jmp 10ad67 <sigtimedwait+0x180>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
10ac2e: 31 c0 xor %eax,%eax
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
10ac30: 8b 7d 0c mov 0xc(%ebp),%edi
10ac33: 85 ff test %edi,%edi
10ac35: 75 03 jne 10ac3a <sigtimedwait+0x53>
10ac37: 8d 7d dc lea -0x24(%ebp),%edi
the_thread = _Thread_Executing;
10ac3a: 8b 15 c8 78 12 00 mov 0x1278c8,%edx
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10ac40: 8b 8a ec 00 00 00 mov 0xec(%edx),%ecx
10ac46: 89 4d d4 mov %ecx,-0x2c(%ebp)
* What if they are already pending?
*/
/* API signals pending? */
_ISR_Disable( level );
10ac49: 9c pushf
10ac4a: fa cli
10ac4b: 8f 45 d0 popl -0x30(%ebp)
if ( *set & api->signals_pending ) {
10ac4e: 8b 1e mov (%esi),%ebx
10ac50: 89 5d c4 mov %ebx,-0x3c(%ebp)
10ac53: 8b 5d d4 mov -0x2c(%ebp),%ebx
10ac56: 8b 8b d4 00 00 00 mov 0xd4(%ebx),%ecx
10ac5c: 85 4d c4 test %ecx,-0x3c(%ebp)
10ac5f: 74 32 je 10ac93 <sigtimedwait+0xac>
/* XXX real info later */
the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending );
10ac61: 83 ec 0c sub $0xc,%esp
10ac64: 51 push %ecx
10ac65: e8 3e ff ff ff call 10aba8 <_POSIX_signals_Get_lowest>
10ac6a: 89 07 mov %eax,(%edi)
_POSIX_signals_Clear_signals(
10ac6c: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10ac73: 6a 00 push $0x0
10ac75: 57 push %edi
10ac76: 50 push %eax
10ac77: 53 push %ebx
10ac78: e8 2b 51 00 00 call 10fda8 <_POSIX_signals_Clear_signals>
the_info->si_signo,
the_info,
false,
false
);
_ISR_Enable( level );
10ac7d: ff 75 d0 pushl -0x30(%ebp)
10ac80: 9d popf
the_info->si_code = SI_USER;
10ac81: c7 47 04 01 00 00 00 movl $0x1,0x4(%edi)
the_info->si_value.sival_int = 0;
10ac88: c7 47 08 00 00 00 00 movl $0x0,0x8(%edi)
return the_info->si_signo;
10ac8f: 8b 1f mov (%edi),%ebx
10ac91: eb 3d jmp 10acd0 <sigtimedwait+0xe9>
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
10ac93: 8b 0d f0 7a 12 00 mov 0x127af0,%ecx
10ac99: 85 4d c4 test %ecx,-0x3c(%ebp)
10ac9c: 74 3a je 10acd8 <sigtimedwait+0xf1>
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
10ac9e: 83 ec 0c sub $0xc,%esp
10aca1: 51 push %ecx
10aca2: e8 01 ff ff ff call 10aba8 <_POSIX_signals_Get_lowest>
10aca7: 89 c3 mov %eax,%ebx
_POSIX_signals_Clear_signals( api, signo, the_info, true, false );
10aca9: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10acb0: 6a 01 push $0x1
10acb2: 57 push %edi
10acb3: 50 push %eax
10acb4: ff 75 d4 pushl -0x2c(%ebp)
10acb7: e8 ec 50 00 00 call 10fda8 <_POSIX_signals_Clear_signals>
_ISR_Enable( level );
10acbc: ff 75 d0 pushl -0x30(%ebp)
10acbf: 9d popf
the_info->si_signo = signo;
10acc0: 89 1f mov %ebx,(%edi)
the_info->si_code = SI_USER;
10acc2: c7 47 04 01 00 00 00 movl $0x1,0x4(%edi)
the_info->si_value.sival_int = 0;
10acc9: c7 47 08 00 00 00 00 movl $0x0,0x8(%edi)
return signo;
10acd0: 83 c4 20 add $0x20,%esp
10acd3: e9 92 00 00 00 jmp 10ad6a <sigtimedwait+0x183>
}
the_info->si_signo = -1;
10acd8: c7 07 ff ff ff ff movl $0xffffffff,(%edi)
10acde: 8b 0d a0 73 12 00 mov 0x1273a0,%ecx
10ace4: 41 inc %ecx
10ace5: 89 0d a0 73 12 00 mov %ecx,0x1273a0
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
10aceb: c7 42 44 88 7a 12 00 movl $0x127a88,0x44(%edx)
the_thread->Wait.return_code = EINTR;
10acf2: c7 42 34 04 00 00 00 movl $0x4,0x34(%edx)
the_thread->Wait.option = *set;
10acf9: 8b 0e mov (%esi),%ecx
10acfb: 89 4a 30 mov %ecx,0x30(%edx)
the_thread->Wait.return_argument = the_info;
10acfe: 89 7a 28 mov %edi,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;
10ad01: c7 05 b8 7a 12 00 01 movl $0x1,0x127ab8
10ad08: 00 00 00
_Thread_queue_Enter_critical_section( &_POSIX_signals_Wait_queue );
_ISR_Enable( level );
10ad0b: ff 75 d0 pushl -0x30(%ebp)
10ad0e: 9d popf
_Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval );
10ad0f: 52 push %edx
10ad10: 68 e0 da 10 00 push $0x10dae0
10ad15: 50 push %eax
10ad16: 68 88 7a 12 00 push $0x127a88
10ad1b: e8 e4 2a 00 00 call 10d804 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
10ad20: e8 95 26 00 00 call 10d3ba <_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 );
10ad25: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10ad2c: 6a 00 push $0x0
10ad2e: 57 push %edi
10ad2f: ff 37 pushl (%edi)
10ad31: ff 75 d4 pushl -0x2c(%ebp)
10ad34: e8 6f 50 00 00 call 10fda8 <_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)
10ad39: 83 c4 20 add $0x20,%esp
10ad3c: a1 c8 78 12 00 mov 0x1278c8,%eax
10ad41: 83 78 34 04 cmpl $0x4,0x34(%eax)
10ad45: 75 10 jne 10ad57 <sigtimedwait+0x170>
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
10ad47: 8b 1f mov (%edi),%ebx
10ad49: 8d 4b ff lea -0x1(%ebx),%ecx
10ad4c: b8 01 00 00 00 mov $0x1,%eax
10ad51: d3 e0 shl %cl,%eax
10ad53: 85 06 test %eax,(%esi)
10ad55: 75 13 jne 10ad6a <sigtimedwait+0x183>
errno = _Thread_Executing->Wait.return_code;
10ad57: e8 18 78 00 00 call 112574 <__errno>
10ad5c: 8b 15 c8 78 12 00 mov 0x1278c8,%edx
10ad62: 8b 52 34 mov 0x34(%edx),%edx
10ad65: 89 10 mov %edx,(%eax)
return -1;
10ad67: 83 cb ff or $0xffffffff,%ebx
}
return the_info->si_signo;
}
10ad6a: 89 d8 mov %ebx,%eax
10ad6c: 8d 65 f4 lea -0xc(%ebp),%esp
10ad6f: 5b pop %ebx
10ad70: 5e pop %esi
10ad71: 5f pop %edi
10ad72: c9 leave
10ad73: c3 ret
0010ca08 <sigwait>:
int sigwait(
const sigset_t *set,
int *sig
)
{
10ca08: 55 push %ebp
10ca09: 89 e5 mov %esp,%ebp
10ca0b: 53 push %ebx
10ca0c: 83 ec 08 sub $0x8,%esp
10ca0f: 8b 5d 0c mov 0xc(%ebp),%ebx
int status;
status = sigtimedwait( set, NULL, NULL );
10ca12: 6a 00 push $0x0
10ca14: 6a 00 push $0x0
10ca16: ff 75 08 pushl 0x8(%ebp)
10ca19: e8 45 fe ff ff call 10c863 <sigtimedwait>
10ca1e: 89 c2 mov %eax,%edx
if ( status != -1 ) {
10ca20: 83 c4 10 add $0x10,%esp
10ca23: 83 f8 ff cmp $0xffffffff,%eax
10ca26: 74 0a je 10ca32 <sigwait+0x2a>
if ( sig )
*sig = status;
return 0;
10ca28: 31 c0 xor %eax,%eax
int status;
status = sigtimedwait( set, NULL, NULL );
if ( status != -1 ) {
if ( sig )
10ca2a: 85 db test %ebx,%ebx
10ca2c: 74 0b je 10ca39 <sigwait+0x31> <== NEVER TAKEN
*sig = status;
10ca2e: 89 13 mov %edx,(%ebx)
10ca30: eb 07 jmp 10ca39 <sigwait+0x31>
return 0;
}
return errno;
10ca32: e8 05 73 00 00 call 113d3c <__errno>
10ca37: 8b 00 mov (%eax),%eax
}
10ca39: 8b 5d fc mov -0x4(%ebp),%ebx
10ca3c: c9 leave
10ca3d: c3 ret
00108f80 <siproc>:
/*
* Process input character, with semaphore.
*/
static int
siproc (unsigned char c, struct rtems_termios_tty *tty)
{
108f80: 55 push %ebp
108f81: 89 e5 mov %esp,%ebp
108f83: 56 push %esi
108f84: 53 push %ebx
108f85: 89 d3 mov %edx,%ebx
108f87: 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)) {
108f89: f7 42 3c 78 0e 00 00 testl $0xe78,0x3c(%edx)
108f90: 74 30 je 108fc2 <siproc+0x42> <== NEVER TAKEN
rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
108f92: 52 push %edx
108f93: 6a 00 push $0x0
108f95: 6a 00 push $0x0
108f97: ff 73 18 pushl 0x18(%ebx)
108f9a: e8 1d 12 00 00 call 10a1bc <rtems_semaphore_obtain>
i = iproc (c, tty);
108f9f: 89 f2 mov %esi,%edx
108fa1: 0f b6 c2 movzbl %dl,%eax
108fa4: 89 da mov %ebx,%edx
108fa6: e8 b5 fe ff ff call 108e60 <iproc>
108fab: 89 c6 mov %eax,%esi
rtems_semaphore_release (tty->osem);
108fad: 58 pop %eax
108fae: ff 73 18 pushl 0x18(%ebx)
108fb1: e8 f2 12 00 00 call 10a2a8 <rtems_semaphore_release>
108fb6: 83 c4 10 add $0x10,%esp
}
else {
i = iproc (c, tty);
}
return i;
}
108fb9: 89 f0 mov %esi,%eax
108fbb: 8d 65 f8 lea -0x8(%ebp),%esp
108fbe: 5b pop %ebx
108fbf: 5e pop %esi
108fc0: c9 leave
108fc1: c3 ret
rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
i = iproc (c, tty);
rtems_semaphore_release (tty->osem);
}
else {
i = iproc (c, tty);
108fc2: 0f b6 c0 movzbl %al,%eax <== NOT EXECUTED
108fc5: 89 da mov %ebx,%edx <== NOT EXECUTED
}
return i;
}
108fc7: 8d 65 f8 lea -0x8(%ebp),%esp <== NOT EXECUTED
108fca: 5b pop %ebx <== NOT EXECUTED
108fcb: 5e pop %esi <== NOT EXECUTED
108fcc: 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);
108fcd: e9 8e fe ff ff jmp 108e60 <iproc> <== NOT EXECUTED
0010a154 <statvfs>:
#include <sys/statvfs.h>
int
statvfs (const char *path, struct statvfs *sb)
{
10a154: 55 push %ebp
10a155: 89 e5 mov %esp,%ebp
10a157: 57 push %edi
10a158: 56 push %esi
10a159: 53 push %ebx
10a15a: 83 ec 38 sub $0x38,%esp
10a15d: 8b 55 08 mov 0x8(%ebp),%edx
10a160: 8b 75 0c mov 0xc(%ebp),%esi
* 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 ) )
10a163: 31 c0 xor %eax,%eax
10a165: 83 c9 ff or $0xffffffff,%ecx
10a168: 89 d7 mov %edx,%edi
10a16a: f2 ae repnz scas %es:(%edi),%al
10a16c: f7 d1 not %ecx
10a16e: 49 dec %ecx
10a16f: 6a 01 push $0x1
10a171: 8d 5d d4 lea -0x2c(%ebp),%ebx
10a174: 53 push %ebx
10a175: 6a 00 push $0x0
10a177: 51 push %ecx
10a178: 52 push %edx
10a179: e8 04 ee ff ff call 108f82 <rtems_filesystem_evaluate_path>
10a17e: 83 c4 20 add $0x20,%esp
return -1;
10a181: 83 cf ff or $0xffffffff,%edi
* 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 ) )
10a184: 85 c0 test %eax,%eax
10a186: 75 26 jne 10a1ae <statvfs+0x5a> <== NEVER TAKEN
return -1;
mt_entry = loc.mt_entry;
10a188: 8b 55 e4 mov -0x1c(%ebp),%edx
fs_mount_root = &mt_entry->mt_fs_root;
memset (sb, 0, sizeof (struct statvfs));
10a18b: b9 0e 00 00 00 mov $0xe,%ecx
10a190: 89 f7 mov %esi,%edi
10a192: f3 ab rep stos %eax,%es:(%edi)
result = ( fs_mount_root->ops->statvfs_h )( fs_mount_root, sb );
10a194: 50 push %eax
10a195: 50 push %eax
10a196: 8b 42 28 mov 0x28(%edx),%eax
10a199: 56 push %esi
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;
10a19a: 83 c2 1c add $0x1c,%edx
memset (sb, 0, sizeof (struct statvfs));
result = ( fs_mount_root->ops->statvfs_h )( fs_mount_root, sb );
10a19d: 52 push %edx
10a19e: ff 50 44 call *0x44(%eax)
10a1a1: 89 c7 mov %eax,%edi
rtems_filesystem_freenode( &loc );
10a1a3: 89 1c 24 mov %ebx,(%esp)
10a1a6: e8 95 ee ff ff call 109040 <rtems_filesystem_freenode>
return result;
10a1ab: 83 c4 10 add $0x10,%esp
}
10a1ae: 89 f8 mov %edi,%eax
10a1b0: 8d 65 f4 lea -0xc(%ebp),%esp
10a1b3: 5b pop %ebx
10a1b4: 5e pop %esi
10a1b5: 5f pop %edi
10a1b6: c9 leave
10a1b7: c3 ret
00108fbc <sync_per_thread>:
fdatasync(fn);
}
/* iterate over all FILE *'s for this thread */
static void sync_per_thread(Thread_Control *t)
{
108fbc: 55 push %ebp
108fbd: 89 e5 mov %esp,%ebp
108fbf: 53 push %ebx
108fc0: 83 ec 04 sub $0x4,%esp
108fc3: 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;
108fc6: 8b 88 e4 00 00 00 mov 0xe4(%eax),%ecx
if ( this_reent ) {
108fcc: 85 c9 test %ecx,%ecx
108fce: 74 32 je 109002 <sync_per_thread+0x46> <== NEVER TAKEN
current_reent = _Thread_Executing->libc_reent;
108fd0: 8b 15 68 68 12 00 mov 0x126868,%edx
108fd6: 8b 9a e4 00 00 00 mov 0xe4(%edx),%ebx
_Thread_Executing->libc_reent = this_reent;
108fdc: 89 8a e4 00 00 00 mov %ecx,0xe4(%edx)
_fwalk (t->libc_reent, sync_wrapper);
108fe2: 52 push %edx
108fe3: 52 push %edx
108fe4: 68 07 90 10 00 push $0x109007
108fe9: ff b0 e4 00 00 00 pushl 0xe4(%eax)
108fef: e8 c4 9e 00 00 call 112eb8 <_fwalk>
_Thread_Executing->libc_reent = current_reent;
108ff4: a1 68 68 12 00 mov 0x126868,%eax
108ff9: 89 98 e4 00 00 00 mov %ebx,0xe4(%eax)
108fff: 83 c4 10 add $0x10,%esp
}
}
109002: 8b 5d fc mov -0x4(%ebp),%ebx
109005: c9 leave
109006: c3 ret
0010987c <tcsetattr>:
int tcsetattr(
int fd,
int opt,
struct termios *tp
)
{
10987c: 55 push %ebp
10987d: 89 e5 mov %esp,%ebp
10987f: 56 push %esi
109880: 53 push %ebx
109881: 8b 5d 08 mov 0x8(%ebp),%ebx
109884: 8b 45 0c mov 0xc(%ebp),%eax
109887: 8b 75 10 mov 0x10(%ebp),%esi
switch (opt) {
10988a: 85 c0 test %eax,%eax
10988c: 74 22 je 1098b0 <tcsetattr+0x34>
10988e: 48 dec %eax
10988f: 74 0d je 10989e <tcsetattr+0x22>
default:
rtems_set_errno_and_return_minus_one( ENOTSUP );
109891: e8 66 92 00 00 call 112afc <__errno>
109896: c7 00 86 00 00 00 movl $0x86,(%eax)
10989c: eb 2a jmp 1098c8 <tcsetattr+0x4c>
case TCSADRAIN:
if (ioctl( fd, RTEMS_IO_TCDRAIN, NULL ) < 0)
10989e: 50 push %eax
10989f: 6a 00 push $0x0
1098a1: 6a 03 push $0x3
1098a3: 53 push %ebx
1098a4: e8 7b 64 00 00 call 10fd24 <ioctl>
1098a9: 83 c4 10 add $0x10,%esp
1098ac: 85 c0 test %eax,%eax
1098ae: 78 18 js 1098c8 <tcsetattr+0x4c> <== NEVER TAKEN
return -1;
/*
* Fall through to....
*/
case TCSANOW:
return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp );
1098b0: 89 75 10 mov %esi,0x10(%ebp)
1098b3: c7 45 0c 02 00 00 00 movl $0x2,0xc(%ebp)
1098ba: 89 5d 08 mov %ebx,0x8(%ebp)
}
}
1098bd: 8d 65 f8 lea -0x8(%ebp),%esp
1098c0: 5b pop %ebx
1098c1: 5e pop %esi
1098c2: c9 leave
return -1;
/*
* Fall through to....
*/
case TCSANOW:
return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp );
1098c3: e9 5c 64 00 00 jmp 10fd24 <ioctl>
}
}
1098c8: 83 c8 ff or $0xffffffff,%eax
1098cb: 8d 65 f8 lea -0x8(%ebp),%esp
1098ce: 5b pop %ebx
1098cf: 5e pop %esi
1098d0: c9 leave
1098d1: c3 ret
0010a084 <timer_create>:
int timer_create(
clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid
)
{
10a084: 55 push %ebp
10a085: 89 e5 mov %esp,%ebp
10a087: 56 push %esi
10a088: 53 push %ebx
10a089: 8b 5d 0c mov 0xc(%ebp),%ebx
10a08c: 8b 75 10 mov 0x10(%ebp),%esi
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
10a08f: 83 7d 08 01 cmpl $0x1,0x8(%ebp)
10a093: 75 1d jne 10a0b2 <timer_create+0x2e>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !timerid )
10a095: 85 f6 test %esi,%esi
10a097: 74 19 je 10a0b2 <timer_create+0x2e>
/*
* The data of the structure evp are checked in order to verify if they
* are coherent.
*/
if (evp != NULL) {
10a099: 85 db test %ebx,%ebx
10a09b: 74 22 je 10a0bf <timer_create+0x3b>
/* The structure has data */
if ( ( evp->sigev_notify != SIGEV_NONE ) &&
10a09d: 8b 03 mov (%ebx),%eax
10a09f: 48 dec %eax
10a0a0: 83 f8 01 cmp $0x1,%eax
10a0a3: 77 0d ja 10a0b2 <timer_create+0x2e> <== 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 )
10a0a5: 8b 43 04 mov 0x4(%ebx),%eax
10a0a8: 85 c0 test %eax,%eax
10a0aa: 74 06 je 10a0b2 <timer_create+0x2e> <== NEVER TAKEN
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
10a0ac: 48 dec %eax
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
10a0ad: 83 f8 1f cmp $0x1f,%eax
10a0b0: 76 0d jbe 10a0bf <timer_create+0x3b> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
10a0b2: e8 9d 7c 00 00 call 111d54 <__errno>
10a0b7: c7 00 16 00 00 00 movl $0x16,(%eax)
10a0bd: eb 2f jmp 10a0ee <timer_create+0x6a>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10a0bf: a1 b4 73 12 00 mov 0x1273b4,%eax
10a0c4: 40 inc %eax
10a0c5: a3 b4 73 12 00 mov %eax,0x1273b4
* 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 );
10a0ca: 83 ec 0c sub $0xc,%esp
10a0cd: 68 98 76 12 00 push $0x127698
10a0d2: e8 75 1b 00 00 call 10bc4c <_Objects_Allocate>
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
10a0d7: 83 c4 10 add $0x10,%esp
10a0da: 85 c0 test %eax,%eax
10a0dc: 75 18 jne 10a0f6 <timer_create+0x72>
_Thread_Enable_dispatch();
10a0de: e8 47 2a 00 00 call 10cb2a <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
10a0e3: e8 6c 7c 00 00 call 111d54 <__errno>
10a0e8: c7 00 0b 00 00 00 movl $0xb,(%eax)
10a0ee: 83 c8 ff or $0xffffffff,%eax
10a0f1: e9 83 00 00 00 jmp 10a179 <timer_create+0xf5>
}
/* The data of the created timer are stored to use them later */
ptimer->state = POSIX_TIMER_STATE_CREATE_NEW;
10a0f6: c6 40 3c 02 movb $0x2,0x3c(%eax)
ptimer->thread_id = _Thread_Executing->Object.id;
10a0fa: 8b 15 dc 78 12 00 mov 0x1278dc,%edx
10a100: 8b 52 08 mov 0x8(%edx),%edx
10a103: 89 50 38 mov %edx,0x38(%eax)
if ( evp != NULL ) {
10a106: 85 db test %ebx,%ebx
10a108: 74 11 je 10a11b <timer_create+0x97>
ptimer->inf.sigev_notify = evp->sigev_notify;
10a10a: 8b 13 mov (%ebx),%edx
10a10c: 89 50 40 mov %edx,0x40(%eax)
ptimer->inf.sigev_signo = evp->sigev_signo;
10a10f: 8b 53 04 mov 0x4(%ebx),%edx
10a112: 89 50 44 mov %edx,0x44(%eax)
ptimer->inf.sigev_value = evp->sigev_value;
10a115: 8b 53 08 mov 0x8(%ebx),%edx
10a118: 89 50 48 mov %edx,0x48(%eax)
}
ptimer->overrun = 0;
10a11b: c7 40 68 00 00 00 00 movl $0x0,0x68(%eax)
ptimer->timer_data.it_value.tv_sec = 0;
10a122: c7 40 5c 00 00 00 00 movl $0x0,0x5c(%eax)
ptimer->timer_data.it_value.tv_nsec = 0;
10a129: c7 40 60 00 00 00 00 movl $0x0,0x60(%eax)
ptimer->timer_data.it_interval.tv_sec = 0;
10a130: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
ptimer->timer_data.it_interval.tv_nsec = 0;
10a137: 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;
10a13e: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
the_watchdog->routine = routine;
10a145: c7 40 2c 00 00 00 00 movl $0x0,0x2c(%eax)
the_watchdog->id = id;
10a14c: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)
the_watchdog->user_data = user_data;
10a153: 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 ),
10a15a: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10a15d: 0f b7 da movzwl %dx,%ebx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10a160: 8b 0d b4 76 12 00 mov 0x1276b4,%ecx
10a166: 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;
10a169: 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;
10a170: 89 16 mov %edx,(%esi)
_Thread_Enable_dispatch();
10a172: e8 b3 29 00 00 call 10cb2a <_Thread_Enable_dispatch>
return 0;
10a177: 31 c0 xor %eax,%eax
}
10a179: 8d 65 f8 lea -0x8(%ebp),%esp
10a17c: 5b pop %ebx
10a17d: 5e pop %esi
10a17e: c9 leave
10a17f: c3 ret
0010a180 <timer_settime>:
timer_t timerid,
int flags,
const struct itimerspec *value,
struct itimerspec *ovalue
)
{
10a180: 55 push %ebp
10a181: 89 e5 mov %esp,%ebp
10a183: 57 push %edi
10a184: 56 push %esi
10a185: 53 push %ebx
10a186: 83 ec 2c sub $0x2c,%esp
10a189: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Locations location;
bool activated;
uint32_t initial_period;
struct itimerspec normalize;
if ( !value )
10a18c: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
10a190: 0f 84 58 01 00 00 je 10a2ee <timer_settime+0x16e> <== 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) ) ) {
10a196: 83 ec 0c sub $0xc,%esp
10a199: 8b 45 10 mov 0x10(%ebp),%eax
10a19c: 83 c0 08 add $0x8,%eax
10a19f: 50 push %eax
10a1a0: e8 53 33 00 00 call 10d4f8 <_Timespec_Is_valid>
10a1a5: 83 c4 10 add $0x10,%esp
10a1a8: 84 c0 test %al,%al
10a1aa: 0f 84 3e 01 00 00 je 10a2ee <timer_settime+0x16e>
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !_Timespec_Is_valid( &(value->it_interval) ) ) {
10a1b0: 83 ec 0c sub $0xc,%esp
10a1b3: ff 75 10 pushl 0x10(%ebp)
10a1b6: e8 3d 33 00 00 call 10d4f8 <_Timespec_Is_valid>
10a1bb: 83 c4 10 add $0x10,%esp
10a1be: 84 c0 test %al,%al
10a1c0: 0f 84 28 01 00 00 je 10a2ee <timer_settime+0x16e> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) {
10a1c6: 85 db test %ebx,%ebx
10a1c8: 74 09 je 10a1d3 <timer_settime+0x53>
10a1ca: 83 fb 04 cmp $0x4,%ebx
10a1cd: 0f 85 1b 01 00 00 jne 10a2ee <timer_settime+0x16e>
rtems_set_errno_and_return_minus_one( EINVAL );
}
normalize = *value;
10a1d3: 8d 7d cc lea -0x34(%ebp),%edi
10a1d6: b9 04 00 00 00 mov $0x4,%ecx
10a1db: 8b 75 10 mov 0x10(%ebp),%esi
10a1de: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* Convert absolute to relative time */
if (flags == TIMER_ABSTIME) {
10a1e0: 83 fb 04 cmp $0x4,%ebx
10a1e3: 75 2f jne 10a214 <timer_settime+0x94>
struct timespec now;
_TOD_Get( &now );
10a1e5: 83 ec 0c sub $0xc,%esp
10a1e8: 8d 5d dc lea -0x24(%ebp),%ebx
10a1eb: 53 push %ebx
10a1ec: e8 b3 15 00 00 call 10b7a4 <_TOD_Get>
/* Check for seconds in the past */
if ( _Timespec_Greater_than( &now, &normalize.it_value ) )
10a1f1: 59 pop %ecx
10a1f2: 5e pop %esi
10a1f3: 8d 75 d4 lea -0x2c(%ebp),%esi
10a1f6: 56 push %esi
10a1f7: 53 push %ebx
10a1f8: e8 d7 32 00 00 call 10d4d4 <_Timespec_Greater_than>
10a1fd: 83 c4 10 add $0x10,%esp
10a200: 84 c0 test %al,%al
10a202: 0f 85 e6 00 00 00 jne 10a2ee <timer_settime+0x16e>
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_Subtract( &now, &normalize.it_value, &normalize.it_value );
10a208: 52 push %edx
10a209: 56 push %esi
10a20a: 56 push %esi
10a20b: 53 push %ebx
10a20c: e8 0b 33 00 00 call 10d51c <_Timespec_Subtract>
10a211: 83 c4 10 add $0x10,%esp
timer_t id,
Objects_Locations *location
)
{
return (POSIX_Timer_Control *)
_Objects_Get( &_POSIX_Timer_Information, (Objects_Id) id, location );
10a214: 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 );
10a215: 8d 45 e4 lea -0x1c(%ebp),%eax
10a218: 50 push %eax
10a219: ff 75 08 pushl 0x8(%ebp)
10a21c: 68 98 76 12 00 push $0x127698
10a221: e8 52 1e 00 00 call 10c078 <_Objects_Get>
10a226: 89 c3 mov %eax,%ebx
switch ( location ) {
10a228: 83 c4 10 add $0x10,%esp
10a22b: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp)
10a22f: 0f 85 b9 00 00 00 jne 10a2ee <timer_settime+0x16e>
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 ) {
10a235: 83 7d d4 00 cmpl $0x0,-0x2c(%ebp)
10a239: 75 3b jne 10a276 <timer_settime+0xf6>
10a23b: 83 7d d8 00 cmpl $0x0,-0x28(%ebp)
10a23f: 75 35 jne 10a276 <timer_settime+0xf6>
/* Stop the timer */
(void) _Watchdog_Remove( &ptimer->Timer );
10a241: 83 ec 0c sub $0xc,%esp
10a244: 8d 40 10 lea 0x10(%eax),%eax
10a247: 50 push %eax
10a248: e8 9b 36 00 00 call 10d8e8 <_Watchdog_Remove>
/* The old data of the timer are returned */
if ( ovalue )
10a24d: 83 c4 10 add $0x10,%esp
10a250: 83 7d 14 00 cmpl $0x0,0x14(%ebp)
10a254: 74 0d je 10a263 <timer_settime+0xe3>
*ovalue = ptimer->timer_data;
10a256: 8d 73 54 lea 0x54(%ebx),%esi
10a259: b9 04 00 00 00 mov $0x4,%ecx
10a25e: 8b 7d 14 mov 0x14(%ebp),%edi
10a261: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* The new data are set */
ptimer->timer_data = normalize;
10a263: 8d 7b 54 lea 0x54(%ebx),%edi
10a266: 8d 75 cc lea -0x34(%ebp),%esi
10a269: b9 04 00 00 00 mov $0x4,%ecx
10a26e: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* Indicates that the timer is created and stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
10a270: c6 43 3c 04 movb $0x4,0x3c(%ebx)
10a274: eb 35 jmp 10a2ab <timer_settime+0x12b>
_Thread_Enable_dispatch();
return 0;
}
/* Convert from seconds and nanoseconds to ticks */
ptimer->ticks = _Timespec_To_ticks( &value->it_interval );
10a276: 83 ec 0c sub $0xc,%esp
10a279: ff 75 10 pushl 0x10(%ebp)
10a27c: e8 cf 32 00 00 call 10d550 <_Timespec_To_ticks>
10a281: 89 43 64 mov %eax,0x64(%ebx)
initial_period = _Timespec_To_ticks( &normalize.it_value );
10a284: 8d 45 d4 lea -0x2c(%ebp),%eax
10a287: 89 04 24 mov %eax,(%esp)
10a28a: e8 c1 32 00 00 call 10d550 <_Timespec_To_ticks>
activated = _POSIX_Timer_Insert_helper(
10a28f: 89 1c 24 mov %ebx,(%esp)
10a292: 68 04 a3 10 00 push $0x10a304
10a297: ff 73 08 pushl 0x8(%ebx)
10a29a: 50 push %eax
10a29b: 8d 43 10 lea 0x10(%ebx),%eax
10a29e: 50 push %eax
10a29f: e8 78 57 00 00 call 10fa1c <_POSIX_Timer_Insert_helper>
initial_period,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated ) {
10a2a4: 83 c4 20 add $0x20,%esp
10a2a7: 84 c0 test %al,%al
10a2a9: 75 07 jne 10a2b2 <timer_settime+0x132>
_Thread_Enable_dispatch();
10a2ab: e8 7a 28 00 00 call 10cb2a <_Thread_Enable_dispatch>
10a2b0: eb 38 jmp 10a2ea <timer_settime+0x16a>
/*
* The timer has been started and is running. So we return the
* old ones in "ovalue"
*/
if ( ovalue )
10a2b2: 83 7d 14 00 cmpl $0x0,0x14(%ebp)
10a2b6: 74 0d je 10a2c5 <timer_settime+0x145>
*ovalue = ptimer->timer_data;
10a2b8: 8d 73 54 lea 0x54(%ebx),%esi
10a2bb: b9 04 00 00 00 mov $0x4,%ecx
10a2c0: 8b 7d 14 mov 0x14(%ebp),%edi
10a2c3: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
ptimer->timer_data = normalize;
10a2c5: 8d 7b 54 lea 0x54(%ebx),%edi
10a2c8: 8d 75 cc lea -0x34(%ebp),%esi
10a2cb: b9 04 00 00 00 mov $0x4,%ecx
10a2d0: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* Indicate that the time is running */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
10a2d2: c6 43 3c 03 movb $0x3,0x3c(%ebx)
_TOD_Get( &ptimer->time );
10a2d6: 83 ec 0c sub $0xc,%esp
10a2d9: 83 c3 6c add $0x6c,%ebx
10a2dc: 53 push %ebx
10a2dd: e8 c2 14 00 00 call 10b7a4 <_TOD_Get>
_Thread_Enable_dispatch();
10a2e2: e8 43 28 00 00 call 10cb2a <_Thread_Enable_dispatch>
return 0;
10a2e7: 83 c4 10 add $0x10,%esp
10a2ea: 31 c0 xor %eax,%eax
10a2ec: eb 0e jmp 10a2fc <timer_settime+0x17c>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10a2ee: e8 61 7a 00 00 call 111d54 <__errno>
10a2f3: c7 00 16 00 00 00 movl $0x16,(%eax)
10a2f9: 83 c8 ff or $0xffffffff,%eax
}
10a2fc: 8d 65 f4 lea -0xc(%ebp),%esp
10a2ff: 5b pop %ebx
10a300: 5e pop %esi
10a301: 5f pop %edi
10a302: c9 leave
10a303: c3 ret
00109fc0 <ualarm>:
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
109fc0: 55 push %ebp
109fc1: 89 e5 mov %esp,%ebp
109fc3: 57 push %edi
109fc4: 56 push %esi
109fc5: 53 push %ebx
109fc6: 83 ec 1c sub $0x1c,%esp
109fc9: 8b 75 08 mov 0x8(%ebp),%esi
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
109fcc: 83 3d 00 7d 12 00 00 cmpl $0x0,0x127d00
109fd3: 75 2c jne 10a001 <ualarm+0x41> <== NEVER TAKEN
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
109fd5: c7 05 ec 7c 12 00 00 movl $0x0,0x127cec
109fdc: 00 00 00
the_watchdog->routine = routine;
109fdf: c7 05 00 7d 12 00 88 movl $0x109f88,0x127d00
109fe6: 9f 10 00
the_watchdog->id = id;
109fe9: c7 05 04 7d 12 00 00 movl $0x0,0x127d04
109ff0: 00 00 00
the_watchdog->user_data = user_data;
109ff3: c7 05 08 7d 12 00 00 movl $0x0,0x127d08
109ffa: 00 00 00
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
109ffd: 31 db xor %ebx,%ebx
109fff: eb 4f jmp 10a050 <ualarm+0x90>
if ( !the_timer->routine ) {
_Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL );
} else {
Watchdog_States state;
state = _Watchdog_Remove( the_timer );
10a001: 83 ec 0c sub $0xc,%esp
10a004: 68 e4 7c 12 00 push $0x127ce4
10a009: e8 c2 34 00 00 call 10d4d0 <_Watchdog_Remove>
if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) {
10a00e: 83 e8 02 sub $0x2,%eax
10a011: 83 c4 10 add $0x10,%esp
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
10a014: 31 db xor %ebx,%ebx
_Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL );
} else {
Watchdog_States state;
state = _Watchdog_Remove( the_timer );
if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) {
10a016: 83 f8 01 cmp $0x1,%eax
10a019: 77 35 ja 10a050 <ualarm+0x90> <== NEVER TAKEN
* 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);
10a01b: a1 f8 7c 12 00 mov 0x127cf8,%eax
10a020: 03 05 f0 7c 12 00 add 0x127cf0,%eax
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
10a026: 57 push %edi
10a027: 57 push %edi
10a028: 8d 55 e0 lea -0x20(%ebp),%edx
10a02b: 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);
10a02c: 2b 05 fc 7c 12 00 sub 0x127cfc,%eax
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
10a032: 50 push %eax
10a033: e8 38 30 00 00 call 10d070 <_Timespec_From_ticks>
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
10a038: 69 4d e0 40 42 0f 00 imul $0xf4240,-0x20(%ebp),%ecx
remaining += tp.tv_nsec / 1000;
10a03f: 8b 45 e4 mov -0x1c(%ebp),%eax
10a042: bf e8 03 00 00 mov $0x3e8,%edi
10a047: 99 cltd
10a048: f7 ff idiv %edi
10a04a: 8d 1c 08 lea (%eax,%ecx,1),%ebx
10a04d: 83 c4 10 add $0x10,%esp
/*
* 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 ) {
10a050: 85 f6 test %esi,%esi
10a052: 74 44 je 10a098 <ualarm+0xd8>
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
10a054: b9 40 42 0f 00 mov $0xf4240,%ecx
10a059: 89 f0 mov %esi,%eax
10a05b: 31 d2 xor %edx,%edx
10a05d: f7 f1 div %ecx
10a05f: 89 45 e0 mov %eax,-0x20(%ebp)
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
10a062: 69 d2 e8 03 00 00 imul $0x3e8,%edx,%edx
10a068: 89 55 e4 mov %edx,-0x1c(%ebp)
ticks = _Timespec_To_ticks( &tp );
10a06b: 83 ec 0c sub $0xc,%esp
10a06e: 8d 75 e0 lea -0x20(%ebp),%esi
10a071: 56 push %esi
10a072: e8 55 30 00 00 call 10d0cc <_Timespec_To_ticks>
if ( ticks == 0 )
ticks = 1;
_Watchdog_Insert_ticks( the_timer, _Timespec_To_ticks( &tp ) );
10a077: 89 34 24 mov %esi,(%esp)
10a07a: e8 4d 30 00 00 call 10d0cc <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10a07f: a3 f0 7c 12 00 mov %eax,0x127cf0
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10a084: 59 pop %ecx
10a085: 5e pop %esi
10a086: 68 e4 7c 12 00 push $0x127ce4
10a08b: 68 d4 74 12 00 push $0x1274d4
10a090: e8 1b 33 00 00 call 10d3b0 <_Watchdog_Insert>
10a095: 83 c4 10 add $0x10,%esp
}
return remaining;
}
10a098: 89 d8 mov %ebx,%eax
10a09a: 8d 65 f4 lea -0xc(%ebp),%esp
10a09d: 5b pop %ebx
10a09e: 5e pop %esi
10a09f: 5f pop %edi
10a0a0: c9 leave
10a0a1: c3 ret
0010a71c <unlink>:
#include <rtems/seterr.h>
int unlink(
const char *path
)
{
10a71c: 55 push %ebp
10a71d: 89 e5 mov %esp,%ebp
10a71f: 57 push %edi
10a720: 56 push %esi
10a721: 53 push %ebx
10a722: 83 ec 58 sub $0x58,%esp
/*
* Get the node to be unlinked. Find the parent path first.
*/
parentpathlen = rtems_filesystem_dirname ( path );
10a725: ff 75 08 pushl 0x8(%ebp)
10a728: e8 f6 d8 ff ff call 108023 <rtems_filesystem_dirname>
10a72d: 89 45 b4 mov %eax,-0x4c(%ebp)
if ( parentpathlen == 0 )
10a730: 83 c4 10 add $0x10,%esp
10a733: 85 c0 test %eax,%eax
10a735: 8d 45 d0 lea -0x30(%ebp),%eax
10a738: 75 15 jne 10a74f <unlink+0x33>
rtems_filesystem_get_start_loc( path, &i, &parentloc );
10a73a: 51 push %ecx
10a73b: 50 push %eax
10a73c: 8d 45 e4 lea -0x1c(%ebp),%eax
10a73f: 50 push %eax
10a740: ff 75 08 pushl 0x8(%ebp)
10a743: e8 d4 e6 ff ff call 108e1c <rtems_filesystem_get_start_loc>
10a748: 83 c4 10 add $0x10,%esp
const char *name;
rtems_filesystem_location_info_t parentloc;
rtems_filesystem_location_info_t loc;
int i;
int result;
bool free_parentloc = false;
10a74b: 31 db xor %ebx,%ebx
10a74d: eb 25 jmp 10a774 <unlink+0x58>
parentpathlen = rtems_filesystem_dirname ( path );
if ( parentpathlen == 0 )
rtems_filesystem_get_start_loc( path, &i, &parentloc );
else {
result = rtems_filesystem_evaluate_path( path, parentpathlen,
10a74f: 83 ec 0c sub $0xc,%esp
10a752: 6a 00 push $0x0
10a754: 50 push %eax
10a755: 6a 02 push $0x2
10a757: ff 75 b4 pushl -0x4c(%ebp)
10a75a: ff 75 08 pushl 0x8(%ebp)
10a75d: e8 80 d8 ff ff call 107fe2 <rtems_filesystem_evaluate_path>
10a762: 89 c2 mov %eax,%edx
RTEMS_LIBIO_PERMS_WRITE,
&parentloc,
false );
if ( result != 0 )
10a764: 83 c4 20 add $0x20,%esp
return -1;
10a767: 83 c8 ff or $0xffffffff,%eax
else {
result = rtems_filesystem_evaluate_path( path, parentpathlen,
RTEMS_LIBIO_PERMS_WRITE,
&parentloc,
false );
if ( result != 0 )
10a76a: 85 d2 test %edx,%edx
10a76c: 0f 85 d6 00 00 00 jne 10a848 <unlink+0x12c> <== NEVER TAKEN
return -1;
free_parentloc = true;
10a772: b3 01 mov $0x1,%bl
/*
* Start from the parent to find the node that should be under it.
*/
loc = parentloc;
10a774: 8d 7d bc lea -0x44(%ebp),%edi
10a777: 8d 75 d0 lea -0x30(%ebp),%esi
10a77a: b9 05 00 00 00 mov $0x5,%ecx
10a77f: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
name = path + parentpathlen;
10a781: 8b 75 08 mov 0x8(%ebp),%esi
10a784: 03 75 b4 add -0x4c(%ebp),%esi
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
10a787: 83 c9 ff or $0xffffffff,%ecx
10a78a: 89 f7 mov %esi,%edi
10a78c: 31 c0 xor %eax,%eax
10a78e: f2 ae repnz scas %es:(%edi),%al
10a790: f7 d1 not %ecx
10a792: 49 dec %ecx
10a793: 52 push %edx
10a794: 52 push %edx
10a795: 51 push %ecx
10a796: 56 push %esi
10a797: e8 c6 d8 ff ff call 108062 <rtems_filesystem_prefix_separators>
10a79c: 01 c6 add %eax,%esi
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
10a79e: 83 c9 ff or $0xffffffff,%ecx
10a7a1: 89 f7 mov %esi,%edi
10a7a3: 31 c0 xor %eax,%eax
10a7a5: f2 ae repnz scas %es:(%edi),%al
10a7a7: f7 d1 not %ecx
10a7a9: 49 dec %ecx
10a7aa: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10a7b1: 8d 7d bc lea -0x44(%ebp),%edi
10a7b4: 57 push %edi
10a7b5: 6a 00 push $0x0
10a7b7: 51 push %ecx
10a7b8: 56 push %esi
10a7b9: e8 c6 d7 ff ff call 107f84 <rtems_filesystem_evaluate_relative_path>
0, &loc, false );
if ( result != 0 ) {
10a7be: 83 c4 20 add $0x20,%esp
10a7c1: 85 c0 test %eax,%eax
10a7c3: 74 13 je 10a7d8 <unlink+0xbc>
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
return -1;
10a7c5: 83 c8 ff or $0xffffffff,%eax
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 )
10a7c8: 84 db test %bl,%bl
10a7ca: 74 7c je 10a848 <unlink+0x12c> <== NEVER TAKEN
rtems_filesystem_freenode( &parentloc );
10a7cc: 83 ec 0c sub $0xc,%esp
10a7cf: 8d 55 d0 lea -0x30(%ebp),%edx
10a7d2: 52 push %edx
10a7d3: 89 45 b0 mov %eax,-0x50(%ebp)
10a7d6: eb 65 jmp 10a83d <unlink+0x121>
return -1;
}
if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
10a7d8: 83 ec 0c sub $0xc,%esp
10a7db: 57 push %edi
10a7dc: 8b 45 c8 mov -0x38(%ebp),%eax
10a7df: ff 50 10 call *0x10(%eax)
10a7e2: 83 c4 10 add $0x10,%esp
10a7e5: 48 dec %eax
10a7e6: 75 2f jne 10a817 <unlink+0xfb>
rtems_filesystem_freenode( &loc );
10a7e8: 83 ec 0c sub $0xc,%esp
10a7eb: 57 push %edi
10a7ec: e8 af d8 ff ff call 1080a0 <rtems_filesystem_freenode>
if ( free_parentloc )
10a7f1: 83 c4 10 add $0x10,%esp
10a7f4: 84 db test %bl,%bl
10a7f6: 74 0f je 10a807 <unlink+0xeb>
rtems_filesystem_freenode( &parentloc );
10a7f8: 83 ec 0c sub $0xc,%esp
10a7fb: 8d 45 d0 lea -0x30(%ebp),%eax
10a7fe: 50 push %eax
10a7ff: e8 9c d8 ff ff call 1080a0 <rtems_filesystem_freenode>
10a804: 83 c4 10 add $0x10,%esp
rtems_set_errno_and_return_minus_one( EISDIR );
10a807: e8 2c a0 00 00 call 114838 <__errno>
10a80c: c7 00 15 00 00 00 movl $0x15,(%eax)
10a812: 83 c8 ff or $0xffffffff,%eax
10a815: eb 31 jmp 10a848 <unlink+0x12c>
}
result = (*loc.ops->unlink_h)( &parentloc, &loc );
10a817: 50 push %eax
10a818: 50 push %eax
10a819: 57 push %edi
10a81a: 8d 75 d0 lea -0x30(%ebp),%esi
10a81d: 56 push %esi
10a81e: 8b 45 c8 mov -0x38(%ebp),%eax
10a821: ff 50 0c call *0xc(%eax)
rtems_filesystem_freenode( &loc );
10a824: 89 3c 24 mov %edi,(%esp)
10a827: 89 45 b0 mov %eax,-0x50(%ebp)
10a82a: e8 71 d8 ff ff call 1080a0 <rtems_filesystem_freenode>
if ( free_parentloc )
10a82f: 83 c4 10 add $0x10,%esp
10a832: 84 db test %bl,%bl
10a834: 8b 45 b0 mov -0x50(%ebp),%eax
10a837: 74 0f je 10a848 <unlink+0x12c>
rtems_filesystem_freenode( &parentloc );
10a839: 83 ec 0c sub $0xc,%esp
10a83c: 56 push %esi
10a83d: e8 5e d8 ff ff call 1080a0 <rtems_filesystem_freenode>
10a842: 83 c4 10 add $0x10,%esp
10a845: 8b 45 b0 mov -0x50(%ebp),%eax
return result;
}
10a848: 8d 65 f4 lea -0xc(%ebp),%esp
10a84b: 5b pop %ebx
10a84c: 5e pop %esi
10a84d: 5f pop %edi
10a84e: c9 leave
10a84f: c3 ret
0010a989 <unmount>:
*/
int unmount(
const char *path
)
{
10a989: 55 push %ebp
10a98a: 89 e5 mov %esp,%ebp
10a98c: 57 push %edi
10a98d: 56 push %esi
10a98e: 53 push %ebx
10a98f: 83 ec 38 sub $0x38,%esp
10a992: 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 ) )
10a995: 83 cb ff or $0xffffffff,%ebx
10a998: 31 c0 xor %eax,%eax
10a99a: 89 d9 mov %ebx,%ecx
10a99c: 89 d7 mov %edx,%edi
10a99e: f2 ae repnz scas %es:(%edi),%al
10a9a0: f7 d1 not %ecx
10a9a2: 49 dec %ecx
10a9a3: 6a 01 push $0x1
10a9a5: 8d 7d d4 lea -0x2c(%ebp),%edi
10a9a8: 57 push %edi
10a9a9: 6a 00 push $0x0
10a9ab: 51 push %ecx
10a9ac: 52 push %edx
10a9ad: e8 c4 d5 ff ff call 107f76 <rtems_filesystem_evaluate_path>
10a9b2: 83 c4 20 add $0x20,%esp
10a9b5: 85 c0 test %eax,%eax
10a9b7: 0f 85 f2 00 00 00 jne 10aaaf <unmount+0x126>
return -1;
mt_entry = loc.mt_entry;
10a9bd: 8b 75 e4 mov -0x1c(%ebp),%esi
/*
* Verify this is the root node for the file system to be unmounted.
*/
if ( fs_root_loc->node_access != loc.node_access ){
10a9c0: 8b 45 d4 mov -0x2c(%ebp),%eax
10a9c3: 39 46 1c cmp %eax,0x1c(%esi)
10a9c6: 74 1c je 10a9e4 <unmount+0x5b>
rtems_filesystem_freenode( &loc );
10a9c8: 83 ec 0c sub $0xc,%esp
10a9cb: 57 push %edi
10a9cc: e8 63 d6 ff ff call 108034 <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( EACCES );
10a9d1: e8 ea 76 00 00 call 1120c0 <__errno>
10a9d6: c7 00 0d 00 00 00 movl $0xd,(%eax)
10a9dc: 83 c4 10 add $0x10,%esp
10a9df: e9 cb 00 00 00 jmp 10aaaf <unmount+0x126>
/*
* Free the loc node and just use the nodes from the mt_entry .
*/
rtems_filesystem_freenode( &loc );
10a9e4: 83 ec 0c sub $0xc,%esp
10a9e7: 57 push %edi
10a9e8: e8 47 d6 ff ff call 108034 <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 )
10a9ed: 83 c4 10 add $0x10,%esp
10a9f0: a1 0c 51 12 00 mov 0x12510c,%eax
10a9f5: 39 70 14 cmp %esi,0x14(%eax)
10a9f8: 74 25 je 10aa1f <unmount+0x96>
/*
* Verify there are no file systems below the path specified
*/
if ( rtems_filesystem_mount_iterate( is_fs_below_mount_point,
10a9fa: 51 push %ecx
10a9fb: 51 push %ecx
10a9fc: ff 76 2c pushl 0x2c(%esi)
10a9ff: 68 78 a9 10 00 push $0x10a978
10aa04: e8 44 dd ff ff call 10874d <rtems_filesystem_mount_iterate>
10aa09: 83 c4 10 add $0x10,%esp
10aa0c: 84 c0 test %al,%al
10aa0e: 75 0f jne 10aa1f <unmount+0x96>
* 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 )
10aa10: 83 ec 0c sub $0xc,%esp
10aa13: 56 push %esi
10aa14: e8 03 d9 ff ff call 10831c <rtems_libio_is_open_files_in_fs>
10aa19: 83 c4 10 add $0x10,%esp
10aa1c: 48 dec %eax
10aa1d: 75 10 jne 10aa2f <unmount+0xa6>
rtems_set_errno_and_return_minus_one( EBUSY );
10aa1f: e8 9c 76 00 00 call 1120c0 <__errno>
10aa24: c7 00 10 00 00 00 movl $0x10,(%eax)
10aa2a: e9 80 00 00 00 jmp 10aaaf <unmount+0x126>
* 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 )
10aa2f: 83 ec 0c sub $0xc,%esp
10aa32: 8b 46 14 mov 0x14(%esi),%eax
10aa35: 56 push %esi
10aa36: ff 50 28 call *0x28(%eax)
10aa39: 83 c4 10 add $0x10,%esp
return -1;
10aa3c: 83 ca ff or $0xffffffff,%edx
* 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 )
10aa3f: 85 c0 test %eax,%eax
10aa41: 75 6f jne 10aab2 <unmount+0x129> <== NEVER TAKEN
* 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){
10aa43: 83 ec 0c sub $0xc,%esp
10aa46: 8b 46 28 mov 0x28(%esi),%eax
10aa49: 56 push %esi
10aa4a: ff 50 2c call *0x2c(%eax)
10aa4d: 83 c4 10 add $0x10,%esp
10aa50: 85 c0 test %eax,%eax
10aa52: 74 1d je 10aa71 <unmount+0xe8> <== ALWAYS TAKEN
if (( fs_mount_loc->ops->mount_h )( mt_entry ) != 0 )
10aa54: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10aa57: 8b 46 14 mov 0x14(%esi),%eax <== NOT EXECUTED
10aa5a: 56 push %esi <== NOT EXECUTED
10aa5b: ff 50 20 call *0x20(%eax) <== NOT EXECUTED
10aa5e: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
rtems_fatal_error_occurred( 0 );
return -1;
10aa61: 89 da mov %ebx,%edx <== NOT EXECUTED
* 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 )
10aa63: 85 c0 test %eax,%eax <== NOT EXECUTED
10aa65: 74 4b je 10aab2 <unmount+0x129> <== NOT EXECUTED
rtems_fatal_error_occurred( 0 );
10aa67: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10aa6a: 6a 00 push $0x0 <== NOT EXECUTED
10aa6c: e8 93 0e 00 00 call 10b904 <rtems_fatal_error_occurred><== NOT EXECUTED
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 );
10aa71: 52 push %edx
10aa72: 6a 00 push $0x0
10aa74: 6a 00 push $0x0
10aa76: ff 35 48 73 12 00 pushl 0x127348
10aa7c: e8 fb 08 00 00 call 10b37c <rtems_semaphore_obtain>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
10aa81: 89 34 24 mov %esi,(%esp)
10aa84: e8 4b 11 00 00 call 10bbd4 <_Chain_Extract>
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
10aa89: 58 pop %eax
10aa8a: ff 35 48 73 12 00 pushl 0x127348
10aa90: e8 d3 09 00 00 call 10b468 <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;
10aa95: 8d 46 08 lea 0x8(%esi),%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 );
10aa98: 89 04 24 mov %eax,(%esp)
10aa9b: e8 94 d5 ff ff call 108034 <rtems_filesystem_freenode>
free( mt_entry );
10aaa0: 89 34 24 mov %esi,(%esp)
10aaa3: e8 a0 d5 ff ff call 108048 <free>
return 0;
10aaa8: 83 c4 10 add $0x10,%esp
10aaab: 31 d2 xor %edx,%edx
10aaad: eb 03 jmp 10aab2 <unmount+0x129>
* 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 ) )
return -1;
10aaaf: 83 ca ff or $0xffffffff,%edx
rtems_filesystem_freenode( fs_mount_loc );
free( mt_entry );
return 0;
}
10aab2: 89 d0 mov %edx,%eax
10aab4: 8d 65 f4 lea -0xc(%ebp),%esp
10aab7: 5b pop %ebx
10aab8: 5e pop %esi
10aab9: 5f pop %edi
10aaba: c9 leave
10aabb: c3 ret
0011d2fc <write>:
ssize_t write(
int fd,
const void *buffer,
size_t count
)
{
11d2fc: 55 push %ebp
11d2fd: 89 e5 mov %esp,%ebp
11d2ff: 56 push %esi
11d300: 53 push %ebx
11d301: 8b 5d 08 mov 0x8(%ebp),%ebx
11d304: 8b 55 0c mov 0xc(%ebp),%edx
11d307: 8b 4d 10 mov 0x10(%ebp),%ecx
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
11d30a: 3b 1d 44 11 12 00 cmp 0x121144,%ebx
11d310: 73 14 jae 11d326 <write+0x2a>
iop = rtems_libio_iop( fd );
11d312: 6b db 38 imul $0x38,%ebx,%ebx
11d315: 03 1d f8 51 12 00 add 0x1251f8,%ebx
rtems_libio_check_is_open( iop );
11d31b: 8b 73 14 mov 0x14(%ebx),%esi
11d31e: f7 c6 00 01 00 00 test $0x100,%esi
11d324: 75 0d jne 11d333 <write+0x37>
11d326: e8 0d 3e ff ff call 111138 <__errno>
11d32b: c7 00 09 00 00 00 movl $0x9,(%eax)
11d331: eb 1a jmp 11d34d <write+0x51>
rtems_libio_check_buffer( buffer );
11d333: 85 d2 test %edx,%edx
11d335: 74 0b je 11d342 <write+0x46> <== NEVER TAKEN
rtems_libio_check_count( count );
11d337: 31 c0 xor %eax,%eax
11d339: 85 c9 test %ecx,%ecx
11d33b: 74 31 je 11d36e <write+0x72>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
11d33d: 83 e6 04 and $0x4,%esi
11d340: 75 10 jne 11d352 <write+0x56>
11d342: e8 f1 3d ff ff call 111138 <__errno>
11d347: c7 00 16 00 00 00 movl $0x16,(%eax)
11d34d: 83 c8 ff or $0xffffffff,%eax
11d350: eb 1c jmp 11d36e <write+0x72>
/*
* Now process the write() request.
*/
rc = (*iop->pathinfo.handlers->write_h)( iop, buffer, count );
11d352: 50 push %eax
11d353: 8b 43 20 mov 0x20(%ebx),%eax
11d356: 51 push %ecx
11d357: 52 push %edx
11d358: 53 push %ebx
11d359: ff 50 0c call *0xc(%eax)
if ( rc > 0 )
11d35c: 83 c4 10 add $0x10,%esp
11d35f: 85 c0 test %eax,%eax
11d361: 7e 0b jle 11d36e <write+0x72>
iop->offset += rc;
11d363: 89 c1 mov %eax,%ecx
11d365: c1 f9 1f sar $0x1f,%ecx
11d368: 01 43 0c add %eax,0xc(%ebx)
11d36b: 11 4b 10 adc %ecx,0x10(%ebx)
return rc;
}
11d36e: 8d 65 f8 lea -0x8(%ebp),%esp
11d371: 5b pop %ebx
11d372: 5e pop %esi
11d373: c9 leave
11d374: c3 ret
0010a990 <writev>:
ssize_t writev(
int fd,
const struct iovec *iov,
int iovcnt
)
{
10a990: 55 push %ebp
10a991: 89 e5 mov %esp,%ebp
10a993: 57 push %edi
10a994: 56 push %esi
10a995: 53 push %ebx
10a996: 83 ec 1c sub $0x1c,%esp
10a999: 8b 75 08 mov 0x8(%ebp),%esi
10a99c: 8b 7d 0c mov 0xc(%ebp),%edi
int bytes;
rtems_libio_t *iop;
ssize_t old;
bool all_zeros;
rtems_libio_check_fd( fd );
10a99f: 3b 35 44 21 12 00 cmp 0x122144,%esi
10a9a5: 73 11 jae 10a9b8 <writev+0x28>
iop = rtems_libio_iop( fd );
10a9a7: 6b f6 38 imul $0x38,%esi,%esi
10a9aa: 03 35 f8 61 12 00 add 0x1261f8,%esi
rtems_libio_check_is_open( iop );
10a9b0: 8b 46 14 mov 0x14(%esi),%eax
10a9b3: f6 c4 01 test $0x1,%ah
10a9b6: 75 10 jne 10a9c8 <writev+0x38>
10a9b8: e8 4b 73 00 00 call 111d08 <__errno>
10a9bd: c7 00 09 00 00 00 movl $0x9,(%eax)
10a9c3: e9 ad 00 00 00 jmp 10aa75 <writev+0xe5>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
10a9c8: a8 04 test $0x4,%al
10a9ca: 74 42 je 10aa0e <writev+0x7e> <== NEVER TAKEN
/*
* Argument validation on IO vector
*/
if ( !iov )
10a9cc: 85 ff test %edi,%edi
10a9ce: 74 3e je 10aa0e <writev+0x7e>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt <= 0 )
10a9d0: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
10a9d4: 7e 38 jle 10aa0e <writev+0x7e>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt > IOV_MAX )
10a9d6: 81 7d 10 00 04 00 00 cmpl $0x400,0x10(%ebp)
10a9dd: 7f 2f jg 10aa0e <writev+0x7e> <== NEVER TAKEN
10a9df: b2 01 mov $0x1,%dl
10a9e1: 31 c0 xor %eax,%eax
10a9e3: 31 c9 xor %ecx,%ecx
10a9e5: eb 02 jmp 10a9e9 <writev+0x59>
if ( iov[v].iov_len )
all_zeros = false;
/* check for wrap */
old = total;
total += iov[v].iov_len;
10a9e7: 89 d9 mov %ebx,%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 )
10a9e9: 83 3c c7 00 cmpl $0x0,(%edi,%eax,8)
10a9ed: 74 1f je 10aa0e <writev+0x7e>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iov[v].iov_len )
all_zeros = false;
10a9ef: 83 7c c7 04 00 cmpl $0x0,0x4(%edi,%eax,8)
10a9f4: 0f 94 c3 sete %bl
10a9f7: f7 db neg %ebx
10a9f9: 21 da and %ebx,%edx
/* check for wrap */
old = total;
total += iov[v].iov_len;
10a9fb: 8b 5c c7 04 mov 0x4(%edi,%eax,8),%ebx
10a9ff: 8d 1c 19 lea (%ecx,%ebx,1),%ebx
if ( total < old || total > SSIZE_MAX )
10aa02: 81 fb ff 7f 00 00 cmp $0x7fff,%ebx
10aa08: 7f 04 jg 10aa0e <writev+0x7e> <== NEVER TAKEN
10aa0a: 39 cb cmp %ecx,%ebx
10aa0c: 7d 0d jge 10aa1b <writev+0x8b>
rtems_set_errno_and_return_minus_one( EINVAL );
10aa0e: e8 f5 72 00 00 call 111d08 <__errno>
10aa13: c7 00 16 00 00 00 movl $0x16,(%eax)
10aa19: eb 5a jmp 10aa75 <writev+0xe5>
* 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++ ) {
10aa1b: 40 inc %eax
10aa1c: 3b 45 10 cmp 0x10(%ebp),%eax
10aa1f: 7c c6 jl 10a9e7 <writev+0x57>
/*
* A writev with all zeros is supposed to have no effect per OpenGroup.
*/
if ( all_zeros == true ) {
return 0;
10aa21: 31 db xor %ebx,%ebx
}
/*
* A writev with all zeros is supposed to have no effect per OpenGroup.
*/
if ( all_zeros == true ) {
10aa23: 84 d2 test %dl,%dl
10aa25: 75 51 jne 10aa78 <writev+0xe8>
10aa27: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%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 )
10aa2e: 8b 55 e4 mov -0x1c(%ebp),%edx
10aa31: 8b 44 d7 04 mov 0x4(%edi,%edx,8),%eax
10aa35: 85 c0 test %eax,%eax
10aa37: 74 2f je 10aa68 <writev+0xd8> <== NEVER TAKEN
continue;
bytes = (*iop->pathinfo.handlers->write_h)(
10aa39: 52 push %edx
10aa3a: 8b 56 20 mov 0x20(%esi),%edx
10aa3d: 50 push %eax
10aa3e: 8b 45 e4 mov -0x1c(%ebp),%eax
10aa41: ff 34 c7 pushl (%edi,%eax,8)
10aa44: 56 push %esi
10aa45: ff 52 0c call *0xc(%edx)
iop,
iov[v].iov_base,
iov[v].iov_len
);
if ( bytes < 0 )
10aa48: 83 c4 10 add $0x10,%esp
10aa4b: 83 f8 00 cmp $0x0,%eax
10aa4e: 7c 25 jl 10aa75 <writev+0xe5> <== NEVER TAKEN
return -1;
if ( bytes > 0 ) {
10aa50: 74 0d je 10aa5f <writev+0xcf> <== NEVER TAKEN
iop->offset += bytes;
10aa52: 89 c1 mov %eax,%ecx
10aa54: c1 f9 1f sar $0x1f,%ecx
10aa57: 01 46 0c add %eax,0xc(%esi)
10aa5a: 11 4e 10 adc %ecx,0x10(%esi)
total += bytes;
10aa5d: 01 c3 add %eax,%ebx
}
if (bytes != iov[ v ].iov_len)
10aa5f: 8b 55 e4 mov -0x1c(%ebp),%edx
10aa62: 3b 44 d7 04 cmp 0x4(%edi,%edx,8),%eax
10aa66: 75 10 jne 10aa78 <writev+0xe8> <== NEVER TAKEN
}
/*
* Now process the writev().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
10aa68: ff 45 e4 incl -0x1c(%ebp)
10aa6b: 8b 45 10 mov 0x10(%ebp),%eax
10aa6e: 39 45 e4 cmp %eax,-0x1c(%ebp)
10aa71: 7c bb jl 10aa2e <writev+0x9e>
10aa73: eb 03 jmp 10aa78 <writev+0xe8>
iov[v].iov_base,
iov[v].iov_len
);
if ( bytes < 0 )
return -1;
10aa75: 83 cb ff or $0xffffffff,%ebx
if (bytes != iov[ v ].iov_len)
break;
}
return total;
}
10aa78: 89 d8 mov %ebx,%eax
10aa7a: 8d 65 f4 lea -0xc(%ebp),%esp
10aa7d: 5b pop %ebx
10aa7e: 5e pop %esi
10aa7f: 5f pop %edi
10aa80: c9 leave
10aa81: c3 ret